[169570] publish by module
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/IServer.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/IServer.java
index 1113586..833dd4a 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/IServer.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/IServer.java
@@ -10,6 +10,8 @@
  *******************************************************************************/
 package org.eclipse.wst.server.core;
 
+import java.util.List;
+
 import org.eclipse.core.runtime.*;
 import org.eclipse.debug.core.ILaunch;
 import org.eclipse.debug.core.ILaunchConfiguration;
@@ -318,7 +320,7 @@
 	 * @param monitor a progress monitor, or <code>null</code> if progress
 	 *    reporting and cancellation are not desired
 	 * @return status indicating what (if anything) went wrong
-	 * @see #publish(int, IModule[], IServer.IOperationListener)
+	 * @see #publish(int, List, IAdaptable, IOperationListener)
 	 */
 	public IStatus publish(int kind, IProgressMonitor monitor);
 
@@ -345,13 +347,18 @@
 	 *      out all state and cleans up the module on the server before doing a
 	 *      full publish.
 	 *    </ul>
-	 * @param modules an array of modules, or <code>null</code> to publish all
-	 *    modules
-	 *  @param listener an operation listener to receive notification when this
+	 * @param modules a list of modules to publish, or <code>null</code> to
+	 *    publish all modules
+	 * @param info the IAdaptable (or <code>null</code>) provided by the
+	 *    caller in order to supply UI information for prompting the
+	 *    user if necessary. When this parameter is not
+	 *    <code>null</code>, it should minimally contain an adapter
+	 *    for the Shell class.
+	 * @param listener an operation listener to receive notification when this
 	 *    operation is done, or <code>null</code> if notification is not
 	 *    required
 	 */
-	public void publish(int kind, IModule[] modules, IOperationListener listener);
+	public void publish(int kind, List<IModule[]> modules, IAdaptable info, IOperationListener listener);
 
 	/**
 	 * Returns whether this server is in a state that it can
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/PublishServerJob.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/PublishServerJob.java
index 31ada68..157d51d 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/PublishServerJob.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/PublishServerJob.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2008 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
@@ -10,14 +10,18 @@
  *******************************************************************************/
 package org.eclipse.wst.server.core.internal;
 
+import java.util.List;
+
 import org.eclipse.core.resources.IResourceRuleFactory;
 import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.ISchedulingRule;
 import org.eclipse.core.runtime.jobs.MultiRule;
 import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.server.core.IModule;
 import org.eclipse.wst.server.core.IServer;
 import org.eclipse.wst.server.core.ServerCore;
 /**
@@ -26,18 +30,42 @@
 public class PublishServerJob extends ChainedJob {
 	protected int kind;
 	protected boolean check;
+	protected List<IModule[]> modules;
+	protected IAdaptable info;
 
 	/**
 	 * Create a new publishing job.
 	 * 
 	 * @param server the server to publish to
 	 * @param kind the kind of publish
-	 * @param check to check if autopublishing is already covering the publish
+	 * @param info the IAdaptable (or <code>null</code>) provided by the
+	 *    caller in order to supply UI information for prompting the
+	 *    user if necessary. When this parameter is not
+	 *    <code>null</code>, it should minimally contain an adapter
+	 *    for the Shell class.
 	 */
-	public PublishServerJob(IServer server, int kind, boolean check) {
+	public PublishServerJob(IServer server, int kind, IAdaptable info) {
+		this(server, kind, null, info);
+	}
+
+	/**
+	 * Create a new publishing job.
+	 * 
+	 * @param server the server to publish to
+	 * @param kind the kind of publish
+	 * @param modules a list of modules to publish, or <code>null</code> to
+	 *    publish all modules
+	 * @param info the IAdaptable (or <code>null</code>) provided by the
+	 *    caller in order to supply UI information for prompting the
+	 *    user if necessary. When this parameter is not
+	 *    <code>null</code>, it should minimally contain an adapter
+	 *    for the Shell class.
+	 */
+	public PublishServerJob(IServer server, int kind, List<IModule[]> modules, IAdaptable info) {
 		super(NLS.bind(Messages.publishing, server.getName()), server);
 		this.kind = kind;
-		this.check = check;
+		this.modules = modules;
+		this.info = info;
 		
 		IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
 		
@@ -53,6 +81,19 @@
 	 * Create a new publishing job.
 	 * 
 	 * @param server the server to publish to
+	 * @param kind the kind of publish
+	 * @param check to check if auto-publishing is already covering the publish
+	 */
+	public PublishServerJob(IServer server, int kind, boolean check) {
+		this(server, kind, null, null);
+		this.check = check;
+	}
+
+	/**
+	 * Create a new publishing job.
+	 * 
+	 * @param server the server to publish to
+	 * @deprecated use one of the other constructors instead
 	 */
 	public PublishServerJob(IServer server) {
 		this(server, IServer.PUBLISH_INCREMENTAL, true);
@@ -62,14 +103,18 @@
 	 * @see org.eclipse.core.runtime.jobs.Job#run(IProgressMonitor)
 	 */
 	protected IStatus run(IProgressMonitor monitor) {
-		if (check) {
+		//if (!getServer().shouldPublish())
+		//	return Status.OK_STATUS;
+		
+		if (check && !ServerCore.isAutoPublishing()) {
 			// don't run if we're auto-publishing and there is no need for a publish.
 			// can't execute this code in shouldRun() because it will cancel the job
 			// instead of returning immediately
-			if (!ServerCore.isAutoPublishing() || !getServer().shouldPublish())
 				return Status.OK_STATUS;
 		}
 		
-		return getServer().publish(kind, monitor);
+		getServer().publish(kind, modules, info, null); // TODO
+		return Status.OK_STATUS;
+		//return getServer().publish(kind, monitor);
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
index 204d854..4a1a6d8 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
@@ -111,7 +111,7 @@
 	// publish listeners
 	protected transient List<IPublishListener> publishListeners;
 
-	// Server listeners
+	// server listeners
 	protected transient ServerNotificationManager notificationManager;
 
 	public class AutoPublishThread extends Thread {
@@ -141,7 +141,7 @@
 			if (getServerState() != IServer.STATE_STARTED)
 				return;
 			
-			PublishServerJob publishJob = new PublishServerJob(Server.this, IServer.PUBLISH_AUTO, false);
+			PublishServerJob publishJob = new PublishServerJob(Server.this, IServer.PUBLISH_AUTO, null);
 			publishJob.schedule();
 		}
 	}
@@ -950,19 +950,14 @@
 			}
 		}
 		
-		long time = System.currentTimeMillis();
-		firePublishStarted();
-		IStatus status = doPublish(kind, monitor);
-		firePublishFinished(status);
-		Trace.trace(Trace.PERFORMANCE, "Server.publish(): <" + (System.currentTimeMillis() - time) + "> " + getServerType().getId());
-		return status;
+		return doPublish(kind, null, monitor, null);
 	}
 
 	/*
 	 * Publish the given modules to the server.
 	 * TODO: Implementation!
 	 */
-	public void publish(int kind, IModule[] modules2, IOperationListener listener) {
+	public void publish(int kind, List<IModule[]> modules2, IAdaptable info, IOperationListener listener) {
 		if (getServerType() == null) {
 			listener.done(new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, Messages.errorMissingAdapter, null));
 			return;
@@ -987,22 +982,21 @@
 			}
 		}
 		
-		long time = System.currentTimeMillis();
-		firePublishStarted();
-		IStatus status = doPublish(kind, new NullProgressMonitor());
-		firePublishFinished(status);
-		Trace.trace(Trace.PERFORMANCE, "Server.publish(): <" + (System.currentTimeMillis() - time) + "> " + getServerType().getId());
-		listener.done(status);
+		doPublish(kind, modules2, new NullProgressMonitor(), info);
 	}
 
-	protected IStatus doPublish(int kind, IProgressMonitor monitor) {
+	protected IStatus doPublish(int kind, List<IModule[]> modules3, IProgressMonitor monitor, IAdaptable info) {
 		Trace.trace(Trace.FINEST, "-->-- Publishing to server: " + toString() + " -->--");
 		
 		stopAutoPublish();
 		
 		try {
+			long time = System.currentTimeMillis();
+			firePublishStarted();
+			
 			getServerPublishInfo().startCaching();
-			IStatus status = getBehaviourDelegate(monitor).publish(kind, monitor);
+			//IStatus status = 
+			getBehaviourDelegate(monitor).publish(kind, modules3, monitor, info);
 			
 			final List<IModule[]> modules2 = new ArrayList<IModule[]>();
 			visit(new IModuleVisitor() {
@@ -1019,7 +1013,9 @@
 			getServerPublishInfo().clearCache();
 			getServerPublishInfo().save();
 			
-			return status;
+			firePublishFinished(Status.OK_STATUS);
+			Trace.trace(Trace.PERFORMANCE, "Server.publish(): <" + (System.currentTimeMillis() - time) + "> " + getServerType().getId());
+			return Status.OK_STATUS;
 		} catch (Exception e) {
 			Trace.trace(Trace.SEVERE, "Error calling delegate publish() " + toString(), e);
 			return new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, Messages.errorPublishing, e);
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPublishInfo.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPublishInfo.java
index 6e1f519..9ce5aac 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPublishInfo.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPublishInfo.java
@@ -32,7 +32,6 @@
 import org.eclipse.wst.server.core.model.IModuleFolder;
 import org.eclipse.wst.server.core.model.IModuleResource;
 import org.eclipse.wst.server.core.model.IModuleResourceDelta;
-import org.eclipse.wst.server.core.model.ServerBehaviourDelegate;
 /**
  * Helper to obtain and store the publishing information (what files
  * were published and when) for a single server.
@@ -183,7 +182,7 @@
 		return mpi;
 	}
 
-	public void addRemovedModules(List<IModule[]> moduleList, List<Integer> kindList) {
+	public void addRemovedModules(List<IModule[]> moduleList) {
 		int size = moduleList.size();
 		List<ModulePublishInfo> removed = new ArrayList<ModulePublishInfo>();
 		Iterator iterator = modulePublishInfo.keySet().iterator();
@@ -228,10 +227,8 @@
 					}
 				}
 			}
-			if (module2 != null && module2.length > 0) {
+			if (module2 != null && module2.length > 0)
 				moduleList.add(module2);
-				kindList.add(new Integer(ServerBehaviourDelegate.REMOVED));
-			}
 		}
 	}
 
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java
index fc230c9..270c14d 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java
@@ -22,6 +22,8 @@
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.*;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.server.core.*;
 import org.eclipse.wst.server.core.model.InternalInitializer;
@@ -670,6 +672,26 @@
 		return new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, Messages.errorPublishing, null);
 	}
 
+	public void publish(int kind, List<IModule[]> modules2, IAdaptable info, IOperationListener listener) {
+		if (server != null) {
+			server.publish(kind, modules2, info, listener);
+			return;
+		}
+		listener.done(new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, Messages.errorPublishing, null));
+	}
+
+	public ILaunch getLaunch() {
+		if (server != null)
+			return server.getLaunch();
+		return null;
+	}
+
+	public ILaunchConfiguration getLaunchConfiguration(boolean create, IProgressMonitor monitor) throws CoreException {
+		if (server != null)
+			return server.getLaunchConfiguration(create, monitor);
+		return null;
+	}
+
 	/**
 	 * Sets the server restart state.
 	 *
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/ServerBehaviourDelegate.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/ServerBehaviourDelegate.java
index bc2eaa7..3d72fea 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/ServerBehaviourDelegate.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/ServerBehaviourDelegate.java
@@ -20,6 +20,7 @@
 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.TaskModel;
 import org.eclipse.wst.server.core.internal.*;
 /**
  * A server delegate provides the implementation for various 
@@ -588,6 +589,109 @@
 	 * Publish to the server.
 	 * 
 	 * @param kind the publish kind
+	 * @param modules
+	 * @param monitor a progress monitor, or <code>null</code> if progress
+	 *    reporting and cancellation are not desired
+	 * @param info
+	 * @throws CoreException
+	 */
+	public void publish(int kind, List<IModule[]> modules, IProgressMonitor monitor, IAdaptable info) throws CoreException {
+		info2 = info;
+		IStatus status = publish(kind, monitor);
+		if (status != null && status.getSeverity() != IStatus.OK && status.getSeverity() != IStatus.CANCEL)
+			throw new CoreException(status);
+	}
+
+	private IAdaptable info2;
+
+	/*public void publish2(int kind, List<IModule[]> modules, IProgressMonitor monitor, IAdaptable info) throws CoreException {
+		Trace.trace(Trace.FINEST, "-->-- Publishing to server: " + toString() + " -->--");
+		
+		if (getServer().getServerType().hasRuntime() && getServer().getRuntime() == null)
+			throw new CoreException(new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, Messages.errorPublishNoRuntime, null));
+		
+		final List<IModule[]> moduleList = getAllModules();
+		addRemovedModules(moduleList, null);
+		
+		PublishOperation[] tasks = getTasks(kind, moduleList, null);
+		int size = 2000 + 3500 * moduleList.size() + 500 * tasks.length;
+		
+		monitor = ProgressUtil.getMonitorFor(monitor);
+		monitor.beginTask(NLS.bind(Messages.publishing, getServer().getName()), size);
+		
+		MultiStatus tempMulti = new MultiStatus(ServerPlugin.PLUGIN_ID, 0, "", null);
+		
+		if (monitor.isCanceled())
+			return;
+		
+		try {
+			Trace.trace(Trace.FINEST, "Starting publish");
+			publishStart(ProgressUtil.getSubMonitorFor(monitor, 1000));
+			
+			if (monitor.isCanceled())
+				return;
+			
+			// execute publishers
+			executePublishers(kind, modules, monitor, info);
+			
+			if (monitor.isCanceled())
+				return;
+			
+			// publish the server
+			publishServer(kind, ProgressUtil.getSubMonitorFor(monitor, 1000));
+			
+			if (monitor.isCanceled())
+				return;
+			
+			// publish modules
+			IspublishModules(kind, moduleList, monitor);
+			
+			if (monitor.isCanceled())
+				return;
+			
+			monitor.done();
+		} catch (CoreException ce) {
+			Trace.trace(Trace.INFO, "CoreException publishing to " + toString(), ce);
+			throw ce;
+		} catch (Exception e) {
+			Trace.trace(Trace.SEVERE, "Error publishing  to " + toString(), e);
+			tempMulti.add(new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, Messages.errorPublishing, e));
+		} finally {
+			// end the publishing
+			try {
+				publishFinish(ProgressUtil.getSubMonitorFor(monitor, 500));
+			} catch (CoreException ce) {
+				Trace.trace(Trace.INFO, "CoreException publishing to " + toString(), ce);
+				tempMulti.add(ce.getStatus());
+			} catch (Exception e) {
+				Trace.trace(Trace.SEVERE, "Error stopping publish to " + toString(), e);
+				tempMulti.add(new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, Messages.errorPublishing, e));
+			}
+		}
+		
+		Trace.trace(Trace.FINEST, "--<-- Done publishing --<--");
+		
+		if (tempMulti.getChildren().length == 1)
+			throw new CoreException(tempMulti.getChildren()[0]);
+		
+		MultiStatus multi = null;
+		if (tempMulti.getSeverity() == IStatus.OK)
+			return;
+		else if (tempMulti.getSeverity() == IStatus.INFO)
+			multi = new MultiStatus(ServerPlugin.PLUGIN_ID, 0, Messages.publishingStatusInfo, null);
+		else if (tempMulti.getSeverity() == IStatus.WARNING)
+			multi = new MultiStatus(ServerPlugin.PLUGIN_ID, 0, Messages.publishingStatusWarning, null);
+		else if (tempMulti.getSeverity() == IStatus.ERROR)
+			multi = new MultiStatus(ServerPlugin.PLUGIN_ID, 0, Messages.publishingStatusError, null);
+		
+		if (multi != null)
+			multi.addAll(tempMulti);
+	}*/
+
+	/**
+	 * Publish to the server.
+	 * 
+	 * @param kind the publish kind
 	 * @param monitor a progress monitor, or <code>null</code> if progress
 	 *    reporting and cancellation are not desired
 	 * @return the publish status
@@ -615,11 +719,9 @@
 				deltaKindList.add(new Integer(ServerBehaviourDelegate.ADDED));
 		}
 		
-		addRemovedModules(moduleList, deltaKindList);
-		
-		while (moduleList.size() > deltaKindList.size()) {
+		addRemovedModules(moduleList, null);
+		while (deltaKindList.size() < moduleList.size())
 			deltaKindList.add(new Integer(ServerBehaviourDelegate.REMOVED));
-		}
 		
 		PublishOperation[] tasks = getTasks(kind, moduleList, deltaKindList);
 		int size = 2000 + 3500 * moduleList.size() + 500 * tasks.length;
@@ -644,7 +746,7 @@
 			if (taskStatus != null && !taskStatus.isOK())
 				tempMulti.addAll(taskStatus);
 			
-			executePublishers(kind, monitor, null);
+			executePublishers(kind, moduleList, monitor, info2);
 			
 			if (monitor.isCanceled())
 				return Status.CANCEL_STATUS;
@@ -656,7 +758,7 @@
 				return Status.CANCEL_STATUS;
 			
 			// publish modules
-			publishModules(kind, moduleList, deltaKindList, tempMulti, monitor);
+			publishModules(kind, moduleList, null, tempMulti, monitor);
 			
 			if (monitor.isCanceled())
 				return Status.CANCEL_STATUS;
@@ -731,32 +833,17 @@
 		IModule m = module[size - 1];
 		monitor.beginTask(NLS.bind(Messages.publishingModule, m.getName()), 1000);
 		
-		IStatus status = Status.OK_STATUS;
 		try {
-			/*IModuleResource[] res = getResources(module);
-			System.out.println("-----" + module[0].getName());
-			printModule(res, "");*/
-			int kind2 = kind;
-			if (getServer().getModulePublishState(module) == IServer.PUBLISH_STATE_UNKNOWN)
-				kind2 = IServer.PUBLISH_FULL;
-			publishModule(kind2, deltaKind, module, monitor);
+			publishModule(kind, deltaKind, module, monitor);
+			return Status.OK_STATUS;
 		} catch (CoreException ce) {
-			status = ce.getStatus();
+			return ce.getStatus();
 		} catch (Exception e) {
-			status = new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, Messages.errorPublishing, e);
+			return new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, Messages.errorPublishing, e);
+		} finally {
+			monitor.done();
+			Trace.trace(Trace.FINEST, "Done publishing: " + module);
 		}
-		
-		/*Trace.trace(Trace.FINEST, "Delta:");
-		IModuleResourceDelta[] delta = getServerPublishInfo().getDelta(parents, module);
-		int size = delta.length;
-		for (int i = 0; i < size; i++) {
-			((ModuleResourceDelta)delta[i]).trace(">  ");
-		}*/
-		
-		monitor.done();
-		
-		Trace.trace(Trace.FINEST, "Done publishing: " + module);
-		return status;
 	}
 
 	/**
@@ -775,10 +862,10 @@
 	 * Adds removed modules.
 	 * 
 	 * @param moduleList a list of modules
-	 * @param kindList a list of publish kinds
+	 * @param kindList deprecated, should be null
 	 */
 	protected void addRemovedModules(List<IModule[]> moduleList, List<Integer> kindList) {
-		server.getServerPublishInfo().addRemovedModules(moduleList, kindList);
+		server.getServerPublishInfo().addRemovedModules(moduleList);
 	}
 
 	/**
@@ -806,7 +893,7 @@
 	 * @param monitor a progress monitor, or <code>null</code> if progress
 	 *    reporting and cancellation are not desired
 	 */
-	protected void publishModules(int kind, List modules, List deltaKind, MultiStatus multi, IProgressMonitor monitor) {
+	protected void publishModules(int kind, List modules, List deltaKind2, MultiStatus multi, IProgressMonitor monitor) {
 		if (modules == null)
 			return;
 		
@@ -825,7 +912,20 @@
 			if (m.getProject() != null && !m.getProject().isAccessible())
 				continue;
 			
-			IStatus status = publishModule(kind, module, ((Integer)deltaKind.get(i)).intValue(), ProgressUtil.getSubMonitorFor(monitor, 3000));
+			int kind2 = kind;
+			if (getServer().getModulePublishState(module) == IServer.PUBLISH_STATE_UNKNOWN)
+				kind2 = IServer.PUBLISH_FULL;
+			
+			int deltaKind = 0;
+			if (hasBeenPublished(module)) {
+				if (getPublishedResourceDelta(module).length == 0)
+					deltaKind = ServerBehaviourDelegate.NO_CHANGE;
+				else
+					deltaKind = ServerBehaviourDelegate.CHANGED;
+			} else
+				deltaKind = ServerBehaviourDelegate.ADDED;
+			
+			IStatus status = publishModule(kind2, module, deltaKind, ProgressUtil.getSubMonitorFor(monitor, 3000));
 			if (status != null && !status.isOK())
 				multi.add(status);
 		}
@@ -857,7 +957,7 @@
 	 *    org.eclipse.swt.widgets.Shell.class
 	 * @throws CoreException
 	 */
-	protected void executePublishers(int kind, IProgressMonitor monitor, IAdaptable info) throws CoreException {
+	protected void executePublishers(int kind, List<IModule[]> modules, IProgressMonitor monitor, IAdaptable info) throws CoreException {
 		Publisher[] publishers = ((Server)getServer()).getEnabledPublishers();
 		int size = publishers.length;
 		Trace.trace(Trace.FINEST, "Executing publishers: " + size);
@@ -865,10 +965,15 @@
 		if (size == 0)
 			return;
 		
+		TaskModel taskModel = new TaskModel();
+		taskModel.putObject(TaskModel.TASK_SERVER, getServer());
+		taskModel.putObject(TaskModel.TASK_MODULES, modules);
+		
 		for (int i = 0; i < size; i++) {
 			Publisher pub = publishers[i];
 			monitor.subTask(NLS.bind(Messages.taskPerforming, pub.getName()));
 			try {
+				pub.setTaskModel(taskModel);
 				pub.execute(kind, ProgressUtil.getSubMonitorFor(monitor, 500), info);
 			} catch (CoreException ce) {
 				Trace.trace(Trace.SEVERE, "Publisher failed", ce);
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/actions/RunOnServerActionDelegate.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/actions/RunOnServerActionDelegate.java
index 69e410a..d1f2de9 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/actions/RunOnServerActionDelegate.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/actions/RunOnServerActionDelegate.java
@@ -181,6 +181,13 @@
 				shell2 = Display.getDefault().getActiveShell();
 		}
 		final Shell shell = shell2;
+		final IAdaptable info = new IAdaptable() {
+			public Object getAdapter(Class adapter) {
+				if (Shell.class.equals(adapter))
+					return shell;
+				return null;
+			}
+		};
 		
 		// get a valid ModuleArtifact that we can use for launching
 		// TODO The ModuleArtifactComposite should be part of the RunOnServerWizard
@@ -414,7 +421,7 @@
 						}
 					}
 					
-					PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, false);
+					PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, info);
 					LaunchClientJob clientJob = new LaunchClientJob(server, modules, launchMode, moduleArtifact, launchableAdapter, client);
 					publishJob.setNextJob(clientJob);
 					
@@ -425,7 +432,7 @@
 					} else
 						publishJob.schedule();
 				} else if (state != IServer.STATE_STOPPING) {
-					PublishServerJob publishJob = new PublishServerJob(server);
+					PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, info);
 					StartServerJob startServerJob = new StartServerJob(server, launchMode);
 					LaunchClientJob clientJob = new LaunchClientJob(server, modules, launchMode, moduleArtifact, launchableAdapter, client);
 					
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/actions/RunOnServerLaunchConfigurationDelegate.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/actions/RunOnServerLaunchConfigurationDelegate.java
index 1895632..893f112 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/actions/RunOnServerLaunchConfigurationDelegate.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/actions/RunOnServerLaunchConfigurationDelegate.java
@@ -11,6 +11,7 @@
 package org.eclipse.wst.server.ui.internal.actions;
 
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
@@ -94,7 +95,14 @@
 				shell2[0] = EclipseUtil.getShell();
 			}
 		});
-		Shell shell = shell2[0];
+		final Shell shell = shell2[0];
+		final IAdaptable info = new IAdaptable() {
+			public Object getAdapter(Class adapter) {
+				if (Shell.class.equals(adapter))
+					return shell;
+				return null;
+			}
+		};
 		
 		if (client == null) {
 			// if there is no client, use a dummy
@@ -209,7 +217,7 @@
 				}
 			}
 			
-			PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, false);
+			PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, info);
 			LaunchClientJob clientJob = new LaunchClientJob(server, modules, launchMode, moduleArtifact, launchableAdapter, client);
 			publishJob.setNextJob(clientJob);
 			
@@ -220,7 +228,7 @@
 			} else
 				publishJob.schedule();
 		} else if (state != IServer.STATE_STOPPING) {
-			PublishServerJob publishJob = new PublishServerJob(server);
+			PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, info);
 			StartServerJob startServerJob = new StartServerJob(server, launchMode);
 			LaunchClientJob clientJob = new LaunchClientJob(server, modules, launchMode, moduleArtifact, launchableAdapter, client);
 			
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/PublishAction.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/PublishAction.java
index d6698e0..ae20677 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/PublishAction.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/PublishAction.java
@@ -10,6 +10,7 @@
  **********************************************************************/
 package org.eclipse.wst.server.ui.internal.view.servers;
 
+import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.wst.server.core.IServer;
@@ -44,14 +45,22 @@
 		publish(server, shell);
 	}
 
-	public static void publish(IServer server, Shell shell) {
+	public static void publish(IServer server, final Shell shell) {
 		if (shell != null && !ServerUIPlugin.promptIfDirty(shell, server))
 			return;
 		
 		if (!ServerUIPlugin.saveEditors())
 			return;
 		
-		PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, false);
+		final IAdaptable info = new IAdaptable() {
+			public Object getAdapter(Class adapter) {
+				if (Shell.class.equals(adapter))
+					return shell;
+				return null;
+			}
+		};
+		
+		PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, info);
 		publishJob.setUser(true);
 		publishJob.schedule();
 	}
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/PublishCleanAction.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/PublishCleanAction.java
index 46d7b28..ccd2884 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/PublishCleanAction.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/PublishCleanAction.java
@@ -1,5 +1,5 @@
 /**********************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
+ * Copyright (c) 2007, 2008 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
@@ -10,6 +10,7 @@
  **********************************************************************/
 package org.eclipse.wst.server.ui.internal.view.servers;
 
+import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -35,7 +36,7 @@
 	/**
 	 * Return true if this server can currently be acted on.
 	 * @return boolean
-	 * @param server org.eclipse.wst.server.core.IServer
+	 * @param server a server
 	 */
 	public boolean accept(IServer server) {
 		return server.canPublish().isOK();
@@ -43,7 +44,7 @@
 
 	/**
 	 * Perform action on this server.
-	 * @param server org.eclipse.wst.server.core.IServer
+	 * @param server a server
 	 */
 	public void perform(IServer server) {
 		if (!ServerUIPlugin.promptIfDirty(shell, server))
@@ -52,8 +53,16 @@
 		if (!ServerUIPlugin.saveEditors())
 			return;
 		
+		final IAdaptable info = new IAdaptable() {
+			public Object getAdapter(Class adapter) {
+				if (Shell.class.equals(adapter))
+					return shell;
+				return null;
+			}
+		};
+		
 		if (MessageDialog.openConfirm(shell, Messages.defaultDialogTitle, Messages.dialogPublishClean)) {
-			PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_CLEAN, false);
+			PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_CLEAN, info);
 			publishJob.setUser(true);
 			publishJob.schedule();
 		}
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 fcbe0c9..94e8815 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
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.server.ui.internal.view.servers;
 
+import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.wst.server.core.IModule;
@@ -54,7 +55,14 @@
 				server = wc.save(true, null);
 				
 				if (server.getServerState() != IServer.STATE_STOPPED && ((Server)server).getAutoPublishSetting() != Server.AUTO_PUBLISH_DISABLE) {
-					PublishServerJob publishJob = new PublishServerJob(server);
+					final IAdaptable info = new IAdaptable() {
+						public Object getAdapter(Class adapter) {
+							if (Shell.class.equals(adapter))
+								return shell;
+							return null;
+						}
+					};
+					PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, info);
 					publishJob.schedule();
 				}
 			} catch (Exception e) {
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/StartAction.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/StartAction.java
index d6fc6eb..05f50b6 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/StartAction.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/StartAction.java
@@ -12,6 +12,7 @@
 
 import java.util.Iterator;
 
+import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.debug.core.ILaunchManager;
 import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -147,7 +148,7 @@
 		start(server, launchMode, shell);
 	}
 
-	public static void start(IServer server, String launchMode, Shell shell) {
+	public static void start(IServer server, String launchMode, final Shell shell) {
 		if (server.getServerState() != IServer.STATE_STARTED) {
 			if (!ServerUIPlugin.saveEditors())
 				return;
@@ -158,8 +159,16 @@
 				return;
 			}
 			
+			final IAdaptable info = new IAdaptable() {
+				public Object getAdapter(Class adapter) {
+					if (Shell.class.equals(adapter))
+						return shell;
+					return null;
+				}
+			};
+			
 			try {
-				PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, false); 
+				PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, info); 
 				StartServerJob startJob = new StartServerJob(server, launchMode);
 				
 				if (((ServerType)server.getServerType()).startBeforePublish()) {
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 5785294..99bdb05 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
+ * Copyright (c) 2003, 2008 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
@@ -13,6 +13,7 @@
 import java.util.List;
 
 import org.eclipse.core.runtime.CoreException;
+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.PublishServerJob;
@@ -35,7 +36,15 @@
 					if (svr instanceof IServer) {
 						IServer server = (IServer) svr;
 						if (server.getServerState() != IServer.STATE_STOPPED && ((Server)server).getAutoPublishSetting() != Server.AUTO_PUBLISH_DISABLE) {
-							PublishServerJob publishJob = new PublishServerJob(server);
+							IAdaptable info = null;
+							/*IAdaptable info = new IAdaptable() {
+								public Object getAdapter(Class adapter) {
+									if (Shell.class.equals(adapter))
+										return shell;
+									return null;
+								}
+							};*/
+							PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, info);
 							publishJob.schedule();
 						}
 					}