diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/AllTests.java
index b7cdc7a..3fee11e 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/AllTests.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/AllTests.java
@@ -22,8 +22,7 @@
         suite.addTest(ClasspathDependencyCreationTests.suite());
         //suite.addTest(ClasspathDependencyValidationTests.suite());
         suite.addTest(ClasspathDependencyEARTests.suite());
-        //[Bug 234409] Temporarily removing these tests until underlying issue is fixed
-//        suite.addTest(ClasspathDependencyWebTests.suite());
+        suite.addTest(ClasspathDependencyWebTests.suite());
         
         return suite;
     }
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyEARTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyEARTests.java
index 2a6adc9..adb15ed 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyEARTests.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyEARTests.java
@@ -70,6 +70,7 @@
         //suite.addTest(new ClasspathDependencyEARTests("testEARExportJEE5"));
         suite.addTest(new ClasspathDependencyEARTests("testEARPublishJ2EE"));
         suite.addTest(new ClasspathDependencyEARTests("testEARPublishJEE5"));
+        suite.addTest(new ClasspathDependencyEARTests("testEARLibPublishJEE5"));
         return suite;
     }
     
@@ -189,6 +190,10 @@
     	testEARPublish(true);
     }
     
+    public void testEARLibPublishJEE5() throws Exception {
+    	testEARLibPublishJEE5(true);
+    }
+    
     private void testEARPublish(boolean JEE5) throws Exception {
 
     	// create the EAR and module projects
@@ -214,19 +219,41 @@
     	verifyPublishedEAR(earComp, archiveNames, true, JEE5);
     }
     
+    private void testEARLibPublishJEE5(boolean JEE5) throws Exception {
+    	IVirtualComponent webComp = createWebProject(JEE5);
+    	
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	final IProject earProject = ProjectUtil.getProject(EAR_PROJECT);
+    	final IVirtualComponent earComp = ComponentCore.createComponent(earProject);
+    	
+    	verifyPublishedEARLibRef(earComp, archiveNames, false, JEE5);
+
+    	addEARLibDependencyAttribute(false);
+    	
+    	verifyPublishedEARLibRef(earComp, archiveNames, true, JEE5);
+    }
+    
     private void verifyPublishedEAR(final IVirtualComponent comp, final Set archiveNames, final boolean shouldHaveDependencies, boolean isEE5) throws Exception {
     	
     	// verify that the published EAR contains the cp container jars from the Utility
     	J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(comp.getProject(), comp);
 		try {
 			IModuleResource[] rootmembers = deployable.members();
-			IModuleResource[] members;
-			if (isEE5 && rootmembers.length > 0 && rootmembers[0].getName().equals("lib")) {
-				members = ((IModuleFolder) rootmembers[0]).members();
+			IModuleResource[] members = null;
+			if (isEE5) {
+				for (int i=0; i<rootmembers.length; i++) {
+					String name = rootmembers[i].getName();
+					if (name.equals("lib")) {
+						members = ((IModuleFolder)rootmembers[i]).members();
+					}
+				}
 			}
-			else {
+
+			if (members == null)
 				members = rootmembers;
-			}
+				
 			Iterator it = archiveNames.iterator();						
 			while (it.hasNext()) {
 				String name = (String) it.next();
@@ -354,6 +381,105 @@
 		}    	
     }
     
+private void verifyPublishedEARLibRef(final IVirtualComponent comp, final Set archiveNames, final boolean shouldHaveDependencies, boolean isEE5) throws Exception {
+    	
+    	J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(comp.getProject(), comp);
+		try {
+			IModuleResource[] rootmembers = deployable.members();
+			IModuleResource[] members = null;
+			if (isEE5) {
+				for (int i=0; i<rootmembers.length; i++) {
+					String name = rootmembers[i].getName();
+					if (name.equals("lib")) {
+						members = ((IModuleFolder)rootmembers[i]).members();
+					}
+				}
+			}
+
+			if (members == null)
+				members = rootmembers;
+			
+			Iterator it = archiveNames.iterator();						
+			while (it.hasNext()) {
+				String name = (String) it.next();
+				boolean hasArchive = false;
+				for (int i=0; i<members.length; i++) {
+					if (members[i].getName().equals(name)) {
+						hasArchive = true;
+					}
+				}
+				if (shouldHaveDependencies) {
+					assertTrue("Published EAR missing classpath dependency Jar " + name, hasArchive);  					
+				} else {
+					assertFalse("Published EAR has unexpected classpath dependency Jar " + name, hasArchive);
+				}
+			}
+			
+			IModule webModule = null;
+			IModule[] childModules = deployable.getChildModules();
+			for (int i=0; i < childModules.length; i++) {
+				if (childModules[i].getName().equals(WEB_PROJECT)) {
+					webModule = childModules[i];
+				}
+			}
+			
+			assertNotNull("Missing entry for web project", webModule);
+
+			J2EEFlexProjDeployable projectModule =(J2EEFlexProjDeployable) webModule.loadAdapter(ProjectModule.class, null);
+			IModuleResource[] moduleMembers = projectModule.members();
+			ArchiveManifest manifest = null;
+			boolean foundMetaInf = false;
+			for (int i=0; i< moduleMembers.length; i++) {
+				String name = moduleMembers[i].getName();
+				if (name.equals("META-INF")) {
+					foundMetaInf = true;
+					IModuleResource manifestResource= ((IModuleFolder)moduleMembers[i]).members()[0];
+					assertTrue(manifestResource.getModuleRelativePath().toString().equals("META-INF"));
+					assertTrue("Expected MANIFEST.MF, got " + manifestResource.getName(), manifestResource.getName().equals("MANIFEST.MF"));
+					java.io.File manifestFile = (java.io.File) manifestResource.getAdapter(java.io.File.class);
+					if (manifestFile == null) {
+						manifestFile = ((IFile) manifestResource.getAdapter(IFile.class)).getLocation().toFile();
+					}
+					assertNotNull(manifestFile);
+					FileInputStream fis = null;
+					try {
+						fis = new FileInputStream(manifestFile);
+						manifest = new ArchiveManifestImpl(fis);
+					} finally {
+						if (fis != null) {
+							fis.close();
+						}
+					}
+				} 
+			}
+			if (!foundMetaInf) {
+				assertTrue("members() failed to return META-INF for web project module in published EAR", foundMetaInf);
+			}
+			
+			assertNotNull("Failed to retrieve MANIFEST.MF from web project module in published EAR", manifest);
+			
+			it = archiveNames.iterator();						
+			while (it.hasNext()) {
+				String name = (String) it.next();
+				boolean isOnCP = false;
+				String[] cp = manifest.getClassPathTokenized();
+				for (int j = 0; j < cp.length; j++) {
+					if (cp[j].equals("lib/" + name)) {
+						isOnCP = true;
+					}
+				}
+				if (shouldHaveDependencies && ClasspathDependencyEnablement.isAllowClasspathComponentDependency()) {
+					assertTrue("Utility project MANIFEST.MF classpath in published EAR missing entry for dependency Jar " + name, isOnCP);  					
+				} else {
+					assertFalse("Utility project MANIFEST.MF classpath in published EAR has unexpected entry for dependency Jar " + name, isOnCP);  					
+				}
+			}
+			
+		} catch (CoreException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		}    	
+    }
     
     private IVirtualComponent createProjects(boolean JEE5) throws Exception {
 
@@ -395,14 +521,29 @@
     	
     	return webComp;
     }
+    
+    private IVirtualComponent createWebProject(boolean JEE5) throws Exception {
+    	// create a Web project
+    	int version = J2EEVersionConstants.SERVLET_2_5;
+    	if (!JEE5) {
+    		version = J2EEVersionConstants.SERVLET_2_4;
+    	}
+    	final IProject webProject = ProjectUtil.createWebProject(WEB_PROJECT, EAR_PROJECT, version, true);
+    	final IJavaProject webJavaProject = JavaCore.create(webProject);
+    	final IVirtualComponent webComp = ComponentCore.createComponent(webProject);
+ 	
+    	// add a cp dependency to the Utility
+    	ClasspathDependencyTestUtil.addCustomClasspathContainer(webJavaProject);
+    	
+    	return webComp;
+    }
    
   
     /**
      * 
      * @param verifyClasspathDependencies - true if you want to immediately verify that
      * the classpath dependencies were added.  Set to false if you want to verify this at
-     * a later time.  Such as thru a members call in export or publish.  
-     * Note: When set to true may fail a valid scenario due to JDT initialization issues.
+     * a later time (such as thru a members call in export or publish).  
      * @throws Exception
      */
     private void addDependencyAttribute(boolean verifyClasspathDependencies) throws Exception {
@@ -464,4 +605,43 @@
     	if (verifyClasspathDependencies)
     		ClasspathDependencyTestUtil.verifyClasspathDependencies(webComp, archiveNames);
     }
+    
+    /**
+     * 
+     * @param verifyClasspathDependencies - true if you want to immediately verify that
+     * the classpath dependencies were added.  Set to false if you want to verify this at
+     * a later time (such as thru a members call in export or publish)  
+     * @throws Exception
+     */
+    private void addEARLibDependencyAttribute(boolean verifyClasspathDependencies) throws Exception {
+
+    	final IProject web = ProjectUtil.getProject(WEB_PROJECT);
+    	final IJavaProject webJava = JavaCore.create(web);
+    	final IVirtualComponent webComp = ComponentCore.createComponent(web);
+    	
+    	final Set entryPaths = new HashSet();
+    	entryPaths.add(ClasspathDependencyTestUtil.CUSTOM_CLASSPATH_CONTAINER);
+    	// verify that "bin" and the custom cp container are potential entries
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(webJava, entryPaths);
+    	// verify that no entries have the classpath attribute
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(webJava);
+    	// verify that there are no classpath dependencies
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(webComp);
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+
+    	// add the dependency attribute to "bin" and the cp container    	
+    	for (Object o: entries) {
+    		UpdateClasspathAttributeUtil.addDependencyAttribute(null, web.getName(), (IClasspathEntry) o, new Path("../lib"));
+    	}
+    	// should no longer have potential entries
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(webJava);
+    	// verify that "bin" and the cp container have the attribute
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(webJava, entryPaths);
+    	// verify that "bin" and the cp container are dependencies
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	if (verifyClasspathDependencies)
+    		ClasspathDependencyTestUtil.verifyClasspathDependencies(webComp, archiveNames);
+    }
 }
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyWebTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyWebTests.java
index 9cca823..5688ec6 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyWebTests.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyWebTests.java
@@ -15,6 +15,9 @@
 import java.util.List;
 import java.util.Set;
 
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
@@ -35,12 +38,9 @@
 import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.server.core.util.ModuleFolder;
+import org.eclipse.wst.server.core.model.IModuleFolder;
 import org.eclipse.wst.server.core.model.IModuleResource;
 
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
 /**
  * Tests export and publish behavior for classpath component dependencies and web projects.
  */
@@ -60,6 +60,7 @@
         //suite.addTest(new ClasspathDependencyWebTests("testWebExportJEE5"));
         suite.addTest(new ClasspathDependencyWebTests("testWebPublishJ2EE"));
         suite.addTest(new ClasspathDependencyWebTests("testWebPublishJEE5"));
+        suite.addTest(new ClasspathDependencyWebTests("testWebContainerPublishJEE5"));
         return suite;
     }
     
@@ -83,7 +84,7 @@
     	verifyExportedWebInfLibs(webComp, archiveNames, false);
     	
     	// add the cp dependency attribute to the cp container in the util
-    	addDependencyAttribute();
+    	addDependencyAttribute(false);
     	
     	// verify that the exported WAR WEB-INF/lib does contain the cp container jars from the Utility
     	verifyExportedWebInfLibs(webComp, archiveNames, true);
@@ -148,6 +149,10 @@
         testWebPublish(true);
     }
     
+    public void testWebContainerPublishJEE5() throws Exception {
+        testWebContainerPublish(true);
+    }
+    
     private void testWebPublish(boolean JEE5) throws Exception {
 
     	// create the web and utility projects
@@ -160,14 +165,27 @@
     	verifyPublishedWebInfLibs(webComp, archiveNames, false);
     	
     	// add the cp dependency attribute to the cp container in the util
-    	addDependencyAttribute();
+    	addDependencyAttribute(true);
     	
     	// verify that the exported WAR WEB-INF/lib does contain the cp container jars from the Utility
     	verifyPublishedWebInfLibs(webComp, archiveNames, true);
     }
     
+    private void testWebContainerPublish(boolean JEE5) throws Exception {
+    	IVirtualComponent webComp = createWebProject(JEE5);
+    	
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	
+    	verifyPublishedWebInfContainer(webComp, archiveNames, false);
+    	
+    	addWebInfContainerDependencyAttribute(false);
+
+    	verifyPublishedWebInfContainer(webComp, archiveNames, true);
+    }
+    
     private void verifyPublishedWebInfLibs(final IVirtualComponent comp, final Set archiveNames, final boolean shouldHaveDependencies) throws Exception {
-    	// verify that the published WAR's WEB-INF/lib contains the cp container jars from the Utility
     	J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(comp.getProject(), comp);
     	
 		try {
@@ -177,12 +195,12 @@
 			for (int i=0; i<members.length; i++) {
 				String name = members[i].getName();
 				if (name.equals("WEB-INF")) {
-					IModuleResource[] webInf = ((ModuleFolder)members[i]).members();
+					IModuleResource[] webInf = ((IModuleFolder)members[i]).members();
 					for (int j=0; j<webInf.length; j++) {
 						IModuleResource webResource = webInf[j];
 						assertTrue(webResource.getModuleRelativePath().toString().equals("WEB-INF"));
 						if (webResource.getName().equals("lib")) {
-							IModuleResource[] webresMembers = ((ModuleFolder)webResource).members();
+							IModuleResource[] webresMembers = ((IModuleFolder)webResource).members();
 							Iterator it = archiveNames.iterator();
 							while (it.hasNext()) {
 								String archiveName = (String) it.next();
@@ -200,10 +218,10 @@
 								}
 							}
 						} else if (webResource.getName().equals("classes")) {
-							IModuleResource[] webresMembers = ((ModuleFolder)webResource).members();
+							IModuleResource[] webresMembers = ((IModuleFolder)webResource).members();
 							for (j = 0; j < webresMembers.length; j++) {
 								if (webresMembers[j].getName().equals("nested")) {
-									IModuleResource[] nestedMembers = ((ModuleFolder)webresMembers[j]).members();
+									IModuleResource[] nestedMembers = ((IModuleFolder)webresMembers[j]).members();
 									assertTrue("Published WAR should have have nested folder without class folder dependency", shouldHaveDependencies);
 									boolean hasNestedTest = false;
 									if (nestedMembers.length == 1 && nestedMembers[0].getName().equals("test")) {
@@ -227,6 +245,49 @@
 		}    	
     }
     
+    private void verifyPublishedWebInfContainer(final IVirtualComponent comp, final Set archiveNames, final boolean shouldHaveDependencies) throws Exception {
+    	J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(comp.getProject(), comp);
+    	
+		try {
+			IModuleResource[] members = deployable.members();
+			assertTrue(members.length==2);
+			
+			for (int i=0; i<members.length; i++) {
+				String name = members[i].getName();
+				if (name.equals("WEB-INF")) {
+					IModuleResource[] webInf = ((IModuleFolder)members[i]).members();
+					for (int j=0; j<webInf.length; j++) {
+						IModuleResource webResource = webInf[j];
+						assertTrue(webResource.getModuleRelativePath().toString().equals("WEB-INF"));
+						if (webResource.getName().equals("lib")) {
+							IModuleResource[] webresMembers = ((IModuleFolder)webResource).members();
+							Iterator it = archiveNames.iterator();
+							while (it.hasNext()) {
+								String archiveName = (String) it.next();
+								boolean hasArchive = false;
+								for (int k = 0; k < webresMembers.length; k++) {
+									String localName = webresMembers[k].getName();
+									if (localName.equals(archiveName)) {
+										hasArchive= true;
+									}
+								}
+								if (shouldHaveDependencies) {
+									assertTrue("Published WAR missing classpath dependency Jar " + archiveName, hasArchive);  					
+								} else {
+									assertFalse("Published WAR has unexpected classpath dependency Jar " + archiveName, hasArchive);
+								}
+							}
+						} 
+					}
+				} 
+			}
+
+		} catch (CoreException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		}    	
+    }
+    
     private IVirtualComponent createProjects(boolean JEE5) throws Exception {
     	// create a Utility project
     	final IProject util = ProjectUtil.createUtilityProject(UTIL_PROJECT, null, true);
@@ -263,7 +324,30 @@
     	return webComp;
     }
     
-    private void addDependencyAttribute() throws Exception {
+    private IVirtualComponent createWebProject(boolean JEE5) throws Exception {
+    	// create a Web project
+    	int version = J2EEVersionConstants.SERVLET_2_5;
+    	if (!JEE5) {
+    		version = J2EEVersionConstants.SERVLET_2_4;
+    	}
+    	final IProject webProject = ProjectUtil.createWebProject(WEB_PROJECT, null, version, true);
+    	final IJavaProject webJavaProject = JavaCore.create(webProject);
+    	final IVirtualComponent webComp = ComponentCore.createComponent(webProject);
+ 	
+    	// add a cp dependency to the Utility
+    	ClasspathDependencyTestUtil.addCustomClasspathContainer(webJavaProject);
+    	
+    	return webComp;
+    }
+    
+    /**
+     * 
+     * @param verifyClasspathDependencies - true if you want to immediately verify that
+     * the classpath dependencies were added.  Set to false if you want to verify this at
+     * a later time (such as thru a members call in export or publish)  
+     * @throws Exception
+     */
+    private void addDependencyAttribute(boolean verifyClasspathDependencies) throws Exception {
     	final IProject util = ProjectUtil.getProject(UTIL_PROJECT);
     	final IJavaProject utilJava = JavaCore.create(util);
     	final IVirtualComponent utilComp = ComponentCore.createComponent(util);
@@ -308,4 +392,44 @@
     	archiveNames.add(fullWebBinPath.toString());
     	ClasspathDependencyTestUtil.verifyClasspathDependencies(webComp, archiveNames);
     }
+    
+    /**
+     * 
+     * @param verifyClasspathDependencies - true if you want to immediately verify that
+     * the classpath dependencies were added.  Set to false if you want to verify this at
+     * a later time (such as thru a members call in export or publish)  
+     * @throws Exception
+     */
+    private void addWebInfContainerDependencyAttribute(boolean verifyClasspathDependencies) throws Exception {
+
+    	final IProject web = ProjectUtil.getProject(WEB_PROJECT);
+    	final IJavaProject webJava = JavaCore.create(web);
+    	final IVirtualComponent webComp = ComponentCore.createComponent(web);
+    	
+    	final Set entryPaths = new HashSet();
+    	entryPaths.add(ClasspathDependencyTestUtil.CUSTOM_CLASSPATH_CONTAINER);
+    	// verify that "bin" and the custom cp container are potential entries
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(webJava, entryPaths);
+    	// verify that no entries have the classpath attribute
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(webJava);
+    	// verify that there are no classpath dependencies
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(webComp);
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+
+    	// add the dependency attribute to "bin" and the cp container    	
+    	for (Object o: entries) {
+    		UpdateClasspathAttributeUtil.addDependencyAttribute(null, web.getName(), (IClasspathEntry) o);
+    	}
+    	// should no longer have potential entries
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(webJava);
+    	// verify that "bin" and the cp container have the attribute
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(webJava, entryPaths);
+    	// verify that "bin" and the cp container are dependencies
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	if (verifyClasspathDependencies)
+    		ClasspathDependencyTestUtil.verifyClasspathDependencies(webComp, archiveNames);
+    }
+    
 }
