[175782] RoS should use launch config
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/EJBBean.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/EJBBean.java
index f9b1406..41cb052 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/EJBBean.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/EJBBean.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
+ * Copyright (c) 2003, 2007 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,8 +10,10 @@
  *******************************************************************************/
 package org.eclipse.jst.server.core;
 
+import org.eclipse.jst.server.core.internal.Messages;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.server.core.IModule;
-import org.eclipse.wst.server.core.IModuleArtifact;
+import org.eclipse.wst.server.core.model.ModuleArtifactDelegate;
 /**
  * An EJB bean.
  * <p>
@@ -20,10 +22,9 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
-public class EJBBean implements IModuleArtifact {
-	private IModule module;
+public class EJBBean extends ModuleArtifactDelegate {
 	private String jndiName;
 	private boolean local;
 	private boolean remote;
@@ -39,17 +40,17 @@
 	 *    <code>false</code> otherwise
 	 */
 	public EJBBean(IModule module, String jndiName, boolean remote, boolean local) {
-		this.module = module;
+		super(module);
 		this.jndiName = jndiName;
 		this.remote = remote;
 		this.local = local;
 	}
 
 	/**
-	 * @see IModuleArtifact#getModule()
+	 * Create a new empty EJBBean.
 	 */
-	public IModule getModule() {
-		return module;
+	public EJBBean() {
+		super();
 	}
 
 	/**
@@ -80,4 +81,46 @@
 	public boolean hasLocalInterface() {
 		return local;
 	}
+
+	/*
+	 * @see ModuleArtifactDelegate#getName()
+	 */
+	public String getName() {
+		return NLS.bind(Messages.artifactEJB, jndiName.toString());
+	}
+
+	/*
+	 * @see ModuleArtifactDelegate#deserialize(String)
+	 */
+	public void deserialize(String s) {
+		int ind = s.indexOf("//");
+		super.deserialize(s.substring(0, ind));
+		if ('T' == s.charAt(ind+2))
+			local = true;
+		else
+			local = false;
+		if ('T' == s.charAt(ind+3))
+			remote = true;
+		else
+			remote = false;
+		jndiName = s.substring(ind+4);
+	}
+
+	/*
+	 * @see ModuleArtifactDelegate#serialize()
+	 */
+	public String serialize() {
+		StringBuffer sb = new StringBuffer(super.serialize());
+		sb.append("//");
+		if (local)
+			sb.append("T");
+		else
+			sb.append("F");
+		if (remote)
+			sb.append("T");
+		else
+			sb.append("F");
+		sb.append(jndiName);
+		return sb.toString();
+	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IApplicationClientModule.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IApplicationClientModule.java
index 1f41d34..e98407c 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IApplicationClientModule.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IApplicationClientModule.java
@@ -17,7 +17,7 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
 public interface IApplicationClientModule extends IJ2EEModule {
 	// intentionally empty
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IConnectorModule.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IConnectorModule.java
index a459c74..1fd7102 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IConnectorModule.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IConnectorModule.java
@@ -19,7 +19,7 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
 public interface IConnectorModule extends IJ2EEModule {
 	/**
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IEJBModule.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IEJBModule.java
index 9596a04..e7b16aa 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IEJBModule.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IEJBModule.java
@@ -17,7 +17,7 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
 public interface IEJBModule extends IJ2EEModule {
 	// intentionally empty
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IEnterpriseApplication.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IEnterpriseApplication.java
index 6b9797b..0418d6d 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IEnterpriseApplication.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IEnterpriseApplication.java
@@ -20,7 +20,7 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
 public interface IEnterpriseApplication {
 	/**
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IJ2EEModule.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IJ2EEModule.java
index c3fc24e..59e9de8 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IJ2EEModule.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IJ2EEModule.java
@@ -20,7 +20,7 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
 public interface IJ2EEModule {
 	/**
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IJavaRuntime.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IJavaRuntime.java
index c39b43d..d8dbd86 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IJavaRuntime.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IJavaRuntime.java
@@ -19,7 +19,7 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
  * (repeatedly) as the API evolves.
  * </p>
- * @since 2.0
+ * @since 3.0
  */
 public interface IJavaRuntime {
 	/**
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IUtilityModule.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IUtilityModule.java
index 96e4f00..0f7e22d 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IUtilityModule.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IUtilityModule.java
@@ -20,7 +20,7 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
 public interface IUtilityModule {
 	/**
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IWebModule.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IWebModule.java
index 92dffcf..05d37cd 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IWebModule.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/IWebModule.java
@@ -19,7 +19,7 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
 public interface IWebModule extends IJ2EEModule {
 	/**
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/JndiLaunchable.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/JndiLaunchable.java
index abc0d8f..b83cc9a 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/JndiLaunchable.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/JndiLaunchable.java
@@ -19,7 +19,7 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
 public class JndiLaunchable {
 	private Properties props;
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/JndiObject.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/JndiObject.java
index b7a3751..f02e922 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/JndiObject.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/JndiObject.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
+ * Copyright (c) 2003, 2007 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,8 +10,10 @@
  *******************************************************************************/
 package org.eclipse.jst.server.core;
 
+import org.eclipse.jst.server.core.internal.Messages;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.server.core.IModule;
-import org.eclipse.wst.server.core.IModuleArtifact;
+import org.eclipse.wst.server.core.model.ModuleArtifactDelegate;
 /**
  * A representation of an object in JNDI that can be tested on a server.
  * <p>
@@ -20,10 +22,9 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
-public class JndiObject implements IModuleArtifact {
-	private IModule module;
+public class JndiObject extends ModuleArtifactDelegate {
 	private String jndiName;
 
 	/**
@@ -33,15 +34,15 @@
 	 * @param jndiName the JNDI name of the object
 	 */
 	public JndiObject(IModule module, String jndiName) {
-		this.module = module;
+		super(module);
 		this.jndiName = jndiName;
 	}
 
 	/**
-	 * @see IModuleArtifact#getModule()
+	 * Create an empty reference to an object in JNDI.
 	 */
-	public IModule getModule() {
-		return module;
+	public JndiObject() {
+		super();
 	}
 
 	/**
@@ -52,4 +53,30 @@
 	public String getJndiName() {
 		return jndiName;
 	}
+
+	/*
+	 * @see ModuleArtifactDelegate#getName()
+	 */
+	public String getName() {
+		return NLS.bind(Messages.artifactJNDI, jndiName);
+	}
+
+	/*
+	 * @see ModuleArtifactDelegate#deserialize(String)
+	 */
+	public void deserialize(String s) {
+		int ind = s.indexOf("//");
+		super.deserialize(s.substring(0, ind));
+		jndiName = s.substring(ind+2);
+	}
+
+	/*
+	 * @see ModuleArtifactDelegate#serialize()
+	 */
+	public String serialize() {
+		StringBuffer sb = new StringBuffer(super.serialize());
+		sb.append("//");
+		sb.append(jndiName);
+		return sb.toString();
+	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/PublishUtil.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/PublishUtil.java
index c26d722..601817a 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/PublishUtil.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/PublishUtil.java
@@ -41,7 +41,7 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
 public final class PublishUtil {
 	// size of the buffer
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java
index c688304..2ecf375 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java
@@ -44,7 +44,7 @@
  * (repeatedly) as the API evolves.
  * </p>
  * 
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
 public abstract class RuntimeClasspathProviderDelegate {
 	protected class SourceAttachmentUpdate {
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/Servlet.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/Servlet.java
index f2a78cd..b3cc4dc 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/Servlet.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/Servlet.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
+ * Copyright (c) 2003, 2007 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,8 +10,10 @@
  *******************************************************************************/
 package org.eclipse.jst.server.core;
 
+import org.eclipse.jst.server.core.internal.Messages;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.server.core.IModule;
-import org.eclipse.wst.server.core.IModuleArtifact;
+import org.eclipse.wst.server.core.model.ModuleArtifactDelegate;
 /**
  * A J2EE Servlet.
  * <p>
@@ -20,10 +22,9 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @plannedfor 2.0
+ * @plannedfor 3.0
  */
-public class Servlet implements IModuleArtifact {
-	private IModule module;
+public class Servlet extends ModuleArtifactDelegate {
 	private String className;
 	private String alias;
 	
@@ -35,16 +36,16 @@
 	 * @param alias the servlet's alias
 	 */
 	public Servlet(IModule module, String className, String alias) {
-		this.module = module;
+		super(module);
 		this.className = className;
 		this.alias = alias;
 	}
 
 	/**
-	 * @see IModuleArtifact#getModule()
+	 * Create a new empty servlet.
 	 */
-	public IModule getModule() {
-		return module;
+	public Servlet() {
+		super();
 	}
 
 	/**
@@ -65,10 +66,41 @@
 		return alias;
 	}
 
+	/*
+	 * @see ModuleArtifactDelegate#getName()
+	 */
+	public String getName() {
+		return NLS.bind(Messages.artifactServlet, className);
+	}
+
+	/*
+	 * @see ModuleArtifactDelegate#deserialize(String)
+	 */
+	public void deserialize(String s) {
+		int ind = s.indexOf("//");
+		super.deserialize(s.substring(0, ind));
+		s = s.substring(ind+2);
+		ind = s.indexOf("//");
+		className = s.substring(0, ind);
+		alias = s.substring(ind+2);
+	}
+
+	/*
+	 * @see ModuleArtifactDelegate#serialize()
+	 */
+	public String serialize() {
+		StringBuffer sb = new StringBuffer(super.serialize());
+		sb.append("//");
+		sb.append(className);
+		sb.append("//");
+		sb.append(alias);
+		return sb.toString();
+	}
+
 	/**
 	 * @see Object#toString()
 	 */
 	public String toString() {
-		return "Servlet [module=" + module + ", class=" + className + ", alias=" + alias + "]";
+		return "Servlet [module=" + getModule() + ", class=" + className + ", alias=" + alias + "]";
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/Messages.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/Messages.java
index ad24995..2bbf268 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/Messages.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/Messages.java
@@ -35,6 +35,11 @@
 	public static String errorNotADirectory;
 	public static String errorMkdir;
 
+	public static String artifactServlet;
+	public static String artifactEJB;
+	public static String artifactJNDI;
+	public static String artifactCactusTest;
+
 	static {
 		NLS.initializeMessages(JavaServerPlugin.PLUGIN_ID + ".internal.Messages", Messages.class);
 	}
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/Messages.properties b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/Messages.properties
index 97f0fe5..9ecb27d 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/Messages.properties
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/Messages.properties
@@ -29,4 +29,9 @@
 errorNotADirectory=Could not delete {0} since it is not a directory.
 errorMkdir=Could not create directory {0}.
 
-updateClasspathContainers=Updating classpath container for {0}
\ No newline at end of file
+updateClasspathContainers=Updating classpath container for {0}
+
+artifactServlet=Servlet {0}
+artifactEJB=EJB {0}
+artifactJNDI=JNDI {0}
+artifactCactusTest=Cactus test {0}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/cactus/WebTestableResource.java b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/cactus/WebTestableResource.java
index c760ce8..9e6873a 100644
--- a/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/cactus/WebTestableResource.java
+++ b/plugins/org.eclipse.jst.server.core/sjavacore/org/eclipse/jst/server/core/internal/cactus/WebTestableResource.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 BEA Systems, Inc. and others
+ * Copyright (c) 2005, 2007 BEA Systems, Inc. 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
@@ -8,14 +8,14 @@
  * Contributors:
  *    Daniel R. Somerfield - initial API and implementation
  *******************************************************************************/
-
 package org.eclipse.jst.server.core.internal.cactus;
 
+import org.eclipse.jst.server.core.internal.Messages;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.server.core.IModule;
-import org.eclipse.wst.server.core.IModuleArtifact;
+import org.eclipse.wst.server.core.model.ModuleArtifactDelegate;
 
-public class WebTestableResource implements IModuleArtifact {
-	private IModule fModule;
+public class WebTestableResource extends ModuleArtifactDelegate {
 	private boolean fServletIsConfigured;
 	private String fClassName;
 	private String fTestName;
@@ -23,13 +23,17 @@
 
 	public WebTestableResource(IModule module, boolean servletIsConfigured,
 			String projectName, String className, String testName) {
-		fModule = module;
+		super(module);
 		fServletIsConfigured = servletIsConfigured;
 		fClassName = className;
 		fTestName = testName;
 		fProjectName = projectName;
 	}
 
+	public WebTestableResource() {
+		super();
+	}
+
 	public String getProjectName() {
 		return fProjectName;
 	}
@@ -38,10 +42,6 @@
 		return fServletIsConfigured;
 	}
 
-	public IModule getModule() {
-		return fModule;
-	}
-
 	public String getClassName() {
 		return fClassName;
 	}
@@ -49,4 +49,50 @@
 	public String getTestName() {
 		return fTestName;
 	}
+
+	/*
+	 * @see ModuleArtifactDelegate#getName()
+	 */
+	public String getName() {
+		return NLS.bind(Messages.artifactCactusTest, fTestName);
+	}
+
+	/*
+	 * @see ModuleArtifactDelegate#deserialize(String)
+	 */
+	public void deserialize(String s) {
+		int ind = s.indexOf("//");
+		super.deserialize(s.substring(0, ind));
+		s = s.substring(ind+2);
+		ind = s.indexOf("//");
+		fProjectName = s.substring(0, ind);
+		
+		s = s.substring(ind+2);
+		ind = s.indexOf("//");
+		fClassName = s.substring(0, ind);
+		
+		if ('T' == s.charAt(ind+2))
+			fServletIsConfigured = true;
+		else
+			fServletIsConfigured = false;
+		fTestName = s.substring(ind+3);
+	}
+
+	/*
+	 * @see ModuleArtifactDelegate#serialize()
+	 */
+	public String serialize() {
+		StringBuffer sb = new StringBuffer(super.serialize());
+		sb.append("//");
+		sb.append(fProjectName);
+		sb.append("//");
+		sb.append(fClassName);
+		sb.append("//");
+		if (fServletIsConfigured)
+			sb.append("T");
+		else
+			sb.append("F");
+		sb.append(fTestName);
+		return sb.toString();
+	}
 }
\ No newline at end of file
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 9228504..0cdf2e7 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
@@ -587,7 +587,7 @@
 	 * Returns the module's sync state.
 	 * 
 	 * @param module the module
-	 * @return one of the PUBLISH_XXX state flags
+	 * @return one of the PUBLISH_STATE_XXX state flags
 	 */
 	public int getModulePublishState(IModule[] module);
 
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/ModuleArtifactDelegate.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/ModuleArtifactDelegate.java
new file mode 100644
index 0000000..3c3c859
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/ModuleArtifactDelegate.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.server.core.model;
+
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IModuleArtifact;
+import org.eclipse.wst.server.core.ServerUtil;
+/**
+ * A module artifact is a resource within a module, which can be launched
+ * on the server. Examples of module artifacts are servlets, HTML pages,
+ * or EJB beans.
+ * <p>
+ * Objects that provide an adapter to this type will be considered by the
+ * contextual Run on Server launch support.  
+ * </p>
+ * <p>
+ * Subclasses should provide a default (no-arg) constructor, implement
+ * the serialize/deserialize methods, and provide a useful name.
+ * </p>
+ * 
+ * @see org.eclipse.wst.server.core.model.ModuleArtifactAdapterDelegate
+ * @since 2.0
+ */
+public abstract class ModuleArtifactDelegate implements IModuleArtifact {
+	private IModule module;
+
+	/**
+	 * Create a new module artifact.
+	 * 
+	 * @param module a module
+	 */
+	public ModuleArtifactDelegate(IModule module) {
+		this.module = module;
+	}
+
+	/**
+	 * Create a new module artifact.
+	 */
+	public ModuleArtifactDelegate() {
+		super();
+	}
+
+	/**
+	 * @see IModuleArtifact#getModule()
+	 */
+	public IModule getModule() {
+		return module;
+	}
+
+	/**
+	 * Returns a user-presentable name for this artifact.
+	 * 
+	 * @return a user-presentable name
+	 */
+	public abstract String getName();
+
+	/**
+	 * Serialize this object into a string.
+	 *  
+	 * @return a serialized string
+	 */
+	public String serialize() {
+		return module.getId();
+	}
+
+	/**
+	 * Deserialize this object from a serialized string.
+	 * 
+	 * @param s a serialized string.
+	 */
+	public void deserialize(String s) {
+		this.module = ServerUtil.getModule(s);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/NullModuleArtifact.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/NullModuleArtifact.java
index 88bf49b..618208f 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/NullModuleArtifact.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/NullModuleArtifact.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2007 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
@@ -11,35 +11,40 @@
 package org.eclipse.wst.server.core.util;
 
 import org.eclipse.wst.server.core.IModule;
-import org.eclipse.wst.server.core.IModuleArtifact;
+import org.eclipse.wst.server.core.model.ModuleArtifactDelegate;
 /**
  * A dummy module artifact.
  * 
  * @since 1.0
  */
-public class NullModuleArtifact implements IModuleArtifact {
-	private IModule module;
-
+public class NullModuleArtifact extends ModuleArtifactDelegate {
 	/**
 	 * Create a new reference to a module.
 	 * 
 	 * @param module the module
 	 */
 	public NullModuleArtifact(IModule module) {
-		this.module = module;
+		super(module);
 	}
 
 	/**
-	 * @see IModuleArtifact#getModule()
+	 * Create a new empty reference to a module.
 	 */
-	public IModule getModule() {
-		return module;
+	public NullModuleArtifact() {
+		super();
+	}
+
+	/*
+	 * @see ModuleArtifactDelegate#getName()
+	 */
+	public String getName() {
+		return "";
 	}
 
 	/**
 	 * @see Object#toString()
 	 */
 	public String toString() {
-		return "NullModuleArtifact [module=" + module + "]";
+		return "NullModuleArtifact [module=" + getModule() + "]";
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/WebResource.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/WebResource.java
index 4863f75..a7010d4 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/WebResource.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/WebResource.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
+ * Copyright (c) 2003, 2007 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
@@ -11,16 +11,16 @@
 package org.eclipse.wst.server.core.util;
 
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
 
 import org.eclipse.wst.server.core.IModule;
-import org.eclipse.wst.server.core.IModuleArtifact;
+import org.eclipse.wst.server.core.model.ModuleArtifactDelegate;
 /**
  * A Web module resource.
  * 
  * @since 1.0
  */
-public class WebResource implements IModuleArtifact {
-	private IModule module;
+public class WebResource extends ModuleArtifactDelegate {
 	private IPath path;
 
 	/**
@@ -30,15 +30,12 @@
 	 * @param path a relative path within the module
 	 */
 	public WebResource(IModule module, IPath path) {
-		this.module = module;
+		super(module);
 		this.path = path;
 	}
 
-	/**
-	 * @see IModuleArtifact#getModule()
-	 */
-	public IModule getModule() {
-		return module;
+	public WebResource() {
+		super();
 	}
 
 	/**
@@ -50,10 +47,36 @@
 		return path;
 	}
 
+	/*
+	 * @see ModuleArtifactDelegate#getName()
+	 */
+	public String getName() {
+		return path.toString();
+	}
+
+	/*
+	 * @see ModuleArtifactDelegate#deserialize(String)
+	 */
+	public void deserialize(String s) {
+		int ind = s.indexOf("//");
+		super.deserialize(s.substring(0, ind));
+		path = new Path(s.substring(ind+2));
+	}
+
+	/*
+	 * @see ModuleArtifactDelegate#serialize()
+	 */
+	public String serialize() {
+		StringBuffer sb = new StringBuffer(super.serialize());
+		sb.append("//");
+		sb.append(path.toPortableString());
+		return sb.toString();
+	}
+
 	/**
 	 * @see Object#toString()
 	 */
 	public String toString() {
-		return "WebResource [module=" + module + ", path=" + path + "]";
+		return "WebResource [module=" + getModule() + ", path=" + path + "]";
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.ui/icons/obj16/state_started.gif b/plugins/org.eclipse.wst.server.ui/icons/obj16/state_started.gif
new file mode 100644
index 0000000..496e04f
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/icons/obj16/state_started.gif
Binary files differ
diff --git a/plugins/org.eclipse.wst.server.ui/icons/obj16/state_stopped.gif b/plugins/org.eclipse.wst.server.ui/icons/obj16/state_stopped.gif
new file mode 100644
index 0000000..61bbe3c
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/icons/obj16/state_stopped.gif
Binary files differ
diff --git a/plugins/org.eclipse.wst.server.ui/plugin.properties b/plugins/org.eclipse.wst.server.ui/plugin.properties
index 8326a5d..2bc3179 100644
--- a/plugins/org.eclipse.wst.server.ui/plugin.properties
+++ b/plugins/org.eclipse.wst.server.ui/plugin.properties
@@ -79,6 +79,8 @@
 moduleProjectDecoratorLabel=Module Project
 moduleProjectDecoratorDescription=Decorates server modules with information on the project that they come from
 
+runOnServerLaunchConfiguration=Run on Server
+
 # --------------- Action Sets (toolbar icon groups) ---------------
 
 # Web Browser action set
diff --git a/plugins/org.eclipse.wst.server.ui/plugin.xml b/plugins/org.eclipse.wst.server.ui/plugin.xml
index 7666f8d..f21fb07 100644
--- a/plugins/org.eclipse.wst.server.ui/plugin.xml
+++ b/plugins/org.eclipse.wst.server.ui/plugin.xml
@@ -431,4 +431,28 @@
   </decorator>
 </extension>
 
+<extension point="org.eclipse.debug.core.launchConfigurationTypes">
+  <launchConfigurationType
+    id="org.eclipse.wst.server.ui.launchConfigurationType"
+    name="%runOnServerLaunchConfiguration"
+    delegate="org.eclipse.wst.server.ui.internal.actions.RunOnServerLaunchConfigurationDelegate"
+    modes="run,debug,profile"/>
+</extension>
+
+<extension point="org.eclipse.debug.ui.launchConfigurationTypeImages">
+  <launchConfigurationTypeImage
+    id="org.eclipse.wst.server.ui.launchConfigurationTypeImage"
+    configTypeID="org.eclipse.wst.server.ui.launchConfigurationType"
+    icon="icons/etool16/run_on_server.gif">
+  </launchConfigurationTypeImage>
+</extension>
+
+<extension point="org.eclipse.debug.ui.launchConfigurationTabGroups">
+  <launchConfigurationTabGroup
+    id="org.eclipse.wst.server.ui.launchConfigurationTabGroup"
+    type="org.eclipse.wst.server.ui.launchConfigurationType"
+    class="org.eclipse.wst.server.ui.internal.RunOnServerLaunchConfigurationTabGroup">
+  </launchConfigurationTabGroup>
+</extension>
+
 </plugin>
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ImageResource.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ImageResource.java
index 2ac3b00..74997d1 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ImageResource.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ImageResource.java
@@ -99,6 +99,9 @@
 	public static final String IMG_SERVER_STATE_STARTED_PROFILE = "stateStartedProfile";
 	public static final String IMG_SERVER_STATE_STOPPED = "stateStopped";
 	
+	public static final String IMG_STATE_STARTED = "stateStarted2";
+	public static final String IMG_STATE_STOPPED = "stateStopped2";
+	
 	public static final String IMG_SERVER_STATE_STARTING_1 = "stateStarting1";
 	public static final String IMG_SERVER_STATE_STARTING_2 = "stateStarting2";
 	public static final String IMG_SERVER_STATE_STARTING_3 = "stateStarting3";
@@ -228,6 +231,9 @@
 		registerImage(IMG_SERVER_STATE_STARTED_PROFILE, URL_OBJ + "server_started_profile.gif");
 		registerImage(IMG_SERVER_STATE_STOPPED, URL_OBJ + "server_stopped.gif");
 		
+		registerImage(IMG_STATE_STARTED, URL_OBJ + "state_started.gif");
+		registerImage(IMG_STATE_STOPPED, URL_OBJ + "state_stopped.gif");
+		
 		registerImage(IMG_SERVER_STATE_STARTING_1, URL_OBJ + "server_starting1.gif");
 		registerImage(IMG_SERVER_STATE_STARTING_2, URL_OBJ + "server_starting2.gif");
 		registerImage(IMG_SERVER_STATE_STARTING_3, URL_OBJ + "server_starting3.gif");
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 645e934..68f936a 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
@@ -1,5 +1,5 @@
 /**********************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2007 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
@@ -58,6 +58,7 @@
 	public static String errorServerAlreadyRunning;
 	public static String errorInvalidServer;
 	public static String serverLaunchConfigurationTab;
+	public static String runOnServerLaunchConfigName;
 	public static String wizSelectClientMessage;
 	public static String errorCouldNotCreateServerProject;
 	public static String errorDialogTitle;
@@ -151,6 +152,7 @@
 	public static String actionSetNewServer;
 	public static String errorNoArtifact;
 	public static String errorNoModules;
+	public static String errorLaunchConfig;
 	public static String dialogModeWarningRun;
 	public static String dialogModeWarningDebug;
 	public static String dialogModeWarningProfile;
@@ -240,7 +242,7 @@
 	public static String actionOpen;
 	public static String viewServer;
 	public static String viewStatus;
-	public static String viewSync;
+	public static String viewState;
 	public static String actionStopToolTip;
 	public static String actionStop;
 	public static String actionModifyModulesToolTip;
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 420cf3b..0fabed1 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
@@ -108,7 +108,7 @@
 # Column titles
 viewServer=Server
 viewStatus=Status
-viewSync=State
+viewState=State
 
 # Actions
 actionStart=Start
@@ -369,15 +369,17 @@
 serverLaunchServer=Server:
 serverLaunchRuntime=Runtime:
 serverLaunchHost=Host name:
+runOnServerLaunchConfigName={0}
 
 # Error Messages
 errorDialogTitle=Server Error
 errorServerAlreadyRunning=Server already running
 errorNoServerSelected=No server selected
-errorInvalidServer=Invalid server
+errorInvalidServer=The server is invalid or missing
 errorCouldNotCreateServerProject=Could not create server project
 errorCouldNotCreateServerProjectStatus=Could not create server project: {0}
 errorNoArtifact=The selection did not contain anything that can be run on a server.
+errorLaunchConfig=This launch configuration is invalid and may be out of sync with the workspace
 errorNoModules=The selection is not within a valid module.
 errorNoServer=Could not find a server to run the selection.
 errorCouldNotSavePreference=Could not save server preference information.
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/RunOnServerLaunchConfigurationTab.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/RunOnServerLaunchConfigurationTab.java
new file mode 100644
index 0000000..5c5e43f
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/RunOnServerLaunchConfigurationTab.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.server.ui.internal;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+import org.eclipse.wst.server.core.*;
+import org.eclipse.wst.server.core.internal.IClient;
+import org.eclipse.wst.server.core.internal.ILaunchableAdapter;
+import org.eclipse.wst.server.core.internal.Server;
+import org.eclipse.wst.server.core.internal.ServerPlugin;
+import org.eclipse.wst.server.core.model.ModuleArtifactDelegate;
+import org.eclipse.wst.server.ui.internal.actions.RunOnServerLaunchConfigurationDelegate;
+/**
+ * Run on Server launch configuration tab.
+ */
+public class RunOnServerLaunchConfigurationTab extends AbstractLaunchConfigurationTab {
+	//private ILaunchConfigurationWorkingCopy wc;
+
+	protected IServer server;
+	protected IModule module;
+	protected ModuleArtifactDelegate moduleArtifact;
+	protected ILaunchableAdapter launchableAdapter;
+	protected IClient client;
+
+	protected Label serverLabel;
+	protected Label moduleArtifactLabel;
+	protected Label clientLabel;
+
+	/**
+	 * Create a new launch configuration tab.
+	 */
+	public RunOnServerLaunchConfigurationTab() {
+		super();
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(Composite)
+	 */
+	public void createControl(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.marginWidth = 5;
+		layout.marginHeight = 5;
+		layout.numColumns = 2;
+		composite.setLayout(layout);
+		
+		Label label = new Label(composite, SWT.NONE);
+		label.setText(Messages.serverLaunchServer);
+		serverLabel = new Label(composite, SWT.NONE);
+		serverLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		label = new Label(composite, SWT.NONE);
+		label.setText("Artifact:");
+		moduleArtifactLabel = new Label(composite, SWT.NONE);
+		moduleArtifactLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		label = new Label(composite, SWT.NONE);
+		label.setText("Client:");
+		clientLabel = new Label(composite, SWT.NONE);
+		clientLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		Dialog.applyDialogFont(composite);
+		setControl(composite);
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(ILaunchConfigurationWorkingCopy)
+	 */
+	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
+		setErrorMessage(null);
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration)
+	 */
+	public void initializeFrom(ILaunchConfiguration configuration) {
+		setErrorMessage(null);
+		
+		try {
+			String serverId = configuration.getAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_SERVER_ID, (String)null);
+			String moduleArt = configuration.getAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_MODULE_ARTIFACT, (String)null);
+			String moduleArtifactClass = configuration.getAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_MODULE_ARTIFACT_CLASS, (String)null);
+			String laId = configuration.getAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_LAUNCHABLE_ADAPTER_ID, (String)null);
+			String clientId = configuration.getAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_CLIENT_ID, (String)null);
+			
+			server = ServerCore.findServer(serverId);
+			module = null;
+			moduleArtifact = null;
+			launchableAdapter = ServerPlugin.findLaunchableAdapter(laId);
+			client = ServerPlugin.findClient(clientId);
+			
+			try {
+				Class c = Class.forName(moduleArtifactClass);
+				moduleArtifact = (ModuleArtifactDelegate) c.newInstance();
+				moduleArtifact.deserialize(moduleArt);
+				module = moduleArtifact.getModule();
+			} catch (Throwable t) {
+				Trace.trace(Trace.WARNING, "Could not load module artifact delegate class");
+			}
+			
+			if (server == null)
+				serverLabel.setText("unknown");
+			else
+				serverLabel.setText(server.getName());
+			
+			if (moduleArtifact == null)
+				moduleArtifactLabel.setText("unknown");
+			else
+				moduleArtifactLabel.setText(moduleArtifact.getName());
+			
+			if (client == null)
+				clientLabel.setText("unknown");
+			else
+				clientLabel.setText(client.getName());
+		} catch (CoreException e) {
+			// ignore
+		}
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy)
+	 */
+	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+		// do nothing
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(ILaunchConfiguration) 
+	 */
+	public boolean isValid(ILaunchConfiguration launchConfig) {
+		try {
+			String id = launchConfig.getAttribute(Server.ATTR_SERVER_ID, "");
+			if (id != null && !id.equals("")) {
+				IServer server2 = ServerCore.findServer(id);
+				if (server2 == null)
+					return false;
+				if (server2.getServerState() == IServer.STATE_STOPPED)
+					return true;
+			}
+		} catch (CoreException e) {
+			// ignore
+		}
+		return false;
+	}
+
+	/*
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
+	 */
+	public Image getImage() {
+		return ImageResource.getImage(ImageResource.IMG_ETOOL_RUN_ON_SERVER);
+	}
+
+	/*
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
+	 */
+	public String getName() {
+		return Messages.serverLaunchConfigurationTab;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/RunOnServerLaunchConfigurationTabGroup.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/RunOnServerLaunchConfigurationTabGroup.java
new file mode 100644
index 0000000..495a862
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/RunOnServerLaunchConfigurationTabGroup.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.server.ui.internal;
+
+import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
+import org.eclipse.debug.ui.CommonTab;
+import org.eclipse.debug.ui.ILaunchConfigurationDialog;
+import org.eclipse.debug.ui.ILaunchConfigurationTab;
+/**
+ * Run on Server launch configuration tab group.
+ */
+public class RunOnServerLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup {
+	public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
+		ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[2];
+		tabs[0] = new RunOnServerLaunchConfigurationTab();
+		tabs[0].setLaunchConfigurationDialog(dialog);
+		tabs[1] = new CommonTab();
+		tabs[1].setLaunchConfigurationDialog(dialog);
+		setTabs(tabs);
+	}
+}
\ No newline at end of file
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 2dccce9..0403863 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
@@ -12,15 +12,14 @@
 
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.runtime.*;
 import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.*;
+import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.dialogs.ErrorDialog;
 import org.eclipse.jface.viewers.ISelection;
@@ -35,8 +34,11 @@
 import org.eclipse.wst.server.core.internal.ServerPlugin;
 import org.eclipse.wst.server.core.internal.ServerType;
 import org.eclipse.wst.server.core.internal.StartServerJob;
+import org.eclipse.wst.server.core.internal.Trace;
+import org.eclipse.wst.server.core.model.ModuleArtifactDelegate;
 import org.eclipse.wst.server.ui.internal.*;
 import org.eclipse.wst.server.ui.internal.wizard.*;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IWorkbenchWindow;
@@ -59,8 +61,8 @@
 
 	protected boolean tasksAndClientShown;
 
-	public ILaunchableAdapter launchableAdapter;
-	public IClient client;
+	protected ILaunchableAdapter launchableAdapter;
+	protected IClient client;
 
 	/**
 	 * RunOnServerActionDelegate constructor comment.
@@ -157,7 +159,9 @@
 	 */
 	protected void run() {
 //		final String launchMode2 = getLaunchMode();
-		final IModuleArtifact moduleArtifact = ServerPlugin.getModuleArtifact(selection);
+		IModuleArtifact[] moduleArtifacts = ServerPlugin.getModuleArtifacts(selection);
+		// TODO - multiple module artifacts
+		final IModuleArtifact moduleArtifact = moduleArtifacts[0];
 		
 		Shell shell2 = null;
 		if (window != null)
@@ -273,6 +277,27 @@
 			launchableAdapter = wizard.getLaunchableAdapter();
 		}
 		
+		if (moduleArtifact instanceof ModuleArtifactDelegate) {
+			boolean canLoad = false;
+			try {
+				Class c = Class.forName(moduleArtifact.getClass().getName());
+				if (c.newInstance() != null)
+					canLoad = true;
+			} catch (Throwable t) {
+				Trace.trace(Trace.WARNING, "Could not load module artifact delegate class, switching to backup");
+			}
+			if (canLoad) {
+				try {
+					IProgressMonitor monitor = new NullProgressMonitor();
+					ILaunchConfiguration config = getLaunchConfiguration(server, (ModuleArtifactDelegate) moduleArtifact, launchableAdapter, client, monitor);
+					config.launch(launchMode, monitor);
+				} catch (CoreException ce) {
+					Trace.trace(Trace.SEVERE, "Could not launch Run on Server", ce);
+				}
+				return;
+			}
+		}
+		
 		Thread thread = new Thread("Run on Server") {
 			public void run() {
 				if (client == null) {
@@ -408,6 +433,73 @@
 		thread.start();
 	}
 
+	protected void setupLaunchConfiguration(ILaunchConfigurationWorkingCopy config, IServer server, ModuleArtifactDelegate moduleArtifact, ILaunchableAdapter launchableAdapter, IClient client) {
+		config.setAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_SERVER_ID, server.getId());
+		config.setAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_MODULE_ARTIFACT, moduleArtifact.serialize());
+		config.setAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_MODULE_ARTIFACT_CLASS, moduleArtifact.getClass().getName());
+		config.setAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_LAUNCHABLE_ADAPTER_ID, launchableAdapter.getId());
+		config.setAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_CLIENT_ID, client.getId());
+	}
+
+	protected ILaunchConfiguration getLaunchConfiguration(IServer server, ModuleArtifactDelegate moduleArtifact, ILaunchableAdapter launchableAdapter2, IClient client2, IProgressMonitor monitor) throws CoreException {
+		String serverId = server.getId();
+		ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
+		ILaunchConfigurationType launchConfigType = launchManager.getLaunchConfigurationType("org.eclipse.wst.server.ui.launchConfigurationType");
+		ILaunchConfiguration[] launchConfigs = null;
+		try {
+			launchConfigs = launchManager.getLaunchConfigurations(launchConfigType);
+		} catch (CoreException e) {
+			// ignore
+		}
+		
+		if (launchConfigs != null) {
+			int size = launchConfigs.length;
+			for (int i = 0; i < size; i++) {
+				List list = launchConfigs[i].getAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, (List)null);
+				if (list == null || list.isEmpty()) {
+					try {
+						String serverId2 = launchConfigs[i].getAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_SERVER_ID, (String) null);
+						if (serverId.equals(serverId2)) {
+							final ILaunchConfigurationWorkingCopy wc = launchConfigs[i].getWorkingCopy();
+							setupLaunchConfiguration(wc, server, moduleArtifact, launchableAdapter2, client2);
+							if (wc.isDirty()) {
+								try {
+									return wc.doSave();
+								} catch (CoreException ce) {
+									Trace.trace(Trace.SEVERE, "Error configuring launch", ce);
+								}
+							}
+							return launchConfigs[i];
+						}
+					} catch (CoreException e) {
+						Trace.trace(Trace.SEVERE, "Error configuring launch", e);
+					}
+				}
+			}
+		}
+		
+		// create a new launch configuration
+		String launchName = NLS.bind(Messages.runOnServerLaunchConfigName, moduleArtifact.getName());
+		launchName = getValidLaunchConfigurationName(launchName);
+		launchName = launchManager.generateUniqueLaunchConfigurationNameFrom(launchName); 
+		ILaunchConfigurationWorkingCopy wc = launchConfigType.newInstance(null, launchName);
+		wc.setAttribute(RunOnServerLaunchConfigurationDelegate.ATTR_SERVER_ID, serverId);
+		setupLaunchConfiguration(wc, server, moduleArtifact, launchableAdapter2, client2);
+		return wc.doSave();
+	}
+
+	//protected static final char[] INVALID_CHARS = new char[] {'\\', '/', ':', '*', '?', '"', '<', '>', '|', '\0', '@', '&'};
+	protected static final char[] INVALID_CHARS = new char[] {'\\', ':', '*', '?', '"', '<', '>', '|', '\0', '@', '&'};
+	protected String getValidLaunchConfigurationName(String s) {
+		if (s == null || s.length() == 0)
+			return "1";
+		int size = INVALID_CHARS.length;
+		for (int i = 0; i < size; i++) {
+			s = s.replace(INVALID_CHARS[i], '_');
+		}
+		return s;
+	}
+
 	/**
 	 * Open an options dialog.
 	 * 
@@ -417,7 +509,7 @@
 	 * @param breakpointsOption
 	 * @return a dialog return constant
 	 */
-	protected int openOptionsDialog(final Shell shell, final String title, final String message, final boolean breakpointsOption) {
+	protected static int openOptionsDialog(final Shell shell, final String title, final String message, final boolean breakpointsOption) {
 		if (breakpointsOption) {
 			int current = ServerUIPlugin.getPreferences().getLaunchMode2();
 			if (current == ServerUIPreferences.LAUNCH_MODE2_RESTART)
@@ -480,7 +572,7 @@
 	 * @param shell
 	 * @return a dialog return constant
 	 */
-	protected int openBreakpointDialog(final Shell shell) {
+	protected static int openBreakpointDialog(final Shell shell) {
 		int current = ServerUIPlugin.getPreferences().getEnableBreakpoints();
 		if (current == ServerUIPreferences.ENABLE_BREAKPOINTS_ALWAYS)
 			return 0;
@@ -511,7 +603,7 @@
 	 * @param shell
 	 * @return a dialog return constant
 	 */
-	protected int openRestartDialog(final Shell shell) {
+	protected static int openRestartDialog(final Shell shell) {
 		int current = ServerUIPlugin.getPreferences().getRestart();
 		if (current == ServerUIPreferences.RESTART_ALWAYS)
 			return 0;
@@ -618,8 +710,10 @@
 			}
 			
 			Trace.trace(Trace.FINEST, "checking for module artifact");
-			IModuleArtifact moduleArtifact = ServerPlugin.getModuleArtifact(globalSelection);
+			IModuleArtifact[] moduleArtifacts = ServerPlugin.getModuleArtifacts(globalSelection);
 			IModule module = null;
+			// TODO - multiple module artifacts
+			IModuleArtifact moduleArtifact = moduleArtifacts[0];
 			if (moduleArtifact != null)
 				module = moduleArtifact.getModule();
 			Trace.trace(Trace.FINEST, "moduleArtifact= " + moduleArtifact + ", module= " + module);
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
new file mode 100644
index 0000000..6db6a6b
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/actions/RunOnServerLaunchConfigurationDelegate.java
@@ -0,0 +1,248 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.server.ui.internal.actions;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBreakpointManager;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
+import org.eclipse.debug.internal.ui.DebugUIPlugin;
+import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
+import org.eclipse.debug.internal.ui.launchConfigurations.LaunchHistory;
+import org.eclipse.debug.ui.ILaunchGroup;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.ServerCore;
+import org.eclipse.wst.server.core.internal.ChainedJob;
+import org.eclipse.wst.server.core.internal.IClient;
+import org.eclipse.wst.server.core.internal.ILaunchableAdapter;
+import org.eclipse.wst.server.core.internal.PublishServerJob;
+import org.eclipse.wst.server.core.internal.RestartServerJob;
+import org.eclipse.wst.server.core.internal.ServerPlugin;
+import org.eclipse.wst.server.core.internal.ServerType;
+import org.eclipse.wst.server.core.internal.StartServerJob;
+import org.eclipse.wst.server.core.model.ModuleArtifactDelegate;
+import org.eclipse.wst.server.ui.internal.EclipseUtil;
+import org.eclipse.wst.server.ui.internal.LaunchClientJob;
+import org.eclipse.wst.server.ui.internal.Messages;
+import org.eclipse.wst.server.ui.internal.ServerUIPlugin;
+import org.eclipse.wst.server.ui.internal.Trace;
+
+public class RunOnServerLaunchConfigurationDelegate extends LaunchConfigurationDelegate {
+	public static final String ATTR_SERVER_ID = "server-id";
+	public static final String ATTR_MODULE_ARTIFACT = "module-artifact";
+	public static final String ATTR_MODULE_ARTIFACT_CLASS = "module-artifact-class";
+
+	public static final String ATTR_LAUNCHABLE_ADAPTER_ID = "launchable-adapter-id";
+	public static final String ATTR_CLIENT_ID = "client-id";
+
+	public void launch(ILaunchConfiguration configuration, String launchMode, final ILaunch launch2,
+			IProgressMonitor monitor) throws CoreException {
+		
+		String serverId = configuration.getAttribute(ATTR_SERVER_ID, (String)null);
+		String moduleArt = configuration.getAttribute(ATTR_MODULE_ARTIFACT, (String)null);
+		String moduleArtifactClass = configuration.getAttribute(ATTR_MODULE_ARTIFACT_CLASS, (String)null);
+		String laId = configuration.getAttribute(ATTR_LAUNCHABLE_ADAPTER_ID, (String)null);
+		String clientId = configuration.getAttribute(ATTR_CLIENT_ID, (String)null);
+		
+		IServer server = ServerCore.findServer(serverId);
+		IModule module = null;
+		ModuleArtifactDelegate moduleArtifact = null;
+		ILaunchableAdapter launchableAdapter = ServerPlugin.findLaunchableAdapter(laId);
+		IClient client = ServerPlugin.findClient(clientId);
+		
+		try {
+			Class c = Class.forName(moduleArtifactClass);
+			moduleArtifact = (ModuleArtifactDelegate) c.newInstance();
+			moduleArtifact.deserialize(moduleArt);
+			module = moduleArtifact.getModule();
+		} catch (Throwable t) {
+			Trace.trace(Trace.WARNING, "Could not load module artifact delegate class");
+		}
+		
+		if (moduleArtifact == null)
+			throw new CoreException(new Status(IStatus.ERROR, ServerUIPlugin.PLUGIN_ID, Messages.errorLaunchConfig));
+		
+		if (module == null)
+			throw new CoreException(new Status(IStatus.ERROR, ServerUIPlugin.PLUGIN_ID, Messages.errorLaunchConfig));
+		
+		if (server == null)
+			throw new CoreException(new Status(IStatus.ERROR, ServerUIPlugin.PLUGIN_ID, Messages.errorInvalidServer));
+		
+		if (launchableAdapter == null)
+			throw new CoreException(new Status(IStatus.ERROR, ServerUIPlugin.PLUGIN_ID, Messages.errorLaunchConfig));
+		
+		final Shell[] shell2 = new Shell[1];
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				shell2[0] = EclipseUtil.getShell();
+			}
+		});
+		Shell shell = shell2[0];
+		
+		if (client == null) {
+			// if there is no client, use a dummy
+			client = new IClient() {
+				public String getDescription() {
+					return Messages.clientDefaultDescription;
+				}
+
+				public String getId() {
+					return "org.eclipse.wst.server.ui.client.default";
+				}
+
+				public String getName() {
+					return Messages.clientDefaultName;
+				}
+
+				public IStatus launch(IServer server3, Object launchable2, String launchMode3, ILaunch launch) {
+					return Status.OK_STATUS;
+				}
+
+				public boolean supports(IServer server3, Object launchable2, String launchMode3) {
+					return true;
+				}
+			};
+		}
+		
+		Trace.trace(Trace.FINEST, "Ready to launch");
+		
+		// start server if it's not already started
+		// and cue the client to start
+		IModule[] modules = new IModule[] { module }; // TODO: get parent heirarchy correct
+		int state = server.getServerState();
+		if (state == IServer.STATE_STARTING) {
+			LaunchClientJob clientJob = new LaunchClientJob(server, modules, launchMode, moduleArtifact, launchableAdapter, client);
+			clientJob.schedule();
+		} else if (state == IServer.STATE_STARTED) {
+			boolean restart = false;
+			String mode = server.getMode();
+			IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager();
+			boolean disabledBreakpoints = false;
+			
+			if (server.getServerRestartState()) {
+				int result = RunOnServerActionDelegate.openRestartDialog(shell);
+				if (result == 0) {
+					launchMode = mode;
+					restart = true;
+				} else if (result == 9) // cancel
+					return;
+			}
+			if (!restart) {
+				if (!ILaunchManager.RUN_MODE.equals(mode) && ILaunchManager.RUN_MODE.equals(launchMode)) {
+					boolean breakpointsOption = false;
+					if (breakpointManager.isEnabled() && ILaunchManager.DEBUG_MODE.equals(mode))
+						breakpointsOption = true;
+					int result = RunOnServerActionDelegate.openOptionsDialog(shell, Messages.wizRunOnServerTitle, Messages.dialogModeWarningRun, breakpointsOption);
+					if (result == 0)
+						restart = true;
+					else if (result == 1) {
+						breakpointManager.setEnabled(false);
+						disabledBreakpoints = true;
+						launchMode = mode;
+					} else if (result == 2)
+						launchMode = mode;
+					else // result == 9 // cancel
+						return;
+				} else if (!ILaunchManager.DEBUG_MODE.equals(mode) && ILaunchManager.DEBUG_MODE.equals(launchMode)) {
+					int result = RunOnServerActionDelegate.openOptionsDialog(shell, Messages.wizDebugOnServerTitle, Messages.dialogModeWarningDebug, false);
+					if (result == 0)
+						restart = true;
+					else if (result == 1)
+						launchMode = mode;
+					else // result == 9 // cancel
+						return;
+				} else if (!ILaunchManager.PROFILE_MODE.equals(mode) && ILaunchManager.PROFILE_MODE.equals(launchMode)) {
+					boolean breakpointsOption = false;
+					if (breakpointManager.isEnabled() && ILaunchManager.DEBUG_MODE.equals(mode))
+						breakpointsOption = true;
+					int result = RunOnServerActionDelegate.openOptionsDialog(shell, Messages.wizProfileOnServerTitle, Messages.dialogModeWarningProfile, breakpointsOption);
+					if (result == 0)
+						restart = true;
+					else if (result == 1) {
+						breakpointManager.setEnabled(false);
+						disabledBreakpoints = true;
+						launchMode = mode;
+					} else if (result == 2)
+						launchMode = mode;
+					else // result == 9 // cancel
+						return;
+				}
+				
+				if (ILaunchManager.DEBUG_MODE.equals(launchMode)) {
+					if (!breakpointManager.isEnabled() && !disabledBreakpoints) {
+						int result = RunOnServerActionDelegate.openBreakpointDialog(shell);
+						if (result == 0)
+							breakpointManager.setEnabled(true);
+						else if (result == 1) {
+							// ignore
+						} else // result == 2
+							return;
+					}
+				}
+			}
+			
+			PublishServerJob publishJob = new PublishServerJob(server, IServer.PUBLISH_INCREMENTAL, false);
+			LaunchClientJob clientJob = new LaunchClientJob(server, modules, launchMode, moduleArtifact, launchableAdapter, client);
+			publishJob.setNextJob(clientJob);
+			
+			if (restart) {
+				RestartServerJob restartJob = new RestartServerJob(server, launchMode);
+				restartJob.setNextJob(publishJob);
+				restartJob.schedule();
+			} else
+				publishJob.schedule();
+		} else if (state != IServer.STATE_STOPPING) {
+			PublishServerJob publishJob = new PublishServerJob(server);
+			StartServerJob startServerJob = new StartServerJob(server, launchMode);
+			LaunchClientJob clientJob = new LaunchClientJob(server, modules, launchMode, moduleArtifact, launchableAdapter, client);
+			
+			ChainedJob myJob = new ChainedJob("test", server) {
+				protected IStatus run(IProgressMonitor monitor2) {
+					try {
+						LaunchConfigurationManager lcm = DebugUIPlugin.getDefault().getLaunchConfigurationManager();
+						ILaunchGroup[] groups = lcm.getLaunchGroups();
+						int size = groups.length;
+						for (int i = 0; i < size; i++) {
+							String id = groups[i].getIdentifier();
+							LaunchHistory history = lcm.getLaunchHistory(id);
+							if (history != null)
+								history.launchAdded(launch2);
+						}
+					} catch (Throwable t) {
+						Trace.trace(Trace.WARNING, "Could not tweak debug launch history");
+					}
+					return Status.OK_STATUS;
+				}
+			};
+			
+			if (((ServerType)server.getServerType()).startBeforePublish()) {
+				startServerJob.setNextJob(publishJob);
+				publishJob.setNextJob(clientJob);
+				clientJob.setNextJob(myJob);
+				startServerJob.schedule();
+			} else {
+				publishJob.setNextJob(startServerJob);
+				startServerJob.setNextJob(clientJob);
+				clientJob.setNextJob(myJob);
+				publishJob.schedule();
+			}
+		}
+	}
+}
\ No newline at end of file