diff --git a/jsf/tests/org.eclipse.jst.jsf.core.tests/META-INF/MANIFEST.MF b/jsf/tests/org.eclipse.jst.jsf.core.tests/META-INF/MANIFEST.MF
index d435119..1063529 100644
--- a/jsf/tests/org.eclipse.jst.jsf.core.tests/META-INF/MANIFEST.MF
+++ b/jsf/tests/org.eclipse.jst.jsf.core.tests/META-INF/MANIFEST.MF
@@ -24,7 +24,8 @@
  org.eclipse.wst.validation;bundle-version="[1.1.0,1.2.0)",
  org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
  org.eclipse.jst.jsf.facesconfig;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.jface.text
+ org.eclipse.jface.text,
+ org.eclipse.core.net
 Eclipse-LazyStart: true
 Export-Package: org.eclipse.jst.jsf.core.tests;x-friends:="org.eclipse.jst.jsf.ui.tests,org.eclipse.jst.jsf.context.symbol.tests,org.eclipse.jst.jsf.designtime.tests",
  org.eclipse.jst.jsf.core.tests.appconfig.provider;x-internal:=true,
diff --git a/jsf/tests/org.eclipse.jst.jsf.core.tests/src/org/eclipse/jst/jsf/core/tests/appconfig/provider/TestJARFileJSFAppConfigProvider.java b/jsf/tests/org.eclipse.jst.jsf.core.tests/src/org/eclipse/jst/jsf/core/tests/appconfig/provider/TestJARFileJSFAppConfigProvider.java
index 25ab588..63e3c88 100644
--- a/jsf/tests/org.eclipse.jst.jsf.core.tests/src/org/eclipse/jst/jsf/core/tests/appconfig/provider/TestJARFileJSFAppConfigProvider.java
+++ b/jsf/tests/org.eclipse.jst.jsf.core.tests/src/org/eclipse/jst/jsf/core/tests/appconfig/provider/TestJARFileJSFAppConfigProvider.java
@@ -15,6 +15,12 @@
 
 import junit.framework.TestCase;
 
+import org.eclipse.core.internal.net.ProxyData;
+import org.eclipse.core.internal.net.ProxyManager;
+import org.eclipse.core.net.proxy.IProxyData;
+import org.eclipse.core.net.proxy.IProxyService;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.jdt.core.IClasspathEntry;
 import org.eclipse.jst.jsf.core.IJSFCoreConstants;
@@ -32,6 +38,7 @@
 import org.eclipse.jst.jsf.test.util.JDTTestEnvironment;
 import org.eclipse.jst.jsf.test.util.JSFTestUtil;
 import org.eclipse.jst.jsf.test.util.WebProjectTestEnvironment;
+import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
 
 /**
  * Unit test for JARFileJSFAppConfigProvider, the app config provider
@@ -42,52 +49,96 @@
  */
 public class TestJARFileJSFAppConfigProvider extends TestCase 
 {
+	private final static String NO_EXT_DATA_JAR_PATH= 
+		"/testfiles/appconfig/noextdata.jar";
+	private final static String WITH_EXT_DATA_JAR_PATH= 
+		"/testfiles/appconfig/withextdata.jar";
+	private final static String NO_FACES_CONFIG_FILE=
+		"/testfiles/appconfig/fail2_nofacesconfig.jar";
+	
+	private final static String FAIL_JAR_PATH=
+		"/testfiles/appconfig/fail2.jar";
+	
     private WebProjectTestEnvironment       _testEnv;
     private JDTTestEnvironment              _jdtTestEnv;
     
     private IClasspathEntry                 _noExtData;
     private IClasspathEntry                 _withExtData;
-    
+    private IClasspathEntry					_noFacesConfigFile;
+    private IResource						_copiedIntoProject;
+
     @Override
     protected void setUp() throws Exception 
     {
         super.setUp();
-        
-        JSFTestUtil.setValidationEnabled(false);
-        
-        JSFTestUtil.setInternetProxyPreferences
-                (true, "www-proxy.us.oracle.com", "80");
 
-        _testEnv = new WebProjectTestEnvironment("ELValidationTest_"+this.getClass().getName()+"_"+getName());
+        JSFTestUtil.setValidationEnabled(false);
+
+        setInternetPrefs();
+//        JSFTestUtil.setInternetProxyPreferences
+//            (true, "www-proxy.us.oracle.com", "80");
+
+        _testEnv = new WebProjectTestEnvironment(
+        				"ELValidationTest_"+this.getClass().getName()+"_"+getName());
         _testEnv.createProject(false);
         assertNotNull(_testEnv);       
         assertNotNull(_testEnv.getTestProject());
         assertTrue(_testEnv.getTestProject().isAccessible());
 
+        _copiedIntoProject =_testEnv.loadResourceInWebRoot(
+        	TestsPlugin.getDefault().getBundle()
+        	     , FAIL_JAR_PATH, "WEB-INF/lib/fail2.jar");
+        assertNotNull(_copiedIntoProject);
+        assertTrue(_copiedIntoProject.exists());
+
         _jdtTestEnv = new JDTTestEnvironment(_testEnv);
-        _noExtData = _jdtTestEnv.addJarClasspathEntry(TestsPlugin.getDefault().getBundle(), "/testfiles/appconfig/noextdata.jar");
+        _noExtData = _jdtTestEnv.addJarClasspathEntry(
+        	TestsPlugin.getDefault().getBundle(), NO_EXT_DATA_JAR_PATH);
         assertNotNull(_noExtData);
-        _withExtData = _jdtTestEnv.addJarClasspathEntry(TestsPlugin.getDefault().getBundle(), "/testfiles/appconfig/withextdata.jar");
+
+        _withExtData = _jdtTestEnv.addJarClasspathEntry(
+        	TestsPlugin.getDefault().getBundle(), WITH_EXT_DATA_JAR_PATH);
         assertNotNull(_withExtData);
+
+        _noFacesConfigFile = _jdtTestEnv.addJarClasspathEntry(
+        	TestsPlugin.getDefault().getBundle(), NO_FACES_CONFIG_FILE);
+        assertNotNull(_noFacesConfigFile);
         
-        // initialize test case for faces 1.2
+        // initialize test case for faces 1.1
         JSFFacetedTestEnvironment jsfFacedEnv = new JSFFacetedTestEnvironment(_testEnv);
-        jsfFacedEnv.initialize(IJSFCoreConstants.FACET_VERSION_1_2);
+        jsfFacedEnv.initialize(IJSFCoreConstants.FACET_VERSION_1_1);
     }
-    
-    /**
-     * Tests model load of a simple jar-based faces config file that has no extension data
-     * in it.
+
+    @Override
+	protected void tearDown() throws Exception 
+	{
+		super.tearDown();
+
+		// ensure the project can be deleted (no jar lock: 
+		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=195867)
+		IVirtualContainer container = _testEnv.getWebRoot(false, false);
+		assertNotNull(container);
+		IFile file = container.getFile("WEB-INF/lib/fail2.jar").getUnderlyingFile();
+		assertNotNull(file);
+		assertTrue(file.exists());
+		_testEnv.getTestProject().delete(true, null);
+		assertFalse(_testEnv.getTestProject().exists());
+		assertFalse(file.exists());
+	}
+
+	/**
+     * Tests model load of a simple jar-based faces config file that has no 
+     * extension data in it.
      */
     public void testNoExtensionData() throws Exception
     {
-        JARFileJSFAppConfigProvider provider = createProvider(_noExtData);
+        JARFileJSFAppConfigProvider provider = createProvider(_noExtData, true);
         FacesConfigType facesConfig = provider.getFacesConfigModel();
         assertNotNull(facesConfig);
 
         verifyCommonElements(facesConfig);
     }
-    
+
     /**
      * This is a regression for https://bugs.eclipse.org/bugs/show_bug.cgi?id=181643
      * 
@@ -99,7 +150,7 @@
      */
     public void testWithExtensionData() throws Exception
     {
-        JARFileJSFAppConfigProvider provider = createProvider(_withExtData);
+        JARFileJSFAppConfigProvider provider = createProvider(_withExtData, true);
         FacesConfigType facesConfig = provider.getFacesConfigModel();
         assertNotNull(facesConfig);
 
@@ -115,7 +166,22 @@
         // once translation of ANY content is fixed for JAR-contained faces-config models
         assertEquals(0, extType.getChildNodes().size());
     }
-    
+
+    public void testJarCopiedInProject() throws Exception
+    {
+        JARFileJSFAppConfigProvider provider = 
+        	createProvider((IFile) _copiedIntoProject);
+        FacesConfigType facesConfig = provider.getFacesConfigModel();
+        assertNotNull(facesConfig);
+    }
+
+    public void testNoFacesConfigJar() throws Exception
+    {
+        JARFileJSFAppConfigProvider provider = createProvider(_noFacesConfigFile, false);
+        FacesConfigType facesConfig = provider.getFacesConfigModel();
+        assertNull(facesConfig);
+    }
+
     private void verifyCommonElements(FacesConfigType facesConfig)
     {
         assertEquals(1, facesConfig.getComponent().size());
@@ -131,40 +197,64 @@
         assertEquals("java.util.List", managedBean.getManagedBeanClass().getTextContent());
         assertEquals("request", managedBean.getManagedBeanScope().getTextContent());
     }
-    
-    private JARFileJSFAppConfigProvider createProvider(IClasspathEntry forJar) throws Exception
+
+    private JARFileJSFAppConfigProvider createProvider(IFile file) throws Exception
     {
-        final String libName = getLibraryName(forJar);
-        
+        final String libName = file.getLocation().toOSString();
+
         IJSFAppConfigLocater locator = new RuntimeClasspathJSFAppConfigLocater();
         locator.setJSFAppConfigManager(JSFAppConfigManager.getInstance(_testEnv.getTestProject()));
         JARFileJSFAppConfigProvider  provider = new JARFileJSFAppConfigProvider(libName);
         provider.setJSFAppConfigLocater(locator);
         return provider;
     }
-    
-    private static String getLibraryName(IClasspathEntry classPathEntry) throws Exception
+
+    private JARFileJSFAppConfigProvider createProvider(IClasspathEntry forJar, boolean assertFacesConfig) throws Exception
+    {
+        final String libName = getLibraryName(forJar, assertFacesConfig);
+
+        IJSFAppConfigLocater locator = new RuntimeClasspathJSFAppConfigLocater();
+        locator.setJSFAppConfigManager(JSFAppConfigManager.getInstance(_testEnv.getTestProject()));
+        JARFileJSFAppConfigProvider  provider = new JARFileJSFAppConfigProvider(libName);
+        provider.setJSFAppConfigLocater(locator);
+        return provider;
+    }
+
+    private static String getLibraryName(IClasspathEntry classPathEntry, boolean assertFacesConfig) throws Exception
     {
         IPath libraryPath = classPathEntry.getPath();
 
         final String libraryPathString = libraryPath.toOSString();         
 
-        JarFile jarFile = null;
-        
-        try
+        if (assertFacesConfig)
         {
-            jarFile = new JarFile(libraryPathString);
-            if (jarFile != null) {
-                JarEntry jarEntry = jarFile.getJarEntry(JSFAppConfigUtils.FACES_CONFIG_IN_JAR_PATH);
-                if (jarEntry != null) {
-                    return libraryPathString;
-                }
-            }
-            return null;
-        } finally {
-            if (jarFile != null) {
-                jarFile.close();
-            }
+	        JarFile jarFile = null;
+	
+	        try
+	        {
+	            jarFile = new JarFile(libraryPathString);
+	            if (jarFile != null) {
+	                JarEntry jarEntry = jarFile.getJarEntry(JSFAppConfigUtils.FACES_CONFIG_IN_JAR_PATH);
+	                assertNotNull(jarEntry);
+	            }
+	        } finally {
+	            if (jarFile != null) {
+	                jarFile.close();
+	            }
+	        }
         }
+        
+        return libraryPathString;
+    }
+
+    private static void setInternetPrefs() throws Exception
+    {
+    	IProxyService proxy = ProxyManager.getProxyManager();
+
+    	ProxyData proxyData = new ProxyData(IProxyData.HTTP_PROXY_TYPE);
+		proxyData.setHost("www-proxy.us.oracle.com");
+		proxyData.setPassword("80");
+		proxy.setProxyData(new ProxyData[] { proxyData });
+		proxy.setProxiesEnabled(true);
     }
 }
diff --git a/jsf/tests/org.eclipse.jst.jsf.core.tests/testfiles/appconfig/fail2.jar b/jsf/tests/org.eclipse.jst.jsf.core.tests/testfiles/appconfig/fail2.jar
new file mode 100644
index 0000000..7e369c6
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.core.tests/testfiles/appconfig/fail2.jar
Binary files differ
diff --git a/jsf/tests/org.eclipse.jst.jsf.core.tests/testfiles/appconfig/fail2_nofacesconfig.jar b/jsf/tests/org.eclipse.jst.jsf.core.tests/testfiles/appconfig/fail2_nofacesconfig.jar
new file mode 100644
index 0000000..1f3a814
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.core.tests/testfiles/appconfig/fail2_nofacesconfig.jar
Binary files differ
