Sync 3.4.2 GA code to R3_4_maintenance stream
diff --git a/features/org.eclipse.jst.server_adapters.sdk.feature/feature.xml b/features/org.eclipse.jst.server_adapters.sdk.feature/feature.xml
index def758a..5ff8c85 100644
--- a/features/org.eclipse.jst.server_adapters.sdk.feature/feature.xml
+++ b/features/org.eclipse.jst.server_adapters.sdk.feature/feature.xml
@@ -1,30 +1,31 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<feature

-      id="org.eclipse.jst.server_adapters.sdk.feature"

-      label="%featureName"

-      version="3.3.101.qualifier"

-      provider-name="%providerName"

-      license-feature="org.eclipse.license"

-      license-feature-version="1.0.0.qualifier">

-

-   <description>

-      %description

-   </description>

-

-   <copyright>

-      %copyright

-   </copyright>

-

-   <license url="%licenseURL">

-      %license

-   </license>

-

-   <includes

-         id="org.eclipse.jst.server_adapters.feature"

-         version="0.0.0"/>

-

-   <includes

-         id="org.eclipse.jst.server_adapters.feature.source"

-         version="0.0.0"/>

-

-</feature>

+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.jst.server_adapters.sdk.feature"
+      label="%featureName"
+      version="3.3.101.qualifier"
+      provider-name="%providerName"
+      license-feature="org.eclipse.license"
+      license-feature-version="1.0.0.qualifier">
+
+   <description>
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+
+   <includes
+         id="org.eclipse.jst.server_adapters.feature"
+         version="0.0.0"/>
+
+   <includes
+         id="org.eclipse.jst.server_adapters.feature.source"
+         version="0.0.0"/>
+
+</feature>
diff --git a/features/org.eclipse.wst.server_adapters.feature/feature.xml b/features/org.eclipse.wst.server_adapters.feature/feature.xml
index e601349..398528b 100644
--- a/features/org.eclipse.wst.server_adapters.feature/feature.xml
+++ b/features/org.eclipse.wst.server_adapters.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.wst.server_adapters.feature"
       label="%featureName"
-      version="3.2.202.qualifier"
+      version="3.2.203.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="1.0.0.qualifier">
@@ -59,6 +59,6 @@
          download-size="0"
          install-size="0"
          version="8.1.3.qualifier"
-         unpack="false"/>	
+         unpack="false"/>	         
 
 </feature>
diff --git a/features/org.eclipse.wst.server_adapters.sdk.feature/feature.xml b/features/org.eclipse.wst.server_adapters.sdk.feature/feature.xml
index 8f99603..f370d17 100644
--- a/features/org.eclipse.wst.server_adapters.sdk.feature/feature.xml
+++ b/features/org.eclipse.wst.server_adapters.sdk.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.wst.server_adapters.sdk.feature"
       label="%featureName"
-      version="3.2.102.qualifier"
+      version="3.2.104.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="1.0.0.qualifier">
diff --git a/features/org.eclipse.wst.server_core.feature/feature.xml b/features/org.eclipse.wst.server_core.feature/feature.xml
index 42ac33c..edbf006 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.3.100.qualifier"
+      version="3.3.200.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="1.0.0.qualifier">
diff --git a/features/org.eclipse.wst.server_sdk.feature/feature.xml b/features/org.eclipse.wst.server_sdk.feature/feature.xml
index 26be5c1..1c4ae6a 100644
--- a/features/org.eclipse.wst.server_sdk.feature/feature.xml
+++ b/features/org.eclipse.wst.server_sdk.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.wst.server_sdk.feature"
       label="%featureName"
-      version="3.3.101.qualifier"
+      version="3.3.201.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="1.0.0.qualifier">
diff --git a/features/org.eclipse.wst.server_ui.feature/feature.xml b/features/org.eclipse.wst.server_ui.feature/feature.xml
index f426f9c..656afb1 100644
--- a/features/org.eclipse.wst.server_ui.feature/feature.xml
+++ b/features/org.eclipse.wst.server_ui.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature

       id="org.eclipse.wst.server_ui.feature"

       label="%featureName"

-      version="3.3.101.qualifier"

+      version="3.3.201.qualifier"

       provider-name="%providerName"

       license-feature="org.eclipse.license"

       license-feature-version="1.0.0.qualifier">

diff --git a/plugins/org.eclipse.jst.server.generic.jboss/build.properties b/plugins/org.eclipse.jst.server.generic.jboss/build.properties
index 6271748..a57ae49 100644
--- a/plugins/org.eclipse.jst.server.generic.jboss/build.properties
+++ b/plugins/org.eclipse.jst.server.generic.jboss/build.properties
@@ -15,5 +15,6 @@
                icons/,\
                buildfiles/,\
                genericjboss.jar              
+src.includes = build.properties
 source.genericjboss.jar = servers/
 jars.compile.order = genericjboss.jar
diff --git a/plugins/org.eclipse.jst.server.generic.jonas/build.properties b/plugins/org.eclipse.jst.server.generic.jonas/build.properties
index 179f110..39aa983 100644
--- a/plugins/org.eclipse.jst.server.generic.jonas/build.properties
+++ b/plugins/org.eclipse.jst.server.generic.jonas/build.properties
@@ -15,5 +15,6 @@
                servers/,\
                buildfiles/,\
                genericjonas.jar
+src.includes = build.properties
 jars.compile.order = genericjonas.jar
 source.genericjonas.jar = servers/
diff --git a/plugins/org.eclipse.jst.server.generic.oc4j/build.properties b/plugins/org.eclipse.jst.server.generic.oc4j/build.properties
index ca37d55..1a01b25 100644
--- a/plugins/org.eclipse.jst.server.generic.oc4j/build.properties
+++ b/plugins/org.eclipse.jst.server.generic.oc4j/build.properties
@@ -15,5 +15,6 @@
                plugin.properties,\
                servers/,\
                genericoc4j.jar
+src.includes = build.properties
 source.genericoc4j.jar = servers/
 jars.compile.order = genericoc4j.jar
diff --git a/plugins/org.eclipse.wst.server.core/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.server.core/META-INF/MANIFEST.MF
index c3c021a..2d43153 100644
--- a/plugins/org.eclipse.wst.server.core/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.server.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.server.core; singleton:=true
-Bundle-Version: 1.4.0.qualifier
+Bundle-Version: 1.4.100.qualifier
 Bundle-Activator: org.eclipse.wst.server.core.internal.ServerPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
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 ee87fa3..13fdda4 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
@@ -375,11 +375,18 @@
 		public RestartJob(String launchMode) {
 			super(NLS.bind(Messages.jobRestarting, Server.this.getName()));
 			this.launchMode = launchMode;
-			setRule(Server.this);
 		}
 
 		protected IStatus run(IProgressMonitor monitor) {
-			return restartImpl(launchMode, monitor);
+			try{
+				// Do begin rule in here instead of setRule on constructor to prevent deadlock
+				// on the default restart operation during the join() in the StartJob.
+				Job.getJobManager().beginRule(Server.this, monitor);
+				return restartImpl(launchMode, monitor);
+			}
+			finally{
+				Job.getJobManager().endRule(Server.this);
+			}
 		}
 	}
 
@@ -1891,7 +1898,7 @@
 		job.schedule();
 	}
 
-	protected IStatus publishBeforeStart(IProgressMonitor monitor, boolean synchronous){
+	protected IStatus publishBeforeStart(IProgressMonitor monitor, final StartJob startJob, final boolean synchronous){
 
 		// check if we need to publish
 		byte pub = StartJob.PUBLISH_NONE;
@@ -1910,22 +1917,53 @@
 			pubJob.addJobChangeListener(new JobChangeAdapter(){
 				public void done(IJobChangeEvent event) {
 					IStatus status = event.getResult();
-					if (status != null && status.getSeverity() == IStatus.ERROR)
-						pubStatus[0] = status; 
+					if (status != null && status.getSeverity() == IStatus.ERROR) {
+						pubStatus[0] = status;
+						if (Trace.INFO) {
+							Trace.trace(Trace.STRING_INFO,
+									"Skipping server start job schedule since the server publish failed on a publish before start server.");
+						}
+					} else {
+						if (Trace.INFO) {
+							Trace.trace(Trace.STRING_INFO,
+									"Scheduling server start job after successful publish.");
+						}
+						// Schedule the server start job since the publish operation is completed successfully.
+						startJob.schedule();
+						
+						try {
+							if (synchronous)
+								startJob.join();
+						} catch (InterruptedException e) {
+							if (Trace.WARNING) {
+								Trace.trace(Trace.STRING_WARNING, "Error waiting for job", e);
+							}
+						}
+					}
 				}
 				
 			});
-			
 			pubJob.schedule();
 			
-			try{
+			try {
 				if (synchronous)
 					pubJob.join();
-					
-			}
-			catch (InterruptedException ie){
+			} catch (InterruptedException ie) {
 				return Status.CANCEL_STATUS;
 			}
+		} else {
+			// Schedule the server start since a publish is not needed so 
+			// Schedule the server start job since the publish operation is completed successfully.
+			startJob.schedule();
+			
+			try {
+				if (synchronous)
+					startJob.join();
+			} catch (InterruptedException e) {
+				if (Trace.WARNING) {
+					Trace.trace(Trace.STRING_WARNING, "Error waiting for job", e);
+				}
+			}
 		}
 		return pubStatus[0];
 	}
@@ -1989,20 +2027,10 @@
 		// make sure that the delegate is loaded and the server state is correct
 		loadAdapter(ServerBehaviourDelegate.class, null);
 		
-		boolean synchronous = ((ServerType)getServerType()).synchronousStart();
-		IStatus status = publishBeforeStart(monitor,synchronous);
-		
-		if (status != null && status.getSeverity() == IStatus.ERROR){
-			if (Trace.FINEST) {
-				Trace.trace(Trace.STRING_FINEST, "Failed publish job during start routine");
-			}
-			return;
-		}
-		
 		StartJob startJob = new StartJob(mode2);
 		// 287442 - only do publish after start if the server start is successful.
 		final IProgressMonitor monitor2 = monitor; 
-		final boolean synchronous2 = synchronous;
+		final boolean synchronous = ((ServerType)getServerType()).synchronousStart();
 		startJob.addJobChangeListener(new JobChangeAdapter() {
 			public void done(IJobChangeEvent event) {
 				IStatus resultStatus = event.getResult();
@@ -2012,17 +2040,29 @@
 								"Skipping auto publish after server start since the server start failed.");
 					}
 				} else {
-					publishAfterStart(monitor2,synchronous2,null);
+					publishAfterStart(monitor2,synchronous,null);
 				}
 			}
 		});
-		startJob.schedule();
-		try {
-			if(synchronous)
-				startJob.join();
-		} catch (InterruptedException e) {
-			if (Trace.WARNING) {
-				Trace.trace(Trace.STRING_WARNING, "Error waiting for job", e);
+		// Forces synchronous start since this method is supposed to wait until the publish operation is completed.
+		IStatus status = publishBeforeStart(monitor, startJob, true);
+		
+		if (status != null && status.getSeverity() == IStatus.ERROR){
+			if (Trace.FINEST) {
+				Trace.trace(Trace.STRING_FINEST, "Failed publish job during start routine");
+			}
+			return;
+		}
+		
+		if (((ServerType)getServerType()).startBeforePublish()) {
+			startJob.schedule();
+			try {
+				if(synchronous)
+					startJob.join();
+			} catch (InterruptedException e) {
+				if (Trace.WARNING) {
+					Trace.trace(Trace.STRING_WARNING, "Error waiting for job", e);
+				}
 			}
 		}
 	}
@@ -2040,18 +2080,6 @@
 		// make sure that the delegate is loaded and the server state is correct
 		loadAdapter(ServerBehaviourDelegate.class, null);
 		
-		boolean synchronous = ((ServerType)getServerType()).synchronousStart();
-		IStatus status = publishBeforeStart(null,synchronous);
-		
-		if (status != null && status.getSeverity() == IStatus.ERROR){
-			if (Trace.FINEST) {
-				Trace.trace(Trace.STRING_FINEST, "Failed publish job during start routine");
-			}
-			if (opListener != null)
-				opListener.done(Status.OK_STATUS);
-			return;
-		}
-
 		// check the publish flag (again) to determine when to call opListener.done 
 		byte pub = StartJob.PUBLISH_NONE;
 		if (ServerCore.isAutoPublishing() && shouldPublish()) {
@@ -2073,8 +2101,22 @@
 				}
 			});
 		}
+		
+		final boolean synchronous = ((ServerType)getServerType()).synchronousStart();
+		// For publish before start servers, the start job will only be kicked off if the publishing
+		// operation is completed successfully.
+		IStatus status = publishBeforeStart(null, startJob, synchronous);
+		
+		if (status != null && status.getSeverity() == IStatus.ERROR){
+			if (Trace.FINEST) {
+				Trace.trace(Trace.STRING_FINEST, "Failed publish job during start routine");
+			}
+			if (opListener != null)
+				opListener.done(Status.OK_STATUS);
+			return;
+		}
+
 		// 287442 - only do publish after start if the server start is successful.
-		final boolean synchronous2 = synchronous;
 		if (pub == StartJob.PUBLISH_AFTER) {
 			startJob.addJobChangeListener(new JobChangeAdapter() {
 				public void done(IJobChangeEvent event) {
@@ -2089,19 +2131,19 @@
 							opListener.done(Status.OK_STATUS);
 					}
 					else {
-						publishAfterStart(null,synchronous2,opListener);
+						publishAfterStart(null,synchronous,opListener);
 					}
 				}
 			});
-		}
-		startJob.schedule();
-		
-		try {
-			if(synchronous)
-				startJob.join();
-		} catch (InterruptedException e) {
-			if (Trace.WARNING) {
-				Trace.trace(Trace.STRING_WARNING, "Error waiting for job", e);
+			startJob.schedule();
+			
+			try {
+				if(synchronous)
+					startJob.join();
+			} catch (InterruptedException e) {
+				if (Trace.WARNING) {
+					Trace.trace(Trace.STRING_WARNING, "Error waiting for job", e);
+				}
 			}
 		}
 	}
@@ -2113,15 +2155,6 @@
 		// make sure that the delegate is loaded and the server state is correct
 		loadAdapter(ServerBehaviourDelegate.class, monitor);
 		
-		IStatus status = publishBeforeStart(monitor,true);
-		
-		if (status != null && status.getSeverity() == IStatus.ERROR){
-			if (Trace.FINEST) {
-				Trace.trace(Trace.STRING_FINEST, "Failed publish job during start routine");
-			}
-			return;
-		}
-		
 		StartJob startJob = new StartJob(mode2);
 		// 287442 - only do publish after start if the server start is successful.
 		final IProgressMonitor monitor2 = monitor; 
@@ -2138,13 +2171,25 @@
 				}
 			}
 		});
-		startJob.schedule();
 		
-		try {
-			startJob.join();
-		} catch (InterruptedException e) {
-			if (Trace.WARNING) {
-				Trace.trace(Trace.STRING_WARNING, "Error waiting for job", e);
+		IStatus status = publishBeforeStart(monitor, startJob, true);
+		
+		if (status != null && status.getSeverity() == IStatus.ERROR){
+			if (Trace.FINEST) {
+				Trace.trace(Trace.STRING_FINEST, "Failed publish job during start routine");
+			}
+			return;
+		}
+		
+		if (((ServerType)getServerType()).startBeforePublish()) {
+			startJob.schedule();
+			
+			try {
+				startJob.join();
+			} catch (InterruptedException e) {
+				if (Trace.WARNING) {
+					Trace.trace(Trace.STRING_WARNING, "Error waiting for job", e);
+				}
 			}
 		}
 	}
@@ -3147,6 +3192,7 @@
 			Trace.trace(Trace.STRING_FINEST, "Restarting server: " + getName());
 		}
 		
+		ISchedulingRule curRule = null;
 		try {
 			try {
 				// synchronous restart
@@ -3163,14 +3209,21 @@
 			}
 			// if restart is not implemented by the server adopter
 			// lets provide a default implementation
+			// Ending the current rule setup by the RestartJob to prevent deadlock since the StopJob triggered
+			// by the stop(false) also setup the Server as the scheduling rule.
+			curRule = Job.getJobManager().currentRule();
+			Job.getJobManager().endRule(curRule);
 			stop(false);
 			start(launchMode, monitor);
-
 		} catch (Exception e) {
 			if (Trace.SEVERE) {
 				Trace.trace(Trace.STRING_SEVERE, "Error restarting server", e);
 			}
 			return new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, NLS.bind(Messages.errorStartFailed, getName()), e);
+		} finally {
+			if (curRule != null) {
+				Job.getJobManager().beginRule(curRule, monitor);
+			}
 		}
 		return Status.OK_STATUS;
 	}
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 40dd6bc..77d8a4d 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
@@ -448,7 +448,7 @@
 		wch.setDirty(false);
 		
 		if (getServerState() == IServer.STATE_STARTED)
-			autoPublish();
+			server.autoPublish();
 		
 		return server;
 	}
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 e1b258e..352faf3 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2011 IBM Corporation and others.
+ * Copyright (c) 2005, 2012 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
@@ -920,11 +920,32 @@
 		if (monitor.isCanceled())
 			return Status.CANCEL_STATUS;
 		
+		/**
+		 * Trace time for when publishing begins.
+		 */
+		long publishStartTime = 0;
+		/**
+		 * Trace time of the previous publishing action.
+		 */
+		long previousPublishActionTime = publishStartTime;
+		if(Trace.PERFORMANCE) {
+			publishStartTime = System.currentTimeMillis();
+			previousPublishActionTime = publishStartTime;
+		}
 		try {
+			if(Trace.PERFORMANCE) {
+				Trace.trace(Trace.STRING_PERFORMANCE, "ServerBehaviourDelegate.publish(): start");
+			}
 			if (Trace.FINEST) {
 				Trace.trace(Trace.STRING_FINEST, "Starting publish");
 			}
 			publishStart(ProgressUtil.getSubMonitorFor(monitor, 1000));
+			long currentTime = 0;
+			if(Trace.PERFORMANCE) {
+				currentTime = System.currentTimeMillis();
+				Trace.trace(Trace.STRING_PERFORMANCE, "ServerBehaviourDelegate.publish(): publish start <" + (currentTime - previousPublishActionTime) + "> " + getServer().getServerType().getId());
+				previousPublishActionTime = currentTime;
+			}
 			
 			if (monitor.isCanceled())
 				return Status.CANCEL_STATUS;
@@ -937,6 +958,12 @@
 			
 			// execute publishers
 			taskStatus = executePublishers(kind, moduleList, deltaKindList, monitor, info2);
+			if(Trace.PERFORMANCE) {
+				currentTime = System.currentTimeMillis();
+				Trace.trace(Trace.STRING_PERFORMANCE, "ServerBehaviourDelegate.publish(): run publishers <" + (currentTime - previousPublishActionTime) + "> " + getServer().getServerType().getId());
+				previousPublishActionTime = currentTime;
+			}
+			
 			monitor.setTaskName(mainTaskMsg);
 			if (taskStatus != null && !taskStatus.isOK())
 				tempMulti.addAll(taskStatus);
@@ -947,12 +974,22 @@
 			// publish the server
 			publishServer(kind, ProgressUtil.getSubMonitorFor(monitor, 1000));
 			monitor.setTaskName(mainTaskMsg);
+			if(Trace.PERFORMANCE) {
+				currentTime = System.currentTimeMillis();
+				Trace.trace(Trace.STRING_PERFORMANCE, "ServerBehaviourDelegate.publish(): publisher server <" + (currentTime - previousPublishActionTime) + "> " + getServer().getServerType().getId());
+				previousPublishActionTime = currentTime;
+			}
 			
 			if (monitor.isCanceled())
 				return Status.CANCEL_STATUS;
 			
 			// publish modules
 			publishModules(kind, moduleList, deltaKindList, tempMulti, monitor);
+			if(Trace.PERFORMANCE) {
+				currentTime = System.currentTimeMillis();
+				Trace.trace(Trace.STRING_PERFORMANCE, "ServerBehaviourDelegate.publish(): publish modules <" + (currentTime - previousPublishActionTime) + "> " + getServer().getServerType().getId());
+				previousPublishActionTime = currentTime;
+			}
 			
 			if (monitor.isCanceled())
 				return Status.CANCEL_STATUS;
@@ -972,6 +1009,11 @@
 			// end the publishing
 			try {
 				publishFinish(ProgressUtil.getSubMonitorFor(monitor, 500));
+				if(Trace.PERFORMANCE) {
+					long currentTime = System.currentTimeMillis();
+					Trace.trace(Trace.STRING_PERFORMANCE, "ServerBehaviourDelegate.publish(): publish finish <" + (currentTime - previousPublishActionTime) + "> " + getServer().getServerType().getId());
+					previousPublishActionTime = currentTime;
+				}
 			} catch (CoreException ce) {
 				if (Trace.INFO) {
 					Trace.trace(Trace.STRING_INFO, "CoreException publishing to " + toString(), ce);
@@ -983,6 +1025,9 @@
 				}
 				tempMulti.add(new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, Messages.errorPublishing, e));
 			}
+			if(Trace.PERFORMANCE) {
+				Trace.trace(Trace.STRING_PERFORMANCE, "ServerBehaviourDelegate.publish(): <" + (previousPublishActionTime - publishStartTime) + "> " + getServer().getServerType().getId());
+			}
 		}
 		
 		if (Trace.FINEST) {
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/PublishHelper.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/PublishHelper.java
index 77c4601..f0b3922 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/PublishHelper.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/PublishHelper.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2011 IBM Corporation and others.
+ * Copyright (c) 2007, 2013 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
@@ -536,6 +536,10 @@
 		for (int i = 0; i < size; i++) {
 			IStatus[] stat = copy(resources[i], path, monitor);
 			addArrayToList(status, stat);
+			
+			if (monitor.isCanceled()) {
+				break;
+			}
 		}
 		
 		IStatus[] stat = new IStatus[status.size()];
@@ -544,6 +548,9 @@
 	}
 
 	private IStatus[] copy(IModuleResource resource, IPath path, IProgressMonitor monitor) {
+		if (monitor.isCanceled()) {
+			return new IStatus[0];
+		}
 		String name = resource.getName();
 		if (Trace.PUBLISHING) {
 			Trace.trace(Trace.STRING_PUBLISHING, "Copying: " + name + " to " + path.toString());
@@ -557,12 +564,26 @@
 			IModuleFile mf = (IModuleFile) resource;
 			path = path.append(mf.getModuleRelativePath()).append(name);
 			File f = path.toFile().getParentFile();
-			if (!f.exists())
-				f.mkdirs();
-			try {
-				copyFile(mf, path);
-			} catch (CoreException ce) {
-				status.add(ce.getStatus());
+			if (f.exists()) {
+				try {
+					copyFile(mf, path);
+				} catch (CoreException ce) {
+					status.add(ce.getStatus());
+				}
+			} else {
+				// Create the parent directory.
+				if (f.mkdirs()) {
+					try {
+						copyFile(mf, path);
+					} catch (CoreException ce) {
+						status.add(ce.getStatus());
+					}
+				} else {
+					if (Trace.PUBLISHING) {
+						Trace.trace(Trace.STRING_PUBLISHING, "Failed to create the directory: " + f.getAbsolutePath() );
+					}
+					status.add(new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, NLS.bind(Messages.errorMkdir, f.getAbsolutePath()), null));
+				}
 			}
 		}
 		IStatus[] stat = new IStatus[status.size()];
diff --git a/plugins/org.eclipse.wst.server.preview.adapter/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.server.preview.adapter/META-INF/MANIFEST.MF
index 867aacd..92897f7 100644
--- a/plugins/org.eclipse.wst.server.preview.adapter/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.server.preview.adapter/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.server.preview.adapter;singleton:=true
-Bundle-Version: 1.1.100.qualifier
+Bundle-Version: 1.1.101.qualifier
 Bundle-Activator: org.eclipse.wst.server.preview.adapter.internal.core.PreviewPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.wst.server.preview.adapter/src/org/eclipse/wst/server/preview/adapter/internal/core/PreviewLaunchConfigurationDelegate.java b/plugins/org.eclipse.wst.server.preview.adapter/src/org/eclipse/wst/server/preview/adapter/internal/core/PreviewLaunchConfigurationDelegate.java
index 8359599..5dcb985 100644
--- a/plugins/org.eclipse.wst.server.preview.adapter/src/org/eclipse/wst/server/preview/adapter/internal/core/PreviewLaunchConfigurationDelegate.java
+++ b/plugins/org.eclipse.wst.server.preview.adapter/src/org/eclipse/wst/server/preview/adapter/internal/core/PreviewLaunchConfigurationDelegate.java
@@ -168,12 +168,12 @@
 	}
 
 	protected static File getJavaExecutable() {
-		// do not detect on the Mac OS
+		// set the 'java.home' system property on the Mac OS
 		if (Platform.getOS().equals(Constants.OS_MACOSX))
-			return null;
+			System.setProperty("java.home", "/Library/Java/Home");
 		
 		// retrieve the 'java.home' system property. If that directory doesn't exist, return null
-		File javaHome; 
+		File javaHome;
 		try {
 			javaHome = new File(System.getProperty("java.home")).getCanonicalFile();
 		} catch (IOException e) {
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 c3c3048..7ef10dd 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.4.2.qualifier
+Bundle-Version: 1.4.100.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/Timer.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Timer.java
index f6b1024..d6f3993 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Timer.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Timer.java
@@ -99,6 +99,7 @@
 				}
 				if (!isCancelled) {
 					if (listener != null) {
+						isRunning = false;
 						listener.actionPerformed(new ActionEvent(Timer.this, 0, "", System.currentTimeMillis(), 0));
 					}
 				} else {
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 53b0bc1..94a1145 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
@@ -864,7 +864,7 @@
 		for (int i = 0; i < size; i++) {
 			IStatus status = errorMap.get(mods[i]);
 			
-			if (status == null && !list.contains(mods[i]))
+			if ((status == null || status.getSeverity() != IStatus.ERROR) && !list.contains(mods[i]))
 				list.add(mods[i]);
 		}
 		
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewManualServerComposite.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewManualServerComposite.java
index 9e81277..e0f619c 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewManualServerComposite.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewManualServerComposite.java
@@ -739,6 +739,10 @@
 				serverNameToolBar.getControl().setVisible(serverNameModified);
 			}
 		}
+		
+		if (hostname != null && server != null) {
+			hostname.setText(server.getHost());
+		}
 		listener.serverSelected(server);
 		// Fire the property change event. 
 		List<ServerCreationWizardPageExtension> pageExtensionLst = ServerUIPlugin.getServerCreationWizardPageExtensions();
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewServerComposite.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewServerComposite.java
index 62a3190..03255fe 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewServerComposite.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewServerComposite.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2011 IBM Corporation and others.
+ * Copyright (c) 2003, 2012 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
@@ -346,13 +346,13 @@
 				if (server != null && module != null) {
 					IStatus status = isSupportedModule(server, module);
 					if (status != null) {
-						if (status.getSeverity() == IStatus.ERROR)
+						if (status.getSeverity() == IStatus.ERROR) {
 							wizard.setMessage(status.getMessage(), IMessageProvider.ERROR);
-						else if (status.getSeverity() == IStatus.WARNING)
+                            server = null;
+						} else if (status.getSeverity() == IStatus.WARNING)
 							wizard.setMessage(status.getMessage(), IMessageProvider.WARNING);
 						else if (status.getSeverity() == IStatus.INFO)
 							wizard.setMessage(status.getMessage(), IMessageProvider.INFORMATION);
-						server = null;
 					}
 				}