diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java
index 8310356..bbbe697 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java
@@ -21,7 +21,6 @@
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
-import org.eclipse.jdt.internal.launching.JavaFxLibraryResolver;
 import org.eclipse.jdt.internal.launching.LaunchingPlugin;
 import org.eclipse.jdt.launching.ILibraryLocationResolver;
 import org.eclipse.jdt.launching.IVMInstall;
@@ -36,20 +35,6 @@
  */
 public class VMInstallTests extends AbstractDebugTest {
 
-	private static boolean isTesting = false;
-	
-	static boolean applies(IPath path) {
-		if (!isTesting)
-			return false;
-
-		for (int i = 0; i < path.segmentCount(); i++) {
-			if ("ext".equals(path.segment(i))) {
-				return !JavaFxLibraryResolver.JFXRT_JAR.equals(path.lastSegment());
-			}
-		}
-		return false;
-	}
-
 	public VMInstallTests() {
 		super("VM Install tests");
 	}
@@ -119,7 +104,7 @@
 	 * @throws Exception
 	 */
 	public void testLibraryResolver1() throws Exception {
-		isTesting = true;
+		VMInstallTestsLibraryLocationResolver.isTesting = true;
 		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
 		assertNotNull("There must be a default VM", vm);
 		
@@ -133,7 +118,7 @@
 			assertResolvedLibraryLocations(locs);
 		}
 		finally {
-			isTesting = false;
+			VMInstallTestsLibraryLocationResolver.isTesting = false;
 			//force a re-compute to remove the bogus paths
 			vm.getVMInstallType().disposeVMInstall(vm.getId());
 		}
@@ -146,7 +131,7 @@
 	 * @throws Exception
 	 */
 	public void testLibraryResolver2() throws Exception {
-		isTesting = true;
+		VMInstallTestsLibraryLocationResolver.isTesting = true;
 		try {
 			String filename = "/testfiles/test-jre/bin/test-resolver.ee";
 			if(Platform.OS_WIN32.equals(Platform.getOS())) {
@@ -158,7 +143,7 @@
 			assertResolvedLibraryLocations(locs);
 		}
 		finally {
-			isTesting = false;
+			VMInstallTestsLibraryLocationResolver.isTesting = false;
 		}
 	}
 	
@@ -169,7 +154,7 @@
 	 * @throws Exception
 	 */
 	public void testLibraryResolver3() throws Exception {
-		isTesting = true;
+		VMInstallTestsLibraryLocationResolver.isTesting = true;
 		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
 		assertNotNull("There must be a default VM", vm);
 		try {
@@ -182,7 +167,7 @@
 			assertResolvedLibraryLocations(locs);
 		}
 		finally {
-			isTesting = false;
+			VMInstallTestsLibraryLocationResolver.isTesting = false;
 			vm.getVMInstallType().disposeVMInstall(vm.getId());
 		}
 	}
@@ -195,7 +180,7 @@
 	 * @throws Exception
 	 */
 	public void testLibraryResolver4() throws Exception {
-		isTesting = true;
+		VMInstallTestsLibraryLocationResolver.isTesting = true;
 		try {
 			String filename = "/testfiles/test-jre/bin/test-resolver2.ee";
 			if(Platform.OS_WIN32.equals(Platform.getOS())) {
@@ -207,7 +192,7 @@
 			String locpath = null;
 			for (int i = 0; i < locs.length; i++) {
 				IPath path = locs[i].getSystemLibraryPath();
-				if(applies(path)) {
+				if(VMInstallTestsLibraryLocationResolver.applies(path)) {
 					locpath = path.toString();
 					assertTrue("The original source path should be set on the ext lib [" + locpath + "]",
 							locs[i].getSystemLibrarySourcePath().toString().indexOf("source.txt") > -1);
@@ -215,7 +200,7 @@
 			}
 		}
 		finally {
-			isTesting = false;
+			VMInstallTestsLibraryLocationResolver.isTesting = false;
 		}
 	}
 	
@@ -228,7 +213,7 @@
 		String locpath = null;
 		for (int i = 0; i < locs.length; i++) {
 			IPath path = locs[i].getSystemLibraryPath();
-			if(applies(path)) {
+			if(VMInstallTestsLibraryLocationResolver.applies(path)) {
 				locpath = path.toString();
 				assertTrue("There should be a source path ending in test_resolver_src.zip on the ext lib [" + locpath + "]",
 						locs[i].getSystemLibrarySourcePath().toString().indexOf("test_resolver_src.zip") > -1);
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTestsLibraryLocationResolver.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTestsLibraryLocationResolver.java
index e136faa..08c779a 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTestsLibraryLocationResolver.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTestsLibraryLocationResolver.java
@@ -18,10 +18,29 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.URIUtil;
 import org.eclipse.jdt.debug.testplugin.JavaTestPlugin;
+import org.eclipse.jdt.internal.launching.JavaFxLibraryResolver;
 import org.eclipse.jdt.launching.ILibraryLocationResolver;
 
 
 public class VMInstallTestsLibraryLocationResolver implements ILibraryLocationResolver {
+
+	// This used to be in VMInstallTests. Moved here to support headless test runs,
+	// which previously failed because VMInstallTests extends a UI class.
+	static boolean isTesting = false;
+
+	static boolean applies(IPath path) {
+		if (!isTesting) {
+			return false;
+		}
+	
+		for (int i = 0; i < path.segmentCount(); i++) {
+			if ("ext".equals(path.segment(i))) {
+				return !JavaFxLibraryResolver.JFXRT_JAR.equals(path.lastSegment());
+			}
+		}
+		return false;
+	}
+
 	/*
 	 * (non-Javadoc)
 	 * 
@@ -29,7 +48,7 @@
 	 */
 	@Override
 	public IPath getPackageRoot(IPath libraryPath) {
-		if (VMInstallTests.applies(libraryPath)) {
+		if (applies(libraryPath)) {
 			return new Path("src");
 		}
 		return Path.EMPTY;
@@ -42,7 +61,7 @@
 	 */
 	@Override
 	public IPath getSourcePath(IPath libraryPath) {
-		if (VMInstallTests.applies(libraryPath)) {
+		if (applies(libraryPath)) {
 			File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/test_resolver_src.zip"));
 			if (file.isFile()) {
 				return new Path(file.getAbsolutePath());
@@ -58,7 +77,7 @@
 	 */
 	@Override
 	public URL getJavadocLocation(IPath libraryPath) {
-		if (VMInstallTests.applies(libraryPath)) {
+		if (applies(libraryPath)) {
 			File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/test_resolver_javadoc.zip"));
 			if (file.isFile()) {
 				try {
@@ -79,7 +98,7 @@
 	 */
 	@Override
 	public URL getIndexLocation(IPath libraryPath) {
-		if (VMInstallTests.applies(libraryPath)) {
+		if (applies(libraryPath)) {
 			File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/test_resolver_index.index"));
 			if (file.isFile()) {
 				try {
