diff --git a/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTests.java b/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTests.java
index ec02271..15b7def 100644
--- a/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTests.java
+++ b/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTests.java
@@ -131,7 +131,7 @@
 
 		final IVirtualFolder jsrc = component.getRootFolder().getFolder("/WEB-INF/classes");
 		jsrc.createLink(folder.getProjectRelativePath(), 0, null);
-
+		
 		J2EEComponentClasspathUpdater.getInstance().forceUpdate(Collections.singleton(component.getProject()));
 		IJobManager manager = Job.getJobManager(); 
 		Job [] jobs = manager.find(J2EEComponentClasspathUpdater.MODULE_UPDATE_JOB_NAME);
@@ -145,7 +145,7 @@
 				Logger.getLogger().log(e);
 			}
 		}
-		
+
 		IJavaProject javaProject = JavaCore.create(component.getProject());
 		IClasspathEntry[] entries = javaProject.getRawClasspath();
 		boolean foundImportedClasses = false;
@@ -372,7 +372,7 @@
 	 * AppClient to ensure they are pulled from the correct location (the utility jars in the EAR, or the expanded projects)
 	 * 
 	 */
-//	public void test149995_BinaryClaspathTest() throws Exception {	
+	public void test149995_BinaryClaspathTest() throws Exception {	
 //		int A = 1;
 //		int B = 2;
 //		int C = 4;
@@ -427,7 +427,7 @@
 //				Assert.assertTrue(cType instanceof BinaryType);
 //			}
 //		}
-//	}
+	}
 	
 	
 	public void test145031() throws Exception {
@@ -560,4 +560,4 @@
 		}
 	}
 	**/
-}
\ No newline at end of file
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/ProjectUtil.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/ProjectUtil.java
index 0e24409..4ff0389 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/ProjectUtil.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/ProjectUtil.java
@@ -11,19 +11,20 @@
 import org.eclipse.core.runtime.jobs.IJobChangeEvent;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
 import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
 import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
 import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
 import org.eclipse.jst.j2ee.project.facet.EARFacetProjectCreationDataModelProvider;
 import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
 import org.eclipse.jst.j2ee.project.facet.UtilityProjectCreationDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
 import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.DoNotUseMeThisWillBeDeletedPost15;
 import org.eclipse.wst.common.tests.OperationTestCase;
 
 /**
@@ -140,36 +141,40 @@
 
 	private static IDataModel getEARCreationDataModel(final String name) {
 		final IDataModel model =  DataModelFactory.createDataModel(new EARFacetProjectCreationDataModelProvider());
-		configure(model, name, J2EEProjectUtilities.ENTERPRISE_APPLICATION, null);
+		configure(model, name, J2EEProjectUtilities.ENTERPRISE_APPLICATION, null, J2EEVersionConstants.J2EE_1_4_ID);
 		return model;
 	}
 
 	
 	private static IDataModel getWebCreationDataModel(final String name, final String earName) {
 		final IDataModel model =  DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
-		configure(model, name, J2EEProjectUtilities.DYNAMIC_WEB, earName);
+		configure(model, name, J2EEProjectUtilities.DYNAMIC_WEB, earName, J2EEVersionConstants.SERVLET_2_4);
 		return model;
 	}
 		
 	private static IDataModel getUtilityCreationDataModel(final String name, final String earName) {
 		final IDataModel model =  DataModelFactory.createDataModel(new UtilityProjectCreationDataModelProvider());
-		configure(model, name, J2EEProjectUtilities.UTILITY, earName);
+		configure(model, name, J2EEProjectUtilities.UTILITY, earName, 0);
 		return model;
 	}
 	
 	private static IDataModel getEJBCreationDataModel(final String name, final String earName) {
 		final IDataModel model =  DataModelFactory.createDataModel(new EjbFacetProjectCreationDataModelProvider());
-		configure(model, name, J2EEProjectUtilities.EJB, earName);
+		configure(model, name, J2EEProjectUtilities.EJB, earName, J2EEVersionConstants.EJB_2_1_ID);
 		return model;
 	}
 	
-	private static void configure(final IDataModel model, final String name, final String facet, final String earName) {
+	private static void configure(final IDataModel model, final String name, final String facet, final String earName, final int facetVersion) {
 		model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, name);		
 		if (earName != null) {
 			final FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
 			final IDataModel facetDM = map.getFacetDataModel(facet);
 			facetDM.setBooleanProperty(IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR, true);
 			facetDM.setProperty(IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME, earName);
+			if (facetVersion != 0) {
+				String versionText = J2EEVersionUtil.getJ2EETextVersion(facetVersion);
+				facetDM.setStringProperty(IFacetDataModelProperties.FACET_VERSION_STR, versionText);
+			}
 		}
 	}
 
@@ -193,57 +198,11 @@
         }	
 		return null;
 	}
-	
-	
-	
-	/**
-	 * @deprecated do not use
-	 * 
-	 * @see DoNotUseMeThisWillBeDeletedPost15
-	 */
-	public static final int MAX_WAIT_TIME = 30000;
 
 	public static void waitForClasspathUpdate() {
 		DependencyVerificationUtil.waitForClasspathUpdate();
     }
 
-	/**
-	 * @deprecated do not use
-	 * 
-	 * @see DoNotUseMeThisWillBeDeletedPost15
-	 */
-	 public static void waitForClasspathUpdate(int maxWait) {
-        long startTime = System.currentTimeMillis();
-        listener.isDone = false;
-        int waitIncrement = 10;
-        final J2EEComponentClasspathUpdater updater = J2EEComponentClasspathUpdater.getInstance();
-        boolean updatesQueued = false;
-        for(int i=0;i<50 && !updatesQueued ; i++){
-            updatesQueued = updater.projectsQueued();
-            if(!updatesQueued){
-                try{
-                    Thread.sleep(waitIncrement);
-                } catch (InterruptedException e) {
-                    J2EEPlugin.getDefault().getLogger().logError(e);
-                }
-            }
-        }
-        if(!updatesQueued){
-            return;
-        }
-        
-        long totalTime = 0;
-        try {
-            while (!listener.isDone && totalTime < maxWait) {
-                Thread.sleep(waitIncrement);
-                totalTime = System.currentTimeMillis() - startTime;
-            }
-        } catch (InterruptedException e) {
-            //J2EEPlugin.getDefault().getLogger().logError(e);
-        }
-        waitForClasspathUpdate(maxWait- (int)(System.currentTimeMillis()-startTime));
-    }
-    
 	private static ClasspathUpdateJobListener listener = new ClasspathUpdateJobListener();
     
 	private static class ClasspathUpdateJobListener extends JobChangeAdapter {
@@ -262,5 +221,4 @@
 			}
 		}
     }
-}    
-
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/AllTests.java
index 8e95fbb..7cce045 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/AllTests.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/AllTests.java
@@ -23,10 +23,9 @@
     
     public AllTests(){
         super("EAR Tests");
-     //   addTest(EARExportOperationTest.suite());
-       //addTest(EARImportOperationTest.suite());
-     //   addTest(EARProjectCreationOperationTest.suite());
-       // addTest(EARComponentCreationTest.suite());
+        addTest(EARExportOperationTest.suite());
+       addTest(EARImportOperationTest.suite());
+        //addTest(EARProjectCreationOperationTest.suite());
     }
     
 }
diff --git a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
index 7ad4f89..eae3b29 100644
--- a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
+++ b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
@@ -6,33 +6,19 @@
  */
 package org.eclipse.wtp.j2ee.headless.tests.web.operations;
 
-import java.util.HashSet;
-import java.util.Set;
-
 import junit.framework.Assert;
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
-import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.common.project.facet.IJavaFacetInstallDataModelProperties;
-import org.eclipse.jst.common.project.facet.JavaFacetInstallDataModelProvider;
-import org.eclipse.jst.j2ee.internal.J2EEConstants;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
 import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
 import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
 import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
 import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
-import org.eclipse.jst.j2ee.web.project.facet.WebFacetInstallDataModelProvider;
 import org.eclipse.jst.j2ee.web.project.facet.WebFacetUtils;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
@@ -41,12 +27,6 @@
 import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
 import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action.Type;
-import org.eclipse.wst.project.facet.ProductManager;
 import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest;
 
 
@@ -101,69 +81,5 @@
 		Assert.assertTrue(proj.exists(new Path("/src444")));
 		
     }
-    public void testAddFacetToExisting() throws Exception {
-    	
-    	
-    	String projName = "TestExistingJavaProject";//$NON-NLS-1$
-		
-    	IProjectFacet javaFacet = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_JAVA);
-    	IProjectFacet webFacet = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEB_MODULE);
-    	IProjectFacetVersion java14 = javaFacet.getVersion("1.4"); //$NON-NLS-1$
-    	IProjectFacetVersion web24 = webFacet.getVersion("2.4"); //$NON-NLS-1$
-		// First create a java project/facet
-		IDataModel dm = DataModelFactory.createDataModel(new JavaFacetInstallDataModelProvider());
-		dm.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
-		String jVersion = "5.0";
-		dm.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, jVersion); //$NON-NLS-1$
-		dm.setStringProperty(IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME, "MySource"); //$NON-NLS-1$
-		IFacetedProject facetProj;
-		IProgressMonitor monitor = new NullProgressMonitor();
-		try {
-			facetProj = ProjectFacetsManager.create(dm.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME), null, monitor);
-			Set actions = new HashSet();
-			actions.add(new IFacetedProject.Action((Type) dm.getProperty(IFacetDataModelProperties.FACET_TYPE), (IProjectFacetVersion) dm.getProperty(IFacetDataModelProperties.FACET_VERSION), dm));
-			facetProj.modify(actions, monitor);
-		} catch (CoreException e) {
-			throw new ExecutionException(e.getMessage(), e);
-		}
-		IProject proj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
-		// Now add the web facet
-		IDataModel webFacetInstallDataModel = DataModelFactory.createDataModel(new WebFacetInstallDataModelProvider());
-		webFacetInstallDataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
-		webFacetInstallDataModel.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, "2.4");
-		webFacetInstallDataModel.setBooleanProperty(IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR,false);
-		webFacetInstallDataModel.setStringProperty(IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME,null);
-		try {
-			facetProj = ProjectFacetsManager.create(proj);
-			Set actions = new HashSet();
-			actions.add(new IFacetedProject.Action((Type) webFacetInstallDataModel.getProperty(IFacetDataModelProperties.FACET_TYPE), (IProjectFacetVersion) webFacetInstallDataModel.getProperty(IFacetDataModelProperties.FACET_VERSION), webFacetInstallDataModel));
-			facetProj.modify(actions, monitor);
-		} catch (CoreException e) {
-			throw new ExecutionException(e.getMessage(), e);
-		}
-		
-
-		// Test if op worked
-		
-		WebArtifactEdit web = WebArtifactEdit.getWebArtifactEditForRead(proj);
-		Assert.assertNotNull(web);
-		if (web != null)
-		Assert.assertNotNull(web.getWebApp());
-		
-		// Make sure single root is used
-		if (ProductManager.shouldUseSingleRootStructure()) { 
-			IJavaProject jproj = JavaCore.create(proj);
-			IPath currentDefaultOutput = null;
-			try {
-				currentDefaultOutput = jproj.getOutputLocation();
-			} catch (JavaModelException e1) {
-				// TODO Auto-generated catch block
-				e1.printStackTrace();
-			}
-			Assert.assertTrue(currentDefaultOutput.toString().indexOf(J2EEConstants.WEB_INF_CLASSES) != -1);
-		}
-		
-		
-    }
     
 }
