diff --git a/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver-win32-2.ee b/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver-win32-2.ee
new file mode 100644
index 0000000..2940682
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver-win32-2.ee
@@ -0,0 +1,31 @@
+##################################################################################
+# Copyright (c) 2013 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
+##################################################################################
+
+-Dee.executable=jrew.txt
+-Dee.executable.console=jre.txt
+
+-Dee.bootclasspath=..\lib\classes.txt:..\lib\others.txt
+-Dee.src=..\lib\source\source.txt
+-Dee.src.map=..\lib\endorsed\*.jar=..\lib\source\*.txt:..\lib\ext\ext?*.jar=..\lib\source\source.txt:..\lib\additional\*.???=..\lib\source\source*source.???
+-Dee.javadoc=http:\\a.javadoc.location
+-Dee.additional.dirs=..\lib\additional
+-Dee.ext.dirs=..\lib\ext:..\lib\opt-ext
+-Dee.endorsed.dirs=..\lib\endorsed
+
+# test new index attribute
+-Dee.index=http:\\a.index.location
+
+-Dee.language.level=1.7
+-Dee.class.library.level=J2SE-1.7
+-Dee.id=J2SE-1.7
+-Dee.name=Library Location Resolver Test JRE Definition
+-Dee.description=Foundation Specification v1.1
+-Dee.copyright=(c) Copyright IBM Corp. 2013  All Rights Reserved
diff --git a/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver-win32.ee b/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver-win32.ee
new file mode 100644
index 0000000..3f5a097
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver-win32.ee
@@ -0,0 +1,31 @@
+##################################################################################
+# Copyright (c) 2013 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
+##################################################################################
+
+-Dee.executable=jrew.txt
+-Dee.executable.console=jre.txt
+
+-Dee.bootclasspath=..\lib\classes.txt:..\lib\others.txt
+-Dee.src=..\lib\source\source.txt
+-Dee.src.map=..\lib\endorsed\*.jar=..\lib\source\*.txt:..\lib\additional\*.???=..\lib\source\source*source.???
+-Dee.javadoc=http:\\a.javadoc.location
+-Dee.additional.dirs=..\lib\additional
+-Dee.ext.dirs=..\lib\ext:..\lib\opt-ext
+-Dee.endorsed.dirs=..\lib\endorsed
+
+# test new index attribute
+-Dee.index=http://a.index.location
+
+-Dee.language.level=1.7
+-Dee.class.library.level=J2SE-1.7
+-Dee.id=J2SE-1.7
+-Dee.name=Library Location Resolver Test JRE Definition
+-Dee.description=Foundation Specification v1.1
+-Dee.copyright=(c) Copyright IBM Corp. 2013  All Rights Reserved
diff --git a/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver.ee b/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver.ee
new file mode 100644
index 0000000..c9ca87b
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver.ee
@@ -0,0 +1,41 @@
+##################################################################################
+# Copyright (c) 2013 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
+##################################################################################
+
+-Dee.executable=jrew.txt
+-Dee.executable.console=jre.txt
+
+-Dee.bootclasspath=../lib/classes.txt:../lib/others.txt
+-Dee.src=../lib/source/source.txt
+-Dee.src.map=../lib/endorsed/*.jar=../lib/source/*.txt:../lib/additional/*.???=../lib/source/source*source.???
+-Dee.javadoc=http://a.javadoc.location
+-Dee.additional.dirs=../lib/additional
+-Dee.ext.dirs=../lib/ext:../lib/opt-ext
+-Dee.endorsed.dirs=../lib/endorsed
+
+# all args should get passed through to command line
+-XspecialArg:123
+
+# tests an empty property
+-Dee.empty=
+
+# test new index attribute
+-Dee.index=http://a.index.location
+
+-Dee.language.level=1.7
+-Dee.class.library.level=J2SE-1.7
+-Dee.id=J2SE-1.7
+-Dee.name=Library Location Resolver Test JRE Definition
+-Dee.description=Foundation Specification v1.1
+-Dee.copyright=(c) Copyright IBM Corp. 2013  All Rights Reserved
+-Djava.home=..
+
+# all args should get passed through to command line
+-XspecialArg2=456
\ No newline at end of file
diff --git a/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver2.ee b/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver2.ee
new file mode 100644
index 0000000..6d2fd41
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testfiles/test-jre/bin/test-resolver2.ee
@@ -0,0 +1,41 @@
+##################################################################################
+# Copyright (c) 2013 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
+##################################################################################
+
+-Dee.executable=jrew.txt
+-Dee.executable.console=jre.txt
+
+-Dee.bootclasspath=../lib/classes.txt:../lib/others.txt
+-Dee.src=../lib/source/source.txt
+-Dee.src.map=../lib/endorsed/*.jar=../lib/source/*.txt:../lib/ext/ext?*.jar=../lib/source/source.txt:../lib/additional/*.???=../lib/source/source*source.???
+-Dee.javadoc=http://a.javadoc.location
+-Dee.additional.dirs=../lib/additional
+-Dee.ext.dirs=../lib/ext:../lib/opt-ext
+-Dee.endorsed.dirs=../lib/endorsed
+
+# all args should get passed through to command line
+-XspecialArg:123
+
+# tests an empty property
+-Dee.empty=
+
+# test new index attribute
+-Dee.index=http://a.index.location
+
+-Dee.language.level=1.7
+-Dee.class.library.level=J2SE-1.7
+-Dee.id=J2SE-1.7
+-Dee.name=Library Location Resolver Test JRE Definition
+-Dee.description=Foundation Specification v1.1
+-Dee.copyright=(c) Copyright IBM Corp. 2013  All Rights Reserved
+-Djava.home=..
+
+# all args should get passed through to command line
+-XspecialArg2=456
\ No newline at end of file
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 774a193..d441454 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
@@ -32,13 +32,14 @@
 import org.eclipse.jdt.launching.IVMInstall3;
 import org.eclipse.jdt.launching.JavaRuntime;
 import org.eclipse.jdt.launching.LibraryLocation;
+import org.eclipse.jdt.launching.VMStandin;
 
 /**
  * Tests for installed VMs
  */
 public class VMInstallTests extends AbstractDebugTest implements ILibraryLocationResolver {
 	
-	boolean isTesting = false;
+	static boolean isTesting = false;
 	
 	public VMInstallTests() {
 		super("VM Install tests");
@@ -102,53 +103,155 @@
 	}
 	
 	/**
-	 * Test the new support for {@link ILibraryLocationResolver}s
+	 * Tests the new support for {@link ILibraryLocationResolver}s asking for {@link LibraryLocation}s
+	 * using the {@link JavaRuntime#getLibraryLocations(IVMInstall)}s API
 	 * 
 	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
 	 * @throws Exception
 	 */
-	public void _testLibraryResolver1() throws Exception {
-		//set this flag when testing the resolver to avoid it setting bogus
-		//testing paths in a target workspace
+	public void testLibraryResolver1() throws Exception {
+		isTesting = true;
+		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
+		assertNotNull("There must be a default VM", vm);
+		
+		//invalidate it, causing a reset, then collect it again
+		vm.getVMInstallType().disposeVMInstall(vm.getId());
+		vm = JavaRuntime.getDefaultVMInstall();
+		assertNotNull("There must be a default VM after a reset", vm);
+		try {
+			LibraryLocation[] locs = JavaRuntime.getLibraryLocations(vm);
+			assertNotNull("there must be some default library locations", locs);
+			assertResolvedLibraryLocations(locs);
+		}
+		finally {
+			isTesting = false;
+			//force a re-compute to remove the bogus paths
+			vm.getVMInstallType().disposeVMInstall(vm.getId());
+		}
+	}
+	
+	/**
+	 * Tests the {@link ILibraryLocationResolver} asking for libs using an EE description file
+	 * 
+	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
+	 * @throws Exception
+	 */
+	public void testLibraryResolver2() throws Exception {
+		isTesting = true;
+		try {
+			String filename = "/testfiles/test-jre/bin/test-resolver.ee";
+			if(Platform.OS_WIN32.equals(Platform.getOS())) {
+				filename = "/testfiles/test-jre/bin/test-resolver-win32.ee";
+			}
+			VMStandin vm = getEEStandin(filename);
+			IVMInstall install = vm.convertToRealVM();
+			LibraryLocation[ ] locs = install.getLibraryLocations();
+			assertResolvedLibraryLocations(locs);
+		}
+		finally {
+			isTesting = false;
+		}
+	}
+	
+	/**
+	 * Tests the {@link ILibraryLocationResolver} asking for libs directly from the backing type of the {@link IVMInstall}
+	 * 
+	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
+	 * @throws Exception
+	 */
+	public void testLibraryResolver3() throws Exception {
 		isTesting = true;
 		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
 		assertNotNull("There must be a default VM", vm);
 		try {
-			//force a re-compute
-			vm.setLibraryLocations(null);
-			LibraryLocation[] locs = JavaRuntime.getLibraryLocations(vm);
-			assertNotNull("there must be some default library locations", locs);
-			//try to find an 'ext' dir to see if it has some lib infos
-			//the test resolver sets a source path of ../test_resolver_src.zip on
-			//any libs in the ext dir
+			//reset it
+			vm.getVMInstallType().disposeVMInstall(vm.getId());
+			vm = JavaRuntime.getDefaultVMInstall();
+			assertNotNull("There must be a default VM", vm);
+			
+			LibraryLocation[] locs = vm.getVMInstallType().getDefaultLibraryLocations(vm.getInstallLocation());
+			assertResolvedLibraryLocations(locs);
+		}
+		finally {
+			isTesting = false;
+			vm.getVMInstallType().disposeVMInstall(vm.getId());
+		}
+	}
+	
+	/**
+	 * Tests the {@link ILibraryLocationResolver} asking for libs using an EE description file that provides
+	 * a source path for the ext dirs does *not* get overridden by the resolver
+	 * 
+	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
+	 * @throws Exception
+	 */
+	public void testLibraryResolver4() throws Exception {
+		isTesting = true;
+		try {
+			String filename = "/testfiles/test-jre/bin/test-resolver2.ee";
+			if(Platform.OS_WIN32.equals(Platform.getOS())) {
+				filename = "/testfiles/test-jre/bin/test-resolver-win32-2.ee";
+			}
+			VMStandin vm = getEEStandin(filename);
+			IVMInstall install = vm.convertToRealVM();
+			LibraryLocation[ ] locs = install.getLibraryLocations();
 			String locpath = null;
 			for (int i = 0; i < locs.length; i++) {
 				IPath path = locs[i].getSystemLibraryPath();
 				if(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);
-					IPath root = locs[i].getPackageRootPath();
-					assertTrue("The source root path should be 'src' for ext lib ["+locpath+"]", root.toString().equals("src"));
-					URL url = locs[i].getJavadocLocation();
-					assertNotNull("There should be a Javadoc URL set for ext lib ["+locpath+"]", url);
-					assertTrue("There should be a javadoc path of test_resolver_javadoc.zip on the ext lib ["+locpath+"]", 
-							url.getPath().indexOf("test_resolver_javadoc.zip") > -1);
-					url = locs[i].getIndexLocation();
-					assertNotNull("There should be an index path of test_resolver_index.index on the ext lib ["+locpath+"]", url);
-					assertTrue("There should be an index path of test_resolver_index.index on the ext lib ["+locpath+"]", 
-							url.getPath().indexOf("test_resolver_index.index") > -1);
+					assertTrue("The original source path should be set on the ext lib ["+locpath+"]", 
+							locs[i].getSystemLibrarySourcePath().toString().indexOf("source.txt") > -1);
 				}
 			}
 		}
 		finally {
 			isTesting = false;
-			//force a re-compute to remove the bogus paths
-			vm.setLibraryLocations(null);
 		}
 	}
 	
 	/**
+	 * Checks the given {@link LibraryLocation}s to ensure they reference the testing resolver paths
+	 * 
+	 * @param locs
+	 */
+	void assertResolvedLibraryLocations(LibraryLocation[] locs) {
+		String locpath = null;
+		for (int i = 0; i < locs.length; i++) {
+			IPath path = locs[i].getSystemLibraryPath();
+			if(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);
+				IPath root = locs[i].getPackageRootPath();
+				assertTrue("The source root path should be 'src' for ext lib ["+locpath+"]", root.toString().equals("src"));
+				URL url = locs[i].getJavadocLocation();
+				assertNotNull("There should be a Javadoc URL set for ext lib ["+locpath+"]", url);
+				assertTrue("There should be a javadoc path of test_resolver_javadoc.zip on the ext lib ["+locpath+"]", 
+						url.getPath().indexOf("test_resolver_javadoc.zip") > -1);
+				url = locs[i].getIndexLocation();
+				assertNotNull("There should be an index path of test_resolver_index.index on the ext lib ["+locpath+"]", url);
+				assertTrue("There should be an index path of test_resolver_index.index on the ext lib ["+locpath+"]", 
+						url.getPath().indexOf("test_resolver_index.index") > -1);
+			}
+		}
+	}
+	
+	/**
+	 * Creates a {@link VMStandin} for the given EE file. Does not return <code>null</code>
+	 * @param filename
+	 * @return the {@link VMStandin}
+	 * @throws CoreException
+	 */
+	VMStandin getEEStandin(String filename) throws CoreException {
+		File ee = JavaTestPlugin.getDefault().getFileInPlugin(new Path(filename));
+		assertNotNull("The EE file "+filename+" was not found", ee);
+		VMStandin vm = JavaRuntime.createVMFromDefinitionFile(ee, "resolver-ee", "resolver-ee-id");
+		assertNotNull("the VM standin should exist for "+filename, vm);
+		return vm;
+	}
+	
+	/**
 	 * Generates a key used to cache system property for this VM in this plug-ins
 	 * preference store.
 	 * 
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java
index 01d456f..967c3c0 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java
@@ -14,6 +14,7 @@
 
 
 import java.io.File;
+import java.io.FilenameFilter;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -69,6 +70,17 @@
 	public static final String ID_STANDARD_VM_TYPE = "org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType"; //$NON-NLS-1$
 	
 	/**
+	 * Name filter for files ending in .jar or .zip
+	 * 
+	 * @since 3.7.0
+	 */
+	private static FilenameFilter fgArchiveFilter = new FilenameFilter() {
+		public boolean accept(File arg0, String arg1) {
+			return arg1.endsWith(".zip") || arg1.endsWith(".jar");  //$NON-NLS-1$//$NON-NLS-2$
+		}
+	};
+	
+	/**
 	 * The root path for the attached source
 	 */
 	private String fDefaultRootPath = ""; //$NON-NLS-1$
@@ -451,40 +463,33 @@
 		List<LibraryLocation> libraries = new ArrayList<LibraryLocation>();
 		for (int i = 0; i < dirPaths.length; i++) {
 			File extDir = new File(dirPaths[i]);
-			if (extDir.exists() && extDir.isDirectory()) {
-				String[] names = extDir.list();
+			if (extDir.isDirectory()) {
+				String[] names = extDir.list(fgArchiveFilter);
 				if (names != null) {
 					for (int j = 0; j < names.length; j++) {
-						String name = names[j];
-						File jar = new File(extDir, name);
+						File jar = new File(extDir, names[j]);
 						if (jar.isFile()) {
-							int length = name.length();
-							if (length > 4) {
-								String suffix = name.substring(length - 4);
-								if (suffix.equalsIgnoreCase(".zip") || suffix.equalsIgnoreCase(".jar")) { //$NON-NLS-1$ //$NON-NLS-2$
+							try {
+								IPath libPath = new Path(jar.getCanonicalPath());
+								IPath sourcePath = Path.EMPTY;
+								IPath packageRoot = Path.EMPTY;
+								URL javadocLocation = null;
+								URL indexLocation = null;
+								for( ILibraryLocationResolver resolver : getLibraryLocationResolvers() ) {
 									try {
-										IPath libPath = new Path(jar.getCanonicalPath());
-										IPath sourcePath = Path.EMPTY;
-										IPath packageRoot = Path.EMPTY;
-										URL javadocLocation = null;
-										URL indexLocation = null;
-										for( ILibraryLocationResolver resolver : getLibraryLocationResolvers() ) {
-											try {
-												sourcePath = resolver.getSourcePath(libPath);
-												packageRoot = resolver.getPackageRoot(libPath);
-												javadocLocation = resolver.getJavadocLocation(libPath);
-												indexLocation = resolver.getIndexLocation(libPath);
-												break;
-											} catch(Exception e) {
-												LaunchingPlugin.log(e);
-											}
-										}
-										LibraryLocation library = new LibraryLocation(libPath, sourcePath, packageRoot, javadocLocation, indexLocation);
-										libraries.add(library);
-									} catch (IOException e) {
+										sourcePath = resolver.getSourcePath(libPath);
+										packageRoot = resolver.getPackageRoot(libPath);
+										javadocLocation = resolver.getJavadocLocation(libPath);
+										indexLocation = resolver.getIndexLocation(libPath);
+										break;
+									} catch(Exception e) {
 										LaunchingPlugin.log(e);
 									}
 								}
+								LibraryLocation library = new LibraryLocation(libPath, sourcePath, packageRoot, javadocLocation, indexLocation);
+								libraries.add(library);
+							} catch (IOException e) {
+								LaunchingPlugin.log(e);
 							}
 						}
 					}
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
index 9a3f9d8..51abb56 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
@@ -1705,6 +1705,7 @@
                 } else {
                     javadocLocations[i]= defJavaDocLocation;
                 }
+                indexes[i] = dflts[i].getIndexLocation();
 				if (!libraryPaths[i].toFile().isFile()) {
 					libraryPaths[i]= Path.EMPTY;
 				}
