diff --git a/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/ConnectorComponentCreationWizard.java b/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/ConnectorComponentCreationWizard.java
index 2c82c09..4bb3294 100644
--- a/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/ConnectorComponentCreationWizard.java
+++ b/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/ConnectorComponentCreationWizard.java
@@ -13,13 +13,15 @@
 import org.eclipse.core.runtime.IExecutableExtension;
 import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
 import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentCreationDataModel;
-import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentCreationOperation;
+import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentCreationDataModelProvider;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
+import org.eclipse.jst.j2ee.internal.wizard.J2EEArtifactCreationWizard;
 import org.eclipse.jst.j2ee.internal.wizard.J2EEComponentCreationWizard;
 import org.eclipse.jst.j2ee.jca.ui.internal.util.JCAUIMessages;
 import org.eclipse.ui.INewWizard;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
 import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
 
 /** 
@@ -54,7 +56,7 @@
 	 * </p>
 	 * @param model The model parameter is used to pre-populate wizard controls and interface with the operation
 	 */
-	public ConnectorComponentCreationWizard(J2EEComponentCreationDataModel model) {
+	public ConnectorComponentCreationWizard(IDataModel model) {
 		super(model);
 	}
 	
@@ -73,20 +75,6 @@
 		aModel.setBooleanProperty(J2EEComponentCreationDataModel.ADD_TO_EAR, true);
 		return aModel;
 	}
-	
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * <p>
-	 * Overridden to return a {@link ConnectorProjectCreationOperation}. 
-	 * </p>
-	 * 
-	 * @return Returns the specific operation for the creation of J2EE Connector modules
-	 */
-	protected final WTPOperation createBaseOperation() {
-		return new ConnectorComponentCreationOperation(getSpecificDataModel());
-	}
-	
 	/** 
 	 * {@inheritDoc}   
 	 * 
@@ -109,22 +97,11 @@
 	 * </p>
 	 */
 	public void doAddPages() {
-		addPage(new ConnectorComponentCreationWizardPage(getSpecificDataModel(), MAIN_PG));
+		addPage(new ConnectorComponentCreationWizardPage(getDataModel(), MAIN_PG));
 		super.doAddPages();
 	}
 
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.extensions.ExtendableWizard#getWizardID()
-	 */
-	public String getWizardID() {
-		return WIZARD_ID; 
-	} 
- 
-
-	private ConnectorComponentCreationDataModel getSpecificDataModel() {
-		return (ConnectorComponentCreationDataModel) getModel();
-	}
-
+    protected IDataModelProvider getDefaultProvider() {
+        return new ConnectorComponentCreationDataModelProvider();
+    }
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/ConnectorComponentCreationWizardPage.java b/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/ConnectorComponentCreationWizardPage.java
index 07ddc5d..0a8d92f 100644
--- a/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/ConnectorComponentCreationWizardPage.java
+++ b/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/ConnectorComponentCreationWizardPage.java
@@ -10,15 +10,12 @@
  *******************************************************************************/
 package org.eclipse.jst.j2ee.jca.ui.internal.wizard;
 
-import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
 import org.eclipse.jst.j2ee.internal.actions.IJ2EEUIContextIds;
-import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentCreationDataModel;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
 import org.eclipse.jst.j2ee.internal.wizard.J2EEComponentCreationWizardPage;
 import org.eclipse.jst.j2ee.jca.ui.internal.util.JCAUIMessages;
-import org.eclipse.wst.common.componentcore.internal.operation.ComponentCreationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 
 public class ConnectorComponentCreationWizardPage extends J2EEComponentCreationWizardPage {
 
@@ -26,7 +23,7 @@
 	 * @param model
 	 * @param pageName
 	 */
-	public ConnectorComponentCreationWizardPage(ConnectorComponentCreationDataModel model, String pageName) {
+	public ConnectorComponentCreationWizardPage(IDataModel model, String pageName) {
 		super(model, pageName);
 		setTitle(JCAUIMessages.getResourceString(JCAUIMessages.JCA_MODULE_MAIN_PG_TITLE));
 		setDescription(JCAUIMessages.getResourceString(JCAUIMessages.JCA_MODULE_MAIN_PG_DESC));
@@ -38,7 +35,7 @@
 	}
 	//TODO: utility to handle additions
 	protected String[] getValidationPropertyNames() {
-		return new String[]{ComponentCreationDataModel.PROJECT_NAME, ComponentCreationDataModel.COMPONENT_NAME, ComponentCreationDataModel.COMPONENT_VERSION, WTPOperationDataModel.NESTED_MODEL_VALIDATION_HOOK, J2EEComponentCreationDataModel.ADD_TO_EAR};
+		return new String[]{PROJECT_NAME, COMPONENT_NAME, COMPONENT_VERSION, ADD_TO_EAR};
 	}
 
 	/**
diff --git a/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/RARImportPage.java b/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/RARImportPage.java
index f2fec38..2abf455 100644
--- a/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/RARImportPage.java
+++ b/plugins/org.eclipse.jst.j2ee.jca.ui/jca_ui/org/eclipse/jst/j2ee/jca/ui/internal/wizard/RARImportPage.java
@@ -19,7 +19,6 @@
 import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
 import org.eclipse.jst.j2ee.application.internal.operations.J2EEModuleImportDataModel;
 import org.eclipse.jst.j2ee.internal.actions.IJ2EEUIContextIds;
-import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentCreationDataModel;
 import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorModuleImportDataModel;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
@@ -27,7 +26,6 @@
 import org.eclipse.jst.j2ee.internal.wizard.J2EEModuleImportPage;
 import org.eclipse.jst.j2ee.jca.ui.internal.util.JCAUIMessages;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPWizard;
 
 
 /**
@@ -70,10 +68,6 @@
 		return getJCADataModel().getJ2eeArtifactCreationDataModel();
 	}
 
-	protected WTPWizard getNewProjectWizard(ConnectorComponentCreationDataModel aModel) {
-		return new ConnectorComponentCreationWizard(aModel);
-	}
-
 	protected String getFileNamesStoreID() {
 		return IConnectorNatureConstants.NATURE_ID;
 	}
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientComponentCreationWizard.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientComponentCreationWizard.java
index b1509b4..516e187 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientComponentCreationWizard.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientComponentCreationWizard.java
@@ -7,14 +7,13 @@
 package org.eclipse.jst.j2ee.internal.wizard;
 
 import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationDataModel;
-import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationOperation;
+import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationDataModelProvider;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
 import org.eclipse.ui.INewWizard;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
 
 public class AppClientComponentCreationWizard extends J2EEComponentCreationWizard implements IExecutableExtension, INewWizard {
 	
@@ -43,38 +42,10 @@
 	 * </p>
 	 * @param model The model parameter is used to pre-populate wizard controls and interface with the operation
 	 */
-	public AppClientComponentCreationWizard(AppClientComponentCreationDataModel model) {
+	public AppClientComponentCreationWizard(IDataModel model) {
 		super(model);
 	}
 
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * <p>
-	 * Overridden to return a {@link WebProjectCreationDataModel} and defaults
-	 * the value of {@link J2EEModuleCreationDataModelOld#ADD_TO_EAR} to <b>true</b>
-	 * </p>
-	 * 
-	 * @return Returns the specific operation data model for the creation of J2EE Web modules
-	 */
-	protected WTPOperationDataModel createDefaultModel() {
-		AppClientComponentCreationDataModel aModel = new AppClientComponentCreationDataModel();
-		return aModel;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * <p>
-	 * Overridden to return an {@link WebProjectCreationOperation}. 
-	 * </p>
-	 * 
-	 * @return Returns the specific operation for the creation of J2EE Web modules
-	 */
-	protected WTPOperation createBaseOperation() {
-		return new AppClientComponentCreationOperation(getSpecificDataModel());
-	}
-
 	/** 
 	 * {@inheritDoc}   
 	 * 
@@ -97,22 +68,13 @@
 	 * </p>
 	 */
 	protected void doAddPages() {
-		AppClientComponentCreationWizardPage page1 = new AppClientComponentCreationWizardPage(getSpecificDataModel(), MAIN_PG);
+		AppClientComponentCreationWizardPage page1 = new AppClientComponentCreationWizardPage(getDataModel(), MAIN_PG);
 		addPage(page1);
 		super.doAddPages();
-	} 
-	
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.extensions.ExtendableWizard#getWizardID()
-	 */
-	public String getWizardID() {
-		return WIZARD_ID;
-	} 
-	
-	private AppClientComponentCreationDataModel getSpecificDataModel() {
-		return (AppClientComponentCreationDataModel) getModel();
 	}
 
+    protected IDataModelProvider getDefaultProvider() {
+        return new AppClientComponentCreationDataModelProvider();
+    } 
+
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientComponentCreationWizardPage.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientComponentCreationWizardPage.java
index 162123f..c83ab33 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientComponentCreationWizardPage.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientComponentCreationWizardPage.java
@@ -6,16 +6,13 @@
  */
 package org.eclipse.jst.j2ee.internal.wizard;
 
-import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
-import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationDataModel;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.common.componentcore.internal.operation.ComponentCreationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 
 public class AppClientComponentCreationWizardPage extends J2EEComponentCreationWizardPage {
 
@@ -29,7 +26,7 @@
 	 * @param model
 	 * @param pageName
 	 */
-	public AppClientComponentCreationWizardPage(AppClientComponentCreationDataModel  model, String pageName) {
+	public AppClientComponentCreationWizardPage(IDataModel model, String pageName) {
 		super(model, pageName);
 		setTitle(J2EEUIMessages.getResourceString(J2EEUIMessages.APPCLIENT_COMPONENT_MAIN_PG_TITLE));
 		setDescription(J2EEUIMessages.getResourceString(J2EEUIMessages.APPCLIENT_COMPONENT_MAIN_PG_DESC));
@@ -47,18 +44,13 @@
 	}
 
 	private void createAnnotationsGroup(Composite parent) {
-		annotationsGroup = new AnnotationsStandaloneGroup(parent, getJ2EEModuleCreationDataModel(), false);
+		//annotationsGroup = new AnnotationsStandaloneGroup(parent, getJ2EEModuleCreationDataModel(), false);
 	}
 
 	//TODO: utility to handle additions
 	protected String[] getValidationPropertyNames() {
-		return new String[]{
-				ComponentCreationDataModel.PROJECT_NAME, 
-				ComponentCreationDataModel.COMPONENT_NAME, 
-				ComponentCreationDataModel.COMPONENT_VERSION, 
-				WTPOperationDataModel.NESTED_MODEL_VALIDATION_HOOK, 
-				J2EEComponentCreationDataModel.ADD_TO_EAR};
-	}
+        return new String[] { PROJECT_NAME, COMPONENT_NAME, COMPONENT_VERSION, ADD_TO_EAR };
+    }
 
 	public void dispose() {
 		super.dispose();
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientImportPage.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientImportPage.java
index c0fc3f0..9b5bfe0 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientImportPage.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/AppClientImportPage.java
@@ -18,7 +18,6 @@
 
 import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
 import org.eclipse.jst.j2ee.application.internal.operations.J2EEModuleImportDataModel;
-import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationDataModel;
 import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientModuleImportDataModel;
 import org.eclipse.jst.j2ee.applicationclient.internal.creation.IApplicationClientNatureConstants;
 import org.eclipse.jst.j2ee.internal.actions.IJ2EEUIContextIds;
@@ -26,7 +25,6 @@
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPWizard;
 
 /**
  * @author cbridgha
@@ -82,10 +80,6 @@
 		return getAppClientDataModel().getJ2eeArtifactCreationDataModel();
 	}
 
-	protected WTPWizard getNewProjectWizard(AppClientComponentCreationDataModel aModel) {
-		return new AppClientComponentCreationWizard(aModel);
-	}
-
 	private AppClientModuleImportDataModel getAppClientDataModel() {
 		return (AppClientModuleImportDataModel) model;
 	}
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/DataModelAnnotationsStandaloneGroup.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/DataModelAnnotationsStandaloneGroup.java
new file mode 100644
index 0000000..6de8b22
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/DataModelAnnotationsStandaloneGroup.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004, 2005 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.wizard;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.application.internal.operations.IAnnotationsDataModel;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
+
+public class DataModelAnnotationsStandaloneGroup {
+
+    protected IDataModel model;
+    protected DataModelSynchHelper synchHelper;
+    protected Button useAnnotations;
+    private boolean isForBean;
+    private boolean useServletString = false;
+
+    public static final String EJBTAGSET = "ejb"; //$NON-NLS-1$
+    public static boolean shouldBeanDefaultUseAnnotations = false;
+    public static boolean shouldProjectDefaultUseAnnotations = false;
+
+
+    private class CheckboxSelectionListener implements SelectionListener {
+        public void widgetSelected(SelectionEvent e) {
+            Button button = (Button) e.getSource();
+            if (isForBean)
+                shouldBeanDefaultUseAnnotations = button.getSelection();
+            else
+                shouldProjectDefaultUseAnnotations = button.getSelection();
+        }
+
+        public void widgetDefaultSelected(SelectionEvent e) {
+            //do nothing
+        }
+    }
+
+    private CheckboxSelectionListener checkboxSelectionListener = new CheckboxSelectionListener();
+
+    /**
+     * Constructor
+     */
+    public DataModelAnnotationsStandaloneGroup(Composite parent, IDataModel model, boolean forBean, DataModelSynchHelper syncHelp) {
+        this(parent, model, forBean, false, syncHelp);
+    }
+
+    /**
+     * Constructor
+     */
+    public DataModelAnnotationsStandaloneGroup(Composite parent, IDataModel model, boolean forBean, boolean useServlet, DataModelSynchHelper syncHelp) {
+        super();
+        this.model = model;
+        this.isForBean = forBean;
+        this.useServletString = useServlet;
+        synchHelper = syncHelp;
+        buildComposites(parent);
+    }
+
+    /**
+     * @param parent
+     */
+    protected void buildComposites(Composite parent) {
+        // Add separator
+        Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
+        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+        gd.horizontalSpan = 3;
+        separator.setLayoutData(gd);
+        // Add spacer
+        Label spacer = new Label(parent, SWT.NONE);
+        GridData gd1 = new GridData(GridData.FILL_HORIZONTAL);
+        gd1.horizontalSpan = 3;
+        spacer.setLayoutData(gd1);
+        // Add annotations checkbox and label
+        useAnnotations = new Button(parent, SWT.CHECK);
+        String labelText;
+        if (useServletString)
+            labelText = J2EEUIMessages.getResourceString(J2EEUIMessages.USE_ANNOTATIONS_SERVLET);
+        else if (isForBean)
+            labelText = J2EEUIMessages.getResourceString(J2EEUIMessages.USE_ANNOTATIONS);
+        else
+            labelText = J2EEUIMessages.getResourceString(J2EEUIMessages.ADD_ANNOTATIONS_SUPPORT);
+        useAnnotations.setText(labelText);
+        synchHelper.synchCheckbox(useAnnotations, IAnnotationsDataModel.USE_ANNOTATIONS, null);
+        useAnnotations.addSelectionListener(checkboxSelectionListener);
+        GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
+        gd2.horizontalSpan = 2;
+        useAnnotations.setLayoutData(gd2);
+        // If for project, set the global annotations supported
+        if (!isForBean)
+            setEnablement(null);
+    }
+
+    public void dispose() {
+        model.removeListener(synchHelper);
+        synchHelper = null;
+        model = null;
+    }
+
+    public boolean isAnnotationsSupported(IProject project) {
+        //TODO clean up to be module based, not project based
+        try {
+            //          if (isForBean) {
+            //              AnnotationsController controller =
+            // AnnotationsControllerManager.INSTANCE.getAnnotationsController(project);
+            //              return (controller !=null && controller.isTagHandlerInstalled(EJBTAGSET));
+            //          }
+//          J2EEModuleNature nature = null;
+//          if (project != null && project.hasNature(IWebNatureConstants.J2EE_NATURE_ID))
+//              nature = (J2EEModuleNature) project.getNature(IWebNatureConstants.J2EE_NATURE_ID);
+//          else if (project != null && project.hasNature(IEJBNatureConstants.NATURE_ID))
+//              nature = (J2EEModuleNature) project.getNature(IEJBNatureConstants.NATURE_ID);
+//
+//          if (!isForBean || (nature != null && nature.getJ2EEVersion() > J2EEVersionConstants.VERSION_1_2))
+                return true;
+//          return false;
+        } catch (Throwable t) {
+            t.printStackTrace();
+            return false;
+        }
+    }
+
+    public void setEnablement(IProject project) {
+        //TODO
+        //boolean isEnabled = isAnnotationsSupported(project);
+        useAnnotations.setEnabled(true);
+//      if (!isEnabled || (!isForBean && !shouldProjectDefaultUseAnnotations) || (isForBean && !shouldBeanDefaultUseAnnotations)) {
+//          useAnnotations.setSelection(false);
+//          model.setProperty(IAnnotationsDataModel.USE_ANNOTATIONS, Boolean.FALSE);
+//      } else {
+//          useAnnotations.setSelection(true);
+//          model.setProperty(IAnnotationsDataModel.USE_ANNOTATIONS, Boolean.TRUE);
+//      }
+    }
+
+    public void setUseServlet(boolean aBoolean) {
+        useServletString = aBoolean;
+    }
+    
+    public void setUseAnnotations(boolean aBoolean) {
+        if (useAnnotations != null) {
+            useAnnotations.setSelection(aBoolean);
+            model.setProperty(IAnnotationsDataModel.USE_ANNOTATIONS, new Boolean(aBoolean));
+        }
+    }
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationSecondPage.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationSecondPage.java
index 495d547..ba48e96 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationSecondPage.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationSecondPage.java
@@ -19,8 +19,8 @@
 import org.eclipse.jface.viewers.TableLayout;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.jst.j2ee.application.internal.operations.AddArchiveProjectsToEARDataModel;
+import org.eclipse.jst.j2ee.datamodel.properties.IEarComponentCreationDataModelProperties;
 import org.eclipse.jst.j2ee.internal.earcreation.DefaultJ2EEComponentCreationDataModel;
-import org.eclipse.jst.j2ee.internal.earcreation.EARComponentCreationDataModel;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
@@ -30,7 +30,8 @@
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Event;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPWizardPage;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
 
 /**
  * @author jialin
@@ -38,7 +39,7 @@
  * TODO To change the template for this generated type comment go to
  * Window - Preferences - Java - Code Style - Code Templates
  */
-public class EARComponentCreationSecondPage extends WTPWizardPage {
+public class EARComponentCreationSecondPage extends DataModelWizardPage implements IEarComponentCreationDataModelProperties{
 	private Button selectAllButton;
 	private Button deselectAllButton;
 	private Button newModuleButton;
@@ -48,7 +49,7 @@
 	 * @param model
 	 * @param pageName
 	 */
-	public EARComponentCreationSecondPage(EARComponentCreationDataModel  model, String pageName) {
+	public EARComponentCreationSecondPage(IDataModel  model, String pageName) {
 		super(model, pageName);
 		setTitle(J2EEUIMessages.getResourceString(J2EEUIMessages.EAR_COMPONENT_SECOND_PG_TITLE));
 		setDescription(J2EEUIMessages.getResourceString(J2EEUIMessages.EAR_COMPONENT_SECOND_PG_DESC));
@@ -87,7 +88,7 @@
 		gData.widthHint = 200;
 		gData.heightHint = 80;
 		moduleProjectsViewer.getControl().setLayoutData(gData);
-		int j2eeVersion = getModel().getIntProperty(EARComponentCreationDataModel.COMPONENT_VERSION);
+		int j2eeVersion = getDataModel().getIntProperty(COMPONENT_VERSION);
 		AvailableJ2EEComponentsContentProvider provider = new AvailableJ2EEComponentsContentProvider(j2eeVersion);
 		moduleProjectsViewer.setContentProvider(provider);
 		moduleProjectsViewer.setLabelProvider(new J2EEComponentLabelProvider());
@@ -95,7 +96,7 @@
 		moduleProjectsViewer.addCheckStateListener(new ICheckStateListener() {
 			public void checkStateChanged(CheckStateChangedEvent event) {
 				if (!ignoreCheckedState) {
-					((EARComponentCreationDataModel)getModel()).setProperty(EARComponentCreationDataModel.J2EE_COMPONENT_LIST, getCheckedElementsAsList());
+					(getDataModel()).setProperty(J2EE_COMPONENT_LIST, getCheckedElementsAsList());
 				}
 			}
 		});
@@ -189,13 +190,13 @@
 	private DefaultJ2EEComponentCreationDataModel createNewModuleModel() {
 		DefaultJ2EEComponentCreationDataModel defaultModel = new DefaultJ2EEComponentCreationDataModel();
 		// transfer properties, project name
-		String projectName = model.getStringProperty(EARComponentCreationDataModel.PROJECT_NAME);
+		String projectName = model.getStringProperty(PROJECT_NAME);
 		defaultModel.setProperty(DefaultJ2EEComponentCreationDataModel.PROJECT_NAME, projectName);
 		// ear component name
-		String earName = model.getStringProperty(EARComponentCreationDataModel.COMPONENT_NAME);
+		String earName = model.getStringProperty(COMPONENT_NAME);
 		defaultModel.setProperty(DefaultJ2EEComponentCreationDataModel.EAR_COMPONENT_NAME, earName);
 		// ear j2ee version
-		int j2eeVersion = model.getIntProperty(EARComponentCreationDataModel.COMPONENT_VERSION);
+		int j2eeVersion = model.getIntProperty(COMPONENT_VERSION);
 		defaultModel.setProperty(DefaultJ2EEComponentCreationDataModel.J2EE_VERSION, new Integer(j2eeVersion));
 		return defaultModel;
 	}
@@ -207,7 +208,7 @@
 		ignoreCheckedState = true;
 		try {
 			moduleProjectsViewer.setAllChecked(false);
-			((EARComponentCreationDataModel)getModel()).setProperty(EARComponentCreationDataModel.J2EE_COMPONENT_LIST, null);
+			getDataModel().setProperty(J2EE_COMPONENT_LIST, null);
 		} finally {
 			ignoreCheckedState = false;
 		}
@@ -220,7 +221,7 @@
 		ignoreCheckedState = true;
 		try {
 			moduleProjectsViewer.setAllChecked(true);
-			((EARComponentCreationDataModel)getModel()).setProperty(EARComponentCreationDataModel.J2EE_COMPONENT_LIST, getCheckedElementsAsList());
+			getDataModel().setProperty(J2EE_COMPONENT_LIST, getCheckedElementsAsList());
 		} finally {
 			ignoreCheckedState = false;
 		}
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationWizard.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationWizard.java
index b54d277..ae6229f 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationWizard.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationWizard.java
@@ -7,13 +7,14 @@
 package org.eclipse.jst.j2ee.internal.wizard;
 
 import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.jst.j2ee.application.internal.operations.EARComponentCreationOperation;
 import org.eclipse.jst.j2ee.internal.earcreation.EARComponentCreationDataModel;
+import org.eclipse.jst.j2ee.internal.earcreation.EarComponentCreationDataModelProvider;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
 import org.eclipse.ui.INewWizard;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
 import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
 
 public class EARComponentCreationWizard extends J2EEComponentCreationWizard implements IExecutableExtension, INewWizard {
@@ -45,7 +46,7 @@
 	 * </p>
 	 * @param model The model parameter is used to pre-populate wizard controls and interface with the operation
 	 */
-	public EARComponentCreationWizard(EARComponentCreationDataModel model) {
+	public EARComponentCreationWizard(IDataModel model) {
 		super(model);
 	}
 
@@ -63,20 +64,6 @@
 		EARComponentCreationDataModel aModel = new EARComponentCreationDataModel();
 		return aModel;
 	}
-	
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * <p>
-	 * Overridden to return an {@link WebProjectCreationOperation}. 
-	 * </p>
-	 * 
-	 * @return Returns the specific operation for the creation of J2EE Web modules
-	 */
-	protected WTPOperation createBaseOperation() {
-		return new EARComponentCreationOperation(getSpecificDataModel());
-	}
-
 	/** 
 	 * {@inheritDoc}   
 	 * 
@@ -99,25 +86,16 @@
 	 * </p>
 	 */
 	protected void doAddPages() {
-		EARComponentCreationWizardPage page1 = new EARComponentCreationWizardPage(getSpecificDataModel(), MAIN_PG);
+		EARComponentCreationWizardPage page1 = new EARComponentCreationWizardPage(getDataModel(), MAIN_PG);
 //		page.setInfopopID("org.eclipse.jst.j2ee.ui.webw1000"); //$NON-NLS-1$
 		addPage(page1);
-		EARComponentCreationSecondPage page2 = new EARComponentCreationSecondPage(getSpecificDataModel(), SECOND_PG);
+		EARComponentCreationSecondPage page2 = new EARComponentCreationSecondPage(getDataModel(), SECOND_PG);
 		addPage(page2);
 		super.doAddPages();
-	} 
-	
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.extensions.ExtendableWizard#getWizardID()
-	 */
-	public String getWizardID() {
-		return WIZARD_ID;
-	} 
-	
-	private EARComponentCreationDataModel getSpecificDataModel() {
-		return (EARComponentCreationDataModel) getModel();
 	}
 
+    protected IDataModelProvider getDefaultProvider() {
+        return new EarComponentCreationDataModelProvider();
+        
+    } 
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationWizardPage.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationWizardPage.java
index b38e4b8..a2ad1ac 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationWizardPage.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARComponentCreationWizardPage.java
@@ -6,13 +6,11 @@
  */
 package org.eclipse.jst.j2ee.internal.wizard;
 
-import org.eclipse.jst.j2ee.internal.earcreation.EARComponentCreationDataModel;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.common.componentcore.internal.operation.ComponentCreationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 
 public class EARComponentCreationWizardPage extends J2EEComponentCreationWizardPage {
 
@@ -22,7 +20,7 @@
 	 * @param model
 	 * @param pageName
 	 */
-	public EARComponentCreationWizardPage(EARComponentCreationDataModel  model, String pageName) {
+	public EARComponentCreationWizardPage(IDataModel model, String pageName) {
 		super(model, pageName);
 		setTitle(J2EEUIMessages.getResourceString(J2EEUIMessages.EAR_COMPONENT_MAIN_PG_TITLE));
 		setDescription(J2EEUIMessages.getResourceString(J2EEUIMessages.EAR_COMPONENT_MAIN_PG_DESC));
@@ -37,18 +35,11 @@
 	protected void addToAdvancedComposite(Composite advanced) {
 		super.addToAdvancedComposite(advanced);
 	}
-	
-	EARComponentCreationDataModel getEARProjectCreationDataModel() {
-		return (EARComponentCreationDataModel) model;
-	}
 
 	//TODO: utility to handle additions
 	protected String[] getValidationPropertyNames() {
-		return new String[]{ComponentCreationDataModel.PROJECT_NAME, 
-				ComponentCreationDataModel.COMPONENT_NAME, 
-				ComponentCreationDataModel.COMPONENT_VERSION, 
-				WTPOperationDataModel.NESTED_MODEL_VALIDATION_HOOK};
-	}
+        return new String[] { PROJECT_NAME, COMPONENT_NAME, COMPONENT_VERSION };
+    }
 
 	public void dispose() {
 		super.dispose();
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARImportPage.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARImportPage.java
index 55e5dac..d73c66d 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARImportPage.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/EARImportPage.java
@@ -35,7 +35,6 @@
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.wst.common.componentcore.internal.operation.ComponentCreationDataModel;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPWizard;
 import org.eclipse.wst.common.internal.emfworkbench.operation.EditModelOperationDataModel;
 
 /**
@@ -88,10 +87,6 @@
 		return earModel;
 	}
 
-	protected WTPWizard getNewProjectWizard(J2EEComponentCreationDataModel aModel) {
-		return new EARComponentCreationWizard((EARComponentCreationDataModel) aModel);
-	}
-
 	protected String getProjectImportLabel() {
 		return J2EEUIMessages.getResourceString(J2EEUIMessages.EAR_IMPORT_PROJECT_LABEL);
 	}
@@ -155,7 +150,7 @@
 	 * @see org.eclipse.jst.j2ee.internal.internal.internal.ui.wizard.J2EEModuleImportPage#createAnnotationsStandaloneGroup(org.eclipse.swt.widgets.Composite)
 	 */
 	protected void createAnnotationsStandaloneGroup(Composite composite) {
-		new AnnotationsStandaloneGroup(composite, model, false);
+		//new AnnotationsStandaloneGroup(composite, model, false);
 	}
 
 	/*
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationDataModelWizard.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationDataModelWizard.java
deleted file mode 100644
index 158dc6e..0000000
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationDataModelWizard.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.eclipse.jst.j2ee.internal.wizard;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
-import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
-import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard;
-
-public class FlexibleProjectCreationDataModelWizard extends DataModelWizard { 
-
-	/**
-	 * <p>
-	 * Constant used to identify the key of the main page of the Wizard.
-	 * </p>
-	 */
-	protected static final String MAIN_PG = "main"; //$NON-NLS-1$
-	private IStructuredSelection selection;
-	public static final String WIZARD_ID = FlexibleProjectCreationWizard.class.getName();
-
-	/**
-	 * <p>
-	 * Creates a default instance of the wizard with no configuration data, no selection, and no
-	 * operation data model.
-	 * </p>
-	 */
-	public FlexibleProjectCreationDataModelWizard() {
-		super();
-	}
-
-	/**
-	 * <p>
-	 * The model is used to prepopulate wizard controls and to collect data from the user. The model
-	 * will eventually be used to run the operation, if the user does not cancel the Wizard.
-	 * </p>
-	 * 
-	 * @param model
-	 *            used to collect information and interface with the WTP Operation
-	 */
-	public FlexibleProjectCreationDataModelWizard(IDataModel model) {
-		super(model);
-	}
-
-	/**
-	 * <p>
-	 * The selection is used to pre-populate values in the Wizard dialog controls.
-	 * </p>
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
-	 *      org.eclipse.jface.viewers.IStructuredSelection)
-	 * 
-	 * @param workbench
-	 *            the current workbench parent of the wizard
-	 * @param aSelection
-	 *            the selection from the view used to start the wizard (if any)
-	 */
-	public final void init(IWorkbench workbench, IStructuredSelection aSelection) {
-		setNeedsProgressMonitor(true);
-		this.selection = aSelection;
-		setWindowTitle(J2EEUIMessages.getResourceString(J2EEUIMessages.FLEXIBLE_PROJECT_WIZ_TITLE));
-		setDefaultPageImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(J2EEUIPluginIcons.EAR_WIZ_BANNER));
-		setHelpAvailable(false);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	protected void doAddPages() {
-		addPage(new FlexibleProjectCreationDataModelWizardPage(getDataModel(), MAIN_PG));
-	}
-
-	protected IDataModelProvider getDefaultProvider() {
-		return new FlexibleProjectCreationDataModelProvider();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationDataModelWizardPage.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationDataModelWizardPage.java
deleted file mode 100644
index 082176b..0000000
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationDataModelWizardPage.java
+++ /dev/null
@@ -1,294 +0,0 @@
-package org.eclipse.jst.j2ee.internal.wizard;
-
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleProjectCreationDataModel;
-import org.eclipse.jst.j2ee.internal.actions.IJ2EEUIContextIds;
-import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
-import org.eclipse.jst.j2ee.internal.servertarget.J2EEProjectServerTargetDataModel;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPPropertyDescriptor;
-import org.eclipse.wst.server.ui.ServerUIUtil;
-
-public class FlexibleProjectCreationDataModelWizardPage extends DataModelWizardPage {
-	private static final boolean isWindows = SWT.getPlatform().toLowerCase().startsWith("win"); //$NON-NLS-1$
-
-	protected NewFlexibleProjectGroup projectNameGroup;
-	protected Composite advancedComposite;
-	protected Button advancedButton;
-	protected boolean showAdvanced = false;
-	protected AdvancedSizeController advancedController;
-	protected boolean advancedControlsBuilt = false;
-	protected Combo serverTargetCombo;
-
-	private class AdvancedSizeController implements ControlListener {
-		private int advancedHeight = -1;
-		private Point originalSize;
-		private boolean ignoreShellResize = false;
-
-		private AdvancedSizeController(Shell aShell) {
-			originalSize = aShell.getSize();
-			aShell.addControlListener(this);
-		}
-
-		public void controlMoved(ControlEvent e) {
-			//do nothing
-		}
-
-		public void controlResized(ControlEvent e) {
-			if (!ignoreShellResize) {
-				Control control = (Control) e.getSource();
-				if (control.isVisible()) {
-					originalSize = control.getSize();
-					if (advancedHeight == -1)
-						setShellSizeForAdvanced();
-				}
-			}
-		}
-
-		protected void resetOriginalShellSize() {
-			setShellSize(originalSize.x, originalSize.y);
-		}
-
-		private void setShellSize(int x, int y) {
-			ignoreShellResize = true;
-			try {
-				getShell().setSize(x, y);
-			} finally {
-				ignoreShellResize = false;
-			}
-		}
-
-		protected void setShellSizeForAdvanced() {
-			int height = calculateAdvancedShellHeight();
-			if (height != -1)
-				setShellSize(getShell().getSize().x, height);
-		}
-
-		private int calculateAdvancedShellHeight() {
-			Point advancedCompSize = advancedComposite.getSize();
-			if (advancedCompSize.x == 0)
-				return -1;
-			int height = computeAdvancedHeight();
-			if (!showAdvanced && height != -1)
-				height = height - advancedComposite.getSize().y;
-			return height;
-		}
-
-		/*
-		 * Compute the height with the advanced section showing. @return
-		 */
-		private int computeAdvancedHeight() {
-			if (advancedHeight == -1) {
-				Point controlSize = getControl().getSize();
-				if (controlSize.x != 0) {
-					int minHeight = originalSize.y - controlSize.y;
-					Point pageSize = getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-					advancedHeight = pageSize.y + minHeight;
-				}
-			}
-			return advancedHeight;
-		}
-	}
-
-	/**
-	 * @param model
-	 * @param pageName
-	 */
-	public FlexibleProjectCreationDataModelWizardPage(IDataModel model, String pageName) {
-		super(model, pageName);
-		setTitle(J2EEUIMessages.getResourceString(J2EEUIMessages.FLEXIBLE_PROJECT_MAIN_PG_TITLE));
-		setDescription(J2EEUIMessages.getResourceString(J2EEUIMessages.FLEXIBLE_PROJECT_MAIN_PG_DESC));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.j2ee.internal.internal.internal.ui.wizard.J2EEProjectCreationPage#createTopLevelComposite(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Composite createTopLevelComposite(Composite parent) {
-		setInfopopID(IJ2EEUIContextIds.NEW_EAR_WIZARD_P1);
-		Composite top = new Composite(parent, SWT.NONE);
-		top.setLayout(new GridLayout());
-		top.setData(new GridData(GridData.FILL_BOTH));
-		Composite composite = new Composite(top, SWT.NONE);
-		GridLayout layout = new GridLayout(3, false);
-		composite.setLayout(layout);
-		createProjectNameGroup(composite);
-		Composite detail = new Composite(top, SWT.NONE);
-		detail.setLayout(new GridLayout());
-		detail.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		createAdvancedComposite(detail);
-		return top;
-	}
-
-	protected void createProjectNameGroup(Composite parent) {
-		projectNameGroup = new NewFlexibleProjectGroup(parent, SWT.NULL, (FlexibleProjectCreationDataModel)model);
-	}
-
-	/**
-	 * @param parent
-	 */
-	protected Composite createAdvancedComposite(Composite parent) {
-		advancedControlsBuilt = true;
-		advancedButton = new Button(parent, SWT.TOGGLE);
-		setAdvancedLabelText();
-		final Cursor hand = new Cursor(advancedButton.getDisplay(), SWT.CURSOR_HAND);
-		advancedButton.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				hand.dispose();
-			}
-		});
-		advancedButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				toggleAdvanced(true);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				//do nothing
-			}
-		});
-		advancedButton.addListener(SWT.MouseHover, new Listener() {
-			public void handleEvent(Event event) {
-				if (event.type == SWT.MouseHover)
-					advancedButton.setCursor(hand);
-			}
-		});
-		advancedComposite = new Composite(parent, SWT.NONE);
-		//toggleAdvanced(false);
-		GridLayout layout = new GridLayout(3, false);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		advancedComposite.setLayoutData(data);
-		advancedComposite.setLayout(layout);
-		addToAdvancedComposite(advancedComposite);
-		return advancedComposite;
-	}
-
-	/**
-	 * @param advancedLabel
-	 */
-	private void setAdvancedLabelText() {
-		if (advancedControlsBuilt) {
-			if (showAdvanced)
-				advancedButton.setText(J2EEUIMessages.getResourceString("J2EEProjectCreationPage_UI_0")); //$NON-NLS-1$
-			else
-				advancedButton.setText(J2EEUIMessages.getResourceString("J2EEProjectCreationPage_UI_1")); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param advancedLabel
-	 */
-	protected void toggleAdvanced(boolean setSize) {
-		if (advancedControlsBuilt) {
-			showAdvanced = !showAdvanced;
-			advancedComposite.setVisible(showAdvanced);
-			setAdvancedLabelText();
-			if (setSize && isWindows)
-				advancedController.setShellSizeForAdvanced();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.WTPWizardPage#enter()
-	 */
-	protected void enter() {
-		if (advancedControlsBuilt) {
-			if (isFirstTimeToPage)
-				initializeAdvancedController();
-			if (isWindows) {
-				advancedController.setShellSizeForAdvanced();
-			}
-		}
-		super.enter();
-	}
-
-	private void initializeAdvancedController() {
-		advancedController = new AdvancedSizeController(getShell());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.WTPWizardPage#exit()
-	 */
-	protected void exit() {
-		if (advancedControlsBuilt && isWindows) {
-			advancedController.resetOriginalShellSize();
-		}
-		super.exit();
-	}
-
-	protected void createServerTargetComposite(Composite parent) {
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(J2EEUIMessages.getResourceString(J2EEUIMessages.TARGET_SERVER_LBL));
-		serverTargetCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
-		serverTargetCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		Button newServerTargetButton = new Button(parent, SWT.NONE);
-		newServerTargetButton.setText(J2EEUIMessages.getResourceString(J2EEUIMessages.NEW_THREE_DOTS_E));
-		newServerTargetButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				FlexibleProjectCreationWizardPage.launchNewRuntimeWizard(getShell(), ((FlexibleProjectCreationDataModel) model).getServerTargetDataModel());
-			}
-		});
-		Control[] deps = new Control[]{label, newServerTargetButton};
-		synchHelper.synchCombo(serverTargetCombo, J2EEProjectServerTargetDataModel.RUNTIME_TARGET_ID, deps);
-	}
-
-	protected void addToAdvancedComposite(Composite parent) {
-		createServerTargetComposite(parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.J2EEWizardPage#getValidationPropertyNames()
-	 */
-	protected String[] getValidationPropertyNames() {
-		return new String[]{FlexibleProjectCreationDataModel.PROJECT_NAME, FlexibleProjectCreationDataModel.PROJECT_LOCATION, FlexibleProjectCreationDataModel.SERVER_TARGET_ID};
-	}
-
-	public static boolean launchNewRuntimeWizard(Shell shell, J2EEProjectServerTargetDataModel model) {
-		WTPPropertyDescriptor[] preAdditionDescriptors = model.getValidPropertyDescriptors(J2EEProjectServerTargetDataModel.RUNTIME_TARGET_ID);
-		boolean isOK = ServerUIUtil.showNewRuntimeWizard(shell, "", "");  //$NON-NLS-1$  //$NON-NLS-2$
-		if (isOK && model != null) {
-			model.notifyValidValuesChange(J2EEProjectServerTargetDataModel.RUNTIME_TARGET_ID);
-			WTPPropertyDescriptor[] postAdditionDescriptors = model.getValidPropertyDescriptors(J2EEProjectServerTargetDataModel.RUNTIME_TARGET_ID);
-			Object[] preAddition = new Object[preAdditionDescriptors.length];
-			for (int i = 0; i < preAddition.length; i++) {
-				preAddition[i] = preAdditionDescriptors[i].getPropertyValue();
-			}
-			Object[] postAddition = new Object[postAdditionDescriptors.length];
-			for (int i = 0; i < postAddition.length; i++) {
-				postAddition[i] = postAdditionDescriptors[i].getPropertyValue();
-			}
-			Object newAddition = ProjectUtilities.getNewObject(preAddition, postAddition);
-			if (newAddition != null)
-				model.setProperty(J2EEProjectServerTargetDataModel.RUNTIME_TARGET_ID, newAddition);
-		}
-		return isOK;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationWizard.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationWizard.java
index 2f41c6e..394b5f9 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationWizard.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationWizard.java
@@ -10,18 +10,18 @@
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExecutableExtension;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModel;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleProjectCreationOperation;
+import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModelProvider;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
 import org.eclipse.ui.INewWizard;
 import org.eclipse.ui.IWorkbench;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPWizard;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.properties.IFlexibleProjectCreationDataModelProperties;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard;
 
-public class FlexibleProjectCreationWizard extends WTPWizard implements INewWizard, IExecutableExtension { 
+public class FlexibleProjectCreationWizard extends DataModelWizard implements INewWizard, IExecutableExtension, IFlexibleProjectCreationDataModelProperties { 
 
 	/**
 	 * <p>
@@ -52,7 +52,7 @@
 	 * @param model
 	 *            used to collect information and interface with the WTP Operation
 	 */
-	public FlexibleProjectCreationWizard(FlexibleJavaProjectCreationDataModel model) {
+	public FlexibleProjectCreationWizard(IDataModel model) {
 		super(model);
         setWindowTitle(J2EEUIMessages.getResourceString(J2EEUIMessages.FLEXIBLE_PROJECT_WIZ_TITLE));
         setDefaultPageImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(J2EEUIPluginIcons.EAR_WIZ_BANNER));
@@ -113,41 +113,10 @@
 	 * @see org.eclipse.jface.wizard.Wizard#addPages()
 	 */
 	protected void doAddPages() {
-		addPage(new FlexibleProjectCreationWizardPage(getSpecificDataModel(), MAIN_PG));
+		addPage(new FlexibleProjectCreationWizardPage(getDataModel(), MAIN_PG));
 	}
 
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * <p>
-	 * Creates a new {@link EARProjectCreationDataModel}
-	 * </p>
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.WTPWizard#createDefaultModel()
-	 */
-	protected WTPOperationDataModel createDefaultModel() {
-		return new FlexibleJavaProjectCreationDataModel();
-	}
-
-	/**
-	 * @inheritDoc
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.WTPWizard#createOperation()
-	 */
-	protected WTPOperation createBaseOperation() {
-		return new FlexibleProjectCreationOperation(getSpecificDataModel());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.extensions.ExtendableWizard#getWizardID()
-	 */
-	public String getWizardID() {
-		return WIZARD_ID;
-	}
-
-	private FlexibleJavaProjectCreationDataModel getSpecificDataModel() {
-		return (FlexibleJavaProjectCreationDataModel) model;
-	}
+    protected IDataModelProvider getDefaultProvider() {
+        return new FlexibleJavaProjectCreationDataModelProvider();
+    }
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationWizardPage.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationWizardPage.java
index 0830685..1dad289 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationWizardPage.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/FlexibleProjectCreationWizardPage.java
@@ -7,10 +7,10 @@
 package org.eclipse.jst.j2ee.internal.wizard;
 
 import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleProjectCreationDataModel;
 import org.eclipse.jst.j2ee.internal.actions.IJ2EEUIContextIds;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
-import org.eclipse.jst.j2ee.internal.servertarget.J2EEProjectServerTargetDataModel;
+import org.eclipse.jst.j2ee.project.datamodel.properties.IFlexibleJavaProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.project.datamodel.properties.IJ2EEProjectServerTargetDataModelProperties;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.events.ControlListener;
@@ -31,11 +31,12 @@
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPPropertyDescriptor;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPWizardPage;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
 import org.eclipse.wst.server.ui.ServerUIUtil;
 
-public class FlexibleProjectCreationWizardPage extends WTPWizardPage {
+public class FlexibleProjectCreationWizardPage extends DataModelWizardPage implements IFlexibleJavaProjectCreationDataModelProperties, IJ2EEProjectServerTargetDataModelProperties {
 	private static final boolean isWindows = SWT.getPlatform().toLowerCase().startsWith("win"); //$NON-NLS-1$
 
 	protected NewFlexibleProjectGroup projectNameGroup;
@@ -120,7 +121,7 @@
 	 * @param model
 	 * @param pageName
 	 */
-	public FlexibleProjectCreationWizardPage(FlexibleProjectCreationDataModel model, String pageName) {
+	public FlexibleProjectCreationWizardPage(IDataModel model, String pageName) {
 		super(model, pageName);
 		setTitle(J2EEUIMessages.getResourceString(J2EEUIMessages.FLEXIBLE_PROJECT_MAIN_PG_TITLE));
 		setDescription(J2EEUIMessages.getResourceString(J2EEUIMessages.FLEXIBLE_PROJECT_MAIN_PG_DESC));
@@ -149,7 +150,7 @@
 	}
 
 	protected void createProjectNameGroup(Composite parent) {
-		projectNameGroup = new NewFlexibleProjectGroup(parent, SWT.NULL, (FlexibleProjectCreationDataModel)model);
+		projectNameGroup = new NewFlexibleProjectGroup(parent, SWT.NULL, model, synchHelper);
 	}
 
 	/**
@@ -256,11 +257,11 @@
 		newServerTargetButton.setText(J2EEUIMessages.getResourceString(J2EEUIMessages.NEW_THREE_DOTS_E));
 		newServerTargetButton.addSelectionListener(new SelectionAdapter() {
 			public void widgetSelected(SelectionEvent e) {
-				FlexibleProjectCreationWizardPage.launchNewRuntimeWizard(getShell(), ((FlexibleProjectCreationDataModel) model).getServerTargetDataModel());
+				FlexibleProjectCreationWizardPage.launchNewRuntimeWizard(getShell(), model.getNestedModel(NESTED_MODEL_SERVER_TARGET));
 			}
 		});
 		Control[] deps = new Control[]{label, newServerTargetButton};
-		synchHelper.synchCombo(serverTargetCombo, J2EEProjectServerTargetDataModel.RUNTIME_TARGET_ID, deps);
+		synchHelper.synchCombo(serverTargetCombo, RUNTIME_TARGET_ID, deps);
 	}
 
 	protected void addToAdvancedComposite(Composite parent) {
@@ -273,15 +274,15 @@
 	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.J2EEWizardPage#getValidationPropertyNames()
 	 */
 	protected String[] getValidationPropertyNames() {
-		return new String[]{FlexibleProjectCreationDataModel.PROJECT_NAME, FlexibleProjectCreationDataModel.PROJECT_LOCATION, FlexibleProjectCreationDataModel.SERVER_TARGET_ID};
+		return new String[]{IFlexibleJavaProjectCreationDataModelProperties.PROJECT_NAME, PROJECT_LOCATION, SERVER_TARGET_ID};
 	}
 
-	public static boolean launchNewRuntimeWizard(Shell shell, J2EEProjectServerTargetDataModel model) {
-		WTPPropertyDescriptor[] preAdditionDescriptors = model.getValidPropertyDescriptors(J2EEProjectServerTargetDataModel.RUNTIME_TARGET_ID);
+	public static boolean launchNewRuntimeWizard(Shell shell, IDataModel model) {
+		DataModelPropertyDescriptor[] preAdditionDescriptors = model.getValidPropertyDescriptors(RUNTIME_TARGET_ID);
 		boolean isOK = ServerUIUtil.showNewRuntimeWizard(shell, "", "");  //$NON-NLS-1$  //$NON-NLS-2$
 		if (isOK && model != null) {
-			model.notifyValidValuesChange(J2EEProjectServerTargetDataModel.RUNTIME_TARGET_ID);
-			WTPPropertyDescriptor[] postAdditionDescriptors = model.getValidPropertyDescriptors(J2EEProjectServerTargetDataModel.RUNTIME_TARGET_ID);
+			model.notifyPropertyChange(RUNTIME_TARGET_ID, IDataModel.VALID_VALUES_CHG);
+			DataModelPropertyDescriptor[] postAdditionDescriptors = model.getValidPropertyDescriptors(RUNTIME_TARGET_ID);
 			Object[] preAddition = new Object[preAdditionDescriptors.length];
 			for (int i = 0; i < preAddition.length; i++) {
 				preAddition[i] = preAdditionDescriptors[i].getPropertyValue();
@@ -292,7 +293,7 @@
 			}
 			Object newAddition = ProjectUtilities.getNewObject(preAddition, postAddition);
 			if (newAddition != null)
-				model.setProperty(J2EEProjectServerTargetDataModel.RUNTIME_TARGET_ID, newAddition);
+				model.setProperty(RUNTIME_TARGET_ID, newAddition);
 		}
 		return isOK;
 	}
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEArtifactCreationWizard.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEArtifactCreationWizard.java
index 6aff263..2091f9b 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEArtifactCreationWizard.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEArtifactCreationWizard.java
@@ -13,6 +13,7 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
 import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jst.j2ee.internal.DelegateConfigurationElement;
@@ -22,10 +23,10 @@
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
 import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IComponentCreationDataModelProperties;
 import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.operation.ComponentCreationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPWizard;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard;
 
 /**
  * <p>
@@ -53,7 +54,7 @@
  * 
  * @see org.eclipse.wst.common.frameworks.ui.ExtendableWizard
  */
-public abstract class J2EEArtifactCreationWizard extends WTPWizard implements INewWizard, IExecutableExtension, IPluginContribution {
+public abstract class J2EEArtifactCreationWizard extends DataModelWizard implements INewWizard, IExecutableExtension, IPluginContribution {
 
 	/**
 	 * <p>
@@ -84,7 +85,7 @@
 	 * @param model
 	 *            used to collect information and interface with the WTP Operation
 	 */
-	public J2EEArtifactCreationWizard(WTPOperationDataModel model) {
+	public J2EEArtifactCreationWizard(IDataModel model) {
 		super(model);
 	}
 
@@ -223,7 +224,8 @@
 			BasicNewProjectResourceWizard.updatePerspective(element);
 		} else
 			BasicNewProjectResourceWizard.updatePerspective(configurationElement);
-		BasicNewResourceWizard.selectAndReveal(((ComponentCreationDataModel) model).getTargetProject(), J2EEUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow());
+        String projName = getDataModel().getStringProperty(IComponentCreationDataModelProperties.PROJECT_NAME);
+		BasicNewResourceWizard.selectAndReveal(ProjectUtilities.getProject(projName), J2EEUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow());
 	}
 
 
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationDataModelWizard.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationDataModelWizard.java
index a10e841..dbc6473 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationDataModelWizard.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationDataModelWizard.java
@@ -8,6 +8,7 @@
 import org.eclipse.jst.j2ee.internal.servertarget.ServerTargetDataModel;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 
 public abstract class J2EEComponentCreationDataModelWizard extends J2EEArtifactCreationWizard {
 
@@ -37,7 +38,7 @@
 	 *            The model parameter is used to pre-populate wizard controls and interface with the
 	 *            operation
 	 */
-	public J2EEComponentCreationDataModelWizard(J2EEComponentCreationDataModel model) {
+	public J2EEComponentCreationDataModelWizard(IDataModel model) {
 		super(model);
 	}
 
@@ -63,8 +64,8 @@
 	 *  
 	 */
 	protected void addModulesPageIfNecessary() {
-		if (model.getBooleanProperty(IJ2EEComponentCreationDataModelProperties.UI_SHOW_EAR_SECTION)) {
-			addPage(new J2EEModulesDependencyPage((J2EEComponentCreationDataModel) model, MODULE_PG));
+		if (getDataModel().getBooleanProperty(IJ2EEComponentCreationDataModelProperties.UI_SHOW_EAR_SECTION)) {
+			addPage(new J2EEModulesDependencyPage(getDataModel(), MODULE_PG));
 		}
 	}
 
@@ -126,7 +127,7 @@
 	 * @return Returns a boolean true if the module page should be shown.
 	 */
 	protected final boolean shouldShowModulesPage() {
-		return model.getBooleanProperty(J2EEComponentCreationDataModel.ADD_TO_EAR) && shouldShowModulesPageForEAR();
+		return getDataModel().getBooleanProperty(J2EEComponentCreationDataModel.ADD_TO_EAR) && shouldShowModulesPageForEAR();
 	}
 
 	/**
@@ -147,7 +148,7 @@
 		WorkbenchComponent earModule = getSelectedEARModule();
 		EARArtifactEdit earEdit = null;
 		int j2eeVersion = 0;
-		if (earModule != null && model != null) {
+		if (earModule != null && getDataModel() != null) {
 			try {
 				earEdit = EARArtifactEdit.getEARArtifactEditForRead(earModule);
 				j2eeVersion = earEdit.getJ2EEVersion();
@@ -155,9 +156,9 @@
 				if (earEdit != null)
 					earEdit.dispose();
 			}
-			model.setIntProperty(ServerTargetDataModel.J2EE_VERSION_ID, j2eeVersion);
-			model.setIntProperty(J2EEComponentCreationDataModel.J2EE_VERSION, j2eeVersion);
-			model.setProperty(J2EEComponentCreationDataModel.EAR_MODULE_NAME, earModule.getName());
+            getDataModel().setIntProperty(ServerTargetDataModel.J2EE_VERSION_ID, j2eeVersion);
+            getDataModel().setIntProperty(J2EEComponentCreationDataModel.J2EE_VERSION, j2eeVersion);
+            getDataModel().setProperty(J2EEComponentCreationDataModel.EAR_MODULE_NAME, earModule.getName());
 		}
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationWizard.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationWizard.java
index a06eb0a..c7ab965 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationWizard.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationWizard.java
@@ -10,11 +10,14 @@
  *******************************************************************************/
 package org.eclipse.jst.j2ee.internal.wizard;
 
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
 import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentCreationDataModelProperties;
 import org.eclipse.jst.j2ee.internal.servertarget.ServerTargetDataModel;
+import org.eclipse.ui.IWorkbench;
 import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 
 /**
  * <p>
@@ -30,7 +33,7 @@
  * 
  * @see org.eclipse.jst.j2ee.internal.wizard.J2EEArtifactCreationWizard
  */
-public abstract class J2EEComponentCreationWizard extends J2EEArtifactCreationWizard {
+public abstract class J2EEComponentCreationWizard extends J2EEArtifactCreationWizard implements IJ2EEComponentCreationDataModelProperties{
 
 	/**
 	 * <p>
@@ -58,7 +61,7 @@
 	 *            The model parameter is used to pre-populate wizard controls and interface with the
 	 *            operation
 	 */
-	public J2EEComponentCreationWizard(J2EEComponentCreationDataModel model) {
+	public J2EEComponentCreationWizard(IDataModel model) {
 		super(model);
 	}
 
@@ -84,8 +87,8 @@
 	 *  
 	 */
 	protected void addModulesPageIfNecessary() {
-		if (model.getBooleanProperty(J2EEComponentCreationDataModel.UI_SHOW_EAR_SECTION)) {
-			addPage(new J2EEModulesDependencyPage((J2EEComponentCreationDataModel) model, MODULE_PG));
+		if (getDataModel().getBooleanProperty(UI_SHOW_EAR_SECTION)) {
+			addPage(new J2EEModulesDependencyPage(getDataModel(), MODULE_PG));
 		}
 	}
 
@@ -147,7 +150,7 @@
 	 * @return Returns a boolean true if the module page should be shown.
 	 */
 	protected final boolean shouldShowModulesPage() {
-		return model.getBooleanProperty(J2EEComponentCreationDataModel.ADD_TO_EAR) && shouldShowModulesPageForEAR();
+		return getDataModel().getBooleanProperty(ADD_TO_EAR) && shouldShowModulesPageForEAR();
 	}
 
 	/**
@@ -168,7 +171,7 @@
 		WorkbenchComponent earModule = getSelectedEARModule();
 		EARArtifactEdit earEdit = null;
 		int j2eeVersion = 0;
-		if (earModule != null && model != null) {
+		if (earModule != null && getDataModel() != null) {
 			try {
 				earEdit = EARArtifactEdit.getEARArtifactEditForRead(earModule);
 				j2eeVersion = earEdit.getJ2EEVersion();
@@ -176,9 +179,9 @@
 				if (earEdit != null)
 					earEdit.dispose();
 			}
-			model.setIntProperty(ServerTargetDataModel.J2EE_VERSION_ID, j2eeVersion);
-			model.setIntProperty(J2EEComponentCreationDataModel.J2EE_VERSION, j2eeVersion);
-			model.setProperty(J2EEComponentCreationDataModel.EAR_MODULE_NAME, earModule.getName());
+            getDataModel().setIntProperty(ServerTargetDataModel.J2EE_VERSION_ID, j2eeVersion);
+            getDataModel().setIntProperty(COMPONENT_VERSION, j2eeVersion);
+            getDataModel().setProperty(EAR_COMPONENT_NAME, earModule.getName());
 		}
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationWizardPage.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationWizardPage.java
index b41e735..b3a9382 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationWizardPage.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEComponentCreationWizardPage.java
@@ -18,7 +18,7 @@
 
 import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
 import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentCreationDataModelProperties;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.jst.j2ee.internal.servertarget.ServerTargetDataModel;
 import org.eclipse.swt.SWT;
@@ -41,14 +41,13 @@
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.componentcore.internal.operation.ComponentCreationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
 import org.eclipse.wst.common.frameworks.internal.operations.WTPPropertyDescriptor;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPWizardPage;
 import org.eclipse.wst.server.ui.ServerUIUtil;
 
 
-public abstract class J2EEComponentCreationWizardPage extends WTPWizardPage {
+public abstract class J2EEComponentCreationWizardPage extends DataModelWizardPage implements IJ2EEComponentCreationDataModelProperties{
 
 	private static final boolean isWindows = SWT.getPlatform().toLowerCase().startsWith("win"); //$NON-NLS-1$
 	protected static final String MODULE_VERSION = "Module Version:";
@@ -138,12 +137,12 @@
 		}
 	}
 	
-	public J2EEComponentCreationWizardPage(J2EEComponentCreationDataModel dataModel, String pageName) {
+	public J2EEComponentCreationWizardPage(IDataModel dataModel, String pageName) {
 		super(dataModel, pageName);
 	}
 	
 	protected void createProjectNameGroup(Composite parent) {
-		projectNameGroup = new NewModuleGroup(parent, SWT.NULL, (J2EEComponentCreationDataModel)model);
+		projectNameGroup = new NewModuleGroup(parent, SWT.NULL, model, synchHelper);
 	}
 
 	protected void addToAdvancedComposite(Composite advanced) {
@@ -152,19 +151,15 @@
 	}
 
 	protected void createServerEarAndStandaloneGroup(Composite parent) {
-		earGroup = new ServerEarAndStandaloneGroup(parent, getJ2EEModuleCreationDataModel());
-	}
-
-	protected J2EEComponentCreationDataModel getJ2EEModuleCreationDataModel() {
-		return (J2EEComponentCreationDataModel) model;
+		earGroup = new ServerEarAndStandaloneGroup(parent, getDataModel(), synchHelper);
 	}
 
 	protected void validatePage() {
 		super.validatePage();
-		if (!showAdvanced && !isPageComplete()) {
+/*		if (!showAdvanced && !isPageComplete()) {
 			String prop = validateControlsBase();
 			if (null != prop) {
-				String[] advancedProperties = {WTPOperationDataModel.NESTED_MODEL_VALIDATION_HOOK, ComponentCreationDataModel.COMPONENT_VERSION, J2EEComponentCreationDataModel.EAR_MODULE_NAME, J2EEComponentCreationDataModel.ADD_TO_EAR};
+				String[] advancedProperties = {NESTED_MODEL_VALIDATION_HOOK, COMPONENT_VERSION, EAR_COMPONENT_NAME, ADD_TO_EAR};
 				for (int i = 0; i < advancedProperties.length; i++) {
 					if (prop.equals(advancedProperties[i])) {
 						toggleAdvanced(true);
@@ -172,15 +167,15 @@
 					}
 				}
 			}
-		}
+		}*/
 	}
 
 	protected String[] getValidationPropertyNames() {
-		return new String[]{ComponentCreationDataModel.PROJECT_NAME, ComponentCreationDataModel.COMPONENT_VERSION, ComponentCreationDataModel.COMPONENT_NAME, J2EEComponentCreationDataModel.EAR_MODULE_NAME, J2EEComponentCreationDataModel.ADD_TO_EAR};
+		return new String[]{PROJECT_NAME, COMPONENT_VERSION, COMPONENT_NAME, EAR_COMPONENT_NAME, ADD_TO_EAR};
 	}
 
 	protected void createVersionComposite(Composite parent) {
-		createVersionComposite(parent, getVersionLabel(), ComponentCreationDataModel.COMPONENT_VERSION);
+		createVersionComposite(parent, getVersionLabel(), COMPONENT_VERSION);
 	}
 
 	protected String getVersionLabel() {
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEModulesDependencyPage.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEModulesDependencyPage.java
index 3b99c4e..0b8e6e8 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEModulesDependencyPage.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/J2EEModulesDependencyPage.java
@@ -19,8 +19,8 @@
 import org.eclipse.jface.viewers.TableLayout;
 import org.eclipse.jst.j2ee.application.internal.operations.ClassPathSelection;
 import org.eclipse.jst.j2ee.application.internal.operations.ClasspathElement;
-import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
 import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModel;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentCreationDataModelProperties;
 import org.eclipse.jst.j2ee.internal.actions.IJ2EEUIContextIds;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.swt.SWT;
@@ -36,9 +36,9 @@
 import org.eclipse.swt.widgets.TableColumn;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditOperationDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
 import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModelEvent;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPWizardPage;
 
 /*
  * Created on Nov 13, 2003
@@ -53,11 +53,11 @@
  * To change the template for this generated type comment go to
  * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
  */
-public class J2EEModulesDependencyPage extends WTPWizardPage {
+public class J2EEModulesDependencyPage extends DataModelWizardPage implements IJ2EEComponentCreationDataModelProperties{
 
 	private CheckboxTableViewer availableJarsViewer;
 
-	public J2EEModulesDependencyPage(J2EEComponentCreationDataModel model, String pageName) {
+	public J2EEModulesDependencyPage(IDataModel model, String pageName) {
 		super(model, pageName);
 		setTitle(J2EEUIMessages.getResourceString(J2EEUIMessages.MODULES_DEPENDENCY_PAGE_TITLE));
 		setDescription(J2EEUIMessages.getResourceString(J2EEUIMessages.MODULES_DEPENDENCY_PAGE_DESC));
@@ -70,9 +70,7 @@
 
 
 	private void updateJarViewer() {
-		J2EEComponentCreationDataModel dataModel = (J2EEComponentCreationDataModel) model;
-
-		ClassPathSelection classPathSelection = dataModel.getClassPathSelection();
+        ClassPathSelection classPathSelection = (ClassPathSelection)getDataModel().getProperty(CLASSPATH_SELECTION);
 
 		if (availableJarsViewer.getInput() != classPathSelection) {
 			availableJarsViewer.setInput(classPathSelection);
@@ -91,14 +89,14 @@
 		Label projectLabel = new Label(composite, SWT.NONE);
 		projectLabel.setText(WorkbenchMessages.NewProject_title); //$NON-NLS-1$
 		Text projectText = new Text(composite, SWT.BORDER | SWT.READ_ONLY);
-		synchHelper.synchText(projectText, ArtifactEditOperationDataModel.PROJECT_NAME, null);
+		synchHelper.synchText(projectText, PROJECT_NAME, null);
 		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
 		projectText.setLayoutData(gd);
 
 		Label earLabel = new Label(composite, SWT.NONE);
 		earLabel.setText(J2EEUIMessages.getResourceString(J2EEUIMessages.EAR_PROJECT_FOR_MODULE_CREATION));
 		Text earText = new Text(composite, SWT.BORDER | SWT.READ_ONLY);
-		synchHelper.synchText(earText, J2EEComponentCreationDataModel.EAR_MODULE_NAME, null);
+		synchHelper.synchText(earText, EAR_COMPONENT_NAME, null);
 		gd = new GridData(GridData.FILL_HORIZONTAL);
 		earText.setLayoutData(gd);
 
@@ -186,7 +184,7 @@
 		ClasspathElement element = (ClasspathElement) event.getElement();
 		element.setSelected(event.getChecked());
 		String classEntry = element.getText();
-		UpdateManifestDataModel updateManifest = ((J2EEComponentCreationDataModel) model).getUpdateManifestDataModel();
+		UpdateManifestDataModel updateManifest = (UpdateManifestDataModel)model.getProperty(NESTED_UPDATE_MANIFEST_DM);
 		List classpathList = (List) updateManifest.getProperty(UpdateManifestDataModel.JAR_LIST);
 		if (event.getChecked()) {
 			if (!classpathList.contains(classEntry)) {
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewFlexibleProjectGroup.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewFlexibleProjectGroup.java
index 8f12868..b24956f 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewFlexibleProjectGroup.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewFlexibleProjectGroup.java
@@ -8,8 +8,8 @@
 
 import java.io.File;
 
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleProjectCreationDataModel;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
+import org.eclipse.jst.j2ee.project.datamodel.properties.IFlexibleJavaProjectCreationDataModelProperties;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -20,10 +20,11 @@
 import org.eclipse.swt.widgets.DirectoryDialog;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPDataModelSynchHelper;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
 
-public class NewFlexibleProjectGroup {
-	private FlexibleProjectCreationDataModel model;
+public class NewFlexibleProjectGroup implements IFlexibleJavaProjectCreationDataModelProperties{
+	private IDataModel model;
 	public Text projectNameField = null;
 	protected Text locationPathField = null;
 	protected Button browseButton = null;
@@ -34,15 +35,15 @@
 	private String defBrowseButtonLabel = J2EEUIMessages.getResourceString(J2EEUIMessages.BROWSE_LABEL); //$NON-NLS-1$
 	private static final String defDirDialogLabel = "Directory"; //$NON-NLS-1$
 
-	private WTPDataModelSynchHelper synchHelper;
+	private DataModelSynchHelper synchHelper;
 
 	/**
 	 * @param parent
 	 * @param style
 	 */
-	public NewFlexibleProjectGroup(Composite parent, int style, FlexibleProjectCreationDataModel model) {
+	public NewFlexibleProjectGroup(Composite parent, int style, IDataModel model, DataModelSynchHelper aHelper) {
 		this.model = model;
-		synchHelper = new WTPDataModelSynchHelper(model);
+		synchHelper = aHelper;
 		buildComposites(parent);
 	}
 
@@ -70,7 +71,7 @@
 		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
 		projectNameField.setLayoutData(data);
 		new Label(parent, SWT.NONE); // pad
-		synchHelper.synchText(projectNameField, FlexibleProjectCreationDataModel.PROJECT_NAME, new Control[]{projectNameLabel});
+		synchHelper.synchText(projectNameField, PROJECT_NAME, new Control[]{projectNameLabel});
 	}
 
 	/**
@@ -97,7 +98,7 @@
 			}
 		});
 		browseButton.setEnabled(true);
-		synchHelper.synchText(locationPathField, FlexibleProjectCreationDataModel.PROJECT_LOCATION, null);
+		synchHelper.synchText(locationPathField, PROJECT_LOCATION, null);
 	}
 
 	/**
@@ -106,7 +107,7 @@
 	protected void handleLocationBrowseButtonPressed() {
 		DirectoryDialog dialog = new DirectoryDialog(locationPathField.getShell());
 		dialog.setMessage(defDirDialogLabel);
-		String dirName = model.getStringProperty(FlexibleProjectCreationDataModel.PROJECT_LOCATION);
+		String dirName = model.getStringProperty(PROJECT_LOCATION);
 		if ((dirName != null) && (dirName.length() != 0)) {
 			File path = new File(dirName);
 			if (path.exists()) {
@@ -115,13 +116,12 @@
 		}
 		String selectedDirectory = dialog.open();
 		if (selectedDirectory != null) {
-			model.setProperty(FlexibleProjectCreationDataModel.PROJECT_LOCATION, selectedDirectory);
+			model.setProperty(PROJECT_LOCATION, selectedDirectory);
 		}
 	}
 
 	public void dispose() {
 		model.removeListener(synchHelper);
-		synchHelper.dispose();
 		model = null;
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleDataModelGroup.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleDataModelGroup.java
index b8abb25..51a8742 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleDataModelGroup.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleDataModelGroup.java
@@ -8,12 +8,7 @@
 import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.common.jdt.internal.integration.JavaProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModelProvider;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
-import org.eclipse.jst.j2ee.internal.servertarget.J2EEProjectServerTargetDataModelProvider;
 import org.eclipse.jst.j2ee.project.datamodel.properties.IFlexibleJavaProjectCreationDataModelProperties;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -29,9 +24,7 @@
 import org.eclipse.ui.internal.Workbench;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IComponentCreationDataModelProperties;
 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.frameworks.datamodel.properties.IFlexibleProjectCreationDataModelProperties;
 import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
 import org.eclipse.wst.server.core.IRuntime;
 import org.eclipse.wst.server.core.ServerCore;
@@ -174,23 +167,23 @@
 	 *
 	 */
 	private void handleNewProjectSelected() {
-		IDataModel flexibleJavaModel = DataModelFactory.createDataModel(new FlexibleJavaProjectCreationDataModelProvider());
-		IDataModel javaProjModel = DataModelFactory.createDataModel(new JavaProjectCreationDataModelProvider());
-		IDataModel serverTargetModel = DataModelFactory.createDataModel(new J2EEProjectServerTargetDataModelProvider());
-        flexibleJavaModel.addNestedModel(NESTED_MODEL_PROJECT_CREATION, javaProjModel);
-        flexibleJavaModel.addNestedModel(NESTED_MODEL_SERVER_TARGET, serverTargetModel);
-//		FlexibleJavaProjectCreationDataModel projModel = new FlexibleJavaProjectCreationDataModel();
-		FlexibleProjectCreationDataModelWizard newProjectWizard = new FlexibleProjectCreationDataModelWizard(flexibleJavaModel);
-		WizardDialog dialog = new WizardDialog(parentComposite.getShell(), newProjectWizard);
-		if (Window.OK == dialog.open()) {
-			String newProjectName = javaProjModel.getStringProperty(IFlexibleProjectCreationDataModelProperties.PROJECT_NAME);
-			projectNameCombo.add(newProjectName);
-			projectNameCombo.setText(newProjectName);
-			IProject project = ProjectUtilities.getProject(projectNameCombo.getText());
-			IRuntime runtime = ServerCore.getProjectProperties(project).getRuntimeTarget();
-			if (runtime != null)
-				serverTargetText.setText(runtime.getName());
-		}
+//		IDataModel flexibleJavaModel = DataModelFactory.createDataModel(new FlexibleJavaProjectCreationDataModelProvider());
+//		IDataModel javaProjModel = DataModelFactory.createDataModel(new JavaProjectCreationDataModelProvider());
+//		IDataModel serverTargetModel = DataModelFactory.createDataModel(new J2EEProjectServerTargetDataModelProvider());
+//        flexibleJavaModel.addNestedModel(NESTED_MODEL_PROJECT_CREATION, javaProjModel);
+//        flexibleJavaModel.addNestedModel(NESTED_MODEL_SERVER_TARGET, serverTargetModel);
+////		FlexibleJavaProjectCreationDataModel projModel = new FlexibleJavaProjectCreationDataModel();
+//	/	IDataModel newProjectWizard = new FlexibleProjectCreationDataModelWizard(flexibleJavaModel);
+//		WizardDialog dialog = new WizardDialog(parentComposite.getShell(), newProjectWizard);
+//		if (Window.OK == dialog.open()) {
+//			String newProjectName = javaProjModel.getStringProperty(IFlexibleProjectCreationDataModelProperties.PROJECT_NAME);
+//			projectNameCombo.add(newProjectName);
+//			projectNameCombo.setText(newProjectName);
+//			IProject project = ProjectUtilities.getProject(projectNameCombo.getText());
+//			IRuntime runtime = ServerCore.getProjectProperties(project).getRuntimeTarget();
+//			if (runtime != null)
+//				serverTargetText.setText(runtime.getName());
+//		}
 	}
 	
 	/**
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleGroup.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleGroup.java
index 1013164..14f83d0 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleGroup.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleGroup.java
@@ -16,63 +16,50 @@
  */
 package org.eclipse.jst.j2ee.internal.wizard;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModel;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleProjectCreationDataModel;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentCreationDataModelProperties;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.internal.Workbench;
-import org.eclipse.wst.common.componentcore.internal.operation.ComponentCreationDataModel;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPDataModelSynchHelper;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
 import org.eclipse.wst.server.core.IRuntime;
 import org.eclipse.wst.server.core.ServerCore;
 
 /**
  *
  */
-public class NewModuleGroup {
+public class NewModuleGroup implements IJ2EEComponentCreationDataModelProperties{
 	
-	private ComponentCreationDataModel model;
-	protected Combo projectNameCombo = null;
+	private IDataModel model;
 	protected Text moduleNameText = null;
 	protected Button newButton = null;
 	protected Text serverTargetText;
-	private WTPDataModelSynchHelper synchHelper;
+	private DataModelSynchHelper synchHelper;
 	private Composite parentComposite;
 	
 	private static final int SIZING_TEXT_FIELD_WIDTH = 305;
-	private static final String PROJECT_NAME = J2EEUIMessages.getResourceString(J2EEUIMessages.MODULES_DEPENDENCY_PAGE_TABLE_PROJECT)+ ":"; //$NON-NLS-1$
-	private static final String NEW_LABEL = J2EEUIMessages.getResourceString(J2EEUIMessages.NEW_THREE_DOTS_E); //$NON-NLS-1$
-	private static final String MODULE_NAME = J2EEUIMessages.getResourceString(J2EEUIMessages.MODULE_NAME); //$NON-NLS-1$
+	private static final String NEW_LABEL_UI = J2EEUIMessages.getResourceString(J2EEUIMessages.NEW_THREE_DOTS_E); //$NON-NLS-1$
+	private static final String MODULE_NAME_UI = J2EEUIMessages.getResourceString(J2EEUIMessages.MODULE_NAME); //$NON-NLS-1$
 	
 	/**
 	 * @param parent
 	 * @param style
 	 */
-	public NewModuleGroup(Composite parent, int style, ComponentCreationDataModel model) {
+	public NewModuleGroup(Composite parent, int style, IDataModel model, DataModelSynchHelper syncHelper) {
 		this.model = model;
 		this.parentComposite = parent;
-		synchHelper = new WTPDataModelSynchHelper(model);
+		synchHelper = syncHelper;
 		buildComposites(parent);
 	}
 
@@ -80,87 +67,88 @@
 	 * Create the controls within this composite
 	 */
 	public void buildComposites(Composite parent) {
-		createProjectNameGroup(parent);
-		projectNameCombo.setFocus();
-		initializeProjectList();
+		//createProjectNameGroup(parent);
+		//initializeProjectList();
+        createModuleGroup(parent);
+        addSeperator(parent,3);
 		createServerTargetComposite(parent);
-		addSeperator(parent,3);
-		createModuleGroup(parent);
+
+
 	}
 	
 	/**
 	 * 
 	 *
 	 */
-	public void initializeProjectList() {
-		IProject[] workspaceProjects = ProjectUtilities.getAllProjects();
-		List items = new ArrayList();
-		for (int i=0; i<workspaceProjects.length; i++) {
-			IProject project = workspaceProjects[i];
-			try {
-				if (project.hasNature(IModuleConstants.MODULE_NATURE_ID)) {
-					items.add(project.getName());
-				}
-			} catch (CoreException ce) {
-				//Ignore
-			}
-		}
-		String[] names = new String[items.size()];
-		for (int i=0; i<items.size(); i++) {
-			names[i]= (String) items.get(i);
-		}
-		model.setIgnorePropertyChanges(true);
-		projectNameCombo.setItems(names);
-		model.setIgnorePropertyChanges(false);
-		
-		if (!model.isSet(ComponentCreationDataModel.PROJECT_NAME) || model.getStringProperty(ComponentCreationDataModel.PROJECT_NAME).length()==0) {
-			IProject selectedProject = getSelectedProject();
-			if (selectedProject!=null) {
-				projectNameCombo.setText(selectedProject.getName());
-				model.setProperty(ComponentCreationDataModel.PROJECT_NAME,selectedProject.getName());
-			}
-			else if (names.length>0) {
-				projectNameCombo.setText(names[0]);
-				model.setProperty(ComponentCreationDataModel.PROJECT_NAME,names[0]);
-			}
-		} else {
-			projectNameCombo.add(model.getStringProperty(ComponentCreationDataModel.PROJECT_NAME));
-			projectNameCombo.setText(model.getStringProperty(ComponentCreationDataModel.PROJECT_NAME));
-		}
-	}
+//	public void initializeProjectList() {
+//		IProject[] workspaceProjects = ProjectUtilities.getAllProjects();
+//		List items = new ArrayList();
+//		for (int i=0; i<workspaceProjects.length; i++) {
+//			IProject project = workspaceProjects[i];
+//			try {
+//				if (project.hasNature(IModuleConstants.MODULE_NATURE_ID)) {
+//					items.add(project.getName());
+//				}
+//			} catch (CoreException ce) {
+//				//Ignore
+//			}
+//		}
+//		String[] names = new String[items.size()];
+//		for (int i=0; i<items.size(); i++) {
+//			names[i]= (String) items.get(i);
+//		}
+//		//model.IgnorePropertyChanges(true);
+//		projectNameCombo.setItems(names);
+//		//model.setIgnorePropertyChanges(false);
+//		
+//		if (!model.isPropertySet(PROJECT_NAME) || model.getStringProperty(PROJECT_NAME).length()==0) {
+//			IProject selectedProject = getSelectedProject();
+//			if (selectedProject!=null) {
+//				projectNameCombo.setText(selectedProject.getName());
+//				model.setProperty(PROJECT_NAME,selectedProject.getName());
+//			}
+//			else if (names.length>0) {
+//				projectNameCombo.setText(names[0]);
+//				model.setProperty(PROJECT_NAME,names[0]);
+//			}
+//		} else {
+//			projectNameCombo.add(model.getStringProperty(PROJECT_NAME));
+//			projectNameCombo.setText(model.getStringProperty(PROJECT_NAME));
+//		}
+//	}
 
 	/**
 	 *  
 	 */
-	private void createProjectNameGroup(Composite parent) {
-		// set up project name label
-		Label projectNameLabel = new Label(parent, SWT.NONE);
-		projectNameLabel.setText(PROJECT_NAME);
-		GridData data = new GridData();
-		projectNameLabel.setLayoutData(data);
-		// set up project name entry field
-		projectNameCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-		projectNameCombo.setLayoutData(data);
-		projectNameCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IProject project = ProjectUtilities.getProject(projectNameCombo.getText());
-				IRuntime runtime = ServerCore.getProjectProperties(project).getRuntimeTarget();
-				if (runtime != null)
-					serverTargetText.setText(runtime.getName());
-			}
-		});
-		newButton = new Button(parent, SWT.NONE);
-		newButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		newButton.setText(NEW_LABEL);
-		newButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				handleNewProjectSelected();
-			}
-		});
-		synchHelper.synchCombo(projectNameCombo, ComponentCreationDataModel.PROJECT_NAME, new Control[]{projectNameLabel});
-	}
+//	private void createProjectNameGroup(Composite parent) {
+//		// set up project name label
+//		Label projectNameLabel = new Label(parent, SWT.NONE);
+//		projectNameLabel.setText(PROJECT_NAME_UI);
+//		GridData data = new GridData();
+//		projectNameLabel.setLayoutData(data);
+//		// set up project name entry field
+//		projectNameCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
+//		data = new GridData(GridData.FILL_HORIZONTAL);
+//		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
+//		projectNameCombo.setLayoutData(data);
+//		projectNameCombo.addSelectionListener(new SelectionAdapter() {
+//			public void widgetSelected(SelectionEvent e) {
+//				IProject project = ProjectUtilities.getProject(projectNameCombo.getText());
+//				IRuntime runtime = ServerCore.getProjectProperties(project).getRuntimeTarget();
+//				if (runtime != null)
+//					serverTargetText.setText(runtime.getName());
+//			}
+//		});
+//		newButton = new Button(parent, SWT.NONE);
+//		newButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+//		newButton.setText(NEW_LABEL_UI);
+//		newButton.addSelectionListener(new SelectionAdapter() {
+//			public void widgetSelected(SelectionEvent e) {
+//				handleNewProjectSelected();
+//			}
+//		});
+//		synchHelper.synchCombo(projectNameCombo, PROJECT_NAME, new Control[]{projectNameLabel});
+//	}
 	
 	/**
 	 * @return
@@ -183,20 +171,20 @@
 	 * 
 	 *
 	 */
-	private void handleNewProjectSelected() {
-		FlexibleJavaProjectCreationDataModel projModel = new FlexibleJavaProjectCreationDataModel();
-		FlexibleProjectCreationWizard newProjectWizard = new FlexibleProjectCreationWizard(projModel);
-		WizardDialog dialog = new WizardDialog(parentComposite.getShell(), newProjectWizard);
-		if (Window.OK == dialog.open()) {
-			String newProjectName = projModel.getStringProperty(FlexibleProjectCreationDataModel.PROJECT_NAME);
-			projectNameCombo.add(newProjectName);
-			projectNameCombo.setText(newProjectName);
-			IProject project = ProjectUtilities.getProject(projectNameCombo.getText());
-			IRuntime runtime = ServerCore.getProjectProperties(project).getRuntimeTarget();
-			if (runtime != null)
-				serverTargetText.setText(runtime.getName());
-		}
-	}
+//	private void handleNewProjectSelected() {
+//		IDataModel projModel = DataModelFactory.createDataModel(new FlexibleJavaProjectCreationDataModelProvider());
+//		FlexibleProjectCreationWizard newProjectWizard = new FlexibleProjectCreationWizard(projModel);
+//		WizardDialog dialog = new WizardDialog(parentComposite.getShell(), newProjectWizard);
+//		if (Window.OK == dialog.open()) {
+//			String newProjectName = projModel.getStringProperty(PROJECT_NAME);
+//			projectNameCombo.add(newProjectName);
+//			projectNameCombo.setText(newProjectName);
+//			IProject project = ProjectUtilities.getProject(projectNameCombo.getText());
+//			IRuntime runtime = ServerCore.getProjectProperties(project).getRuntimeTarget();
+//			if (runtime != null)
+//				serverTargetText.setText(runtime.getName());
+//		}
+//	}
 	
 	/**
 	 * 
@@ -206,13 +194,13 @@
 		GridData data = new GridData();
 		// Add the module name label
 		Label moduleNameLabel = new Label(parent, SWT.NONE);
-		moduleNameLabel.setText(MODULE_NAME);
+		moduleNameLabel.setText(MODULE_NAME_UI);
 		// Add the module name entry field
 		moduleNameText = new Text(parent, SWT.BORDER);
 		data = new GridData(GridData.FILL_HORIZONTAL);
 		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
 		moduleNameText.setLayoutData(data);
-		synchHelper.synchText(moduleNameText,ComponentCreationDataModel.COMPONENT_NAME,new Control[] {});
+		synchHelper.synchText(moduleNameText,COMPONENT_NAME,new Control[] {});
 		new Label(parent,SWT.NONE);
 	}
 
@@ -233,9 +221,9 @@
 	 * 
 	 * @return
 	 */
-	public String getProjectName() {
-		return projectNameCombo.getText();
-	}
+//	public String getProjectName() {
+//		return projectNameCombo.getText();
+//	}
 	
 	/**
 	 * 
@@ -259,7 +247,7 @@
 		serverTargetText = new Text(parent, SWT.BORDER | SWT.READ_ONLY);
 		serverTargetText.setLayoutData((new GridData(GridData.FILL_HORIZONTAL)));
 		new Label(parent, SWT.NONE);
-		String projectName = projectNameCombo.getText();
+		String projectName = moduleNameText.getText();
 		if (projectName!=null && projectName.length()!=0) {
 			IProject project = ProjectUtilities.getProject(projectName);
 			if (project !=null) {
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleGroupEx.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleGroupEx.java
index a852c1b..c7bfcc4 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleGroupEx.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/NewModuleGroupEx.java
@@ -26,7 +26,7 @@
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.window.Window;
 import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModel;
+import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModelProvider;
 import org.eclipse.jst.j2ee.application.internal.operations.FlexibleProjectCreationDataModel;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.swt.SWT;
@@ -43,9 +43,9 @@
 import org.eclipse.ui.internal.Workbench;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IComponentCreationDataModelProperties;
 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.frameworks.internal.datamodel.ui.DataModelSynchHelper;
-
 import org.eclipse.wst.server.core.IRuntime;
 import org.eclipse.wst.server.core.ServerCore;
 
@@ -186,7 +186,7 @@
 	 *
 	 */
 	private void handleNewProjectSelected() {
-		FlexibleJavaProjectCreationDataModel projModel = new FlexibleJavaProjectCreationDataModel();
+		IDataModel projModel = DataModelFactory.createDataModel(new FlexibleJavaProjectCreationDataModelProvider());
 		FlexibleProjectCreationWizard newProjectWizard = new FlexibleProjectCreationWizard(projModel);
 		WizardDialog dialog = new WizardDialog(parentComposite.getShell(), newProjectWizard);
 		if (Window.OK == dialog.open()) {
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/ServerEarAndStandaloneGroup.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/ServerEarAndStandaloneGroup.java
index 40acd01..d1a0b18 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/ServerEarAndStandaloneGroup.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/ServerEarAndStandaloneGroup.java
@@ -12,8 +12,9 @@
 
 import org.eclipse.jface.window.Window;
 import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
-import org.eclipse.jst.j2ee.internal.earcreation.EARComponentCreationDataModel;
+import org.eclipse.jst.j2ee.datamodel.properties.IEarComponentCreationDataModelProperties;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentCreationDataModelProperties;
+import org.eclipse.jst.j2ee.internal.earcreation.EarComponentCreationDataModelProvider;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
@@ -24,29 +25,30 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.common.componentcore.internal.operation.ComponentCreationDataModel;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPDataModelSynchHelper;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
 
 /**
  * 
  */
-public class ServerEarAndStandaloneGroup {
+public class ServerEarAndStandaloneGroup implements IEarComponentCreationDataModelProperties {
 	
 	private Button newEAR;
 	private Combo earCombo;
 	private Label earLabel;
 	private Button addToEAR;
-	private J2EEComponentCreationDataModel model;
-	private WTPDataModelSynchHelper synchHelper;
+	private IDataModel model;
+	private DataModelSynchHelper synchHelper;
 	private Composite parentComposite;
 
 	/**
 	 *  
 	 */
-	public ServerEarAndStandaloneGroup(Composite parent, J2EEComponentCreationDataModel model) {
+	public ServerEarAndStandaloneGroup(Composite parent, IDataModel model, DataModelSynchHelper helper) {
 		this.model = model;
 		this.parentComposite = parent;
-		synchHelper = new WTPDataModelSynchHelper(model);
+		synchHelper = helper;
 		buildComposites(parent);
 	}
 
@@ -63,7 +65,7 @@
 	 */
 	protected void createEarAndStandaloneComposite(Composite parent) {
 
-		if (model.getBooleanProperty(J2EEComponentCreationDataModel.UI_SHOW_EAR_SECTION)) {
+		if (model.getBooleanProperty(UI_SHOW_EAR_SECTION)) {
 
 			Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
 			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
@@ -79,7 +81,7 @@
 			gd = new GridData(GridData.FILL_HORIZONTAL);
 			gd.horizontalSpan = 2;
 			addToEAR.setLayoutData(gd);
-			synchHelper.synchCheckbox(addToEAR, J2EEComponentCreationDataModel.ADD_TO_EAR, null);
+			synchHelper.synchCheckbox(addToEAR, ADD_TO_EAR, null);
 			addToEAR.addSelectionListener(new SelectionListener() {
 				public void widgetSelected(SelectionEvent e) {
 					handleAddToEarSelection();
@@ -111,7 +113,7 @@
 			});
 
 			Control[] deps = new Control[]{earLabel, newEAR};
-			synchHelper.synchCombo(earCombo, J2EEComponentCreationDataModel.EAR_MODULE_NAME, deps);
+			synchHelper.synchCombo(earCombo, EAR_COMPONENT_NAME, deps);
 		}
 	}
 
@@ -129,14 +131,14 @@
 	 *  
 	 */
 	protected void handleNewEarSelected() {
-		J2EEComponentCreationDataModel moduleModel = model;
-		EARComponentCreationDataModel earModel = new EARComponentCreationDataModel();
-		earModel.setIntProperty(J2EEComponentCreationDataModel.J2EE_VERSION, moduleModel.getJ2EEVersion());
-		earModel.setProperty(ComponentCreationDataModel.COMPONENT_NAME, moduleModel.getProperty(J2EEComponentCreationDataModel.EAR_MODULE_NAME));
+		IDataModel moduleModel = model;
+        IDataModel earModel = DataModelFactory.createDataModel(new EarComponentCreationDataModelProvider());
+		earModel.setIntProperty(COMPONENT_VERSION, moduleModel.getIntProperty(IJ2EEComponentCreationDataModelProperties.COMPONENT_VERSION));
+		earModel.setProperty(COMPONENT_NAME, moduleModel.getProperty(IJ2EEComponentCreationDataModelProperties.EAR_COMPONENT_NAME));
 		EARComponentCreationWizard earWizard = new EARComponentCreationWizard(earModel);
 		WizardDialog dialog = new WizardDialog(parentComposite.getShell(), earWizard);
 		if (Window.OK == dialog.open()) {
-			moduleModel.setProperty(J2EEComponentCreationDataModel.EAR_MODULE_NAME, earModel.getProperty(ComponentCreationDataModel.COMPONENT_NAME));
+			moduleModel.setProperty(EAR_COMPONENT_NAME, earModel.getProperty(COMPONENT_NAME));
 		}
 	}
 
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/ServerTargetGroup.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/ServerTargetGroup.java
index 11cdb83..4745b42 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/ServerTargetGroup.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/wizard/ServerTargetGroup.java
@@ -17,8 +17,7 @@
 package org.eclipse.jst.j2ee.internal.wizard;
 
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
-import org.eclipse.jst.j2ee.internal.servertarget.J2EEProjectServerTargetDataModel;
-import org.eclipse.jst.j2ee.internal.servertarget.ServerTargetDataModel;
+import org.eclipse.jst.j2ee.project.datamodel.properties.IJ2EEProjectServerTargetDataModelProperties;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -28,7 +27,8 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPDataModelSynchHelper;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
 
 
 /**
@@ -37,9 +37,9 @@
  * To change the template for this generated type comment go to Window - Preferences - Java - Code
  * Generation - Code and Comments
  */
-public class ServerTargetGroup {
-	private J2EEProjectServerTargetDataModel model;
-	private WTPDataModelSynchHelper synchHelper;
+public class ServerTargetGroup implements IJ2EEProjectServerTargetDataModelProperties{
+	private IDataModel model;
+	private DataModelSynchHelper synchHelper;
 	private Combo targetServerCombo;
 	private Button newTargetServerButton;
 	public Composite parentUI;
@@ -56,10 +56,10 @@
 	 * @param parent
 	 * @param style
 	 */
-	public ServerTargetGroup(Composite parent, int style, J2EEProjectServerTargetDataModel model) {
+	public ServerTargetGroup(Composite parent, int style, IDataModel model, DataModelSynchHelper helper) {
 		this.model = model;
 		this.parentUI = parent;
-		synchHelper = new WTPDataModelSynchHelper(model);
+		synchHelper = helper;
 		buildComposites(parent);
 	}
 
@@ -74,7 +74,6 @@
 	 * @param parent
 	 */
 	private void createServerTargetGroup(Composite parent) {
-
 		Label serverTargetLabel = new Label(parent, SWT.NONE);
 		serverTargetLabel.setText(J2EEUIMessages.getResourceString(J2EEUIMessages.TARGET_SERVER_LBL));
 		GridData data = new GridData();
@@ -95,8 +94,7 @@
 		newTargetServerButton.setEnabled(true);
 
 		Control[] deps = new Control[]{serverTargetLabel, newTargetServerButton};
-		synchHelper.synchCombo(targetServerCombo, ServerTargetDataModel.RUNTIME_TARGET_ID, deps);
-
+		synchHelper.synchCombo(targetServerCombo, RUNTIME_TARGET_ID, deps);
 	}
 
 	/**
@@ -108,7 +106,6 @@
 
 	public void dispose() {
 		model.removeListener(synchHelper);
-		synchHelper.dispose();
 		model = null;
 	}
 
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/datamodel/properties/IJ2EEComponentCreationDataModelProperties.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/datamodel/properties/IJ2EEComponentCreationDataModelProperties.java
index ed73e57..1485a06 100644
--- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/datamodel/properties/IJ2EEComponentCreationDataModelProperties.java
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/datamodel/properties/IJ2EEComponentCreationDataModelProperties.java
@@ -77,5 +77,5 @@
     /**
      * type ClassPathSelection
      */
-    public static final String NESTED_CLASSPATH_SELECTION_DM = "IComponentCreationDataModelProperties.NESTED_CLASSPATH_SELECTION_DM"; //$NON-NLS-1$
+    public static final String CLASSPATH_SELECTION = "IComponentCreationDataModelProperties.CLASSPATH_SELECTION"; //$NON-NLS-1$
 }
diff --git a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEComponentCreationDataModelProvider.java b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEComponentCreationDataModelProvider.java
index 6353580..3014d9b 100644
--- a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEComponentCreationDataModelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/J2EEComponentCreationDataModelProvider.java
@@ -30,16 +30,17 @@
 
 	public void init() {
 		super.init();
-        propertySet(COMPONENT_VERSION, getDefaultProperty(COMPONENT_VERSION));
+        model.setProperty(COMPONENT_VERSION, getDefaultProperty(COMPONENT_VERSION));
         model.setProperty(NESTED_ADD_COMPONENT_TO_EAR_DM, new AddComponentToEnterpriseApplicationDataModel());
-        model.setProperty(NESTED_CLASSPATH_SELECTION_DM, new UpdateManifestDataModel());
-        model.setBooleanProperty(USE_ANNOTATIONS, false);
+        propertySet(CLASSPATH_SELECTION, null);
+        model.setProperty(NESTED_UPDATE_MANIFEST_DM, new UpdateManifestDataModel());
+        model.setProperty(USE_ANNOTATIONS, Boolean.FALSE);
 	}
 
  	public String[] getPropertyNames() {
 		String[] props = new String[]{EAR_COMPONENT_NAME, EAR_COMPONENT_DEPLOY_NAME, ADD_TO_EAR, 
 				UI_SHOW_EAR_SECTION, DD_FOLDER, COMPONENT_VERSION, VALID_COMPONENT_VERSIONS_FOR_PROJECT_RUNTIME,
-                NESTED_ADD_COMPONENT_TO_EAR_DM, NESTED_CLASSPATH_SELECTION_DM, NESTED_EAR_COMPONENT_CREATION_DM,
+                NESTED_ADD_COMPONENT_TO_EAR_DM, CLASSPATH_SELECTION, NESTED_EAR_COMPONENT_CREATION_DM,
                 NESTED_UPDATE_MANIFEST_DM, EAR_COMPONENT_HANDLE, USE_ANNOTATIONS };
 		return combineProperties(super.getPropertyNames(), props);
 	}
@@ -69,11 +70,13 @@
                     String[] validModuleVersions = getServerVersions(getComponentID(), projProperties.getRuntimeTarget().getRuntimeType());
                     model.setProperty(VALID_COMPONENT_VERSIONS_FOR_PROJECT_RUNTIME, validModuleVersions);
                 }
-            }
+            }         
         }
         else if (propertyName.equals(EAR_COMPONENT_NAME)) {
 			model.setProperty(EAR_COMPONENT_HANDLE, computeEARHandle((String)propertyValue));
             model.setProperty(EAR_COMPONENT_DEPLOY_NAME, propertyValue);
+            IDataModel earDM = (IDataModel)model.getProperty(NESTED_EAR_COMPONENT_CREATION_DM);
+            earDM.setProperty(PROJECT_NAME, propertyValue);
 		} else if(propertyName.equals(COMPONENT_NAME)){
 			if (!model.isPropertySet(EAR_COMPONENT_NAME)) {
 				model.notifyPropertyChange(EAR_COMPONENT_NAME, IDataModel.VALID_VALUES_CHG);
@@ -116,10 +119,8 @@
 	 */
 	protected void setEARComponentIfJ2EEModuleCreationOnly(WorkbenchComponent workbenchComp, Object propertyValue) {
         getAddComponentToEARDataModel().setProperty(AddComponentToEnterpriseApplicationDataModel.ARCHIVE_MODULE, workbenchComp);
-        getAddComponentToEARDataModel().setProperty(AddComponentToEnterpriseApplicationDataModel.PROJECT_NAME,
-                model.getStringProperty(PROJECT_NAME));
-        getAddComponentToEARDataModel().setProperty(AddComponentToEnterpriseApplicationDataModel.EAR_MODULE_NAME,
-                model.getStringProperty(EAR_COMPONENT_NAME));
+        getAddComponentToEARDataModel().setProperty(AddComponentToEnterpriseApplicationDataModel.PROJECT_NAME, model.getStringProperty(PROJECT_NAME));
+        getAddComponentToEARDataModel().setProperty(AddComponentToEnterpriseApplicationDataModel.EAR_MODULE_NAME,model.getStringProperty(EAR_COMPONENT_NAME));
 		if (!model.isPropertySet(EAR_COMPONENT_NAME)) {
 			String earModuleName = model.getStringProperty(EAR_COMPONENT_NAME);
             model.notifyPropertyChange(EAR_COMPONENT_NAME, IDataModel.VALID_VALUES_CHG);
diff --git a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/internal/earcreation/DefaultJ2EEComponentCreationDataModel.java b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/internal/earcreation/DefaultJ2EEComponentCreationDataModel.java
index 84e62a9..aebb9d8 100644
--- a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/internal/earcreation/DefaultJ2EEComponentCreationDataModel.java
+++ b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/internal/earcreation/DefaultJ2EEComponentCreationDataModel.java
@@ -9,6 +9,7 @@
 import org.eclipse.jst.j2ee.application.internal.operations.DefaultJ2EEComponentCreationOperation;
 import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
 import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationDataModel;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentCreationDataModelProperties;
 import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
 import org.eclipse.jst.j2ee.internal.moduleextension.EarModuleManager;
 import org.eclipse.jst.j2ee.internal.moduleextension.EjbModuleExtension;
@@ -379,8 +380,8 @@
 		J2EEComponentCreationDataModel modModule = getNestedModel(flag);
 		if (modModule != null) {
 			String compName = ensureUniqueProjectName(name);
-            modModule.setProperty(J2EEComponentCreationDataModel.PROJECT_NAME, getStringProperty(PROJECT_NAME));
-			modModule.setProperty(J2EEComponentCreationDataModel.COMPONENT_NAME, compName);
+            modModule.setProperty(IJ2EEComponentCreationDataModelProperties.PROJECT_NAME, getStringProperty(PROJECT_NAME));
+			modModule.setProperty(IJ2EEComponentCreationDataModelProperties.COMPONENT_NAME, compName);
 		}
 	}
 
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/servertarget/J2EEProjectServerTargetDataModelProvider.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/servertarget/J2EEProjectServerTargetDataModelProvider.java
index 0f3b905..055e89a 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/servertarget/J2EEProjectServerTargetDataModelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/servertarget/J2EEProjectServerTargetDataModelProvider.java
@@ -23,6 +23,11 @@
 
 	private static final String DEFAULT_TARGET_ID = "org.eclipse.jst.server.core.runtimeType"; //$NON-NLS-1$
 
+    public void init() {
+        model.setProperty(RUNTIME_TARGET_ID, getDefaultServerTargetID());
+        super.init();
+    }
+    
 	public IDataModelOperation getDefaultOperation() {
 		return new J2EEProjectServerTargetOp(model);
 	}
@@ -210,25 +215,38 @@
 		}
 		return null;
 	}
-
+    /**
+     * @return
+     */
+    private List getValidServerTargets() {
+        List validServerTargets = null;
+        //TODO: api is needed from the server target helper to get all server targets
+        //validServerTargets = ServerTargetHelper.getServerTargets(IServerTargetConstants.EAR_TYPE, IServerTargetConstants.J2EE_14);
+        validServerTargets = ServerTargetHelper.getServerTargets("", "");  //$NON-NLS-1$  //$NON-NLS-2$
+        if (validServerTargets != null && validServerTargets.isEmpty())
+            validServerTargets = null;
+        if (validServerTargets == null)
+            return Collections.EMPTY_LIST;
+        return validServerTargets;
+    }
 	/**
 	 * @return
 	 */
-	private List getValidServerTargets() {
-		List validServerTargets = null;
-		String type = computeTypeId();
-		if (type != null) {
-			String version = computeVersionId();
-			if (version != null) {
-				validServerTargets = ServerTargetHelper.getServerTargets(type, version);
-				if (validServerTargets != null && validServerTargets.isEmpty())
-					validServerTargets = null;
-			}
-		}
-		if (validServerTargets == null)
-			return Collections.EMPTY_LIST;
-		return validServerTargets;
-	}
+//	private List getValidServerTargets() {
+//		List validServerTargets = null;
+//		String type = computeTypeId();
+//		if (type != null) {
+//			String version = computeVersionId();
+//			if (version != null) {
+//				validServerTargets = ServerTargetHelper.getServerTargets(type, version);
+//				if (validServerTargets != null && validServerTargets.isEmpty())
+//					validServerTargets = null;
+//			}
+//		}
+//		if (validServerTargets == null)
+//			return Collections.EMPTY_LIST;
+//		return validServerTargets;
+//	}
 
 	/*
 	 * (non-Javadoc)
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/actions/ConvertToWebModuleTypeAction.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/actions/ConvertToWebModuleTypeAction.java
index 6f485ca..861d456 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/actions/ConvertToWebModuleTypeAction.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/actions/ConvertToWebModuleTypeAction.java
@@ -8,23 +8,16 @@
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
 import org.eclipse.jst.j2ee.internal.actions.AbstractOpenWizardWorkbenchAction;
 import org.eclipse.jst.j2ee.internal.project.IWebNatureConstants;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModel;
-import org.eclipse.jst.j2ee.internal.web.operations.ConvertWebProjectDataModel;
-import org.eclipse.jst.servlet.ui.internal.wizard.ConvertToWebComponentTypeWizard;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.wst.common.internal.emfworkbench.operation.EditModelOperationDataModel;
 import org.eclipse.wst.web.internal.operation.IBaseWebNature;
-import org.eclipse.wst.web.internal.operation.StaticWebNatureRuntime;
 
 public class ConvertToWebModuleTypeAction extends AbstractOpenWizardWorkbenchAction {
 
@@ -44,7 +37,8 @@
 	}
 
 	protected Wizard createWizard() {
-		ConvertToWebComponentTypeWizard wizard = new ConvertToWebComponentTypeWizard(new ConvertWebProjectDataModel());
+        //TODO: reimplement
+/*		ConvertToWebComponentTypeWizard wizard = new ConvertToWebComponentTypeWizard(new ConvertWebProjectDataModel());
 		WebComponentCreationDataModel model = (WebComponentCreationDataModel) wizard.getModel();
 		model.setProperty(EditModelOperationDataModel.PROJECT_NAME, project.getName());
 		model.setBooleanProperty(J2EEComponentCreationDataModel.ADD_TO_EAR, true);
@@ -63,7 +57,8 @@
 
 		// wizard.setWindowTitle("Convert to Dynamic Web Project");
 
-		return wizard;
+		return wizard;*/
+        return null;
 	}
 
 	/**
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/ConvertToWebComponentTypeWizard.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/ConvertToWebComponentTypeWizard.java
index 6991046..74d5dbf 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/ConvertToWebComponentTypeWizard.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/ConvertToWebComponentTypeWizard.java
@@ -10,16 +10,11 @@
  *******************************************************************************/
 package org.eclipse.jst.servlet.ui.internal.wizard;
 
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModel;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationOperation;
 import org.eclipse.jst.j2ee.internal.web.operations.ConvertWebProjectDataModel;
 import org.eclipse.jst.servlet.ui.internal.plugin.WEBUIMessages;
 import org.eclipse.ui.IWorkbench;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
 
 /*
@@ -31,7 +26,7 @@
 public class ConvertToWebComponentTypeWizard extends WebComponentCreationWizard {
 	private static final String ConvertToWebModuleTypeWizard = "org.eclipse.jst.servlet.ui.internal.wizard.convertWebProjectTypeWizard"; //$NON-NLS-1$
 
-	public ConvertToWebComponentTypeWizard(ConvertWebProjectDataModel dataModel) {
+	public ConvertToWebComponentTypeWizard(IDataModel dataModel) {
 		// TODO use flexible project
 		//super(dataModel);
 	}
@@ -47,17 +42,6 @@
 		// TODO Auto-generated method stub
 		return new ConvertWebProjectDataModel();
 	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jem.util.ui.wizard.WTPWizard#createOperation()
-	 */
-	protected WTPOperation createBaseOperation() {
-		// TODO Auto-generated method stub
-		return new WebComponentCreationOperation((WebComponentCreationDataModel) model);
-	}
-
 	/*
 	 * (non-Javadoc)
 	 * 
@@ -71,15 +55,6 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see com.ibm.wtp.web.ui.wizard.WEBProjectWizard#getWizardID()
-	 */
-	public String getWizardID() {
-		return ConvertToWebModuleTypeWizard;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
 	 * @see com.ibm.wtp.web.ui.wizard.WEBProjectWizard#init(org.eclipse.ui.IWorkbench,
 	 *      org.eclipse.jface.viewers.IStructuredSelection)
 	 */
@@ -93,15 +68,16 @@
 	 * @see org.eclipse.jem.util.ui.wizard.WTPWizard#prePerformFinish()
 	 */
 	protected boolean prePerformFinish() {
-		IProjectDescription desc;
+/*		IProjectDescription desc;
 		try {
-			desc = ((WebComponentCreationDataModel) model).getTargetProject().getDescription();
-			desc.setBuildSpec(new ICommand[0]);
+			//desc = ((WebComponentCreationDataModel) model).getTargetProject().getDescription();
+			//desc.setBuildSpec(new ICommand[0]);
 		} catch (CoreException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}
 
-		return super.prePerformFinish();
+		return super.prePerformFinish();*/
+        return true;
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WARImportPage.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WARImportPage.java
index da51461..b11665f 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WARImportPage.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WARImportPage.java
@@ -20,13 +20,10 @@
 import org.eclipse.jst.j2ee.application.internal.operations.J2EEModuleImportDataModel;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModel;
 import org.eclipse.jst.j2ee.internal.web.archive.operations.WebModuleImportDataModel;
-import org.eclipse.jst.j2ee.internal.wizard.AnnotationsStandaloneGroup;
 import org.eclipse.jst.j2ee.internal.wizard.J2EEModuleImportPage;
 import org.eclipse.jst.servlet.ui.internal.plugin.WEBUIMessages;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPWizard;
 
 
 /**
@@ -60,10 +57,6 @@
 		return getWebDataModel().getJ2eeArtifactCreationDataModel();
 	}
 
-	protected WTPWizard getNewProjectWizard(WebComponentCreationDataModel aModel) {
-		return new WebComponentCreationWizard(aModel);
-	}
-
 	private WebModuleImportDataModel getWebDataModel() {
 		return (WebModuleImportDataModel) model;
 	}
@@ -78,7 +71,8 @@
 	 * @see org.eclipse.jst.j2ee.internal.internal.internal.ui.wizard.J2EEModuleImportPage#createAnnotationsStandaloneGroup(org.eclipse.swt.widgets.Composite)
 	 */
 	protected void createAnnotationsStandaloneGroup(Composite composite) {
-		new AnnotationsStandaloneGroup(composite, getWebDataModel(), false);
+        //TODO: implement with new import wizards
+		//new AnnotationsStandaloneGroup(composite, getWebDataModel(), false);
 	}
 
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentCreationWizard.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentCreationWizard.java
index 90bb84c..c893590 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentCreationWizard.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentCreationWizard.java
@@ -15,11 +15,12 @@
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
 import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModel;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationOperation;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModelProvider;
 import org.eclipse.jst.j2ee.internal.wizard.J2EEComponentCreationWizard;
 import org.eclipse.jst.servlet.ui.internal.plugin.WEBUIMessages;
 import org.eclipse.ui.INewWizard;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
 import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
 
 /**
@@ -58,7 +59,7 @@
 	 * </p>
 	 * @param model The model parameter is used to pre-populate wizard controls and interface with the operation
 	 */
-	public WebComponentCreationWizard(WebComponentCreationDataModel model) {
+	public WebComponentCreationWizard(IDataModel model) {
 		super(model);
 	}
 
@@ -77,20 +78,6 @@
 		aModel.setBooleanProperty(J2EEComponentCreationDataModel.ADD_TO_EAR, false);
 		return aModel;
 	}
-	
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * <p>
-	 * Overridden to return an {@link WebProjectCreationOperation}. 
-	 * </p>
-	 * 
-	 * @return Returns the specific operation for the creation of J2EE Web modules
-	 */
-	protected WTPOperation createBaseOperation() {
-		return new WebComponentCreationOperation(getSpecificDataModel());
-	}
-
 	/** 
 	 * {@inheritDoc}   
 	 * 
@@ -98,7 +85,6 @@
 	 * Sets up the dialog window title and default page image. 
 	 * </p> 
 	 * 
-	 * @see J2EEArtifactCreationWizard#doInit()
 	 */
 	protected void doInit() {
 		setWindowTitle(WEBUIMessages.getResourceString(WEBUIMessages.WEB_MODULE_WIZ_TITLE));
@@ -113,23 +99,13 @@
 	 * </p>
 	 */
 	protected void doAddPages() {
-		WebComponentCreationWizardPage page = new WebComponentCreationWizardPage(getSpecificDataModel(), MAIN_PG);
+		WebComponentCreationWizardPage page = new WebComponentCreationWizardPage(getDataModel(), MAIN_PG);
 		page.setInfopopID("org.eclipse.jst.j2ee.ui.webw1000"); //$NON-NLS-1$
 		addPage(page);
 		super.doAddPages();
-	} 
-	
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.extensions.ExtendableWizard#getWizardID()
-	 */
-	public String getWizardID() {
-		return WIZARD_ID;
-	} 
-	
-	private WebComponentCreationDataModel getSpecificDataModel() {
-		return (WebComponentCreationDataModel) getModel();
 	}
 
+    protected IDataModelProvider getDefaultProvider() {
+        return new WebComponentCreationDataModelProvider();
+    } 
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentCreationWizardPage.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentCreationWizardPage.java
index 6e3dee4..734fea9 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentCreationWizardPage.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/WebComponentCreationWizardPage.java
@@ -11,13 +11,11 @@
 
 package org.eclipse.jst.servlet.ui.internal.wizard;
 
-import org.eclipse.jst.j2ee.application.internal.operations.AddWebModuleToEARDataModel;
-import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentCreationDataModel;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModel;
-import org.eclipse.jst.j2ee.internal.wizard.AnnotationsStandaloneGroup;
+import org.eclipse.jst.j2ee.internal.wizard.DataModelAnnotationsStandaloneGroup;
 import org.eclipse.jst.j2ee.internal.wizard.J2EEComponentCreationWizardPage;
+import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentCreationDataModelProperties;
 import org.eclipse.jst.servlet.ui.internal.plugin.WEBUIMessages;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
@@ -25,25 +23,24 @@
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.common.componentcore.internal.operation.ComponentCreationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 
 /**
  * 
  */
-public class WebComponentCreationWizardPage extends J2EEComponentCreationWizardPage {
+public class WebComponentCreationWizardPage extends J2EEComponentCreationWizardPage implements IWebComponentCreationDataModelProperties{
 
 	public Text contextRootNameField = null;
 	public Label contextRootLabel = null;
 
 	private static final int SIZING_TEXT_FIELD_WIDTH = 250;
-	private AnnotationsStandaloneGroup annotationsGroup;
+	private DataModelAnnotationsStandaloneGroup annotationsGroup;
 	
 	/**
 	 * @param model
 	 * @param pageName
 	 */
-	public WebComponentCreationWizardPage(WebComponentCreationDataModel  model, String pageName) {
+	public WebComponentCreationWizardPage(IDataModel model, String pageName) {
 		super(model, pageName);
 		setTitle(WEBUIMessages.getResourceString(WEBUIMessages.WEB_PROJECT_MAIN_PG_TITLE));
 		setDescription(WEBUIMessages.getResourceString(WEBUIMessages.WEB_PROJECT_MAIN_PG_DESC));
@@ -67,22 +64,18 @@
 		data = new GridData(GridData.FILL_HORIZONTAL);
 		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
 		contextRootNameField.setLayoutData(data);
-		synchHelper.synchText(contextRootNameField, WebComponentCreationDataModel.CONTEXT_ROOT, new Control[]{contextRootLabel});
+		synchHelper.synchText(contextRootNameField, CONTEXT_ROOT, new Control[]{contextRootLabel});
 		
 		createAnnotationsGroup(advanced);
 	}
 
 	private void createAnnotationsGroup(Composite parent) {
-		annotationsGroup = new AnnotationsStandaloneGroup(parent, getJ2EEModuleCreationDataModel(), false);
-	}
-	
-	WebComponentCreationDataModel getWebProjectCreationDataModel() {
-		return (WebComponentCreationDataModel) model;
+		annotationsGroup = new DataModelAnnotationsStandaloneGroup(parent, getDataModel(), false, synchHelper);
 	}
 
 	//TODO: utility to handle additions
 	protected String[] getValidationPropertyNames() {
-		return new String[]{ComponentCreationDataModel.PROJECT_NAME, ComponentCreationDataModel.COMPONENT_NAME, ComponentCreationDataModel.COMPONENT_VERSION, WTPOperationDataModel.NESTED_MODEL_VALIDATION_HOOK, J2EEComponentCreationDataModel.ADD_TO_EAR, AddWebModuleToEARDataModel.CONTEXT_ROOT};
+		return new String[]{PROJECT_NAME, COMPONENT_NAME, COMPONENT_VERSION, ADD_TO_EAR, CONTEXT_ROOT};
 	}
 
 	public void dispose() {
