[224185] Binary Java EE 5 IArchive support
diff --git a/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ZipFileArchiveLoadAdapterImpl.java b/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ZipFileArchiveLoadAdapterImpl.java
index 7aba15f..584f865 100644
--- a/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ZipFileArchiveLoadAdapterImpl.java
+++ b/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ZipFileArchiveLoadAdapterImpl.java
@@ -121,6 +121,4 @@
 		throw new ArchiveModelLoadException("Simple Zip Archives have no model objects."); //$NON-NLS-1$
 	}
 
-
-
 }
diff --git a/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java b/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java
index e3e7d15..4405525 100644
--- a/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java
+++ b/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java
@@ -24,14 +24,15 @@
 import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
 import org.eclipse.jst.j2ee.internal.J2EEConstants;
 import org.eclipse.jst.j2ee.internal.common.XMLResource;
-import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper;
-import org.eclipse.jst.j2ee.internal.componentcore.JCABinaryComponentHelper;
+import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper;
 import org.eclipse.jst.j2ee.internal.jca.archive.operations.ConnectorComponentLoadStrategyImpl;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
 import org.eclipse.jst.j2ee.jca.Connector;
 import org.eclipse.jst.j2ee.jca.ConnectorResource;
 import org.eclipse.jst.j2ee.jca.JcaFactory;
 import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.jee.archive.ArchiveOptions;
+import org.eclipse.jst.jee.archive.IArchive;
 import org.eclipse.wst.common.componentcore.ArtifactEdit;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.ModuleCoreNature;
@@ -75,7 +76,7 @@
 	}
 
 	protected BinaryComponentHelper initBinaryComponentHelper(IVirtualComponent binaryModule) {
-		return new JCABinaryComponentHelper(binaryModule);
+		return new JavaEEBinaryComponentHelper(binaryModule);
 	}
 
 	/**
@@ -388,7 +389,15 @@
 
 	public Archive asArchive(boolean includeSource, boolean includeClasspathComponents) throws OpenFailureException {
 		if (isBinary()) {
-			return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).accessArchive();
+			JavaEEBinaryComponentHelper helper = (JavaEEBinaryComponentHelper)getBinaryComponentHelper();
+			IArchive iArchive = null;
+			try{
+				iArchive = helper.accessArchive();
+				IPath path = (IPath)iArchive.getArchiveOptions().getOption(ArchiveOptions.ARCHIVE_PATH);
+				return CommonarchiveFactory.eINSTANCE.openRARFile(path.toOSString());
+			} finally {
+				helper.releaseArchive(iArchive);
+			}
 		} else {
 			ConnectorComponentLoadStrategyImpl loader = new ConnectorComponentLoadStrategyImpl(getComponent(), includeClasspathComponents);
 			loader.setExportSource(includeSource);
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/provider/ModulesItemProvider.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/provider/ModulesItemProvider.java
index 25ce696..038cf30 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/provider/ModulesItemProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/provider/ModulesItemProvider.java
@@ -20,13 +20,9 @@
 import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
 import org.eclipse.jst.j2ee.application.Application;
 import org.eclipse.jst.j2ee.application.Module;
-import org.eclipse.jst.j2ee.applicationclient.componentcore.util.AppClientArtifactEdit;
-import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
-import org.eclipse.jst.j2ee.jca.modulecore.util.ConnectorArtifactEdit;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
 import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
@@ -260,41 +256,17 @@
 				IVirtualComponent component = refs[j].getReferencedComponent();
 				if (component.isBinary()) {
 					if (refs[j].getArchiveName().equals(moduleURI)) {
-						ArtifactEdit edit = null;
+						foundBinary = true;
+						JavaEEBinaryComponentHelper helper = null;
 						try {
-							foundBinary = true;
-							Object binaryModule = null;
-							if (module.isWebModule()) {
-								WebArtifactEdit webEdit = WebArtifactEdit.getWebArtifactEditForRead(component);
-								if (webEdit != null) {
-									edit = webEdit;
-									binaryModule = webEdit.getWebApp();
-								}
-							} else if (module.isJavaModule()) {
-								AppClientArtifactEdit appClientEdit = AppClientArtifactEdit.getAppClientArtifactEditForRead(component);
-								if (appClientEdit != null) {
-									edit = appClientEdit;
-									binaryModule = appClientEdit.getApplicationClient();
-								}
-							} else if (module.isEjbModule()) {
-								EJBArtifactEdit ejbEdit = EJBArtifactEdit.getEJBArtifactEditForRead(component);
-								if (ejbEdit != null) {
-									edit = ejbEdit;
-									binaryModule = ejbEdit.getEJBJar();
-								}
-							} else if (module.isConnectorModule()) {
-								ConnectorArtifactEdit connectorEdit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(component);
-								if (connectorEdit != null) {
-									edit = connectorEdit;
-									binaryModule = connectorEdit.getConnector();
-								}
-							}
+							helper = new JavaEEBinaryComponentHelper(component);
+							Object binaryModule = helper.getPrimaryRootObject();
 							if (binaryModule != null) {
 								binaryModules.add(binaryModule);
 							}
 						} finally {
-							if (null != edit) {
-								edit.dispose();
+							if(helper != null){
+								helper.dispose();
 							}
 						}
 					}
diff --git a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java
index cfa1d75..db23587 100644
--- a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java
+++ b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java
@@ -31,8 +31,7 @@
 import org.eclipse.jst.j2ee.internal.J2EEConstants;
 import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
 import org.eclipse.jst.j2ee.internal.common.XMLResource;
-import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper;
-import org.eclipse.jst.j2ee.internal.componentcore.WebBinaryComponentHelper;
+import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
 import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentLoadStrategyImpl;
 import org.eclipse.jst.j2ee.model.IModelProvider;
@@ -41,6 +40,8 @@
 import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
 import org.eclipse.jst.j2ee.webapplication.WelcomeFile;
 import org.eclipse.jst.j2ee.webapplication.WelcomeFileList;
+import org.eclipse.jst.jee.archive.ArchiveOptions;
+import org.eclipse.jst.jee.archive.IArchive;
 import org.eclipse.wst.common.componentcore.ArtifactEdit;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.ModuleCoreNature;
@@ -96,7 +97,7 @@
 	}
 
 	protected BinaryComponentHelper initBinaryComponentHelper(IVirtualComponent binaryModule) {
-		return new WebBinaryComponentHelper(binaryModule);
+		return new JavaEEBinaryComponentHelper(binaryModule);
 	}
 
 	/**
@@ -649,7 +650,15 @@
 	public Archive asArchive(boolean includeSource, boolean includeClasspathComponents) throws OpenFailureException {
 		verifyOperationSupported();
 		if (isBinary()) {
-			return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).accessArchive();
+			JavaEEBinaryComponentHelper helper = (JavaEEBinaryComponentHelper)getBinaryComponentHelper();
+			IArchive iArchive = null;
+			try{
+				iArchive = helper.accessArchive();
+				IPath path = (IPath)iArchive.getArchiveOptions().getOption(ArchiveOptions.ARCHIVE_PATH);
+				return CommonarchiveFactory.eINSTANCE.openWARFile(path.toOSString());
+			} finally {
+				helper.releaseArchive(iArchive);
+			}
 		} else {
 			WebComponentLoadStrategyImpl loader = new WebComponentLoadStrategyImpl(getComponent(), includeClasspathComponents);
 			loader.setExportSource(includeSource);
diff --git a/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java b/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java
index 88b8d92..9450445 100644
--- a/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java
+++ b/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java
@@ -32,10 +32,11 @@
 import org.eclipse.jst.j2ee.internal.J2EEConstants;
 import org.eclipse.jst.j2ee.internal.archive.operations.AppClientComponentLoadStrategyImpl;
 import org.eclipse.jst.j2ee.internal.common.XMLResource;
-import org.eclipse.jst.j2ee.internal.componentcore.AppClientBinaryComponentHelper;
-import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper;
+import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
 import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.jee.archive.ArchiveOptions;
+import org.eclipse.jst.jee.archive.IArchive;
 import org.eclipse.wst.common.componentcore.ArtifactEdit;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.ModuleCoreNature;
@@ -71,7 +72,7 @@
 	}
 	
 	protected BinaryComponentHelper initBinaryComponentHelper(IVirtualComponent binaryModule) {
-		return new AppClientBinaryComponentHelper(binaryModule);
+		return new JavaEEBinaryComponentHelper(binaryModule);
 	}
 	
 	
@@ -386,7 +387,15 @@
 
 	public Archive asArchive(boolean includeSource, boolean includeClasspathComponents) throws OpenFailureException{
 		if (isBinary()) {
-			return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).accessArchive();
+			JavaEEBinaryComponentHelper helper = (JavaEEBinaryComponentHelper)getBinaryComponentHelper();
+			IArchive iArchive = null;
+			try{
+				iArchive = helper.accessArchive();
+				IPath path = (IPath)iArchive.getArchiveOptions().getOption(ArchiveOptions.ARCHIVE_PATH);
+				return CommonarchiveFactory.eINSTANCE.openApplicationClientFile(path.toOSString());
+			} finally {
+				helper.releaseArchive(iArchive);
+			}
 		} else {
 			AppClientComponentLoadStrategyImpl loader = new AppClientComponentLoadStrategyImpl(getComponent());
 			loader.setExportSource(includeSource);
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEArchiveUtilities.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEArchiveUtilities.java
index 8fe9d88..5dfebad 100644
--- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEArchiveUtilities.java
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEArchiveUtilities.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.jst.j2ee.internal.archive;
 
-import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
@@ -31,6 +30,7 @@
 import org.eclipse.jdt.core.util.IRuntimeVisibleAnnotationsAttribute;
 import org.eclipse.jst.j2ee.internal.J2EEConstants;
 import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentLoadAdapter;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
 import org.eclipse.jst.jee.archive.ArchiveModelLoadException;
 import org.eclipse.jst.jee.archive.ArchiveOpenFailureException;
@@ -74,6 +74,13 @@
 	 */
 	public static final String DISCRIMINATE_EJB_ANNOTATIONS = "DISCRIMINATE_EJB_ANNOTATIONS"; //$NON-NLS-1$
 
+	/**
+	 * Default value = null
+	 * 
+	 * An ArchiveOption used to specify the original load adapter in the case it
+	 * swapped out with an {@link #JavaEEWrappingLoadAdapter}.
+	 */
+	public static final String WRAPPED_LOAD_ADAPTER = "WRAPPED_LOAD_ADAPTER"; //$NON-NLS-1$
 
 	private JavaEEArchiveUtilities() {
 	}
@@ -105,14 +112,11 @@
 	public IArchive openArchive(IVirtualComponent virtualComponent) throws ArchiveOpenFailureException {
 		if (virtualComponent.isBinary()) {
 			VirtualArchiveComponent archiveComponent = (VirtualArchiveComponent) virtualComponent;
-			java.io.File diskFile = null;
-			diskFile = archiveComponent.getUnderlyingDiskFile();
-			if (!diskFile.exists()) {
-				IFile wbFile = archiveComponent.getUnderlyingWorkbenchFile();
-				diskFile = new File(wbFile.getLocation().toOSString());
-			}
-			IPath path = new Path(diskFile.getAbsolutePath());
-			return openArchive(path);
+			JavaEEBinaryComponentLoadAdapter loadAdapter = new JavaEEBinaryComponentLoadAdapter(archiveComponent);
+			ArchiveOptions archiveOptions = new ArchiveOptions();
+			archiveOptions.setOption(ArchiveOptions.LOAD_ADAPTER, loadAdapter);
+			archiveOptions.setOption(ArchiveOptions.ARCHIVE_PATH, loadAdapter.getArchivePath());
+			return openArchive(archiveOptions);
 		}
 		int type = J2EEVersionConstants.UNKNOWN;
 		IArchiveLoadAdapter archiveLoadAdapter = null;
@@ -197,8 +201,8 @@
 	private Map<IArchive, JavaEEQuickPeek> archiveToJavaEEQuickPeek = new WeakHashMap<IArchive, JavaEEQuickPeek>();
 
 	/**
-	 * Returns a utility for getting the type of Java EE archive, the Java EE version, and the
-	 * Module version
+	 * Returns a utility for getting the type of Java EE archive, the Java EE
+	 * version, and the Module version
 	 * 
 	 * @param archive
 	 * @return
@@ -261,18 +265,18 @@
 	public IArchive openArchive(ArchiveOptions archiveOptions) throws ArchiveOpenFailureException {
 		IArchive simpleArchive = super.openArchive(archiveOptions);
 		Object discriminateJavaEE = archiveOptions.getOption(DISCRIMINATE_JAVA_EE);
-		if(discriminateJavaEE != null && !((Boolean)discriminateJavaEE).booleanValue()){
+		if (discriminateJavaEE != null && !((Boolean) discriminateJavaEE).booleanValue()) {
 			return simpleArchive;
 		}
 		return refineForJavaEE(simpleArchive);
 	}
 
 	private static final String DOT_EAR = ".ear";//$NON-NLS-1$
-	
+
 	private static final String DOT_WAR = ".war";//$NON-NLS-1$
-	
+
 	private static final String DOT_JAR = ".jar";//$NON-NLS-1$
-	
+
 	private IArchive refineForJavaEE(final IArchive simpleArchive) {
 		String[] deploymentDescriptorsToCheck = new String[] { J2EEConstants.APPLICATION_DD_URI, J2EEConstants.APP_CLIENT_DD_URI, J2EEConstants.EJBJAR_DD_URI, J2EEConstants.WEBAPP_DD_URI,
 				J2EEConstants.RAR_DD_URI };
@@ -308,36 +312,36 @@
 			}
 		}
 		IPath archivePath = simpleArchive.getPath();
-		if(archivePath == null){
+		if (archivePath == null) {
 			Object obj = simpleArchive.getArchiveOptions().getOption(ArchiveOptions.ARCHIVE_PATH);
-			if(null != obj){
-				archivePath = (IPath)obj;
+			if (null != obj) {
+				archivePath = (IPath) obj;
 			}
 		}
-		
-		if(archivePath != null){
+
+		if (archivePath != null) {
 			String lastSegment = archivePath.lastSegment().toLowerCase();
-			if(lastSegment.endsWith(DOT_EAR)){
+			if (lastSegment.endsWith(DOT_EAR)) {
 				JavaEEQuickPeek quickPeek = new JavaEEQuickPeek(JavaEEQuickPeek.APPLICATION_TYPE, JavaEEQuickPeek.JEE_5_0_ID, JavaEEQuickPeek.JEE_5_0_ID);
 				archiveToJavaEEQuickPeek.put(simpleArchive, quickPeek);
 				wrapArchive(simpleArchive, new Path(J2EEConstants.APPLICATION_DD_URI));
 				return simpleArchive;
-			} else if(lastSegment.endsWith(DOT_WAR)){
+			} else if (lastSegment.endsWith(DOT_WAR)) {
 				JavaEEQuickPeek quickPeek = new JavaEEQuickPeek(JavaEEQuickPeek.WEB_TYPE, JavaEEQuickPeek.WEB_2_5_ID, JavaEEQuickPeek.JEE_5_0_ID);
 				archiveToJavaEEQuickPeek.put(simpleArchive, quickPeek);
 				wrapArchive(simpleArchive, new Path(J2EEConstants.WEBAPP_DD_URI));
 				return simpleArchive;
-			} else if(lastSegment.endsWith(DOT_JAR)){
+			} else if (lastSegment.endsWith(DOT_JAR)) {
 				IPath manifestPath = new Path(J2EEConstants.MANIFEST_URI);
-				if(simpleArchive.containsArchiveResource(manifestPath)){
+				if (simpleArchive.containsArchiveResource(manifestPath)) {
 					InputStream in = null;
-					try{
+					try {
 						IArchiveResource manifestResource = simpleArchive.getArchiveResource(manifestPath);
 						in = manifestResource.getInputStream();
 						Manifest manifest = new Manifest(in);
 						Attributes attributes = manifest.getMainAttributes();
 						String mainClassName = attributes.getValue("Main-Class");
-						if(mainClassName != null){
+						if (mainClassName != null) {
 							JavaEEQuickPeek quickPeek = new JavaEEQuickPeek(JavaEEQuickPeek.APPLICATION_CLIENT_TYPE, JavaEEQuickPeek.JEE_5_0_ID, JavaEEQuickPeek.JEE_5_0_ID);
 							archiveToJavaEEQuickPeek.put(simpleArchive, quickPeek);
 							wrapArchive(simpleArchive, new Path(J2EEConstants.APPLICATION_DD_URI));
@@ -358,83 +362,100 @@
 					}
 				}
 				Object discriminateEJB30 = simpleArchive.getArchiveOptions().getOption(DISCRIMINATE_EJB_ANNOTATIONS);
-				if(null == discriminateEJB30 || ((Boolean)discriminateEJB30).booleanValue()){
-					if(isEJBArchive(simpleArchive)){
+				if (null == discriminateEJB30 || ((Boolean) discriminateEJB30).booleanValue()) {
+					if (isEJBArchive(simpleArchive)) {
 						JavaEEQuickPeek quickPeek = new JavaEEQuickPeek(JavaEEQuickPeek.EJB_TYPE, JavaEEQuickPeek.EJB_3_0_ID, JavaEEQuickPeek.JEE_5_0_ID);
 						archiveToJavaEEQuickPeek.put(simpleArchive, quickPeek);
 						wrapArchive(simpleArchive, new Path(J2EEConstants.EJBJAR_DD_URI));
 						return simpleArchive;
 					}
 				}
-				
+
 			}
 		}
-		
+
 		return simpleArchive;
 	}
 
+	public static class JavaEEWrappingLoadAdapter implements IArchiveLoadAdapter {
+
+		private IArchive simpleArchive;
+		private IArchiveLoadAdapter simpleLoadAdapter;
+		private IPath deploymentDescriptorPath;
+		private JavaEEEMFArchiveAdapterHelper emfHelper;
+
+		public JavaEEWrappingLoadAdapter(IArchive simpleArchive, IPath deploymentDescriptorPath) {
+			this.simpleArchive = simpleArchive;
+			this.simpleLoadAdapter = this.simpleArchive.getLoadAdapter();
+			this.deploymentDescriptorPath = deploymentDescriptorPath;
+			this.emfHelper = new JavaEEEMFArchiveAdapterHelper(this.simpleArchive);
+		}
+
+		public void close() {
+			simpleLoadAdapter.close();
+		}
+
+		public boolean containsArchiveResource(IPath resourcePath) {
+			return simpleLoadAdapter.containsArchiveResource(resourcePath);
+		}
+
+		public boolean containsModelObject(IPath modelObjectPath) {
+			if (simpleLoadAdapter.containsArchiveResource(modelObjectPath)) {
+				return true;
+			}
+			if (IArchive.EMPTY_MODEL_PATH == modelObjectPath) {
+				modelObjectPath = deploymentDescriptorPath;
+			}
+			return emfHelper.containsModelObject(modelObjectPath);
+		}
+
+		public IArchiveResource getArchiveResource(IPath resourcePath) throws FileNotFoundException {
+			return simpleLoadAdapter.getArchiveResource(resourcePath);
+		}
+
+		public List<IArchiveResource> getArchiveResources() {
+			return simpleLoadAdapter.getArchiveResources();
+		}
+
+		public InputStream getInputStream(IArchiveResource archiveResource) throws IOException, FileNotFoundException {
+			return simpleLoadAdapter.getInputStream(archiveResource);
+		}
+
+		public Object getModelObject(IPath modelObjectPath) throws ArchiveModelLoadException {
+			if (simpleLoadAdapter.containsModelObject(modelObjectPath)) {
+				return simpleLoadAdapter.getModelObject(modelObjectPath);
+			}
+			if (IArchive.EMPTY_MODEL_PATH == modelObjectPath) {
+				modelObjectPath = deploymentDescriptorPath;
+			}
+			return emfHelper.getModelObject(modelObjectPath);
+		}
+
+		public IArchive getArchive() {
+			return simpleLoadAdapter.getArchive();
+		}
+
+		public void setArchive(IArchive archive) {
+			simpleLoadAdapter.setArchive(archive);
+		}
+
+		public IArchiveLoadAdapter getWrappedLoadAdatper() {
+			return simpleLoadAdapter;
+		}
+
+		public String toString() {
+			StringBuffer buffer = new StringBuffer(JavaEEArchiveUtilities.class.getName());
+			buffer.append(" wrapping: ");
+			buffer.append(simpleLoadAdapter.toString());
+			return buffer.toString();
+		}
+
+	};
+
 	private static void wrapArchive(final IArchive simpleArchive, final IPath deploymentDescriptorPath) {
-		final IArchiveLoadAdapter simpleLoadAdapter = simpleArchive.getLoadAdapter();
-
-		IArchiveLoadAdapter wrappingEMFLoadAdapter = new IArchiveLoadAdapter() {
-			private JavaEEEMFArchiveAdapterHelper emfHelper = new JavaEEEMFArchiveAdapterHelper(simpleArchive);
-
-			public void close() {
-				simpleLoadAdapter.close();
-			}
-
-			public boolean containsArchiveResource(IPath resourcePath) {
-				return simpleLoadAdapter.containsArchiveResource(resourcePath);
-			}
-
-			public boolean containsModelObject(IPath modelObjectPath) {
-				if (simpleLoadAdapter.containsArchiveResource(modelObjectPath)) {
-					return true;
-				}
-				if (IArchive.EMPTY_MODEL_PATH == modelObjectPath) {
-					modelObjectPath = deploymentDescriptorPath;
-				}
-				return emfHelper.containsModelObject(modelObjectPath);
-			}
-
-			public IArchiveResource getArchiveResource(IPath resourcePath) throws FileNotFoundException {
-				return simpleLoadAdapter.getArchiveResource(resourcePath);
-			}
-
-			public List<IArchiveResource> getArchiveResources() {
-				return simpleLoadAdapter.getArchiveResources();
-			}
-
-			public InputStream getInputStream(IArchiveResource archiveResource) throws IOException, FileNotFoundException {
-				return simpleLoadAdapter.getInputStream(archiveResource);
-			}
-
-			public Object getModelObject(IPath modelObjectPath) throws ArchiveModelLoadException {
-				if (simpleLoadAdapter.containsModelObject(modelObjectPath)) {
-					return simpleLoadAdapter.getModelObject(modelObjectPath);
-				}
-				if (IArchive.EMPTY_MODEL_PATH == modelObjectPath) {
-					modelObjectPath = deploymentDescriptorPath;
-				}
-				return emfHelper.getModelObject(modelObjectPath);
-			}
-
-			public IArchive getArchive() {
-				return simpleLoadAdapter.getArchive();
-			}
-
-			public void setArchive(IArchive archive) {
-				simpleLoadAdapter.setArchive(archive);
-			}
-
-			public String toString() {
-				StringBuffer buffer = new StringBuffer(JavaEEArchiveUtilities.class.getName());
-				buffer.append(" wrapping: ");
-				buffer.append(simpleLoadAdapter.toString());
-				return buffer.toString();
-			}
-		};
+		IArchiveLoadAdapter wrappingEMFLoadAdapter = new JavaEEWrappingLoadAdapter(simpleArchive, deploymentDescriptorPath);
 		simpleArchive.getArchiveOptions().setOption(ArchiveOptions.LOAD_ADAPTER, wrappingEMFLoadAdapter);
+		simpleArchive.getArchiveOptions().setOption(WRAPPED_LOAD_ADAPTER, simpleArchive.getLoadAdapter());
 		((ArchiveImpl) simpleArchive).setLoadAdapter(wrappingEMFLoadAdapter);
 	}
 
@@ -445,7 +466,7 @@
 	private static final char[] STATEFUL = "Ljavax/ejb/Stateful;".toCharArray();//$NON-NLS-1$
 
 	private static final char[] MESSAGEDRIVEN = "Ljavax/ejb/MessageDriven;".toCharArray();//$NON-NLS-1$
-	
+
 	public boolean isEJBArchive(IArchive archive) {
 		// first check for the deployment descriptor
 		if (archiveToJavaEEQuickPeek.containsKey(archive)) {
@@ -453,7 +474,7 @@
 			if (qp.getType() == JavaEEQuickPeek.EJB_TYPE) {
 				return true;
 			}
-		} 
+		}
 
 		List<IArchiveResource> archiveResources = archive.getArchiveResources();
 		for (IArchiveResource archiveResource : archiveResources) {
@@ -496,4 +517,30 @@
 		}
 		return false;
 	}
+
+	public Manifest getManifest(IArchive archive) {
+		Manifest manifest = null;
+		IPath manifestPath = new Path(J2EEConstants.MANIFEST_URI);
+		if (archive.containsArchiveResource(manifestPath)) {
+			InputStream in = null;
+			try {
+				IArchiveResource manifestResource = archive.getArchiveResource(manifestPath);
+				in = manifestResource.getInputStream();
+				manifest = new Manifest(in);
+			} catch (FileNotFoundException e) {
+				ArchiveUtil.warn(e);
+			} catch (IOException e) {
+				ArchiveUtil.warn(e);
+			} finally {
+				if (in != null) {
+					try {
+						in.close();
+					} catch (IOException e) {
+						ArchiveUtil.warn(e);
+					}
+				}
+			}
+		}
+		return manifest;
+	}
 }
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFArchiveAdapterHelper.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFArchiveAdapterHelper.java
index 97b08ef..c97c58c 100644
--- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFArchiveAdapterHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFArchiveAdapterHelper.java
@@ -97,9 +97,14 @@
 		return archiveURIConverter;
 	}
 
+	public Resource getResource(IPath resourcePath) throws ArchiveModelLoadException {
+		URI uri = getArchiveURIConverter().getURI(resourcePath);
+		Resource resource = getResourceSet().getResource(uri, true);
+		return resource;
+	}
+	
 	public Object getModelObject(IPath modelObjectPath) throws ArchiveModelLoadException {
-		URI uri = getArchiveURIConverter().getURI(modelObjectPath);
-		IRootObjectResource resource = (IRootObjectResource) getResourceSet().getResource(uri, true);
+		IRootObjectResource resource = (IRootObjectResource) getResource(modelObjectPath);
 		return resource.getRootObject();
 	}
 
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFZipFileLoadAdapterImpl.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFZipFileLoadAdapterImpl.java
index d406b5d..36aa520 100644
--- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFZipFileLoadAdapterImpl.java
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFZipFileLoadAdapterImpl.java
@@ -13,6 +13,8 @@
 import java.util.zip.ZipFile;
 
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
 import org.eclipse.jst.jee.archive.ArchiveModelLoadException;
 import org.eclipse.jst.jee.archive.IArchive;
 import org.eclipse.jst.jee.archive.internal.ZipFileArchiveLoadAdapterImpl;
@@ -34,6 +36,10 @@
 		emfHelper.setArchive(archive);
 	}
 
+	public Resource getResource(IPath resourcePath) throws ArchiveModelLoadException {
+		return emfHelper.getResource(resourcePath);
+	}
+	
 	public boolean containsModelObject(IPath modelObjectPath) {
 		return emfHelper.containsModelObject(modelObjectPath);
 	}
@@ -41,4 +47,14 @@
 	public Object getModelObject(IPath modelObjectPath) throws ArchiveModelLoadException {
 		return emfHelper.getModelObject(modelObjectPath);
 	}
+	
+	@Override
+	public void close() {
+		super.close();
+		WorkbenchResourceHelperBase.removeAndUnloadAll(emfHelper.getResourceSet().getResources(), emfHelper.getResourceSet());
+	}
+	
+	protected JavaEEEMFArchiveAdapterHelper getEMFHelper() {
+		return emfHelper;
+	}
 }
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java
index a498ad7..02ccd31 100644
--- a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java
@@ -47,7 +47,7 @@
 import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualComponent;
 import org.eclipse.jst.j2ee.componentcore.util.EARVirtualComponent;
 import org.eclipse.jst.j2ee.internal.J2EEConstants;
-import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper;
+import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper;
 import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
@@ -269,7 +269,7 @@
 						}
 					}
 					if(null != earComponent){
-						EnterpriseBinaryComponentHelper.ArchiveCache.getInstance().clearDisconnectedArchivesInEAR(earComponent);	
+						JavaEEBinaryComponentHelper.clearDisconnectedArchivesInEAR(earComponent);	
 					}
 				}
 			}
@@ -393,7 +393,7 @@
 							}
 							forgetProject((IProject)resource);
 						}
-						EnterpriseBinaryComponentHelper.ArchiveCache.getInstance().clearAllArchivesInProject((IProject)resource);
+						JavaEEBinaryComponentHelper.clearAllArchivesInProject((IProject)resource);
 					}
 					break;
 				case IResourceChangeEvent.POST_CHANGE:
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualArchiveComponent.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualArchiveComponent.java
index 95a43c0..9d348e8 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualArchiveComponent.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualArchiveComponent.java
@@ -14,9 +14,8 @@
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest;
-import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
 import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
@@ -41,27 +40,8 @@
 
 	public String[] getManifestClasspath() {
 		if (null == manifestClasspath) {
-			Archive archive = EnterpriseBinaryComponentHelper.ArchiveCache.getInstance().getArchive(this);
-			if (null == archive) {
-				EnterpriseBinaryComponentHelper helper = EnterpriseBinaryComponentHelper.getHelper(this);
-				try {
-					archive = helper.accessArchive();
-					ArchiveManifest manifest = archive.getManifest();
-					manifestClasspath = manifest.getClassPathTokenized();
-				} catch (Exception e) {
-				} finally {
-					if (null != archive) {
-						archive.close();
-					}
-					if (null != helper) {
-						helper.dispose();
-					}
-				}
-			} else {
-				ArchiveManifest manifest = archive.getManifest();
-				manifestClasspath = manifest.getClassPathTokenized();
-			}
-
+			ArchiveManifest manifest = J2EEProjectUtilities.readManifest(this);
+			manifestClasspath = manifest.getClassPathTokenized();
 			if (manifestClasspath == null) {
 				manifestClasspath = new String[0];
 			}
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java
index fb8134c..257e486 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java
@@ -22,6 +22,11 @@
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 
+/**
+ * @deprecated see {@link JavaEEBinaryComponentHelper}
+ * @author jasholl
+ *
+ */
 public class AppClientBinaryComponentHelper extends EnterpriseBinaryComponentHelper {
 
 	public static boolean handlesComponent(IVirtualComponent component) {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/ComponentArchiveOptions.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/ComponentArchiveOptions.java
index efa0a2a..5b0e06a 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/ComponentArchiveOptions.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/ComponentArchiveOptions.java
@@ -13,6 +13,11 @@
 import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 
+/**
+ * @deprecated see {@link JavaEEBinaryComponentHelper}
+ * @author jasholl
+ *
+ */
 public class ComponentArchiveOptions extends ArchiveOptions {
 
 	private IVirtualComponent component;
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java
index 2a4885f..3a34a35 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java
@@ -22,6 +22,11 @@
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 
+/**
+ * @deprecated see {@link JavaEEBinaryComponentHelper}
+ * @author jasholl
+ *
+ */
 public class EJBBinaryComponentHelper extends EnterpriseBinaryComponentHelper {
 
 	public static boolean handlesComponent(IVirtualComponent component) {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java
index ca1a98b..9a07a24 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java
@@ -36,12 +36,16 @@
 import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.ZipFileLoadStrategyImpl;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
 import org.eclipse.wst.common.componentcore.internal.BinaryComponentHelper;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
 
+/**
+ * @deprecated see {@link JavaEEBinaryComponentHelper}
+ * @author jasholl
+ *
+ */
 public abstract class EnterpriseBinaryComponentHelper extends BinaryComponentHelper {
 
 	public static EnterpriseBinaryComponentHelper getHelper(IVirtualComponent aComponent){
@@ -166,7 +170,7 @@
 		return resource;
 	}
 
-	public void releaseAccess(ArtifactEdit edit) {
+	public void releaseAccess() {
 		dispose();
 	}
 
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java
index 2fa77d9..4fdfdf0 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java
@@ -22,6 +22,11 @@
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.RarImportStrategyImpl;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 
+/**
+ * @deprecated see {@link JavaEEBinaryComponentHelper}
+ * @author jasholl
+ *
+ */
 public class JCABinaryComponentHelper extends EnterpriseBinaryComponentHelper {
 
 	public static boolean handlesComponent(IVirtualComponent component) {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentHelper.java
new file mode 100644
index 0000000..7895f0a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentHelper.java
@@ -0,0 +1,292 @@
+package org.eclipse.jst.j2ee.internal.componentcore;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.ZipException;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.jee.archive.ArchiveModelLoadException;
+import org.eclipse.jst.jee.archive.ArchiveOpenFailureException;
+import org.eclipse.jst.jee.archive.ArchiveOptions;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveFactory;
+import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
+import org.eclipse.wst.common.componentcore.internal.BinaryComponentHelper;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+public class JavaEEBinaryComponentHelper extends BinaryComponentHelper {
+
+	private IArchive archive;
+
+	private int localArchiveAccessCount = 0;
+
+	public static JavaEEQuickPeek getJavaEEQuickPeek(IVirtualComponent aBinaryComponent) {
+		JavaEEBinaryComponentHelper helper = null;
+		try {
+			helper = new JavaEEBinaryComponentHelper(aBinaryComponent);
+			IArchive archive = helper.getArchive();
+			JavaEEQuickPeek qp = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(archive);
+			return qp;
+		} finally {
+			if (helper != null) {
+				helper.dispose();
+			}
+		}
+	}
+
+	public JavaEEBinaryComponentHelper(IVirtualComponent aBinaryComponent) {
+		super(aBinaryComponent);
+	}
+
+	@Override
+	public EObject getPrimaryRootObject() {
+		JavaEEQuickPeek qp = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(getArchive());
+		IPath ddPath = null;
+		switch (qp.getType()) {
+		case JavaEEQuickPeek.APPLICATION_CLIENT_TYPE:
+			ddPath = new Path(J2EEConstants.APP_CLIENT_DD_URI);
+			break;
+		case JavaEEQuickPeek.EJB_TYPE:
+			ddPath = new Path(J2EEConstants.EJBJAR_DD_URI);
+			break;
+		case JavaEEQuickPeek.WEB_TYPE:
+			ddPath = new Path(J2EEConstants.WEBAPP_DD_URI);
+			break;
+		case JavaEEQuickPeek.CONNECTOR_TYPE:
+			ddPath = new Path(J2EEConstants.RAR_DD_URI);
+			break;
+		}
+		if (ddPath != null) {
+			try {
+				return (EObject) getArchive().getModelObject(ddPath);
+			} catch (ArchiveModelLoadException e) {
+				J2EEPlugin.logError(e);
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public Resource getResource(URI uri) {
+		IPath path = new Path(uri.toString());
+		try {
+			return (Resource) ((JavaEEBinaryComponentLoadAdapter) getArchive().getLoadAdapter()).getModelObject(path);
+		} catch (ArchiveModelLoadException e) {
+			J2EEPlugin.logError(e);
+		}
+		return null;
+	}
+
+	public IArchive accessArchive() {
+		IArchive archive = getArchive();
+		if (null != archive) {
+			ArchiveCache cache = ArchiveCache.getInstance();
+			cache.accessArchive(archive);
+			synchronized (this) {
+				localArchiveAccessCount++;
+			}
+		}
+		return archive;
+	}
+
+	public void releaseArchive(IArchive archive) {
+		if (archive != this.archive) {
+			throw new RuntimeException("The IArchive parameter must be the same IArchive retrieved from accessArchive");
+		}
+		if (null != archive) {
+			ArchiveCache cache = ArchiveCache.getInstance();
+			cache.releaseArchive(archive);
+			synchronized (this) {
+				localArchiveAccessCount--;
+			}
+		}
+	}
+
+	@Override
+	public void dispose() {
+		super.dispose();
+		int count = 0;
+		synchronized (this) {
+			count = localArchiveAccessCount;
+		}
+		if (count > 0 && archive != null) {
+			ArchiveCache cache = ArchiveCache.getInstance();
+			for (int i = 0; i < count; i++) {
+				cache.releaseArchive(archive);
+				synchronized (this) {
+					localArchiveAccessCount--;
+				}
+			}
+		}
+	}
+
+	protected IArchive getArchive() {
+		if (archive == null) {
+			archive = getUniqueArchive();
+		}
+		return archive;
+	}
+
+	protected IArchive getUniqueArchive() {
+		try {
+			return openArchive();
+		} catch (ArchiveOpenFailureException e) {
+			Logger.getLogger().logError(e);
+		}
+		return null;
+	}
+
+	protected IArchive openArchive() throws ArchiveOpenFailureException {
+		ArchiveCache cache = ArchiveCache.getInstance();
+		IArchive archive = cache.getArchive(getComponent());
+		if (archive == null) {
+			archive = cache.openArchive(this);
+		}
+		if (archive != null) {
+			cache.accessArchive(archive);
+			synchronized (this) {
+				localArchiveAccessCount++;
+			}
+		}
+		return archive;
+	}
+
+	public static void clearDisconnectedArchivesInEAR(IVirtualComponent earComponent) {
+		ArchiveCache.instance.clearDisconnectedArchivesInEAR(earComponent);
+	}
+
+	public static void clearAllArchivesInProject(IProject earProject) {
+		ArchiveCache.instance.clearAllArchivesInProject(earProject);
+	}
+
+	/**
+	 * This cache manages IArchives across all
+	 * {@link JavaEEBinaryComponentHelper} instances. If multiple
+	 * {@link JavaEEBinaryComponentHelper} instances exist for the same
+	 * underlying archive file (e.g. a jar file on disk) all will use the exact
+	 * same IArchive instance. Care needs to be taken in managing the opening
+	 * and closing of this IArchive which should only be done through internal
+	 * methods within {@link JavaEEBinaryComponentHelper}
+	 */
+	private static class ArchiveCache {
+
+		private static ArchiveCache instance = null;
+
+		public static ArchiveCache getInstance() {
+			if (instance == null) {
+				instance = new ArchiveCache();
+			}
+			return instance;
+		}
+
+		protected Map<IVirtualComponent, IArchive> componentsToArchives = new Hashtable<IVirtualComponent, IArchive>();
+
+		protected Map<IArchive, Integer> archiveAccessCount = new Hashtable<IArchive, Integer>();
+
+		public synchronized void accessArchive(IArchive archive) {
+			Integer count = archiveAccessCount.get(archive);
+			Integer newCount = new Integer(count.intValue() + 1);
+			archiveAccessCount.put(archive, newCount);
+			if (newCount.intValue() == 1) {
+				JavaEEBinaryComponentLoadAdapter binaryAdapter = null;
+				if (archive.getArchiveOptions().hasOption(JavaEEArchiveUtilities.WRAPPED_LOAD_ADAPTER)) {
+					binaryAdapter = (JavaEEBinaryComponentLoadAdapter) archive.getArchiveOptions().getOption(JavaEEArchiveUtilities.WRAPPED_LOAD_ADAPTER);
+				} else {
+					binaryAdapter = (JavaEEBinaryComponentLoadAdapter) archive.getArchiveOptions().getOption(ArchiveOptions.LOAD_ADAPTER);
+				}
+				if (!binaryAdapter.isPhysicallyOpen()) {
+					try {
+						binaryAdapter.physicallyOpen();
+					} catch (ZipException e) {
+						org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin.logError(e);
+					} catch (IOException e) {
+						org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin.logError(e);
+					}
+				}
+			}
+		}
+
+		public synchronized void releaseArchive(IArchive archive) {
+			Integer count = archiveAccessCount.get(archive);
+			Integer newCount = new Integer(count.intValue() - 1);
+			archiveAccessCount.put(archive, newCount);
+			if (newCount.intValue() == 0) {
+				JavaEEBinaryComponentLoadAdapter binaryAdapter = null;
+				if (archive.getArchiveOptions().hasOption(JavaEEArchiveUtilities.WRAPPED_LOAD_ADAPTER)) {
+					binaryAdapter = (JavaEEBinaryComponentLoadAdapter) archive.getArchiveOptions().getOption(JavaEEArchiveUtilities.WRAPPED_LOAD_ADAPTER);
+				} else {
+					binaryAdapter = (JavaEEBinaryComponentLoadAdapter) archive.getArchiveOptions().getOption(ArchiveOptions.LOAD_ADAPTER);
+				}
+				if (binaryAdapter.isPhysicallyOpen()) {
+					binaryAdapter.physicallyClose();
+				}
+			}
+		}
+
+		public synchronized IArchive getArchive(IVirtualComponent component) {
+			IArchive archive = componentsToArchives.get(component);
+			return archive;
+		}
+
+		public synchronized void clearDisconnectedArchivesInEAR(IVirtualComponent earComponent) {
+			if (componentsToArchives.isEmpty()) {
+				return;
+			}
+			Set<IVirtualComponent> liveBinaryComponnts = new HashSet<IVirtualComponent>();
+			IVirtualReference[] refs = earComponent.getReferences();
+			IVirtualComponent component = null;
+			for (int i = 0; i < refs.length; i++) {
+				component = refs[i].getReferencedComponent();
+				if (component.isBinary()) {
+					liveBinaryComponnts.add(component);
+				}
+			}
+			clearArchivesInProject(earComponent.getProject(), liveBinaryComponnts);
+		}
+
+		public synchronized void clearAllArchivesInProject(IProject earProject) {
+			if (componentsToArchives.isEmpty()) {
+				return;
+			}
+			clearArchivesInProject(earProject, null);
+		}
+
+		private void clearArchivesInProject(IProject earProject, Set excludeSet) {
+			Iterator iterator = componentsToArchives.entrySet().iterator();
+			IVirtualComponent component = null;
+			IArchive archive = null;
+			while (iterator.hasNext()) {
+				Map.Entry entry = (Map.Entry) iterator.next();
+				component = (IVirtualComponent) entry.getKey();
+				if (component.getProject().equals(earProject) && (excludeSet == null || !excludeSet.contains(component))) {
+					archive = (IArchive) entry.getValue();
+					IArchiveFactory.INSTANCE.closeArchive(archive);
+					iterator.remove();
+					archiveAccessCount.remove(archive);
+				}
+			}
+		}
+
+		public synchronized IArchive openArchive(JavaEEBinaryComponentHelper helper) throws ArchiveOpenFailureException {
+			IArchive archive = JavaEEArchiveUtilities.INSTANCE.openArchive(helper.getComponent());
+			componentsToArchives.put(helper.getComponent(), archive);
+			archiveAccessCount.put(archive, new Integer(0));
+			return archive;
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentLoadAdapter.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentLoadAdapter.java
new file mode 100644
index 0000000..34c4d5a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentLoadAdapter.java
@@ -0,0 +1,124 @@
+package org.eclipse.jst.j2ee.internal.componentcore;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEEMFZipFileLoadAdapterImpl;
+import org.eclipse.jst.jee.archive.ArchiveOpenFailureException;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
+
+public class JavaEEBinaryComponentLoadAdapter extends JavaEEEMFZipFileLoadAdapterImpl {
+
+	private java.io.File file = null;
+	private IPath archivePath;
+	private boolean physicallyOpen = true;
+	
+	public JavaEEBinaryComponentLoadAdapter(VirtualArchiveComponent archiveComponent) throws ArchiveOpenFailureException {
+		super();
+		java.io.File diskFile = null;
+		diskFile = archiveComponent.getUnderlyingDiskFile();
+		if (!diskFile.exists()) {
+			IFile wbFile = archiveComponent.getUnderlyingWorkbenchFile();
+			diskFile = new File(wbFile.getLocation().toOSString());
+		}
+		IPath archivePath = new Path(diskFile.getAbsolutePath());
+		file = new java.io.File(archivePath.toOSString());
+		ZipFile zipFile;
+		try {
+			zipFile = new ZipFile(file);
+		} catch (ZipException e) {
+			ArchiveOpenFailureException openFailureException = new ArchiveOpenFailureException(e);
+			throw openFailureException;
+		} catch (IOException e) {
+			ArchiveOpenFailureException openFailureException = new ArchiveOpenFailureException(e);
+			throw openFailureException;
+		}
+		setZipFile(zipFile);
+		setArchivePath(archivePath);
+	}
+	
+	private void setArchivePath(IPath archivePath) {
+		this.archivePath = archivePath;
+	}
+	
+	public IPath getArchivePath() {
+		return archivePath;
+	}
+	
+	public boolean isPhysicallyOpen(){
+		return physicallyOpen;
+	}
+	
+	public void physicallyOpen() throws ZipException, IOException{
+		if(!isPhysicallyOpen()){
+			physicallyOpen = true;
+			setZipFile(new ZipFile(file));
+			System.err.println("PhysicallyOpen");
+			Thread.dumpStack();
+		}
+	}
+	
+	public void physicallyClose(){
+		if(isPhysicallyOpen()){
+			physicallyOpen = false;
+			try{
+				zipFile.close();
+			}
+			catch (Throwable t) {
+				//Ignore
+			}
+			System.err.println("PhysicallyClose");
+			Thread.dumpStack();
+		} 
+	}
+	
+	public java.io.InputStream getInputStream(IArchiveResource aFile) throws IOException, FileNotFoundException {
+		final boolean isPhysciallyOpen = isPhysicallyOpen();
+		Exception caughtException = null;
+		try {
+			if (!isPhysciallyOpen) {
+				physicallyOpen();
+			}
+			IPath path = aFile.getPath();
+			String uri = path.toString();
+			ZipEntry entry = getZipFile().getEntry(uri);
+			if (entry == null)
+				throw new FileNotFoundException(uri);
+
+			return new java.io.BufferedInputStream(getZipFile().getInputStream(entry)) {
+				public void close() throws IOException {
+					super.close();
+					if (!isPhysciallyOpen ) {
+						physicallyClose();
+					}
+				}
+			};
+		} catch (FileNotFoundException e) {
+			caughtException = e;
+			throw e;
+		} catch (IllegalStateException zipClosed) {
+			caughtException = zipClosed;
+			throw new IOException(zipClosed.toString());
+		} catch (Exception e) {
+			caughtException = e;
+			throw new IOException(e.toString());
+		} finally {
+			if (caughtException != null) {
+				if (!isPhysciallyOpen) {
+					physicallyClose();
+				}
+			}
+		}
+	}
+
+	
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java
index c7e8cf0..a5ea3dd 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java
@@ -22,6 +22,11 @@
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 
+/**
+ * @deprecated see {@link JavaEEBinaryComponentHelper}
+ * @author jasholl
+ *
+ */
 public class UtilityBinaryComponentHelper extends EnterpriseBinaryComponentHelper {
 
 	public UtilityBinaryComponentHelper(IVirtualComponent component) {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java
index 7802d3b..a5b1296 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java
@@ -22,6 +22,11 @@
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.War22ImportStrategyImpl;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 
+/**
+ * @deprecated see {@link JavaEEBinaryComponentHelper}
+ * @author jasholl
+ *
+ */
 public class WebBinaryComponentHelper extends EnterpriseBinaryComponentHelper {
 
 	public static boolean handlesComponent(IVirtualComponent component) {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEProjectUtilities.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEProjectUtilities.java
index 6eccda9..051d71f 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEProjectUtilities.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEProjectUtilities.java
@@ -64,19 +64,24 @@
 import org.eclipse.jst.j2ee.internal.archive.operations.JavaComponentLoadStrategyImpl;
 import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
 import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
+import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper;
 import org.eclipse.jst.j2ee.internal.moduleextension.EarModuleManager;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.project.EarUtilities;
 import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
 import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
 import org.eclipse.jst.j2ee.project.facet.IJavaProjectMigrationDataModelProperties;
 import org.eclipse.jst.j2ee.project.facet.JavaProjectMigrationDataModelProvider;
 import org.eclipse.jst.j2ee.project.facet.JavaProjectMigrationOperation;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
 import org.eclipse.jst.server.core.FacetUtil;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
 import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
 import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
 import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
 import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
 import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
@@ -276,7 +281,74 @@
 			}
 		}
 	}
-
+	
+	public static ArchiveManifest readManifest(IVirtualComponent component) {
+		if (!component.isBinary()) {
+			IVirtualFile vManifest = component.getRootFolder().getFile(J2EEConstants.MANIFEST_URI);
+			if (vManifest.exists()) {
+				IFile manifestFile = vManifest.getUnderlyingFile();
+				InputStream in = null;
+				try {
+					in = manifestFile.getContents();
+					return new ArchiveManifestImpl(in);
+				} catch (IOException e) {
+					J2EEPlugin.logError(e);
+				} catch (CoreException e) {
+					J2EEPlugin.logError(e);
+				} finally {
+					if (in != null) {
+						try {
+							in.close();
+							in = null;
+						} catch (IOException e) {
+							J2EEPlugin.logError(e);
+						}
+					}
+				}
+			}
+		} else {
+			JavaEEBinaryComponentHelper helper = null;
+			try{
+				helper = new JavaEEBinaryComponentHelper(component);
+				if(helper != null){
+					IArchive archive = null;
+					InputStream in = null;
+					try{
+						archive = helper.accessArchive();
+						if(null != archive){
+							IArchiveResource manifestResource = archive.getArchiveResource(new Path(J2EEConstants.MANIFEST_URI));
+							if(manifestResource != null){
+								in = manifestResource.getInputStream();
+								ArchiveManifest manifest = new ArchiveManifestImpl(in);
+								return manifest;
+							}
+						}
+					} catch (FileNotFoundException e) {
+						J2EEPlugin.logError(e);
+					} catch (IOException e) {
+						J2EEPlugin.logError(e);
+					} finally{
+						if (in != null) {
+							try {
+								in.close();
+								in = null;
+							} catch (IOException e) {
+								J2EEPlugin.logError(e);
+							}
+						}
+						if(archive != null){
+							helper.releaseArchive(archive);
+						}
+					}
+				}
+			} finally{
+				if(helper != null){
+					helper.dispose();
+				}
+			}
+		}
+		return null;
+	}
 	/**
 	 * Keys are the EJB JAR files and the values are the respective client JARs; includes only key
 	 * value pairs for which EJB Client JARs are defined and exist.
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/project/JavaEEProjectUtilities.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/project/JavaEEProjectUtilities.java
index dcbfbdc..c4883a5 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/project/JavaEEProjectUtilities.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/project/JavaEEProjectUtilities.java
@@ -24,10 +24,7 @@
 import org.eclipse.jst.j2ee.internal.J2EEConstants;
 import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
 import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
-import org.eclipse.jst.j2ee.internal.componentcore.AppClientBinaryComponentHelper;
-import org.eclipse.jst.j2ee.internal.componentcore.EJBBinaryComponentHelper;
-import org.eclipse.jst.j2ee.internal.componentcore.JCABinaryComponentHelper;
-import org.eclipse.jst.j2ee.internal.componentcore.WebBinaryComponentHelper;
+import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper;
 import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
 import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
 import org.eclipse.wst.common.componentcore.ComponentCore;
@@ -103,7 +100,7 @@
 
 	public static boolean isDynamicWebComponent(IVirtualComponent component) {
 		if (component.isBinary()) {
-			return WebBinaryComponentHelper.handlesComponent(component);
+			return isBinaryType(component, JavaEEQuickPeek.WEB_TYPE);
 		}
 		return isProjectOfType(component.getProject(), DYNAMIC_WEB);
 	}
@@ -118,7 +115,7 @@
 
 	public static boolean isEJBComponent(IVirtualComponent component) {
 		if (component.isBinary()) {
-			return EJBBinaryComponentHelper.handlesComponent(component);
+			return isBinaryType(component, JavaEEQuickPeek.EJB_TYPE);
 		}
 		return isProjectOfType(component.getProject(), EJB);
 	}
@@ -129,7 +126,7 @@
 
 	public static boolean isJCAComponent(IVirtualComponent component) {
 		if (component.isBinary()) {
-			return JCABinaryComponentHelper.handlesComponent(component);
+			return isBinaryType(component, JavaEEQuickPeek.CONNECTOR_TYPE);
 		}
 		return isProjectOfType(component.getProject(), JCA);
 	}
@@ -140,7 +137,7 @@
 
 	public static boolean isApplicationClientComponent(IVirtualComponent component) {
 		if (component.isBinary()) {
-			return AppClientBinaryComponentHelper.handlesComponent(component);
+			return isBinaryType(component, JavaEEQuickPeek.APPLICATION_CLIENT_TYPE);
 		}
 		return isProjectOfType(component.getProject(), APPLICATION_CLIENT);
 	}
@@ -170,19 +167,30 @@
 		return (IProject[]) result.toArray(new IProject[result.size()]);
 	}
 
+	private static boolean isBinaryType(IVirtualComponent aBinaryComponent, int quickPeekType){
+		JavaEEQuickPeek qp = JavaEEBinaryComponentHelper.getJavaEEQuickPeek(aBinaryComponent);
+		int type = qp.getType();
+		return quickPeekType == type;
+	}
+	
 	public static String getJ2EEComponentType(IVirtualComponent component) {
 		if (null != component) {
 			if (component.isBinary()) {
-				if (isApplicationClientComponent(component))
+				JavaEEQuickPeek qp = JavaEEBinaryComponentHelper.getJavaEEQuickPeek(component);
+				switch(qp.getType()){
+				case JavaEEQuickPeek.APPLICATION_CLIENT_TYPE:
 					return APPLICATION_CLIENT;
-				else if (isDynamicWebComponent(component))
+				case JavaEEQuickPeek.WEB_TYPE:
 					return DYNAMIC_WEB;
-				else if (isEJBComponent(component))
+				case JavaEEQuickPeek.EJB_TYPE:
 					return EJB;
-				else if (isJCAComponent(component))
+				case JavaEEQuickPeek.CONNECTOR_TYPE:
 					return JCA;
-				else
+				case JavaEEQuickPeek.APPLICATION_TYPE:
+					return ENTERPRISE_APPLICATION;
+				default:
 					return UTILITY;
+				}
 			}
 			return getJ2EEProjectType(component.getProject());
 		}
@@ -288,4 +296,5 @@
 		int retVal = 0;
 		return retVal;
 	}
+	
 }