[377566] The server timeout timer begins at the incorrect time
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 820f97b..ee87fa3 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
@@ -3267,8 +3267,6 @@
 				}
 			}
 		};
-		thread.setDaemon(true);
-		thread.start();
 		
 		if (Trace.FINEST) {
 			Trace.trace(Trace.STRING_FINEST, "synchronousRestart 2");
@@ -3277,6 +3275,9 @@
 		// call the delegate restart
 		try {
 			getBehaviourDelegate(null).restart(launchMode);
+			
+			thread.setDaemon(true);
+			thread.start();
 		} catch (CoreException e) {
 			removeServerListener(listener);
 			timer.alreadyDone = true;
@@ -3409,8 +3410,6 @@
 				}
 			}
 		};
-		thread.setDaemon(true);
-		thread.start();
 	
 		if (Trace.FINEST) {
 			Trace.trace(Trace.STRING_FINEST, "synchronousStart 2");
@@ -3419,9 +3418,11 @@
 		// start the server
 		try {
 			startImpl2(launchMode, monitor);
+			
+			thread.setDaemon(true);
+			thread.start();			
 		} catch (CoreException e) {
 			removeServerListener(listener);
-			timer.alreadyDone = true;
 			return e.getStatus();
 		}
 		if (monitor.isCanceled()) {
@@ -3532,11 +3533,23 @@
 		final Timer timer = new Timer();
 		
 		final int serverTimeout = getStopTimeout() * 1000;
+		Thread thread = null;
 		if (serverTimeout > 0) {
-			Thread thread = new Thread("Server Stop Timeout") {
+			thread = new Thread("Server Stop Timeout") {
 				public void run() {
 					try {
-						Thread.sleep(serverTimeout);
+						int totalTimeout = serverTimeout;
+						if (totalTimeout < 0)
+							totalTimeout = 1;
+						
+						int retryPeriod = 1000;						
+						
+						while (totalTimeout > 0 && !timer.alreadyDone){
+							Thread.sleep(retryPeriod);
+							if (serverTimeout > 0)
+								totalTimeout -= retryPeriod;
+						}
+
 						if (!timer.alreadyDone) {
 							timer.timeout = true;
 							// notify waiter
@@ -3554,13 +3567,16 @@
 					}
 				}
 			};
-			thread.setDaemon(true);
-			thread.start();
 		}
 		
 		// stop the server
 		stopImpl2(force);
 		
+		if (thread != null){
+			thread.setDaemon(true);
+			thread.start();
+		}
+		
 		// wait for it! wait for it!
 		synchronized (mutex) {
 			try {
@@ -3572,6 +3588,7 @@
 					Trace.trace(Trace.STRING_SEVERE, "Error waiting for server stop", e);
 				}
 			}
+			timer.alreadyDone = true;
 		}
 		removeServerListener(listener);