[243883] Publish after add/remove
diff --git a/features/org.eclipse.wst.server_core.feature/feature.xml b/features/org.eclipse.wst.server_core.feature/feature.xml
index c212fe4..8985d45 100644
--- a/features/org.eclipse.wst.server_core.feature/feature.xml
+++ b/features/org.eclipse.wst.server_core.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.wst.server_core.feature"
       label="%featureName"
-      version="3.0.1.qualifier"
+      version="3.0.2.qualifier"
       provider-name="%providerName">
 
    <description>
diff --git a/plugins/org.eclipse.wst.server.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.server.ui/META-INF/MANIFEST.MF
index 8815a61..71f3f04 100644
--- a/plugins/org.eclipse.wst.server.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.server.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.server.ui; singleton:=true
-Bundle-Version: 1.1.1.qualifier
+Bundle-Version: 1.1.2.qualifier
 Bundle-Activator: org.eclipse.wst.server.ui.internal.ServerUIPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.java
index 48a4403..79f2f7a 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.java
@@ -183,6 +183,7 @@
 	public static String wizModuleRemoveAll;
 	public static String wizModuleRequiredModule;
 	public static String wizModuleRequiredModules;
+	public static String wizModulePublishImmediately;
 	public static String wizTaskTitle;
 	public static String wizTaskDescription;
 	public static String wizErrorInvalidFolder;
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.properties b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.properties
index f768261..08b92ba 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.properties
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.properties
@@ -85,6 +85,7 @@
 wizModuleRemoveAll=<< Re&move All
 wizModuleRequiredModule={0} is required and cannot be removed from the server
 wizModuleRequiredModules=One of the required modules ({0}) must be added to the server
+wizModulePublishImmediately=If server is started, publish changes &immediately
 
 # Wizard info and error messages
 wizErrorInvalidFolder=The folder must be a server project or a folder within a server project
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPreferences.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPreferences.java
index a66d68b..e9c6e3a 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPreferences.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPreferences.java
@@ -29,6 +29,7 @@
 	private static final String PREF_ENABLE_BREAKPOINTS = "enable-breakpoints";
 	private static final String PREF_RESTART = "restart";
 	private static final String PREF_CREATE_SERVER_WITH_RUNTIME = "create-server";
+	private static final String PREF_PUBLISH_ON_ADD_REMOVE = "publish-on-add-remove";
 
 	public static final byte SAVE_EDITORS_ALWAYS = 2;
 	public static final byte SAVE_EDITORS_NEVER = 0;
@@ -72,6 +73,7 @@
 		preferences.setDefault(PREF_HOST_NAMES, "localhost");
 		preferences.setDefault(PREF_SHOW_ON_ACTIVITY, true);
 		preferences.setDefault(PREF_CREATE_SERVER_WITH_RUNTIME, false);
+		preferences.setDefault(PREF_PUBLISH_ON_ADD_REMOVE, true);
 	}
 
 	/**
@@ -340,4 +342,23 @@
 		preferences.setValue(PREF_CREATE_SERVER_WITH_RUNTIME, b);
 		ServerUIPlugin.getInstance().savePluginPreferences();
 	}
+
+	/**
+	 * Returns the setting for publishing when modules are added or removed.
+	 * 
+	 * @return boolean
+	 */
+	public boolean getPublishOnAddRemoveModule() {
+		return preferences.getBoolean(PREF_PUBLISH_ON_ADD_REMOVE);
+	}
+
+	/**
+	 * Sets the value for publishing when modules are added or removed.
+	 * 
+	 * @param b
+	 */
+	public void setPublishOnAddRemoveModule(boolean b) {
+		preferences.setValue(PREF_PUBLISH_ON_ADD_REMOVE, b);
+		ServerUIPlugin.getInstance().savePluginPreferences();
+	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/RemoveModuleAction.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/RemoveModuleAction.java
index b198af0..756ba36 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/RemoveModuleAction.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/RemoveModuleAction.java
@@ -16,8 +16,8 @@
 import org.eclipse.wst.server.core.IModule;
 import org.eclipse.wst.server.core.IServer;
 import org.eclipse.wst.server.core.IServerWorkingCopy;
-import org.eclipse.wst.server.core.internal.Server;
 import org.eclipse.wst.server.ui.internal.Messages;
+import org.eclipse.wst.server.ui.internal.ServerUIPlugin;
 import org.eclipse.wst.server.ui.internal.Trace;
 import org.eclipse.swt.widgets.Shell;
 /**
@@ -53,7 +53,8 @@
 				wc.modifyModules(null, new IModule[] { module }, null);
 				server = wc.save(true, null);
 				
-				if (server.getServerState() != IServer.STATE_STOPPED && ((Server)server).getAutoPublishSetting() != Server.AUTO_PUBLISH_DISABLE) {
+				if (server.getServerState() != IServer.STATE_STOPPED &&
+						ServerUIPlugin.getPreferences().getPublishOnAddRemoveModule()) {
 					final IAdaptable info = new IAdaptable() {
 						public Object getAdapter(Class adapter) {
 							if (Shell.class.equals(adapter))
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/ModifyModulesWizard.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/ModifyModulesWizard.java
index 1c6b776..9cdc191 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/ModifyModulesWizard.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/ModifyModulesWizard.java
@@ -16,8 +16,8 @@
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.wst.server.core.*;
-import org.eclipse.wst.server.core.internal.Server;
 import org.eclipse.wst.server.ui.internal.Messages;
+import org.eclipse.wst.server.ui.internal.ServerUIPlugin;
 import org.eclipse.wst.server.ui.internal.wizard.fragment.ModifyModulesWizardFragment;
 import org.eclipse.wst.server.ui.wizard.WizardFragment;
 /**
@@ -26,7 +26,7 @@
 public class ModifyModulesWizard extends TaskWizard {
 	static class ModifyModulesWizard2 extends WizardFragment {
 		protected void createChildFragments(List<WizardFragment> list) {
-			list.add(new ModifyModulesWizardFragment());
+			list.add(new ModifyModulesWizardFragment(true));
 			list.add(WizardTaskUtil.SaveServerFragment);
 			
 			list.add(new WizardFragment() {
@@ -34,7 +34,8 @@
 					IServerAttributes svr = (IServerAttributes) getTaskModel().getObject(TaskModel.TASK_SERVER);
 					if (svr instanceof IServer) {
 						IServer server = (IServer) svr;
-						if (server.getServerState() != IServer.STATE_STOPPED && ((Server)server).getAutoPublishSetting() != Server.AUTO_PUBLISH_DISABLE) {
+						if (server.getServerState() != IServer.STATE_STOPPED &&
+								ServerUIPlugin.getPreferences().getPublishOnAddRemoveModule()) {
 							IAdaptable info = null;
 							/*IAdaptable info = new IAdaptable() {
 								public Object getAdapter(Class adapter) {
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/fragment/ModifyModulesWizardFragment.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/fragment/ModifyModulesWizardFragment.java
index 02b9e09..498555d 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/fragment/ModifyModulesWizardFragment.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/fragment/ModifyModulesWizardFragment.java
@@ -19,6 +19,7 @@
 import org.eclipse.wst.server.core.*;
 import org.eclipse.wst.server.core.internal.IModuleVisitor;
 import org.eclipse.wst.server.core.internal.Server;
+import org.eclipse.wst.server.ui.internal.ServerUIPlugin;
 import org.eclipse.wst.server.ui.internal.Trace;
 import org.eclipse.wst.server.ui.internal.wizard.WizardTaskUtil;
 import org.eclipse.wst.server.ui.internal.wizard.page.ModifyModulesComposite;
@@ -31,11 +32,16 @@
 	protected ModifyModulesComposite comp;
 
 	protected IModule module;
+	protected boolean showPublishOption;
 
 	public ModifyModulesWizardFragment() {
 		// do nothing
 	}
 
+	public ModifyModulesWizardFragment(boolean showPublishOption) {
+		this.showPublishOption = showPublishOption;
+	}
+
 	public ModifyModulesWizardFragment(IModule module) {
 		this.module = module;
 	}
@@ -48,7 +54,7 @@
 	 * @see org.eclipse.wst.server.ui.internal.task.WizardTask#getWizardPage()
 	 */
 	public Composite createComposite(Composite parent, IWizardHandle handle) {
-		comp = new ModifyModulesComposite(parent, handle, module);
+		comp = new ModifyModulesComposite(parent, handle, module, showPublishOption);
 		return comp;
 	}
 
@@ -120,7 +126,10 @@
 	}
 
 	public void performFinish(IProgressMonitor monitor) throws CoreException {
-		if (comp != null)
+		if (comp != null) {
 			WizardTaskUtil.modifyModules(comp.getModulesToAdd(), comp.getModulesToRemove(), getTaskModel(), monitor);
+			if (showPublishOption)
+				ServerUIPlugin.getPreferences().setPublishOnAddRemoveModule(comp.shouldPublishImmediately());
+		}
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/ModifyModulesComposite.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/ModifyModulesComposite.java
index 0b56d11..454ad8b 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/ModifyModulesComposite.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/ModifyModulesComposite.java
@@ -49,6 +49,8 @@
 	protected IRuntime runtime;
 	protected boolean runtimeDirty;
 	protected Object refreshModules;
+	protected boolean showPublishOption;
+	protected boolean publishImmediately;
 
 	protected Map<ChildModuleMapKey, IModule[]> childModuleMap = new HashMap<ChildModuleMapKey, IModule[]>();
 	protected Map<IModule, IModule[]> parentModuleMap = new HashMap<IModule, IModule[]>();
@@ -219,6 +221,27 @@
 		createControl();
 	}
 
+	/**
+	 * Create a new ModifyModulesComposite.
+	 * 
+	 * @param parent a parent composite
+	 * @param wizard a wizard
+	 * @param module the module that is being added
+	 * @param showPublishOption show the publishing options
+	 */
+	public ModifyModulesComposite(Composite parent, IWizardHandle wizard, IModule module, boolean showPublishOption) {
+		super(parent, SWT.NONE);
+		this.wizard = wizard;
+		requiredModule = module;
+		this.showPublishOption = showPublishOption;
+		
+		wizard.setTitle(Messages.wizModuleTitle);
+		wizard.setDescription(Messages.wizModuleDescription);
+		wizard.setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_WIZBAN_SELECT_SERVER));
+		
+		createControl();
+	}
+
 	public void setServer(IServerAttributes server) {
 		if (isVisible())
 			return;
@@ -614,6 +637,22 @@
 			}
 		});
 		
+		if (showPublishOption) {
+			final Button publish = new Button(this, SWT.CHECK);
+			publish.setText(Messages.wizModulePublishImmediately);
+			data = new GridData(GridData.FILL_HORIZONTAL);
+			data.horizontalSpan = 3;
+			publish.setLayoutData(data);
+			
+			publishImmediately = ServerUIPlugin.getPreferences().getPublishOnAddRemoveModule();
+			publish.setSelection(publishImmediately);
+			publish.addSelectionListener(new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent event) {
+					publishImmediately = publish.getSelection();
+				}
+			});
+		}
+		
 		setEnablement();
 		availableTree.setFocus();
 		
@@ -900,4 +939,8 @@
 	public boolean isComplete() {
 		return isComplete;
 	}
+
+	public boolean shouldPublishImmediately() {
+		return publishImmediately;
+	}
 }
\ No newline at end of file