[187914] EE5 Module import support
diff --git a/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ArchiveFactoryImpl.java b/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ArchiveFactoryImpl.java
index e8820cc..03bb10d 100644
--- a/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ArchiveFactoryImpl.java
+++ b/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ArchiveFactoryImpl.java
@@ -55,12 +55,11 @@
 		((ArchiveImpl) archive).close();
 		// TODO add tracing support
 	}
-
+	
 	public void saveArchive(IArchive archive, IPath outputPath, IProgressMonitor monitor) throws ArchiveSaveFailureException {
 		final int SAVE_TICKS = 198;
-		final int CLOSE_TICKS = 2;
 		final int CLEANUP_TICKS = 1;
-		final int TOTAL_TICKS = SAVE_TICKS + CLOSE_TICKS + CLEANUP_TICKS;
+		final int TOTAL_TICKS = SAVE_TICKS + CLEANUP_TICKS;
 		try {
 			monitor.beginTask("Saving archive to: " + outputPath.toOSString(), TOTAL_TICKS);
 			String aUri = outputPath.toOSString();
@@ -75,8 +74,6 @@
 				save(aSaveAdapter, new SubProgressMonitor(monitor, SAVE_TICKS));
 
 				aSaveAdapter.close();
-				closeArchive(archive);
-				monitor.worked(CLOSE_TICKS);
 				if (fileExisted) {
 					ArchiveUtil.cleanupAfterTempSave(aUri, aFile, destinationFile);
 				}
@@ -134,7 +131,6 @@
 				save(aSaveAdapter, new SubProgressMonitor(monitor, SAVE_TICKS));
 
 				aSaveAdapter.close();
-				closeArchive(archive);
 				monitor.worked(CLOSE_TICKS);
 			} catch (ArchiveSaveFailureException failure) {
 				try {
diff --git a/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ArchiveImpl.java b/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ArchiveImpl.java
index fd4c2cb..834c62b 100644
--- a/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ArchiveImpl.java
+++ b/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ArchiveImpl.java
@@ -269,6 +269,7 @@
 			nestedArchiveOptions.setOption(ArchiveOptions.LOAD_ADAPTER, nestedLoadAdapter);
 			IArchive nestedArchive = IArchiveFactory.INSTANCE.openArchive(nestedArchiveOptions);
 			nestedArchive.setPath(cachedArchiveResource.getPath());
+			nestedArchive.setArchive(this);
 			// replace the IArchiveResource with the nested IArchive and reset
 			// the index
 			archiveFileIndex.index.put(nestedArchive.getPath(), nestedArchive);
diff --git a/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/internal/jca/operations/ConnectorComponentImportDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/internal/jca/operations/ConnectorComponentImportDataModelProvider.java
index fea9af0..6bca36c 100644
--- a/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/internal/jca/operations/ConnectorComponentImportDataModelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/internal/jca/operations/ConnectorComponentImportDataModelProvider.java
@@ -59,9 +59,9 @@
 
 	public boolean propertySet(String propertyName, Object propertyValue) {
 		boolean set = super.propertySet(propertyName, propertyValue);
-		if (propertyName.equals(FILE)) {
+		if (propertyName.equals(ARCHIVE_WRAPPER)) {
 			IDataModel moduleDM = model.getNestedModel(NESTED_MODEL_J2EE_COMPONENT_CREATION);
-			if (getModuleFile() != null) {
+			if (getArchiveWrapper() != null) {
 				FacetDataModelMap map = (FacetDataModelMap) moduleDM.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
 				IDataModel jcaFacetDataModel = map.getFacetDataModel( J2EEProjectUtilities.JCA );
 
diff --git a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WebComponentImportDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WebComponentImportDataModelProvider.java
index 1bf14b9..f5c9219 100644
--- a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WebComponentImportDataModelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WebComponentImportDataModelProvider.java
@@ -20,8 +20,9 @@
 import org.eclipse.jst.j2ee.application.internal.operations.J2EEUtilityJarImportDataModelProvider;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.archive.ArchiveWrapper;
 import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
 import org.eclipse.jst.j2ee.internal.common.XMLResource;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
@@ -65,7 +66,7 @@
 	}
 
 	protected IStatus validateModuleType() {
-		if (getArchiveFile() instanceof WARFile)
+		if (getArchiveWrapper().getJavaEEQuickPeek().getType() == J2EEConstants.WEB_TYPE)
 			return OK_STATUS;
 
 		// TODO: STRING MOVE
@@ -74,10 +75,10 @@
 
 	public boolean propertySet(String propertyName, Object propertyValue) {
 		super.propertySet(propertyName, propertyValue);
-		if (propertyName.equals(FILE)) {
+		if (propertyName.equals(ARCHIVE_WRAPPER)) {
 			
 			IDataModel moduleDM = model.getNestedModel(NESTED_MODEL_J2EE_COMPONENT_CREATION);
-			if (getModuleFile() != null) {
+			if (getArchiveWrapper() != null) {
 				
 				FacetDataModelMap map = (FacetDataModelMap) moduleDM.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
 				IDataModel webFacetDataModel = map.getFacetDataModel( J2EEProjectUtilities.DYNAMIC_WEB );
@@ -88,14 +89,13 @@
 				model.notifyPropertyChange(PROJECT_NAME, IDataModel.VALID_VALUES_CHG);
 			}			
 			
-			Archive archive = (Archive) propertyValue;
-			if (null != archive) {
-				WARFile war = (WARFile) archive;
-				List libs = war.getLibArchives();
+			ArchiveWrapper archiveWrapper = (ArchiveWrapper) propertyValue;
+			if (null != archiveWrapper) {
+				List <ArchiveWrapper> libs = archiveWrapper.getWebLibs();
 				List nestedModels = new ArrayList();
 				for (int i = 0; i < libs.size(); i++) {
 					IDataModel localModel = DataModelFactory.createDataModel(new J2EEUtilityJarImportDataModelProvider());
-					localModel.setProperty(FILE, libs.get(i));
+					localModel.setProperty(ARCHIVE_WRAPPER, libs.get(i));
 					localModel.setProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME, getProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME));
 					nestedModels.add(localModel);
 				}
diff --git a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WebComponentImportOperation.java b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WebComponentImportOperation.java
index 3a0ca4f..be57eed 100644
--- a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WebComponentImportOperation.java
+++ b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WebComponentImportOperation.java
@@ -22,9 +22,9 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.SaveStrategy;
 import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.archive.ArchiveWrapper;
 import org.eclipse.jst.j2ee.internal.archive.ComponentArchiveSaveAdapter;
 import org.eclipse.jst.j2ee.internal.archive.WebComponentArchiveSaveAdapter;
 import org.eclipse.jst.j2ee.internal.archive.operations.J2EEArtifactImportOperation;
@@ -53,13 +53,12 @@
 		List selectedLibs = (List) model.getProperty(IWebComponentImportDataModelProperties.WEB_LIB_ARCHIVES_SELECTED);
 		List libProjects = (List) model.getProperty(IWebComponentImportDataModelProperties.WEB_LIB_MODELS);
 		IDataModel importModel = null;
-//		IVirtualComponent nestedComponent = null;
-		Archive libArchive = null;
+		ArchiveWrapper libArchive = null;
 		for (int i = 0; null != libProjects && i < libProjects.size(); i++) {
 			importModel = (IDataModel) libProjects.get(i);
-			libArchive = (Archive) importModel.getProperty(IJ2EEComponentImportDataModelProperties.FILE);
+			libArchive = (ArchiveWrapper) importModel.getProperty(IJ2EEComponentImportDataModelProperties.ARCHIVE_WRAPPER);
 			if (selectedLibs.contains(libArchive)) {
-				baseWork += LINK_COMPONENTS_WORK + PROJECT_CREATION_WORK + libArchive.getFiles().size();
+				baseWork += LINK_COMPONENTS_WORK + PROJECT_CREATION_WORK + libArchive.getSize();
 			}
 		}
 		
@@ -92,17 +91,17 @@
 		List libProjects = (List) model.getProperty(IWebComponentImportDataModelProperties.WEB_LIB_MODELS);
 		IDataModel importModel = null;
 		IVirtualComponent nestedComponent = null;
-		Archive libArchive = null;
+		ArchiveWrapper libArchive = null;
 		List targetComponents = new ArrayList();
 		Map compToURIMap = new HashMap();
 		for (int i = 0; null != libProjects && i < libProjects.size(); i++) {
 			importModel = (IDataModel) libProjects.get(i);
-			libArchive = (Archive) importModel.getProperty(IJ2EEComponentImportDataModelProperties.FILE);
+			libArchive = (ArchiveWrapper) importModel.getProperty(IJ2EEComponentImportDataModelProperties.ARCHIVE_WRAPPER);
 			if (selectedLibs.contains(libArchive)) {
-				importModel.getDefaultOperation().execute(new SubProgressMonitor(monitor, PROJECT_CREATION_WORK + libArchive.getFiles().size()) , info);
+				importModel.getDefaultOperation().execute(new SubProgressMonitor(monitor, PROJECT_CREATION_WORK + libArchive.getSize()) , info);
 				nestedComponent = (IVirtualComponent) importModel.getProperty(IJ2EEComponentImportDataModelProperties.COMPONENT);
 				targetComponents.add(nestedComponent);
-				String archiveURI = libArchive.getURI();
+				String archiveURI = libArchive.getPath().toOSString();
 				int lastIndex = archiveURI.lastIndexOf('/');
 				if (-1 != lastIndex && lastIndex + 1 < archiveURI.length()) {
 					lastIndex++;
diff --git a/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/internal/creation/AppClientComponentImportDataModelProvider.java b/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/internal/creation/AppClientComponentImportDataModelProvider.java
index 988a067..dc3b7b4 100644
--- a/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/internal/creation/AppClientComponentImportDataModelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/internal/creation/AppClientComponentImportDataModelProvider.java
@@ -56,9 +56,9 @@
 
 	public boolean propertySet(String propertyName, Object propertyValue) {
 		boolean set = super.propertySet(propertyName, propertyValue);
-		if (propertyName.equals(FILE)) {
+		if (propertyName.equals(ARCHIVE_WRAPPER)) {
 			IDataModel moduleDM = model.getNestedModel(NESTED_MODEL_J2EE_COMPONENT_CREATION);
-			if (getModuleFile() != null) {
+			if (getArchiveWrapper() != null) {
 				FacetDataModelMap map = (FacetDataModelMap) moduleDM.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
 				IDataModel appClientFacetDataModel = map.getFacetDataModel( J2EEProjectUtilities.APPLICATION_CLIENT );
 
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/datamodel/properties/IJ2EEComponentImportDataModelProperties.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/datamodel/properties/IJ2EEComponentImportDataModelProperties.java
index 7977678..2a680fa 100644
--- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/datamodel/properties/IJ2EEComponentImportDataModelProperties.java
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/datamodel/properties/IJ2EEComponentImportDataModelProperties.java
@@ -41,6 +41,7 @@
 	/**
 	 * Optional, type Archive, used when a file is available as an object rather than a url (i.e.
 	 * using the FILE_NAME property will not work).
+	 * @deprecated use {@link #ARCHIVE_WRAPPER}
 	 */
 	public static final String FILE = "IJ2EEArtifactImportDataModelProperties.FILE"; //$NON-NLS-1$
 	/**
@@ -52,6 +53,13 @@
 	 * Unsettable property used to retreive the component after the operation has executed.
 	 */
 	public static final String COMPONENT = "IJ2EEComponentImportDataModelProperties.COMPONENT"; //$NON-NLS-1$
+	
+	/**
+	 * Unsettable property used for archive switch.
+	 */
+	public static final String ARCHIVE_WRAPPER = "IJ2EEComponentImportDataModelProperties.ARCHIVE_WRAPPER"; //$NON-NLS-1$
+
+	
 	/**
 	 * Optional, type IOverwriteHandler. Defines a IOverwriteHandler for the component in the
 	 * workspace if an existing component should be overwritten (OVERWRITE_COMPONENT).
@@ -60,6 +68,7 @@
 
 	/**
 	 * Optional, type SaveFilter, default is null
+	 * @deprecated
 	 */
 	public static final String SAVE_FILTER = "IJ2EEArtifactImportDataModelProperties.SAVE_FILTER"; //$NON-NLS-1$
 
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/ArchiveWrapper.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/ArchiveWrapper.java
new file mode 100644
index 0000000..baa9f28
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/ArchiveWrapper.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.archive;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.jee.archive.ArchiveOpenFailureException;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
+
+public class ArchiveWrapper {
+
+	private Archive commonArchive = null;
+	private IArchive archive = null;
+	private JavaEEQuickPeek jqp = null;
+
+	public ArchiveWrapper(IArchive archive) {
+
+		this.archive = archive;
+		JavaEEArchiveUtilities jea = JavaEEArchiveUtilities.INSTANCE;
+		jqp = jea.getJavaEEQuickPeek(archive);
+
+	}
+
+	public ArchiveWrapper(Archive mFile) {
+
+		this.commonArchive = mFile;
+		int type = J2EEConstants.UNKNOWN;
+
+		if (mFile.isApplicationClientFile()) {
+			type = J2EEConstants.APPLICATION_CLIENT_TYPE;
+		} else if (mFile.isEARFile()) {
+			type = J2EEConstants.APPLICATION_TYPE;
+		} else if (mFile.isEJBJarFile()) {
+			type = J2EEConstants.EJB_TYPE;
+		} else if (mFile.isWARFile()) {
+			type = J2EEConstants.WEB_TYPE;
+		} else if (mFile.isRARFile()) {
+			type = J2EEConstants.CONNECTOR_TYPE;
+		}
+		if (type != J2EEConstants.UNKNOWN) {
+			int version = ArchiveUtil.getFastSpecVersion((ModuleFile) mFile);
+			jqp = new JavaEEQuickPeek(type, version);
+		}
+
+	}
+
+	public JavaEEQuickPeek getJavaEEQuickPeek() {
+		return jqp;
+	}
+
+	public Archive getCommonArchive() {
+		return (Archive) commonArchive;
+	}
+
+	public IArchive getIArchive() {
+		return archive;
+	}
+
+	public void close() {
+		try {
+			if (commonArchive != null) {
+				commonArchive.close();
+			}
+			if (archive != null) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+			}
+		} catch (RuntimeException e) {
+			fail();
+		}
+
+	}
+
+	public IPath getPath() {
+		if (commonArchive != null) {
+			IPath path = new Path(commonArchive.getURI());
+			return path;
+		}
+		if (archive != null) {
+			return archive.getPath();
+		}
+		fail();
+		return null;
+	}
+
+	private void fail() {
+		throw new RuntimeException("ArchiveWrapper is inconsistent.");
+	}
+
+	public int getSize() {
+		if (commonArchive != null)
+			return commonArchive.getFiles().size();
+		else
+			return archive.getArchiveResources().size();
+	}
+
+	private List <ArchiveWrapper> webLibs;
+	
+	public List <ArchiveWrapper> getWebLibs() {
+		if(webLibs != null){
+			return webLibs;
+		}
+		if (jqp.getType() != J2EEVersionConstants.WEB_TYPE) {
+			fail();
+		}
+		if (commonArchive != null) {
+			WARFile war = (WARFile) commonArchive;
+			List wrappedLibs = new ArrayList();
+			List libs = war.getLibArchives();
+			for(int i=0;i<libs.size(); i++){
+				wrappedLibs.add(new ArchiveWrapper((Archive)libs.get(i)));
+			}
+			webLibs = wrappedLibs;
+			return wrappedLibs;
+		}
+		if (archive != null) {
+			webLibs = new ArrayList<ArchiveWrapper>();
+			List<IArchiveResource> resources = archive.getArchiveResources();
+			for (IArchiveResource resource : resources) {
+				if (resource.getType() != IArchiveResource.DIRECTORY_TYPE) {
+					IPath path = resource.getPath();
+					if (path.segmentCount() > 2) {
+						if (path.segment(0).equals("WEB-INF") && path.segment(1).equals("lib")) {
+							String lastSegment = path.lastSegment();
+							if (lastSegment.endsWith("jar") || lastSegment.endsWith("zip")) {
+								IArchive webLib;
+								try {
+									webLib = archive.getNestedArchive(resource);
+									webLibs.add(new ArchiveWrapper(webLib));
+								} catch (ArchiveOpenFailureException e) {
+									Logger.getLogger().logError(e);
+								}
+
+							}
+						}
+					}
+				}
+			}
+			
+			return webLibs;
+		}
+		fail();
+		return null;
+	}
+	
+	public String getName() {
+		if (commonArchive != null) {
+			return commonArchive.getName();
+		}
+		if (archive != null) {
+			return archive.getPath().lastSegment();
+		}
+		fail();
+		return null;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/ComponentArchiveSaveAdapter.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/ComponentArchiveSaveAdapter.java
index 2370bde..c68ff90 100644
--- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/ComponentArchiveSaveAdapter.java
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/ComponentArchiveSaveAdapter.java
@@ -123,11 +123,11 @@
 	public void save(IArchiveResource aFile) throws ArchiveSaveFailureException {
 
 		try {
-			InputStream in = aFile.getInputStream();
 			if (progressMonitor == null)
 				progressMonitor = new NullProgressMonitor();
 			progressMonitor.subTask(aFile.getPath().toString());
-
+			InputStream in = aFile.getInputStream();
+			
 			IPath projectRelativePath = getProjectRelativePath(aFile);
 			if (aFile.getType() == IArchiveResource.ARCHIVE_TYPE) {
 				saveAsArchiveComponent((IArchive) aFile, projectRelativePath, in);
@@ -142,7 +142,9 @@
 			String errorString = EJBArchiveOpsResourceHandler.ARCHIVE_OPERATION_SaveFile + aFile.getPath();
 			throw new ArchiveSaveFailureException(errorString);
 		} finally {
-			progressMonitor.worked(1);
+			if(null != progressMonitor){
+				progressMonitor.worked(1);
+			}
 		}
 	}
 
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 013928c..5820495 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
@@ -242,6 +242,7 @@
 							archiveToJavaEEQuickPeek.put(newArchive, quickPeek);
 							return newArchive;
 						} finally {
+							//TODO streamline this so the underlying zip file is only openend once.
 							closeArchive(simpleArchive);
 						}
 					} else {
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/EARComponentSaveStrategyImpl.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/EARComponentSaveStrategyImpl.java
index 65a0675..76f5f29 100644
--- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/EARComponentSaveStrategyImpl.java
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/EARComponentSaveStrategyImpl.java
@@ -10,36 +10,21 @@
  *******************************************************************************/
 package org.eclipse.jst.j2ee.internal.archive.operations;
 
-import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jem.workbench.utility.JemProjectUtilities;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
 import org.eclipse.jst.j2ee.datamodel.properties.IEARComponentImportDataModelProperties;
-import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 
 public class EARComponentSaveStrategyImpl extends ComponentSaveStrategyImpl {
 
-	protected Map createdComponentsMap;
+//	protected Map createdComponentsMap;
 
 	public EARComponentSaveStrategyImpl(IVirtualComponent component) {
 		super(component);
@@ -53,43 +38,43 @@
 		if (null != overwriteHandler) {
 			overwriteHandler.setEarSaveStrategy(this);
 		}
-		buildProjectsMap();
+//		buildProjectsMap();
 	}
 
 
 
-	/**
-	 * Creates a Map mapping archive uris to projects for all archives in the ear that imported as
-	 * projects.
-	 */
-	private void buildProjectsMap() {
-		createdComponentsMap = new HashMap();
-		List createdProjectsList = (List) dataModel.getProperty(IEARComponentImportDataModelProperties.ALL_PROJECT_MODELS_LIST);
-		IDataModel importDM = null;
-		Archive anArchive = null;
-		for (int i = 0; i < createdProjectsList.size(); i++) {
-			importDM = (IDataModel) createdProjectsList.get(i);
-			anArchive = (Archive) importDM.getProperty(IJ2EEComponentImportDataModelProperties.FILE);
-			createdComponentsMap.put(anArchive.getURI(), importDM.getProperty(IJ2EEComponentImportDataModelProperties.COMPONENT));
-		}
-	}
+//	/**
+//	 * Creates a Map mapping archive uris to projects for all archives in the ear that imported as
+//	 * projects.
+//	 */
+//	private void buildProjectsMap() {
+//		createdComponentsMap = new HashMap();
+//		List createdProjectsList = (List) dataModel.getProperty(IEARComponentImportDataModelProperties.ALL_PROJECT_MODELS_LIST);
+//		IDataModel importDM = null;
+//		Archive anArchive = null;
+//		for (int i = 0; i < createdProjectsList.size(); i++) {
+//			importDM = (IDataModel) createdProjectsList.get(i);
+//			anArchive = (Archive) importDM.getProperty(IJ2EEComponentImportDataModelProperties.FILE);
+//			createdComponentsMap.put(anArchive.getURI(), importDM.getProperty(IJ2EEComponentImportDataModelProperties.COMPONENT));
+//		}
+//	}
 
-	protected void addFileToClasspath(IProject p, IFile file, List cp) {
-		if (!file.exists())
-			return;
+//	protected void addFileToClasspath(IProject p, IFile file, List cp) {
+//		if (!file.exists())
+//			return;
+//
+//		// Assume the file also contains the source
+//		IPath path = file.getFullPath();
+//		IClasspathEntry entry = JavaCore.newLibraryEntry(path, path, null, true);
+//		if (!cp.contains(entry))
+//			cp.add(entry);
+//	}
 
-		// Assume the file also contains the source
-		IPath path = file.getFullPath();
-		IClasspathEntry entry = JavaCore.newLibraryEntry(path, path, null, true);
-		if (!cp.contains(entry))
-			cp.add(entry);
-	}
-
-	protected void addProjectToClasspath(IProject dependent, IProject prereq, List cp) {
-		IClasspathEntry entry = JavaCore.newProjectEntry(prereq.getFullPath(), true);
-		if (!cp.contains(entry))
-			cp.add(entry);
-	}
+//	protected void addProjectToClasspath(IProject dependent, IProject prereq, List cp) {
+//		IClasspathEntry entry = JavaCore.newProjectEntry(prereq.getFullPath(), true);
+//		if (!cp.contains(entry))
+//			cp.add(entry);
+//	}
 
 	protected EARFile getEARFile() {
 		return (EARFile) getArchive();
@@ -106,7 +91,7 @@
 		saveManifest();
 		saveMofResources();
 		progressMonitor.subTask(EARArchiveOpsResourceHandler.Updating_project_classpath_UI_);
-		updateComponentClasspaths();
+		//updateComponentClasspaths();
 
 	}
 
@@ -161,75 +146,75 @@
 	}
 
 
-	/*
-	 * Parse the manifest of the module file; for each cp entry 1) cananonicalize to a uri that
-	 * looks like the entry in the ear 2) If the ear contains a file with that uri (the entry is
-	 * valid) a) If the file is another was blown out to a project, add a cp entry for a referenced
-	 * project b) otherwise, add a cp entry that points to the file in the ear project, and cp
-	 * entries for all prereqs
-	 */
-	protected void updateProjectClasspath(Archive anArchive, IVirtualComponent component) {
+//	/*
+//	 * Parse the manifest of the module file; for each cp entry 1) cananonicalize to a uri that
+//	 * looks like the entry in the ear 2) If the ear contains a file with that uri (the entry is
+//	 * valid) a) If the file is another was blown out to a project, add a cp entry for a referenced
+//	 * project b) otherwise, add a cp entry that points to the file in the ear project, and cp
+//	 * entries for all prereqs
+//	 */
+//	protected void updateProjectClasspath(Archive anArchive, IVirtualComponent component) {
+//
+//		String message = EARArchiveOpsResourceHandler.Updating_project_classpath_UI_ + component.getName();
+//		progressMonitor.subTask(message);
+//		List projectCpEntries = new ArrayList();
+//		Set visited = new HashSet();
+//		traverseClasspaths(component.getProject(), anArchive, projectCpEntries, visited);
+//
+//		try {
+//			if (!projectCpEntries.isEmpty())
+//				JemProjectUtilities.appendJavaClassPath(component.getProject(), projectCpEntries);
+//			JemProjectUtilities.forceClasspathReload(component.getProject());
+//		} catch (JavaModelException ex) {
+//			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError(ex);
+//		}
+//
+//	}
 
-		String message = EARArchiveOpsResourceHandler.Updating_project_classpath_UI_ + component.getName();
-		progressMonitor.subTask(message);
-		List projectCpEntries = new ArrayList();
-		Set visited = new HashSet();
-		traverseClasspaths(component.getProject(), anArchive, projectCpEntries, visited);
+//	/*
+//	 * If you have a dependency to a JAR in the EAR project, and the JAR depends on another JAR in
+//	 * the EAR; you want to compile cleanly after import, so you need both those JARs on your build
+//	 * path
+//	 */
+//	protected void traverseClasspaths(IProject p, Archive anArchive, List projectCpEntries, Set visitedArchives) {
+//		visitedArchives.add(anArchive);
+//		String[] manifestCpEntries = anArchive.getManifest().getClassPathTokenized();
+//		EARFile earFile = (EARFile) dataModel.getProperty(IJ2EEComponentImportDataModelProperties.FILE);
+//		for (int i = 0; i < manifestCpEntries.length; i++) {
+//			String uri = ArchiveUtil.deriveEARRelativeURI(manifestCpEntries[i], anArchive);
+//			// ensure the entry is valid or skip to the next
+//			if (uri == null)
+//				continue;
+//			File aFile = null;
+//			try {
+//				aFile = earFile.getFile(uri);
+//			} catch (FileNotFoundException notThere) {
+//			}
+//			if (aFile == null || !aFile.isArchive() || visitedArchives.contains(aFile))
+//				continue;
+//			Archive depArchive = (Archive) aFile;
+//			IProject prereq = null;
+//			IVirtualComponent depComponent = (IVirtualComponent) createdComponentsMap.get(uri);
+//			if (depComponent != null)
+//				prereq = depComponent.getProject();
+//
+//			if (prereq != null) {
+//				addProjectToClasspath(p, prereq, projectCpEntries);
+//			} else {
+//				addFileToClasspath(p, vComponent.getRootFolder().getFile(uri).getUnderlyingFile(), projectCpEntries);
+//				traverseClasspaths(p, depArchive, projectCpEntries, visitedArchives);
+//			}
+//		}
+//	}
 
-		try {
-			if (!projectCpEntries.isEmpty())
-				JemProjectUtilities.appendJavaClassPath(component.getProject(), projectCpEntries);
-			JemProjectUtilities.forceClasspathReload(component.getProject());
-		} catch (JavaModelException ex) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError(ex);
-		}
-
-	}
-
-	/*
-	 * If you have a dependency to a JAR in the EAR project, and the JAR depends on another JAR in
-	 * the EAR; you want to compile cleanly after import, so you need both those JARs on your build
-	 * path
-	 */
-	protected void traverseClasspaths(IProject p, Archive anArchive, List projectCpEntries, Set visitedArchives) {
-		visitedArchives.add(anArchive);
-		String[] manifestCpEntries = anArchive.getManifest().getClassPathTokenized();
-		EARFile earFile = (EARFile) dataModel.getProperty(IJ2EEComponentImportDataModelProperties.FILE);
-		for (int i = 0; i < manifestCpEntries.length; i++) {
-			String uri = ArchiveUtil.deriveEARRelativeURI(manifestCpEntries[i], anArchive);
-			// ensure the entry is valid or skip to the next
-			if (uri == null)
-				continue;
-			File aFile = null;
-			try {
-				aFile = earFile.getFile(uri);
-			} catch (FileNotFoundException notThere) {
-			}
-			if (aFile == null || !aFile.isArchive() || visitedArchives.contains(aFile))
-				continue;
-			Archive depArchive = (Archive) aFile;
-			IProject prereq = null;
-			IVirtualComponent depComponent = (IVirtualComponent) createdComponentsMap.get(uri);
-			if (depComponent != null)
-				prereq = depComponent.getProject();
-
-			if (prereq != null) {
-				addProjectToClasspath(p, prereq, projectCpEntries);
-			} else {
-				addFileToClasspath(p, vComponent.getRootFolder().getFile(uri).getUnderlyingFile(), projectCpEntries);
-				traverseClasspaths(p, depArchive, projectCpEntries, visitedArchives);
-			}
-		}
-	}
-
-	protected void updateComponentClasspaths() {
-		List jarFiles = getEARFile().getArchiveFiles();
-		for (int i = 0; i < jarFiles.size(); i++) {
-			Archive anArchive = (Archive) jarFiles.get(i);
-			IVirtualComponent component = (IVirtualComponent) createdComponentsMap.get(anArchive.getURI());
-			if (component != null)
-				updateProjectClasspath(anArchive, component);
-		}
-	}
+//	protected void updateComponentClasspaths() {
+//		List jarFiles = getEARFile().getArchiveFiles();
+//		for (int i = 0; i < jarFiles.size(); i++) {
+//			Archive anArchive = (Archive) jarFiles.get(i);
+//			IVirtualComponent component = (IVirtualComponent) createdComponentsMap.get(anArchive.getURI());
+//			if (component != null)
+//				updateProjectClasspath(anArchive, component);
+//		}
+//	}
 
 }
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/J2EEArtifactImportOperation.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/J2EEArtifactImportOperation.java
index 02989eb..d5b8c72 100644
--- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/J2EEArtifactImportOperation.java
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/J2EEArtifactImportOperation.java
@@ -22,8 +22,13 @@
 import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.SaveStrategy;
 import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.archive.ArchiveWrapper;
+import org.eclipse.jst.j2ee.internal.archive.ComponentArchiveSaveAdapter;
 import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
 import org.eclipse.jst.j2ee.internal.project.ProjectSupportResourceHandler;
+import org.eclipse.jst.jee.archive.ArchiveOptions;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveFactory;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
@@ -33,10 +38,16 @@
 
 public abstract class J2EEArtifactImportOperation extends AbstractDataModelOperation {
 
+	/**
+	 * @deprecated use {@link #archiveWrapper}
+	 */
 	protected Archive moduleFile;
+	protected ArchiveWrapper archiveWrapper;
 	protected IVirtualComponent virtualComponent;
 	protected IAdaptable info;
 	protected final int PROJECT_CREATION_WORK = 30;
+	
+	private static IArchiveFactory archiveFactory = IArchiveFactory.INSTANCE;
 
 	public J2EEArtifactImportOperation(IDataModel model) {
 		super(model);
@@ -47,7 +58,8 @@
 			J2EEComponentClasspathUpdater.getInstance().pauseUpdates();
 			this.info = anInfo;
 			moduleFile = (Archive) model.getProperty(IJ2EEComponentImportDataModelProperties.FILE);
-			monitor.beginTask(ProjectSupportResourceHandler.getString(ProjectSupportResourceHandler.Importing_archive, new Object [] { moduleFile.getURI() }), computeTotalWork());
+			archiveWrapper = (ArchiveWrapper)model.getProperty(IJ2EEComponentImportDataModelProperties.ARCHIVE_WRAPPER);
+			monitor.beginTask(ProjectSupportResourceHandler.getString(ProjectSupportResourceHandler.Importing_archive, new Object [] { archiveWrapper.getPath() }), computeTotalWork());
 			doExecute(monitor);
 			return OK_STATUS;
 		} finally {
@@ -64,7 +76,7 @@
 	}
 
 	protected int computeTotalWork() {
-		return PROJECT_CREATION_WORK + moduleFile.getFiles().size();
+		return PROJECT_CREATION_WORK + archiveWrapper.getSize();
 	}
 	
 	/**
@@ -76,7 +88,7 @@
 		virtualComponent = createVirtualComponent(model.getNestedModel(IJ2EEComponentImportDataModelProperties.NESTED_MODEL_J2EE_COMPONENT_CREATION), new SubProgressMonitor(monitor, PROJECT_CREATION_WORK));
 
 		try {
-			importModuleFile(new SubProgressMonitor(monitor, moduleFile.getFiles().size()));
+			importModuleFile(new SubProgressMonitor(monitor, archiveWrapper.getSize()));
 		} catch (InvocationTargetException e) {
 			throw new ExecutionException(e.getMessage(), e);
 		} catch (InterruptedException e) {
@@ -103,6 +115,10 @@
 
 	protected void modifyStrategy(SaveStrategy saveStrat) {
 	}
+	
+	protected ComponentArchiveSaveAdapter getArchiveSaveAdapter(IVirtualComponent virtualComponent){
+		return null;
+	}
 
 	/**
 	 * perform the archive import operation
@@ -112,13 +128,22 @@
 	 */
 	protected void importModuleFile(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
 		try {
-			monitor.beginTask(null, moduleFile.getFiles().size());
-			ComponentSaveStrategyImpl aStrategy = (ComponentSaveStrategyImpl) createSaveStrategy(virtualComponent);
-			aStrategy.setProgressMonitor(monitor);
-			aStrategy.setOverwriteHandler((IOverwriteHandler) model.getProperty(IJ2EEComponentImportDataModelProperties.OVERWRITE_HANDLER));
-			aStrategy.setDataModel(model);
-			modifyStrategy(aStrategy);
-			moduleFile.save(aStrategy);
+			monitor.beginTask(null, archiveWrapper.getSize());
+			if(archiveWrapper.getIArchive() != null){
+				IArchive archive = archiveWrapper.getIArchive();
+				ComponentArchiveSaveAdapter adap = getArchiveSaveAdapter(virtualComponent);
+				ArchiveOptions saveOptions = new ArchiveOptions();
+				saveOptions.setOption(ArchiveOptions.SAVE_ADAPTER, adap);
+				archiveFactory.saveArchive(archive, saveOptions,monitor);
+			}else{
+				ComponentSaveStrategyImpl aStrategy = (ComponentSaveStrategyImpl) createSaveStrategy(virtualComponent);
+				aStrategy.setProgressMonitor(monitor);
+				aStrategy.setOverwriteHandler((IOverwriteHandler) model.getProperty(IJ2EEComponentImportDataModelProperties.OVERWRITE_HANDLER));
+				aStrategy.setDataModel(model);
+				modifyStrategy(aStrategy);
+				archiveWrapper.getCommonArchive().save(aStrategy);
+			}
+			
 		} catch (OverwriteHandlerException oe) {
 			throw new InterruptedException();
 		} catch (Exception ex) {
diff --git a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEArtifactImportDataModelProvider.java b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEArtifactImportDataModelProvider.java
index 6761fea..13a2871 100644
--- a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEArtifactImportDataModelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEArtifactImportDataModelProvider.java
@@ -19,6 +19,7 @@
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
@@ -29,7 +30,13 @@
 import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.SaveFilter;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
 import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.archive.ArchiveWrapper;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
 import org.eclipse.jst.j2ee.internal.project.J2EECreationResourceHandler;
+import org.eclipse.jst.jee.archive.ArchiveOpenFailureException;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.datamodel.FacetProjectCreationDataModelProvider;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
@@ -54,7 +61,7 @@
 	public static final String FACET_RUNTIME = "IJ2EEArtifactImportDataModelProperties.FACET_RUNTIME"; //$NON-NLS-1$	
 
 	private IDataModel componentCreationDM;
-	private OpenFailureException cachedOpenFailureException = null;
+	private Throwable archiveOpenFailure = null;
 
 	public Set getPropertyNames() {
 		Set propertyNames = super.getPropertyNames();
@@ -67,6 +74,7 @@
 		propertyNames.add(PROJECT_NAME);
 		propertyNames.add(COMPONENT);
 		propertyNames.add( FACET_RUNTIME );
+		propertyNames.add(ARCHIVE_WRAPPER);
 		return propertyNames;
 	}
 
@@ -94,20 +102,34 @@
 	private boolean settingFileName = false;
 
 	public boolean propertySet(String propertyName, Object propertyValue) {
-		if (propertyName.equals(FILE)) {
-			if (!settingFileName) {
-				setProperty(FILE_NAME, null);
+		if (propertyName.equals(ARCHIVE_WRAPPER)) {
+			if(propertyValue != null){
+				if (!settingFileName) {
+					setProperty(FILE_NAME, null);
+				}
+				updateDefaultComponentName();
 			}
-			updateDefaultComponentName();
 			return true;
-		} else if (propertyName.equals(SAVE_FILTER) && getArchiveFile() != null) {
-			getArchiveFile().setSaveFilter(getSaveFilter());
+		} else if(propertyName.equals(FILE)){
+			if(propertyValue != null){
+				if(!settingFileName) {
+					ArchiveWrapper archiveWrapper = getArchiveWrapper();
+					if(null == archiveWrapper || archiveWrapper.getCommonArchive() != propertyValue){
+						archiveWrapper = new ArchiveWrapper((Archive)propertyValue);
+						setProperty(ARCHIVE_WRAPPER, archiveWrapper);
+					}
+				}
+			}
+		} else if (propertyName.equals(SAVE_FILTER) && getArchiveWrapper() != null && getArchiveWrapper().getCommonArchive() != null) {
+			getArchiveWrapper().getCommonArchive().setSaveFilter(getSaveFilter());
 		} else if (FILE_NAME.equals(propertyName)) {
 			try {
-				cachedOpenFailureException = null;
+				archiveOpenFailure = null;
 				handleArchiveSetup((String) propertyValue);
 			} catch (OpenFailureException oe) {
-				cachedOpenFailureException = oe;
+				archiveOpenFailure = oe;
+			} catch (ArchiveOpenFailureException e) {
+				archiveOpenFailure = e;
 			}
 		} else if( COMPONENT.equals(propertyName)){
 			throw new RuntimeException(propertyName + " should not be set."); //$NON-NLS-1$
@@ -131,11 +153,11 @@
 	private boolean doingComponentUpdate;
 
 	private void updateDefaultComponentName() {
-		Archive archive = getArchiveFile();
-		if (null != archive && getBooleanProperty(USE_DEFAULT_PROJECT_NAME)) {
+		ArchiveWrapper wrapper = getArchiveWrapper();
+		if (null != wrapper && getBooleanProperty(USE_DEFAULT_PROJECT_NAME)) {
 			try {
 				doingComponentUpdate = true;
-				Path path = new Path(archive.getURI());
+				IPath path = wrapper.getPath();
 				String defaultProjectName = path.segment(path.segmentCount() - 1);
 				if (defaultProjectName.indexOf('.') > 0) {
 					defaultProjectName = defaultProjectName.substring(0, defaultProjectName.lastIndexOf('.'));
@@ -148,45 +170,73 @@
 		}
 	}
 
-	private boolean handleArchiveSetup(String fileName) throws OpenFailureException {
+	private boolean handleArchiveSetup(String fileName) throws OpenFailureException, ArchiveOpenFailureException {
 		try {
 			settingFileName = true;
-			Archive archive = getArchiveFile();
-			if (archive != null) {
-				archive.close();
+			ArchiveWrapper wrapper = getArchiveWrapper();
+			if (wrapper!= null) {
+				wrapper.close();
 				setProperty(FILE, null);
+				setProperty(ARCHIVE_WRAPPER, null);
 			}
 			String uri = getStringProperty(FILE_NAME);
 			if (!archiveExistsOnFile())
 				return false;
-			archive = openArchive(uri);
-			if (null != archive) {
-				archive.setSaveFilter(getSaveFilter());
+			wrapper = openArchiveWrapper(uri);
+			if(wrapper != null){
+				setProperty(ARCHIVE_WRAPPER, wrapper);
+				if(wrapper.getCommonArchive() != null){
+					setProperty(FILE, wrapper.getCommonArchive());
+				}
 			}
-			setProperty(FILE, archive);
-			return archive != null;
+			return wrapper!= null;
 		} finally {
 			settingFileName = false;
 		}
 
 	}
 
+	protected ArchiveWrapper openArchiveWrapper(String uri) throws OpenFailureException, ArchiveOpenFailureException{
+		IArchive archive = null;
+		boolean isEE5 = false;
+		try{
+			IPath path = new Path(uri);
+			archive = JavaEEArchiveUtilities.INSTANCE.openArchive(path);
+			archive.setPath(path);
+			JavaEEQuickPeek jqp = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(archive);
+			if(jqp.getJavaEEVersion() == J2EEConstants.JEE_5_0_ID){
+				isEE5 = true;
+				return new ArchiveWrapper(archive);
+			} else {
+				Archive commonArchive = openArchive(uri);
+				if (null != commonArchive) {
+					commonArchive.setSaveFilter(getSaveFilter());
+				}
+				return new ArchiveWrapper(commonArchive);
+			}
+		} finally {
+			if(!isEE5){
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+			}
+		}
+	}
+	
 	protected abstract Archive openArchive(String uri) throws OpenFailureException;
 
-	private boolean closeModuleFile() {
-		if (null != getArchiveFile()) {
-			getArchiveFile().close();
+	private boolean closeArchive() {
+		if (null != getArchiveWrapper()) {
+			getArchiveWrapper().close();
 		}
 		return true;
 	}
 
 	public IStatus validate(String propertyName) {
-		if (FILE_NAME.equals(propertyName) && !isPropertySet(FILE)) {
+		if (FILE_NAME.equals(propertyName) && !isPropertySet(ARCHIVE_WRAPPER)) {
 			String fileName = getStringProperty(propertyName);
 			if (fileName == null || fileName.length() == 0) {
 				return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.ARCHIVE_FILE_NAME_EMPTY_ERROR, new Object[]{ArchiveUtil.getModuleFileTypeName(getType())}));
-			} else if (cachedOpenFailureException != null) {
-				return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(cachedOpenFailureException.getMessage()));
+			} else if (archiveOpenFailure != null) {
+				return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(archiveOpenFailure.getMessage()));
 			} else if (fileName != null && !archiveExistsOnFile()) {
 				return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.FILE_DOES_NOT_EXIST_ERROR, new Object[]{ArchiveUtil.getModuleFileTypeName(getType())}));
 			}
@@ -224,14 +274,22 @@
 
 	public void dispose() {
 		if (getBooleanProperty(CLOSE_ARCHIVE_ON_DISPOSE))
-			closeModuleFile();
+			closeArchive();
 		super.dispose();
 	}
 
 	protected final void setArchiveFile(Archive archiveFile) {
 		setProperty(FILE, archiveFile);
 	}
-
+	
+	protected final ArchiveWrapper getArchiveWrapper(){
+		return (ArchiveWrapper)getProperty(ARCHIVE_WRAPPER);
+	}
+	
+	/**
+	 * @deprecated
+	 * @return use ARCHIVE_WRAPPER
+	 */
 	protected final Archive getArchiveFile() {
 		return (Archive) getProperty(FILE);
 	}
@@ -265,7 +323,7 @@
 	 * @return
 	 */
 	protected IStatus validateVersionSupportedByServer(){
-		if( model.isPropertySet(FILE) && model.isPropertySet(IFacetProjectCreationDataModelProperties.FACET_RUNTIME)){
+		if( model.isPropertySet(ARCHIVE_WRAPPER) && model.isPropertySet(IFacetProjectCreationDataModelProperties.FACET_RUNTIME)){
 			IDataModel projectModel = model.getNestedModel(NESTED_MODEL_J2EE_COMPONENT_CREATION);
 			FacetDataModelMap map = (FacetDataModelMap) projectModel.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
 			Collection projectFacets = (Collection)getProperty(FacetProjectCreationDataModelProvider.REQUIRED_FACETS_COLLECTION);
diff --git a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEComponentImportDataModelProvider.java b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEComponentImportDataModelProvider.java
index 2a96de9..48859e4 100644
--- a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEComponentImportDataModelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEComponentImportDataModelProvider.java
@@ -13,8 +13,8 @@
 import java.util.Set;
 
 import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
 import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEModuleImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.archive.ArchiveWrapper;
 
 /**
  * This dataModel is a common super class used to import J2EE Modules.
@@ -34,25 +34,13 @@
 	}
 
 	protected int getModuleSpecVersion() {
-		if (!isPropertySet(EXTENDED_IMPORT_FACTORY)) {
-			return ArchiveUtil.getFastSpecVersion(getModuleFile());
-		}
-		ExtendedImportFactory factory = (ExtendedImportFactory) getProperty(EXTENDED_IMPORT_FACTORY);
-		return factory.getSpecVersion(getModuleFile());
+		ArchiveWrapper wrapper = getArchiveWrapper();
+		return wrapper.getJavaEEQuickPeek().getVersion();
 	}
 
-//	public boolean propertySet(String propertyName, Object propertyValue) {
-//		boolean set = super.propertySet(propertyName, propertyValue);
-//		if (propertyName.equals(FILE)) {
-//			IDataModel moduleDM = model.getNestedModel(NESTED_MODEL_J2EE_COMPONENT_CREATION);
-//			if (getModuleFile() != null) {
-//				moduleDM.setIntProperty(IJ2EEComponentCreationDataModelProperties.COMPONENT_VERSION, getModuleSpecVersion());
-//				model.notifyPropertyChange(PROJECT_NAME, IDataModel.VALID_VALUES_CHG);
-//			}
-//		}
-//		return set;
-//	}
-
+	/**
+	 * @deprecated use #IARCHIVE_WRAPPER
+	 */
 	protected ModuleFile getModuleFile() {
 		return (ModuleFile) getArchiveFile();
 	}
diff --git a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEUtilityJarImportOperationNew.java b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEUtilityJarImportOperationNew.java
index b384b3c..c4c4357 100644
--- a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEUtilityJarImportOperationNew.java
+++ b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEUtilityJarImportOperationNew.java
@@ -11,6 +11,8 @@
 package org.eclipse.jst.j2ee.application.internal.operations;
 
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.SaveStrategy;
+import org.eclipse.jst.j2ee.internal.archive.ComponentArchiveSaveAdapter;
+import org.eclipse.jst.j2ee.internal.archive.J2EEJavaComponentArchiveSaveAdapter;
 import org.eclipse.jst.j2ee.internal.archive.operations.J2EEArtifactImportOperation;
 import org.eclipse.jst.j2ee.internal.archive.operations.J2EEJavaComponentSaveStrategyImpl;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
@@ -28,6 +30,10 @@
 		super(dataModel);
 	}
 
+	protected ComponentArchiveSaveAdapter getArchiveSaveAdapter(IVirtualComponent virtualComponent){
+		return new J2EEJavaComponentArchiveSaveAdapter(virtualComponent);
+	}
+	
 	protected SaveStrategy createSaveStrategy(IVirtualComponent virtualComponent) {
 		J2EEJavaComponentSaveStrategyImpl saveStrat = new J2EEJavaComponentSaveStrategyImpl(virtualComponent);
 		return saveStrat;
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AvailableWebLibProvider.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AvailableWebLibProvider.java
index 31c24fb..d23afb7 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AvailableWebLibProvider.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AvailableWebLibProvider.java
@@ -17,8 +17,7 @@
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.ITableLabelProvider;
 import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.internal.archive.ArchiveWrapper;
 import org.eclipse.jst.j2ee.internal.wizard.AvailableJarsProvider;
 import org.eclipse.swt.graphics.Image;
 
@@ -28,8 +27,8 @@
 	}
 
 	public Object[] getElements(Object inputElement) {
-		if (inputElement instanceof WARFile) {
-			Object[] array = ((WARFile) inputElement).getLibArchives().toArray();
+		if (inputElement instanceof ArchiveWrapper) {
+			Object[] array = ((ArchiveWrapper) inputElement).getWebLibs().toArray();
 			Arrays.sort(array, new Comparator() {
 				public int compare(Object o1, Object o2) {
 					return getColumnText(o1, 0).compareTo(getColumnText(o2, 0));
@@ -46,8 +45,8 @@
 	}
 
 	public String getColumnText(Object element, int columnIndex) {
-		File file = (File) element;
-		return file.getName();
+		ArchiveWrapper wrapper = (ArchiveWrapper)element;
+		return wrapper.getName();
 	}
 
 	public void dispose() {
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentImportWebLibsPage.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentImportWebLibsPage.java
index bdd2472..7546b04 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentImportWebLibsPage.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentImportWebLibsPage.java
@@ -20,8 +20,8 @@
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
 import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.archive.ArchiveWrapper;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
 import org.eclipse.jst.j2ee.internal.wizard.J2EEImportPage;
@@ -48,7 +48,7 @@
 public class WebComponentImportWebLibsPage extends J2EEImportPage {
 	private Button deselectAllButton;
 	private Button selectAllButton;
-	protected WARFile warFile;
+	protected ArchiveWrapper archiveWrapper;
 	public CheckboxTableViewer availableJARsViewer;
 	public boolean utilJarSelectionChanged = false;
 
@@ -170,7 +170,7 @@
 
 	private void refreshEARFileIfNecessary() {
 		if (isEARFileChanged()) {
-			warFile = (WARFile) model.getProperty(IJ2EEComponentImportDataModelProperties.FILE);
+			archiveWrapper = (ArchiveWrapper) model.getProperty(IJ2EEComponentImportDataModelProperties.ARCHIVE_WRAPPER);
 			refresh();
 		}
 	}
@@ -184,11 +184,11 @@
 	}
 
 	private void refresh() {
-		availableJARsViewer.setInput(warFile);
+		availableJARsViewer.setInput(archiveWrapper);
 	}
 
 	public boolean isEARFileChanged() {
-		return warFile != model.getProperty(IJ2EEComponentImportDataModelProperties.FILE);
+		return archiveWrapper != model.getProperty(IJ2EEComponentImportDataModelProperties.ARCHIVE_WRAPPER);
 	}
 
 	protected void enter() {