[254462] performance:  WebservicesSynchronizer/Manager consuming too much memory
diff --git a/plugins/org.eclipse.jst.j2ee.webservice.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee.webservice.ui/META-INF/MANIFEST.MF
index 321ad51..51f8155 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.jst.j2ee.webservice.ui/META-INF/MANIFEST.MF
@@ -32,6 +32,7 @@
  org.eclipse.ui.navigator.resources;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.jst.j2ee.navigator.ui;bundle-version="[1.1.0,1.2.0)",
  org.eclipse.wst.common.project.facet.core;bundle-version="[1.3.0,2.0.0)",
- org.eclipse.core.expressions;bundle-version="[3.2.0,4.0.0)"
+ org.eclipse.core.expressions;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.web;bundle-version="1.1.205"
 Eclipse-LazyStart: true; exceptions="org.eclipse.jst.j2ee.internal.webservice.startup"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServiceViewerSynchronization.java b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServiceViewerSynchronization.java
index 96919c3..03cef47 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServiceViewerSynchronization.java
+++ b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServiceViewerSynchronization.java
@@ -25,6 +25,7 @@
 import org.eclipse.ui.progress.UIJob;
 import org.eclipse.wst.common.internal.emfworkbench.integration.DynamicAdapterFactory;
 import org.eclipse.wst.common.project.facet.core.internal.FacetedProjectPropertyTester;
+import org.eclipse.wst.project.facet.ProductManager;
 
 public class WebServiceViewerSynchronization implements WebServiceManagerListener{
 	
@@ -226,8 +227,10 @@
 	}
 	
 	public static boolean areThereWebServices() {
-		String val = WebServiceUIPlugin.getDefault().getPluginPreferences().getString(WebServiceViewerSynchronization.ARE_THERE_WEBSERVICES);
-		return Boolean.parseBoolean(val);
+		if (ProductManager.shouldUseViewerSyncForWebservices()) {
+			String val = WebServiceUIPlugin.getDefault().getPluginPreferences().getString(WebServiceViewerSynchronization.ARE_THERE_WEBSERVICES);
+			return Boolean.parseBoolean(val);
+		} else return false;
 	}
 
 	public static boolean isThereWebServicesPreferenceSet() {
@@ -337,7 +340,7 @@
 						viewer.remove(contentProvider.getNavigatorGroup());
 						setNavigatorGroupAdded(false);
 						setAreThereWebServices(false);
-						if(!contentProvider.projectListener.isDisposed()
+						if(contentProvider.projectListener != null && !contentProvider.projectListener.isDisposed()
 								&& !contentProvider.projectListener.isListening())
 							contentProvider.projectListener.startListening();
 					}
diff --git a/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorContentProvider.java b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorContentProvider.java
index 8cdfe98..dbf2745 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorContentProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorContentProvider.java
@@ -39,6 +39,7 @@
 import org.eclipse.jst.j2ee.webservice.wsdd.PortComponent;
 import org.eclipse.jst.j2ee.webservice.wsdd.WsddPackage;
 import org.eclipse.wst.common.internal.emfworkbench.integration.DynamicAdapterFactory;
+import org.eclipse.wst.project.facet.ProductManager;
 
 /**
  * @author jlanuti
@@ -63,14 +64,17 @@
 
 	public WebServicesNavigatorContentProvider() {
 		super(createAdapterFactory());
-		viewerSynchronization = new WebServiceViewerSynchronization(this);
-		projectListener = new NewProjectsListener(viewerSynchronization);
+		if (ProductManager.shouldUseViewerSyncForWebservices()) {
+			viewerSynchronization = new WebServiceViewerSynchronization(this);
+			projectListener = new NewProjectsListener(viewerSynchronization);
+		}
 
 	} 
 	
 	public void dispose() { 
 		super.dispose();
-		projectListener.dispose();
+		if (projectListener != null)
+			projectListener.dispose();
 	}
 
 	/**
@@ -86,12 +90,13 @@
 	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorContentProvider#getChildren(java.lang.Object)
 	 */
 	public Object[] getChildren(Object parentElement) {
-		
+
 		if (parentElement instanceof IWorkspaceRoot) {
 			// return new Object[]{ getWebServicesNavigatorGroup(parentElement) };
 			if(WebServiceViewerSynchronization.isThereWebServicesPreferenceSet()){
 				if(WebServiceViewerSynchronization.areThereWebServices()){
-					viewerSynchronization.setNavigatorGroupAdded(true);
+					if (viewerSynchronization != null)
+						viewerSynchronization.setNavigatorGroupAdded(true);
 					return new Object[]{getNavigatorGroup()};
 				} else {
 					return NO_CHILDREN;
diff --git a/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorLabelProvider.java b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorLabelProvider.java
index 5f1d285..a5d9ce6 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorLabelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorLabelProvider.java
@@ -124,8 +124,8 @@
 				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$
+			IProject refProj = ProjectUtilities.getProject((ServiceRef) element);
+			return (refProj != null) ? refProj.getName() : "" + ": " + beanName14 //$NON-NLS-1$
 						+ ((ServiceRef) element).getServiceRefName();
 		} else
 			return super.getText(element);
diff --git a/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/startup/WebserviceListener.java b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/startup/WebserviceListener.java
index 04da525..5dc970d 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/startup/WebserviceListener.java
+++ b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/startup/WebserviceListener.java
@@ -11,6 +11,7 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.ui.IStartup;
 import org.eclipse.wst.common.project.facet.core.internal.FacetedProjectPropertyTester;
+import org.eclipse.wst.project.facet.ProductManager;
 
 public class WebserviceListener implements IStartup, IResourceChangeListener, IResourceDeltaVisitor {
 	
@@ -76,8 +77,12 @@
 		return listening;
 	}
 	public void earlyStartup() {
-		INSTANCE = this;
-		startListening();
+		if (ProductManager.shouldUseViewerSyncForWebservices()) {
+			INSTANCE = this;
+			startListening();
+		} else {
+			org.eclipse.jst.j2ee.internal.webservice.WebServiceViewerSynchronization.setAreThereWebServices(false);
+		}
 	}
 
 	public void resourceChanged(IResourceChangeEvent event) {
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/IProductConstants.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/IProductConstants.java
index 75d5979..22b6558 100644
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/IProductConstants.java
+++ b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/IProductConstants.java
@@ -50,5 +50,6 @@
 	public static final String DEFAULT_RUNTIME_1 = "defaultRuntime1"; //$NON-NLS-1$
 	public static final String DEFAULT_RUNTIME_2 = "defaultRuntime2"; //$NON-NLS-1$
 	public static final String DEFAULT_RUNTIME_3 = "defaultRuntime3"; //$NON-NLS-1$
+	public static final String VIEWER_SYNC_FOR_WEBSERVICES = "viewerSyncForWebservices"; //$NON-NLS-1$
 	
 }
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/ProductManager.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/ProductManager.java
index a5ff789..459aa2b 100644
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/ProductManager.java
+++ b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/ProductManager.java
@@ -36,6 +36,7 @@
 	private static final String ADD_TO_EAR_BY_DEFAULT = "false"; //$NON-NLS-1$
 	private static final String OUTPUT_FOLDER = "build/classes"; //$NON-NLS-1$
 	private static final String USE_SINGLE_ROOT_STRUCTURE = "false"; //$NON-NLS-1$
+	private static final String VIEWER_SYNC_FOR_WEBSERVICES = "true"; //$NON-NLS-1$
 	private static final String ID_PERSPECTIVE_HIERARCHY_VIEW = "org.eclipse.ui.navigator.ProjectExplorer"; //$NON-NLS-1$
 	private static final String FINAL_PERSPECTIVE = "org.eclipse.jst.j2ee.J2EEPerspective"; //$NON-NLS-1$
 	private static final char RUNTIME_SEPARATOR = ':';
@@ -74,6 +75,8 @@
 				return ADD_TO_EAR_BY_DEFAULT;
 			else if (key.equals(IProductConstants.USE_SINGLE_ROOT_STRUCTURE))
 				return USE_SINGLE_ROOT_STRUCTURE;
+			else if (key.equals(IProductConstants.VIEWER_SYNC_FOR_WEBSERVICES))
+				return VIEWER_SYNC_FOR_WEBSERVICES;
 			else if (key.equals(IProductConstants.OUTPUT_FOLDER))
 				return OUTPUT_FOLDER;
 			else if (key.equals(IProductConstants.ID_PERSPECTIVE_HIERARCHY_VIEW))
@@ -105,6 +108,11 @@
 		String value = getProperty(IProductConstants.USE_SINGLE_ROOT_STRUCTURE);
 		return Boolean.valueOf(value).booleanValue();
 	}
+	
+	public static boolean shouldUseViewerSyncForWebservices() {
+		String value = getProperty(IProductConstants.VIEWER_SYNC_FOR_WEBSERVICES);
+		return Boolean.valueOf(value).booleanValue();
+	}
 
 	public static List/*<IRuntime>*/ getDefaultRuntimes() {
 		List theRuntimes = null;