[245013] Server View based on Common Navigator
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 27078b9..6629155 100644
--- a/plugins/org.eclipse.wst.server.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.server.ui/META-INF/MANIFEST.MF
@@ -44,6 +44,7 @@
  org.eclipse.wst.internet.monitor.core;bundle-version="[1.0.103,2.0.0)",
  org.eclipse.update.core;bundle-version="[3.2.0,4.0.0)";resolution:=optional,
  org.eclipse.jface.text;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.wst.common.project.facet.ui;bundle-version="[1.1.0,2.0.0)";resolution:=optional
+ org.eclipse.wst.common.project.facet.ui;bundle-version="[1.1.0,2.0.0)";resolution:=optional,
+ org.eclipse.ui.navigator;bundle-version="3.3.100"
 Bundle-ActivationPolicy: lazy;exclude:="org.eclipse.wst.server.ui.internal.webbrowser"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.wst.server.ui/plugin.properties b/plugins/org.eclipse.wst.server.ui/plugin.properties
index 49c1777..8e77aa5 100644
--- a/plugins/org.eclipse.wst.server.ui/plugin.properties
+++ b/plugins/org.eclipse.wst.server.ui/plugin.properties
@@ -27,6 +27,7 @@
 newServerDescription=Define a new server
 
 viewServers=Servers
+viewServers_new=Servers (proposed)
 
 # --------------- Action Sets (toolbar icon groups) ---------------
 
diff --git a/plugins/org.eclipse.wst.server.ui/plugin.xml b/plugins/org.eclipse.wst.server.ui/plugin.xml
index 75647be..059204d 100644
--- a/plugins/org.eclipse.wst.server.ui/plugin.xml
+++ b/plugins/org.eclipse.wst.server.ui/plugin.xml
@@ -37,6 +37,52 @@
     category="org.eclipse.wst.server.ui"
     class="org.eclipse.wst.server.ui.internal.view.servers.ServersView"
     icon="icons/cview16/servers_view.gif"/>
+
+  <view
+    id="org.eclipse.wst.server.ui.ServersViewProposed"
+    name="%viewServers_new"
+    category="org.eclipse.wst.server.ui"
+    class="org.eclipse.wst.server.ui.internal.view.servers.provisional.ServersView"
+    icon="icons/cview16/servers_view.gif"/>
+</extension>
+<extension
+      point="org.eclipse.ui.navigator.navigatorContent">
+   <navigatorContent
+         activeByDefault="true"
+         contentProvider="org.eclipse.wst.server.ui.internal.view.servers.provisional.ServerContentProvider"
+         icon="icons/cview16/servers_view.gif"
+         id="org.eclipse.wst.server.ui.ServersView.content.root"
+         labelProvider="org.eclipse.wst.server.ui.internal.view.servers.provisional.ServerLabelProvider"
+         name="Servers View Default Content"
+         priority="normal">
+      <triggerPoints>
+         <instanceof
+               value="org.eclipse.wst.server.core.internal.ServerPlugin">
+         </instanceof>
+      </triggerPoints>
+      <possibleChildren>
+         <or>
+            <instanceof
+                  value="org.eclipse.wst.server.core.IServer">
+            </instanceof>
+            <instanceof
+                  value="org.eclipse.wst.server.ui.internal.view.servers.ModuleServer">
+            </instanceof>
+         </or></possibleChildren>
+   </navigatorContent>
+</extension>
+
+               <extension
+      point="org.eclipse.ui.navigator.viewer">
+   <viewerContentBinding
+         viewerId="org.eclipse.wst.server.ui.ServersViewProposed">
+      <includes>
+         <contentExtension
+               isRoot="true"
+               pattern="org.eclipse.wst.server.ui.ServersView.content.root">
+         </contentExtension>
+      </includes>
+   </viewerContentBinding>
 </extension>
 
 <extension point="org.eclipse.ui.perspectiveExtensions">
@@ -503,5 +549,26 @@
         id="org.eclipse.wst.server.ui.launchable.adapter.default"
         priority="-999999"/>
 </extension>
+<extension
+      point="org.eclipse.ui.decorators">
+   <decorator
+         class="org.eclipse.wst.server.ui.internal.view.servers.provisional.ServerDecorator"
+         icon="icons/obj16/server.gif"
+         id="org.eclipse.wst.server.ui.navigatorDecorator"
+         label="Server State Decorator"
+         lightweight="true"
+         location="BOTTOM_RIGHT">
+      <enablement>
+         <or>
+            <objectClass
+                  name="org.eclipse.wst.server.core.IServer">
+            </objectClass>
+            <objectClass
+                  name="org.eclipse.wst.server.ui.internal.view.servers.ModuleServer">
+            </objectClass>
+         </or>
+      </enablement>
+   </decorator>
+</extension>
 
 </plugin>
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerActionProvider.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerActionProvider.java
new file mode 100644
index 0000000..4247d90
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerActionProvider.java
@@ -0,0 +1,303 @@
+package org.eclipse.wst.server.ui.internal.view.servers.provisional;
+
+import java.util.Iterator;
+
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.bindings.TriggerSequence;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.keys.IBindingService;
+import org.eclipse.ui.navigator.CommonActionProvider;
+import org.eclipse.ui.navigator.CommonViewer;
+import org.eclipse.ui.navigator.ICommonActionExtensionSite;
+import org.eclipse.ui.navigator.ICommonViewerSite;
+import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.ServerPort;
+import org.eclipse.wst.server.core.model.ServerDelegate;
+import org.eclipse.wst.server.ui.internal.Messages;
+import org.eclipse.wst.server.ui.internal.ServerUIPlugin;
+import org.eclipse.wst.server.ui.internal.Trace;
+import org.eclipse.wst.server.ui.internal.actions.NewServerWizardAction;
+import org.eclipse.wst.server.ui.internal.view.servers.CopyAction;
+import org.eclipse.wst.server.ui.internal.view.servers.DeleteAction;
+import org.eclipse.wst.server.ui.internal.view.servers.ModuleServer;
+import org.eclipse.wst.server.ui.internal.view.servers.ModuleSloshAction;
+import org.eclipse.wst.server.ui.internal.view.servers.MonitorServerPortAction;
+import org.eclipse.wst.server.ui.internal.view.servers.OpenAction;
+import org.eclipse.wst.server.ui.internal.view.servers.PasteAction;
+import org.eclipse.wst.server.ui.internal.view.servers.PropertiesAction;
+import org.eclipse.wst.server.ui.internal.view.servers.PublishAction;
+import org.eclipse.wst.server.ui.internal.view.servers.PublishCleanAction;
+import org.eclipse.wst.server.ui.internal.view.servers.RemoveModuleAction;
+import org.eclipse.wst.server.ui.internal.view.servers.RenameAction;
+import org.eclipse.wst.server.ui.internal.view.servers.RestartModuleAction;
+import org.eclipse.wst.server.ui.internal.view.servers.ShowInConsoleAction;
+import org.eclipse.wst.server.ui.internal.view.servers.ShowInDebugAction;
+import org.eclipse.wst.server.ui.internal.view.servers.StartAction;
+import org.eclipse.wst.server.ui.internal.view.servers.StartModuleAction;
+import org.eclipse.wst.server.ui.internal.view.servers.StopAction;
+import org.eclipse.wst.server.ui.internal.view.servers.StopModuleAction;
+
+/**
+ * TODO Angel says: Not currently besing used this code was moved up to the ServersView to get similar support
+ * to the old view. If we have an action provider when the ServersView firsts open the ActionProvider has not been 
+ * initilized yet.
+ *
+ */
+public class ServerActionProvider extends CommonActionProvider {
+	private ICommonActionExtensionSite actionSite;
+	private Clipboard clipboard;
+	public ServerActionProvider() {
+		super();
+	}
+	
+	public void init(ICommonActionExtensionSite aSite) {
+		super.init(aSite);
+		this.actionSite = aSite;
+		ICommonViewerSite site = aSite.getViewSite();
+		if( site instanceof ICommonViewerWorkbenchSite ) {
+			StructuredViewer v = aSite.getStructuredViewer();
+			if( v instanceof CommonViewer ) {
+				CommonViewer cv = (CommonViewer)v;
+				ICommonViewerWorkbenchSite wsSite = (ICommonViewerWorkbenchSite)site;
+				addListeners(cv);
+				makeServerActions(cv, wsSite.getSelectionProvider());
+			}
+		}
+	}
+
+
+	// actions on a server
+	protected Action[] actions;
+	protected Action actionModifyModules;
+	protected Action openAction, showInConsoleAction, showInDebugAction, propertiesAction, monitorPropertiesAction;
+	protected Action copyAction, pasteAction, deleteAction, renameAction;
+	protected Action noneAction = new Action(Messages.dialogMonitorNone) {
+		// dummy action
+	};
+
+	private void addListeners(CommonViewer tableViewer) {
+		tableViewer.addOpenListener(new IOpenListener() {
+			public void open(OpenEvent event) {
+				try {
+					IStructuredSelection sel = (IStructuredSelection) event.getSelection();
+					Object data = sel.getFirstElement();
+					if (!(data instanceof IServer))
+						return;
+					IServer server = (IServer) data;
+					ServerUIPlugin.editServer(server);
+				} catch (Exception e) {
+					Trace.trace(Trace.SEVERE, "Could not open server", e);
+				}
+			}
+		});
+	}
+	
+	private void makeServerActions(CommonViewer tableViewer, ISelectionProvider provider) {
+		clipboard = new Clipboard(tableViewer.getTree().getDisplay());
+		Shell shell = tableViewer.getTree().getShell();
+		
+		actions = new Action[6];
+		// create the start actions
+		actions[0] = new StartAction(shell, provider, ILaunchManager.DEBUG_MODE);
+		actions[1] = new StartAction(shell, provider, ILaunchManager.RUN_MODE);
+		actions[2] = new StartAction(shell, provider, ILaunchManager.PROFILE_MODE);
+		
+		// create the stop action
+		actions[3] = new StopAction(shell, provider);
+		
+		// create the publish actions
+		actions[4] = new PublishAction(shell, provider);
+		actions[5] = new PublishCleanAction(shell, provider);
+		
+		// create the open action
+		openAction = new OpenAction(provider);
+
+//		// create copy, paste, and delete actions
+		pasteAction = new PasteAction(shell, provider, clipboard);
+		copyAction = new CopyAction(provider, clipboard, pasteAction);
+		deleteAction = new DeleteAction(shell, provider);
+		renameAction = new RenameAction(shell, tableViewer, provider);
+		
+		// create the other actions
+		actionModifyModules = new ModuleSloshAction(shell, provider);
+		showInConsoleAction = new ShowInConsoleAction(provider);
+		showInDebugAction = new ShowInDebugAction(provider);
+		
+		// create the properties action
+		propertiesAction = new PropertiesAction(shell, provider);
+		monitorPropertiesAction = new PropertiesAction(shell, "org.eclipse.wst.server.ui.properties.monitor", provider);
+	}
+
+	public void fillActionBars(IActionBars actionBars) {
+		actionBars.setGlobalActionHandler("org.eclipse.wst.server.debug", actions[0]);
+		actionBars.setGlobalActionHandler("org.eclipse.wst.server.run", actions[1]);
+		actionBars.setGlobalActionHandler("org.eclipse.wst.server.stop", actions[3]);
+		actionBars.setGlobalActionHandler("org.eclipse.wst.server.publish", actions[4]);
+		actionBars.setGlobalActionHandler("org.eclipse.ui.navigator.Open", openAction);
+		actionBars.setGlobalActionHandler(ActionFactory.PROPERTIES.getId(), propertiesAction);
+		actionBars.updateActionBars();
+		actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);
+		actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), pasteAction);
+		actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction);
+		actionBars.setGlobalActionHandler(ActionFactory.RENAME.getId(), renameAction);
+		
+		IContributionManager cm = actionBars.getToolBarManager();
+		cm.removeAll();
+
+		for (int i = 0; i < actions.length - 1; i++)
+			cm.add(actions[i]);
+	}
+	
+	private static void fillNewContextMenu(Shell shell, ISelection selection, IMenuManager menu) {
+		IAction newServerAction = new NewServerWizardAction();
+		newServerAction.setText(Messages.actionNewServer);
+		menu.add(newServerAction);
+	}
+
+	public void fillContextMenu(IMenuManager menu) {
+		ICommonViewerSite site = actionSite.getViewSite();
+		IStructuredSelection selection = null;
+		Shell shell = actionSite.getViewSite().getShell();
+		if( site instanceof ICommonViewerWorkbenchSite ) {
+			ICommonViewerWorkbenchSite wsSite = (ICommonViewerWorkbenchSite)site;
+			selection = (IStructuredSelection) wsSite.getSelectionProvider().getSelection();
+		}
+
+		IServer server = null;
+		IModule[] module = null;
+		if (selection != null && !selection.isEmpty()) {
+			Iterator iterator = selection.iterator();
+			Object obj = iterator.next();
+			if (obj instanceof IServer)
+				server = (IServer) obj;
+			if (obj instanceof ModuleServer) {
+				ModuleServer ms = (ModuleServer) obj;
+				server = ms.server;
+				module = ms.module;
+			}
+			if (iterator.hasNext()) {
+				server = null;
+				module = null;
+			}
+		}
+		
+		// new action
+		MenuManager newMenu = new MenuManager(Messages.actionNew);
+		fillNewContextMenu(null, selection, newMenu);
+		menu.add(newMenu);
+		
+		// open action
+		if (server != null && module == null) {
+			menu.add(openAction);
+			
+			String text = Messages.actionShowIn;
+			final IWorkbench workbench = PlatformUI.getWorkbench();
+			final IBindingService bindingService = (IBindingService) workbench
+					.getAdapter(IBindingService.class);
+			final TriggerSequence[] activeBindings = bindingService
+					.getActiveBindingsFor("org.eclipse.ui.navigate.showInQuickMenu");
+			if (activeBindings.length > 0) {
+				text += "\t" + activeBindings[0].format();
+			}
+			
+			MenuManager showInMenu = new MenuManager(text);
+			showInMenu.add(showInConsoleAction);
+			showInMenu.add(showInDebugAction);
+			//IActionBars actionBars = getViewSite().getActionBars();
+			//actionBars.setGlobalActionHandler("group.show", showInMenu);
+			menu.add(showInMenu);
+			menu.add(new Separator());
+		} else
+			menu.add(new Separator());
+		
+		if (server != null) {
+			if (module == null) {
+				menu.add(copyAction);
+				menu.add(pasteAction);
+				menu.add(deleteAction);
+				menu.add(renameAction);
+			} else if (module.length == 1)
+				menu.add(new RemoveModuleAction(shell, server, module[0]));
+			menu.add(new Separator());
+		}
+		
+		if (server != null && module == null) {
+			// server actions
+			for (int i = 0; i < actions.length; i++)
+				menu.add(actions[i]);
+			
+			menu.add(new Separator());
+			menu.add(actionModifyModules);
+			
+			// monitor
+			if (server.getServerType() != null) {
+				final MenuManager menuManager = new MenuManager(Messages.actionMonitor);
+				
+				final IServer server2 = server;
+				final Shell shell2 = shell;
+				menuManager.addMenuListener(new IMenuListener() {
+					public void menuAboutToShow(IMenuManager manager) {
+						menuManager.removeAll();
+						if (server2.getAdapter(ServerDelegate.class) != null) {
+							ServerPort[] ports = server2.getServerPorts(null);
+							if (ports != null) {
+								int size = ports.length;
+								for (int i = 0; i < size; i++) {
+									if (!ports[i].isAdvanced())
+										menuManager.add(new MonitorServerPortAction(shell2, server2, ports[i]));
+								}
+							}
+						}
+						
+						if (menuManager.isEmpty())
+							menuManager.add(noneAction);
+						
+						menuManager.add(new Separator());
+						menuManager.add(monitorPropertiesAction);
+					}
+				});
+				
+				// add an initial menu item so that the menu appears correctly
+				noneAction.setEnabled(false);
+				menuManager.add(noneAction);
+				menu.add(menuManager);
+			}
+		}
+		
+		if (server != null && module != null) {
+			menu.add(new Separator());
+			menu.add(new StartModuleAction(server, module));
+			menu.add(new StopModuleAction(server, module));			
+			menu.add(new RestartModuleAction(server, module));
+		}
+		
+		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS+"-end"));
+		
+		if (server != null) {
+			menu.add(new Separator());
+			menu.add(propertiesAction);
+		}
+	}
+}
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerContentProvider.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerContentProvider.java
new file mode 100644
index 0000000..748f483
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerContentProvider.java
@@ -0,0 +1,341 @@
+package org.eclipse.wst.server.ui.internal.view.servers.provisional;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IPublishListener;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.IServerLifecycleListener;
+import org.eclipse.wst.server.core.IServerListener;
+import org.eclipse.wst.server.core.ServerCore;
+import org.eclipse.wst.server.core.ServerEvent;
+import org.eclipse.wst.server.core.internal.Server;
+import org.eclipse.wst.server.core.internal.UpdateServerJob;
+import org.eclipse.wst.server.core.util.PublishAdapter;
+import org.eclipse.wst.server.ui.internal.Messages;
+import org.eclipse.wst.server.ui.internal.Trace;
+import org.eclipse.wst.server.ui.internal.view.servers.ModuleServer;
+import org.eclipse.wst.server.ui.internal.viewers.BaseContentProvider;
+
+public class ServerContentProvider extends BaseContentProvider implements ITreeContentProvider {
+	public static Object INITIALIZING = new Object();
+	protected IServerLifecycleListener serverResourceListener;
+	protected IPublishListener publishListener;
+	protected IServerListener serverListener;
+
+	// servers that are currently publishing and starting
+	protected static Set<String> publishing = new HashSet<String>(4);
+	protected static Set<String> starting = new HashSet<String>(4);
+	protected boolean animationActive = false;
+	protected boolean stopAnimation = false;
+	protected boolean initialized = false;
+	
+	
+	private StructuredViewer viewer;
+	
+	public ServerContentProvider() {
+		addListeners();
+	}
+	
+	public Object[] getElements(Object element) {
+		if( !initialized ) {
+			deferInitialization();
+			return new Object[] {INITIALIZING};
+		}
+		
+		List<IServer> list = new ArrayList<IServer>();
+		IServer[] servers = ServerCore.getServers();
+		if (servers != null) {
+			int size = servers.length;
+			for (int i = 0; i < size; i++) {
+				if (!((Server)servers[i]).isPrivate())
+					list.add(servers[i]);
+			}
+		}
+		return list.toArray();
+	}
+
+	public Object[] getChildren(Object element) {
+		if (element instanceof ModuleServer) {
+			ModuleServer ms = (ModuleServer) element;
+			try {
+				IModule[] children = ms.server.getChildModules(ms.module, null);
+				int size = children.length;
+				ModuleServer[] ms2 = new ModuleServer[size];
+				for (int i = 0; i < size; i++) {
+					int size2 = ms.module.length;
+					IModule[] module = new IModule[size2 + 1];
+					System.arraycopy(ms.module, 0, module, 0, size2);
+					module[size2] = children[i];
+					ms2[i] = new ModuleServer(ms.server, module);
+				}
+				return ms2;
+			} catch (Exception e) {
+				return null;
+			}
+		}
+		
+		IServer server = (IServer) element;
+		IModule[] modules = server.getModules(); 
+		int size = modules.length;
+		ModuleServer[] ms = new ModuleServer[size];
+		for (int i = 0; i < size; i++) {
+			ms[i] = new ModuleServer(server, new IModule[] { modules[i] });
+		}
+		return ms;
+	}
+
+	public Object getParent(Object element) {
+		if (element instanceof ModuleServer) {
+			ModuleServer ms = (ModuleServer) element;
+			return ms.server;
+		}
+		return null;
+	}
+
+	public boolean hasChildren(Object element) {
+		if (element instanceof ModuleServer) {
+			// Check if the module server has child modules.
+			ModuleServer curModuleServer = (ModuleServer)element;
+			IServer curServer = curModuleServer.server;
+			IModule[] curModule = curModuleServer.module;
+			if (curServer != null &&  curModule != null) {
+				IModule[] curChildModule = curServer.getChildModules(curModule, null);
+				if (curChildModule != null && curChildModule.length > 0)
+					return true;
+				
+				return false;
+			}
+			
+			return false;
+		}
+		if( element instanceof IServer ) {
+			return ((IServer) element).getModules().length > 0;
+		}
+		return false;
+	}
+	
+	public void inputChanged(Viewer aViewer, Object oldInput, Object newInput) {
+		viewer = (StructuredViewer) aViewer;
+	}
+
+	public void dispose() {
+		ServerCore.removeServerLifecycleListener(serverResourceListener);
+		
+		// remove listeners from servers
+		IServer[] servers = ServerCore.getServers();
+		if (servers != null) {
+			int size = servers.length;
+			for (int i = 0; i < size; i++) {
+				servers[i].removeServerListener(serverListener);
+				((Server) servers[i]).removePublishListener(publishListener);
+			}
+		}
+	}
+
+	// Listeners and refreshing the viewer
+	protected void addListeners() {
+		serverResourceListener = new IServerLifecycleListener() {
+			public void serverAdded(IServer server) {
+				refreshServer(null);
+				server.addServerListener(serverListener);
+				((Server) server).addPublishListener(publishListener);
+			}
+			public void serverChanged(IServer server) {
+				refreshServer(server);
+			}
+			public void serverRemoved(IServer server) {
+				refreshServer(null);
+				server.removeServerListener(serverListener);
+				((Server) server).removePublishListener(publishListener);
+			}
+		};
+		ServerCore.addServerLifecycleListener(serverResourceListener);
+		
+		publishListener = new PublishAdapter() {
+			public void publishStarted(IServer server) {
+				handlePublishChange(server, true);
+			}
+			
+			public void publishFinished(IServer server, IStatus status) {
+				handlePublishChange(server, false);
+			}
+		};
+		
+		serverListener = new IServerListener() {
+			public void serverChanged(ServerEvent event) {
+				if (event == null)
+					return;
+				
+				int eventKind = event.getKind();
+				IServer server = event.getServer();
+				if ((eventKind & ServerEvent.SERVER_CHANGE) != 0) {
+					// server change event
+					if ((eventKind & ServerEvent.STATE_CHANGE) != 0) {
+						refreshServer(server, true);
+						int state = event.getState();
+						String id = server.getId();
+						if (state == IServer.STATE_STARTING || state == IServer.STATE_STOPPING) {
+							boolean startThread = false;
+							synchronized (starting) {
+								if (!starting.contains(id)) {
+									if (starting.isEmpty())
+										startThread = true;
+									starting.add(id);
+								}
+							}
+							if (startThread)
+								startThread();
+						} else {
+							boolean stopThread = false;
+							synchronized (starting) {
+								if (starting.contains(id)) {
+									starting.remove(id);
+									if (starting.isEmpty())
+										stopThread = true;
+								}
+							}
+							if (stopThread)
+								stopThread();
+						}
+					} else
+						refreshServer(server);
+				} else if ((eventKind & ServerEvent.MODULE_CHANGE) != 0) {
+					// module change event
+					if ((eventKind & ServerEvent.STATE_CHANGE) != 0 || (eventKind & ServerEvent.PUBLISH_STATE_CHANGE) != 0) {
+						refreshServer(server);
+					}
+				}
+			}
+		};
+		
+		// add listeners to servers
+		IServer[] servers = ServerCore.getServers();
+		if (servers != null) {
+			int size = servers.length;
+			for (int i = 0; i < size; i++) {
+				servers[i].addServerListener(serverListener);
+				((Server) servers[i]).addPublishListener(publishListener);
+			}
+		}
+	}
+
+	protected void deferInitialization() {
+		Job job = new Job(Messages.jobInitializingServersView) {
+			public IStatus run(IProgressMonitor monitor) {
+				IServer[] servers = ServerCore.getServers();
+				int size = servers.length;
+				for (int i = 0; i < size; i++) {
+					((Server)servers[i]).getAllModules().iterator();
+				}
+				
+				for (int i = 0; i < size; i++) {
+					IServer server = servers[i];
+					if (server.getServerType() != null && server.getServerState() == IServer.STATE_UNKNOWN) {
+						UpdateServerJob job2 = new UpdateServerJob(server);
+						job2.schedule();
+					}
+				}
+				initialized = true;
+				refreshServer(null);
+				return Status.OK_STATUS;
+			}
+		};
+		
+		job.setSystem(true);
+		job.setPriority(Job.SHORT);
+		job.schedule();
+	}
+	
+	protected void refreshServer(final IServer server) {
+		refreshServer(server, false);
+	}
+	
+	protected void refreshServer(final IServer server, final boolean resetSelection) {
+		Display.getDefault().asyncExec(new Runnable() {
+			@SuppressWarnings("synthetic-access")
+			public void run() {
+				try {
+					if( viewer != null && !viewer.getControl().isDisposed()) {
+						viewer.refresh(server);
+						if( resetSelection ) {
+							ISelection sel = viewer.getSelection();
+							viewer.setSelection(sel);
+						}
+						ServerDecorator.getDefault().redecorate(server);
+					}
+				} catch (Exception e) {
+					// ignore
+				}
+			}
+		});
+	}
+	
+	protected void handlePublishChange(IServer server, boolean isPublishing) {
+		String serverId = server.getId();
+		if (isPublishing)
+			publishing.add(serverId);
+		else
+			publishing.remove(serverId);
+	
+		refreshServer(server);
+	}
+
+	
+	protected void startThread() {
+		if (animationActive)
+			return;
+		
+		stopAnimation = false;
+		
+		final Display display = viewer == null ? Display.getDefault() : viewer.getControl().getDisplay();
+		final int SLEEP = 200;
+		final Runnable[] animator = new Runnable[1];
+		animator[0] = new Runnable() {
+			public void run() {
+				if (!stopAnimation) {
+					try {
+						int size = 0;
+						String[] servers;
+						synchronized (starting) {
+							size = starting.size();
+							servers = new String[size];
+							starting.toArray(servers);
+						}
+						
+						for (int i = 0; i < size; i++) {
+							IServer server = ServerCore.findServer(servers[i]);
+							if (server != null ) {
+								ServerDecorator.animate();
+								refreshServer(server);
+							}
+						}
+					} catch (Exception e) {
+						Trace.trace(Trace.FINEST, "Error in Servers view animation", e);
+					}
+					display.timerExec(SLEEP, animator[0]);
+				}
+			}
+		};
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				display.timerExec(SLEEP, animator[0]);
+			}
+		});
+	}
+
+	protected void stopThread() {
+		stopAnimation = true;
+	}}
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerDecorator.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerDecorator.java
new file mode 100644
index 0000000..edeaa45
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerDecorator.java
@@ -0,0 +1,196 @@
+package org.eclipse.wst.server.ui.internal.view.servers.provisional;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.LabelProviderChangedEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.IServerType;
+import org.eclipse.wst.server.core.internal.Server;
+import org.eclipse.wst.server.ui.ServerUICore;
+import org.eclipse.wst.server.ui.internal.ImageResource;
+import org.eclipse.wst.server.ui.internal.Messages;
+import org.eclipse.wst.server.ui.internal.ServerUIPlugin;
+import org.eclipse.wst.server.ui.internal.provisional.UIDecoratorManager;
+import org.eclipse.wst.server.ui.internal.view.servers.ModuleServer;
+
+public class ServerDecorator extends LabelProvider implements ILightweightLabelDecorator {
+
+	public static final String[] syncState = new String[] {
+		Messages.viewSyncOkay,
+		Messages.viewSyncRestart,
+		Messages.viewSyncPublish,
+		Messages.viewSyncRestartPublish,
+		Messages.viewSyncPublishing};
+
+	public static final String[] syncStateUnmanaged = new String[] {
+		Messages.viewSyncOkay2,
+		Messages.viewSyncRestart2,
+		Messages.viewSyncPublish2,
+		Messages.viewSyncRestartPublish2,
+		Messages.viewSyncPublishing2};
+
+	public static final String[] modulePublishState = new String[] {
+		"",
+		Messages.viewSyncOkay,
+		Messages.viewSyncPublish,
+		Messages.viewSyncPublish};
+
+	private static ServerDecorator instance;
+	public static ServerDecorator getDefault() {
+		return instance;
+	}
+
+	private static int count = 0;
+	public static void animate() {
+		count = (count + 1)%3;
+	}
+	public static int getCount() {
+		return count;
+	}
+	
+	public ServerDecorator() {
+		instance = this;
+	}
+
+	public void decorate(Object element, IDecoration decoration) {
+		if( element instanceof IServer ) {
+			String state = getServerStateLabel((IServer)element);
+			String status = getServerStatusLabel((IServer)element);
+			decoration.addSuffix(combine(state, status));
+		} else if( element instanceof ModuleServer ) {
+			String state = getModuleStateText((ModuleServer)element);
+			String status = getModuleStatusText((ModuleServer)element);
+			decoration.addSuffix(combine(state, status));
+		}
+	}
+	
+	protected String combine(String state, String status) {
+		if(isEmpty(state) && isEmpty(status))
+			return "";
+		if( isEmpty(state))
+			return "  [" + status + "]";
+		if( isEmpty(status))
+			return "  [" + state + "]";
+		return "  [" + state + ", " + status + "]";
+	}
+	
+	protected boolean isEmpty(String s) {
+		return (s == null || "".equals(s));
+	}
+	
+	public void redecorate(IServer server) {
+		fireLabelProviderChanged(new LabelProviderChangedEvent(this));
+	}
+
+	
+	
+	/*
+	 * Utility methods
+	 */
+	public static Image getServerImage(IServer server) {
+		return server == null ? null : 
+			server.getServerType() == null ? null : 
+				ImageResource.getImage(server.getServerType().getId());
+	}
+	
+	public static String getServerStateLabel(IServer server) {
+		return server == null ? null : 
+			server.getServerType() == null ? null : 
+				getStateLabel(server.getServerType(), server.getServerState(), server.getMode());
+	}
+
+	public static String getStateLabel(IServerType serverType, int state, String mode) {
+		return serverType == null ? null : 
+			UIDecoratorManager.getUIDecorator(serverType).getStateLabel(state, mode, count);
+	}
+	
+	public static String getServerStatusLabel(IServer server) {
+		IStatus status = ((Server) server).getServerStatus();
+		if (status != null)
+			return status.getMessage();
+		
+		if (server.getServerType() == null)
+			return "";
+
+		if (server.getServerState() == IServer.STATE_UNKNOWN)
+			return "";
+		
+		String serverId = server.getId();
+		if (ServerContentProvider.publishing.contains(serverId))
+			return ServerDecorator.syncState[4];
+		
+		// republish
+		int i = 0;
+		if (server.shouldPublish()) {
+			if (((Server)server).isPublishUnknown())
+				return "";
+			i += 2;
+		}
+		
+		if (server.shouldRestart())
+			i = 1;
+		
+		return syncState[i];
+	}
+
+	public static Image getServerStateImage(IServer server) {
+		return server == null ? null : 
+			getStateImage(server.getServerType(), server.getServerState(), server.getMode());
+	}
+
+	public static Image getStateImage(IServerType serverType, int state, String mode) {
+		return serverType == null ? null : 
+			UIDecoratorManager.getUIDecorator(serverType).getStateImage(state, mode, getCount());
+	}
+	
+	public static String getModuleText(ModuleServer ms ) { 
+		if (ms == null || ms.module == null)
+			return "";
+		int size = ms.module.length;
+		return ms.module[size - 1].getName();
+	}
+	
+	public static Image getModuleImage(ModuleServer ms) {
+		if( ms != null ) {
+			ILabelProvider labelProvider = ServerUICore.getLabelProvider();
+			Image image = labelProvider.getImage(ms.module[ms.module.length - 1]);
+			labelProvider.dispose();
+			return image;
+		} 
+		return null;
+	}
+	
+	public static String getModuleStateText(ModuleServer ms) {
+		return "";
+	}
+	
+	public static String getModuleStatusText(ModuleServer ms) {
+		if( ms != null && ms.server != null && ms.module != null ) {
+			IStatus status = ((Server) ms.server).getModuleStatus(ms.module);
+			if (status != null)
+				return status.getMessage();
+			
+			return modulePublishState[ms.server.getModulePublishState(ms.module)];
+		}
+		return "";
+	}
+	
+	public static Image getModuleStatusImage(ModuleServer ms) {
+		IStatus status = ((Server) ms.server).getModuleStatus(ms.module);
+		if (status != null) {
+			ISharedImages sharedImages = ServerUIPlugin.getInstance().getWorkbench().getSharedImages();
+			if (status.getSeverity() == IStatus.ERROR)
+				return sharedImages.getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
+			else if (status.getSeverity() == IStatus.WARNING)
+				return sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
+			else if (status.getSeverity() == IStatus.INFO)
+				return sharedImages.getImage(ISharedImages.IMG_OBJS_INFO_TSK);
+		}
+		return null;
+	}
+}
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerLabelProvider.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerLabelProvider.java
new file mode 100644
index 0000000..d59d08b
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServerLabelProvider.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.server.ui.internal.view.servers.provisional;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.ui.ServerUICore;
+import org.eclipse.wst.server.ui.internal.ImageResource;
+import org.eclipse.wst.server.ui.internal.Messages;
+import org.eclipse.wst.server.ui.internal.view.servers.ModuleServer;
+/**
+ * Server table label provider.
+ */
+public class ServerLabelProvider extends LabelProvider {
+
+	/**
+	 * ServerTableLabelProvider constructor comment.
+	 */
+	public ServerLabelProvider() {
+		super();
+	}
+
+	public String getText(Object element) {
+		if (element instanceof ModuleServer) {
+			ModuleServer ms = (ModuleServer) element;
+			if (ms.module == null)
+				return "";
+			int size = ms.module.length;
+			String name = ms.module[size - 1].getName();
+			return name;
+		}
+		
+		if( element instanceof IServer ) {
+			IServer server = (IServer) element;
+			return notNull(server.getName());
+		} 
+		
+		if( element == ServerContentProvider.INITIALIZING)
+			return Messages.viewInitializing;
+
+		return "-";
+	}
+	public Image getImage(Object element) {
+		Image image = null;
+		if (element instanceof ModuleServer) {
+			ModuleServer ms = (ModuleServer) element;
+			ILabelProvider labelProvider = ServerUICore.getLabelProvider();
+			image = labelProvider.getImage(ms.module[ms.module.length - 1]);
+			labelProvider.dispose();
+		} else if( element instanceof IServer ) {
+			IServer server = (IServer) element;
+			if (server.getServerType() != null) {
+				image = ImageResource.getImage(server.getServerType().getId());
+			}
+		}
+		return image;
+	}
+
+	protected String notNull(String s) {
+		if (s == null)
+			return "";
+		return s;
+	}
+
+	public boolean isLabelProperty(Object element, String property) {
+		return false;
+	}
+}
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServersView.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServersView.java
new file mode 100644
index 0000000..547b438
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/provisional/ServersView.java
@@ -0,0 +1,413 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.server.ui.internal.view.servers.provisional;
+
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.bindings.TriggerSequence;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.keys.IBindingService;
+import org.eclipse.ui.navigator.CommonNavigator;
+import org.eclipse.ui.navigator.CommonViewer;
+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.ServerPort;
+import org.eclipse.wst.server.core.internal.Server;
+import org.eclipse.wst.server.core.internal.UpdateServerJob;
+import org.eclipse.wst.server.core.model.ServerDelegate;
+import org.eclipse.wst.server.ui.internal.Messages;
+import org.eclipse.wst.server.ui.internal.ServerToolTip;
+import org.eclipse.wst.server.ui.internal.ServerUIPlugin;
+import org.eclipse.wst.server.ui.internal.Trace;
+import org.eclipse.wst.server.ui.internal.actions.NewServerWizardAction;
+import org.eclipse.wst.server.ui.internal.view.servers.CopyAction;
+import org.eclipse.wst.server.ui.internal.view.servers.DeleteAction;
+import org.eclipse.wst.server.ui.internal.view.servers.ModuleServer;
+import org.eclipse.wst.server.ui.internal.view.servers.ModuleSloshAction;
+import org.eclipse.wst.server.ui.internal.view.servers.MonitorServerPortAction;
+import org.eclipse.wst.server.ui.internal.view.servers.OpenAction;
+import org.eclipse.wst.server.ui.internal.view.servers.PasteAction;
+import org.eclipse.wst.server.ui.internal.view.servers.PropertiesAction;
+import org.eclipse.wst.server.ui.internal.view.servers.PublishAction;
+import org.eclipse.wst.server.ui.internal.view.servers.PublishCleanAction;
+import org.eclipse.wst.server.ui.internal.view.servers.RemoveModuleAction;
+import org.eclipse.wst.server.ui.internal.view.servers.RenameAction;
+import org.eclipse.wst.server.ui.internal.view.servers.RestartModuleAction;
+import org.eclipse.wst.server.ui.internal.view.servers.ShowInConsoleAction;
+import org.eclipse.wst.server.ui.internal.view.servers.ShowInDebugAction;
+import org.eclipse.wst.server.ui.internal.view.servers.StartAction;
+import org.eclipse.wst.server.ui.internal.view.servers.StartModuleAction;
+import org.eclipse.wst.server.ui.internal.view.servers.StopAction;
+import org.eclipse.wst.server.ui.internal.view.servers.StopModuleAction;
+/**
+ * A view of servers, their modules, and status.
+ */
+public class ServersView extends CommonNavigator {
+	
+	protected CommonViewer tableViewer;
+	
+	protected Clipboard clipboard;
+	
+	protected Action noneAction = new Action(Messages.dialogMonitorNone) {
+		// dummy action
+	};
+	
+	// actions on a server
+	protected Action[] actions;
+	protected Action actionModifyModules;
+	protected Action openAction, showInConsoleAction, showInDebugAction, propertiesAction, monitorPropertiesAction;
+	protected Action copyAction, pasteAction, deleteAction, renameAction;
+	
+	/**
+	 * ServersView constructor comment.
+	 */
+	public ServersView() {
+		super();
+	}
+
+	@Override
+	public void createPartControl(Composite parent) {
+		super.createPartControl(parent);
+		
+		clipboard = new Clipboard(getCommonViewer().getControl().getDisplay());
+		
+		deferInitialization();
+	}
+	
+	private void deferInitialization() {
+		TreeItem item = new TreeItem(getCommonViewer().getTree(), SWT.NONE);
+		item.setText(Messages.viewInitializing);
+			
+		initializeActions(getCommonViewer());
+		
+		Job job = new Job(Messages.jobInitializingServersView) {
+			public IStatus run(IProgressMonitor monitor) {
+				IServer[] servers = ServerCore.getServers();
+				int size = servers.length;
+				for (int i = 0; i < size; i++) {
+					((Server)servers[i]).getAllModules().iterator();
+					/*while (iterator.hasNext()) {
+						Module module = (Module) iterator.next();
+						module.g
+					}*/
+				}
+				
+
+				Display.getDefault().asyncExec(new Runnable() {
+					public void run() {
+						try {
+							deferredInitialize();
+						} catch (Exception e) {
+							// ignore - view has already been closed
+						}
+					}
+				});
+				return Status.OK_STATUS;
+			}
+		};
+		
+		job.setSystem(true);
+		job.setPriority(Job.SHORT);
+		job.schedule();
+	}
+	
+	protected void deferredInitialize() {
+		// TODO Angel says: What to do here? 
+		//tableViewer.initialize();				
+		
+		// TODO Angel says: This probably shouldn't be here 
+		tableViewer = getCommonViewer();
+		
+		tableViewer.addOpenListener(new IOpenListener() {
+			public void open(OpenEvent event) {
+				try {
+					IStructuredSelection sel = (IStructuredSelection) event.getSelection();
+					Object data = sel.getFirstElement();
+					if (!(data instanceof IServer))
+						return;
+					IServer server = (IServer) data;
+					ServerUIPlugin.editServer(server);
+				} catch (Exception e) {
+					Trace.trace(Trace.SEVERE, "Could not open server", e);
+				}
+			}
+		});
+		
+		MenuManager menuManager = new MenuManager("#PopupMenu");
+		menuManager.setRemoveAllWhenShown(true);
+		final Shell shell = tableViewer.getTree().getShell();
+		menuManager.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager mgr) {
+				fillContextMenu(shell, mgr);
+			}
+		});
+		Menu menu = menuManager.createContextMenu(tableViewer.getTree());
+		tableViewer.getTree().setMenu(menu);
+		getSite().registerContextMenu(menuManager, tableViewer);
+		getSite().setSelectionProvider(tableViewer);
+		
+		//TODO Angel: What to do here?
+		//initDragAndDrop();
+		
+		// init the tooltip
+		ServerToolTip toolTip = new ServerToolTip(tableViewer.getTree());
+		toolTip.setShift(new Point(10, 3));
+		toolTip.setPopupDelay(400); // in ms
+		toolTip.setHideOnMouseDown(true);
+		toolTip.activate();
+		
+		if (tableViewer.getTree().getItemCount() > 0) {
+			Object obj = tableViewer.getTree().getItem(0).getData();
+			tableViewer.setSelection(new StructuredSelection(obj));
+		}
+		
+		Thread thread = new Thread() {
+			public void run() {
+				try {
+					Thread.sleep(5000);
+				} catch (Exception e) {
+					// ignore
+				}
+				IServer[] servers = ServerCore.getServers();
+				int size = servers.length;
+				for (int i = 0; i < size; i++) {
+					IServer server = servers[i];
+					if (server.getServerType() != null && server.getServerState() == IServer.STATE_UNKNOWN) {
+						UpdateServerJob job = new UpdateServerJob(server);
+						job.schedule();
+					}
+				}
+			}
+		};
+		thread.setDaemon(true);
+		thread.setPriority(Thread.MIN_PRIORITY + 1);
+		thread.start();
+	}
+	
+	
+	protected void fillContextMenu(Shell shell, IMenuManager menu) {
+		// get selection but avoid no selection or multiple selection
+		IServer server = null;
+		IModule[] module = null;
+		IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
+		if (!selection.isEmpty()) {
+			Iterator iterator = selection.iterator();
+			Object obj = iterator.next();
+			if (obj instanceof IServer)
+				server = (IServer) obj;
+			if (obj instanceof ModuleServer) {
+				ModuleServer ms = (ModuleServer) obj;
+				server = ms.server;
+				module = ms.module;
+			}
+			if (iterator.hasNext()) {
+				server = null;
+				module = null;
+			}
+		}
+		
+		// new action
+		MenuManager newMenu = new MenuManager(Messages.actionNew);
+		fillNewContextMenu(null, selection, newMenu);
+		menu.add(newMenu);
+		
+		// open action
+		if (server != null && module == null) {
+			menu.add(openAction);
+			
+			String text = Messages.actionShowIn;
+			final IWorkbench workbench = PlatformUI.getWorkbench();
+			final IBindingService bindingService = (IBindingService) workbench
+					.getAdapter(IBindingService.class);
+			final TriggerSequence[] activeBindings = bindingService
+					.getActiveBindingsFor("org.eclipse.ui.navigate.showInQuickMenu");
+			if (activeBindings.length > 0) {
+				text += "\t" + activeBindings[0].format();
+			}
+			
+			MenuManager showInMenu = new MenuManager(text);
+			showInMenu.add(showInConsoleAction);
+			showInMenu.add(showInDebugAction);
+			//IActionBars actionBars = getViewSite().getActionBars();
+			//actionBars.setGlobalActionHandler("group.show", showInMenu);
+			menu.add(showInMenu);
+			menu.add(new Separator());
+		} else
+			menu.add(new Separator());
+		
+		if (server != null) {
+			if (module == null) {
+				menu.add(copyAction);
+				menu.add(pasteAction);
+				menu.add(deleteAction);
+				menu.add(renameAction);
+			} else if (module.length == 1)
+				menu.add(new RemoveModuleAction(shell, server, module[0]));
+			menu.add(new Separator());
+		}
+		
+		if (server != null && module == null) {
+			// server actions
+			for (int i = 0; i < actions.length; i++)
+				menu.add(actions[i]);
+			
+			menu.add(new Separator());
+			menu.add(actionModifyModules);
+			
+			// monitor
+			if (server.getServerType() != null) {
+				final MenuManager menuManager = new MenuManager(Messages.actionMonitor);
+				
+				final IServer server2 = server;
+				final Shell shell2 = shell;
+				menuManager.addMenuListener(new IMenuListener() {
+					public void menuAboutToShow(IMenuManager manager) {
+						menuManager.removeAll();
+						if (server2.getAdapter(ServerDelegate.class) != null) {
+							ServerPort[] ports = server2.getServerPorts(null);
+							if (ports != null) {
+								int size = ports.length;
+								for (int i = 0; i < size; i++) {
+									if (!ports[i].isAdvanced())
+										menuManager.add(new MonitorServerPortAction(shell2, server2, ports[i]));
+								}
+							}
+						}
+						
+						if (menuManager.isEmpty())
+							menuManager.add(noneAction);
+						
+						menuManager.add(new Separator());
+						menuManager.add(monitorPropertiesAction);
+					}
+				});
+				
+				// add an initial menu item so that the menu appears correctly
+				noneAction.setEnabled(false);
+				menuManager.add(noneAction);
+				menu.add(menuManager);
+			}
+		}
+		
+		if (server != null && module != null) {
+			menu.add(new Separator());
+			menu.add(new StartModuleAction(server, module));
+			menu.add(new StopModuleAction(server, module));			
+			menu.add(new RestartModuleAction(server, module));
+		}
+		
+		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS+"-end"));
+		
+		if (server != null) {
+			menu.add(new Separator());
+			menu.add(propertiesAction);
+		}
+	}
+
+	
+	private static void fillNewContextMenu(Shell shell, ISelection selection, IMenuManager menu) {
+		IAction newServerAction = new NewServerWizardAction();
+		newServerAction.setText(Messages.actionNewServer);
+		menu.add(newServerAction);
+	}
+	
+	
+	/**
+	 * Initialize actions
+	 * 
+	 * @param provider a selection provider
+	 */
+	public void initializeActions(ISelectionProvider provider) {
+		Shell shell = getSite().getShell();
+		IActionBars actionBars = getViewSite().getActionBars();
+		
+		actions = new Action[6];
+		// create the start actions
+		actions[0] = new StartAction(shell, provider, ILaunchManager.DEBUG_MODE);
+		actionBars.setGlobalActionHandler("org.eclipse.wst.server.debug", actions[0]);
+		actions[1] = new StartAction(shell, provider, ILaunchManager.RUN_MODE);
+		actionBars.setGlobalActionHandler("org.eclipse.wst.server.run", actions[1]);
+		actions[2] = new StartAction(shell, provider, ILaunchManager.PROFILE_MODE);
+		
+		// create the stop action
+		actions[3] = new StopAction(shell, provider);
+		actionBars.setGlobalActionHandler("org.eclipse.wst.server.stop", actions[3]);
+		
+		// create the publish actions
+		actions[4] = new PublishAction(shell, provider);
+		actionBars.setGlobalActionHandler("org.eclipse.wst.server.publish", actions[4]);
+		actions[5] = new PublishCleanAction(shell, provider);
+		
+		// create the open action
+		openAction = new OpenAction(provider);
+		actionBars.setGlobalActionHandler("org.eclipse.ui.navigator.Open", openAction);
+		
+		// create copy, paste, and delete actions
+		pasteAction = new PasteAction(shell, provider,  clipboard);
+		copyAction = new CopyAction(provider, clipboard, pasteAction);
+		deleteAction = new DeleteAction(shell, provider);
+		renameAction = new RenameAction(shell, getCommonViewer(), provider);
+		actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);
+		actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), pasteAction);
+		actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction);
+		actionBars.setGlobalActionHandler(ActionFactory.RENAME.getId(), renameAction);
+		
+		// create the other actions
+		actionModifyModules = new ModuleSloshAction(shell, provider);
+		showInConsoleAction = new ShowInConsoleAction(provider);
+		showInDebugAction = new ShowInDebugAction(provider);
+		
+		// create the properties action
+		propertiesAction = new PropertiesAction(shell, provider);
+		actionBars.setGlobalActionHandler(ActionFactory.PROPERTIES.getId(), propertiesAction);
+		monitorPropertiesAction = new PropertiesAction(shell, "org.eclipse.wst.server.ui.properties.monitor", provider);
+		
+		// add toolbar buttons
+		IContributionManager cm = actionBars.getToolBarManager();
+		for (int i = 0; i < actions.length - 1; i++)
+			cm.add(actions[i]);
+		
+		cm.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+	}
+	
+}