added web services back in
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/OpenExternalWSDLAction.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/OpenExternalWSDLAction.java
new file mode 100644
index 0000000..f80437d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/OpenExternalWSDLAction.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Apr 29, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.internal.webservice;
+
+import java.net.URL;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jst.j2ee.internal.actions.AbstractOpenAction;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.internet.webbrowser.WebBrowser;
+import org.eclipse.wst.wsdl.internal.util.WSDLResourceImpl;
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class OpenExternalWSDLAction extends AbstractOpenAction {
+
+	String uri = ""; //$NON-NLS-1$
+
+	/**
+	 * @param text
+	 */
+	public OpenExternalWSDLAction(String text) {
+		super(text);
+		this.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(J2EEUIPlugin.PLUGIN_ID, "icons/web_type.gif")); //$NON-NLS-1$
+	}
+
+	public void run() {
+		try {
+			WebBrowser.openURL(new URL(uri), WebBrowser.SHOW_ALL | WebBrowser.FORCE_NEW_PAGE, null);
+		} catch (Exception e) {
+		}
+	}
+
+	public boolean updateSelection(IStructuredSelection s) {
+		Object obj = s.getFirstElement();
+		if (obj instanceof WSDLResourceImpl)
+			uri = ((WSDLResourceImpl) obj).getURI().toString();
+		return super.updateSelection(s);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceAdapterFactory.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceAdapterFactory.java
new file mode 100644
index 0000000..3a98879
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceAdapterFactory.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Mar 4, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.internal.webservice;
+
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
+import org.eclipse.jst.j2ee.webservice.wsdd.WsddResource;
+import org.eclipse.wst.common.internal.emfworkbench.EMFAdapterFactory;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.wsdl.Service;
+
+import com.ibm.wtp.emf.workbench.ProjectUtilities;
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebServiceAdapterFactory extends EMFAdapterFactory {
+
+	/**
+	 * Default constructor
+	 */
+	public WebServiceAdapterFactory() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
+	 */
+	public Object getAdapter(Object adaptableObject, Class adapterType) {
+		WsddResource res = null;
+		if (adaptableObject instanceof Service)
+			res = WebServicesManager.getInstance().getWsddResource((Service) adaptableObject);
+
+		if (res != null && adapterType == EMFAdapterFactory.IFILE_CLASS)
+			return WorkbenchResourceHelper.getFile(res);
+		else if (res != null && adapterType == EMFAdapterFactory.IRESOURCE_CLASS)
+			return WorkbenchResourceHelper.getFile(res);
+		else if (res != null && adapterType == EMFAdapterFactory.IPROJECT_CLASS)
+			return ProjectUtilities.getProject(res);
+		else
+			return super.getAdapter(adaptableObject, adapterType);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceFilesContribution.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceFilesContribution.java
new file mode 100644
index 0000000..cfae026
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceFilesContribution.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Jan 23, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.internal.webservice;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServiceDescription;
+
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebServiceFilesContribution {
+
+	protected WebServiceDescription webService;
+	protected List allFiles = null;
+
+	/**
+	 * Constructor
+	 */
+	public WebServiceFilesContribution(WebServiceDescription webService) {
+		super();
+		this.webService = webService;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return WebServiceUIResourceHandler.getString("WebServiceFilesContribution_UI_0"); //$NON-NLS-1$
+	}
+
+	public String getWSDLFile() {
+		return webService.getWsdlFile();
+	}
+
+	public String getMappingFile() {
+		return webService.getJaxrpcMappingFile();
+	}
+
+	public List getAllFiles() {
+		if (allFiles == null) {
+			allFiles = new ArrayList();
+			allFiles.add(getWSDLFile());
+			allFiles.add(getMappingFile());
+		}
+		return allFiles;
+	}
+
+	/**
+	 * @return Returns the webService.
+	 */
+	public WebServiceDescription getWebService() {
+		return webService;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceGroupContentExtension.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceGroupContentExtension.java
new file mode 100644
index 0000000..ed7fb9c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceGroupContentExtension.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Jan 19, 2004
+ * 
+ * To change the template for this generated file go to Window - Preferences -
+ * Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.internal.webservice;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jst.j2ee.internal.actions.OpenJ2EEResourceAction;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
+import org.eclipse.jst.j2ee.webservice.wsdd.BeanLink;
+import org.eclipse.jst.j2ee.webservice.wsdd.ServiceImplBean;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.activities.ActivityManagerEvent;
+import org.eclipse.ui.activities.IActivityManagerListener;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.common.internal.emfworkbench.integration.DynamicAdapterFactory;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
+import org.eclipse.wst.common.navigator.internal.views.DefaultNavigatorContentExtension;
+import org.eclipse.wst.common.navigator.internal.views.actions.CommonEditActionGroup;
+import org.eclipse.wst.common.navigator.internal.views.actions.ICommonMenuConstants;
+import org.eclipse.wst.common.navigator.internal.views.extensions.NavigatorActivityHelper;
+import org.eclipse.wst.common.navigator.views.INavigatorContentProvider;
+import org.eclipse.wst.wsdl.internal.util.WSDLResourceImpl;
+
+/**
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebServiceGroupContentExtension extends DefaultNavigatorContentExtension implements EditModelListener, IActivityManagerListener {
+	private final static String VIEWER_ID = "org.eclipse.wst.navigator.ui.WTPCommonNavigator";//$NON-NLS-1$
+	private INavigatorContentProvider contentProvider = null;
+	private ILabelProvider labelProvider = null;
+	private OpenJ2EEResourceAction openAction = new OpenJ2EEResourceAction();
+	private OpenExternalWSDLAction openExternalWSDLAction = new OpenExternalWSDLAction(WebServiceUIResourceHandler.getString("WebServiceGroupContentExtension_UI_1")); //$NON-NLS-1$
+
+	public WebServiceGroupContentExtension() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.DefaultNavigatorContentExtension#doInit()
+	 */
+	public void doInit() {
+		WebServicesManager.getInstance().addListener(this);
+		PlatformUI.getWorkbench().getActivitySupport().getActivityManager().addActivityManagerListener(this);
+
+		// create the default synchronizer for any web service editor to use with view due
+		// to the usage of seperate edit models.
+		WebServicesNavigatorSynchronizer.createInstance(createAdapterFactory(), this);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorContentExtension#getDescription(org.eclipse.jface.viewers.IStructuredSelection)
+	 */
+	public String getDescription(IStructuredSelection selection) {
+		return ""; //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorContentExtension#getContentProvider()
+	 */
+	public INavigatorContentProvider getContentProvider() {
+		if (contentProvider == null)
+			contentProvider = new WebServicesNavigatorContentProvider(createAdapterFactory(), this);
+		return contentProvider;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorContentExtension#getLabelProvider()
+	 */
+	public ILabelProvider getLabelProvider() {
+		if (labelProvider == null) {
+			labelProvider = new WebServicesNavigatorLabelProvider(createAdapterFactory());
+		}
+		return labelProvider;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener#editModelChanged(org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent)
+	 */
+	public void editModelChanged(EditModelEvent anEvent) {
+		this.getExtensionSite().notifyElementReplaced(this, ((WebServicesNavigatorContentProvider) getContentProvider()).getNavigatorGroup());
+	}
+
+	/**
+	 * Configure and return a composite adapter factory for our contents
+	 */
+	public AdapterFactory createAdapterFactory() {
+		return new DynamicAdapterFactory(VIEWER_ID);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorContentExtension#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		WebServicesManager.getInstance().removeListener(this);
+		PlatformUI.getWorkbench().getActivitySupport().getActivityManager().removeActivityManagerListener(this);
+
+		// dispose current instance of web service editor/explorer synchronizer
+		WebServicesNavigatorSynchronizer.disposeInstance();
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorContentExtension#getEditActionGroup()
+	 */
+	public CommonEditActionGroup getEditActionGroup() {
+		return new CommonEditActionGroup(getExtensionSite()) {
+			public void fillOpenWithMenu(IMenuManager menu) {
+				if ((getExtensionSite().getSelection().getFirstElement() instanceof BeanLink)) {
+					openAction.selectionChanged(getExtensionSite().getSelection());
+					menu.insertAfter(ICommonMenuConstants.COMMON_MENU_TOP, openAction);
+				} else if ((getExtensionSite().getSelection().getFirstElement() instanceof WSDLResourceImpl)) {
+					WSDLResourceImpl wsdl = (WSDLResourceImpl) getExtensionSite().getSelection().getFirstElement();
+					IFile wsdlFile = WorkbenchResourceHelper.getFile(wsdl);
+					if (wsdlFile == null || !wsdlFile.exists()) {
+						openExternalWSDLAction.selectionChanged(getExtensionSite().getSelection());
+						menu.insertAfter(ICommonMenuConstants.COMMON_MENU_TOP, openExternalWSDLAction);
+					}
+				}
+			}
+
+			public void runDefaultAction(IStructuredSelection element) {
+				if (element.getFirstElement() instanceof ServiceImplBean)
+					return;
+				if ((getExtensionSite().getSelection().getFirstElement() instanceof BeanLink)) {
+					openAction.selectionChanged(element);
+					openAction.run();
+					return;
+				} else if ((getExtensionSite().getSelection().getFirstElement() instanceof WSDLResourceImpl)) {
+					WSDLResourceImpl wsdl = (WSDLResourceImpl) getExtensionSite().getSelection().getFirstElement();
+					IFile wsdlFile = WorkbenchResourceHelper.getFile(wsdl);
+					if (wsdlFile == null || !wsdlFile.exists()) {
+						openExternalWSDLAction.selectionChanged(element);
+						openExternalWSDLAction.run();
+						return;
+					}
+				}
+
+				openAction.selectionChanged(element);
+				openAction.run();
+
+			}
+		};
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.activities.IActivityManagerListener#activityManagerChanged(org.eclipse.ui.activities.ActivityManagerEvent)
+	 */
+	public void activityManagerChanged(ActivityManagerEvent activityManagerEvent) {
+		WebServicesNavigatorContentProvider provider = (WebServicesNavigatorContentProvider) getContentProvider();
+		boolean webServicesEnabled = NavigatorActivityHelper.isActivityEnabled(this);
+		Object[] obj = new Object[]{provider.getNavigatorGroup()};
+		if (webServicesEnabled) {
+			Object root = ResourcesPlugin.getWorkspace().getRoot();
+			getExtensionSite().notifyElementsAdded(this, root, obj);
+		} else {
+			getExtensionSite().notifyElementsRemoved(this, obj);
+		}
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceNavigatorGroup.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceNavigatorGroup.java
new file mode 100644
index 0000000..94eb7a1
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceNavigatorGroup.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Jan 20, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.internal.webservice;
+
+import org.eclipse.core.internal.resources.WorkspaceRoot;
+
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebServiceNavigatorGroup {
+
+	private String label = WebServiceUIResourceHandler.getString("WebServiceNavigatorGroup_UI_0"); //$NON-NLS-1$
+	private WorkspaceRoot root;
+
+	/**
+	 * Default constructor
+	 */
+	public WebServiceNavigatorGroup(WorkspaceRoot wsRoot) {
+		super();
+		root = wsRoot;
+	}
+
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return label;
+	}
+
+	/**
+	 * @return Returns the root.
+	 */
+	public WorkspaceRoot getRoot() {
+		return root;
+	}
+
+	/**
+	 * @param root
+	 *            The root to set.
+	 */
+	public void setRoot(WorkspaceRoot root) {
+		this.root = root;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceNavigatorGroupType.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceNavigatorGroupType.java
new file mode 100644
index 0000000..73eb9d0
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceNavigatorGroupType.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Feb 25, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.internal.webservice;
+
+import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
+import org.eclipse.ui.IActionFilter;
+import org.eclipse.wst.wsdl.Service;
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebServiceNavigatorGroupType implements IActionFilter {
+
+	public static final int SERVICES = 0;
+	public static final int CLIENTS = 2;
+	public static final int HANDLERS = 3;
+
+	public static final String SERVICES_UI = WebServiceUIResourceHandler.getString("WebServiceNavigatorGroupType_UI_0"); //$NON-NLS-1$
+	public static final String CLIENTS_UI = WebServiceUIResourceHandler.getString("WebServiceNavigatorGroupType_UI_1"); //$NON-NLS-1$
+	public static final String HANDLERS_UI = WebServiceUIResourceHandler.getString("WebServiceNavigatorGroupType_UI_2"); //$NON-NLS-1$
+
+	private int TYPE;
+	private Service wsdlService = null;
+	private ServiceRef serviceRef = null;
+
+	/**
+	 * Create a specific type of web service navigator grouping
+	 */
+	public WebServiceNavigatorGroupType(int groupType) {
+		super();
+		TYPE = groupType;
+	}
+
+	/**
+	 * Create a specific type of web service navigator grouping
+	 */
+	public WebServiceNavigatorGroupType(int groupType, Service wsdlService) {
+		super();
+		TYPE = groupType;
+		this.wsdlService = wsdlService;
+	}
+
+	/**
+	 * Create a specific type of web service navigator grouping
+	 */
+	public WebServiceNavigatorGroupType(int groupType, ServiceRef serviceRef) {
+		super();
+		TYPE = groupType;
+		this.serviceRef = serviceRef;
+	}
+
+	/**
+	 * @return Returns the TYPE.
+	 */
+	public int getGroupType() {
+		return TYPE;
+	}
+
+	public boolean isServices() {
+		return getGroupType() == SERVICES;
+	}
+
+	public boolean isClients() {
+		return getGroupType() == CLIENTS;
+	}
+
+	public boolean isHandlers() {
+		return getGroupType() == HANDLERS;
+	}
+
+	public Service getWsdlService() {
+		return wsdlService;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		if (isServices())
+			return SERVICES_UI;
+		else if (isClients())
+			return CLIENTS_UI;
+		else if (isHandlers())
+			return HANDLERS_UI;
+		else
+			return super.toString();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IActionFilter#testAttribute(java.lang.Object, java.lang.String,
+	 *      java.lang.String)
+	 */
+	public boolean testAttribute(Object target, String name, String value) {
+		if (target != null && target instanceof WebServiceNavigatorGroupType && value != null) {
+			WebServiceNavigatorGroupType group = (WebServiceNavigatorGroupType) target;
+			if (group.isClients() && value.equals(CLIENTS_UI))
+				return true;
+			else if (group.isServices() && value.equals(SERVICES_UI))
+				return true;
+			else if (group.isHandlers() && value.equals(HANDLERS_UI))
+				return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @return Returns the serviceRef.
+	 */
+	public ServiceRef getServiceRef() {
+		return serviceRef;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceUIResourceHandler.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceUIResourceHandler.java
new file mode 100644
index 0000000..bafd32b
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServiceUIResourceHandler.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Feb 27, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.internal.webservice;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * @author jialin
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebServiceUIResourceHandler {
+
+	private static ResourceBundle fgResourceBundle;
+
+	/**
+	 * Returns the resource bundle used by all classes in this Project
+	 */
+	public static ResourceBundle getResourceBundle() {
+		try {
+			return ResourceBundle.getBundle("webserviceui");//$NON-NLS-1$
+		} catch (MissingResourceException e) {
+			// does nothing - this method will return null and
+			// getString(String, String) will return the key
+			// it was called with
+		}
+		return null;
+	}
+
+	public static String getString(String key) {
+		if (fgResourceBundle == null) {
+			fgResourceBundle = getResourceBundle();
+		}
+
+		if (fgResourceBundle != null) {
+			try {
+				return fgResourceBundle.getString(key);
+			} catch (MissingResourceException e) {
+				return "!" + key + "!";//$NON-NLS-2$//$NON-NLS-1$
+			}
+		}
+		return "!" + key + "!";//$NON-NLS-2$//$NON-NLS-1$
+	}
+
+	public static void nlsConcatenationFinder() {
+		// used to tag methods which have concatenated strings
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServicesNavigatorContentProvider.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServicesNavigatorContentProvider.java
new file mode 100644
index 0000000..c8ac851
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServicesNavigatorContentProvider.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Jan 19, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.internal.webservice;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.core.internal.resources.WorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jst.common.navigator.internal.providers.CommonAdapterFactoryContentProvider;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
+import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
+import org.eclipse.jst.j2ee.webservice.wsdd.Handler;
+import org.eclipse.jst.j2ee.webservice.wsdd.PortComponent;
+import org.eclipse.wst.common.navigator.internal.views.extensions.NavigatorActivityHelper;
+import org.eclipse.wst.common.navigator.views.INavigatorContentExtension;
+import org.eclipse.wst.common.navigator.views.INavigatorContentProvider;
+import org.eclipse.wst.wsdl.Service;
+import org.eclipse.wst.wsdl.internal.util.WSDLResourceImpl;
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebServicesNavigatorContentProvider extends CommonAdapterFactoryContentProvider implements INavigatorContentProvider {
+
+	private WebServicesManager webServicesManager = null;
+	private boolean activityEnabled = false;
+	private WebServiceNavigatorGroup webServiceNavigatorGroup;
+	private WebServiceNavigatorGroupType SERVICES = null;
+	private WebServiceNavigatorGroupType CLIENTS = null;
+	private HashMap HANDLERS = new HashMap();
+
+	public WebServicesNavigatorContentProvider(AdapterFactory factory, INavigatorContentExtension containingExtension) {
+		super(factory, containingExtension);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorContentProvider#getChildren(java.lang.Object)
+	 */
+	public Object[] getChildren(Object parentElement) {
+		if (!NavigatorActivityHelper.isActivityEnabled(getContainingExtension())) {
+			activityEnabled = false;
+			return super.getChildren(parentElement);
+		}
+		activityEnabled = true;
+
+		if (parentElement instanceof WorkspaceRoot) {
+			return new Object[]{getWebServicesNavigatorGroup(parentElement)};
+		} else if (parentElement instanceof WebServiceNavigatorGroup) {
+			return new Object[]{getServicesGroup(), getClientsGroup()};
+		} else if (parentElement instanceof WebServiceNavigatorGroupType && ((WebServiceNavigatorGroupType) parentElement).isServices()) {
+			List result = new ArrayList();
+			result.addAll(getWebServicesManager().getInternalWSDLServices());
+			result.addAll(getWebServicesManager().getExternalWSDLServices());
+			return result.toArray();
+		} else if (parentElement instanceof WebServiceNavigatorGroupType && ((WebServiceNavigatorGroupType) parentElement).isClients()) {
+			return getWebServicesManager().getAllWorkspaceServiceRefs().toArray();
+		} else if (parentElement instanceof Service) {
+			return getServiceLevelNodes(parentElement).toArray();
+		} else if (parentElement instanceof WebServiceNavigatorGroupType && ((WebServiceNavigatorGroupType) parentElement).isHandlers()) {
+			return getHandlerChildren(parentElement).toArray();
+		} else if (parentElement instanceof ServiceRef) {
+			Collection result = new ArrayList();
+			result.add(getHandlersGroup(parentElement));
+			return result.toArray();
+		} else if (parentElement instanceof Handler) {
+			return new ArrayList().toArray();
+		} else if (parentElement instanceof WSDLResourceImpl)
+			return new ArrayList().toArray();
+		else
+			return super.getChildren(parentElement);
+	}
+
+	private List getServiceLevelNodes(Object parentElement) {
+		List result = new ArrayList();
+		// add service classes
+		if (getWebServicesManager().isServiceInternal((Service) parentElement) && getWebServicesManager().getServiceImplBean((Service) parentElement) != null)
+			result.add(getWebServicesManager().getServiceImplBean((Service) parentElement));
+		// Add handlers
+		if (getWebServicesManager().isServiceInternal((Service) parentElement))
+			result.add(getHandlersGroup(parentElement));
+		//add wsdl file
+		WSDLResourceImpl wsdl = getWebServicesManager().getWSDLResource((Service) parentElement);
+		if (wsdl != null)
+			result.add(wsdl);
+		return result;
+	}
+
+	private List getHandlerChildren(Object parentElement) {
+		List result = new ArrayList();
+		WebServiceNavigatorGroupType handlersGroup = (WebServiceNavigatorGroupType) parentElement;
+		// handle web service handlers case
+		if (handlersGroup.getWsdlService() != null) {
+			PortComponent port = WebServicesManager.getInstance().getPortComponent(handlersGroup.getWsdlService());
+			if (port != null && port.getHandlers() != null && !port.getHandlers().isEmpty())
+				result.addAll(port.getHandlers());
+		}
+		// handle service ref case
+		else if (handlersGroup.getServiceRef() != null) {
+			result.addAll(handlersGroup.getServiceRef().getHandlers());
+		}
+		return result;
+	}
+
+	/**
+	 * @param parentElement
+	 * @return
+	 */
+	protected WebServiceNavigatorGroup getWebServicesNavigatorGroup(Object parentElement) {
+		if (webServiceNavigatorGroup == null)
+			webServiceNavigatorGroup = new WebServiceNavigatorGroup((WorkspaceRoot) parentElement);
+		return webServiceNavigatorGroup;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorContentProvider#getParent(java.lang.Object)
+	 */
+	public Object getParent(Object element) {
+		if (element instanceof WorkspaceRoot)
+			return null;
+		else if (element instanceof WebServiceNavigatorGroup)
+			return ((WebServiceNavigatorGroup) element).getRoot();
+		else
+			return super.getParent(element);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorContentProvider#hasChildren(java.lang.Object)
+	 */
+	public boolean hasChildren(Object element) {
+		// always returning true should prevent children from being calculated til expanded
+
+		//		if (element instanceof EJBLink || element instanceof ServletLink || element instanceof
+		// WSDLPort
+		//				|| element instanceof String || element instanceof WSDLResourceImpl || element instanceof
+		// ServiceRef
+		//				|| element instanceof Handler)
+		//			return false;
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
+	 *      java.lang.Object, java.lang.Object)
+	 */
+	public void inputChanged(Viewer aViewer, Object oldInput, Object newInput) {
+		// TODO handle change events
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object inputElement) {
+		return getChildren(inputElement);
+	}
+
+	/**
+	 * @return Returns the navigatorGroup.
+	 */
+	public WebServiceNavigatorGroup getNavigatorGroup() {
+		if (null == webServiceNavigatorGroup) {
+			webServiceNavigatorGroup = new WebServiceNavigatorGroup((WorkspaceRoot) ResourcesPlugin.getWorkspace().getRoot());
+		}
+		return webServiceNavigatorGroup;
+	}
+
+	protected WebServicesManager getWebServicesManager() {
+		if (webServicesManager == null)
+			webServicesManager = WebServicesManager.getInstance();
+		return webServicesManager;
+	}
+
+	/**
+	 * @return Returns the activityEnabled.
+	 */
+	public boolean isActivityEnabled() {
+		return activityEnabled;
+	}
+
+	private WebServiceNavigatorGroupType getServicesGroup() {
+		if (SERVICES == null)
+			SERVICES = new WebServiceNavigatorGroupType(WebServiceNavigatorGroupType.SERVICES);
+		return SERVICES;
+	}
+
+	private WebServiceNavigatorGroupType getClientsGroup() {
+		if (CLIENTS == null)
+			CLIENTS = new WebServiceNavigatorGroupType(WebServiceNavigatorGroupType.CLIENTS);
+		return CLIENTS;
+	}
+
+	private WebServiceNavigatorGroupType getHandlersGroup(Object key) {
+		if (key == null)
+			return null;
+		WebServiceNavigatorGroupType handler = null;
+		handler = (WebServiceNavigatorGroupType) HANDLERS.get(key);
+		if (handler == null) {
+			if (key instanceof Service)
+				handler = new WebServiceNavigatorGroupType(WebServiceNavigatorGroupType.HANDLERS, (Service) key);
+			else if (key instanceof ServiceRef)
+				handler = new WebServiceNavigatorGroupType(WebServiceNavigatorGroupType.HANDLERS, (ServiceRef) key);
+			if (handler != null)
+				HANDLERS.put(key, handler);
+		}
+		return handler;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServicesNavigatorLabelProvider.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServicesNavigatorLabelProvider.java
new file mode 100644
index 0000000..5a4043b
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServicesNavigatorLabelProvider.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Jan 19, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.internal.webservice;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jst.j2ee.ejb.Session;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
+import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
+import org.eclipse.jst.j2ee.webservice.wsdd.EJBLink;
+import org.eclipse.jst.j2ee.webservice.wsdd.Handler;
+import org.eclipse.jst.j2ee.webservice.wsdd.PortComponent;
+import org.eclipse.jst.j2ee.webservice.wsdd.ServiceImplBean;
+import org.eclipse.jst.j2ee.webservice.wsdd.ServletLink;
+import org.eclipse.jst.j2ee.webservice.wsdd.WSDLPort;
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServiceDescription;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.wsdl.Service;
+import org.eclipse.wst.wsdl.internal.util.WSDLResourceImpl;
+
+import com.ibm.wtp.emf.workbench.ProjectUtilities;
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebServicesNavigatorLabelProvider extends AdapterFactoryLabelProvider implements ILabelProvider {
+
+	public WebServicesNavigatorLabelProvider(AdapterFactory factory) {
+		super(factory);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+	 */
+	public Image getImage(Object element) {
+		if (element instanceof WebServiceNavigatorGroup)
+			return J2EEUIPlugin.getDefault().getImage("webServicesFolder_obj"); //$NON-NLS-1$
+		else if (element instanceof String)
+			return J2EEUIPlugin.getDefault().getImage("wsdl"); //$NON-NLS-1$
+		else if (element instanceof WebServiceNavigatorGroupType)
+			return J2EEUIPlugin.getDefault().getImage("folder"); //$NON-NLS-1$
+		else if (element instanceof Service) {
+			if (WebServicesManager.getInstance().isServiceInternal((Service) element))
+				return J2EEUIPlugin.getDefault().getImage("webServiceItemProvider_obj"); //$NON-NLS-1$
+			return J2EEUIPlugin.getDefault().getImage("extwebserviceitemprovider_obj"); //$NON-NLS-1$
+		} else if (element instanceof WSDLResourceImpl)
+			return J2EEUIPlugin.getDefault().getImage("wsdl"); //$NON-NLS-1$
+		else
+			return super.getImage(element);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+	 */
+	public String getText(Object element) {
+		String space = " "; //$NON-NLS-1$
+		if (element instanceof WebServiceDescription)
+			return getWebServiceDescriptionText((WebServiceDescription) element);
+		else if (element instanceof PortComponent)
+			return WebServiceUIResourceHandler.getString("PORT_UI_") + space + super.getText(element); //$NON-NLS-1$
+		else if (element instanceof Handler)
+			return WebServiceUIResourceHandler.getString("HANDLER_UI_") + space + super.getText(element); //$NON-NLS-1$
+		else if (element instanceof WSDLPort)
+			return WebServiceUIResourceHandler.getString("WSDL_PORT_UI_") + space + super.getText(element); //$NON-NLS-1$
+		else if (element instanceof ServiceImplBean)
+			return WebServiceUIResourceHandler.getString("SERVICE_CLASSES_UI_"); //$NON-NLS-1$
+		else if (element instanceof EJBLink)
+			return WebServiceUIResourceHandler.getString("SERVICE_IMPL_UI_") + space + super.getText(element); //$NON-NLS-1$
+		else if (element instanceof ServletLink)
+			return WebServiceUIResourceHandler.getString("SERVICE_IMPL_UI_") + space + super.getText(element); //$NON-NLS-1$
+		else if (element instanceof Service)
+			return ((Service) element).getQName().getLocalPart();
+		else if (element instanceof WSDLResourceImpl) {
+			String result = ""; //$NON-NLS-1$
+			IFile file = WorkbenchResourceHelper.getFile((WSDLResourceImpl) element);
+			if (file != null && file.exists())
+				result = file.getFullPath().toString();
+			else
+				result = ((WSDLResourceImpl) element).getURI().toString();
+			return WebServiceUIResourceHandler.getString("WSDL_UI_") + space + result; //$NON-NLS-1$
+		} else if (element instanceof ServiceRef) {
+			String beanName14 = ""; //$NON-NLS-1$
+			if (WebServicesManager.getInstance().isJ2EE14((ServiceRef) element)) {
+				if (((ServiceRef) element).eContainer() instanceof Session)
+					beanName14 = ((Session) ((ServiceRef) element).eContainer()).getName() + ": "; //$NON-NLS-1$
+			}
+
+			return ProjectUtilities.getProject((ServiceRef) element).getName() + ": " + beanName14 //$NON-NLS-1$
+						+ ((ServiceRef) element).getServiceRefName();
+		} else
+			return super.getText(element);
+	}
+
+	/**
+	 * get text for web service
+	 */
+	private String getWebServiceDescriptionText(WebServiceDescription description) {
+		Resource res = description.eResource();
+		IProject project = null;
+		String projString = ""; //$NON-NLS-1$
+		if (res != null)
+			project = WorkbenchResourceHelper.getProject(res);
+		if (project != null)
+			projString = project.getName() + ": "; //$NON-NLS-1$
+		return projString + super.getText(description);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+	 */
+	public void addListener(ILabelProviderListener listener) {
+		// TODO add any listeners?
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+	 */
+	public void dispose() {
+		// TODO handle dispose
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
+	 *      java.lang.String)
+	 */
+	public boolean isLabelProperty(Object element, String property) {
+		// TODO do something smart here?
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+	 */
+	public void removeListener(ILabelProviderListener listener) {
+		// TODO how do we remove listeners?
+
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServicesNavigatorSynchronizer.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServicesNavigatorSynchronizer.java
new file mode 100644
index 0000000..6043cd5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WebServicesNavigatorSynchronizer.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Jun 10, 2004
+ */
+package org.eclipse.jst.internal.webservice;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jst.common.navigator.internal.providers.CommonAdapterFactoryContentProvider;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
+import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServiceDescription;
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServices;
+import org.eclipse.wst.common.navigator.views.INavigatorContentExtension;
+import org.eclipse.wst.common.navigator.views.INavigatorExtensionSite;
+import org.eclipse.wst.wsdl.Service;
+
+/**
+ * @author jlanuti
+ */
+public class WebServicesNavigatorSynchronizer extends CommonAdapterFactoryContentProvider implements Adapter {
+
+
+	private static WebServicesNavigatorSynchronizer INSTANCE = null;
+	protected Notifier target = null;
+
+	/**
+	 * Constructor
+	 */
+	public WebServicesNavigatorSynchronizer(AdapterFactory adapterFactory, INavigatorContentExtension containingExtension) {
+		super(adapterFactory, containingExtension);
+	}
+
+	public static WebServicesNavigatorSynchronizer getInstance() {
+		return INSTANCE;
+	}
+
+	public static WebServicesNavigatorSynchronizer createInstance(AdapterFactory adapterFactory, INavigatorContentExtension containingExtension) {
+		INSTANCE = new WebServicesNavigatorSynchronizer(adapterFactory, containingExtension);
+		return INSTANCE;
+	}
+
+	public static void disposeInstance() {
+		INSTANCE = null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.common.notify.Adapter#getTarget()
+	 */
+	public Notifier getTarget() {
+		return target;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.common.notify.Adapter#isAdapterForType(java.lang.Object)
+	 */
+	public boolean isAdapterForType(Object type) {
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.common.notify.Adapter#setTarget(org.eclipse.emf.common.notify.Notifier)
+	 */
+	public void setTarget(Notifier newTarget) {
+		target = newTarget;
+	}
+
+	public void notifyChanged(final Notification notification) {
+		INavigatorExtensionSite site = getContainingExtension().getExtensionSite();
+		EObject notifier = (EObject) notification.getNotifier();
+
+		if (notifier instanceof WebServices)
+			return;
+
+		if (notifier instanceof ServiceRef) {
+			site.notifyElementReplaced(getContainingExtension(), notifier);
+			return;
+		}
+
+		while (!(notifier instanceof WebServiceDescription) && notifier != null)
+			notifier = notifier.eContainer();
+
+		if (notifier == null) {
+			site.notifyElementReplaced(getContainingExtension(), null);
+			return;
+		}
+
+		Service wsdl = WebServicesManager.getInstance().getWSDLServiceForWebService((WebServiceDescription) notifier);
+		site.notifyElementReplaced(getContainingExtension(), wsdl);
+
+		super.notifyChanged(notification);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WsdlResourceAdapterFactory.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WsdlResourceAdapterFactory.java
new file mode 100644
index 0000000..e04d88d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/internal/webservice/WsdlResourceAdapterFactory.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Mar 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.internal.webservice;
+
+import org.eclipse.wst.common.internal.emfworkbench.EMFAdapterFactory;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.wsdl.internal.util.WSDLResourceImpl;
+
+import com.ibm.wtp.emf.workbench.ProjectUtilities;
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WsdlResourceAdapterFactory extends EMFAdapterFactory {
+
+	/**
+	 * Default constructor
+	 */
+	public WsdlResourceAdapterFactory() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
+	 */
+	public Object getAdapter(Object adaptableObject, Class adapterType) {
+		WSDLResourceImpl res = null;
+		if (adaptableObject instanceof WSDLResourceImpl)
+			res = (WSDLResourceImpl) adaptableObject;
+
+		if (res != null && adapterType == EMFAdapterFactory.IFILE_CLASS)
+			return WorkbenchResourceHelper.getFile(res) != null ? WorkbenchResourceHelper.getFile(res) : null;
+		else if (res != null && adapterType == EMFAdapterFactory.IRESOURCE_CLASS)
+			return WorkbenchResourceHelper.getFile(res);
+		else if (res != null && adapterType == EMFAdapterFactory.IPROJECT_CLASS)
+			return ProjectUtilities.getProject(res);
+		else
+			return super.getAdapter(adaptableObject, adapterType);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/actions/OpenJ2EEResourceAction.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/actions/OpenJ2EEResourceAction.java
index 0979f23..918242c 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/actions/OpenJ2EEResourceAction.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/actions/OpenJ2EEResourceAction.java
@@ -44,7 +44,9 @@
 import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesClient;
 import org.eclipse.jst.j2ee.webservice.wsdd.BeanLink;
 import org.eclipse.jst.j2ee.webservice.wsdd.EJBLink;
+import org.eclipse.jst.j2ee.webservice.wsdd.Handler;
 import org.eclipse.jst.j2ee.webservice.wsdd.ServletLink;
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServices;
 import org.eclipse.ui.IEditorDescriptor;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IWorkbenchPage;
@@ -53,6 +55,9 @@
 import org.eclipse.ui.part.ISetSelectionTarget;
 import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
 import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
+import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.wst.wsdl.Service;
+import org.eclipse.wst.wsdl.internal.util.WSDLResourceImpl;
 
 import com.ibm.wtp.emf.workbench.ProjectUtilities;
 
@@ -176,19 +181,17 @@
 		}
 
 		// Handle wsdl case, non emf object
-		// TODO WebServices for M3
-//		if (srcObject instanceof WSDLResourceImpl || isWsdlInstance(srcObject)) {
-//			openWsdlEditor();
-//			return;
-//		}
+		if (srcObject instanceof WSDLResourceImpl || isWsdlInstance(srcObject)) {
+			openWsdlEditor();
+			return;
+		}
 
 		EObject ro = (EObject) srcObject;
 		IProject p = ProjectUtilities.getProject(ro);
 		J2EENature nature = J2EENature.getRegisteredRuntime(p);
 
-		// TODO WebServices for M3
-//		if (ro instanceof Definition || ro instanceof Service || ro instanceof Handler)
-//			r = getWebService(p); else
+		if (ro instanceof Definition || ro instanceof Service || ro instanceof Handler)
+			r = getWebService(p); else
 		if (ro instanceof BeanLink) {
 			openBeanLinkInJavaEditor((BeanLink) ro, p);
 			return;
@@ -200,18 +203,17 @@
 		openAppropriateEditor(r);
 	}
 
-	// TODO WebServices for M3
-//	private void openWsdlEditor() {
-//		WSDLResourceImpl wsdl = null;
-//		if (srcObject instanceof WSDLResourceImpl)
-//			wsdl = (WSDLResourceImpl) srcObject;
-//		else if (srcObject instanceof Service)
-//			wsdl = (WSDLResourceImpl) ((Service) srcObject).eResource();
-//		if (wsdl != null) {
-//			IResource r = WorkbenchResourceHelper.getFile(wsdl);
-//			openAppropriateEditor(r);
-//		}
-//	}
+	private void openWsdlEditor() {
+		WSDLResourceImpl wsdl = null;
+		if (srcObject instanceof WSDLResourceImpl)
+			wsdl = (WSDLResourceImpl) srcObject;
+		else if (srcObject instanceof Service)
+			wsdl = (WSDLResourceImpl) ((Service) srcObject).eResource();
+		if (wsdl != null) {
+			IResource r = WorkbenchResourceHelper.getFile(wsdl);
+			openAppropriateEditor(r);
+		}
+	}
 
 	/**
 	 * Get file from the J2EE EditModel for root object
@@ -341,11 +343,10 @@
 		//	currentDescriptor = getEjbMapEditorDescriptor();
 		else if (obj instanceof BeanLink)
 			currentDescriptor = getBaseJavaEditorDescriptor();
-		// TODO WebServices for M3
-//		else if (isWsdlInstance(obj))
-//			currentDescriptor = getWsdlDescriptor();
-//		else if (isWebserviceInstance(obj))
-//			currentDescriptor = getWebServiceDescriptor();
+		else if (isWsdlInstance(obj))
+			currentDescriptor = getWsdlDescriptor();
+		else if (isWebserviceInstance(obj))
+			currentDescriptor = getWebServiceDescriptor();
 		else {
 			currentDescriptor = null;
 			return false;
@@ -393,19 +394,17 @@
 	 * @param Object
 	 *            obj - The object to check instanceof.
 	 */
-	// TODO WebServices for M3
-//	protected boolean isWebserviceInstance(Object obj) {
-//		EObject root = getRootObject(obj);
-//		return (root instanceof Definition || root instanceof WebServices);
-//	}
+	protected boolean isWebserviceInstance(Object obj) {
+		EObject root = getRootObject(obj);
+		return (root instanceof Definition || root instanceof WebServices);
+	}
 
-	// TODO WebServices for M3
-//	protected boolean isWsdlInstance(Object obj) {
-//		EObject root = getRootObject(obj);
-//		IProject p = ProjectUtilities.getProject(root);
-//		Object ws = getWebService(p);
-//		return (obj instanceof WSDLResourceImpl) || (root instanceof Definition && ws == null);
-//	}
+	protected boolean isWsdlInstance(Object obj) {
+		EObject root = getRootObject(obj);
+		IProject p = ProjectUtilities.getProject(root);
+		Object ws = getWebService(p);
+		return (obj instanceof WSDLResourceImpl) || (root instanceof Definition && ws == null);
+	}
 
 	protected boolean is13ServiceRefForNature(String natureId, EObject root) {
 		try {
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/war/ui/util/J2EEWebAppItemProvider.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/war/ui/util/J2EEWebAppItemProvider.java
index c2d83d3..3b89e57 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/war/ui/util/J2EEWebAppItemProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/war/ui/util/J2EEWebAppItemProvider.java
@@ -23,9 +23,18 @@
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationWrapper;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.jst.j2ee.internal.web.providers.WebAppItemProvider;
+import org.eclipse.jst.j2ee.internal.webservices.WebServiceEditModel;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
 import org.eclipse.jst.j2ee.webapplication.WebApp;
 import org.eclipse.jst.j2ee.webapplication.WebapplicationPackage;
+import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesClient;
+import org.eclipse.jst.j2ee.webservice.wsclient.Webservice_clientPackage;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
+
+import com.ibm.wtp.emf.workbench.ProjectUtilities;
 
 /**
  * @author jlanuti
@@ -42,77 +51,75 @@
 	private WebFilterMappingGroupItemProvider webFilterMappingGroup;
 	private WebReferencesGroupItemProvider webRefsGroup;
 	private WebSecurityGroupItemProvider webSecurityGroup;
-	// TODO WebServices for M3
-//	private J2EEWebServiceClientDDManager clientMgr;
+	private J2EEWebServiceClientDDManager clientMgr;
 	private WebListenerGroupItemProvider webListenerGroup;
 
 	/**
 	 * Listen and fire updates for 1.3 web service clients
 	 */
-	// TODO WebServices for M3
-//	private class J2EEWebServiceClientDDManager extends AdapterImpl implements EditModelListener {
-//		private WebApp webApp;
-//		private WebServicesManager webServiceMgr = WebServicesManager.getInstance();
-//		WebServiceEditModel editModel;
-//		WebServicesClient client;
-//
-//		public J2EEWebServiceClientDDManager(WebApp webApp) {
-//			this.webApp = webApp;
-//			init();
-//		}
-//
-//		public void setWebApp(WebApp webApp) {
-//			this.webApp = webApp;
-//		}
-//
-//		public void init() {
-//			editModel = webServiceMgr.getWSEditModel(ProjectUtilities.getProject(webApp));
-//			if (editModel != null) {
-//				editModel.addListener(this);
-//				if (editModel.get13WebServicesClientResource() != null) {
-//					client = editModel.get13WebServicesClientResource().getWebServicesClient();
-//					if (client != null)
-//						client.eAdapters().add(this);
-//				}
-//			}
-//		}
-//
-//		/*
-//		 * (non-Javadoc)
-//		 * 
-//		 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener#editModelChanged(org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent)
-//		 */
-//		public void editModelChanged(EditModelEvent anEvent) {
-//			if (editModel == null)
-//				init();
-//		}
-//
-//		/*
-//		 * (non-Javadoc)
-//		 * 
-//		 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-//		 */
-//		public void notifyChanged(Notification notification) {
-//			if (notification.getEventType() == Notification.ADD || notification.getEventType() == Notification.ADD_MANY || notification.getEventType() == Notification.REMOVE || notification.getEventType() == Notification.REMOVE_MANY) {
-//				if (notification.getFeatureID(WebServicesClient.class) == Webservice_clientPackage.WEB_SERVICES_CLIENT__SERVICE_REFS) {
-//					NotificationWrapper notificationWrapper = new NotificationWrapper(webRefsGroup, notification);
-//					fireNotifyChanged(notificationWrapper);
-//				}
-//			}
-//			super.notifyChanged(notification);
-//		}
-//
-//		public void dispose() {
-//			if (editModel != null) {
-//				editModel.removeListener(this);
-//				if (editModel.get13WebServicesClientResource() != null) {
-//					client = editModel.get13WebServicesClientResource().getWebServicesClient();
-//					if (client != null)
-//						client.eAdapters().remove(this);
-//				}
-//			}
-//		}
-//	}
+	private class J2EEWebServiceClientDDManager extends AdapterImpl implements EditModelListener {
+		private WebApp webApp;
+		private WebServicesManager webServiceMgr = WebServicesManager.getInstance();
+		WebServiceEditModel editModel;
+		WebServicesClient client;
+
+		public J2EEWebServiceClientDDManager(WebApp webApp) {
+			this.webApp = webApp;
+			init();
+		}
+
+		public void setWebApp(WebApp webApp) {
+			this.webApp = webApp;
+		}
+
+		public void init() {
+			editModel = webServiceMgr.getWSEditModel(ProjectUtilities.getProject(webApp));
+			if (editModel != null) {
+				editModel.addListener(this);
+				if (editModel.get13WebServicesClientResource() != null) {
+					client = editModel.get13WebServicesClientResource().getWebServicesClient();
+					if (client != null)
+						client.eAdapters().add(this);
+				}
+			}
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener#editModelChanged(org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent)
+		 */
+		public void editModelChanged(EditModelEvent anEvent) {
+			if (editModel == null)
+				init();
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
+		 */
+		public void notifyChanged(Notification notification) {
+			if (notification.getEventType() == Notification.ADD || notification.getEventType() == Notification.ADD_MANY || notification.getEventType() == Notification.REMOVE || notification.getEventType() == Notification.REMOVE_MANY) {
+				if (notification.getFeatureID(WebServicesClient.class) == Webservice_clientPackage.WEB_SERVICES_CLIENT__SERVICE_REFS) {
+					NotificationWrapper notificationWrapper = new NotificationWrapper(webRefsGroup, notification);
+					fireNotifyChanged(notificationWrapper);
+				}
+			}
+			super.notifyChanged(notification);
+		}
+
+		public void dispose() {
+			if (editModel != null) {
+				editModel.removeListener(this);
+				if (editModel.get13WebServicesClientResource() != null) {
+					client = editModel.get13WebServicesClientResource().getWebServicesClient();
+					if (client != null)
+						client.eAdapters().remove(this);
+				}
+			}
+		}
+	}
 
 	/**
 	 * Default constructor
@@ -125,9 +132,8 @@
 	 * initilaize list of children
 	 */
 	private void initChildren(WebApp webApp) {
-		// TODO WebServices for M3
-//		if (clientMgr == null)
-//			clientMgr = new J2EEWebServiceClientDDManager(webApp);
+		if (clientMgr == null)
+			clientMgr = new J2EEWebServiceClientDDManager(webApp);
 		children.add(webServletGroup = new WebServletGroupItemProvider(adapterFactory, webApp));
 		children.add(webServletMappingGroup = new WebServletMappingGroupItemProvider(adapterFactory, webApp));
 		children.add(webFiltersGroup = new WebFiltersGroupItemProvider(adapterFactory, webApp));
@@ -162,9 +168,8 @@
 				provider.setWebApp(app);
 			}
 		}
-		// TODO WebServices for M3
-//		if (clientMgr != null)
-//			clientMgr.setWebApp(app);
+		if (clientMgr != null)
+			clientMgr.setWebApp(app);
 	}
 
 	/*
@@ -228,9 +233,8 @@
 	 * @see org.eclipse.emf.edit.provider.IDisposable#dispose()
 	 */
 	public void dispose() {
-		// TODO WebServices for M3
-//		if (clientMgr != null)
-//			clientMgr.dispose();
+		if (clientMgr != null)
+			clientMgr.dispose();
 		super.dispose();
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/war/ui/util/WebReferencesGroupItemProvider.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/war/ui/util/WebReferencesGroupItemProvider.java
index 9ab09e6..5347332 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/war/ui/util/WebReferencesGroupItemProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/war/ui/util/WebReferencesGroupItemProvider.java
@@ -18,11 +18,13 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.internal.web.providers.WebAppEditResourceHandler;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
 import org.eclipse.jst.j2ee.webapplication.WebApp;
 
 /**
@@ -67,16 +69,15 @@
 		if (!webApp.getMessageDestinationRefs().isEmpty())
 			result.addAll(webApp.getMessageDestinationRefs());
 
-		// TODO WebServices for M3
-//		Collection serviceRefs = null;
-//		try {
-//			serviceRefs = WebServicesManager.getInstance().getServiceRefs(webApp);
-//		} catch (RuntimeException re) {
-//			serviceRefs = Collections.EMPTY_LIST;
-//		}
-//
-//		if (!serviceRefs.isEmpty())
-//			result.addAll(serviceRefs);
+		Collection serviceRefs = null;
+		try {
+			serviceRefs = WebServicesManager.getInstance().getServiceRefs(webApp);
+		} catch (RuntimeException re) {
+			serviceRefs = Collections.EMPTY_LIST;
+		}
+
+		if (!serviceRefs.isEmpty())
+			result.addAll(serviceRefs);
 		return result;
 	}
 
diff --git a/plugins/org.eclipse.jst.j2ee.ui/plugin.xml b/plugins/org.eclipse.jst.j2ee.ui/plugin.xml
index ed13739..481387a 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/plugin.xml
+++ b/plugins/org.eclipse.jst.j2ee.ui/plugin.xml
@@ -47,6 +47,7 @@
       <import plugin="org.eclipse.jst.common.navigator.java"/>
       <import plugin="org.eclipse.wst.web"/>
       <import plugin="org.eclipse.wst.common.navigator.workbench"/>
+      <import plugin="org.eclipse.wst.wsdl"/>
       
    </requires>
 
@@ -336,8 +337,7 @@
          </view>
       </adapterFactory>
    </extension>
-   
-<!--  TODO WebServices for M3 
+    
    <extension
          point="org.eclipse.wst.common.navigator.views.navigatorContent">
       <navigatorContent
@@ -359,18 +359,16 @@
          </enables>
       </navigatorContent>
    </extension>
- -->  
    
    <!-- J2EE View Web Services contribution -->
-   <!-- TODO WebServices for M3 -->
-<!--   <extension
+   <extension
          point="org.eclipse.wst.common.navigator.views.navigatorViewer">
       <navigatorViewer
-            rootContentExtensionId="org.eclipse.wst.common.frameworks.navigator.webservice"
-            viewerId="com.ibm.wtp.ui.ProjectNavigator">
+            rootContentExtensionId="org.eclipse.wst.common.frameworks.internal.navigator.webservice"
+            viewerId="org.eclipse.wst.navigator.ui.WTPCommonNavigator">
       </navigatorViewer>
    </extension>
- -->  
+ 
 <!-- Navigator Object Contributions -->
 <!-- EAR Group Contributions -->
    <extension
diff --git a/plugins/org.eclipse.jst.j2ee.web/webedit/org/eclipse/jst/j2ee/internal/web/providers/WebAppItemProvider.java b/plugins/org.eclipse.jst.j2ee.web/webedit/org/eclipse/jst/j2ee/internal/web/providers/WebAppItemProvider.java
index c2a257e..5c3cd07 100644
--- a/plugins/org.eclipse.jst.j2ee.web/webedit/org/eclipse/jst/j2ee/internal/web/providers/WebAppItemProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.web/webedit/org/eclipse/jst/j2ee/internal/web/providers/WebAppItemProvider.java
@@ -33,6 +33,7 @@
 import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.internal.web.plugin.WebPlugin;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
 import org.eclipse.jst.j2ee.jsp.JspFactory;
 import org.eclipse.jst.j2ee.webapplication.ContextParam;
 import org.eclipse.jst.j2ee.webapplication.WebApp;
@@ -72,9 +73,8 @@
 	public Collection getChildren(Object object) {
 		WebApp webApp = (WebApp) object;
 		Collection myChildren = super.getChildren(object);
-		// TODO WebServices for M3
-		//if (webApp.getVersionID() <= J2EEVersionConstants.WEB_2_3_ID)
-		//	myChildren.addAll(WebServicesManager.getInstance().get13ServiceRefs(webApp));
+		if (webApp.getVersionID() <= J2EEVersionConstants.WEB_2_3_ID)
+			myChildren.addAll(WebServicesManager.getInstance().get13ServiceRefs(webApp));
 		return myChildren;
 	}
 
diff --git a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WTProjectLoadStrategyImpl.java b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WTProjectLoadStrategyImpl.java
index 060edcc..12a5242 100644
--- a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WTProjectLoadStrategyImpl.java
+++ b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WTProjectLoadStrategyImpl.java
@@ -37,13 +37,11 @@
 import org.eclipse.wst.web.internal.operation.IBaseWebNature;
 import org.eclipse.wst.web.internal.operation.ILibModule;
 
-import com.ibm.wtp.emf.workbench.ProjectUtilities;
 import com.ibm.wtp.emf.workbench.WorkbenchURIConverter;
 import com.ibm.wtp.emf.workbench.WorkbenchURIConverterImpl;
 
 public class WTProjectLoadStrategyImpl extends org.eclipse.jst.j2ee.internal.archive.operations.J2EELoadStrategyImpl {
 	private final static String SOURCE_DIR = "source"; //$NON-NLS-1$
-	private final static String CLASSES_DIR = "classes"; //$NON-NLS-1$
 
 	public static final String WEBSETTINGS_FILE_URI = ".j2ee"; //$NON-NLS-1$
 
@@ -92,70 +90,93 @@
 	 * @see com.ibm.etools.archive.LoadStrategy
 	 */
 	public java.util.List getFiles() {
+
 		filesList.clear();
+
 		try {
 			// Determine if loose libs exist and set flag for meta files
-			if (areLooseLibJarsIncluded()) {
+			if (areLooseLibJarsIncluded())
 				setIncludeProjectMetaFiles(true);
-			}
+
 			// First go through all of the files under the webApplication
 			// directory, omitting the ones that are imported classes jars.
-			List webAppFiles = new ArrayList(Arrays.asList(getModuleContainer().members()));
-			if (shouldIncludeProjectMetaFiles()) {
-				webAppFiles.add(getProject().getFile(PROJECT_FILE_URI));
-				webAppFiles.add(getProject().getFile(CLASSPATH_FILE_URI));
-				webAppFiles.add(getProject().getFile(WEBSETTINGS_FILE_URI));
-			}
-			IContainer outputContainer = ProjectUtilities.getJavaProjectOutputContainer(getProject());
-			webAppFiles.addAll(Arrays.asList(outputContainer.members()));
+			List webAppFiles = null;
 
 			// if the user has chosen not to export compiled JSP files, then we need to make sure
 			// that
 			// the compiled class files are excluded from the /WEB-INF/classes directory
 			if (isExcludeCompiledJspFiles()) {
+				webAppFiles = new ArrayList(Arrays.asList(getModuleContainer().members()));
+
 				try {
-					//					IBaseWebNature wnr = J2EEWebNatureRuntimeUtilities.getRuntime(project);
-					IPath outputPath = outputContainer.getProjectRelativePath();
-					//					if (wnr != null) {
-					//						IPath modulePath = wnr.getWebModulePath();
-					//						IPath outputPath =
-					// J2EEWebNatureRuntimeUtilities.getWebOutputFolderPath(modulePath.toString());
-					// remove the WEB-INF folder from the list... we will get files from that
-					// directory
-					// after all others, in order to calculate which output files may exist,
-					// according
-					// to the JSPs in all other directories
-					//						IPath webInf = modulePath.append(IWebNatureConstants.INFO_DIRECTORY);
-					//					IResource outputDirResource = null;
-					//					int len = webAppFiles.size();
-					//					boolean found = false;
-					//					for (int i = 0; !found && i < len; i++) {
-					//						IResource res = (IResource) webAppFiles.get(i);
-					//						if (res.getFullPath().equals(outputPath)) {
-					//							outputDirResource = (IResource) webAppFiles.remove(i);
-					//							found = true;
-					//						}
-					//					}
-					// collect all the files (excluding those in /WEB-INF) and mark all of the
-					// JSPs' compiled files (.class,.java) to be excluded from the
-					webAppFiles = getFilesExcludeCompiledJsps(webAppFiles, outputPath);
-					// now collect the files from the /WEB-INF directory. All of the compiled
-					// JSP
-					// output files should not be picked up now, as they were placed into the
-					// visitedURIs
-					// list
-					ArrayList webInfList = new ArrayList(1);
-					webInfList.add(outputContainer);
-					webInfList = getFiles(webInfList);
-					webAppFiles.addAll(webInfList);
-					//					} else {
-					//						webAppFiles = getFiles(webAppFiles);
-					//					}
+					IBaseWebNature wnr = J2EEWebNatureRuntimeUtilities.getRuntime(project);
+					if (wnr != null) {
+
+						IPath modulePath = wnr.getWebModulePath();
+						IPath outputPath = J2EEWebNatureRuntimeUtilities.getWebOutputFolderPath(modulePath.toString());
+
+						// remove the WEB-INF folder from the list... we will get files from that
+						// directory
+						// after all others, in order to calculate which output files may exist,
+						// according
+						// to the JSPs in all other directories
+						IPath webInf = modulePath.append(IWebNatureConstants.INFO_DIRECTORY);
+						IResource outputDirResource = null;
+						int len = webAppFiles.size();
+						boolean found = false;
+						for (int i = 0; !found && i < len; i++) {
+							IResource res = (IResource) webAppFiles.get(i);
+							if (res.getFullPath().equals(webInf)) {
+								outputDirResource = (IResource) webAppFiles.remove(i);
+								found = true;
+							}
+						}
+
+						if (shouldIncludeProjectMetaFiles()) {
+							webAppFiles.add(getProject().getFile(PROJECT_FILE_URI));
+							webAppFiles.add(getProject().getFile(CLASSPATH_FILE_URI));
+							webAppFiles.add(getProject().getFile(WEBSETTINGS_FILE_URI));
+						}
+
+						// collect all the files (excluding those in /WEB-INF) and mark all of the
+						// JSPs' compiled files (.class,.java) to be excluded from the
+						webAppFiles = getFilesExcludeCompiledJsps(webAppFiles, outputPath);
+
+						// now collect the files from the /WEB-INF directory. All of the compiled
+						// JSP
+						// output files should not be picked up now, as they were placed into the
+						// visitedURIs
+						// list
+						ArrayList webInfList = new ArrayList(1);
+						webInfList.add(outputDirResource);
+						webInfList = getFiles(webInfList);
+						webAppFiles.addAll(webInfList);
+					} else {
+						webAppFiles = new ArrayList(Arrays.asList(getModuleContainer().members()));
+
+						if (shouldIncludeProjectMetaFiles()) {
+							webAppFiles.add(getProject().getFile(PROJECT_FILE_URI));
+							webAppFiles.add(getProject().getFile(CLASSPATH_FILE_URI));
+							webAppFiles.add(getProject().getFile(WEBSETTINGS_FILE_URI));
+						}
+						webAppFiles = getFiles(webAppFiles);
+					}
+
 				} catch (Exception e) {
 					throw new ArchiveRuntimeException(e.getMessage(), e);
 				}
+
 			} else {
+				webAppFiles = new ArrayList(Arrays.asList(getModuleContainer().members()));
+
+				if (shouldIncludeProjectMetaFiles()) {
+					webAppFiles.add(getProject().getFile(PROJECT_FILE_URI));
+					webAppFiles.add(getProject().getFile(CLASSPATH_FILE_URI));
+					webAppFiles.add(getProject().getFile(WEBSETTINGS_FILE_URI));
+				}
+				//HashSet addedURIs = new HashSet();
 				webAppFiles = getFiles(webAppFiles);
+
 			}
 
 			HashSet addedURIs = new HashSet();
@@ -449,14 +470,6 @@
 			}
 		}
 
-		// If this is in an output folder, stick it in 'WEB-INF/classes
-		IPath outputPath = ProjectUtilities.getJavaProjectOutputContainer(getProject()).getProjectRelativePath();
-		if (aPath.segmentCount() > outputPath.segmentCount() && aPath.removeLastSegments(aPath.segmentCount() - outputPath.segmentCount()).equals(outputPath)) {
-			IPath retPath = new Path(J2EEConstants.WEB_INF);
-			retPath = retPath.append(CLASSES_DIR);
-			return retPath.append(aPath.removeFirstSegments(outputPath.segmentCount()));
-		}
-
 		return aPath;
 	}
 
diff --git a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/operations/J2EEWebNatureRuntime.java b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/operations/J2EEWebNatureRuntime.java
index ba6ad4f..710f89f 100644
--- a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/operations/J2EEWebNatureRuntime.java
+++ b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/operations/J2EEWebNatureRuntime.java
@@ -7,6 +7,7 @@
  */
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
+import java.util.Map;
 
 import org.eclipse.core.resources.ICommand;
 import org.eclipse.core.resources.IContainer;
@@ -41,6 +42,7 @@
 import org.eclipse.jst.j2ee.internal.project.J2EEModuleNature;
 import org.eclipse.jst.j2ee.internal.web.archive.operations.WTProjectLoadStrategyImpl;
 import org.eclipse.jst.j2ee.internal.web.plugin.WebPlugin;
+import org.eclipse.jst.j2ee.internal.webservices.WebServiceEditModel;
 import org.eclipse.jst.j2ee.web.taglib.ITaglibRegistry;
 import org.eclipse.jst.j2ee.webapplication.WebApp;
 import org.eclipse.jst.j2ee.webapplication.WebAppResource;
@@ -1023,18 +1025,16 @@
 	 * increments the use count of this model. When you are done accessing the model, call
 	 * releaseAccess()!
 	 */
-	// TODO WebServices for M3
-//	public WebServiceEditModel getWebServiceEditModelForRead(Object accessorKey, Map params) {
-//		return (WebServiceEditModel) getEditModelForRead(WEB_SERVICE_EDIT_MODEL_ID, accessorKey, params);
-//	}
+	public WebServiceEditModel getWebServiceEditModelForRead(Object accessorKey, Map params) {
+		return (WebServiceEditModel) getEditModelForRead(WEB_SERVICE_EDIT_MODEL_ID, accessorKey, params);
+	}
 
 	/**
 	 * Return an editing model used to edit web service resources. Important!!! Calling this method
 	 * increments the use count of this model. When you are done accessing the model, call
 	 * releaseAccess()!
 	 */
-	// TODO WebServices for M3
-//	public WebServiceEditModel getWebServiceEditModelForWrite(Object accessorKey, Map params) {
-//		return (WebServiceEditModel) getEditModelForWrite(WEB_SERVICE_EDIT_MODEL_ID, accessorKey, params);
-//	}
+	public WebServiceEditModel getWebServiceEditModelForWrite(Object accessorKey, Map params) {
+		return (WebServiceEditModel) getEditModelForWrite(WEB_SERVICE_EDIT_MODEL_ID, accessorKey, params);
+	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/creation/ApplicationClientNatureRuntime.java b/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/creation/ApplicationClientNatureRuntime.java
index 1777415..0e09443 100644
--- a/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/creation/ApplicationClientNatureRuntime.java
+++ b/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/creation/ApplicationClientNatureRuntime.java
@@ -33,6 +33,7 @@
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.internal.project.J2EEModuleNature;
 import org.eclipse.jst.j2ee.internal.project.J2EEModuleWorkbenchURIConverterImpl;
+import org.eclipse.jst.j2ee.internal.webservices.WebServiceEditModel;
 import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
 
 import com.ibm.wtp.emf.workbench.ProjectUtilities;
@@ -272,10 +273,9 @@
 	 * increments the use count of this model. When you are done accessing the model, call
 	 * releaseAccess()!
 	 */
-	// TODO WebServices for M3
-//	public WebServiceEditModel getWebServiceEditModelForRead(Object accessorKey, Map params) {
-//		return (WebServiceEditModel) getEditModelForRead(WEB_SERVICE_EDIT_MODEL_ID, accessorKey, params);
-//	}
+	public WebServiceEditModel getWebServiceEditModelForRead(Object accessorKey, Map params) {
+		return (WebServiceEditModel) getEditModelForRead(WEB_SERVICE_EDIT_MODEL_ID, accessorKey, params);
+	}
 
 
 	/**
@@ -283,10 +283,9 @@
 	 * increments the use count of this model. When you are done accessing the model, call
 	 * releaseAccess()!
 	 */
-	// TODO WebServices for M3
-//	public WebServiceEditModel getWebServiceEditModelForWrite(Object accessorKey, Map params) {
-//		return (WebServiceEditModel) getEditModelForWrite(WEB_SERVICE_EDIT_MODEL_ID, accessorKey, params);
-//	}
+	public WebServiceEditModel getWebServiceEditModelForWrite(Object accessorKey, Map params) {
+		return (WebServiceEditModel) getEditModelForWrite(WEB_SERVICE_EDIT_MODEL_ID, accessorKey, params);
+	}
 
 
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/applicationedit/org/eclipse/jst/j2ee/internal/provider/ApplicationClientItemProvider.java b/plugins/org.eclipse.jst.j2ee/applicationedit/org/eclipse/jst/j2ee/internal/provider/ApplicationClientItemProvider.java
index 405cf90..4c0a5e4 100644
--- a/plugins/org.eclipse.jst.j2ee/applicationedit/org/eclipse/jst/j2ee/internal/provider/ApplicationClientItemProvider.java
+++ b/plugins/org.eclipse.jst.j2ee/applicationedit/org/eclipse/jst/j2ee/internal/provider/ApplicationClientItemProvider.java
@@ -38,6 +38,7 @@
 import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
 import org.eclipse.jst.j2ee.internal.application.provider.ApplicationProvidersResourceHandler;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
 import org.eclipse.jst.j2ee.webservice.wsclient.Webservice_clientFactory;
 
 import com.ibm.wtp.emf.workbench.ProjectUtilities;
@@ -257,9 +258,8 @@
 
 		ApplicationClient client = (ApplicationClient) object;
 		Collection myChildren = super.getChildren(object);
-		// TODO WebServices for M3
-//		if (client.getVersionID() <= J2EEVersionConstants.J2EE_1_3_ID)
-//			myChildren.addAll(WebServicesManager.getInstance().get13ServiceRefs(client));
+		if (client.getVersionID() <= J2EEVersionConstants.J2EE_1_3_ID)
+			myChildren.addAll(WebServicesManager.getInstance().get13ServiceRefs(client));
 		return myChildren;
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/AppClientProjectWebServiceEditModelFactory.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/AppClientProjectWebServiceEditModelFactory.java
new file mode 100644
index 0000000..fb94c44
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/AppClientProjectWebServiceEditModelFactory.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Feb 3, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.j2ee.internal.webservices;
+
+import java.util.Map;
+
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
+
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class AppClientProjectWebServiceEditModelFactory extends WebServiceEditModelFactory {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForRead(java.lang.Object,
+	 *      org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext)
+	 */
+	public EditModel createEditModelForRead(String editModelID, EMFWorkbenchContext context, Map params) {
+		return super.createEditModelForRead(editModelID, context, params, WebServiceEditModel.APPCLIENT_PROJECT_WEBSERVICE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForWrite(java.lang.Object,
+	 *      org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext)
+	 */
+	public EditModel createEditModelForWrite(String editModelID, EMFWorkbenchContext context, Map params) {
+		return super.createEditModelForWrite(editModelID, context, params, WebServiceEditModel.APPCLIENT_PROJECT_WEBSERVICE);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/EjbProjectWebServiceEditModelFactory.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/EjbProjectWebServiceEditModelFactory.java
new file mode 100644
index 0000000..6ce4e36
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/EjbProjectWebServiceEditModelFactory.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Feb 3, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.j2ee.internal.webservices;
+
+import java.util.Map;
+
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
+
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class EjbProjectWebServiceEditModelFactory extends WebServiceEditModelFactory {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForRead(java.lang.Object,
+	 *      org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext)
+	 */
+	public EditModel createEditModelForRead(String editModelID, EMFWorkbenchContext context, Map params) {
+		return super.createEditModelForRead(editModelID, context, params, WebServiceEditModel.EJB_PROJECT_WEBSERVICE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForWrite(java.lang.Object,
+	 *      org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext)
+	 */
+	public EditModel createEditModelForWrite(String editModelID, EMFWorkbenchContext context, Map params) {
+		return super.createEditModelForWrite(editModelID, context, params, WebServiceEditModel.EJB_PROJECT_WEBSERVICE);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WSDLHelper.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WSDLHelper.java
new file mode 100644
index 0000000..1002d3e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WSDLHelper.java
@@ -0,0 +1,364 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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.webservices;
+
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.jst.j2ee.common.QName;
+import org.eclipse.jst.j2ee.internal.project.J2EENature;
+import org.eclipse.jst.j2ee.webservice.wsclient.ComponentScopedRefs;
+import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
+import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesClient;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.wst.wsdl.Port;
+import org.eclipse.wst.wsdl.Service;
+import org.eclipse.wst.wsdl.internal.util.WSDLResourceImpl;
+
+/**
+ * This class contains methods to help navigate WSDL files provided in various JSR-109 descriptors
+ */
+public class WSDLHelper {
+
+	private IProject project_;
+
+	public WSDLHelper(IProject p) {
+		project_ = p;
+	}
+
+	/**
+	 * This method returns the list of wsdl:port@name's contained in the WSDL file referred to by
+	 * the specified <service-ref>
+	 * 
+	 * @param serviceRefName
+	 *            The name of the <service-ref>
+	 * @param compScopedRefName
+	 *            The name of the <component-scoped-refs>
+	 * @param wsc
+	 *            The root object of the webservicesclient.xml descriptor
+	 * @param exclude
+	 *            port names to exclude in the returned array
+	 * @return String[] An array of wsdl:port@names's. null is returned if there are any problems
+	 *         with navigating the webservicesclient.xml or the WSDL.
+	 */
+	public String[] getPortNames(String serviceRefName, String compScopedRefName, WebServicesClient wsc, String[] exclude) {
+		ServiceRef sr = getServiceRef(serviceRefName, compScopedRefName, wsc);
+		if (sr == null)
+			return null;
+
+		String wsdlURL = getWSDLFileURL(sr);
+		if (wsdlURL.length() == 0)
+			return null;
+
+		String serviceLocalName = getServiceQname(sr);
+		String[] portNames = getPortNames(wsdlURL, serviceLocalName);
+		portNames = trim(portNames, exclude);
+		return portNames;
+
+	}
+
+	/**
+	 * This method returns the namespace of the wsdl:service in WSDL file referred to by the
+	 * specified <service-ref>
+	 * 
+	 * @param serviceRefName
+	 *            The name of the <service-ref>
+	 * @param compScopedRefName
+	 *            The name of the <component-scoped-refs>
+	 * @param wsc
+	 *            The root object of the webservicesclient.xml descriptor
+	 * @param exclude
+	 *            port names to exclude in the returned array
+	 * @return String The namespace of the wsdl:service. null is returned if there are any problems
+	 *         with navigating the webservicesclient.xml or the WSDL.
+	 */
+	public String getPortNamespace(String serviceRefName, String compScopedRefName, WebServicesClient wsc) {
+		ServiceRef sr = getServiceRef(serviceRefName, compScopedRefName, wsc);
+		if (sr == null)
+			return null;
+
+		String wsdlURL = getWSDLFileURL(sr);
+		if (wsdlURL.length() == 0)
+			return ""; //$NON-NLS-1$
+
+		String serviceLocalName = getServiceQname(sr);
+		String namespace = getPortNamespace(wsdlURL, serviceLocalName);
+		return namespace;
+	}
+
+	/**
+	 * This method returns the list of wsdl:port@name's contained in the specified wsdl:service in
+	 * the specified WSDL file.
+	 * 
+	 * @param wsdlURL
+	 *            The URL of the WSDL file.
+	 * @param serviceLocalName
+	 *            The local name of the wsdl:service to look in.
+	 * @return String[] An array of wsdl:port@name's. Null is returned a wsdl:service with the
+	 *         specified local name could not be found.
+	 */
+	private String[] getPortNames(String wsdlURL, String serviceLocalName) {
+		Service targetService = getTargetService(wsdlURL, serviceLocalName);
+
+		if (targetService == null) {
+			//System.out.println("getPortNames ... targetService null.");
+			return null;
+		}
+
+		Map ports = targetService.getPorts();
+		int numberOfPorts = ports.size();
+		String[] portNames = new String[numberOfPorts];
+		Iterator k = ports.values().iterator();
+		for (int m = 0; m < numberOfPorts; m++) {
+			Port port = (Port) k.next();
+			portNames[m] = port.getName();
+		}
+
+		return portNames;
+	}
+
+	/**
+	 * This method returns the namespace of the specified wsdl:service in the specified WSDL file.
+	 * 
+	 * @param wsdlURL
+	 *            The URL of the WSDL file.
+	 * @param serviceLocalName
+	 *            The local name of the wsdl:service to look in.
+	 * @return String[] An array of wsdl:port@name's. An empty String is returned if a wsdl:service
+	 *         with the specified local name could not be found.
+	 */
+	private String getPortNamespace(String wsdlURL, String serviceLocalName) {
+		Service targetService = getTargetService(wsdlURL, serviceLocalName);
+
+		if (targetService == null) {
+			//System.out.println("getPortNamespace ... targetService null.");
+			return ""; //$NON-NLS-1$
+		}
+
+		return targetService.getQName().getNamespaceURI();
+	}
+
+	private Service getTargetService(String wsdlURL, String serviceLocalName) {
+		Definition definition = getWSDLDefinition(wsdlURL);
+		if (definition == null) {
+			return null;
+		}
+
+		Service targetService = null;
+		Map services = definition.getServices();
+		if (!services.isEmpty()) {
+			if ((serviceLocalName == null || serviceLocalName.length() == 0) && services.size() > 1) //Multiple
+			// services
+			// without
+			// one
+			// designated
+			// is
+			// an
+			// error
+			{
+				return null;
+			}
+
+			if ((serviceLocalName == null || serviceLocalName.length() == 0) && services.size() == 1) {
+				//Return the port names in the one service
+				Iterator i = services.values().iterator();
+				targetService = (Service) i.next();
+			} else //There are multiple services but one is designated
+			{
+				Iterator j = services.values().iterator();
+				while (j.hasNext()) {
+					Service service = (Service) j.next();
+					String serviceName = service.getQName().getLocalPart();
+					if (serviceName.equals(serviceLocalName)) {
+						targetService = service;
+						break; //Found a match. Break out of loop. We must be assuming unique names
+						// on services.
+					}
+				}
+			}
+		}
+
+		return targetService;
+
+	}
+
+
+	private Definition getWSDLDefinition(String wsdlURL) {
+		try {
+			WSDLResourceImpl res = (WSDLResourceImpl) WorkbenchResourceHelper.getResource(URI.createURI(wsdlURL), true);
+			if (res == null)
+				return null;
+			return res.getDefinition();
+		} catch (Exception wsdle) {
+			return null;
+		}
+	}
+
+	/**
+	 * Returns the file URL of the <wsdl-file>specified in the given <service-ref>. Returns a blank
+	 * String if <wsdl-file>is not specified in the provided <service-ref>
+	 */
+	private String getWSDLFileURL(ServiceRef sr) {
+		String wsdlFileRelPath = sr.getWsdlFile();
+		if (wsdlFileRelPath == null || wsdlFileRelPath.length() == 0)
+			return ""; //$NON-NLS-1$
+
+		// Get a handle on the WSDL file.
+		J2EENature nature = J2EENature.getRegisteredRuntime(project_);
+		if (nature != null) {
+			IResource moduleRoot = nature.getModuleServerRoot();
+			if (moduleRoot instanceof IFolder) {
+				IFolder moduleRootFolder = (IFolder) moduleRoot;
+				IFile wsdlFile = moduleRootFolder.getFile(wsdlFileRelPath);
+				if (!wsdlFile.exists()) {
+					return ""; //$NON-NLS-1$
+				}
+
+				//Get the fileURL from wsdlFile
+				String wsdlURL;
+				try {
+					wsdlURL = wsdlFile.getLocation().toFile().toURL().toString();
+				} catch (MalformedURLException murle) {
+					return ""; //$NON-NLS-1$
+				}
+
+				if (wsdlURL == null || wsdlURL.length() == 0)
+					return ""; //$NON-NLS-1$
+
+				return wsdlURL;
+
+			}
+			return ""; //$NON-NLS-1$
+		}
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * Returns the local part of the <service-qname>specified in the given <service-ref>. Returns a
+	 * blank String if <service-qname>is not specified in the provided <service-ref>
+	 */
+	private String getServiceQname(ServiceRef sr) {
+		QName serviceQname = sr.getServiceQname();
+		if (serviceQname == null)
+			return ""; //$NON-NLS-1$
+
+		String serviceLocalName = serviceQname.getLocalPart();
+		if (serviceLocalName == null)
+			return ""; //$NON-NLS-1$
+
+		return serviceLocalName;
+	}
+
+	/* If compScopedRefName is empty or null, we may have to check all of them. */
+	public ServiceRef getServiceRef(String name, String compScopedRefName, WebServicesClient wsc) {
+		Iterator serviceRefs;
+		if (compScopedRefName != null && compScopedRefName.length() > 0) {
+			ComponentScopedRefs csr = getCompScopedRef(compScopedRefName, wsc);
+			serviceRefs = csr.getServiceRefs().iterator();
+		} else {
+			serviceRefs = wsc.getServiceRefs().iterator();
+			//If there are no service refs ... check all component-scoped-refs for the service-ref
+			if (!serviceRefs.hasNext()) {
+				Iterator csRefs = wsc.getComponentScopedRefs().iterator();
+
+				while (csRefs.hasNext()) {
+					ComponentScopedRefs csr = (ComponentScopedRefs) csRefs.next();
+					Iterator srs = csr.getServiceRefs().iterator();
+					while (srs.hasNext()) {
+						ServiceRef sr = (ServiceRef) srs.next();
+						String thisName = sr.getServiceRefName();
+						if (thisName.equals(name)) {
+							return sr;
+						}
+					}
+				}
+
+				return null; //Could not find it in any of the component-scoped-refs
+			}
+
+		}
+
+		while (serviceRefs.hasNext()) {
+			ServiceRef serviceRef = (ServiceRef) serviceRefs.next();
+			String serviceRefName = serviceRef.getServiceRefName();
+			if (serviceRefName.equals(name))
+				return serviceRef;
+		}
+		return null;
+	}
+
+
+	private ComponentScopedRefs getCompScopedRef(String name, WebServicesClient wsc) {
+		Iterator compScopedRefs = wsc.getComponentScopedRefs().iterator();
+		while (compScopedRefs.hasNext()) {
+			ComponentScopedRefs compScopedRef = (ComponentScopedRefs) compScopedRefs.next();
+			String compScopedRefName = compScopedRef.getComponentName();
+			if (compScopedRefName.equals(name))
+				return compScopedRef;
+		}
+		return null;
+
+	}
+
+
+	private String[] trim(String[] values, String[] exclude) {
+		if (values == null || values.length == 0 || exclude == null || exclude.length == 0) //no
+			// change
+			// required.
+			// return
+			// as
+			// is.
+			return values;
+
+		String[] finalValues;
+		ArrayList finalList = new ArrayList();
+		for (int i = 0; i < values.length; i++) {
+			if (!contains(exclude, values[i])) {
+				finalList.add(values[i]);
+			}
+		}
+
+		int finalSize = finalList.size();
+		finalValues = new String[finalSize];
+		Object[] finalArray = finalList.toArray();
+		for (int j = 0; j < finalSize; j++) {
+			finalValues[j] = (String) (finalArray[j]);
+		}
+
+		return finalValues;
+
+	}
+
+	/**
+	 * Returns true if the array of String's contains the specified String. False otherwise.
+	 */
+	private boolean contains(String[] values, String s) {
+		if (values == null)
+			return false;
+
+		for (int i = 0; i < values.length; i++) {
+			if (values[i].equals(s))
+				return true;
+		}
+
+		return false;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebProjectWebServiceEditModelFactory.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebProjectWebServiceEditModelFactory.java
new file mode 100644
index 0000000..18912a4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebProjectWebServiceEditModelFactory.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Feb 3, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.j2ee.internal.webservices;
+
+import java.util.Map;
+
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
+
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebProjectWebServiceEditModelFactory extends WebServiceEditModelFactory {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForRead(java.lang.Object,
+	 *      org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext)
+	 */
+	public EditModel createEditModelForRead(String editModelID, EMFWorkbenchContext context, Map params) {
+		return super.createEditModelForRead(editModelID, context, params, WebServiceEditModel.WEB_PROJECT_WEBSERVICE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForWrite(java.lang.Object,
+	 *      org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext)
+	 */
+	public EditModel createEditModelForWrite(String editModelID, EMFWorkbenchContext context, Map params) {
+		return super.createEditModelForWrite(editModelID, context, params, WebServiceEditModel.WEB_PROJECT_WEBSERVICE);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServiceClientGenerator.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServiceClientGenerator.java
new file mode 100644
index 0000000..5d0d07f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServiceClientGenerator.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Apr 28, 2004
+ */
+package org.eclipse.jst.j2ee.internal.webservices;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.internal.common.J2EECommonMessages;
+
+
+/**
+ * Extension for generating web service clients
+ */
+public abstract class WebServiceClientGenerator {
+
+	public static final String GENERIC_J2EE_CONTAINER = J2EECommonMessages.getResourceString("WebServiceClientGenerator_UI_0"); //$NON-NLS-1$
+
+	private List runtime = null;
+
+	/**
+	 * Generates Web service client artifacts based on information obatined from the dataModel
+	 * (wsdlURL, serviceQName, outputWSDLFilePathName, projectName, shouldDeploy) After generating
+	 * the Web service client artifacts, sets the following on the dataModel: serviceInterfaceName,
+	 * serviceEndpointInterfaceName, didGenDescriptors
+	 * 
+	 * @return Status for results
+	 */
+	public abstract IStatus genWebServiceClientArtifacts(WebServicesClientDataHelper dataModel);
+
+	public void setRuntime(List serverTargets) {
+		runtime = serverTargets;
+	}
+
+	public List getServerTargets() {
+		if (runtime == null)
+			runtime = new ArrayList();
+		return runtime;
+	}
+
+	public boolean isRuntimeSupported(String serverTargetID) {
+		return getServerTargets().contains(serverTargetID);
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServiceEditModel.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServiceEditModel.java
new file mode 100644
index 0000000..bfdbffa
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServiceEditModel.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Feb 3, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.j2ee.internal.webservices;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jst.j2ee.applicationclient.creation.IApplicationClientNatureConstants;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEEditModel;
+import org.eclipse.jst.j2ee.internal.project.IEJBNatureConstants;
+import org.eclipse.jst.j2ee.internal.project.IWebNatureConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EENature;
+import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesResource;
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServices;
+import org.eclipse.jst.j2ee.webservice.wsdd.WsddResource;
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.wsdl.internal.util.WSDLResourceImpl;
+
+import com.ibm.wtp.emf.workbench.ProjectUtilities;
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebServiceEditModel extends J2EEEditModel {
+
+	public static final int WEB_PROJECT_WEBSERVICE = 0;
+	public static final int EJB_PROJECT_WEBSERVICE = 1;
+	public static final int APPCLIENT_PROJECT_WEBSERVICE = 2;
+
+	private static final String WEB_SERVICES_FILE = "webservices.xml"; //$NON-NLS-1$
+	private static final String WEB_SERVICES_CLIENT_FILE = "webservicesclient.xml"; //$NON-NLS-1$
+	public static final String WS_META_INF_PATH = "META-INF/" + WEB_SERVICES_FILE; //$NON-NLS-1$
+	public static final String WS_WEB_INF_PATH = "WEB-INF/" + WEB_SERVICES_FILE; //$NON-NLS-1$
+	public static final String WS_CLIENT_META_INF_PATH = "META-INF/" + WEB_SERVICES_CLIENT_FILE; //$NON-NLS-1$
+	public static final String WS_CLIENT_WEB_INF_PATH = "WEB-INF/" + WEB_SERVICES_CLIENT_FILE; //$NON-NLS-1$
+	public static final String WSIL_FILE_EXT = "wsil"; //$NON-NLS-1$
+	public static final String WSDL_FILE_EXT = "wsdl"; //$NON-NLS-1$
+
+	protected int projectType;
+
+	/**
+	 * constructor
+	 */
+	public WebServiceEditModel(String editModelID, EMFWorkbenchContext context, boolean readOnly, int projectType) {
+		super(editModelID, context, readOnly);
+		this.projectType = projectType;
+	}
+
+	/**
+	 * constructor
+	 */
+	public WebServiceEditModel(String editModelID, EMFWorkbenchContext context, boolean readOnly, boolean accessUnkownResourcesAsReadOnly, int projectType) {
+		super(editModelID, context, readOnly, accessUnkownResourcesAsReadOnly);
+		this.projectType = projectType;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.internal.workbench.J2EEEditModel#getRootObject()
+	 */
+	public Object getRootObject() {
+		return getWebServices();
+	}
+
+	public WebServices getWebServices() {
+		Resource dd = getWebServicesXmlResource();
+		if (dd != null) {
+			Object webServices = getRoot(dd);
+			if (webServices instanceof WebServices)
+				return (WebServices) webServices;
+		}
+		return null;
+	}
+
+	public List getWSILResources() {
+		return getResources(WSIL_FILE_EXT);
+	}
+
+	public List getWSDLResources() {
+		return getResources(WSDL_FILE_EXT);
+	}
+
+	public List getResources(String ext) {
+		List files = ProjectUtilities.getAllProjectFiles(getProject());
+		List result = new ArrayList();
+		for (int i = 0; i < files.size(); i++) {
+			IFile file = (IFile) files.get(i);
+			if (file != null && file.getFileExtension() != null && file.getFileExtension().equals(ext)) {
+				Resource res = WorkbenchResourceHelper.getResource(file, true);
+				if (res != null)
+					result.add(res);
+			}
+		}
+		return result;
+	}
+
+	public WsddResource getWebServicesXmlResource() {
+		return (WsddResource) getResource(getWebServicesXmlResourceURI());
+	}
+
+	public URI getWebServicesXmlResourceURI() {
+		URI resourceURI = J2EEConstants.WEB_SERVICES_WEB_INF_DD_URI_OBJ;
+		if (projectType == APPCLIENT_PROJECT_WEBSERVICE || projectType == EJB_PROJECT_WEBSERVICE)
+			resourceURI = J2EEConstants.WEB_SERVICES_META_INF_DD_URI_OBJ;
+		return resourceURI;
+	}
+
+	/**
+	 * return the WSDLResource if it exists, otherwise return null
+	 */
+	public WSDLResourceImpl getWsdlResource(String path) {
+		if (path == null || path.equals(""))return null; //$NON-NLS-1$
+		Resource res = null;
+		try {
+			res = getResource(URI.createURI(path));
+		} catch (Exception e) {
+		}
+		if (res != null && res.isLoaded() && res instanceof WSDLResourceImpl)
+			return (WSDLResourceImpl) res;
+		return null;
+
+	}
+
+	public J2EEEditModel getJ2EEEditModel(Object accessorKey) {
+		J2EEEditModel editModel = null;
+		switch (projectType) {
+			case WEB_PROJECT_WEBSERVICE :
+				editModel = J2EENature.getRuntime(getProject(), IWebNatureConstants.J2EE_NATURE_ID).getJ2EEEditModelForRead(accessorKey);
+				break;
+			case EJB_PROJECT_WEBSERVICE :
+				editModel = J2EENature.getRuntime(getProject(), IEJBNatureConstants.NATURE_ID).getJ2EEEditModelForRead(accessorKey);
+				break;
+			case APPCLIENT_PROJECT_WEBSERVICE :
+				editModel = J2EENature.getRuntime(getProject(), IApplicationClientNatureConstants.NATURE_ID).getJ2EEEditModelForRead(accessorKey);
+				break;
+		}
+		return editModel;
+	}
+
+	public WebServicesResource get13WebServicesClientResource() {
+		String resourcePath = WS_CLIENT_WEB_INF_PATH;
+		if (projectType == APPCLIENT_PROJECT_WEBSERVICE || projectType == EJB_PROJECT_WEBSERVICE)
+			resourcePath = WS_CLIENT_META_INF_PATH;
+		return (WebServicesResource) getResource(URI.createURI(resourcePath));
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServiceEditModelFactory.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServiceEditModelFactory.java
new file mode 100644
index 0000000..93c9974
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServiceEditModelFactory.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Feb 3, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.j2ee.internal.webservices;
+
+import java.util.Map;
+
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory;
+
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public abstract class WebServiceEditModelFactory extends EditModelFactory {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForRead(java.lang.Object,
+	 *      org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext)
+	 */
+	protected EditModel createEditModelForRead(String editModelID, EMFWorkbenchContext context, Map params, int projectType) {
+		return new WebServiceEditModel(editModelID, context, true, isLoadKnownResourcesAsReadOnly(), projectType);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForWrite(java.lang.Object,
+	 *      org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext)
+	 */
+	protected EditModel createEditModelForWrite(String editModelID, EMFWorkbenchContext context, Map params, int projectType) {
+		return new WebServiceEditModel(editModelID, context, false, isLoadKnownResourcesAsReadOnly(), projectType);
+	}
+
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServicesClientDataHelper.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServicesClientDataHelper.java
new file mode 100644
index 0000000..23162f4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServicesClientDataHelper.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Apr 26, 2004
+ */
+package org.eclipse.jst.j2ee.internal.webservices;
+
+
+/**
+ * WebServicesClientDataHelper Interface Extension - For use in generating Web Service Clients by
+ * sharing data between J2EE operations and web services operations
+ */
+public interface WebServicesClientDataHelper {
+
+	/**
+	 * @return the URL for the associated original WSDL file referenced by the client
+	 */
+	public String getWSDLUrl();
+
+	/**
+	 * @return the QName of form http://someNamespace:someLocalPart for the associated web service
+	 *         for the client
+	 */
+	public String getServiceQName();
+
+	/**
+	 * @return the name of the target project for the web service client
+	 */
+	public String getProjectName();
+
+	/**
+	 * @return the URI for the fileName path for the copied WSDL file into the client project
+	 */
+	public String getOutputWSDLFileName();
+
+	/**
+	 * @return the qualified classname of the generated Service Interface
+	 */
+	public String getServiceInterfaceName();
+
+	/**
+	 * @return the qualified classname of the generated Service Endpoint Interface
+	 */
+	public String[] getServiceEndpointInterfaceNames();
+
+	/**
+	 * @return should generate code for deployment?
+	 */
+	public boolean shouldDeploy();
+
+	/**
+	 * @return whether the extension generated the descriptors or not
+	 */
+	public boolean shouldGenDescriptors();
+
+	/**
+	 * Set the SEI classname for the web service client
+	 */
+	public void setServiceInterfaceName(String name);
+
+	/**
+	 * Set the SI classname for the web service client
+	 */
+	public void setServiceEndpointInterfaceNames(String[] names);
+
+	/**
+	 * Set whether descriptors were generated
+	 */
+	public void setDidGenDescriptors(boolean b);
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServicesClientDataRegistry.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServicesClientDataRegistry.java
new file mode 100644
index 0000000..7b8e1a9
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServicesClientDataRegistry.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Apr 26, 2004
+ */
+package org.eclipse.jst.j2ee.internal.webservices;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+import com.ibm.wtp.common.RegistryReader;
+
+/**
+ * Read the WebServicesClientDataExtensions
+ */
+public class WebServicesClientDataRegistry extends RegistryReader {
+
+	private static WebServicesClientDataRegistry INSTANCE = null;
+	public static final String WS_CLIENT_EXTENSION_POINT = "WebServiceClientGenerator"; //$NON-NLS-1$
+	public static final String GENERATOR = "generator"; //$NON-NLS-1$
+	public static final String CLASS_NAME = "className"; //$NON-NLS-1$
+	public static final String SERVER_TARGET = "serverTarget"; //$NON-NLS-1$
+	public static final String RUNTIME = "runtime"; //$NON-NLS-1$
+	private List wsClientDataExtensions = null;
+
+	/**
+	 * Default constructor
+	 */
+	public WebServicesClientDataRegistry() {
+		super(J2EEPlugin.PLUGIN_ID, WS_CLIENT_EXTENSION_POINT);
+	}
+
+	public static WebServicesClientDataRegistry getInstance() {
+		if (INSTANCE == null) {
+			INSTANCE = new WebServicesClientDataRegistry();
+			INSTANCE.readRegistry();
+		}
+		return INSTANCE;
+	}
+
+	/**
+	 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
+	 */
+	public boolean readElement(IConfigurationElement element) {
+		if (!element.getName().equals(GENERATOR))
+			return false;
+		// Get the class specified in the extension point
+		WebServiceClientGenerator helper = null;
+		try {
+			helper = (WebServiceClientGenerator) element.createExecutableExtension(CLASS_NAME);
+			// get server target runtimes
+			IConfigurationElement[] runtimes = element.getChildren(RUNTIME);
+			List runtimeList = new ArrayList();
+			for (int i = 0; i < runtimes.length; i++) {
+				IConfigurationElement runtime = runtimes[i];
+				String serverTarget = runtime.getAttribute(SERVER_TARGET);
+				runtimeList.add(serverTarget);
+			}
+			helper.setRuntime(runtimeList);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		// Add data helper class to registry extensions list
+		if (helper != null) {
+			getWSClientGeneratorExtensions().add(helper);
+			return true;
+		}
+		return false;
+	}
+
+	public List getWSClientGeneratorExtensions() {
+		if (wsClientDataExtensions == null)
+			wsClientDataExtensions = new ArrayList();
+		return wsClientDataExtensions;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServicesManager.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServicesManager.java
new file mode 100644
index 0000000..bbb4142
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/webservices/WebServicesManager.java
@@ -0,0 +1,894 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 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
+ *******************************************************************************/
+/*
+ * Created on Feb 9, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+
+
+
+package org.eclipse.jst.j2ee.internal.webservices;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jst.j2ee.applicationclient.creation.IApplicationClientNatureConstants;
+import org.eclipse.jst.j2ee.client.ApplicationClient;
+import org.eclipse.jst.j2ee.common.XMLResource;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEEditModel;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.project.IEJBNatureConstants;
+import org.eclipse.jst.j2ee.internal.project.IWebNatureConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EEModuleNature;
+import org.eclipse.jst.j2ee.internal.project.J2EENature;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.jst.j2ee.webservice.wsclient.ComponentScopedRefs;
+import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
+import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesClient;
+import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesResource;
+import org.eclipse.jst.j2ee.webservice.wsclient.Webservice_clientFactory;
+import org.eclipse.jst.j2ee.webservice.wsdd.PortComponent;
+import org.eclipse.jst.j2ee.webservice.wsdd.ServiceImplBean;
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServiceDescription;
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServices;
+import org.eclipse.jst.j2ee.webservice.wsdd.WsddResource;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
+import org.eclipse.wst.ws.parser.wsil.WebServiceEntity;
+import org.eclipse.wst.ws.parser.wsil.WebServicesParser;
+import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.wst.wsdl.Port;
+import org.eclipse.wst.wsdl.Service;
+import org.eclipse.wst.wsdl.internal.util.WSDLResourceImpl;
+
+import com.ibm.wtp.common.logger.proxy.Logger;
+import com.ibm.wtp.emf.workbench.ProjectResourceSet;
+import com.ibm.wtp.emf.workbench.ProjectUtilities;
+
+/**
+ * @author jlanuti
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebServicesManager implements EditModelListener, IResourceChangeListener, IResourceDeltaVisitor {
+
+	private HashMap editModels;
+	private static WebServicesManager INSTANCE = null;
+	private List listeners;
+	private List removedListeners = new ArrayList();
+	private boolean isNotifing = false;
+
+	public static final String WSDL_EXT = "wsdl"; //$NON-NLS-1$
+	public static final String WSIL_EXT = "wsil"; //$NON-NLS-1$
+
+	public static WebServicesManager getInstance() {
+		if (INSTANCE == null)
+			INSTANCE = new WebServicesManager();
+		return INSTANCE;
+	}
+
+	/**
+	 * Default Constructor
+	 */
+	public WebServicesManager() {
+		super();
+		init();
+	}
+
+	private void init() {
+		collectProjectEditModels();
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
+	}
+
+	private void collectProjectEditModels() {
+		IProject[] projects = ProjectUtilities.getAllProjects();
+		for (int i = 0; i < projects.length; i++) {
+			IProject project = projects[i];
+			WebServiceEditModel editModel = getWebServiceEditModelForProject(project);
+			if (editModel != null) {
+				editModel.addListener(this);
+				getEditModels().put(project, editModel);
+			}
+		}
+	}
+
+	/**
+	 * @return Returns the editModels.
+	 */
+	private HashMap getEditModels() {
+		if (editModels == null)
+			editModels = new HashMap();
+		return editModels;
+	}
+
+	private List getEditModelList() {
+		return new ArrayList(getEditModels().values());
+	}
+
+	private List getListeners() {
+		if (listeners == null)
+			listeners = new ArrayList();
+		return listeners;
+	}
+
+	/**
+	 * Add aListener to the list of listeners.
+	 */
+	public void addListener(EditModelListener aListener) {
+		if (aListener != null && !getListeners().contains(aListener))
+			getListeners().add(aListener);
+	}
+
+	public WebServiceEditModel getWSEditModel(IProject project) {
+		List localEditModels = getEditModelList();
+		for (int i = 0; i < localEditModels.size(); i++) {
+			WebServiceEditModel wsEditModel = (WebServiceEditModel) localEditModels.get(i);
+			if (wsEditModel.getProject() == project)
+				return wsEditModel;
+		}
+		return null;
+	}
+
+	public J2EEModuleNature getWebServiceNature(IProject project) {
+		try {
+			if (project.hasNature(IEJBNatureConstants.NATURE_ID))
+				return (J2EEModuleNature) project.getNature(IEJBNatureConstants.NATURE_ID);
+			else if (project.hasNature(IApplicationClientNatureConstants.NATURE_ID))
+				return (J2EEModuleNature) project.getNature(IApplicationClientNatureConstants.NATURE_ID);
+			else if (project.hasNature(IWebNatureConstants.J2EE_NATURE_ID))
+				return (J2EEModuleNature) project.getNature(IWebNatureConstants.J2EE_NATURE_ID);
+		} catch (Exception e) {
+		}
+		return null;
+	}
+
+	private WebServiceEditModel getWebServiceEditModelForProject(IProject project) {
+		J2EEModuleNature nature = getWebServiceNature(project);
+		HashMap editModelMap = getEditModels();
+		WebServiceEditModel wsEditModel = (WebServiceEditModel) editModelMap.get(project);
+		if (wsEditModel == null && nature != null) {
+			wsEditModel = nature.getWebServiceEditModelForRead(this);
+			editModelMap.put(project, wsEditModel);
+			return wsEditModel;
+		}
+		return wsEditModel;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener#editModelChanged(org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent)
+	 */
+	public void editModelChanged(EditModelEvent anEvent) {
+		if (anEvent.getEventCode() == EditModelEvent.PRE_DISPOSE) {
+			EditModel editModel = anEvent.getEditModel();
+			getEditModels().remove(editModel.getProject());
+			editModel.removeListener(this);
+			editModel.releaseAccess(this);
+		}
+		notifyListeners(anEvent);
+	}
+
+	/**
+	 * Notify listeners of
+	 * 
+	 * @anEvent.
+	 */
+	protected void notifyListeners(EditModelEvent anEvent) {
+		if (listeners == null)
+			return;
+		synchronized (this) {
+			isNotifing = true;
+		}
+		try {
+			List list = getListeners();
+			for (int i = 0; i < list.size(); i++)
+				((EditModelListener) list.get(i)).editModelChanged(anEvent);
+		} finally {
+			synchronized (this) {
+				isNotifing = false;
+				if (removedListeners != null && !removedListeners.isEmpty()) {
+					for (int i = 0; i < removedListeners.size(); i++)
+						listeners.remove(removedListeners.get(i));
+					removedListeners.clear();
+				}
+			}
+		}
+	}
+
+	/**
+	 * Remove aListener from the list of listeners.
+	 */
+	public synchronized boolean removeListener(EditModelListener aListener) {
+		if (aListener != null) {
+			if (isNotifing)
+				return removedListeners.add(aListener);
+			return getListeners().remove(aListener);
+		}
+		return false;
+	}
+
+	private void releaseEditModels() {
+		for (int i = 0; i < getEditModelList().size(); i++) {
+			WebServiceEditModel editModel = (WebServiceEditModel) getEditModelList().get(i);
+			editModel.removeListener(this);
+			editModel.releaseAccess(this);
+		}
+		getEditModels().clear();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+	 */
+	public void resourceChanged(IResourceChangeEvent event) {
+		acceptDelta(event);
+	}
+
+
+	protected void acceptDelta(IResourceChangeEvent event) {
+		IResourceDelta delta = event.getDelta();
+		// search for changes to any projects using a visitor
+		if (delta != null) {
+			try {
+				delta.accept(this);
+			} catch (Exception e) {
+				Logger.getLogger().logError(e);
+			}
+		}
+	}
+
+	/**
+	 * returns a list of internal web services descriptions in the workspace
+	 */
+	public List getInternalWebServicesDescriptions() {
+		List result = new ArrayList();
+		List webServices = getInternalWebServices();
+		for (int i = 0; i < webServices.size(); i++) {
+			WebServices webService = (WebServices) webServices.get(i);
+			if (webService != null)
+				result.addAll(webService.getWebServiceDescriptions());
+		}
+		return result;
+	}
+
+	/**
+	 * @return all internal web services instances in workspace
+	 */
+	public List getInternalWebServices() {
+		List result = new ArrayList();
+		for (int i = 0; i < getEditModelList().size(); i++) {
+			WebServiceEditModel editModel = (WebServiceEditModel) getEditModelList().get(i);
+			if (editModel.getProject() != null) {
+				WebServices webServices = editModel.getWebServices();
+				if (webServices != null)
+					result.add(webServices);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * returns a list of all the internal wsdl services in wsdl's pointed to by wsdd's
+	 */
+	public List getInternalWSDLServices() {
+		return getWSDLServicesFromWSDLResources(getInternalWSDLResources());
+	}
+
+	public List getInternalWSDLResources() {
+		List result = new ArrayList();
+		List wsddWebServices = getInternalWebServicesDescriptions();
+		for (int i = 0; i < wsddWebServices.size(); i++) {
+			WebServiceDescription webServices = (WebServiceDescription) wsddWebServices.get(i);
+			WSDLResourceImpl wsdl = getWSDLResource(webServices);
+			if (wsdl != null && !result.contains(wsdl))
+				result.add(wsdl);
+		}
+		return result;
+	}
+
+		public List getExternalWSDLResources() {
+			//TODO fix up for basis off .wsil
+			List result = getWorkspaceWSDLResources();
+			result.removeAll(getInternalWSDLResources());
+			List serviceRefs = getAllWorkspaceServiceRefs();
+			for (int i=0; i<serviceRefs.size(); i++) {
+				ServiceRef ref = (ServiceRef) serviceRefs.get(i);
+				try {
+					Resource res = WorkbenchResourceHelper.getResource(URI.createURI(ref.getWsdlFile()), true);
+					if (res !=null && result.contains(res))
+						result.remove(res);
+				} catch (Exception e) {}
+			}
+			return result;
+		}
+		
+	public boolean isServiceInternal(Service service) {
+		return getInternalWSDLResources().contains(getWSDLResource(service));
+	}
+
+	private List getWSDLServicesFromWSDLResources(List wsdlResources) {
+		List result = new ArrayList();
+		for (int i = 0; i < wsdlResources.size(); i++) {
+			WSDLResourceImpl wsdl = (WSDLResourceImpl) wsdlResources.get(i);
+			List services = getWSDLServices(wsdl);
+			if (wsdl != null && services != null && !services.isEmpty())
+				result.addAll(services);
+		}
+		return result;
+	}
+
+	public List getExternalWSDLServices() {
+		List result = getWsdlServicesFromWorkspaceWSILs();
+		result.removeAll(getInternalWSDLServices());
+		return result;
+	}
+
+	public List getWsdlServicesFromWorkspaceWSILs() {
+		List result = new ArrayList();
+		List wsilFiles = getWorkspaceWSILFiles();
+		for (int i = 0; i < wsilFiles.size(); i++) {
+			IFile wsil = (IFile) wsilFiles.get(i);
+			List services = getWsdlServicesFromWsilFile(wsil);
+			if (!services.isEmpty())
+				result.addAll(services);
+		}
+	return result;
+	}
+
+	public List getWsdlServicesFromWsilFile(IFile wsil) {
+		List result = new ArrayList();
+		WebServiceEntity entity = parseWsilFile(wsil);
+		if (entity != null && entity.getType() == WebServiceEntity.TYPE_WSIL) {
+			// get all the WSDL references from the WSIL entity
+			List wsdlList = entity.getChildren();
+			for (Iterator it = wsdlList.iterator(); it.hasNext();) {
+				Object item = it.next();
+				if (item != null && item instanceof WebServiceEntity) {
+					if (((WebServiceEntity) item).getModel() != null && ((WebServiceEntity) item).getModel() instanceof Definition) {
+						Definition def = (Definition) ((WebServiceEntity) item).getModel();
+						if (def != null && !def.getServices().isEmpty())
+							result.addAll(def.getServices().values());
+					}
+				}
+			}
+		}
+		return result;
+	}
+
+	public WebServiceEntity parseWsilFile(IFile wsil) {
+		WebServicesParser parser = null;
+		String url = null;
+		// verify proper input
+		if (wsil == null || !wsil.getFileExtension().equals(WSIL_EXT))
+			return null;
+		// Parse wsil file to get wsdl services
+		try {
+			url = wsil.getLocation().toFile().toURL().toString();
+			parser = new WebServicesParser(url);
+			parser.parse(WebServicesParser.PARSE_WSIL | WebServicesParser.PARSE_WSDL);
+		} catch (Exception e) {
+		}
+		if (parser == null)
+			return null;
+		return parser.getWebServiceEntityByURI(url);
+	}
+
+	/**
+	 * Returns all WSDL Services, both internal and external
+	 */
+	public List getAllWSDLServices() {
+		List result = new ArrayList();
+		result.addAll(getInternalWSDLServices());
+		result.addAll(getExternalWSDLServices());
+		return result;
+	}
+
+	protected void dispose() {
+		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+		releaseEditModels();
+		INSTANCE = null;
+	}
+
+	public WSDLResourceImpl getWSDLResource(WebServiceDescription webService) {
+		String wsdlFileName = webService.getWsdlFile();
+		WSDLResourceImpl res = null;
+		String projName = ProjectUtilities.getProject(webService).getName();
+		for (int i = 0; i < getEditModelList().size(); i++) {
+			WebServiceEditModel editModel = (WebServiceEditModel) getEditModelList().get(i);
+			if (editModel.getProject() != null && editModel.getProject().getName().equals(projName)) {
+				res = editModel.getWsdlResource(wsdlFileName);
+				if (res != null)
+					break;
+			}
+		}
+		return res;
+	}
+
+	public List getWSDLServices(WSDLResourceImpl wsdl) {
+		List result = new ArrayList();
+		Definition def = wsdl.getDefinition();
+		if (def == null)
+			return result;
+		result = new ArrayList(def.getServices().values());
+		return result;
+	}
+
+	public Service getWSDLServiceForWebService(WebServiceDescription webService) {
+		Service service = null;
+		WSDLResourceImpl wsdl = getWSDLResource(webService);
+		if (wsdl == null)
+			return service;
+		Definition definition = wsdl.getDefinition();
+		if (definition == null)
+			return service;
+		Map services = definition.getServices();
+		if (services.isEmpty())
+			return service;
+		PortComponent portComp = (PortComponent) webService.getPortComponents().get(0);
+		return getService(portComp);
+	}
+
+	public WSDLResourceImpl getWSDLResource(Service wsdlService) {
+		return (WSDLResourceImpl) wsdlService.eResource();
+	}
+
+	public Service getService(PortComponent port) {
+		List services = getInternalWSDLServices();
+		for (int i = 0; i < services.size(); i++) {
+			Service service = (Service) services.get(i);
+			if (service.getPorts().size() == 1) {
+				Port wsdlPort = (Port) service.getPorts().values().toArray()[0];
+				String qName = wsdlPort.getBinding().getQName().getNamespaceURI();
+				if (port.getWsdlPort().getNamespaceURI().equals(qName))
+					return service;
+			}
+		}
+		return null;
+	}
+
+	public PortComponent getPortComponent(String qName) {
+		List wsDescs = getInternalWebServicesDescriptions();
+		for (int i = 0; i < wsDescs.size(); i++) {
+			WebServiceDescription wsDesc = (WebServiceDescription) wsDescs.get(i);
+			List ports = wsDesc.getPortComponents();
+			for (int j = 0; j < ports.size(); j++) {
+				PortComponent portComp = (PortComponent) ports.get(j);
+				if (portComp.getWsdlPort().getNamespaceURI().equals(qName))
+					return portComp;
+			}
+		}
+		return null;
+	}
+
+	public PortComponent getPortComponent(String qName, IProject project) {
+		List wsDescs = getInternalWebServicesDescriptions();
+		for (int i = 0; i < wsDescs.size(); i++) {
+			WebServiceDescription wsDesc = (WebServiceDescription) wsDescs.get(i);
+			List ports = wsDesc.getPortComponents();
+			for (int j = 0; j < ports.size(); j++) {
+				PortComponent portComp = (PortComponent) ports.get(j);
+				if (portComp.getWsdlPort().getNamespaceURI().equals(qName) && project == ProjectUtilities.getProject(portComp))
+					return portComp;
+			}
+		}
+		return null;
+	}
+
+	public PortComponent getPortComponent(Service wsdlService) {
+		// If there is only one port in the wsdl service, find the matching port component
+		// otherwise if multiple ports return null because we need more information
+		if (wsdlService == null || wsdlService.getPorts().isEmpty())
+			return null;
+		if (wsdlService.getPorts().size() == 1) {
+			Port port = (Port) wsdlService.getPorts().values().toArray()[0];
+			String qName = port.getBinding().getQName().getNamespaceURI();
+			return getPortComponent(qName, ProjectUtilities.getProject(wsdlService));
+		}
+		return null;
+	}
+
+	public ServiceImplBean getServiceImplBean(Service wsdlService) {
+		PortComponent port = getPortComponent(wsdlService);
+		if (port == null)
+			return null;
+		return port.getServiceImplBean();
+	}
+
+	public WsddResource getWsddResource(Service wsdlService) {
+		PortComponent port = getPortComponent(wsdlService);
+		if (port == null)
+			return null;
+		return (WsddResource) port.eResource();
+	}
+
+	public String getServiceEndpointInterface(Service wsdlService) {
+		PortComponent port = getPortComponent(wsdlService);
+		if (port == null)
+			return null;
+		return port.getServiceEndpointInterface();
+	}
+
+	public List getAllWorkspaceServiceRefs() {
+		List result = new ArrayList();
+		result.addAll(getWorkspace13ServiceRefs());
+		result.addAll(getWorkspace14ServiceRefs());
+		return result;
+	}
+
+	public List getWorkspace13ServiceRefs() {
+		List result = new ArrayList();
+		for (int i = 0; i < getEditModelList().size(); i++) {
+			WebServiceEditModel editModel = (WebServiceEditModel) getEditModelList().get(i);
+			if (editModel.getProject() != null) {
+				WebServicesResource res = editModel.get13WebServicesClientResource();
+				if (res != null && res.isLoaded() && res.getWebServicesClient() != null)
+					result.addAll(res.getWebServicesClient().getServiceRefs());
+			}
+		}
+		return result;
+	}
+
+	public List get13ServiceRefs(J2EEEditModel moduleEditModel) {
+
+		List result = new ArrayList();
+		WebServicesResource res = getWscddResource(moduleEditModel);
+		if (res != null && res.isLoaded() && res.getWebServicesClient() != null)
+			result.addAll(res.getWebServicesClient().getServiceRefs());
+
+		return result;
+	}
+
+	/**
+	 * @param moduleEditModel
+	 * @return
+	 */
+	private WebServicesResource getWscddResource(J2EEEditModel moduleEditModel) {
+
+		if (moduleEditModel.getJ2EENature().getNatureID().equals(IEJBNatureConstants.NATURE_ID))
+			return (WebServicesResource) moduleEditModel.getResource(J2EEConstants.WEB_SERVICES_CLIENT_META_INF_DD_URI_OBJ);
+		if (moduleEditModel.getJ2EENature().getNatureID().equals(IWebNatureConstants.J2EE_NATURE_ID))
+			return (WebServicesResource) moduleEditModel.getResource(J2EEConstants.WEB_SERVICES_CLIENT_WEB_INF_DD_URI_OBJ);
+		if (moduleEditModel.getJ2EENature().getNatureID().equals(IApplicationClientNatureConstants.NATURE_ID))
+			return (WebServicesResource) moduleEditModel.getResource(J2EEConstants.WEB_SERVICES_CLIENT_META_INF_DD_URI_OBJ);
+		return null;
+	}
+
+	public List getWorkspace14ServiceRefs() {
+		List result = new ArrayList();
+		for (int i = 0; i < getEditModelList().size(); i++) {
+			WebServiceEditModel editModel = (WebServiceEditModel) getEditModelList().get(i);
+			if (editModel.getProject() != null) {
+				J2EEEditModel j2eeEditModel = editModel.getJ2EEEditModel(this);
+				try {
+					EObject rootObject = j2eeEditModel.getPrimaryRootObject();
+					// handle EJB project case
+					if (rootObject instanceof EJBJar) {
+						List cmps = ((EJBJar) rootObject).getEnterpriseBeans();
+						for (int j = 0; j < cmps.size(); j++) {
+							EnterpriseBean bean = (EnterpriseBean) cmps.get(j);
+							if (bean.getServiceRefs() != null && !bean.getServiceRefs().isEmpty())
+								result.addAll(bean.getServiceRefs());
+						}
+					}
+					// handle Web Project
+					else if (rootObject instanceof WebApp) {
+						if (((WebApp) rootObject).getServiceRefs() != null && !((WebApp) rootObject).getServiceRefs().isEmpty())
+							result.addAll(((WebApp) rootObject).getServiceRefs());
+					}
+					// handle App clients
+					else if (rootObject instanceof ApplicationClient) {
+						if (((ApplicationClient) rootObject).getServiceRefs() != null && !((ApplicationClient) rootObject).getServiceRefs().isEmpty())
+							result.addAll(((ApplicationClient) rootObject).getServiceRefs());
+					}
+				} finally {
+					j2eeEditModel.releaseAccess(this);
+				}
+			}
+		}
+		return result;
+	}
+
+	public boolean isJ2EE14(ServiceRef ref) {
+		return !(ref.eContainer() instanceof WebServicesClient);
+	}
+
+	public List getWorkspaceWSILFiles() {
+		List result = new ArrayList();
+		for (int i = 0; i < getEditModelList().size(); i++) {
+			WebServiceEditModel editModel = (WebServiceEditModel) getEditModelList().get(i);
+			if (editModel.getProject() != null) {
+				List files = ProjectUtilities.getAllProjectFiles(editModel.getProject());
+				for (int j = 0; j < files.size(); j++) {
+					IFile file = (IFile) files.get(j);
+					if (file != null && WSIL_EXT.equals(file.getFileExtension()))
+						result.add(file);
+				}
+			}
+		}
+		return result;
+	}
+
+	public List getWorkspaceWSDLResources() {
+		List result = new ArrayList();
+		for (int i = 0; i < getEditModelList().size(); i++) {
+			WebServiceEditModel editModel = (WebServiceEditModel) getEditModelList().get(i);
+			if (editModel.getProject() != null) {
+				List wsdlResources = editModel.getWSDLResources();
+				if (wsdlResources != null && !wsdlResources.isEmpty()) {
+					for (int j = 0; j < wsdlResources.size(); j++) {
+						WSDLResourceImpl wsdl = (WSDLResourceImpl) wsdlResources.get(j);
+						if (!result.contains(wsdl))
+							result.add(wsdl);
+					}
+				}
+			}
+		}
+		return result;
+	}
+
+	public List getWSDLServices() {
+		List result = new ArrayList();
+		List internalWsdls = getInternalWSDLServices();
+		if (internalWsdls != null && !internalWsdls.isEmpty())
+			result.addAll(internalWsdls);
+		//TODO add externals
+		return result;
+	}
+
+	/**
+	 * @param bean
+	 * @return
+	 */
+	public Collection get13ServiceRefs(EnterpriseBean bean) {
+
+		IProject proj = ProjectUtilities.getProject(bean);
+		if (proj == null)
+			return Collections.EMPTY_LIST;
+		WebServicesResource res = getWebServicesClientResource(proj);
+		if (res != null && res.getWebServicesClient() != null) {
+			String ejbName = bean.getName();
+			List scopes = res.getWebServicesClient().getComponentScopedRefs();
+			for (Iterator iter = scopes.iterator(); iter.hasNext();) {
+				ComponentScopedRefs scope = (ComponentScopedRefs) iter.next();
+				if (scope.getComponentName().equals(ejbName))
+					return scope.getServiceRefs();
+			}
+		}
+		return Collections.EMPTY_LIST;
+	}
+
+	/**
+	 * @param client
+	 * @return
+	 */
+	public Collection get13ServiceRefs(ApplicationClient client) {
+		IProject proj = ((ProjectResourceSet) client.eResource().getResourceSet()).getProject();
+		WebServicesResource res = getWebServicesClientResource(proj);
+		if (res != null) {
+			WebServicesClient webClient = res.getWebServicesClient();
+			if (webClient != null)
+				return webClient.getServiceRefs();
+		}
+		return Collections.EMPTY_LIST;
+	}
+
+	/**
+	 * @param webapp
+	 * @return
+	 */
+	public Collection get13ServiceRefs(WebApp webapp) {
+		IProject proj = ((ProjectResourceSet) webapp.eResource().getResourceSet()).getProject();
+		WebServicesResource res = getWebServicesClientResource(proj);
+		if (res != null) {
+			WebServicesClient webClient = res.getWebServicesClient();
+			if (webClient != null)
+				return webClient.getServiceRefs();
+		}
+		return Collections.EMPTY_LIST;
+	}
+
+	public WebServicesResource getDefaultWebServicesResource(EObject proj, J2EEEditModel model) {
+		WebServicesResource res = getWebServicesClientResource(model.getProject());
+		if (res != null) {
+			if (res.getContents().isEmpty()) {
+				WebServicesClient wsc = Webservice_clientFactory.eINSTANCE.createWebServicesClient();
+				res.getContents().add(wsc);
+			}
+			return res;
+		}
+		if (proj instanceof WebApp)
+			res = (WebServicesResource) model.createResource(URI.createURI(WebServiceEditModel.WS_CLIENT_WEB_INF_PATH));
+		else
+			res = (WebServicesResource) model.createResource(URI.createURI(WebServiceEditModel.WS_CLIENT_META_INF_PATH));
+		WebServicesClient wsc = Webservice_clientFactory.eINSTANCE.createWebServicesClient();
+		res.getContents().add(wsc);
+		return res;
+	}
+
+	public WebServicesResource getWebServicesClientResource(IProject proj) {
+		J2EENature nature = (J2EENature.getRegisteredRuntime(proj));
+		WebServicesResource res = null;
+		try {
+			if (nature.getDeploymentDescriptorType() == XMLResource.WEB_APP_TYPE)
+				res = (WebServicesResource) nature.getResource(J2EEConstants.WEB_SERVICES_CLIENT_WEB_INF_DD_URI_OBJ);
+			else
+				res = (WebServicesResource) nature.getResource(J2EEConstants.WEB_SERVICES_CLIENT_META_INF_DD_URI_OBJ);
+		} catch (Exception e) {
+		}
+		return res;
+	}
+
+	public WsddResource getWebServicesResource(IProject proj) {
+		J2EENature nature = (J2EENature.getRegisteredRuntime(proj));
+		WsddResource res = null;
+		try {
+			if (nature.getDeploymentDescriptorType() == XMLResource.WEB_APP_TYPE)
+				res = (WsddResource) nature.getResource(J2EEConstants.WEB_SERVICES_WEB_INF_DD_URI_OBJ);
+			else
+				res = (WsddResource) nature.getResource(J2EEConstants.WEB_SERVICES_META_INF_DD_URI_OBJ);
+		} catch (Exception e) {
+		}
+
+		if (res != null && WorkbenchResourceHelper.getFile(res).exists())
+			return res;
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
+	 */
+	public boolean visit(IResourceDelta delta) throws CoreException {
+		IResource resource = delta.getResource();
+		if (resource.getType() == IResource.PROJECT) {
+			IProject p = (IProject) resource;
+			// Handle project adds
+			if (delta.getKind() == IResourceDelta.ADDED) {
+				WebServiceEditModel editModel = getWebServiceEditModelForProject(p);
+				if (editModel != null && !getEditModels().containsValue(editModel)) {
+					getEditModels().put(p, editModel);
+					editModel.addListener(this);
+					// forward an edit model event to manager's listeners
+					notifyListeners(new EditModelEvent(EditModelEvent.ADDED_RESOURCE, editModel));
+					return false;
+				}
+			}
+			// Handle project removals
+			else if (delta.getKind() == IResourceDelta.REMOVED) {
+				WebServiceEditModel editModel = (WebServiceEditModel) getEditModels().get(p);
+				if (editModel != null) {
+					editModel.removeListener(this);
+					getEditModels().remove(p);
+					notifyListeners(new EditModelEvent(EditModelEvent.REMOVED_RESOURCE, editModel));
+					return false;
+				}
+			}
+		} else if (resource.getType() == IResource.FILE && isInterrestedInFile((IFile) resource)) {
+			if ((delta.getKind() == IResourceDelta.ADDED) || ((delta.getFlags() & IResourceDelta.MOVED_TO) != 0))
+				if (resource.getFileExtension().equals(WSDL_EXT))
+					addedWsdl((IFile) resource);
+				else if (resource.getFileExtension().equals(WSIL_EXT))
+					addedWsil((IFile) resource);
+			return false;
+		}
+		return true;
+	}
+
+	protected void addedWsdl(IFile wsdl) {
+		if (!wsdl.exists())
+			return;
+		WSDLResourceImpl res = (WSDLResourceImpl) WorkbenchResourceHelper.getResource(wsdl, true);
+		IProject p = ProjectUtilities.getProject(res);
+		WebServiceEditModel editModel = getWebServiceEditModelForProject(p);
+		// forward an edit model event to manager's listeners
+		notifyListeners(new EditModelEvent(EditModelEvent.ADDED_RESOURCE, editModel));
+	}
+
+	protected void addedWsil(IFile wsil) {
+		if (!wsil.exists())
+			return;
+		//Resource res = WorkbenchResourceHelper.getResource(wsil,true);
+		IProject p = ProjectUtilities.getProject(wsil);
+		WebServiceEditModel editModel = getWebServiceEditModelForProject(p);
+		// forward an edit model event to manager's listeners
+		notifyListeners(new EditModelEvent(EditModelEvent.ADDED_RESOURCE, editModel));
+
+	}
+
+	protected boolean isInterrestedInFile(IFile aFile) {
+		if (aFile != null && aFile.getFileExtension() != null) {
+			String extension = aFile.getFileExtension();
+			return extension.equals(WSDL_EXT) || extension.equals(WSIL_EXT);
+		}
+		return false;
+	}
+
+	/**
+	 * @param object
+	 * @return
+	 */
+	public Collection getServiceRefs(EJBJar jar) {
+
+		List list = new ArrayList();
+		List beans = jar.getEnterpriseBeans();
+		try {
+			for (int i = 0; i < beans.size(); i++) {
+				EnterpriseBean bean = (EnterpriseBean) beans.get(i);
+				list.addAll(getServiceRefs(bean));
+			}
+		} catch (Exception e) {
+		}
+		return list;
+	}
+
+	public Collection getServiceRefs(EnterpriseBean bean) {
+		List list = new ArrayList();
+		if (bean.getEjbJar().getJ2EEVersionID() >= J2EEVersionConstants.J2EE_1_4_ID)
+			list.addAll(bean.getServiceRefs());
+		else
+			list.addAll(get13ServiceRefs(bean));
+		return list;
+	}
+
+	public Collection getServiceRefs(WebApp webapp) {
+
+		List list = new ArrayList();
+		try {
+			if (webapp.getVersionID() >= J2EEVersionConstants.WEB_2_4_ID)
+				list.addAll(webapp.getServiceRefs());
+			else
+				list.addAll(get13ServiceRefs(webapp));
+		} catch (Exception e) {
+		}
+		return list;
+	}
+
+	public Collection getServiceRefs(ApplicationClient client) {
+
+		List list = new ArrayList();
+		try {
+			if (client.getJ2EEVersionID() >= J2EEVersionConstants.J2EE_1_4_ID)
+				list.addAll(client.getServiceRefs());
+			else
+				list.addAll(get13ServiceRefs(client));
+		} catch (Exception e) {
+		}
+		return list;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/operations/J2EEArtifactImportDataModel.java b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/operations/J2EEArtifactImportDataModel.java
index 15e911b..04e8ad0 100644
--- a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/operations/J2EEArtifactImportDataModel.java
+++ b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/operations/J2EEArtifactImportDataModel.java
@@ -251,11 +251,8 @@
 		if (null != archiveFile && getBooleanProperty(DEFAULT_PROJECT_NAME)) {
 			Path path = new Path(archiveFile.getURI());
 			String defaultProjectName = path.segment(path.segmentCount() - 1);
-			if (defaultProjectName.indexOf('.') > 0) {
-				defaultProjectName = defaultProjectName.substring(0, defaultProjectName.lastIndexOf('.'));
-				if (defaultProjectName.indexOf('.') > 0) {
-					defaultProjectName = defaultProjectName.replace('.', '_');
-				}
+			if (defaultProjectName.indexOf(".") > 0) { //$NON-NLS-1$
+				defaultProjectName = defaultProjectName.substring(0, defaultProjectName.indexOf(".")); //$NON-NLS-1$
 			}
 			if (!getBooleanProperty(OVERWRITE_PROJECT)) {
 				String baseName = defaultProjectName;
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEModuleNature.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEModuleNature.java
index 217d416..cb2dd2a 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEModuleNature.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEModuleNature.java
@@ -39,6 +39,7 @@
 import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
 import org.eclipse.jst.j2ee.internal.earcreation.EARNatureRuntime;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.webservices.WebServiceEditModel;
 
 import com.ibm.wtp.emf.workbench.ProjectResourceSet;
 import com.ibm.wtp.emf.workbench.ProjectUtilities;
@@ -305,39 +306,35 @@
 	 * increments the use count of this model. When you are done accessing the model, call
 	 * releaseAccess()!
 	 */
-	// TODO WebServices for M3
-//	public WebServiceEditModel getWebServiceEditModelForRead(Object accessorKey) {
-//		return getWebServiceEditModelForRead(accessorKey, null);
-//	}
+	public WebServiceEditModel getWebServiceEditModelForRead(Object accessorKey) {
+		return getWebServiceEditModelForRead(accessorKey, null);
+	}
 
 	/**
 	 * Return an editing model used to read web service resources. Important!!! Calling this method
 	 * increments the use count of this model. When you are done accessing the model, call
 	 * releaseAccess()!
 	 */
-	// TODO WebServices for M3
-//	public WebServiceEditModel getWebServiceEditModelForRead(Object accessorKey, Map params) {
-//		return null;
-//	}
+	public WebServiceEditModel getWebServiceEditModelForRead(Object accessorKey, Map params) {
+		return null;
+	}
 
 	/**
 	 * Return an editing model used to edit web service resources. Important!!! Calling this method
 	 * increments the use count of this model. When you are done accessing the model, call
 	 * releaseAccess()!
 	 */
-	// TODO WebServices for M3
-//	public WebServiceEditModel getWebServiceEditModelForWrite(Object accessorKey) {
-//		return getWebServiceEditModelForWrite(accessorKey, null);
-//	}
+	public WebServiceEditModel getWebServiceEditModelForWrite(Object accessorKey) {
+		return getWebServiceEditModelForWrite(accessorKey, null);
+	}
 
 	/**
 	 * Return an editing model used to edit web service resources. Important!!! Calling this method
 	 * increments the use count of this model. When you are done accessing the model, call
 	 * releaseAccess()!
 	 */
-	// TODO Webservices for M3
-//	public WebServiceEditModel getWebServiceEditModelForWrite(Object accessorKey, Map params) {
-//		return null;
-//	}
+	public WebServiceEditModel getWebServiceEditModelForWrite(Object accessorKey, Map params) {
+		return null;
+	}
 
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/reference/ReferenceDataModel.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/reference/ReferenceDataModel.java
index ec6ec41..40318d6 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/reference/ReferenceDataModel.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/reference/ReferenceDataModel.java
@@ -28,6 +28,7 @@
 import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
 import org.eclipse.jst.j2ee.internal.common.operations.J2EEModelModifierOperationDataModel;
 import org.eclipse.jst.j2ee.internal.project.J2EECreationResourceHandler;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
 import org.eclipse.jst.j2ee.webapplication.WebApp;
 import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
 import org.eclispe.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
@@ -237,12 +238,11 @@
 				if (checkMessageDestRefExists(bean.getMessageDestinationRefs(), nameValue))
 					return false;
 			} 
-			// TODO WebServices for M3
-//			else {
-//				Collection temp = WebServicesManager.getInstance().get13ServiceRefs(bean);
-//				if (temp != null && !temp.isEmpty() && checkServiceRefExists((List) temp, nameValue))
-//					return false;
-//			}
+			else {
+				Collection temp = WebServicesManager.getInstance().get13ServiceRefs(bean);
+				if (temp != null && !temp.isEmpty() && checkServiceRefExists((List) temp, nameValue))
+					return false;
+			}
 		} else if (ownerType == APP_CLIENT_TYPE) {
 			ApplicationClient appClient = (ApplicationClient) getProperty(ReferenceDataModel.OWNER);
 			if (checkResourceRefExists(appClient.getResourceRefs(), nameValue))
@@ -257,12 +257,11 @@
 				if (checkMessageDestRefExists(appClient.getMessageDestinationRefs(), nameValue))
 					return false;
 			} 
-			// TODO WebServices for M3
-//			else {
-//				Collection temp = WebServicesManager.getInstance().get13ServiceRefs(appClient);
-//				if (temp != null && !temp.isEmpty() && checkServiceRefExists((List) temp, nameValue))
-//					return false;
-//			}
+			else {
+				Collection temp = WebServicesManager.getInstance().get13ServiceRefs(appClient);
+				if (temp != null && !temp.isEmpty() && checkServiceRefExists((List) temp, nameValue))
+					return false;
+			}
 		} else if (ownerType == WEB_TYPE) {
 			WebApp webApp = (WebApp) getProperty(ReferenceDataModel.OWNER);
 			if (checkResourceRefExists(webApp.getResourceRefs(), nameValue))
@@ -279,12 +278,11 @@
 				if (checkMessageDestRefExists(webApp.getMessageDestinationRefs(), nameValue))
 					return false;
 			} 
-			// TODO WebServices for M3
-//			else {
-//				Collection temp = WebServicesManager.getInstance().get13ServiceRefs(webApp);
-//				if (temp != null && !temp.isEmpty() && checkServiceRefExists((List) temp, nameValue))
-//					return false;
-//			}
+			else {
+				Collection temp = WebServicesManager.getInstance().get13ServiceRefs(webApp);
+				if (temp != null && !temp.isEmpty() && checkServiceRefExists((List) temp, nameValue))
+					return false;
+			}
 		}
 		return true;
 	}
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/reference/ServiceReferenceCreationOperation.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/reference/ServiceReferenceCreationOperation.java
new file mode 100644
index 0000000..1d15ed3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/reference/ServiceReferenceCreationOperation.java
@@ -0,0 +1,250 @@
+/*
+ * Created on Feb 6, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.j2ee.internal.reference;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jem.java.JavaRefFactory;
+import org.eclipse.jst.j2ee.client.ApplicationClient;
+import org.eclipse.jst.j2ee.client.impl.ClientFactoryImpl;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.Description;
+import org.eclipse.jst.j2ee.common.QName;
+import org.eclipse.jst.j2ee.common.XMLResource;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.internal.J2EEEditModel;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.webservices.WebServiceClientGenerator;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesClientDataRegistry;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.jst.j2ee.webservice.wsclient.ComponentScopedRefs;
+import org.eclipse.jst.j2ee.webservice.wsclient.PortComponentRef;
+import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
+import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesClient;
+import org.eclipse.jst.j2ee.webservice.wsclient.Webservice_clientFactory;
+import org.eclipse.jst.j2ee.webservice.wsclient.Webservice_clientPackage;
+import org.eclipse.wst.common.internal.emfworkbench.integration.ModifierHelper;
+import org.eclipse.wst.common.internal.emfworkbench.operation.ModelModifierOperation;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.ServerCore;
+
+
+/**
+ * @author dfholttp
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class ServiceReferenceCreationOperation extends ModelModifierOperation {
+	ServiceReferenceDataModel dataModel;
+	ServiceRef ref;
+	private int j2eeVersion = J2EEVersionConstants.J2EE_1_4_ID;
+
+	/**
+	 * @param dataModel
+	 */
+	public ServiceReferenceCreationOperation(ServiceReferenceDataModel dataModel) {
+		super(dataModel);
+		this.dataModel = dataModel;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.emf.workbench.operation.ModelModifierOperation#addHelpers()
+	 */
+	protected void addHelpers() {
+		WebServiceClientGenerator actualGen = getWebServiceClientGenerator();
+		if (actualGen != null)
+			actualGen.genWebServiceClientArtifacts(dataModel);
+		if (!dataModel.didGenDescriptors())
+			modifier.addHelper(createHelpers());
+
+		if (actualGen != null)
+			createPortCompRefHelpers();
+	}
+
+	protected WebServiceClientGenerator getWebServiceClientGenerator() {
+		List generators = WebServicesClientDataRegistry.getInstance().getWSClientGeneratorExtensions();
+		WebServiceClientGenerator actualGen = null;
+
+		IRuntime runtime = ServerCore.getProjectProperties(dataModel.getTargetProject()).getRuntimeTarget();
+		if (runtime == null)
+			return null;
+		String serverTargetID = runtime.getRuntimeType().getId();
+
+		for (int i = 0; i < generators.size(); i++) {
+			WebServiceClientGenerator gen = (WebServiceClientGenerator) generators.get(i);
+			if (gen.isRuntimeSupported(serverTargetID)) {
+				if (serverTargetID.equals(WebServiceClientGenerator.GENERIC_J2EE_CONTAINER)) {
+					// AXIS is only supported for web projects
+					if (dataModel.getDeploymentDescriptorType() != XMLResource.WEB_APP_TYPE)
+						break;
+				}
+				actualGen = gen;
+				break;
+			}
+		}
+		return actualGen;
+	}
+
+	/*
+	 * @see SimpleCommandWizardPage#createCommandHelper()
+	 */
+	public ModifierHelper createHelpers() {
+		ModifierHelper helper = null;
+		ref = Webservice_clientFactory.eINSTANCE.createServiceRef();
+
+		if (dataModel != null) {
+			helper = new ModifierHelper();
+			EObject owner = (EObject) dataModel.getProperty(ServiceReferenceDataModel.OWNER);
+			switch (dataModel.getDeploymentDescriptorType()) {
+				case XMLResource.APP_CLIENT_TYPE :
+					if (((ApplicationClient) owner).getVersionID() == J2EEVersionConstants.J2EE_1_4_ID) {
+						helper.setFeature(ClientFactoryImpl.getPackage().getApplicationClient_ServiceRefs());
+						helper.setOwner(owner);
+						Description descriptionObj = CommonFactory.eINSTANCE.createDescription();
+						descriptionObj.setValue(dataModel.getStringProperty(ServiceReferenceDataModel.DESCRIPTION).trim());
+						ref.getDescriptions().add(descriptionObj);
+						ref.setDescription(dataModel.getStringProperty(ServiceReferenceDataModel.DESCRIPTION).trim());
+					} else {
+						helper.setFeature(Webservice_clientPackage.eINSTANCE.getWebServicesClient_ServiceRefs());
+						helper.setOwner(WebServicesManager.getInstance().getDefaultWebServicesResource(owner, (J2EEEditModel) editModel).getWebServicesClient());
+						ref.setDescription(dataModel.getStringProperty(ServiceReferenceDataModel.DESCRIPTION).trim());
+						j2eeVersion = J2EEVersionConstants.J2EE_1_3_ID;
+					}
+					break;
+				case XMLResource.EJB_TYPE :
+					if (((EnterpriseBean) owner).getVersionID() == J2EEVersionConstants.EJB_2_1_ID) {
+						helper.setFeature(CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_ServiceRefs());
+						helper.setOwner(owner);
+						Description descriptionObj = CommonFactory.eINSTANCE.createDescription();
+						descriptionObj.setValue(dataModel.getStringProperty(ServiceReferenceDataModel.DESCRIPTION).trim());
+						ref.getDescriptions().add(descriptionObj);
+						ref.setDescription(dataModel.getStringProperty(ServiceReferenceDataModel.DESCRIPTION).trim());
+					} else {
+						j2eeVersion = J2EEVersionConstants.J2EE_1_3_ID;
+						return createEJB13Helper(owner, helper);
+					}
+					break;
+				case XMLResource.WEB_APP_TYPE :
+					if (((WebApp) owner).getVersionID() == J2EEVersionConstants.WEB_2_4_ID) {
+						helper.setFeature(CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_ServiceRefs());
+						helper.setOwner(owner);
+						Description descriptionObj = CommonFactory.eINSTANCE.createDescription();
+						descriptionObj.setValue(dataModel.getStringProperty(ServiceReferenceDataModel.DESCRIPTION).trim());
+						ref.getDescriptions().add(descriptionObj);
+						ref.setDescription(dataModel.getStringProperty(ServiceReferenceDataModel.DESCRIPTION).trim());
+					} else {
+						helper.setFeature(Webservice_clientPackage.eINSTANCE.getWebServicesClient_ServiceRefs());
+						helper.setOwner(WebServicesManager.getInstance().getDefaultWebServicesResource(owner, (J2EEEditModel) editModel).getWebServicesClient());
+						ref.setDescription(dataModel.getStringProperty(ServiceReferenceDataModel.DESCRIPTION).trim());
+						j2eeVersion = J2EEVersionConstants.J2EE_1_3_ID;
+					}
+					break;
+			}
+		}
+
+		ref.setServiceRefName(dataModel.getStringProperty(ServiceReferenceDataModel.REF_NAME).trim());
+		String serviceInterfaceName = dataModel.getServiceInterfaceName();
+		ref.setServiceInterface((JavaClass) JavaRefFactory.eINSTANCE.reflectType(serviceInterfaceName, (EObject) dataModel.getProperty(ServiceReferenceDataModel.OWNER)));
+		ref.setWsdlFile(dataModel.getStringProperty(ServiceReferenceDataModel.WSDL_FILE).trim());
+		if (dataModel.getStringProperty(ServiceReferenceDataModel.JAX_RPC_MAPPING_FILE) != null && !dataModel.getStringProperty(ServiceReferenceDataModel.JAX_RPC_MAPPING_FILE).equals("")) //$NON-NLS-1$
+			ref.setJaxrpcMappingFile(dataModel.getStringProperty(ServiceReferenceDataModel.JAX_RPC_MAPPING_FILE).trim());
+		QName qName = ((CommonPackage) EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI)).getCommonFactory().createQName();
+
+		if (j2eeVersion == J2EEVersionConstants.J2EE_1_3_ID) {
+			qName.setLocalPart(dataModel.getStringProperty(ServiceReferenceDataModel.QNAME_lOCAL_PART));
+			qName.setNamespaceURI(dataModel.getStringProperty(ServiceReferenceDataModel.QNAME_NAMESPACE_URI));
+		} else {
+			qName.setValues("prefix", dataModel.getStringProperty(ServiceReferenceDataModel.QNAME_NAMESPACE_URI), dataModel.getStringProperty(ServiceReferenceDataModel.QNAME_lOCAL_PART)); //$NON-NLS-1$         
+		}
+		ref.setServiceQname(qName);
+		ref.setDescription(dataModel.getStringProperty(ServiceReferenceDataModel.DESCRIPTION).trim());
+		helper.setValue(ref);
+		return helper;
+	}
+
+	/*
+	 * @see SimpleCommandWizardPage#createCommandHelper()
+	 */
+	public void createPortCompRefHelpers() {
+		ModifierHelper helper = null;
+		if (dataModel != null) {
+			helper = new ModifierHelper();
+			String[] serEndpoints = dataModel.getServiceEndpointInterfaceNames();
+			if (serEndpoints == null || serEndpoints.length == 0)
+				return;
+			String serviceEndpointInterface;
+			for (int i = 0; i < serEndpoints.length; i++) {
+				PortComponentRef portCompRef = Webservice_clientFactory.eINSTANCE.createPortComponentRef();
+				helper.setOwner(ref);
+				serviceEndpointInterface = serEndpoints[i];
+				portCompRef.setServiceEndpointInterface((JavaClass) JavaRefFactory.eINSTANCE.reflectType(serviceEndpointInterface, (EObject) dataModel.getProperty(ServiceReferenceDataModel.OWNER)));
+				helper.setFeature(Webservice_clientPackage.eINSTANCE.getServiceRef_PortComponentRefs());
+				helper.setValue(portCompRef);
+				modifier.addHelper(helper);
+			}
+		}
+	}
+
+	/**
+	 * @return
+	 */
+	private ModifierHelper createEJB13Helper(EObject ownerEJB, ModifierHelper helper) {
+		ref = Webservice_clientFactory.eINSTANCE.createServiceRef();
+		WebServicesClient webServiceClient = WebServicesManager.getInstance().getDefaultWebServicesResource(ownerEJB, (J2EEEditModel) editModel).getWebServicesClient();
+
+		ref.setServiceRefName(dataModel.getStringProperty(ServiceReferenceDataModel.REF_NAME).trim());
+		String serviceInterfaceName = dataModel.getServiceInterfaceName();
+		ref.setServiceInterface((JavaClass) JavaRefFactory.eINSTANCE.reflectType(serviceInterfaceName, (EObject) dataModel.getProperty(ServiceReferenceDataModel.OWNER)));
+		ref.setWsdlFile(dataModel.getStringProperty(ServiceReferenceDataModel.WSDL_FILE).trim());
+		if (dataModel.getStringProperty(ServiceReferenceDataModel.JAX_RPC_MAPPING_FILE) != null && !dataModel.getStringProperty(ServiceReferenceDataModel.JAX_RPC_MAPPING_FILE).equals("")) //$NON-NLS-1$
+			ref.setJaxrpcMappingFile(dataModel.getStringProperty(ServiceReferenceDataModel.JAX_RPC_MAPPING_FILE).trim());
+		QName qName = ((CommonPackage) EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI)).getCommonFactory().createQName();
+		qName.setLocalPart(dataModel.getStringProperty(ServiceReferenceDataModel.QNAME_lOCAL_PART));
+		qName.setNamespaceURI(dataModel.getStringProperty(ServiceReferenceDataModel.QNAME_NAMESPACE_URI));
+		ref.setServiceQname(qName);
+		ref.setDescription(dataModel.getStringProperty(ServiceReferenceDataModel.DESCRIPTION).trim());
+
+		ComponentScopedRefs compScopedRef = getComponentScopedRef((EnterpriseBean) ownerEJB, webServiceClient);
+		if (compScopedRef == null) {
+			compScopedRef = Webservice_clientFactory.eINSTANCE.createComponentScopedRefs();
+			compScopedRef.setComponentName(((EnterpriseBean) ownerEJB).getName());
+			helper.setOwner(webServiceClient);
+			helper.setFeature(Webservice_clientPackage.eINSTANCE.getWebServicesClient_ComponentScopedRefs());
+			compScopedRef.getServiceRefs().add(ref);
+			helper.setValue(compScopedRef);
+		} else {
+			helper.setOwner(compScopedRef);
+			helper.setFeature(Webservice_clientPackage.eINSTANCE.getComponentScopedRefs_ServiceRefs());
+			helper.setValue(ref);
+		}
+		return helper;
+	}
+
+	/**
+	 * @param webServiceRes
+	 * @return
+	 */
+	private ComponentScopedRefs getComponentScopedRef(EnterpriseBean ownerEJB, WebServicesClient webServiceClient) {
+		List existingRefs = webServiceClient.getComponentScopedRefs();
+		if (existingRefs != null) {
+			for (int i = 0; i < existingRefs.size(); i++) {
+				if (((ComponentScopedRefs) existingRefs.get(i)).getComponentName().equals(ownerEJB.getName())) {
+					return (ComponentScopedRefs) existingRefs.get(i);
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/reference/ServiceReferenceDataModel.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/reference/ServiceReferenceDataModel.java
new file mode 100644
index 0000000..d6725d6
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/reference/ServiceReferenceDataModel.java
@@ -0,0 +1,318 @@
+package org.eclipse.jst.j2ee.internal.reference;
+
+import org.eclipse.wst.wsdl.Service;
+import javax.xml.namespace.QName;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.jst.j2ee.common.XMLResource;
+import org.eclipse.jst.j2ee.internal.project.J2EECreationResourceHandler;
+import org.eclipse.jst.j2ee.internal.webservices.WebServicesClientDataHelper;
+import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclispe.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+import com.ibm.wtp.emf.workbench.ProjectUtilities;
+
+public class ServiceReferenceDataModel extends ReferenceDataModel implements WebServicesClientDataHelper {
+	/**
+	 * Required, type String
+	 */
+	public static final String TARGET_WEB_SERVICE = "ServiceReferenceDataModel.TARGET_WEB_SERVICE"; //$NON-NLS-1$
+	/**
+	 * Required, type String
+	 */
+	public static final String WSDL_FILE = "ServiceReferenceDataModel.WSDL_FILE"; //$NON-NLS-1$
+	/**
+	 * Required, type String
+	 */
+	public static final String JAX_RPC_MAPPING_FILE = "ServiceReferenceDataModel.JAX_RPC_MAPPING_FILE"; //$NON-NLS-1$
+	/**
+	 * Required, type String
+	 */
+	public static final String QNAME_NAMESPACE_URI = "ServiceReferenceDataModel.QNAME_NAMESPACE_URI"; //$NON-NLS-1$
+	/**
+	 * Required, type String
+	 */
+	public static final String QNAME_lOCAL_PART = "ServiceReferenceDataModel.QNAME_lOCAL_PART"; //$NON-NLS-1$
+	/**
+	 * Required, type String
+	 */
+	public static final String WSDL_URL = "ServiceReferenceDataModel.WSDL_URL"; //$NON-NLS-1$
+	/**
+	 * Required, type String
+	 */
+	public static final String QNAME = "ServiceReferenceDataModel.QNAME"; //$NON-NLS-1$
+	/**
+	 * Required, type String
+	 */
+	public static final String LINKS = "ServiceReferenceDataModel.LINK"; //$NON-NLS-1$
+
+	private String[] serviceEndpointInterfaceNames = null;
+	private String serviceInterfaceName = null;
+	private boolean didGenDescriptor = false;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.emf.workbench.operation.EditModelOperationDataModel#initValidBaseProperties()
+	 */
+	protected void initValidBaseProperties() {
+		addValidBaseProperty(TARGET_WEB_SERVICE);
+		addValidBaseProperty(WSDL_FILE);
+		addValidBaseProperty(JAX_RPC_MAPPING_FILE);
+		addValidBaseProperty(QNAME_NAMESPACE_URI);
+		addValidBaseProperty(QNAME_lOCAL_PART);
+		addValidBaseProperty(WSDL_URL);
+		addValidBaseProperty(QNAME);
+		addValidBaseProperty(LINKS);
+		super.initValidBaseProperties();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.etools.j2ee.reference.ReferenceDataModel#doSetProperty(java.lang.String,
+	 *      java.lang.Object)
+	 */
+	protected boolean doSetProperty(String propertyName, Object propertyValue) {
+		boolean doSet = super.doSetProperty(propertyName, propertyValue);
+		if (propertyName.equals(TARGET_WEB_SERVICE)) {
+			notifyDefaultChange(REF_NAME);
+			notifyDefaultChange(WSDL_FILE);
+			notifyDefaultChange(WSDL_URL);
+			notifyDefaultChange(QNAME);
+			notifyDefaultChange(QNAME_NAMESPACE_URI);
+			notifyDefaultChange(QNAME_lOCAL_PART);
+		}
+		return doSet;
+	}
+
+	protected Object getLocationForServiceFromWSIL(Service wsdl) {
+		// Fix to get "external" workspace wsdl file because wsilparser uses generic resource set
+		if (wsdl.eResource() == null)
+			return wsdl.getEnclosingDefinition().getLocation();
+		URI uri = wsdl.eResource().getURI();
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IPath rootPath = root.getLocation();
+		IPath wsdlPath = new Path(uri.toFileString());
+		if (wsdlPath.matchingFirstSegments(rootPath) == rootPath.segmentCount()) {
+			IFile wsdlFile = root.getFile(wsdlPath.removeFirstSegments(rootPath.segmentCount()));
+			if (wsdlFile.exists()) {
+				return wsdlFile.getProjectRelativePath().removeFirstSegments(1).toString();
+			}
+		}
+		return null;
+	}
+
+	protected Object getDefaultProperty(String propertyName) {
+		if (propertyName.equals(REF_NAME)) {
+			Service wsdl = (Service) getProperty(TARGET_WEB_SERVICE);
+			if (wsdl != null)
+				return "service/" + wsdl.getQName().getLocalPart(); //$NON-NLS-1$
+		} else if (propertyName.equals(WSDL_FILE)) {
+			Service wsdl = (Service) getProperty(TARGET_WEB_SERVICE);
+			if (wsdl != null) {
+				boolean isInternal = WorkbenchResourceHelper.getFile(wsdl) != null && WorkbenchResourceHelper.getFile(wsdl).exists();
+				if (isInternal)
+					return WorkbenchResourceHelper.getFile(wsdl).getProjectRelativePath().removeFirstSegments(1).toString();
+
+				Object location = getLocationForServiceFromWSIL(wsdl);
+				if (location != null)
+					return location;
+			}
+		} else if (propertyName.equals(WSDL_URL)) {
+			Service wsdl = (Service) getProperty(TARGET_WEB_SERVICE);
+			if (wsdl != null) {
+				boolean isInternal = WorkbenchResourceHelper.getFile(wsdl) != null && WorkbenchResourceHelper.getFile(wsdl).exists();
+				if (isInternal)
+					return "file:/" + WorkbenchResourceHelper.getFile(wsdl).getRawLocation().toString(); //$NON-NLS-1$
+				return wsdl.getEnclosingDefinition().getLocation();
+			}
+		} else if (propertyName.equals(QNAME)) {
+			Service wsdl = (Service) getProperty(TARGET_WEB_SERVICE);
+			if (wsdl != null)
+				return wsdl.getQName();
+		} else if (propertyName.equals(QNAME_NAMESPACE_URI)) {
+			Service wsdl = (Service) getProperty(TARGET_WEB_SERVICE);
+			if (wsdl != null) {
+				QName qName = wsdl.getQName();
+				if (qName != null)
+					return qName.getNamespaceURI();
+			}
+		} else if (propertyName.equals(QNAME_lOCAL_PART)) {
+			Service wsdl = (Service) getProperty(TARGET_WEB_SERVICE);
+			if (wsdl != null) {
+				QName qName = wsdl.getQName();
+				if (qName != null)
+					return qName.getLocalPart();
+			}
+		}
+		return super.getDefaultProperty(propertyName);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.etools.j2ee.reference.ReferenceDataModel#doValidateProperty(java.lang.String)
+	 */
+	protected IStatus doValidateProperty(String propertyName) {
+		IStatus stat = super.doValidateProperty(propertyName);
+		if (!(getProperty(TARGET_WEB_SERVICE) instanceof Service)) {
+			return WTPCommonPlugin.createErrorStatus(J2EECreationResourceHandler.getString("ServiceReferenceDataModel_ERROR_8")); //$NON-NLS-1$
+		}
+		return stat;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.common.operation.WTPOperationDataModel#getDefaultOperation()
+	 */
+	public WTPOperation getDefaultOperation() {
+		return new ServiceReferenceCreationOperation(this);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.j2ee.webservices.WebServicesClientDataHelper#getWSDLUrl()
+	 */
+	public String getWSDLUrl() {
+		return getStringProperty(WSDL_URL);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.j2ee.webservices.WebServicesClientDataHelper#getServiceQName()
+	 */
+	public String getServiceQName() {
+		return getStringProperty(QNAME_NAMESPACE_URI) + ":" + getStringProperty(QNAME_lOCAL_PART); //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.j2ee.webservices.WebServicesClientDataHelper#getServiceInterfaceName()
+	 */
+	public String getServiceInterfaceName() {
+		return serviceInterfaceName;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.j2ee.webservices.WebServicesClientDataHelper#getServiceEndpointInterfaceNames()
+	 */
+	public String[] getServiceEndpointInterfaceNames() {
+		return serviceEndpointInterfaceNames;
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.j2ee.webservices.WebServicesClientDataHelper#setServiceInterfaceName(java.lang.String)
+	 */
+	public void setServiceInterfaceName(String name) {
+		serviceInterfaceName = name;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.j2ee.webservices.WebServicesClientDataHelper#setServiceEndpointInterfaceNames(java.lang.String[])
+	 */
+	public void setServiceEndpointInterfaceNames(String[] names) {
+		serviceEndpointInterfaceNames = names;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.j2ee.webservices.WebServicesClientDataHelper#getProjectName()
+	 */
+	public String getProjectName() {
+		Object owner = getProperty(OWNER);
+		String name = ProjectUtilities.getProject(owner).getName();
+		return name;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.j2ee.webservices.WebServicesClientDataHelper#getOutputWSDLFileName()
+	 */
+	public String getOutputWSDLFileName() {
+		Object owner = getProperty(OWNER);
+		String outputLocation = null;
+		IProject project;
+		switch (getDeploymentDescriptorType()) {
+			case XMLResource.APP_CLIENT_TYPE :
+				project = ProjectUtilities.getProject(owner);
+				outputLocation = project.getFullPath().toString() + "\\appClientModule\\META-INF\\"; //$NON-NLS-1$
+				break;
+			case XMLResource.EJB_TYPE :
+				project = ProjectUtilities.getProject(owner);
+				outputLocation = project.getFullPath().toString() + "\\ejbModule\\META-INF\\"; //$NON-NLS-1$
+				break;
+			case XMLResource.WEB_APP_TYPE :
+				project = ProjectUtilities.getProject(owner);
+				outputLocation = project.getFullPath().toString() + "\\Web Content\\WEB-INF\\"; //$NON-NLS-1$
+				break;
+		}
+		if (getProperty(TARGET_WEB_SERVICE) == null)
+			return ""; //$NON-NLS-1$
+		return outputLocation + ((Service) getProperty(TARGET_WEB_SERVICE)).getQName().getLocalPart() + ".wsdl"; //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.j2ee.webservices.WebServicesClientDataHelper#shouldDeploy()
+	 */
+	public boolean shouldDeploy() {
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.j2ee.webservices.WebServicesClientDataHelper#shouldGenDescriptors()
+	 */
+	public boolean shouldGenDescriptors() {
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.j2ee.webservices.WebServicesClientDataHelper#setDidGenDescriptors(boolean)
+	 */
+	public void setDidGenDescriptors(boolean b) {
+		didGenDescriptor = b;
+	}
+
+	public boolean didGenDescriptors() {
+		return didGenDescriptor;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.common.operation.WTPOperationDataModel#isResultProperty(java.lang.String)
+	 */
+	protected boolean isResultProperty(String propertyName) {
+		if (propertyName.equals(JAX_RPC_MAPPING_FILE))
+			return true;
+		return super.isResultProperty(propertyName);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee/plugin.xml b/plugins/org.eclipse.jst.j2ee/plugin.xml
index efd5d60..2d9ef3f 100644
--- a/plugins/org.eclipse.jst.j2ee/plugin.xml
+++ b/plugins/org.eclipse.jst.j2ee/plugin.xml
@@ -42,6 +42,8 @@
       <import plugin="org.eclipse.jdt.launching"/>
       <import plugin="org.eclipse.jface"/>
       <import plugin="org.eclipse.jst.common.frameworks"/>
+      <import plugin="org.eclipse.wst.wsdl"/>
+      <import plugin="org.eclipse.wst.ws.parser"/>
    </requires>