diff --git a/jetty-deploy-manager-graph/.gitignore b/jetty-deploy-manager-graph/.gitignore
deleted file mode 100644
index 796b602..0000000
--- a/jetty-deploy-manager-graph/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-target/
-.classpath
-.project
-.settings
-*/src/main/java/META-INF/
-*.log
-*.swp
-*.diff
-*.patch
diff --git a/jetty-deploy-manager-graph/pom.xml b/jetty-deploy-manager-graph/pom.xml
deleted file mode 100644
index 5512b02..0000000
--- a/jetty-deploy-manager-graph/pom.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.eclipse.jetty</groupId>
-    <artifactId>jetty-project</artifactId>
-    <version>7.0.2-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>jetty-deploy-manager-graph</artifactId>
-  <name>Jetty :: Deployment Manager Graph Based</name>
-  <description>Jetty Deployment Manager</description>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <version>${felix.bundle.version}</version>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <!-- always include sources since jetty-xbean makes use of them -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-source-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-sources</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-  <dependencies>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-xml</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp-verifier</artifactId>
-      <version>${project.version}</version>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.7</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-javadoc-plugin</artifactId>
-        <version>2.5</version>
-        <configuration>
-          <docfilessubdirs>true</docfilessubdirs>
-          <detectLinks>true</detectLinks>
-          <detectJavaApiLink>true</detectJavaApiLink>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/App.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/App.java
deleted file mode 100644
index 6ef27bd..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/App.java
+++ /dev/null
@@ -1,220 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jetty.deploy.util.FileID;
-import org.eclipse.jetty.server.handler.ContextHandler;
-import org.eclipse.jetty.util.AttributesMap;
-import org.eclipse.jetty.util.URIUtil;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.webapp.WebAppContext;
-import org.eclipse.jetty.xml.XmlConfiguration;
-import org.xml.sax.SAXException;
-
-/**
- * The information about an App that is managed by the {@link DeploymentManager}
- */
-public class App
-{
-    private File archivePath;
-    private ContextHandler handler;
-    private boolean extractWars = false;
-    private boolean parentLoaderPriority = false;
-    private String defaultsDescriptor;
-    private String originId;
-
-    /**
-     * Create an App with specified Origin ID and archivePath
-     * 
-     * @param originId
-     *            the origin ID (The ID that the {@link AppProvider} knows about)
-     * @param archivePath
-     *            the path to the app (can be a file *.war or *.jar, or a webapp exploded directory)
-     * @see App#getOriginId()
-     * @see App#getContextId()
-     */
-    public App(String originId, File archivePath)
-    {
-        this.originId = originId;
-        this.archivePath = archivePath;
-    }
-
-    /**
-     * Get the archive path to the App.
-     * 
-     * Might exist as a Directory (example: an exploded webapp, or a jetty:run) or a File (example: a WAR file)
-     * 
-     * @return the
-     */
-    public File getArchivePath()
-    {
-        return this.archivePath;
-    }
-
-    /**
-     * Get ContextHandler for the App.
-     * 
-     * Create it if needed.
-     * 
-     * @return the {@link ContextHandler} to use for the App when fully started. (Portions of which might be ignored
-     *         when App is in the {@link AppState#STAGED} state}
-     * @throws Exception
-     */
-    public ContextHandler getContextHandler(DeploymentManager deployMgr) throws Exception
-    {
-        if (handler == null)
-        {
-            if (FileID.isXmlFile(archivePath))
-            {
-                this.handler = createContextFromXml(deployMgr);
-            }
-            else if (FileID.isWebArchive(archivePath))
-            {
-                // Treat as a Web Archive.
-                this.handler = createContextDefault(deployMgr);
-            }
-            else
-            {
-                throw new IllegalStateException("Not an XML or Web Archive: " + archivePath.getAbsolutePath());
-            }
-
-            this.handler.setAttributes(new AttributesMap(deployMgr.getContextAttributes()));
-        }
-        return handler;
-    }
-
-    private ContextHandler createContextDefault(DeploymentManager deploymgr)
-    {
-        String context = archivePath.getName();
-
-        // Context Path is the same as the archive.
-        if (FileID.isWebArchiveFile(archivePath))
-        {
-            context = context.substring(0,context.length() - 4);
-        }
-
-        // Context path is "/" in special case of archive (or dir) named "root" 
-        if (context.equalsIgnoreCase("root") || context.equalsIgnoreCase("root/"))
-        {
-            context = URIUtil.SLASH;
-        }
-
-        // Ensure "/" is Prepended to all context paths.
-        if (context.charAt(0) != '/')
-        {
-            context = "/" + context;
-        }
-
-        // Ensure "/" is Not Trailing in context paths.
-        if (context.endsWith("/") && context.length() > 0)
-        {
-            context = context.substring(0,context.length() - 1);
-        }
-
-        WebAppContext wah = new WebAppContext();
-        wah.setContextPath(context);
-        wah.setWar(archivePath.getAbsolutePath());
-        if (defaultsDescriptor != null)
-        {
-            wah.setDefaultsDescriptor(defaultsDescriptor);
-        }
-        wah.setExtractWAR(extractWars);
-        wah.setParentLoaderPriority(parentLoaderPriority);
-
-        return wah;
-    }
-
-    @SuppressWarnings("unchecked")
-    private ContextHandler createContextFromXml(DeploymentManager deploymgr) throws MalformedURLException, IOException, SAXException, Exception
-    {
-        Resource resource = Resource.newResource(this.archivePath.toURI());
-        if (!resource.exists())
-        {
-            return null;
-        }
-
-        XmlConfiguration xmlc = new XmlConfiguration(resource.getURL());
-        Map props = new HashMap();
-        props.put("Server",deploymgr.getServer());
-        if (deploymgr.getConfigurationManager() != null)
-        {
-            props.putAll(deploymgr.getConfigurationManager().getProperties());
-        }
-
-        xmlc.setProperties(props);
-        return (ContextHandler)xmlc.configure();
-    }
-
-    public boolean isExtractWars()
-    {
-        return extractWars;
-    }
-
-    public void setExtractWars(boolean extractWars)
-    {
-        this.extractWars = extractWars;
-    }
-
-    public boolean isParentLoaderPriority()
-    {
-        return parentLoaderPriority;
-    }
-
-    public void setParentLoaderPriority(boolean parentLoaderPriority)
-    {
-        this.parentLoaderPriority = parentLoaderPriority;
-    }
-
-    public String getDefaultsDescriptor()
-    {
-        return defaultsDescriptor;
-    }
-
-    public void setDefaultsDescriptor(String defaultsDescriptor)
-    {
-        this.defaultsDescriptor = defaultsDescriptor;
-    }
-
-    /**
-     * The unique id of the {@link App} relating to how it is installed on the jetty server side.
-     * 
-     * @return the generated Id for the App.
-     */
-    public String getContextId()
-    {
-        if (this.handler == null)
-        {
-            return null;
-        }
-        return this.handler.getContextPath();
-    }
-
-    /**
-     * The origin of this {@link App} as specified by the {@link AppProvider}
-     * 
-     * @return String representing the origin of this app.
-     */
-    public String getOriginId()
-    {
-        return this.originId;
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/AppLifeCycle.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/AppLifeCycle.java
deleted file mode 100644
index 49c3dea..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/AppLifeCycle.java
+++ /dev/null
@@ -1,192 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jetty.deploy.graph.Graph;
-import org.eclipse.jetty.deploy.graph.Node;
-import org.eclipse.jetty.util.log.Log;
-
-/**
- * The lifecycle of an App in the {@link DeploymentManager}.
- * 
- * Setups a the default {@link Graph}, and manages the bindings to the life cycle via the {@link DeployLifeCycleBinding}
- * annotation.
- * <p>
- * <img src="doc-files/AppLifeCycle.png">
- */
-public class AppLifeCycle extends Graph
-{
-    public static interface Binding
-    {
-        /**
-         * Get a list of targets that this implementation should bind to.
-         * 
-         * @return the array of String node names to bind to. (use <code>"*"</code> to bind to all known node names)
-         */
-        String[] getBindingTargets();
-
-        /**
-         * Event called to process a {@link AppLifeCycle} binding.
-         * 
-         * @param node
-         *            the node being processed
-         * @param app
-         *            the app being processed
-         * @param deploymentManager
-         *            the {@link DeploymentManager} tracking the {@link AppLifeCycle} and {@link App}
-         * @throws Exception
-         *             if any problem severe enough to halt the AppLifeCycle processing
-         */
-        void processBinding(Node node, App app, DeploymentManager deploymentManager) throws Exception;
-    }
-
-    // Private string constants defined to avoid typos on repeatedly used strings 
-    private static final String NODE_UNDEPLOYED = "undeployed";
-    private static final String NODE_PRE_DEPLOYING = "pre-deploying";
-    private static final String NODE_DEPLOYING = "deploying";
-    private static final String NODE_DEPLOYED = "deployed";
-    private static final String NODE_PRE_STARTING = "pre-starting";
-    private static final String NODE_STARTING = "starting";
-    private static final String NODE_STARTED = "started";
-    private static final String NODE_PRE_STOPPING = "pre-stopping";
-    private static final String NODE_STOPPING = "stopping";
-    private static final String NODE_PRE_UNDEPLOYING = "pre-undeploying";
-    private static final String NODE_UNDEPLOYING = "undeploying";
-    private Map<Node, List<Binding>> lifecyclebindings = new HashMap<Node, List<Binding>>();
-
-    public AppLifeCycle()
-    {
-        // Define Default Graph
-
-        // undeployed -> deployed
-        addEdge(NODE_UNDEPLOYED,NODE_PRE_DEPLOYING);
-        addEdge(NODE_PRE_DEPLOYING,NODE_DEPLOYING);
-        addEdge(NODE_DEPLOYING,NODE_DEPLOYED);
-
-        // deployed -> started
-        addEdge(NODE_DEPLOYED,NODE_PRE_STARTING);
-        addEdge(NODE_PRE_STARTING,NODE_STARTING);
-        addEdge(NODE_STARTING,NODE_STARTED);
-
-        // started -> deployed
-        addEdge(NODE_STARTED,NODE_PRE_STOPPING);
-        addEdge(NODE_PRE_STOPPING,NODE_STOPPING);
-        addEdge(NODE_STOPPING,NODE_DEPLOYED);
-
-        // deployed -> undeployed
-        addEdge(NODE_DEPLOYED,NODE_PRE_UNDEPLOYING);
-        addEdge(NODE_PRE_UNDEPLOYING,NODE_UNDEPLOYING);
-        addEdge(NODE_UNDEPLOYING,NODE_UNDEPLOYED);
-    }
-
-    public void addBinding(AppLifeCycle.Binding binding)
-    {
-        for (String nodeName : binding.getBindingTargets())
-        {
-            if (nodeName.equals("*"))
-            {
-                // Special Case: Bind to all Nodes
-                for (Node node : getNodes())
-                {
-                    bindToNode(node,binding);
-                }
-            }
-            else
-            {
-                // Bind to specific node
-                Node node = getNodeByName(nodeName);
-                bindToNode(node,binding);
-            }
-        }
-    }
-
-    private void bindToNode(Node node, AppLifeCycle.Binding binding)
-    {
-        List<Binding> bindings = lifecyclebindings.get(node);
-        if (bindings == null)
-        {
-            bindings = new ArrayList<Binding>();
-        }
-        bindings.add(binding);
-
-        lifecyclebindings.put(node,bindings);
-    }
-
-    /**
-     * Get all {@link Node} bound objects.
-     * 
-     * @return Set of Object(s) for all lifecycle bindings. never null.
-     */
-    public Set<AppLifeCycle.Binding> getBindings()
-    {
-        Set<Binding> boundset = new HashSet<Binding>();
-
-        for (List<Binding> bindings : lifecyclebindings.values())
-        {
-            boundset.addAll(bindings);
-        }
-
-        return boundset;
-    }
-
-    /**
-     * Get all objects bound to a specific {@link Node}
-     * 
-     * @return Set of Object(s) for specific lifecycle bindings. never null.
-     */
-    public Set<AppLifeCycle.Binding> getBindings(Node node)
-    {
-        Set<Binding> boundset = new HashSet<Binding>();
-
-        List<Binding> bindings = lifecyclebindings.get(node);
-        if (bindings == null)
-        {
-            return boundset;
-        }
-
-        boundset.addAll(bindings);
-
-        return boundset;
-    }
-
-    public Set<Binding> getBindings(String nodeName)
-    {
-        Node node = getNodeByName(nodeName);
-        return getBindings(node);
-    }
-
-    public void runBindings(Node node, App app, DeploymentManager deploymentManager) throws Throwable
-    {
-        List<Binding> bindings = this.lifecyclebindings.get(node);
-        if (bindings == null)
-        {
-            return;
-        }
-
-        for (Binding binding : bindings)
-        {
-            Log.info("Calling " + binding.getClass().getName());
-            binding.processBinding(node,app,deploymentManager);
-        }
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/AppProvider.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/AppProvider.java
deleted file mode 100644
index 6bb8d39..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/AppProvider.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy;
-
-import org.eclipse.jetty.util.component.LifeCycle;
-
-/**
- * Object responsible for providing {@link App}s to the {@link DeploymentManager}
- */
-public interface AppProvider extends LifeCycle
-{
-    /**
-     * Set the Deployment Manager
-     * 
-     * @param deploymentManager
-     * @throws IllegalStateException
-     *             if the provider {@link #isRunning()}.
-     */
-    void setDeploymentManager(DeploymentManager deploymentManager);
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/DeploymentManager.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/DeploymentManager.java
deleted file mode 100644
index 6a7941c..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/DeploymentManager.java
+++ /dev/null
@@ -1,561 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-
-import org.eclipse.jetty.deploy.bindings.StandardDeployer;
-import org.eclipse.jetty.deploy.bindings.StandardStarter;
-import org.eclipse.jetty.deploy.bindings.StandardStopper;
-import org.eclipse.jetty.deploy.bindings.StandardUndeployer;
-import org.eclipse.jetty.deploy.graph.Node;
-import org.eclipse.jetty.deploy.support.ConfigurationManager;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.util.AttributesMap;
-import org.eclipse.jetty.util.component.AbstractLifeCycle;
-import org.eclipse.jetty.util.log.Log;
-
-/**
- * The Deployment Manager.
- * <p>
- * Responsibilities:
- * <p>
- * <img src="doc-files/DeploymentManager_Roles.png">
- * <ol>
- * <li>Tracking Apps and their LifeCycle Location</li>
- * <li>Managing AppProviders and the Apps that they provide.</li>
- * <li>Executing AppLifeCycle on App based on current and desired LifeCycle Location.</li>
- * </ol>
- * <p>
- * <img src="doc-files/DeploymentManager.png">
- */
-public class DeploymentManager extends AbstractLifeCycle
-{
-    /**
-     * Represents a single tracked app within the deployment manager.
-     */
-    public class AppEntry
-    {
-        /**
-         * Version of the app.
-         * 
-         * Note: Auto-increments on each {@link DeploymentManager#addApp(App)}
-         */
-        private int version;
-
-        /**
-         * The app being tracked.
-         */
-        private App app;
-
-        /**
-         * The lifecycle node location of this App
-         */
-        private Node lifecyleNode;
-
-        /**
-         * Tracking the various AppState timestamps (in system milliseconds)
-         */
-        private Map<Node, Long> stateTimestamps = new HashMap<Node, Long>();
-
-        public App getApp()
-        {
-            return app;
-        }
-
-        public Node getLifecyleNode()
-        {
-            return lifecyleNode;
-        }
-
-        public Map<Node, Long> getStateTimestamps()
-        {
-            return stateTimestamps;
-        }
-
-        public int getVersion()
-        {
-            return version;
-        }
-
-        void setLifeCycleNode(Node node)
-        {
-            this.lifecyleNode = node;
-            this.stateTimestamps.put(node,Long.valueOf(System.currentTimeMillis()));
-        }
-    }
-
-    private List<AppProvider> providers = new ArrayList<AppProvider>();
-    private AppLifeCycle lifecycle = new AppLifeCycle();
-    private LinkedList<AppEntry> apps = new LinkedList<AppEntry>();
-    private AttributesMap contextAttributes = new AttributesMap();
-    private ConfigurationManager configurationManager;
-    private ContextHandlerCollection contexts;
-    private boolean useStandardBindings = true;
-    private String defaultLifeCycleGoal = "started";
-
-    /**
-     * Receive an app for processing.
-     * 
-     * Most commonly used by the various {@link AppProvider} implementations.
-     */
-    public void addApp(App app)
-    {
-        Log.info("App Added: " + app.getOriginId());
-        AppEntry entry = new AppEntry();
-        entry.app = app;
-        entry.setLifeCycleNode(lifecycle.getNodeByName("undeployed"));
-        apps.add(entry);
-
-        if (defaultLifeCycleGoal != null)
-        {
-            // Immediately attempt to go to default lifecycle state
-            this.requestAppGoal(entry,defaultLifeCycleGoal);
-        }
-    }
-
-    public void addAppProvider(AppProvider provider)
-    {
-        providers.add(provider);
-        if (isStarted() || isStarting())
-        {
-            startAppProvider(provider);
-        }
-    }
-
-    public void addLifeCycleBinding(AppLifeCycle.Binding binding)
-    {
-        lifecycle.addBinding(binding);
-    }
-
-    @Override
-    protected void doStart() throws Exception
-    {
-        if (useStandardBindings)
-        {
-            Log.info("Using standard bindings");
-            addLifeCycleBinding(new StandardDeployer());
-            addLifeCycleBinding(new StandardStarter());
-            addLifeCycleBinding(new StandardStopper());
-            addLifeCycleBinding(new StandardUndeployer());
-        }
-
-        Log.info("Starting all Providers: " + providers.size());
-        // Start all of the AppProviders
-        for (AppProvider provider : providers)
-        {
-            startAppProvider(provider);
-        }
-        super.doStart();
-    }
-
-    @Override
-    protected void doStop() throws Exception
-    {
-        Log.info("Stopping all Providers: " + providers.size());
-
-        // Stop all of the AppProviders
-        for (AppProvider provider : providers)
-        {
-            try
-            {
-                provider.stop();
-            }
-            catch (Exception e)
-            {
-                Log.warn("Unable to start AppProvider",e);
-            }
-        }
-        super.doStop();
-    }
-
-    private AppEntry findAppByContextId(String contextId)
-    {
-        if (contextId == null)
-        {
-            return null;
-        }
-
-        for (AppEntry entry : apps)
-        {
-            if (contextId.equals(entry.app.getContextId()))
-            {
-                return entry;
-            }
-        }
-        return null;
-    }
-
-    private AppEntry findAppByOriginId(String originId)
-    {
-        if (originId == null)
-        {
-            return null;
-        }
-
-        for (AppEntry entry : apps)
-        {
-            if (originId.equals(entry.app.getOriginId()))
-            {
-                return entry;
-            }
-        }
-        return null;
-    }
-
-    public App getAppByContextId(String contextId)
-    {
-        AppEntry entry = findAppByContextId(contextId);
-        if (entry == null)
-        {
-            return null;
-        }
-        return entry.app;
-    }
-
-    public App getAppByOriginId(String originId)
-    {
-        AppEntry entry = findAppByOriginId(originId);
-        if (entry == null)
-        {
-            return null;
-        }
-        return entry.app;
-    }
-
-    public Collection<AppEntry> getAppEntries()
-    {
-        return apps;
-    }
-
-    public Collection<AppProvider> getAppProviders()
-    {
-        return providers;
-    }
-
-    public Collection<App> getApps()
-    {
-        List<App> ret = new ArrayList<App>();
-        for (AppEntry entry : apps)
-        {
-            ret.add(entry.app);
-        }
-        return ret;
-    }
-
-    /**
-     * Get Set of {@link App}s by {@link Node}
-     * 
-     * @param state
-     *            the state to look for.
-     * @return
-     */
-    public Collection<App> getApps(Node node)
-    {
-        List<App> ret = new ArrayList<App>();
-        for (AppEntry entry : apps)
-        {
-            if (entry.lifecyleNode == node)
-            {
-                ret.add(entry.app);
-            }
-        }
-        return ret;
-    }
-
-    public List<App> getAppsWithSameContext(App app)
-    {
-        List<App> ret = new ArrayList<App>();
-        if (app == null)
-        {
-            return ret;
-        }
-
-        String contextId = app.getContextId();
-        if (contextId == null)
-        {
-            // No context? Likely not deployed or started yet.
-            return ret;
-        }
-
-        for (AppEntry entry : apps)
-        {
-            if (entry.app.equals(app))
-            {
-                // Its the input app. skip it.
-                // TODO: is this filter needed?
-                continue;
-            }
-
-            if (contextId.equals(entry.app.getContextId()))
-            {
-                ret.add(entry.app);
-            }
-        }
-        return ret;
-    }
-
-    /**
-     * Get a contextAttribute that will be set for every Context deployed by this provider.
-     * 
-     * @param name
-     * @return
-     */
-    public Object getAttribute(String name)
-    {
-        return contextAttributes.getAttribute(name);
-    }
-
-    public ConfigurationManager getConfigurationManager()
-    {
-        return configurationManager;
-    }
-
-    public AttributesMap getContextAttributes()
-    {
-        return contextAttributes;
-    }
-
-    public ContextHandlerCollection getContexts()
-    {
-        return contexts;
-    }
-
-    public String getDefaultLifeCycleGoal()
-    {
-        return defaultLifeCycleGoal;
-    }
-
-    public AppLifeCycle getLifeCycle()
-    {
-        return lifecycle;
-    }
-
-    public Server getServer()
-    {
-        if (contexts == null)
-        {
-            return null;
-        }
-        return contexts.getServer();
-    }
-
-    /**
-     * Remove the app from the tracking of the DeploymentManager
-     * 
-     * @param app
-     *            if the app is Unavailable remove it from the deployment manager.
-     */
-    public void removeApp(App app)
-    {
-        ListIterator<AppEntry> it = apps.listIterator();
-        while (it.hasNext())
-        {
-            AppEntry entry = it.next();
-            if (entry.app.equals(app) && "undeployed".equals(entry.lifecyleNode.getName()))
-            {
-                Log.info("Remove App: " + entry.app);
-                it.remove();
-            }
-        }
-    }
-
-    public void removeAppProvider(AppProvider provider)
-    {
-        providers.remove(provider);
-        try
-        {
-            provider.stop();
-        }
-        catch (Exception e)
-        {
-            Log.warn("Unable to stop Provider",e);
-        }
-    }
-
-    /**
-     * Remove a contextAttribute that will be set for every Context deployed by this provider.
-     * 
-     * @param name
-     */
-    public void removeAttribute(String name)
-    {
-        contextAttributes.removeAttribute(name);
-    }
-
-    /**
-     * Move an {@link App} through the {@link AppLifeCycle} to the desired {@link Node}, executing each lifecycle step
-     * in the process to reach the desired state.
-     * 
-     * @param app
-     *            the app to move through the process
-     * @param nodeName
-     *            the name of the node to attain
-     */
-    public void requestAppGoal(App app, String nodeName)
-    {
-        AppEntry appentry = findAppByContextId(app.getContextId());
-        if (appentry == null)
-        {
-            appentry = findAppByOriginId(app.getOriginId());
-            if (appentry == null)
-            {
-                throw new IllegalStateException("App not being tracked by Deployment Manager: " + app);
-            }
-        }
-        requestAppGoal(appentry,nodeName);
-    }
-
-    /**
-     * Move an {@link App} through the {@link AppLifeCycle} to the desired {@link Node}, executing each lifecycle step
-     * in the process to reach the desired state.
-     * 
-     * @param appentry
-     *            the internal appentry to move through the process
-     * @param nodeName
-     *            the name of the node to attain
-     */
-    private void requestAppGoal(AppEntry appentry, String nodeName)
-    {
-        Node destinationNode = lifecycle.getNodeByName(nodeName);
-        // Compute lifecycle steps
-        List<Node> path = lifecycle.findPath(appentry.lifecyleNode,destinationNode);
-        if (path.isEmpty())
-        {
-            // nothing to do. already there.
-            return;
-        }
-
-        // Execute each Node binding.  Stopping at any thrown exception.
-        try
-        {
-            Iterator<Node> it = path.iterator();
-            if (it.hasNext()) // Any entries?
-            {
-                // The first entry in the path is always the start node
-                // We don't want to run bindings on that entry (again)
-                it.next(); // skip first entry
-                while (it.hasNext())
-                {
-                    Node node = it.next();
-                    Log.info("Executing Node: " + node);
-                    lifecycle.runBindings(node,appentry.app,this);
-                    appentry.setLifeCycleNode(node);
-                }
-            }
-        }
-        catch (Throwable t)
-        {
-            Log.warn("Unable to reach node goal: " + nodeName,t);
-        }
-    }
-
-    /**
-     * Move an {@link App} through the {@link AppLifeCycle} to the desired {@link Node}, executing each lifecycle step
-     * in the process to reach the desired state.
-     * 
-     * @param appId
-     *            the id of the app to move through the process
-     * @param nodeName
-     *            the name of the node to attain
-     */
-    public void requestAppGoal(String appId, String nodeName)
-    {
-        AppEntry appentry = findAppByContextId(appId);
-        if (appentry == null)
-        {
-            appentry = findAppByOriginId(appId);
-            if (appentry == null)
-            {
-                throw new IllegalStateException("App not being tracked by Deployment Manager: " + appId);
-            }
-        }
-        requestAppGoal(appentry,nodeName);
-    }
-
-    /**
-     * Set a contextAttribute that will be set for every Context deployed by this provider.
-     * 
-     * @param name
-     * @param value
-     */
-    public void setAttribute(String name, Object value)
-    {
-        contextAttributes.setAttribute(name,value);
-    }
-
-    public void setConfigurationManager(ConfigurationManager configurationManager)
-    {
-        this.configurationManager = configurationManager;
-    }
-
-    public void setContextAttributes(AttributesMap contextAttributes)
-    {
-        this.contextAttributes = contextAttributes;
-    }
-
-    public void setContexts(ContextHandlerCollection contexts)
-    {
-        this.contexts = contexts;
-    }
-
-    public void setDefaultLifeCycleGoal(String defaultLifeCycleState)
-    {
-        this.defaultLifeCycleGoal = defaultLifeCycleState;
-    }
-
-    private void startAppProvider(AppProvider provider)
-    {
-        try
-        {
-            provider.setDeploymentManager(this);
-            provider.start();
-        }
-        catch (Exception e)
-        {
-            Log.warn("Unable to start AppProvider",e);
-        }
-    }
-
-    public void undeployAll()
-    {
-        Log.info("Undeploy (All) started");
-        for (AppEntry appentry : apps)
-        {
-            Log.info("Undeploy: " + appentry);
-            requestAppGoal(appentry,"undeployed");
-        }
-        Log.info("Undeploy (All) completed");
-    }
-
-    public boolean isUseStandardBindings()
-    {
-        return useStandardBindings;
-    }
-
-    public void setUseStandardBindings(boolean useStandardBindings)
-    {
-        this.useStandardBindings = useStandardBindings;
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardDeployer.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardDeployer.java
deleted file mode 100644
index 4e43e86..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardDeployer.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.bindings;
-
-import org.eclipse.jetty.deploy.App;
-import org.eclipse.jetty.deploy.AppLifeCycle;
-import org.eclipse.jetty.deploy.DeploymentManager;
-import org.eclipse.jetty.deploy.graph.Node;
-import org.eclipse.jetty.server.handler.ContextHandler;
-
-public class StandardDeployer implements AppLifeCycle.Binding
-{
-    public String[] getBindingTargets()
-    {
-        return new String[]
-        { "deploying" };
-    }
-
-    public void processBinding(Node node, App app, DeploymentManager deploymentManager) throws Exception
-    {
-        ContextHandler handler = app.getContextHandler(deploymentManager);
-        if (handler == null)
-        {
-            throw new NullPointerException("No Handler created for App: " + app);
-        }
-        deploymentManager.getContexts().addHandler(handler);
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStarter.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStarter.java
deleted file mode 100644
index 6514006..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStarter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.bindings;
-
-import org.eclipse.jetty.deploy.App;
-import org.eclipse.jetty.deploy.AppLifeCycle;
-import org.eclipse.jetty.deploy.DeploymentManager;
-import org.eclipse.jetty.deploy.graph.Node;
-import org.eclipse.jetty.server.handler.ContextHandler;
-import org.eclipse.jetty.util.log.Log;
-
-public class StandardStarter implements AppLifeCycle.Binding
-{
-    public String[] getBindingTargets() {
-        return new String[] { "starting" };
-    }
-
-    public void processBinding(Node node, App app, DeploymentManager deploymentManager) throws Exception
-    {
-        ContextHandler handler = app.getContextHandler(deploymentManager);
-        if (!handler.isStarted())
-        {
-            handler.start();
-        }
-
-        // Remove other apps at same context
-        for (App other : deploymentManager.getAppsWithSameContext(app))
-        {
-            Log.info("Removing apps with same context: " + other);
-            deploymentManager.requestAppGoal(other,"undeployed");
-        }
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStopper.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStopper.java
deleted file mode 100644
index a00b865..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStopper.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.bindings;
-
-import org.eclipse.jetty.deploy.App;
-import org.eclipse.jetty.deploy.AppLifeCycle;
-import org.eclipse.jetty.deploy.DeploymentManager;
-import org.eclipse.jetty.deploy.graph.Node;
-import org.eclipse.jetty.server.handler.ContextHandler;
-
-public class StandardStopper implements AppLifeCycle.Binding
-{
-    public String[] getBindingTargets()
-    {
-        return new String[]
-        { "stopping" };
-    }
-
-    public void processBinding(Node node, App app, DeploymentManager deploymentManager) throws Exception
-    {
-        ContextHandler handler = app.getContextHandler(deploymentManager);
-        if (!handler.isStopped())
-        {
-            handler.stop();
-        }
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardUndeployer.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardUndeployer.java
deleted file mode 100644
index 1dc33d0..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardUndeployer.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.bindings;
-
-import org.eclipse.jetty.deploy.App;
-import org.eclipse.jetty.deploy.AppLifeCycle;
-import org.eclipse.jetty.deploy.DeploymentManager;
-import org.eclipse.jetty.deploy.graph.Node;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.handler.ContextHandler;
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.handler.HandlerCollection;
-import org.eclipse.jetty.util.log.Log;
-
-public class StandardUndeployer implements AppLifeCycle.Binding
-{
-    public String[] getBindingTargets()
-    {
-        return new String[]
-        { "undeploying" };
-    }
-
-    public void processBinding(Node node, App app, DeploymentManager deploymentManager) throws Exception
-    {
-        ContextHandler handler = app.getContextHandler(deploymentManager);
-        ContextHandlerCollection chcoll = deploymentManager.getContexts();
-
-        recursiveRemoveContext(chcoll,handler);
-
-        deploymentManager.removeApp(app);
-    }
-
-    private void recursiveRemoveContext(HandlerCollection coll, ContextHandler context)
-    {
-        Handler children[] = coll.getHandlers();
-        int originalCount = children.length;
-
-        for (int i = 0, n = children.length; i < n; i++)
-        {
-            Handler child = children[i];
-            Log.info("Child handler: " + child);
-            if (child.equals(context))
-            {
-                Log.info("Removing handler: " + child);
-                coll.removeHandler(child);
-                Log.info(String.format("After removal: %d (originally %d)",coll.getHandlers().length,originalCount));
-            }
-            else if (child instanceof HandlerCollection)
-            {
-                recursiveRemoveContext((HandlerCollection)child,context);
-            }
-        }
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/Edge.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/Edge.java
deleted file mode 100644
index 5e6d070..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/Edge.java
+++ /dev/null
@@ -1,78 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.graph;
-
-/**
- * Basic Graph Edge
- */
-public class Edge
-{
-    private Node from;
-    private Node to;
-
-    public Edge(Node from, Node to)
-    {
-        this.from = from;
-        this.to = to;
-    }
-
-    @Override
-    public int hashCode()
-    {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((from == null)?0:from.hashCode());
-        result = prime * result + ((to == null)?0:to.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        Edge other = (Edge)obj;
-        if (from == null)
-        {
-            if (other.from != null)
-                return false;
-        }
-        else if (!from.equals(other.from))
-            return false;
-        if (to == null)
-        {
-            if (other.to != null)
-                return false;
-        }
-        else if (!to.equals(other.to))
-            return false;
-        return true;
-    }
-
-    public Node getFrom()
-    {
-        return from;
-    }
-
-    public Node getTo()
-    {
-        return to;
-    }
-}
\ No newline at end of file
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/Graph.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/Graph.java
deleted file mode 100644
index 1c0f644..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/Graph.java
+++ /dev/null
@@ -1,385 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.graph;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Set;
-import java.util.Stack;
-
-/**
- * Basic directed graph implementation
- */
-public class Graph
-{
-    private class EdgeSearch
-    {
-        private Set<Edge> seenEdges = new HashSet<Edge>();
-        private List<NodePath> paths = new ArrayList<NodePath>();
-
-        public EdgeSearch(Node from)
-        {
-            NodePath path = new NodePath();
-            path.add(from);
-            paths.add(path);
-        }
-
-        public void breadthFirst(Node destination)
-        {
-            // Test existing edge endpoints
-            if (hasReachedDestination(destination))
-            {
-                // Found our destination!
-
-                // Now remove the other paths that do not end at the destination
-                ListIterator<NodePath> pathiter = paths.listIterator();
-                while (pathiter.hasNext())
-                {
-                    NodePath path = pathiter.next();
-                    if (path.lastNode() != destination)
-                    {
-                        pathiter.remove();
-                    }
-                }
-                return;
-            }
-
-            List<NodePath> extrapaths = null;
-
-            // Add next unseen segments to paths.
-            boolean pathsAdded = false;
-
-            for (NodePath path : paths)
-            {
-                List<Edge> next = nextUnseenEdges(path);
-                if (next.size() == 0)
-                {
-                    continue; // no new edges
-                }
-
-                pathsAdded = true;
-
-                // More than 1 path out? Split it.
-                if (next.size() > 1)
-                {
-                    if (extrapaths == null)
-                    {
-                        extrapaths = new ArrayList<NodePath>();
-                    }
-
-                    // Split path for other edges
-                    for (int i = 1, n = next.size(); i < n; i++)
-                    {
-                        NodePath split = path.forkPath();
-                        // Add segment to split'd path
-                        split.add(next.get(i).getTo());
-
-                        // Add to extra paths
-                        extrapaths.add(split);
-                    }
-                }
-
-                // Add edge to current path
-                Edge edge = next.get(0);
-                path.add(edge.getTo());
-
-                // Mark all edges as seen
-                for (Edge e : next)
-                {
-                    seenEdges.add(e);
-                }
-            }
-
-            // Do we have any extra paths?
-            if (extrapaths != null)
-            {
-                paths.addAll(extrapaths);
-            }
-
-            if (pathsAdded)
-            {
-                // recurse
-                breadthFirst(destination);
-            }
-        }
-
-        public NodePath getShortestPath()
-        {
-            NodePath shortest = null;
-            int shortestlen = Integer.MAX_VALUE;
-
-            for (NodePath path : paths)
-            {
-                if (shortest == null)
-                {
-                    shortest = path;
-                    continue;
-                }
-
-                int len = path.length();
-
-                if (len < shortestlen)
-                {
-                    shortest = path;
-                    shortestlen = len;
-                }
-            }
-
-            return shortest;
-        }
-
-        private boolean hasReachedDestination(Node destination)
-        {
-            for (NodePath path : paths)
-            {
-                if (path.lastNode() == destination)
-                {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        private List<Edge> nextUnseenEdges(NodePath path)
-        {
-            List<Edge> next = new ArrayList<Edge>();
-
-            for (Edge edge : findEdgesFrom(path.lastNode()))
-            {
-                if (seenEdges.contains(edge) == false)
-                {
-                    next.add(edge);
-                }
-            }
-
-            return next;
-        }
-    }
-
-    private class NodePath implements Iterable<Node>
-    {
-        private Stack<Node> path;
-
-        public NodePath()
-        {
-            path = new Stack<Node>();
-        }
-
-        public void add(Node node)
-        {
-            path.push(node);
-        }
-
-        public NodePath forkPath()
-        {
-            NodePath ep = new NodePath();
-            for (Node node : this)
-            {
-                ep.add(node);
-            }
-            return ep;
-        }
-
-        public Collection<Node> getCollection()
-        {
-            return path;
-        }
-
-        public Iterator<Node> iterator()
-        {
-            return path.iterator();
-        }
-
-        public Node lastNode()
-        {
-            return path.peek();
-        }
-
-        public int length()
-        {
-            return path.size();
-        }
-    }
-
-    private Set<Node> nodes = new HashSet<Node>();
-    private Set<Edge> edges = new HashSet<Edge>();
-
-    public void addEdge(Edge edge)
-    {
-        this.edges.add(edge);
-    }
-
-    public void addEdge(String from, String to)
-    {
-        Node fromNode = null;
-        Node toNode = null;
-
-        try
-        {
-            fromNode = getNodeByName(from);
-        }
-        catch (NodeNotFoundException e)
-        {
-            fromNode = new Node(from);
-            addNode(fromNode);
-        }
-
-        try
-        {
-            toNode = getNodeByName(to);
-        }
-        catch (NodeNotFoundException e)
-        {
-            toNode = new Node(to);
-            addNode(toNode);
-        }
-
-        Edge edge = new Edge(fromNode,toNode);
-        addEdge(edge);
-    }
-
-    public void addNode(Node node)
-    {
-        this.nodes.add(node);
-    }
-
-    /**
-     * Find all edges that are connected to the specific node, both as an outgoing {@link Edge#getFrom()} or incoming
-     * {@link Edge#getTo()} end point.
-     * 
-     * @param node
-     *            the node with potential end points
-     * @return the set of edges connected to the node
-     */
-    public Set<Edge> findEdges(Node node)
-    {
-        Set<Edge> fromedges = new HashSet<Edge>();
-
-        for (Edge edge : this.edges)
-        {
-            if ((edge.getFrom() == node) || (edge.getTo() == node))
-            {
-                fromedges.add(edge);
-            }
-        }
-
-        return fromedges;
-    }
-
-    /**
-     * Find all edges that are connected {@link Edge#getFrom()} the specific node.
-     * 
-     * @param node
-     *            the node with potential edges from it
-     * @return the set of edges from the node
-     */
-    public Set<Edge> findEdgesFrom(Node from)
-    {
-        Set<Edge> fromedges = new HashSet<Edge>();
-
-        for (Edge edge : this.edges)
-        {
-            if (edge.getFrom() == from)
-            {
-                fromedges.add(edge);
-            }
-        }
-
-        return fromedges;
-    }
-
-    /**
-     * Using BFS (Breadth First Search) return the path from a any arbitrary node to any other.
-     * 
-     * @param from
-     *            the node from
-     * @param to
-     *            the node to
-     * @return the path to take
-     */
-    public List<Node> findPath(Node from, Node to)
-    {
-        if (from == to)
-        {
-            return Collections.emptyList();
-        }
-
-        // Perform a Breadth First Search (BFS) of the tree.
-        EdgeSearch search = new EdgeSearch(from);
-        search.breadthFirst(to);
-
-        NodePath nodepath = search.getShortestPath();
-        List<Node> path = new ArrayList<Node>();
-        path.addAll(nodepath.getCollection());
-        return path;
-    }
-
-    public Set<Edge> getEdges()
-    {
-        return edges;
-    }
-
-    public Node getNodeByName(String name)
-    {
-        for (Node node : nodes)
-        {
-            if (node.getName().equals(name))
-            {
-                return node;
-            }
-        }
-
-        throw new NodeNotFoundException("Unable to find node: " + name);
-    }
-
-    public Set<Node> getNodes()
-    {
-        return nodes;
-    }
-
-    public void removeEdge(Edge edge)
-    {
-        this.edges.remove(edge);
-    }
-
-    public void removeEdge(String fromNodeName, String toNodeName)
-    {
-        Node fromNode = getNodeByName(fromNodeName);
-        Node toNode = getNodeByName(toNodeName);
-        Edge edge = new Edge(fromNode,toNode);
-        removeEdge(edge);
-    }
-
-    public void removeNode(Node node)
-    {
-        this.nodes.remove(node);
-    }
-
-    public void setEdges(Set<Edge> edges)
-    {
-        this.edges = edges;
-    }
-
-    public void setNodes(Set<Node> nodes)
-    {
-        this.nodes = nodes;
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/ImpossiblePathException.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/ImpossiblePathException.java
deleted file mode 100644
index 7a9e871..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/ImpossiblePathException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.graph;
-
-public class ImpossiblePathException extends RuntimeException
-{
-    private static final long serialVersionUID = 8423437443748056467L;
-
-    public ImpossiblePathException(String message, Throwable cause)
-    {
-        super(message,cause);
-    }
-
-    public ImpossiblePathException(String message)
-    {
-        super(message);
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/Node.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/Node.java
deleted file mode 100644
index ab80ea7..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/Node.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.graph;
-
-/**
- * Basic Graph Node
- */
-public class Node
-{
-    private String name;
-
-    public Node(String name)
-    {
-        this.name = name;
-    }
-
-    public String getName()
-    {
-        return name;
-    }
-
-    @Override
-    public String toString()
-    {
-        return "Node[" + name + "]";
-    }
-
-    @Override
-    public int hashCode()
-    {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((name == null)?0:name.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        Node other = (Node)obj;
-        if (name == null)
-        {
-            if (other.name != null)
-                return false;
-        }
-        else if (!name.equals(other.name))
-            return false;
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/NodeNotFoundException.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/NodeNotFoundException.java
deleted file mode 100644
index 336adf9..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/graph/NodeNotFoundException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.graph;
-
-/**
- * NodeNotFoundException for when a referenced node cannot be found.
- */
-public class NodeNotFoundException extends RuntimeException
-{
-    private static final long serialVersionUID = -7126395440535048386L;
-
-    public NodeNotFoundException(String message, Throwable cause)
-    {
-        super(message,cause);
-    }
-
-    public NodeNotFoundException(String message)
-    {
-        super(message);
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProvider.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProvider.java
deleted file mode 100644
index 1abc093..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProvider.java
+++ /dev/null
@@ -1,226 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.providers;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.Collections;
-
-import org.eclipse.jetty.deploy.App;
-import org.eclipse.jetty.deploy.AppProvider;
-import org.eclipse.jetty.deploy.DeploymentManager;
-import org.eclipse.jetty.util.Scanner;
-import org.eclipse.jetty.util.component.AbstractLifeCycle;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.resource.Resource;
-
-/**
- * Backwards Compatible AppProvider for Monitoring a Contexts directory and deploying All Contexts.
- * 
- * Similar in scope to the original org.eclipse.jetty.deploy.ContextDeployer
- */
-public class MonitoredDirAppProvider extends AbstractLifeCycle implements AppProvider, Scanner.DiscreteListener
-{
-    class ExtensionFilenameFilter implements FilenameFilter
-    {
-        boolean acceptXml = true;
-        boolean acceptWar = true;
-
-        public boolean accept(File dir, String name)
-        {
-            String lowername = name.toLowerCase();
-
-            if (acceptXml && (lowername.endsWith(".xml")))
-            {
-                return true;
-            }
-
-            if (acceptWar && (lowername.endsWith(".war")))
-            {
-                return true;
-            }
-
-            return false;
-        }
-    }
-
-    private Resource monitoredDir;
-    private Scanner scanner;
-    private int scanInterval = 10;
-    private boolean recursive = false;
-    private boolean extractWars = false;
-    private boolean parentLoaderPriority = false;
-    private String defaultsDescriptor;
-    private DeploymentManager deploymgr;
-    private ExtensionFilenameFilter filenamefilter;
-
-    public MonitoredDirAppProvider()
-    {
-        scanner = new Scanner();
-        filenamefilter = new ExtensionFilenameFilter();
-    }
-
-    private void addConfiguredContextApp(String filename)
-    {
-        String originId = filename;
-        App app = new App(originId,new File(filename));
-        app.setExtractWars(this.extractWars);
-        app.setParentLoaderPriority(this.parentLoaderPriority);
-        app.setDefaultsDescriptor(this.defaultsDescriptor);
-        this.deploymgr.addApp(app);
-    }
-
-    public void fileAdded(String filename) throws Exception
-    {
-        Log.info("fileAdded(" + filename + ")");
-        addConfiguredContextApp(filename);
-    }
-
-    public void fileChanged(String filename) throws Exception
-    {
-        Log.info("fileChanged(" + filename + ")");
-        addConfiguredContextApp(filename);
-    }
-
-    public void fileRemoved(String filename) throws Exception
-    {
-        // TODO: How to determine ID from filename that doesn't exist?
-        /*
-        Log.info("fileRemoved(" + filename + ")");
-        addConfiguredContextApp(filename);
-         */
-    }
-
-    public String getDefaultsDescriptor()
-    {
-        return defaultsDescriptor;
-    }
-
-    public Resource getMonitoredDir()
-    {
-        return monitoredDir;
-    }
-
-    public int getScanInterval()
-    {
-        return scanInterval;
-    }
-
-    public boolean isExtractWars()
-    {
-        return extractWars;
-    }
-
-    public boolean isParentLoaderPriority()
-    {
-        return parentLoaderPriority;
-    }
-
-    public boolean isRecursive()
-    {
-        return recursive;
-    }
-
-    public void setAcceptContextXmlFiles(boolean flag)
-    {
-        filenamefilter.acceptXml = flag;
-    }
-
-    public void setAcceptWarFiles(boolean flag)
-    {
-        filenamefilter.acceptWar = flag;
-    }
-
-    public void setDefaultsDescriptor(String defaultsDescriptor)
-    {
-        this.defaultsDescriptor = defaultsDescriptor;
-    }
-
-    public void setExtractWars(boolean extractWars)
-    {
-        this.extractWars = extractWars;
-    }
-
-    public void setMonitoredDir(Resource contextsDir)
-    {
-        this.monitoredDir = contextsDir;
-    }
-
-    /**
-     * @param dir
-     *            Directory to scan for context descriptors or war files
-     */
-    public void setMonitoredDir(String dir)
-    {
-        try
-        {
-            monitoredDir = Resource.newResource(dir);
-        }
-        catch (Exception e)
-        {
-            throw new IllegalArgumentException(e);
-        }
-    }
-
-    public void setParentLoaderPriority(boolean parentLoaderPriority)
-    {
-        this.parentLoaderPriority = parentLoaderPriority;
-    }
-
-    public void setRecursive(boolean recursive)
-    {
-        this.recursive = recursive;
-    }
-
-    public void setScanInterval(int scanInterval)
-    {
-        this.scanInterval = scanInterval;
-    }
-
-    public void setDeploymentManager(DeploymentManager deploymentManager)
-    {
-        this.deploymgr = deploymentManager;
-    }
-
-    @Override
-    protected void doStart() throws Exception
-    {
-        Log.info(this.getClass().getSimpleName() + ".doStart()");
-        if (monitoredDir == null)
-        {
-            throw new IllegalStateException("No configuration dir specified");
-        }
-
-        File scandir = monitoredDir.getFile();
-        Log.info("ScanDir: " + scandir);
-        this.scanner.setScanDirs(Collections.singletonList(scandir));
-        this.scanner.setScanInterval(scanInterval);
-        this.scanner.setRecursive(recursive);
-        this.scanner.setFilenameFilter(filenamefilter);
-        this.scanner.addListener(this);
-        this.scanner.scan();
-        this.scanner.start();
-        Log.info("Started scanner: " + scanner);
-    }
-
-    @Override
-    protected void doStop() throws Exception
-    {
-        Log.info(this.getClass().getSimpleName() + ".doStop()");
-        this.scanner.removeListener(this);
-        this.scanner.stop();
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/support/ConfigurationManager.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/support/ConfigurationManager.java
deleted file mode 100644
index c9f7ad5..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/support/ConfigurationManager.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// ========================================================================
-// Copyright (c) 2006-2009 Mort Bay Consulting Pty. Ltd.
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-// The Apache License v2.0 is available at
-// http://www.opensource.org/licenses/apache2.0.php
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-
-package org.eclipse.jetty.deploy.support;
-
-import java.util.Map;
-
-/**
- * ConfigurationManager
- *
- * Type for allow injection of property values
- * for replacement in jetty xml files during deployment.
- */
-public interface ConfigurationManager
-{
-    public Map<?, ?> getProperties();
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/support/FileConfigurationManager.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/support/FileConfigurationManager.java
deleted file mode 100644
index e4dc398..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/support/FileConfigurationManager.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// ========================================================================
-// Copyright (c) 2006-2009 Mort Bay Consulting Pty. Ltd.
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-// The Apache License v2.0 is available at
-// http://www.opensource.org/licenses/apache2.0.php
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-
-package org.eclipse.jetty.deploy.support;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.util.Map;
-import java.util.Properties;
-
-import org.eclipse.jetty.util.resource.Resource;
-
-/**
- * FileConfigurationManager
- * 
- * Supplies properties defined in a file.
- */
-public class FileConfigurationManager implements ConfigurationManager
-{
-    private Resource _file;
-    private Properties _properties = new Properties();
-
-    public FileConfigurationManager()
-    {
-    }
-
-    public void setFile(String filename) throws MalformedURLException, IOException
-    {
-        _file = Resource.newResource(filename);
-    }
-
-    /**
-     * @see org.eclipse.jetty.deploy.ConfigurationManager#getProperties()
-     */
-    public Map<?, ?> getProperties()
-    {
-        try
-        {
-            loadProperties();
-            return _properties;
-        }
-        catch (Exception e)
-        {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private void loadProperties() throws FileNotFoundException, IOException
-    {
-        if (_properties.isEmpty())
-        {
-            _properties.load(_file.getInputStream());
-        }
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/util/FileID.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/util/FileID.java
deleted file mode 100644
index 634a14b..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/util/FileID.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.util;
-
-import java.io.File;
-
-/**
- * Simple, yet surprisingly common utility methods for identifying various file types commonly seen and worked with in a
- * deployment scenario.
- */
-public class FileID
-{
-    /**
-     * Is the path a Web Archive?
-     * 
-     * @param path
-     *            the path to test.
-     * @return True if a .war or .jar or exploded web directory
-     * @see FileID#isWebArchiveFile(File)
-     */
-    public static boolean isWebArchive(File path)
-    {
-        if (path.isFile())
-        {
-            String name = path.getName().toLowerCase();
-            return (name.endsWith(".war") || name.endsWith(".jar"));
-        }
-
-        File webInf = new File(path,"WEB-INF");
-        File webXml = new File(webInf,"web.xml");
-        return webXml.exists() && webXml.isFile();
-    }
-
-    /**
-     * Is the path a Web Archive File (not directory)
-     * 
-     * @param path
-     *            the path to test.
-     * @return True if a .war or .jar file.
-     * @see FileID#isWebArchive(File)
-     */
-    public static boolean isWebArchiveFile(File path)
-    {
-        if (!path.isFile())
-        {
-            return false;
-        }
-
-        String name = path.getName().toLowerCase();
-        return (name.endsWith(".war") || name.endsWith(".jar"));
-    }
-
-    public static boolean isXmlFile(File path)
-    {
-        if (!path.isFile())
-        {
-            return false;
-        }
-
-        String name = path.getName().toLowerCase();
-        return name.endsWith(".xml");
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/webapp/deploy/DeployAuditLogBinding.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/webapp/deploy/DeployAuditLogBinding.java
deleted file mode 100644
index d2c1988..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/webapp/deploy/DeployAuditLogBinding.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.webapp.deploy;
-
-import java.util.logging.Logger;
-
-import org.eclipse.jetty.deploy.App;
-import org.eclipse.jetty.deploy.AppLifeCycle;
-import org.eclipse.jetty.deploy.DeploymentManager;
-import org.eclipse.jetty.deploy.graph.Node;
-
-public class DeployAuditLogBinding implements AppLifeCycle.Binding
-{
-    private Logger logger = Logger.getLogger("audit.deploy");
-
-    public String[] getBindingTargets()
-    {
-        return new String[]
-        { "*" };
-    }
-
-    public void processBinding(Node node, App app, DeploymentManager deploymentManager) throws Exception
-    {
-        logger.info("Reached LifeCycle " + node.getName() + " on app " + app.getOriginId());
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/webapp/deploy/WebappVerifierBinding.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/webapp/deploy/WebappVerifierBinding.java
deleted file mode 100644
index 9ce1f53..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/webapp/deploy/WebappVerifierBinding.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.webapp.deploy;
-
-import java.io.File;
-import java.net.URI;
-import java.util.Collection;
-
-import org.eclipse.jetty.deploy.App;
-import org.eclipse.jetty.deploy.AppLifeCycle;
-import org.eclipse.jetty.deploy.DeploymentManager;
-import org.eclipse.jetty.deploy.graph.Node;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.webapp.verifier.RuleSet;
-import org.eclipse.jetty.webapp.verifier.Severity;
-import org.eclipse.jetty.webapp.verifier.Violation;
-import org.eclipse.jetty.webapp.verifier.WebappVerifier;
-
-/**
- * Deploy Binding for the Webapp Verifier.
- * 
- * Will verify the webapp being deployed, to ensure that it satisfies the ruleset configured.
- */
-public class WebappVerifierBinding implements AppLifeCycle.Binding
-{
-    private String rulesetPath;
-
-    public String getRulesetPath()
-    {
-        return rulesetPath;
-    }
-
-    public void setRulesetPath(String rulesetPath)
-    {
-        this.rulesetPath = rulesetPath;
-    }
-
-    public String[] getBindingTargets()
-    {
-        return new String[]
-        { "pre-deploying" };
-    }
-
-    public void processBinding(Node node, App app, DeploymentManager deploymentManager) throws Exception
-    {
-        File rulesetFile = new File(this.rulesetPath);
-
-        RuleSet ruleset = RuleSet.load(rulesetFile);
-
-        URI warURI = app.getArchivePath().toURI();
-
-        WebappVerifier verifier = ruleset.createWebappVerifier(warURI);
-
-        verifier.visitAll();
-
-        Collection<Violation> violations = verifier.getViolations();
-        if (violations.size() <= 0)
-        {
-            // Nothing to report.
-            Log.info("Webapp Verifier - All Rules Passed - No Violations");
-            return;
-        }
-
-        boolean haltWebapp = false;
-        Log.info("Webapp Verifier Found " + violations.size() + " violations.");
-
-        for (Violation violation : violations)
-        {
-            if (violation.getSeverity() == Severity.ERROR)
-            {
-                haltWebapp = true;
-            }
-
-            Log.info(violation.toString());
-        }
-
-        if (haltWebapp)
-        {
-            throw new IllegalStateException("Webapp Failed Webapp Verification");
-        }
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/AppLifecycle.png b/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/AppLifecycle.png
deleted file mode 100644
index 071c747..0000000
--- a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/AppLifecycle.png
+++ /dev/null
Binary files differ
diff --git a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/AppLifecycle.svg b/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/AppLifecycle.svg
deleted file mode 100644
index dc6974c..0000000
--- a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/AppLifecycle.svg
+++ /dev/null
@@ -1,482 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Generated by Graphviz version 2.20.2 (Mon Mar 30 10:11:53 UTC 2009)
-     For user: (joakim) Joakim Erdfelt,,, -->
-<!-- Title: G Pages: 1 -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="765"
-   height="900"
-   viewBox="0 0 327 590"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   sodipodi:docname="AppLifecycle.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0"
-   inkscape:export-filename="/home/joakim/code/webtide/jetty7-git/sandbox/jetty-deploy-manager/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/AppLifecycle.png"
-   inkscape:export-xdpi="40"
-   inkscape:export-ydpi="40">
-  <metadata
-     id="metadata184">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs182">
-    <marker
-       inkscape:stockid="Arrow2Lstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Lstart"
-       style="overflow:visible">
-      <path
-         id="path4328"
-         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(1.1) translate(1,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend"
-       style="overflow:visible">
-      <path
-         id="path3605"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleOutL"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="TriangleOutL"
-       style="overflow:visible">
-      <path
-         id="path3727"
-         d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
-         transform="scale(0.8,0.8)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible">
-      <path
-         id="path3587"
-         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 368.75 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="408.75 : 368.75 : 1"
-       inkscape:persp3d-origin="204.375 : 245.83333 : 1"
-       id="perspective186" />
-    <title
-       id="title5">G</title>
-    <title
-       id="title10">incoming_app</title>
-    <title
-       id="title17">command_deploy</title>
-    <title
-       id="title33">state_deployed</title>
-  </defs>
-  <sodipodi:namedview
-     inkscape:window-height="1151"
-     inkscape:window-width="1920"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="1"
-     guidetolerance="10"
-     gridtolerance="10.0"
-     objecttolerance="13"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base"
-     showgrid="false"
-     inkscape:zoom="0.92828283"
-     inkscape:cx="387.34766"
-     inkscape:cy="428.51283"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:current-layer="svg2"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:document-units="cm"
-     units="in"
-     inkscape:snap-guide="true"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="false"
-     inkscape:bbox-nodes="false"
-     inkscape:snap-intersection-line-segments="true"
-     inkscape:object-paths="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-center="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3514"
-       dotted="true"
-       visible="true"
-       enabled="true"
-       units="cm"
-       spacingx="0.25cm"
-       spacingy="0.25cm"
-       empspacing="5" />
-  </sodipodi:namedview>
-  <g
-     id="g3445"
-     transform="matrix(1.2491264,0,0,1.2491264,109.41031,84.061397)">
-    <polygon
-       style="fill:#ffa500;stroke:#ffa500;stroke-width:0.80055952"
-       points="228,-510 144,-510 144,-468 228,-468 228,-510 "
-       id="polygon3447"
-       transform="translate(4,586)" />
-    <text
-       x="190"
-       y="92.600006"
-       style="font-size:14.39999962px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text3449"
-       sodipodi:linespacing="125%">
-      <tspan
-         sodipodi:role="line"
-         id="tspan3451"
-         x="190"
-         y="92.600006">Phase</tspan>
-      <tspan
-         sodipodi:role="line"
-         id="tspan3453"
-         x="190"
-         y="110.60001">DEPLOY</tspan>
-    </text>
-  </g>
-  <g
-     id="g3917">
-    <polygon
-       transform="matrix(1.6111428,0,0,1.2491264,-118.06476,648.90074)"
-       id="polygon3491"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       style="fill:#00ffff;stroke:#00ffff;stroke-width:0.70490372" />
-    <text
-       sodipodi:linespacing="125%"
-       id="text3493"
-       style="font-size:17.98741913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       y="130.01364"
-       x="178.38551">
-      <tspan
-         sodipodi:role="line"
-         id="tspan3503"
-         x="178.38551"
-         y="130.01364">State</tspan>
-      <tspan
-         sodipodi:role="line"
-         id="tspan3505"
-         x="178.38551"
-         y="152.49792">UNAVAILABLE</tspan>
-    </text>
-  </g>
-  <g
-     id="g3549"
-     transform="matrix(1.2491264,0,0,1.2491264,-227.0731,84.061397)">
-    <polygon
-       style="fill:#ffa500;stroke:#ffa500;stroke-width:0.80055952"
-       points="228,-510 144,-510 144,-468 228,-468 228,-510 "
-       id="polygon3551"
-       transform="translate(4,586)" />
-    <text
-       x="190"
-       y="92.600006"
-       style="font-size:14.39999962px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text3553"
-       sodipodi:linespacing="125%">
-      <tspan
-         sodipodi:role="line"
-         id="tspan3559"
-         x="190"
-         y="92.600006">Phase</tspan>
-      <tspan
-         sodipodi:role="line"
-         id="tspan3561"
-         x="190"
-         y="110.60001">UNDEPLOY</tspan>
-    </text>
-  </g>
-  <g
-     id="g3483"
-     transform="matrix(1.2491264,0,0,1.2491264,-102.88457,7.5836656)">
-    <ellipse
-       style="fill:#c1c1c1;fill-opacity:1;stroke:none"
-       cx="222"
-       cy="-564"
-       rx="96.784599"
-       ry="18"
-       id="ellipse3485"
-       sodipodi:cx="222"
-       sodipodi:cy="-564"
-       sodipodi:rx="96.784599"
-       sodipodi:ry="18"
-       transform="translate(4,586)" />
-    <text
-       x="226"
-       y="26.099976"
-       style="font-size:14.39999962px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text3487"
-       sodipodi:linespacing="125%">Incoming WebApp</text>
-  </g>
-  <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.9988189;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow2Lend)"
-     d="M 180.40071,57.523395 L 180.40071,108.36997"
-     id="path2594"
-     sodipodi:nodetypes="cc" />
-  <path
-     sodipodi:nodetypes="cc"
-     id="path3923"
-     d="M 252.49807,154.27312 L 294.28101,190.29424"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="M 294.28101,213.09705 L 236.46989,265.1469"
-     id="path3925"
-     sodipodi:nodetypes="cc" />
-  <g
-     id="g3469"
-     transform="matrix(1.2491264,0,0,1.2491264,-55.825685,55.721845)">
-    <polygon
-       style="fill:#00ffff;stroke:#00ffff;stroke-width:0.80055952"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       id="polygon3471"
-       transform="translate(4,586)" />
-    <text
-       x="188"
-       y="170.60001"
-       style="font-size:14.39999962px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text3473"
-       sodipodi:linespacing="125%">
-      <tspan
-         sodipodi:role="line"
-         id="tspan3475"
-         x="188"
-         y="170.60001">State</tspan>
-      <tspan
-         sodipodi:role="line"
-         id="tspan3477"
-         x="188"
-         y="188.60001">DEPLOYED</tspan>
-    </text>
-  </g>
-  <g
-     id="g5403"
-     transform="matrix(1.2491264,0,0,1.2491264,-56.840602,191.55677)">
-    <polygon
-       style="fill:#00ffff;stroke:#00ffff;stroke-width:0.80055952"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       id="polygon5405"
-       transform="translate(4,586)" />
-    <text
-       x="188"
-       y="170.60001"
-       style="font-size:14.39999962px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text5407"
-       sodipodi:linespacing="125%">
-      <tspan
-         sodipodi:role="line"
-         id="tspan5417"
-         x="188"
-         y="170.60001">State</tspan>
-      <tspan
-         sodipodi:role="line"
-         id="tspan5419"
-         x="188"
-         y="188.60001">STAGED</tspan>
-    </text>
-  </g>
-  <path
-     sodipodi:nodetypes="cc"
-     id="path3929"
-     d="M 120.53534,398.20562 L 62.724228,352.50272"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <path
-     sodipodi:nodetypes="cc"
-     id="path3935"
-     d="M 294.28101,355.83348 L 235.45498,398.20563"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <g
-     transform="matrix(1.2491264,0,0,1.2491264,109.41031,219.89633)"
-     id="g3535">
-    <polygon
-       transform="translate(4,586)"
-       id="polygon3537"
-       points="228,-510 144,-510 144,-468 228,-468 228,-510 "
-       style="fill:#ffa500;stroke:#ffa500;stroke-width:0.80055952" />
-    <text
-       sodipodi:linespacing="125%"
-       id="text3539"
-       style="font-size:14.39999962px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       y="92.600006"
-       x="190">
-      <tspan
-         sodipodi:role="line"
-         id="tspan3545"
-         x="190"
-         y="92.600006">Phase</tspan>
-      <tspan
-         sodipodi:role="line"
-         id="tspan3547"
-         x="190"
-         y="110.60001">STAGE</tspan>
-    </text>
-  </g>
-  <path
-     sodipodi:nodetypes="cc"
-     id="path3927"
-     d="M 236.46989,284.21436 L 293.65647,330.6791"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <path
-     sodipodi:nodetypes="cc"
-     id="path3941"
-     d="M 62.724228,186.76323 L 104.27295,153.52683"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <path
-     sodipodi:nodetypes="cc"
-     id="path3943"
-     d="M 121.55027,263.8367 L 62.724228,212.94524"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <text
-     x="-10.835248"
-     y="23.769073"
-     style="font-size:20.46376419px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans Bold Italic"
-     id="text2456"
-     sodipodi:linespacing="100%">
-    <tspan
-       sodipodi:role="line"
-       id="tspan2460"
-       x="-10.835244"
-       y="23.769073"
-       style="font-size:20.46376419px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans Bold Italic">Deployment</tspan>
-    <tspan
-       sodipodi:role="line"
-       x="-10.835247"
-       y="44.232838"
-       id="tspan2464"
-       style="font-size:20.46376419px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans Bold Italic">Lifecycle</tspan>
-  </text>
-  <g
-     id="g2472"
-     transform="matrix(1.2491264,0,0,1.2491264,109.41031,355.73126)">
-    <polygon
-       style="fill:#ffa500;stroke:#ffa500;stroke-width:0.80055952"
-       points="228,-510 144,-510 144,-468 228,-468 228,-510 "
-       id="polygon2474"
-       transform="translate(4,586)" />
-    <text
-       x="190"
-       y="92.600006"
-       style="font-size:14.39999962px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text2476"
-       sodipodi:linespacing="125%">
-      <tspan
-         y="92.600006"
-         x="190"
-         id="tspan2478"
-         sodipodi:role="line">Phase</tspan>
-      <tspan
-         y="110.60001"
-         x="190"
-         id="tspan2480"
-         sodipodi:role="line">START</tspan>
-    </text>
-  </g>
-  <g
-     id="g2482"
-     transform="matrix(1.2491264,0,0,1.2491264,-227.0731,219.89633)">
-    <polygon
-       style="fill:#ffa500;stroke:#ffa500;stroke-width:0.80055952"
-       points="228,-510 144,-510 144,-468 228,-468 228,-510 "
-       id="polygon2484"
-       transform="translate(4,586)" />
-    <text
-       x="190"
-       y="92.600006"
-       style="font-size:14.39999962px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text2486"
-       sodipodi:linespacing="125%">
-      <tspan
-         y="92.600006"
-         x="190"
-         id="tspan2488"
-         sodipodi:role="line">Phase</tspan>
-      <tspan
-         y="110.60001"
-         x="190"
-         id="tspan2490"
-         sodipodi:role="line">STOP</tspan>
-    </text>
-  </g>
-  <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="M 236.46989,420.04929 L 293.65647,466.51403"
-     id="path2492"
-     sodipodi:nodetypes="cc" />
-  <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="M 62.724228,326.37326 L 121.55027,286.42657"
-     id="path2494"
-     sodipodi:nodetypes="cc" />
-  <g
-     transform="matrix(1.2491264,0,0,1.2491264,-56.840602,327.3917)"
-     id="g2551">
-    <polygon
-       transform="translate(4,586)"
-       id="polygon2553"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       style="fill:#00ffff;stroke:#00ffff;stroke-width:0.80055952" />
-    <text
-       sodipodi:linespacing="125%"
-       id="text2555"
-       style="font-size:14.39999962px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       y="170.60001"
-       x="188">
-      <tspan
-         y="170.60001"
-         x="188"
-         id="tspan2557"
-         sodipodi:role="line">State</tspan>
-      <tspan
-         y="188.60001"
-         x="188"
-         id="tspan2559"
-         sodipodi:role="line">STARTED</tspan>
-    </text>
-  </g>
-  <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="M 120.53534,536.86536 L 23.883096,367.29325"
-     id="path2561"
-     sodipodi:nodetypes="cc" />
-  <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="M 294.28101,491.66841 L 235.45498,545.3398"
-     id="path2563"
-     sodipodi:nodetypes="cc" />
-</svg>
diff --git a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager.png b/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager.png
deleted file mode 100644
index b3c0a5b..0000000
--- a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager.png
+++ /dev/null
Binary files differ
diff --git a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager.svg b/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager.svg
deleted file mode 100644
index 68a51bf..0000000
--- a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager.svg
+++ /dev/null
@@ -1,570 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Generated by Graphviz version 2.20.2 (Mon Mar 30 10:11:53 UTC 2009)
-     For user: (joakim) Joakim Erdfelt,,, -->
-<!-- Title: G Pages: 1 -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="965.69556"
-   height="852.49811"
-   viewBox="0 0 327 590"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   sodipodi:docname="DeploymentManager.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0"
-   inkscape:export-filename="/home/joakim/code/webtide/jetty7-git/sandbox/jetty-deploy-manager/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager.png"
-   inkscape:export-xdpi="59.964943"
-   inkscape:export-ydpi="59.964943">
-  <metadata
-     id="metadata184">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs182">
-    <marker
-       inkscape:stockid="Arrow2Lstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lstart"
-       style="overflow:visible">
-      <path
-         id="path4328"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
-         transform="matrix(1.1,0,0,1.1,1.1,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend"
-       style="overflow:visible">
-      <path
-         id="path3605"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleOutL"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="TriangleOutL"
-       style="overflow:visible">
-      <path
-         id="path3727"
-         d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
-         transform="scale(0.8,0.8)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible">
-      <path
-         id="path3587"
-         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 368.75 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="408.75 : 368.75 : 1"
-       inkscape:persp3d-origin="204.375 : 245.83333 : 1"
-       id="perspective186" />
-    <title
-       id="title5">G</title>
-    <title
-       id="title10">incoming_app</title>
-    <title
-       id="title17">command_deploy</title>
-    <title
-       id="title33">state_deployed</title>
-  </defs>
-  <sodipodi:namedview
-     inkscape:window-height="1151"
-     inkscape:window-width="1920"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="1"
-     guidetolerance="10"
-     gridtolerance="10.0"
-     objecttolerance="13"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base"
-     showgrid="false"
-     inkscape:zoom="1"
-     inkscape:cx="474.19853"
-     inkscape:cy="442.53354"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:current-layer="svg2"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:document-units="cm"
-     units="cm"
-     inkscape:snap-guide="true"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="false"
-     inkscape:bbox-nodes="false"
-     inkscape:snap-intersection-line-segments="true"
-     inkscape:object-paths="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-center="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3514"
-       dotted="true"
-       visible="true"
-       enabled="true"
-       units="cm"
-       spacingx="0.25cm"
-       spacingy="0.25cm"
-       empspacing="5" />
-  </sodipodi:namedview>
-  <text
-     x="-78.66259"
-     y="28.720337"
-     style="font-size:20.46376419px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans Bold Italic"
-     id="text2456"
-     sodipodi:linespacing="100%">
-    <tspan
-       sodipodi:role="line"
-       id="tspan2460"
-       x="-78.662582"
-       y="28.720337"
-       style="font-size:20.46376419px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans Bold Italic">Deployment</tspan>
-    <tspan
-       sodipodi:role="line"
-       x="-78.66259"
-       y="49.184101"
-       id="tspan2464"
-       style="font-size:20.46376419px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans Bold Italic">Management</tspan>
-  </text>
-  <g
-     id="g3282"
-     transform="translate(102.27151,-84.291492)">
-    <polygon
-       style="fill:#ffad70;fill-opacity:1;stroke:none;stroke-width:0.1850972"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       id="polygon3273"
-       transform="matrix(2.3250213,0,0,1.0137256,-252.78172,805.8122)" />
-    <text
-       x="174.1483"
-       y="394.13333"
-       style="font-size:17.98741913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text3275"
-       sodipodi:linespacing="125%">
-      <tspan
-         y="394.13333"
-         x="174.1483"
-         id="tspan3277"
-         sodipodi:role="line">DeploymentManager</tspan>
-    </text>
-  </g>
-  <g
-     id="g3304"
-     transform="translate(129.1072,31.5257)">
-    <polygon
-       style="fill:#d5ff70;fill-opacity:1;stroke:none;stroke-width:0.1850972"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       id="polygon3289"
-       transform="matrix(1.5190294,0,0,1.4508985,-250.33457,723.80726)" />
-    <text
-       x="28.670605"
-       y="122.9516"
-       style="font-size:17.98741913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text3291"
-       sodipodi:linespacing="125%">
-      <tspan
-         y="122.9516"
-         x="28.670605"
-         id="tspan3293"
-         sodipodi:role="line">AppProvider</tspan>
-      <tspan
-         id="tspan3300"
-         y="145.43587"
-         x="28.670603"
-         sodipodi:role="line">Contexts Dir</tspan>
-    </text>
-  </g>
-  <g
-     id="g3310"
-     transform="translate(300.00818,31.5257)">
-    <polygon
-       transform="matrix(1.5190294,0,0,1.4508985,-250.33457,723.80726)"
-       id="polygon3312"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       style="fill:#d5ff70;fill-opacity:1;stroke:none;stroke-width:0.1850972" />
-    <text
-       sodipodi:linespacing="125%"
-       id="text3314"
-       style="font-size:17.98741913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       y="122.9516"
-       x="28.670605">
-      <tspan
-         sodipodi:role="line"
-         id="tspan3316"
-         x="28.670605"
-         y="122.9516">AppProvider</tspan>
-      <tspan
-         sodipodi:role="line"
-         x="28.670605"
-         y="145.43587"
-         id="tspan3318">Webapps Dir</tspan>
-    </text>
-  </g>
-  <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="M 246.279,212.30268 L 216.9954,189.48254"
-     id="path3344"
-     sodipodi:nodetypes="cc" />
-  <path
-     sodipodi:nodetypes="cc"
-     id="path3879"
-     d="M 246.279,212.30268 L 281.25982,189.48254"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <path
-     sodipodi:nodetypes="cc"
-     id="path3889"
-     d="M 338.25506,189.48254 L 338.25509,283.59126"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <path
-     sodipodi:nodetypes="cc"
-     id="path3891"
-     d="M 177.84916,189.48255 L 177.54883,283.59124"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <g
-     id="g3916"
-     transform="translate(105.09632,-15.083658)">
-    <polygon
-       transform="matrix(1.5190294,0,0,1.0137261,-95.187633,465.47084)"
-       id="polygon3903"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       style="fill:#70d9ff;fill-opacity:1;stroke:none;stroke-width:0.1850972" />
-    <text
-       sodipodi:linespacing="125%"
-       id="text3905"
-       style="font-size:17.98741913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       y="53.791767"
-       x="184.1996">
-      <tspan
-         id="tspan3909"
-         sodipodi:role="line"
-         x="184.1996"
-         y="53.791767">File System</tspan>
-    </text>
-  </g>
-  <path
-     sodipodi:nodetypes="cc"
-     id="path3921"
-     d="M 204.70466,128.54481 L 240.721,55.034003"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="M 343.12033,128.54481 L 309.92883,55.034003"
-     id="path3923"
-     sodipodi:nodetypes="cc" />
-  <polygon
-     style="fill:#ff913e;fill-opacity:1;stroke:none;stroke-width:0.1850972"
-     points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-     id="polygon4134"
-     transform="matrix(0.4627878,0,0,-5.402269,346.01282,-1753.521)" />
-  <g
-     id="g3971"
-     transform="translate(328.9625,-22.190946)">
-    <polygon
-       style="fill:#ffad70;fill-opacity:1;stroke:none;stroke-width:0.1850972"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       id="polygon3958"
-       transform="matrix(1.8107217,0,0,1.0137258,-329.65122,830.47882)" />
-    <text
-       x="2.6476707"
-       y="418.79987"
-       style="font-size:17.98741913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text3960"
-       sodipodi:linespacing="125%">
-      <tspan
-         id="tspan3964"
-         y="418.79987"
-         x="2.6476688"
-         sodipodi:role="line">DefaultDeployer</tspan>
-    </text>
-  </g>
-  <g
-     id="g3976"
-     transform="translate(328.58482,33.210928)">
-    <polygon
-       style="fill:#ffad70;fill-opacity:1;stroke:none;stroke-width:0.1850972"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       id="polygon3978"
-       transform="matrix(1.8107217,0,0,1.0137258,-329.65122,830.47882)" />
-    <text
-       x="2.6476707"
-       y="418.79987"
-       style="font-size:17.98741913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text3980"
-       sodipodi:linespacing="125%">
-      <tspan
-         id="tspan3982"
-         y="418.79987"
-         x="2.6476722"
-         sodipodi:role="line">DefaultStarter</tspan>
-    </text>
-  </g>
-  <g
-     id="g3984"
-     transform="translate(329.29103,86.176108)">
-    <polygon
-       style="fill:#ffad70;fill-opacity:1;stroke:none;stroke-width:0.1850972"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       id="polygon3986"
-       transform="matrix(1.8107217,0,0,1.0137258,-329.65122,830.47882)" />
-    <text
-       x="2.6476707"
-       y="418.79987"
-       style="font-size:17.98741913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text3988"
-       sodipodi:linespacing="125%">
-      <tspan
-         id="tspan3990"
-         y="418.79987"
-         x="2.6476693"
-         sodipodi:role="line">DefaultStopper</tspan>
-    </text>
-  </g>
-  <g
-     id="g4003"
-     transform="translate(148.88088,-17.953732)">
-    <polygon
-       style="fill:#ffad70;fill-opacity:1;stroke:none;stroke-width:0.1850972"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       id="polygon3994"
-       transform="matrix(2.102414,0,0,1.0137258,-216.3303,986.86761)" />
-    <text
-       x="169.63997"
-       y="575.18866"
-       style="font-size:17.98741913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       id="text3996"
-       sodipodi:linespacing="125%">
-      <tspan
-         id="tspan3998"
-         y="575.18866"
-         x="169.63997"
-         sodipodi:role="line">DefaultUndeployer</tspan>
-    </text>
-  </g>
-  <g
-     id="g4136"
-     transform="translate(163.00492,-10.846444)">
-    <polygon
-       transform="matrix(2.309669,0,0,3.2368503,-636.87384,1707.8548)"
-       id="polygon3927"
-       points="230,-432 138,-432 138,-390 230,-390 230,-432 "
-       style="fill:#70d9ff;fill-opacity:1;stroke:none;stroke-width:0.1850972" />
-    <text
-       sodipodi:linespacing="125%"
-       id="text3929"
-       style="font-size:17.98741913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-       y="331.32928"
-       x="-211.42046">
-      <tspan
-         id="tspan3933"
-         sodipodi:role="line"
-         x="-211.42046"
-         y="331.32928">Jetty Server</tspan>
-    </text>
-    <g
-       transform="translate(3.6339138,14.123438)"
-       id="g4042">
-      <rect
-         style="opacity:1;fill:#ffffff;fill-opacity:0.57352941;stroke:none;stroke-width:1.52362204;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect4033"
-         width="135.59087"
-         height="42.576458"
-         x="-282.93228"
-         y="367.66122"
-         ry="0" />
-      <text
-         x="-216.01076"
-         y="395.65521"
-         style="font-size:17.98741913px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-         id="text4038"
-         sodipodi:linespacing="125%">
-        <tspan
-           y="395.65521"
-           x="-216.01076"
-           sodipodi:role="line"
-           id="tspan4040">Handler</tspan>
-      </text>
-    </g>
-  </g>
-  <path
-     sodipodi:nodetypes="cc"
-     id="path4027"
-     d="M 249.19086,394.86412 L 19.29742,380.32317"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="M 248.81318,455.59753 L 19.29742,388.44449"
-     id="path4047"
-     sodipodi:nodetypes="cc" />
-  <path
-     sodipodi:nodetypes="cc"
-     id="path4049"
-     d="M 249.5194,508.56271 L 19.29742,398.33131"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="M 236.80775,555.87827 L 19.29742,408.92435"
-     id="path4051"
-     sodipodi:nodetypes="cc" />
-  <text
-     transform="matrix(0.9979899,6.3372504e-2,-6.3372504e-2,0.9979899,0,0)"
-     id="text4053"
-     y="375.59882"
-     x="71.124741"
-     style="font-size:13.11166096px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-     xml:space="preserve"><tspan
-       y="375.59882"
-       x="71.124741"
-       id="tspan4055"
-       sodipodi:role="line">Create/Add ContextHandler</tspan></text>
-  <text
-     transform="matrix(0.960082,0.2797186,-0.2797186,0.960082,0,0)"
-     id="text4061"
-     y="363.9259"
-     x="239.78268"
-     style="font-size:13.1116581px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-     xml:space="preserve"><tspan
-       y="363.9259"
-       x="239.78268"
-       id="tspan4063"
-       sodipodi:role="line">Start Handler</tspan></text>
-  <text
-     transform="matrix(0.9021783,0.4313632,-0.4313632,0.9021783,0,0)"
-     id="text4065"
-     y="346.85672"
-     x="305.1987"
-     style="font-size:13.11165524px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-     xml:space="preserve"><tspan
-       y="346.85672"
-       x="305.1987"
-       id="tspan4067"
-       sodipodi:role="line">Stop Handler</tspan></text>
-  <text
-     transform="matrix(0.8286045,0.5598344,-0.5598344,0.8286045,0,0)"
-     id="text4069"
-     y="324.38153"
-     x="358.96548"
-     style="font-size:13.1116581px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-     xml:space="preserve"
-     inkscape:transform-center-x="50.663071"
-     inkscape:transform-center-y="-52.951508"><tspan
-       y="324.38153"
-       x="358.96548"
-       id="tspan4071"
-       sodipodi:role="line">Remove Handler</tspan></text>
-  <path
-     sodipodi:nodetypes="cc"
-     id="path4073"
-     d="M 384.24468,305.40822 C 415.02857,303.94581 422.97175,327.74882 428.85613,353.36389"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99881887;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-  <text
-     transform="matrix(0.8492228,0.5280347,-0.5280347,0.8492228,0,0)"
-     id="text4075"
-     y="38.223793"
-     x="494.58685"
-     style="font-size:13.11166382px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-     xml:space="preserve"
-     inkscape:transform-center-x="-244.6352"
-     inkscape:transform-center-y="-504.72461"><tspan
-       y="38.223793"
-       x="494.58685"
-       sodipodi:role="line"
-       id="tspan4079">Process Phases</tspan></text>
-  <text
-     sodipodi:linespacing="125%"
-     id="text4094"
-     style="font-size:24.99049759px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-     y="-423.87344"
-     x="420.23651"
-     transform="matrix(0,1,-1,0,0,0)">
-    <tspan
-       sodipodi:role="line"
-       id="tspan4096"
-       x="420.23651"
-       y="-423.87344">Lifecycle</tspan>
-  </text>
-  <text
-     transform="matrix(1,1.6038357e-4,-1.6038357e-4,1,0,0)"
-     id="text2579"
-     y="228.70334"
-     x="180.83775"
-     style="font-size:13.11166191px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-     xml:space="preserve"
-     inkscape:transform-center-x="-17.522216"
-     inkscape:transform-center-y="1.6854193"><tspan
-       y="228.70334"
-       x="180.83775"
-       sodipodi:role="line"
-       id="tspan3922">App</tspan></text>
-  <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00542861;stroke-linecap:butt;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="M 246.54365,283.59124 L 246.279,212.30268"
-     id="path2583"
-     sodipodi:nodetypes="cc" />
-  <text
-     transform="matrix(1,1.6038357e-4,-1.6038357e-4,1,0,0)"
-     id="text3912"
-     y="228.69254"
-     x="248.14288"
-     style="font-size:13.11166191px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-     xml:space="preserve"
-     inkscape:transform-center-x="-17.522216"
-     inkscape:transform-center-y="1.6854193"><tspan
-       y="228.69254"
-       x="248.14288"
-       sodipodi:role="line"
-       id="tspan3916">Start</tspan><tspan
-       y="245.08211"
-       x="248.14288"
-       sodipodi:role="line"
-       id="tspan3920">Stop</tspan></text>
-  <text
-     transform="matrix(1,1.6038357e-4,-1.6038357e-4,1,0,0)"
-     id="text3926"
-     y="228.6776"
-     x="341.29437"
-     style="font-size:13.11166191px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-     xml:space="preserve"
-     inkscape:transform-center-x="-17.522216"
-     inkscape:transform-center-y="1.6854193"><tspan
-       y="228.6776"
-       x="341.29437"
-       sodipodi:role="line"
-       id="tspan3928">App</tspan></text>
-</svg>
diff --git a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager_Roles.png b/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager_Roles.png
deleted file mode 100644
index 4b96a6b..0000000
--- a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager_Roles.png
+++ /dev/null
Binary files differ
diff --git a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager_Roles.svg b/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager_Roles.svg
deleted file mode 100644
index 7185759..0000000
--- a/jetty-deploy-manager-graph/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager_Roles.svg
+++ /dev/null
@@ -1,389 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Generated by Graphviz version 2.20.2 (Mon Mar 30 10:11:53 UTC 2009)
-     For user: (joakim) Joakim Erdfelt,,, -->
-<!-- Title: G Pages: 1 -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="439.37006"
-   height="729.92126"
-   viewBox="0 0 327 590"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   sodipodi:docname="DeploymentManager Roles.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0"
-   inkscape:export-filename="/home/joakim/code/webtide/jetty7-git/sandbox/jetty-deploy-manager/src/main/javadoc/org/eclipse/jetty/deploy/doc-files/DeploymentManager_Roles.png"
-   inkscape:export-xdpi="40"
-   inkscape:export-ydpi="40">
-  <metadata
-     id="metadata184">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs182">
-    <linearGradient
-       id="linearGradient3424">
-      <stop
-         style="stop-color:#ff7107;stop-opacity:1;"
-         offset="0"
-         id="stop3426" />
-      <stop
-         style="stop-color:#ffeee0;stop-opacity:1;"
-         offset="1"
-         id="stop3428" />
-    </linearGradient>
-    <marker
-       inkscape:stockid="Arrow2Lstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lstart"
-       style="overflow:visible">
-      <path
-         id="path4328"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
-         transform="matrix(1.1,0,0,1.1,1.1,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend"
-       style="overflow:visible">
-      <path
-         id="path3605"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleOutL"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="TriangleOutL"
-       style="overflow:visible">
-      <path
-         id="path3727"
-         d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
-         transform="scale(0.8,0.8)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible">
-      <path
-         id="path3587"
-         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 368.75 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="408.75 : 368.75 : 1"
-       inkscape:persp3d-origin="204.375 : 245.83333 : 1"
-       id="perspective186" />
-    <title
-       id="title5">G</title>
-    <title
-       id="title10">incoming_app</title>
-    <title
-       id="title17">command_deploy</title>
-    <title
-       id="title33">state_deployed</title>
-  </defs>
-  <sodipodi:namedview
-     inkscape:window-height="1151"
-     inkscape:window-width="1920"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="1"
-     guidetolerance="10"
-     gridtolerance="10.0"
-     objecttolerance="13"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base"
-     showgrid="false"
-     inkscape:zoom="1"
-     inkscape:cx="261.1181"
-     inkscape:cy="392.53714"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:current-layer="svg2"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:document-units="cm"
-     units="cm"
-     inkscape:snap-guide="true"
-     inkscape:snap-bbox="true"
-     inkscape:bbox-paths="false"
-     inkscape:bbox-nodes="false"
-     inkscape:snap-intersection-line-segments="true"
-     inkscape:object-paths="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-center="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3514"
-       dotted="true"
-       visible="true"
-       enabled="true"
-       units="cm"
-       spacingx="0.25cm"
-       spacingy="0.25cm"
-       empspacing="5" />
-  </sodipodi:namedview>
-  <g
-     id="g4043"
-     transform="matrix(1.1578745,0,0,1.1578745,-22.605787,-30.429653)">
-    <g
-       transform="translate(6.2287521,5.1906208)"
-       id="g3432">
-      <rect
-         style="opacity:1;fill:#ff984b;fill-opacity:1;stroke:none;stroke-width:1.52362204;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect2582"
-         width="271.29678"
-         height="108.65714"
-         x="18.959866"
-         y="223.19566"
-         ry="46.920952"
-         rx="50.806107" />
-      <text
-         sodipodi:linespacing="125%"
-         id="text3275"
-         style="font-size:25.83806229px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans Bold"
-         y="268.40268"
-         x="153.72513">
-        <tspan
-           sodipodi:role="line"
-           id="tspan3277"
-           x="153.72513"
-           y="268.40268">Deployment</tspan>
-        <tspan
-           sodipodi:role="line"
-           x="153.72513"
-           y="300.70026"
-           id="tspan3378">Manager</tspan>
-      </text>
-    </g>
-    <g
-       transform="translate(62.97961,2.9413488)"
-       id="g3418">
-      <rect
-         rx="20.920155"
-         ry="46.920952"
-         y="347.77072"
-         x="-37.790993"
-         height="47.75378"
-         width="119.23236"
-         id="rect3380"
-         style="opacity:1;fill:#ffd7b9;fill-opacity:1;stroke:none;stroke-width:1.52362204;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <text
-         x="21.438501"
-         y="366.92834"
-         style="font-size:17.21594238px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-         id="text3382"
-         sodipodi:linespacing="110%">
-        <tspan
-           id="tspan3386"
-           y="366.92834"
-           x="21.438501"
-           sodipodi:role="line">Bind</tspan>
-        <tspan
-           y="385.86588"
-           x="21.438503"
-           sodipodi:role="line"
-           id="tspan3390">Lifecycle</tspan>
-      </text>
-    </g>
-    <g
-       transform="translate(2.1078682,5.3948095)"
-       id="g3412">
-      <rect
-         style="opacity:1;fill:#ffd7b9;fill-opacity:1;stroke:none;stroke-width:1.52362204;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect3392"
-         width="119.23236"
-         height="47.75378"
-         x="175.14517"
-         y="345.31726"
-         ry="46.920952"
-         rx="20.920155" />
-      <text
-         sodipodi:linespacing="110%"
-         id="text3394"
-         style="font-size:17.21594238px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-         y="364.21011"
-         x="234.37466">
-        <tspan
-           sodipodi:role="line"
-           x="234.37466"
-           y="364.21011"
-           id="tspan3396">Use</tspan>
-        <tspan
-           id="tspan3398"
-           sodipodi:role="line"
-           x="234.37466"
-           y="383.14764">Lifecycle</tspan>
-      </text>
-    </g>
-    <rect
-       style="opacity:1;fill:#ffd970;fill-opacity:1;stroke:none;stroke-width:1.52362204;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3400"
-       width="271.29678"
-       height="108.65714"
-       x="25.188618"
-       y="412.13449"
-       ry="46.920952"
-       rx="50.806107" />
-    <text
-       sodipodi:linespacing="125%"
-       id="text3402"
-       style="font-size:25.83806229px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans Bold"
-       y="458.72568"
-       x="159.2618">
-      <tspan
-         sodipodi:role="line"
-         x="159.2618"
-         y="458.72568"
-         id="tspan3406">Deployment</tspan>
-      <tspan
-         id="tspan3410"
-         sodipodi:role="line"
-         x="159.2618"
-         y="491.02325">Lifecycle</tspan>
-    </text>
-    <g
-       transform="translate(6.2287521,-178.55759)"
-       id="g3438">
-      <rect
-         rx="50.806107"
-         ry="46.920952"
-         y="223.19566"
-         x="18.959866"
-         height="108.65714"
-         width="271.29678"
-         id="rect3440"
-         style="opacity:1;fill:#d5ff70;fill-opacity:1;stroke:none;stroke-width:1.52362204;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <text
-         x="153.72513"
-         y="268.40268"
-         style="font-size:25.83806229px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans Bold"
-         id="text3442"
-         sodipodi:linespacing="125%">
-        <tspan
-           id="tspan3446"
-           y="268.40268"
-           x="153.72513"
-           sodipodi:role="line">App</tspan>
-        <tspan
-           id="tspan3450"
-           y="300.70026"
-           x="153.72513"
-           sodipodi:role="line">Provider</tspan>
-      </text>
-    </g>
-    <g
-       id="g3452"
-       transform="translate(62.97961,-180.80686)">
-      <rect
-         style="opacity:1;fill:#ffd7b9;fill-opacity:1;stroke:none;stroke-width:1.52362204;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect3454"
-         width="119.23236"
-         height="47.75378"
-         x="-37.790993"
-         y="347.77072"
-         ry="46.920952"
-         rx="20.920155" />
-      <text
-         sodipodi:linespacing="110%"
-         id="text3456"
-         style="font-size:17.21594238px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-         y="366.92834"
-         x="21.438501">
-        <tspan
-           id="tspan3478"
-           sodipodi:role="line"
-           x="21.438499"
-           y="366.92834">Manage</tspan>
-        <tspan
-           id="tspan3482"
-           sodipodi:role="line"
-           x="21.438501"
-           y="385.86588">Provider</tspan>
-      </text>
-    </g>
-    <g
-       transform="translate(215.04403,-180.80686)"
-       id="g3462">
-      <rect
-         rx="20.920155"
-         ry="46.920952"
-         y="347.77072"
-         x="-37.790993"
-         height="47.75378"
-         width="119.23236"
-         id="rect3464"
-         style="opacity:1;fill:#ffd7b9;fill-opacity:1;stroke:none;stroke-width:1.52362204;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <text
-         x="21.438501"
-         y="366.92834"
-         style="font-size:17.21594238px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:110.00000238%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
-         id="text3466"
-         sodipodi:linespacing="110%">
-        <tspan
-           y="366.92834"
-           x="21.438503"
-           sodipodi:role="line"
-           id="tspan3470">Process</tspan>
-        <tspan
-           id="tspan3474"
-           y="385.86588"
-           x="21.438499"
-           sodipodi:role="line">App</tspan>
-      </text>
-    </g>
-    <path
-       style="opacity:0.61261262;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.86833984;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 195.13829,151.79607 L 195.13829,229.04598"
-       id="path4023"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="opacity:0.61261262;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.86833984;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 127.84895,230.68829 L 127.84895,153.43838"
-       id="path4037"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="opacity:0.61261262;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.86833984;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 195.13829,335.87758 L 195.13829,413.12749"
-       id="path4039"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="opacity:0.61261262;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.86833984;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 127.84895,335.87758 L 127.84895,413.12749"
-       id="path4041"
-       sodipodi:nodetypes="cc" />
-  </g>
-</svg>
diff --git a/jetty-deploy-manager-graph/src/main/javadoc/overview.html b/jetty-deploy-manager-graph/src/main/javadoc/overview.html
deleted file mode 100644
index 689d4f4..0000000
--- a/jetty-deploy-manager-graph/src/main/javadoc/overview.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-  <HEAD>
-    <TITLE>Jetty DeploymentManager API Overview</TITLE>
-  </HEAD>
-  <BODY>
-    Short overview of the API.
-  </BODY>
-</HTML>
diff --git a/jetty-deploy-manager-graph/src/main/resources/org/eclipse/jetty/deploy/lifecycle-bindings.txt b/jetty-deploy-manager-graph/src/main/resources/org/eclipse/jetty/deploy/lifecycle-bindings.txt
deleted file mode 100644
index ed00104..0000000
--- a/jetty-deploy-manager-graph/src/main/resources/org/eclipse/jetty/deploy/lifecycle-bindings.txt
+++ /dev/null
@@ -1 +0,0 @@
-# Default Bindings
\ No newline at end of file
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/AppLifeCyclePathCollector.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/AppLifeCyclePathCollector.java
deleted file mode 100644
index 573d105..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/AppLifeCyclePathCollector.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jetty.deploy.graph.Node;
-import org.junit.Assert;
-
-/**
- * Binds to all lifecycle nodes, and tracks the order of the lifecycle nodes for testing purposes.
- */
-public class AppLifeCyclePathCollector implements AppLifeCycle.Binding
-{
-    List<Node> actualOrder = new ArrayList<Node>();
-
-    public void clear()
-    {
-        actualOrder.clear();
-    }
-
-    public List<Node> getCapturedPath()
-    {
-        return actualOrder;
-    }
-
-    public String[] getBindingTargets()
-    {
-        return new String[]
-        { "*" };
-    }
-
-    public void processBinding(Node node, App app, DeploymentManager deploymentManager) throws Exception
-    {
-        actualOrder.add(node);
-    }
-
-    public void assertExpected(String msg, List<String> expectedOrder)
-    {
-        if (expectedOrder.size() != actualOrder.size())
-        {
-            System.out.println("/* Expected Path */");
-            for (String path : expectedOrder)
-            {
-                System.out.println(path);
-            }
-            System.out.println("/* Actual Path */");
-            for (Node path : actualOrder)
-            {
-                System.out.println(path.getName());
-            }
-
-            Assert.assertEquals(msg + " / count",expectedOrder.size(),actualOrder.size());
-        }
-
-        for (int i = 0, n = expectedOrder.size(); i < n; i++)
-        {
-            Assert.assertEquals(msg + "[" + i + "]",expectedOrder.get(i),actualOrder.get(i).getName());
-        }
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/AppLifeCycleTest.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/AppLifeCycleTest.java
deleted file mode 100644
index 0f3dd33..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/AppLifeCycleTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jetty.deploy.graph.Node;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Just an overly picky test case to validate the potential paths.
- */
-public class AppLifeCycleTest
-{
-    private void assertNoPath(String from, String to)
-    {
-        assertPath(from,to,new ArrayList<String>());
-    }
-
-    private void assertPath(AppLifeCycle lifecycle, String from, String to, List<String> expected)
-    {
-        Node fromNode = lifecycle.getNodeByName(from);
-        Node toNode = lifecycle.getNodeByName(to);
-        List<Node> actual = lifecycle.findPath(fromNode,toNode);
-        String msg = "LifeCycle path from " + from + " to " + to;
-        Assert.assertNotNull(msg + " should never be null",actual);
-
-        if (expected.size() != actual.size())
-        {
-            System.out.println();
-            System.out.printf("/* from '%s' -> '%s' */%n",from,to);
-            System.out.println("/* Expected Path */");
-            for (String path : expected)
-            {
-                System.out.println(path);
-            }
-            System.out.println("/* Actual Path */");
-            for (Node path : actual)
-            {
-                System.out.println(path.getName());
-            }
-
-            Assert.assertEquals(msg + " / count",expected.size(),actual.size());
-        }
-
-        for (int i = 0, n = expected.size(); i < n; i++)
-        {
-            Assert.assertEquals(msg + "[" + i + "]",expected.get(i),actual.get(i).getName());
-        }
-    }
-
-    private void assertPath(String from, String to, List<String> expected)
-    {
-        AppLifeCycle lifecycle = new AppLifeCycle();
-        assertPath(lifecycle,from,to,expected);
-    }
-
-    @Test
-    public void testFindPath_Deployed_Deployed()
-    {
-        assertNoPath("deployed","deployed");
-    }
-
-    @Test
-    public void testFindPath_Deployed_Started()
-    {
-        List<String> expected = new ArrayList<String>();
-        expected.add("deployed");
-        expected.add("pre-starting");
-        expected.add("starting");
-        expected.add("started");
-        assertPath("deployed","started",expected);
-    }
-
-    @Test
-    public void testFindPath_Deployed_Undeployed()
-    {
-        List<String> expected = new ArrayList<String>();
-        expected.add("deployed");
-        expected.add("pre-undeploying");
-        expected.add("undeploying");
-        expected.add("undeployed");
-        assertPath("deployed","undeployed",expected);
-    }
-
-    @Test
-    public void testFindPath_Started_Deployed()
-    {
-        List<String> expected = new ArrayList<String>();
-        expected.add("started");
-        expected.add("pre-stopping");
-        expected.add("stopping");
-        expected.add("deployed");
-        assertPath("started","deployed",expected);
-    }
-
-    @Test
-    public void testFindPath_Started_Started()
-    {
-        assertNoPath("started","started");
-    }
-
-    @Test
-    public void testFindPath_Started_Undeployed()
-    {
-        List<String> expected = new ArrayList<String>();
-        expected.add("started");
-        expected.add("pre-stopping");
-        expected.add("stopping");
-        expected.add("deployed");
-        expected.add("pre-undeploying");
-        expected.add("undeploying");
-        expected.add("undeployed");
-        assertPath("started","undeployed",expected);
-    }
-
-    @Test
-    public void testFindPath_Undeployed_Deployed()
-    {
-        List<String> expected = new ArrayList<String>();
-        expected.add("undeployed");
-        expected.add("pre-deploying");
-        expected.add("deploying");
-        expected.add("deployed");
-        assertPath("undeployed","deployed",expected);
-    }
-
-    @Test
-    public void testFindPath_Undeployed_Started()
-    {
-        List<String> expected = new ArrayList<String>();
-        expected.add("undeployed");
-        expected.add("pre-deploying");
-        expected.add("deploying");
-        expected.add("deployed");
-        expected.add("pre-starting");
-        expected.add("starting");
-        expected.add("started");
-        assertPath("undeployed","started",expected);
-    }
-
-    @Test
-    public void testFindPath_Undeployed_Uavailable()
-    {
-        assertNoPath("undeployed","undeployed");
-    }
-
-    /**
-     * Request multiple lifecycle paths with a single lifecycle instance. Just to ensure that there is no state
-     * maintained between {@link AppLifeCycle#findPath(Node, Node)} requests.
-     */
-    @Test
-    public void testFindPathMultiple()
-    {
-        AppLifeCycle lifecycle = new AppLifeCycle();
-        List<String> expected = new ArrayList<String>();
-
-        lifecycle.removeEdge("deployed","pre-starting");
-        lifecycle.addEdge("deployed","staging");
-        lifecycle.addEdge("staging","staged");
-        lifecycle.addEdge("staged","pre-starting");
-
-        // Deployed -> Deployed
-        expected.clear();
-        assertPath(lifecycle,"deployed","deployed",expected);
-
-        // Deployed -> Staged
-        expected.clear();
-        expected.add("deployed");
-        expected.add("staging");
-        expected.add("staged");
-        assertPath(lifecycle,"deployed","staged",expected);
-
-        // Staged -> Undeployed
-        expected.clear();
-        expected.add("staged");
-        expected.add("pre-starting");
-        expected.add("starting");
-        expected.add("started");
-        expected.add("pre-stopping");
-        expected.add("stopping");
-        expected.add("deployed");
-        expected.add("pre-undeploying");
-        expected.add("undeploying");
-        expected.add("undeployed");
-        assertPath(lifecycle,"staged","undeployed",expected);
-
-        // Undeployed -> Started
-        expected.clear();
-        expected.add("undeployed");
-        expected.add("pre-deploying");
-        expected.add("deploying");
-        expected.add("deployed");
-        expected.add("staging");
-        expected.add("staged");
-        expected.add("pre-starting");
-        expected.add("starting");
-        expected.add("started");
-        assertPath(lifecycle,"undeployed","started",expected);
-    }
-
-}
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/DeploymentManagerLifeCyclePathTest.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/DeploymentManagerLifeCyclePathTest.java
deleted file mode 100644
index d306ab5..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/DeploymentManagerLifeCyclePathTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.junit.Test;
-
-public class DeploymentManagerLifeCyclePathTest
-{
-    @Test
-    public void testStateTransition_NewToDeployed() throws Exception
-    {
-        DeploymentManager depman = new DeploymentManager();
-        depman.setDefaultLifeCycleGoal(null); // no default
-        AppLifeCyclePathCollector pathtracker = new AppLifeCyclePathCollector();
-        MockAppProvider mockProvider = new MockAppProvider();
-
-        depman.addLifeCycleBinding(pathtracker);
-        depman.addAppProvider(mockProvider);
-        depman.setContexts(new ContextHandlerCollection());
-
-        // Start DepMan
-        depman.start();
-
-        // Trigger new App
-        mockProvider.findWebapp("foo-webapp-1.war");
-
-        App app = depman.getAppByOriginId("mock-foo-webapp-1.war");
-
-        // Request Deploy of App
-        depman.requestAppGoal(app,"deployed");
-
-        // Setup Expectations.
-        List<String> expected = new ArrayList<String>();
-        // SHOULD NOT SEE THIS NODE VISITED - expected.add("undeployed");
-        expected.add("pre-deploying");
-        expected.add("deploying");
-        expected.add("deployed");
-
-        pathtracker.assertExpected("Test StateTransition / New -> Deployed",expected);
-    }
-
-    @Test
-    public void testStateTransition_Receive() throws Exception
-    {
-        DeploymentManager depman = new DeploymentManager();
-        depman.setDefaultLifeCycleGoal(null); // no default
-        AppLifeCyclePathCollector pathtracker = new AppLifeCyclePathCollector();
-        MockAppProvider mockProvider = new MockAppProvider();
-
-        depman.addLifeCycleBinding(pathtracker);
-        depman.addAppProvider(mockProvider);
-
-        // Start DepMan
-        depman.start();
-
-        // Trigger new App
-        mockProvider.findWebapp("foo-webapp-1.war");
-
-        // Perform no goal request.
-
-        // Setup Expectations.
-        List<String> expected = new ArrayList<String>();
-
-        pathtracker.assertExpected("Test StateTransition / New only",expected);
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/DeploymentManagerTest.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/DeploymentManagerTest.java
deleted file mode 100644
index 96f26a1..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/DeploymentManagerTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.eclipse.jetty.deploy;
-
-import java.util.Collection;
-import java.util.Set;
-
-import org.eclipse.jetty.deploy.test.XmlConfiguredJetty;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class DeploymentManagerTest
-{
-    @Test
-    public void testReceiveApp() throws Exception
-    {
-        DeploymentManager depman = new DeploymentManager();
-        depman.setDefaultLifeCycleGoal(null); // no default
-        AppLifeCyclePathCollector pathtracker = new AppLifeCyclePathCollector();
-        MockAppProvider mockProvider = new MockAppProvider();
-
-        depman.addLifeCycleBinding(pathtracker);
-        depman.addAppProvider(mockProvider);
-
-        // Start DepMan
-        depman.start();
-
-        // Trigger new App
-        mockProvider.findWebapp("foo-webapp-1.war");
-
-        // Test app tracking
-        Collection<App> apps = depman.getApps();
-        Assert.assertNotNull("Should never be null",apps);
-        Assert.assertEquals("Expected App Count",1,apps.size());
-
-        // Test app get
-        App actual = depman.getAppByOriginId("mock-foo-webapp-1.war");
-        Assert.assertNotNull("Should have gotten app (by id)",actual);
-        Assert.assertEquals("Should have gotten app (by id)","mock-foo-webapp-1.war",actual.getOriginId());
-    }
-
-    @Test
-    public void testBinding()
-    {
-        AppLifeCyclePathCollector pathtracker = new AppLifeCyclePathCollector();
-        DeploymentManager depman = new DeploymentManager();
-        depman.addLifeCycleBinding(pathtracker);
-
-        Set<AppLifeCycle.Binding> allbindings = depman.getLifeCycle().getBindings();
-        Assert.assertNotNull("All Bindings should never be null",allbindings);
-        Assert.assertEquals("All Bindings.size",1,allbindings.size());
-
-        Set<AppLifeCycle.Binding> deploybindings = depman.getLifeCycle().getBindings("deploying");
-        Assert.assertNotNull("'deploying' Bindings should not be null",deploybindings);
-        Assert.assertEquals("'deploying' Bindings.size",1,deploybindings.size());
-    }
-
-    @Test
-    public void testXmlConfigured() throws Exception
-    {
-        XmlConfiguredJetty jetty = null;
-        try
-        {
-            jetty = new XmlConfiguredJetty();
-            jetty.addConfiguration("jetty.xml");
-            jetty.addConfiguration("jetty-deploymgr-contexts.xml");
-
-            // Should not throw an Exception
-            jetty.load();
-
-            // Start it
-            jetty.start();
-        }
-        finally
-        {
-            if (jetty != null)
-            {
-                try
-                {
-                    jetty.stop();
-                }
-                catch (Exception ignore)
-                {
-                    // ignore
-                }
-            }
-        }
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/MockAppProvider.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/MockAppProvider.java
deleted file mode 100644
index 2fd52d5..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/MockAppProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy;
-
-import java.io.File;
-
-import org.eclipse.jetty.deploy.test.MavenTestingUtils;
-import org.eclipse.jetty.util.component.AbstractLifeCycle;
-
-public class MockAppProvider extends AbstractLifeCycle implements AppProvider
-{
-    private DeploymentManager deployMan;
-    private File webappsDir;
-
-    public void setDeploymentManager(DeploymentManager deploymentManager)
-    {
-        this.deployMan = deploymentManager;
-    }
-
-    @Override
-    public void doStart()
-    {
-        this.webappsDir = MavenTestingUtils.getTestResourceDir("webapps");
-    }
-
-    public void findWebapp(String name)
-    {
-        File war = new File(webappsDir,name);
-        App app = new App("mock-" + name,war);
-        this.deployMan.addApp(app);
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProviderRuntimeUpdatesTest.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProviderRuntimeUpdatesTest.java
deleted file mode 100644
index ab284f8..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProviderRuntimeUpdatesTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.providers;
-
-import java.io.IOException;
-
-import org.eclipse.jetty.deploy.test.XmlConfiguredJetty;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Similar in scope to {@link MonitoredDirAppProviderStartupTest}, except is concerned with the modification of existing
- * deployed webapps due to incoming changes identified by the {@link MonitoredDirAppProvider}.
- */
-public class MonitoredDirAppProviderRuntimeUpdatesTest
-{
-    private static XmlConfiguredJetty jetty;
-
-    @Before
-    public void setupEnvironment() throws Exception
-    {
-        jetty = new XmlConfiguredJetty();
-        jetty.addConfiguration("jetty.xml");
-        jetty.addConfiguration("jetty-deploymgr-contexts.xml");
-
-        // Should not throw an Exception
-        jetty.load();
-
-        // Start it
-        jetty.start();
-    }
-
-    @After
-    public void teardownEnvironment() throws Exception
-    {
-        // Stop jetty.
-        jetty.stop();
-    }
-
-    /**
-     * Simple webapp deployment after startup of server.
-     */
-    @Test
-    public void testAfterStartupContext() throws IOException
-    {
-        jetty.copyWebapp("foo-webapp-1.war","foo.war");
-        jetty.copyContext("foo.xml","foo.xml");
-
-        jetty.waitForDirectoryScan();
-
-        jetty.assertWebAppContextsExists("/foo");
-    }
-
-    /**
-     * Simple webapp deployment after startup of server, and then removal of the webapp.
-     */
-    @Test
-    public void testAfterStartupThenRemoveContext() throws IOException
-    {
-        jetty.copyWebapp("foo-webapp-1.war","foo.war");
-        jetty.copyContext("foo.xml","foo.xml");
-
-        jetty.waitForDirectoryScan();
-
-        jetty.assertWebAppContextsExists("/foo");
-
-        jetty.removeContext("foo.xml");
-
-        jetty.waitForDirectoryScan();
-
-        // FIXME: hot undeploy with removal not working! - jetty.assertNoWebAppContexts();
-    }
-
-    /**
-     * Simple webapp deployment after startup of server, and then removal of the webapp.
-     */
-    @Test
-    public void testAfterStartupThenUpdateContext() throws IOException
-    {
-        jetty.copyWebapp("foo-webapp-1.war","foo.war");
-        jetty.copyContext("foo.xml","foo.xml");
-
-        jetty.waitForDirectoryScan();
-
-        jetty.assertWebAppContextsExists("/foo");
-
-        // Test that webapp response contains "-1"
-        jetty.assertResponseContains("/foo/info","FooServlet-1");
-
-        System.out.println("Updating war files");
-        jetty.copyContext("foo.xml","foo.xml"); // essentially "touch" the context xml
-        jetty.copyWebapp("foo-webapp-2.war","foo.war");
-
-        // This should result in the existing foo.war being replaced with the new foo.war
-        jetty.waitForDirectoryScan();
-        jetty.waitForDirectoryScan();
-        jetty.assertWebAppContextsExists("/foo");
-
-        // Test that webapp response contains "-2"
-        jetty.assertResponseContains("/foo/info","FooServlet-2");
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProviderStartupTest.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProviderStartupTest.java
deleted file mode 100644
index aa2abfe..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProviderStartupTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.providers;
-
-import org.eclipse.jetty.deploy.test.XmlConfiguredJetty;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-/**
- * Tests {@link MonitoredDirAppProvider} as it starts up for the first time.
- */
-public class MonitoredDirAppProviderStartupTest
-{
-    private static XmlConfiguredJetty jetty;
-
-    @BeforeClass
-    public static void setupEnvironment() throws Exception
-    {
-        jetty = new XmlConfiguredJetty();
-        jetty.addConfiguration("jetty.xml");
-        jetty.addConfiguration("jetty-deploymgr-contexts.xml");
-
-        // Setup initial context
-        jetty.copyContext("foo.xml","foo.xml");
-        jetty.copyWebapp("foo-webapp-1.war","foo.war");
-
-        // Should not throw an Exception
-        jetty.load();
-
-        // Start it
-        jetty.start();
-    }
-
-    @AfterClass
-    public static void teardownEnvironment() throws Exception
-    {
-        // Stop jetty.
-        jetty.stop();
-    }
-
-    @Test
-    public void testStartupContext()
-    {
-        // Check Server for Handlers
-        jetty.printHandlers(System.out);
-        jetty.assertWebAppContextsExists("/foo");
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/test/MavenTestingUtils.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/test/MavenTestingUtils.java
deleted file mode 100644
index cb9dfce..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/test/MavenTestingUtils.java
+++ /dev/null
@@ -1,219 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.test;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.util.IO;
-
-/**
- * Common utility methods for working with JUnit tests cases in a maven friendly way.
- */
-public class MavenTestingUtils
-{
-    private static File basedir;
-    private static File testResourcesDir;
-    private static File targetDir;
-
-    // private static Boolean surefireRunning;
-
-    public static File getBasedir()
-    {
-        if (basedir == null)
-        {
-            String cwd = System.getProperty("basedir");
-
-            if (cwd == null)
-            {
-                cwd = System.getProperty("user.dir");
-            }
-
-            basedir = new File(cwd);
-        }
-
-        return basedir;
-    }
-
-    /**
-     * Get the directory to the /target directory for this project.
-     * 
-     * @return the directory path to the target directory.
-     */
-    public static File getTargetDir()
-    {
-        if (targetDir == null)
-        {
-            targetDir = new File(getBasedir(),"target");
-            PathAssert.assertDirExists("Target Dir",targetDir);
-        }
-        return targetDir;
-    }
-
-    /**
-     * Create a {@link File} object for a path in the /target directory.
-     * 
-     * @param path
-     *            the path desired, no validation of existence is performed.
-     * @return the File to the path.
-     */
-    public static File getTargetFile(String path)
-    {
-        return new File(getTargetDir(),path.replace("/",File.separator));
-    }
-
-    public static File getTargetTestingDir()
-    {
-        File dir = new File(getTargetDir(),"testing");
-        if (!dir.exists())
-        {
-            dir.mkdirs();
-        }
-        return dir;
-    }
-
-    /**
-     * Get a dir in /target/ that uses the JUnit 3.x {@link TestCase#getName()} to make itself unique.
-     * 
-     * @param test
-     *            the junit 3.x testcase to base this new directory on.
-     * @return
-     */
-    public static File getTargetTestingDir(TestCase test)
-    {
-        return getTargetTestingDir(test.getName());
-    }
-
-    /**
-     * Get a dir in /target/ that uses the an arbitrary name.
-     * 
-     * @param testname
-     *            the testname to create directory against.
-     * @return
-     */
-    public static File getTargetTestingDir(String testname)
-    {
-        File dir = new File(getTargetDir(),"test-" + testname);
-        if (!dir.exists())
-        {
-            dir.mkdirs();
-        }
-        return dir;
-    }
-
-    /**
-     * Get a dir from the src/test/resource directory.
-     * 
-     * @param name
-     *            the name of the path to get (it must exist as a dir)
-     * @return the dir in src/test/resource
-     */
-    public static File getTestResourceDir(String name)
-    {
-        File dir = new File(getTestResourcesDir(),name);
-        PathAssert.assertDirExists("Test Resource Dir",dir);
-        return dir;
-    }
-
-    /**
-     * Get a file from the src/test/resource directory.
-     * 
-     * @param name
-     *            the name of the path to get (it must exist as a file)
-     * @return the file in src/test/resource
-     */
-    public static File getTestResourceFile(String name)
-    {
-        File file = new File(getTestResourcesDir(),name);
-        PathAssert.assertFileExists("Test Resource File",file);
-        return file;
-    }
-
-    /**
-     * Get a path resource (File or Dir) from the src/test/resource directory.
-     * 
-     * @param name
-     *            the name of the path to get (it must exist)
-     * @return the path in src/test/resource
-     */
-    public static File getTestResourcePath(String name)
-    {
-        File path = new File(getTestResourcesDir(),name);
-        PathAssert.assertExists("Test Resource Path",path);
-        return path;
-    }
-
-    /**
-     * Get the directory to the src/test/resource directory
-     * 
-     * @return the directory {@link File} to the src/test/resources directory
-     */
-    public static File getTestResourcesDir()
-    {
-        if (testResourcesDir == null)
-        {
-            testResourcesDir = new File(basedir,"src/test/resources".replace("/",File.separator));
-            PathAssert.assertDirExists("Test Resources Dir",testResourcesDir);
-        }
-        return testResourcesDir;
-    }
-
-    /**
-     * Read the contents of a file into a String and return it.
-     * 
-     * @param file
-     *            the file to read.
-     * @return the contents of the file.
-     * @throws IOException
-     *             if unable to read the file.
-     */
-    public static String readToString(File file) throws IOException
-    {
-        FileReader reader = null;
-        try
-        {
-            reader = new FileReader(file);
-            return IO.toString(reader);
-        }
-        finally
-        {
-            IO.close(reader);
-        }
-    }
-
-    /*
-    public static boolean isSurefireExecuting()
-    {
-        if (surefireRunning == null)
-        {
-            String val = System.getProperty("surefire.test.class.path");
-            if (val != null)
-            {
-                surefireRunning = Boolean.TRUE;
-            }
-            else
-            {
-                surefireRunning = Boolean.FALSE;
-            }
-        }
-        
-        return surefireRunning;
-    }
-    */
-}
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/test/PathAssert.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/test/PathAssert.java
deleted file mode 100644
index e4eaedc..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/test/PathAssert.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
-package org.eclipse.jetty.deploy.test;
-
-import java.io.File;
-
-import org.junit.Assert;
-
-public class PathAssert
-{
-    public static void assertDirExists(String msg, File path)
-    {
-        assertExists(msg,path);
-        Assert.assertTrue(msg + " path should be a Dir : " + path.getAbsolutePath(),path.isDirectory());
-    }
-
-    public static void assertFileExists(String msg, File path)
-    {
-        assertExists(msg,path);
-        Assert.assertTrue(msg + " path should be a File : " + path.getAbsolutePath(),path.isFile());
-    }
-
-    public static void assertExists(String msg, File path)
-    {
-        Assert.assertTrue(msg + " path should exist: " + path.getAbsolutePath(),path.exists());
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/test/XmlConfiguredJetty.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/test/XmlConfiguredJetty.java
deleted file mode 100644
index 14a2338..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/test/XmlConfiguredJetty.java
+++ /dev/null
@@ -1,441 +0,0 @@
-// ========================================================================
-// Copyright (c) Webtide LLC
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses.
-// ========================================================================
-
-package org.eclipse.jetty.deploy.test;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintStream;
-import java.net.InetAddress;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-import org.eclipse.jetty.deploy.DeploymentManager;
-import org.eclipse.jetty.http.HttpSchemes;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.eclipse.jetty.server.handler.HandlerCollection;
-import org.eclipse.jetty.util.IO;
-import org.eclipse.jetty.webapp.WebAppContext;
-import org.eclipse.jetty.xml.XmlConfiguration;
-import org.junit.Assert;
-
-/**
- * Allows for setting up a Jetty server for testing based on XML configuration files.
- */
-public class XmlConfiguredJetty
-{
-    private List<URL> xmlConfigurations;
-    private Properties properties = new Properties();
-    private Server server;
-    private int serverPort;
-    private String scheme = HttpSchemes.HTTP;
-    private File jettyHome;
-
-    public XmlConfiguredJetty() throws IOException
-    {
-        String testname = new Throwable().getStackTrace()[1].getClassName();
-
-        xmlConfigurations = new ArrayList<URL>();
-        properties = new Properties();
-
-        jettyHome = MavenTestingUtils.getTargetTestingDir(testname);
-        deleteContents(jettyHome); // Ensure that we are working with a pristene directory
-        // Prepare Jetty.Home (Test) dir
-        jettyHome.mkdirs();
-
-        File logsDir = new File(jettyHome,"logs");
-        logsDir.mkdirs();
-
-        File etcDir = new File(jettyHome,"etc");
-        etcDir.mkdirs();
-        IO.copyFile(MavenTestingUtils.getTestResourceFile("etc/realm.properties"),new File(etcDir,"realm.properties"));
-        IO.copyFile(MavenTestingUtils.getTestResourceFile("etc/webdefault.xml"),new File(etcDir,"webdefault.xml"));
-
-        File contextsDir = new File(jettyHome,"contexts");
-        if (contextsDir.exists())
-        {
-            deleteContents(contextsDir);
-        }
-        contextsDir.mkdirs();
-        File webappsDir = new File(jettyHome,"webapps");
-        if (webappsDir.exists())
-        {
-            deleteContents(webappsDir);
-        }
-        webappsDir.mkdirs();
-        File tmpDir = new File(jettyHome,"tmp");
-        tmpDir.mkdirs();
-
-        // Setup properties
-        System.setProperty("java.io.tmpdir",tmpDir.getAbsolutePath());
-        properties.setProperty("jetty.home",jettyHome.getAbsolutePath());
-        System.setProperty("jetty.home",jettyHome.getAbsolutePath());
-        properties.setProperty("test.basedir",MavenTestingUtils.getBasedir().getAbsolutePath());
-        properties.setProperty("test.resourcesdir",MavenTestingUtils.getTestResourcesDir().getAbsolutePath());
-        properties.setProperty("test.webapps",webappsDir.getAbsolutePath());
-        properties.setProperty("test.targetdir",MavenTestingUtils.getTargetDir().getAbsolutePath());
-
-        // Write out configuration for use by ConfigurationManager.
-        File testConfig = MavenTestingUtils.getTargetFile("xml-configured-jetty.properties");
-        FileOutputStream out = new FileOutputStream(testConfig);
-        properties.store(out,"Generated by " + XmlConfiguredJetty.class.getName());
-    }
-
-    public void addConfiguration(File xmlConfigFile) throws MalformedURLException
-    {
-        xmlConfigurations.add(xmlConfigFile.toURI().toURL());
-    }
-
-    public void addConfiguration(String testConfigName) throws MalformedURLException
-    {
-        addConfiguration(MavenTestingUtils.getTestResourceFile(testConfigName));
-    }
-
-    public void addConfiguration(URL xmlConfig)
-    {
-        xmlConfigurations.add(xmlConfig);
-    }
-
-    public void assertNoWebAppContexts()
-    {
-        List<WebAppContext> contexts = getWebAppContexts();
-        if (contexts.size() > 0)
-        {
-            for (WebAppContext context : contexts)
-            {
-                System.out.println("WebAppContext should not exist:\n" + toString(context));
-            }
-            Assert.assertEquals("Contexts.size",0,contexts.size());
-        }
-    }
-
-    public String getResponse(String path) throws IOException
-    {
-        URI destUri = getServerURI().resolve(path);
-        URL url = destUri.toURL();
-
-        URLConnection conn = url.openConnection();
-
-        InputStream in = null;
-        try
-        {
-            in = conn.getInputStream();
-            return IO.toString(in);
-        }
-        finally
-        {
-            IO.close(in);
-        }
-    }
-
-    public void assertResponseContains(String path, String needle) throws IOException
-    {
-        System.out.println("Issuing request to " + path);
-        String content = getResponse(path);
-        Assert.assertTrue("Content should contain <" + needle + ">, instead got <" + content + ">",content.contains(needle));
-    }
-
-    public void assertWebAppContextsExists(String... expectedContextPaths)
-    {
-        List<WebAppContext> contexts = getWebAppContexts();
-        if (expectedContextPaths.length != contexts.size())
-        {
-            System.out.println("## Expected Contexts");
-            for (String expected : expectedContextPaths)
-            {
-                System.out.println(expected);
-            }
-            System.out.println("## Actual Contexts");
-            for (WebAppContext context : contexts)
-            {
-                System.out.printf("%s ## %s%n",context.getContextPath(),context);
-            }
-            Assert.assertEquals("Contexts.size",expectedContextPaths.length,contexts.size());
-        }
-
-        for (String expectedPath : expectedContextPaths)
-        {
-            boolean found = false;
-            for (WebAppContext context : contexts)
-            {
-                if (context.getContextPath().equals(expectedPath))
-                {
-                    found = true;
-                    break;
-                }
-            }
-            Assert.assertTrue("Did not find Expected Context Path " + expectedPath,found);
-        }
-    }
-
-    public void copyContext(String srcName, String destName) throws IOException
-    {
-        System.out.printf("Copying Context: %s -> %s%n",srcName,destName);
-        File srcDir = MavenTestingUtils.getTestResourceDir("contexts");
-        File destDir = new File(jettyHome,"contexts");
-
-        File srcFile = new File(srcDir,srcName);
-        File destFile = new File(destDir,destName);
-
-        copyFile("Context",srcFile,destFile);
-    }
-
-    private void copyFile(String type, File srcFile, File destFile) throws IOException
-    {
-        PathAssert.assertFileExists(type + " File",srcFile);
-        IO.copyFile(srcFile,destFile);
-        PathAssert.assertFileExists(type + " File",destFile);
-        System.out.printf("Copy %s: %s%n  To %s: %s%n",type,srcFile,type,destFile);
-        System.out.printf("Destination Exists: %s - %s%n",destFile.exists(),destFile);
-    }
-
-    public void copyWebapp(String srcName, String destName) throws IOException
-    {
-        System.out.printf("Copying Webapp: %s -> %s%n",srcName,destName);
-        File srcDir = MavenTestingUtils.getTestResourceDir("webapps");
-        File destDir = new File(jettyHome,"webapps");
-
-        File srcFile = new File(srcDir,srcName);
-        File destFile = new File(destDir,destName);
-
-        copyFile("Webapp",srcFile,destFile);
-    }
-
-    private void deleteContents(File dir)
-    {
-        System.out.printf("Delete  (dir) %s/%n",dir);
-        for (File file : dir.listFiles())
-        {
-            // Safety measure. only recursively delete within target directory.
-            if (file.isDirectory() && file.getAbsolutePath().contains("target" + File.separator))
-            {
-                deleteContents(file);
-                Assert.assertTrue("Delete failed: " + file.getAbsolutePath(),file.delete());
-            }
-            else
-            {
-                System.out.printf("Delete (file) %s%n",file);
-                Assert.assertTrue("Delete failed: " + file.getAbsolutePath(),file.delete());
-            }
-        }
-    }
-
-    public DeploymentManager getActiveDeploymentManager()
-    {
-        List<DeploymentManager> depmans = server.getBeans(DeploymentManager.class);
-        Assert.assertEquals("DeploymentManager bean count",1,depmans.size());
-        return depmans.get(0);
-    }
-
-    public File getJettyDir(String name)
-    {
-        return new File(jettyHome,name);
-    }
-
-    public File getJettyHome()
-    {
-        return jettyHome;
-    }
-
-    public String getScheme()
-    {
-        return scheme;
-    }
-
-    public Server getServer()
-    {
-        return server;
-    }
-
-    public int getServerPort()
-    {
-        return serverPort;
-    }
-
-    public URI getServerURI() throws UnknownHostException
-    {
-        StringBuffer uri = new StringBuffer();
-        uri.append(this.scheme).append("://");
-        uri.append(InetAddress.getLocalHost().getHostAddress());
-        uri.append(":").append(this.serverPort);
-        return URI.create(uri.toString());
-    }
-
-    public List<WebAppContext> getWebAppContexts()
-    {
-        List<WebAppContext> contexts = new ArrayList<WebAppContext>();
-        HandlerCollection handlers = (HandlerCollection)server.getHandler();
-        System.out.println(server.dump());
-        Handler children[] = handlers.getChildHandlers();
-
-        for (Handler handler : children)
-        {
-            if (handler instanceof WebAppContext)
-            {
-                WebAppContext context = (WebAppContext)handler;
-                contexts.add(context);
-            }
-        }
-
-        return contexts;
-    }
-
-    @SuppressWarnings("unchecked")
-    public void load() throws Exception
-    {
-        XmlConfiguration last = null;
-        Object[] obj = new Object[this.xmlConfigurations.size()];
-
-        // Configure everything
-        for (int i = 0; i < this.xmlConfigurations.size(); i++)
-        {
-            URL configURL = this.xmlConfigurations.get(i);
-            XmlConfiguration configuration = new XmlConfiguration(configURL);
-            if (last != null)
-            {
-                configuration.getIdMap().putAll(last.getIdMap());
-            }
-            configuration.setProperties(properties);
-            obj[i] = configuration.configure();
-            last = configuration;
-        }
-
-        // Test for Server Instance.
-        Server foundServer = null;
-        int serverCount = 0;
-        for (int i = 0; i < this.xmlConfigurations.size(); i++)
-        {
-            if (obj[i] instanceof Server)
-            {
-                if (obj[i].equals(foundServer))
-                {
-                    // Identical server instance found
-                    break;
-                }
-                foundServer = (Server)obj[i];
-                serverCount++;
-            }
-        }
-
-        if (serverCount <= 0)
-        {
-            throw new Exception("Load failed to configure a " + Server.class.getName());
-        }
-
-        Assert.assertEquals("Server load count",1,serverCount);
-
-        this.server = foundServer;
-        this.server.setGracefulShutdown(10);
-
-    }
-
-    public void printHandlers(PrintStream out)
-    {
-        Handler handler = server.getHandler();
-        out.println(toString(handler));
-    }
-
-    public void removeContext(String name)
-    {
-        File destDir = new File(jettyHome,"contexts");
-        File contextFile = new File(destDir,name);
-        if (contextFile.exists())
-        {
-            Assert.assertTrue("Delete of Context file: " + contextFile.getAbsolutePath(),contextFile.delete());
-        }
-    }
-
-    public void setProperty(String key, String value)
-    {
-        properties.setProperty(key,value);
-    }
-
-    public void setScheme(String scheme)
-    {
-        this.scheme = scheme;
-    }
-
-    public void start() throws Exception
-    {
-        Assert.assertNotNull("Server should not be null (failed load?)",server);
-
-        server.start();
-
-        // Find the active server port.
-        this.serverPort = (-1);
-        Connector connectors[] = server.getConnectors();
-        for (int i = 0; i < connectors.length; i++)
-        {
-            Connector connector = connectors[i];
-            if (connector.getLocalPort() > 0)
-            {
-                this.serverPort = connector.getLocalPort();
-                break;
-            }
-        }
-
-        Assert.assertTrue("Server Port is between 1 and 65535. Actually <" + serverPort + ">",(1 <= this.serverPort) && (this.serverPort <= 65535));
-
-        // Uncomment to have server start and continue to run (without exiting)
-        // System.out.printf("Listening to port %d%n",this.serverPort);
-        // server.join();
-    }
-
-    public void stop() throws Exception
-    {
-        server.stop();
-    }
-
-    public String toString(Handler handler)
-    {
-        if (handler instanceof HandlerCollection)
-        {
-            return ((HandlerCollection)handler).dump();
-        }
-
-        if (handler instanceof AbstractHandler)
-        {
-            return ((AbstractHandler)handler).dump();
-        }
-
-        return handler.toString();
-    }
-
-    public void waitForDirectoryScan()
-    {
-        int ms = 2000;
-        System.out.printf("Waiting %d milliseconds for AppProvider to process directory scan ...%n",ms);
-        try
-        {
-            Thread.sleep(ms);
-        }
-        catch (InterruptedException ignore)
-        {
-            /* ignore */
-        }
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/test/resources/contexts/foo.xml b/jetty-deploy-manager-graph/src/test/resources/contexts/foo.xml
deleted file mode 100644
index cb3e7dd..0000000
--- a/jetty-deploy-manager-graph/src/test/resources/contexts/foo.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0"  encoding="ISO-8859-1"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
-<Configure class="org.eclipse.jetty.webapp.WebAppContext">
-    <Set name="contextPath">/foo</Set>
-    <Set name="war">
-        <Property name="test.webapps" default="." />/foo.war
-    </Set>
-</Configure>
diff --git a/jetty-deploy-manager-graph/src/test/resources/etc/realm.properties b/jetty-deploy-manager-graph/src/test/resources/etc/realm.properties
deleted file mode 100644
index cbf905d..0000000
--- a/jetty-deploy-manager-graph/src/test/resources/etc/realm.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# This file defines users passwords and roles for a HashUserRealm
-#
-# The format is
-#  <username>: <password>[,<rolename> ...]
-#
-# Passwords may be clear text, obfuscated or checksummed.  The class 
-# org.eclipse.util.Password should be used to generate obfuscated
-# passwords or password checksums
-#
-# If DIGEST Authentication is used, the password must be in a recoverable
-# format, either plain text or OBF:.
-#
-jetty: MD5:164c88b302622e17050af52c89945d44,user
-admin: CRYPT:adpexzg3FUZAk,server-administrator,content-administrator,admin
-other: OBF:1xmk1w261u9r1w1c1xmq,user
-plain: plain,user
-user: password,user
-
-# This entry is for digest auth.  The credential is a MD5 hash of username:realmname:password
-digest: MD5:6e120743ad67abfbc385bc2bb754e297,user
diff --git a/jetty-deploy-manager-graph/src/test/resources/etc/webdefault.xml b/jetty-deploy-manager-graph/src/test/resources/etc/webdefault.xml
deleted file mode 100644
index 35a5a9b..0000000
--- a/jetty-deploy-manager-graph/src/test/resources/etc/webdefault.xml
+++ /dev/null
@@ -1,404 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<!-- ===================================================================== -->
-<!-- This file contains the default descriptor for web applications.       -->
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<!-- The intent of this descriptor is to include jetty specific or common  -->
-<!-- configuration for all webapps.   If a context has a webdefault.xml    -->
-<!-- descriptor, it is applied before the contexts own web.xml file        -->
-<!--                                                                       -->
-<!-- A context may be assigned a default descriptor by:                    -->
-<!--  + Calling WebApplicationContext.setDefaultsDescriptor                -->
-<!--  + Passed an arg to addWebApplications                                -->
-<!--                                                                       -->
-<!-- This file is used both as the resource within the jetty.jar (which is -->
-<!-- used as the default if no explicit defaults descriptor is set) and it -->
-<!-- is copied to the etc directory of the Jetty distro and explicitly     -->
-<!-- by the jetty.xml file.                                                -->
-<!--                                                                       -->
-<!-- ===================================================================== -->
-<web-app 
-   xmlns="http://java.sun.com/xml/ns/javaee" 
-   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
-   metadata-complete="true"
-   version="2.5"> 
-
-  <description>
-    Default web.xml file.  
-    This file is applied to a Web application before it's own WEB_INF/web.xml file
-  </description>
-
-
-  <!-- ==================================================================== -->
-  <!-- Context params to control Session Cookies                            -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- UNCOMMENT TO ACTIVATE
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name>
-    <param-value>127.0.0.1</param-value>
-  </context-param>
-
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.SessionPath</param-name>
-    <param-value>/</param-value>
-  </context-param>
-
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
-    <param-value>-1</param-value>
-  </context-param>
-  -->
-
-
-  <!-- ==================================================================== -->
-  <!-- The default servlet.                                                 -->
-  <!-- This servlet, normally mapped to /, provides the handling for static -->
-  <!-- content, OPTIONS and TRACE methods for the context.                  -->
-  <!-- The following initParameters are supported:                          -->
-  <!--                                                                      -->
-  <!--   acceptRanges     If true, range requests and responses are         -->
-  <!--                    supported                                         -->
-  <!--                                                                      -->
-  <!--   dirAllowed       If true, directory listings are returned if no    -->
-  <!--                    welcome file is found. Else 403 Forbidden.        -->
-  <!--                                                                      -->
-  <!--   welcomeServlets  If true, attempt to dispatch to welcome files     -->
-  <!--                    that are servlets, if no matching static          -->
-  <!--                    resources can be found.                           -->
-  <!--                                                                      -->
-  <!--   redirectWelcome  If true, redirect welcome file requests           -->
-  <!--                    else use request dispatcher forwards              -->
-  <!--                                                                      -->
-  <!--   gzip             If set to true, then static content will be served--> 
-  <!--                    as gzip content encoded if a matching resource is -->
-  <!--                    found ending with ".gz"                           -->
-  <!--                                                                      -->
-  <!--   resoureBase      Can be set to replace the context resource base   -->
-  <!--                                                                      -->
-  <!--   relativeResourceBase                                               -->
-  <!--                    Set with a pathname relative to the base of the   -->
-  <!--                    servlet context root. Useful for only serving     -->
-  <!--                    static content from only specific subdirectories. -->
-  <!--                                                                      -->
-  <!--   useFileMappedBuffer                                                -->
-  <!--                    If set to true (the default), a  memory mapped    -->
-  <!--                    file buffer will be used to serve static content  -->
-  <!--                    when using an NIO connector. Setting this value   -->
-  <!--                    to false means that a direct buffer will be used  -->
-  <!--                    instead. If you are having trouble with Windows   -->
-  <!--                    file locking, set this to false.                  -->
-  <!--                                                                      -->
-  <!--  cacheControl      If set, all static content will have this value   -->
-  <!--                    set as the cache-control header.                  -->
-  <!--                                                                      -->
-  <!--  maxCacheSize      Maximum size of the static resource cache         -->
-  <!--                                                                      -->
-  <!--  maxCachedFileSize Maximum size of any single file in the cache      -->
-  <!--                                                                      -->
-  <!--  maxCachedFiles    Maximum number of files in the cache              -->
-  <!--                                                                      -->
-  <!--  cacheType         "nio", "bio" or "both" to determine the type(s)   -->
-  <!--                    of resource cache. A bio cached buffer may be used-->
-  <!--                    by nio but is not as efficient as a nio buffer.   -->
-  <!--                    An nio cached buffer may not be used by bio.      -->
-  <!--                                                                      -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <servlet>
-    <servlet-name>default</servlet-name>
-    <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
-    <init-param>
-      <param-name>acceptRanges</param-name>
-      <param-value>true</param-value>
-    </init-param>
-    <init-param>
-      <param-name>dirAllowed</param-name>
-      <param-value>true</param-value>
-    </init-param>
-    <init-param>
-      <param-name>welcomeServlets</param-name>
- 	    <param-value>false</param-value>
- 	  </init-param>
-    <init-param>
-      <param-name>redirectWelcome</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>maxCacheSize</param-name>
-      <param-value>256000000</param-value>
-    </init-param>
-    <init-param>
-      <param-name>maxCachedFileSize</param-name>
-      <param-value>10000000</param-value>
-    </init-param>
-    <init-param>
-      <param-name>maxCachedFiles</param-name>
-      <param-value>1000</param-value>
-    </init-param>
-    <init-param>
-      <param-name>cacheType</param-name>
-      <param-value>both</param-value>
-    </init-param>
-    <init-param>
-      <param-name>gzip</param-name>
-      <param-value>true</param-value>
-    </init-param>
-    <init-param>
-      <param-name>useFileMappedBuffer</param-name>
-      <param-value>true</param-value>
-    </init-param>  
-    <!--
-    <init-param>
-      <param-name>cacheControl</param-name>
-      <param-value>max-age=3600,public</param-value>
-    </init-param>
-    -->
-    <load-on-startup>0</load-on-startup>
-  </servlet> 
-
-  <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-  
-
-  <!-- ==================================================================== -->
-  <!-- JSP Servlet                                                          -->
-  <!-- This is the jasper JSP servlet from the jakarta project              -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
-  <!-- used by Glassfish to support JSP pages.  Traditionally, this servlet -->
-  <!-- is mapped to URL patterh "*.jsp".  This servlet supports the         -->
-  <!-- following initialization parameters (default values are in square    -->
-  <!-- brackets):                                                           -->
-  <!--                                                                      -->
-  <!--   checkInterval       If development is false and reloading is true, -->
-  <!--                       background compiles are enabled. checkInterval -->
-  <!--                       is the time in seconds between checks to see   -->
-  <!--                       if a JSP page needs to be recompiled. [300]    -->
-  <!--                                                                      -->
-  <!--   compiler            Which compiler Ant should use to compile JSP   -->
-  <!--                       pages.  See the Ant documenation for more      -->
-  <!--                       information. [javac]                           -->
-  <!--                                                                      -->
-  <!--   classdebuginfo      Should the class file be compiled with         -->
-  <!--                       debugging information?  [true]                 -->
-  <!--                                                                      -->
-  <!--   classpath           What class path should I use while compiling   -->
-  <!--                       generated servlets?  [Created dynamically      -->
-  <!--                       based on the current web application]          -->
-  <!--                       Set to ? to make the container explicitly set  -->
-  <!--                       this parameter.                                -->
-  <!--                                                                      -->
-  <!--   development         Is Jasper used in development mode (will check -->
-  <!--                       for JSP modification on every access)?  [true] -->
-  <!--                                                                      -->
-  <!--   enablePooling       Determines whether tag handler pooling is      -->
-  <!--                       enabled  [true]                                -->
-  <!--                                                                      -->
-  <!--   fork                Tell Ant to fork compiles of JSP pages so that -->
-  <!--                       a separate JVM is used for JSP page compiles   -->
-  <!--                       from the one Tomcat is running in. [true]      -->
-  <!--                                                                      -->
-  <!--   ieClassId           The class-id value to be sent to Internet      -->
-  <!--                       Explorer when using <jsp:plugin> tags.         -->
-  <!--                       [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93]   -->
-  <!--                                                                      -->
-  <!--   javaEncoding        Java file encoding to use for generating java  -->
-  <!--                       source files. [UTF-8]                          -->
-  <!--                                                                      -->
-  <!--   keepgenerated       Should we keep the generated Java source code  -->
-  <!--                       for each page instead of deleting it? [true]   -->
-  <!--                                                                      -->
-  <!--   logVerbosityLevel   The level of detailed messages to be produced  -->
-  <!--                       by this servlet.  Increasing levels cause the  -->
-  <!--                       generation of more messages.  Valid values are -->
-  <!--                       FATAL, ERROR, WARNING, INFORMATION, and DEBUG. -->
-  <!--                       [WARNING]                                      -->
-  <!--                                                                      -->
-  <!--   mappedfile          Should we generate static content with one     -->
-  <!--                       print statement per input line, to ease        -->
-  <!--                       debugging?  [false]                            -->
-  <!--                                                                      -->
-  <!--                                                                      -->
-  <!--   reloading           Should Jasper check for modified JSPs?  [true] -->
-  <!--                                                                      -->
-  <!--   suppressSmap        Should the generation of SMAP info for JSR45   -->
-  <!--                       debugging be suppressed?  [false]              -->
-  <!--                                                                      -->
-  <!--   dumpSmap            Should the SMAP info for JSR45 debugging be    -->
-  <!--                       dumped to a file? [false]                      -->
-  <!--                       False if suppressSmap is true                  -->
-  <!--                                                                      -->
-  <!--   scratchdir          What scratch directory should we use when      -->
-  <!--                       compiling JSP pages?  [default work directory  -->
-  <!--                       for the current web application]               -->
-  <!--                                                                      -->
-  <!--   tagpoolMaxSize      The maximum tag handler pool size  [5]         -->
-  <!--                                                                      -->
-  <!--   xpoweredBy          Determines whether X-Powered-By response       -->
-  <!--                       header is added by generated servlet  [false]  -->
-  <!--                                                                      -->
-  <!-- If you wish to use Jikes to compile JSP pages:                       -->
-  <!--   Set the init parameter "compiler" to "jikes".  Define              -->
-  <!--   the property "-Dbuild.compiler.emacs=true" when starting Jetty     -->
-  <!--   to cause Jikes to emit error messages in a format compatible with  -->
-  <!--   Jasper.                                                            -->
-  <!--   If you get an error reporting that jikes can't use UTF-8 encoding, -->
-  <!--   try setting the init parameter "javaEncoding" to "ISO-8859-1".     -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <servlet id="jsp">
-    <servlet-name>jsp</servlet-name>
-    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
-    <init-param>
-        <param-name>logVerbosityLevel</param-name>
-        <param-value>DEBUG</param-value>
-    </init-param>
-    <init-param>
-        <param-name>fork</param-name>
-        <param-value>false</param-value>
-    </init-param>
-    <init-param>
-        <param-name>xpoweredBy</param-name>
-        <param-value>false</param-value>
-    </init-param>
-    <!--  
-    <init-param>
-        <param-name>classpath</param-name>
-        <param-value>?</param-value>
-    </init-param>
-    -->
-    <load-on-startup>0</load-on-startup>
-  </servlet>
-
-  <servlet-mapping> 
-    <servlet-name>jsp</servlet-name> 
-    <url-pattern>*.jsp</url-pattern> 
-    <url-pattern>*.jspf</url-pattern>
-    <url-pattern>*.jspx</url-pattern>
-    <url-pattern>*.xsp</url-pattern>
-    <url-pattern>*.JSP</url-pattern> 
-    <url-pattern>*.JSPF</url-pattern>
-    <url-pattern>*.JSPX</url-pattern>
-    <url-pattern>*.XSP</url-pattern>
-  </servlet-mapping>
-  
-  <!-- ==================================================================== -->
-  <!-- Dynamic Servlet Invoker.                                             -->
-  <!-- This servlet invokes anonymous servlets that have not been defined   -->
-  <!-- in the web.xml or by other means. The first element of the pathInfo  -->
-  <!-- of a request passed to the envoker is treated as a servlet name for  -->
-  <!-- an existing servlet, or as a class name of a new servlet.            -->
-  <!-- This servlet is normally mapped to /servlet/*                        -->
-  <!-- This servlet support the following initParams:                       -->
-  <!--                                                                      -->
-  <!--  nonContextServlets       If false, the invoker can only load        -->
-  <!--                           servlets from the contexts classloader.    -->
-  <!--                           This is false by default and setting this  -->
-  <!--                           to true may have security implications.    -->
-  <!--                                                                      -->
-  <!--  verbose                  If true, log dynamic loads                 -->
-  <!--                                                                      -->
-  <!--  *                        All other parameters are copied to the     -->
-  <!--                           each dynamic servlet as init parameters    -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- Uncomment for dynamic invocation
-  <servlet>
-    <servlet-name>invoker</servlet-name>
-    <servlet-class>org.eclipse.jetty.servlet.Invoker</servlet-class>
-    <init-param>
-      <param-name>verbose</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>nonContextServlets</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>dynamicParam</param-name>
-      <param-value>anyValue</param-value>
-    </init-param>
-    <load-on-startup>0</load-on-startup>
-  </servlet>
-
-  <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
-  -->
-
-
-
-  <!-- ==================================================================== -->
-  <session-config>
-    <session-timeout>30</session-timeout>
-  </session-config>
-
-  <!-- ==================================================================== -->
-  <!-- Default MIME mappings                                                -->
-  <!-- The default MIME mappings are provided by the mime.properties        -->
-  <!-- resource in the org.eclipse.jetty.server.jar file.  Additional or modified  -->
-  <!-- mappings may be specified here                                       -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- UNCOMMENT TO ACTIVATE
-  <mime-mapping>
-    <extension>mysuffix</extension>
-    <mime-type>mymime/type</mime-type>
-  </mime-mapping>
-  -->
-
-  <!-- ==================================================================== -->
-  <welcome-file-list>
-    <welcome-file>index.html</welcome-file>
-    <welcome-file>index.htm</welcome-file>
-    <welcome-file>index.jsp</welcome-file>
-  </welcome-file-list>
-
-  <!-- ==================================================================== -->
-  <locale-encoding-mapping-list>
-    <locale-encoding-mapping><locale>ar</locale><encoding>ISO-8859-6</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>be</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>bg</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ca</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>cs</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>da</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>de</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>el</locale><encoding>ISO-8859-7</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>en</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>es</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>et</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>fi</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>fr</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>hr</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>hu</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>is</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>it</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>iw</locale><encoding>ISO-8859-8</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ja</locale><encoding>Shift_JIS</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ko</locale><encoding>EUC-KR</encoding></locale-encoding-mapping>     
-    <locale-encoding-mapping><locale>lt</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>lv</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>mk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>nl</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>no</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>pl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>pt</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ro</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ru</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sh</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sk</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sq</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sr</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sv</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>tr</locale><encoding>ISO-8859-9</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>uk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>zh</locale><encoding>GB2312</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>zh_TW</locale><encoding>Big5</encoding></locale-encoding-mapping>   
-  </locale-encoding-mapping-list>
-  
-  <security-constraint>
-    <web-resource-collection>
-      <web-resource-name>Disable TRACE</web-resource-name>
-      <url-pattern>/</url-pattern>
-      <http-method>TRACE</http-method>
-    </web-resource-collection>
-    <auth-constraint/>
-  </security-constraint>
-  
-</web-app>
-
diff --git a/jetty-deploy-manager-graph/src/test/resources/jetty-deploymgr-contexts.xml b/jetty-deploy-manager-graph/src/test/resources/jetty-deploymgr-contexts.xml
deleted file mode 100644
index df27c6e..0000000
--- a/jetty-deploy-manager-graph/src/test/resources/jetty-deploymgr-contexts.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
-
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-  <Call name="addLifeCycle">
-    <Arg>
-      <New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager">
-        <Set name="contexts">
-          <Ref id="Contexts" />
-        </Set>
-        <Set name="configurationManager">
-          <New class="org.eclipse.jetty.deploy.support.FileConfigurationManager">
-            <Set name="file">
-              <Property name="test.targetdir" default="target" />/xml-configured-jetty.properties
-            </Set>
-          </New>
-        </Set>
-        
-        <!-- Providers of Apps -->
-        <Call name="addAppProvider">
-          <Arg>
-            <New class="org.eclipse.jetty.deploy.providers.MonitoredDirAppProvider">
-              <Set name="monitoredDir">
-                <Property name="jetty.home" />/contexts
-              </Set>
-              <Set name="scanInterval">1</Set>
-              <Set name="recursive">true</Set>
-            </New>
-          </Arg>
-        </Call>
-      </New>
-    </Arg>
-  </Call>
-
-</Configure>
diff --git a/jetty-deploy-manager-graph/src/test/resources/jetty.xml b/jetty-deploy-manager-graph/src/test/resources/jetty.xml
deleted file mode 100644
index d0cb501..0000000
--- a/jetty-deploy-manager-graph/src/test/resources/jetty.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
-
-<!-- =============================================================== -->
-<!-- Configure the Jetty Server                                      -->
-<!--                                                                 -->
-<!-- Documentation of this file format can be found at:              -->
-<!-- http://docs.codehaus.org/display/JETTY/jetty.xml                -->
-<!--                                                                 -->
-<!-- =============================================================== -->
-
-
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-    <!-- =========================================================== -->
-    <!-- Server Thread Pool                                          -->
-    <!-- =========================================================== -->
-    <Set name="ThreadPool">
-      <!-- Default queued blocking threadpool 
-      -->
-      <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
-        <Set name="minThreads">10</Set>
-        <Set name="maxThreads">200</Set>
-      </New>
-
-      <!-- Optional Java 5 bounded threadpool with job queue 
-      <New class="org.eclipse.thread.concurrent.ThreadPool">
-        <Set name="corePoolSize">50</Set>
-        <Set name="maximumPoolSize">50</Set>
-      </New>
-      -->
-    </Set>
-
-    <!-- =========================================================== -->
-    <!-- Set connectors                                              -->
-    <!-- =========================================================== -->
-
-    <Call name="addConnector">
-      <Arg>
-          <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
-            <Set name="host"></Set>
-            <Set name="port">0</Set>
-            <Set name="maxIdleTime">300000</Set>
-            <Set name="Acceptors">2</Set>
-            <Set name="statsOn">false</Set>
-            <Set name="confidentialPort">8443</Set>
-        <Set name="lowResourcesConnections">20000</Set>
-        <Set name="lowResourcesMaxIdleTime">5000</Set>
-          </New>
-      </Arg>
-    </Call>
-
-    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-    <!-- To add a HTTPS SSL connector                                    -->
-    <!-- mixin jetty-ssl.xml:                                            -->
-    <!--   java -jar start.jar etc/jetty.xml etc/jetty-ssl.xml           -->
-    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-    
-    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-    <!-- To add a HTTP blocking connector                                -->
-    <!-- mixin jetty-bio.xml:                                            -->
-    <!--   java -jar start.jar etc/jetty.xml etc/jetty-bio.xml           -->
-    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-    
-    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-    <!-- To allow Jetty to be started from xinetd                        -->
-    <!-- mixin jetty-xinetd.xml:                                         -->
-    <!--   java -jar start.jar etc/jetty.xml etc/jetty-xinetd.xml        -->
-    <!--                                                                 -->
-    <!-- See jetty-xinetd.xml for further instructions.                  -->
-    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-
-    <!-- =========================================================== -->
-    <!-- Set handler Collection Structure                            --> 
-    <!-- =========================================================== -->
-    <Set name="handler">
-      <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
-        <Set name="handlers">
-         <Array type="org.eclipse.jetty.server.Handler">
-           <Item>
-             <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
-           </Item>
-           <Item>
-             <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
-           </Item>
-           <Item>
-             <New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler"/>
-           </Item>
-         </Array>
-        </Set>
-      </New>
-    </Set>
-    
-    <!-- =========================================================== -->
-    <!-- Configure Authentication Login Service                      -->
-    <!-- Realms may be configured for the entire server here, or     -->
-    <!-- they can be configured for a specific web app in a context  -->
-    <!-- configuration (see $(jetty.home)/contexts/test.xml for an   -->
-    <!-- example).                                                   -->
-    <!-- =========================================================== -->
-    <Call name="addBean">
-      <Arg>
-        <New class="org.eclipse.jetty.security.HashLoginService">
-          <Set name="name">Test Realm</Set>
-          <Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
-          <Set name="refreshInterval">0</Set>
-        </New>
-      </Arg>
-    </Call>
-
-    <!-- =========================================================== -->
-    <!-- Configure Request Log                                       -->
-    <!-- Request logs  may be configured for the entire server here, -->
-    <!-- or they can be configured for a specific web app in a       -->
-    <!-- contexts configuration (see $(jetty.home)/contexts/test.xml -->
-    <!-- for an example).                                            -->
-    <!-- =========================================================== -->
-    <Ref id="RequestLog">
-      <Set name="requestLog">
-        <New id="RequestLogImpl" class="org.eclipse.jetty.server.NCSARequestLog">
-          <Set name="filename"><SystemProperty name="jetty.home" default="."/>/logs/yyyy_mm_dd.request.log</Set>
-          <Set name="filenameDateFormat">yyyy_MM_dd</Set>
-          <Set name="retainDays">90</Set>
-          <Set name="append">true</Set>
-          <Set name="extended">false</Set>
-          <Set name="logCookies">false</Set>
-          <Set name="LogTimeZone">GMT</Set>
-        </New>
-      </Set>
-    </Ref>
-
-    <!-- =========================================================== -->
-    <!-- extra options                                               -->
-    <!-- =========================================================== -->
-    <Set name="stopAtShutdown">true</Set>
-    <Set name="sendServerVersion">true</Set>
-    <Set name="sendDateHeader">true</Set>
-    <Set name="gracefulShutdown">1000</Set>
-
-</Configure>
diff --git a/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-1.war b/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-1.war
deleted file mode 100644
index e4ed5be..0000000
--- a/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-1.war
+++ /dev/null
Binary files differ
diff --git a/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-2.war b/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-2.war
deleted file mode 100644
index df0f023..0000000
--- a/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-2.war
+++ /dev/null
Binary files differ
diff --git a/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-3.war b/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-3.war
deleted file mode 100644
index 649d81b..0000000
--- a/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-3.war
+++ /dev/null
Binary files differ
diff --git a/jetty-deploy-manager-graph/src/test/resources/webapps/logcommon.war b/jetty-deploy-manager-graph/src/test/resources/webapps/logcommon.war
deleted file mode 100644
index bac25eb..0000000
--- a/jetty-deploy-manager-graph/src/test/resources/webapps/logcommon.war
+++ /dev/null
Binary files differ
