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 d0e8219..c60a8bf 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
@@ -332,7 +332,7 @@
 
 		Thread.sleep(5000);
 
-		String earOutputName = "d:\\temp\\Output" + System.currentTimeMillis() + ".ear";
+		String earOutputName = "c:\\temp\\Output" + System.currentTimeMillis() + ".ear";
 		IDataModel export = DataModelFactory.createDataModel(new EARComponentExportDataModelProvider());
 		export.setProperty(IEARComponentExportDataModelProperties.PROJECT_NAME, comp.getProject().getName());
 		export.setProperty(IEARComponentExportDataModelProperties.ARCHIVE_DESTINATION, earOutputName);
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE6ModelTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE6ModelTest.java
index f4a6bc1..38f9e69 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE6ModelTest.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE6ModelTest.java
@@ -45,8 +45,10 @@
 import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences.Keys;
 import org.eclipse.jst.j2ee.jca.project.facet.IConnectorFacetInstallDataModelProperties;
 import org.eclipse.jst.j2ee.project.facet.IAppClientFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
 import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
 import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
 import org.eclipse.jst.javaee.application.Application;
@@ -58,7 +60,9 @@
 import org.eclipse.jst.javaee.jca.Connector;
 import org.eclipse.jst.javaee.jca.internal.util.JcaResourceImpl;
 import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.javaee.web.WebFragment;
 import org.eclipse.jst.javaee.web.internal.util.WebResourceImpl;
+import org.eclipse.jst.javaee.webfragment.internal.util.WebfragmentResourceImpl;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
@@ -72,7 +76,9 @@
 import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
 import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
 import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
 import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.webfragment.operations.WebFragmentProjectCreationOperationTest;
 
 public class JEE6ModelTest extends GeneralEMFPopulationTest {
 	
@@ -307,6 +313,27 @@
 
 }
 
+public void testWebFragmentModel() throws Exception {
+	
+	String projName = "TestEE6WebFragmentProject";//$NON-NLS-1$
+	createWebfragmentProject(projName);
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.WEBFRAGMENT_DD_URI;
+	URI uri = URI.createURI( "src/" + modelPathURI);
+	ProjectResourceSet resSet = getResourceSet(projName);
+	
+	WebfragmentResourceImpl webRes = (WebfragmentResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(webRes.getContents().size() > 0);
+	
+	if (webRes.getContents().size() > 0) {
+		WebFragment fragment = webRes.getWebFragment();
+		populateRoot((EObjectImpl)fragment);
+		webRes.save(null);
+	}
+
+}
+
 	private ProjectResourceSet getResourceSet(String projName) {
 		IProject proj = getProject(projName);
 		return (ProjectResourceSet)WorkbenchResourceHelperBase.getResourceSet(proj);
@@ -325,6 +352,23 @@
 			return webProj;
 		
 	}
+	private IProject createWebfragmentProject(String projName) throws ExecutionException {
+		
+		String webFragmentVersionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.WEBFRAGMENT_3_0_ID);
+		IProjectFacet javaFacet = ProjectFacetsManager.getProjectFacet(IJ2EEFacetConstants.JAVA);
+		IDataModel javaFacetModel = DataModelFactory.createDataModel(new JavaFacetInstallDataModelProvider());
+		javaFacetModel.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projName);
+    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_6);
+		javaFacetModel.setProperty(IJavaFacetInstallDataModelProperties.DEFAULT_OUTPUT_FOLDER_NAME,
+				J2EEPlugin.getDefault().getJ2EEPreferences().getString(Keys.DYN_WEB_OUTPUT_FOLDER) );
+		javaFacetModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		IProjectFacet webFragmentFacet = ProjectFacetsManager.getProjectFacet(IJ2EEFacetConstants.WEBFRAGMENT);
+		IProjectFacetVersion webFragmentFacetVersion = webFragmentFacet.getVersion(webFragmentVersionString);
+		IDataModel dataModel = WebFragmentProjectCreationOperationTest.getWebFragmentDataModel(projName, null, null, webFragmentFacetVersion, true);
+		dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		IProject webFragmentProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return webFragmentProj;	
+	}
 	private IProject createEjbProject(String projName) throws ExecutionException {
 		IDataModel dataModel = DataModelFactory.createDataModel(IEjbFacetInstallDataModelProperties.class);
 		String versionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.EJB_3_1_ID);
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java
index 3af1726..287f332 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java
@@ -45,4 +45,7 @@
 	public static final IProjectFacetVersion JAVA_14 = JAVA_FACET.getVersion("1.4"); //$NON-NLS-1$
 	public static final IProjectFacetVersion JAVA_5 = JAVA_FACET.getVersion("5.0"); //$NON-NLS-1$
 	public static final IProjectFacetVersion JAVA_6 = JAVA_FACET.getVersion("6.0"); //$NON-NLS-1$
+
+	public static final IProjectFacet WEBFRAGMENT_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEBFRAGMENT_MODULE);
+	public static final IProjectFacetVersion WEBFRAGMENT_30 = WEBFRAGMENT_FACET.getVersion("3.0"); //$NON-NLS-1$
 }
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/webfragment/operations/WebFragmentProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/webfragment/operations/WebFragmentProjectCreationOperationTest.java
new file mode 100644
index 0000000..44a0950
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/webfragment/operations/WebFragmentProjectCreationOperationTest.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.wtp.j2ee.headless.tests.webfragment.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.web.project.facet.WebFragmentFacetInstallDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest;
+
+
+public class WebFragmentProjectCreationOperationTest extends ModuleProjectCreationOperationTest {
+    
+	public WebFragmentProjectCreationOperationTest() {
+		super("WebProjectCreationOperationTests");
+	}
+	
+	public WebFragmentProjectCreationOperationTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		return new SimpleTestSuite(WebFragmentProjectCreationOperationTest.class);
+    }
+	
+	public void testWeb30_Defaults() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("badWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedContentDir() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("madWeb", "madContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("booWeb", null, "booSrc", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("eeWeb", "contentEE", "srcTry", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_Defaults_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("badWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("herWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("madWeb", "madContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("booWeb", null, "booSrc", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("pinkWeb", "pinkContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedContextRoot_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("veryfarWeb", null, "verybadSrc", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("eeWeb", "contentEE", "srcTry", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("iiWeb", "iiContDir", "srgII", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_Defaults_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("badWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("herWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("madWeb", "madContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("pinkWeb", "tryContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("farawayWeb", null, "farSrc", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("eeWeb", "contentE", "srcTry", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_Defaults_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("badWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("herWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("madWeb", "madContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("booWeb", null, "booSrc", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("pinkWeb", "pinkContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("veryfarWeb", null, "verybadSrc", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("eeWeb", "contentEE", "srcTry", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("iiWeb", "iiContDir", "srgII", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+    /**
+     * Creates and returns a Web Fragment Data Model with the given name and of the given version.
+     * Can also be used to specify none default context root, content directory, and/or
+     * the java source directory.
+     * If earName is not null then Web will be added to the EAR with earName, and if appropriate
+     * with or without a deployment descriptor.
+     * 
+     * @param projName name of the project to create
+     * @param contentDir the content directory to use for this project, use default if NULL
+     * @param javaSrcDir the java source directory to use for this project, use default if NULL
+     * @param version version of Web to use
+     * @param createDD - if true then create DD else don't
+     * @return a Web Fragment Data Model with the appropriate properties set
+     */
+    public static IDataModel getWebFragmentDataModel(String projName, String contentDir, String javaSrcDir, IProjectFacetVersion version, boolean createDD){
+    	IDataModel dm = DataModelFactory.createDataModel(new WebFragmentFacetInstallDataModelProvider());
+    	dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projName);
+    	dm.setProperty(IFacetDataModelProperties.FACET_VERSION, version);
+
+    	//if no contentDir provided use default
+    	if(contentDir != null) {
+    		dm.setStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER, contentDir);
+    	}
+    	
+    	//if no javaSrcDir provided use default
+    	if(javaSrcDir != null) {
+    		dm.setStringProperty(IWebFacetInstallDataModelProperties.SOURCE_FOLDER, javaSrcDir);
+    	}
+    	
+    	dm.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, createDD);
+    	
+/* does the Java version get set correctly?
+    	if(version.equals(JavaEEFacetConstants.WEBFRAGMENT_30))    	{
+    		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+	    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_6);
+    	}
+    	else{    		
+            IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+            javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_5);
+    	}
+*/
+    	
+    	return dm;
+    }
+}
