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
index 924c8de..6ef27bd 100644
--- 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
@@ -16,26 +16,59 @@
 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 interface App
+public class App
 {
-    /**
-     * The raw id of the {@link App}
-     * 
-     * @return the generated Id for the App.
-     */
-    String getId();
+    private File archivePath;
+    private ContextHandler handler;
+    private boolean extractWars = false;
+    private boolean parentLoaderPriority = false;
+    private String defaultsDescriptor;
+    private String originId;
 
     /**
-     * Get the internally declared name of the App.
+     * Create an App with specified Origin ID and archivePath
      * 
-     * @return the internal name of the App.
+     * @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()
      */
-    String getName();
+    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.
@@ -46,28 +79,142 @@
      *         when App is in the {@link AppState#STAGED} state}
      * @throws Exception
      */
-    ContextHandler getContextHandler(DeploymentManager deployMgr) 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;
+    }
 
     /**
-     * Get the work dir for this App, as managed by the {@link DeploymentManager}
+     * The unique id of the {@link App} relating to how it is installed on the jetty server side.
      * 
-     * @return the App's work dir.
+     * @return the generated Id for the App.
      */
-    File getWorkDir();
-
-    /**
-     * 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
-     */
-    File getDir();
+    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.
      */
-    String getOrigin();
+    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
index bf28998..fd81160 100644
--- 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
@@ -262,7 +262,7 @@
 
         for (BoundMethod binding : bindings)
         {
-            Log.debug("Calling " + binding.obj.getClass().getName() + "#" + binding.method.getName());
+            Log.info("Calling " + binding.obj.getClass().getName() + "#" + binding.method.getName());
             binding.method.invoke(binding.obj,params);
         }
     }
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
index 8b6fa1a..0912787 100644
--- 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
@@ -18,8 +18,12 @@
 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.graph.Node;
 import org.eclipse.jetty.deploy.support.ConfigurationManager;
 import org.eclipse.jetty.server.Server;
@@ -76,11 +80,6 @@
             return app;
         }
 
-        public int getVersion()
-        {
-            return version;
-        }
-
         public Node getLifecyleNode()
         {
             return lifecyleNode;
@@ -91,6 +90,11 @@
             return stateTimestamps;
         }
 
+        public int getVersion()
+        {
+            return version;
+        }
+
         void setLifecycleNode(Node node)
         {
             this.lifecyleNode = node;
@@ -98,12 +102,13 @@
         }
     }
 
-    private Map<String, AppEntry> appmap = new HashMap<String, AppEntry>();
     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 AppLifecycle lifecycle = new AppLifecycle();
+    private String defaultLifeCycleState = "started";
 
     /**
      * Receive an app for processing.
@@ -112,28 +117,17 @@
      */
     public void addApp(App app)
     {
-        AppEntry entry = appmap.get(app.getId());
-        if (entry == null)
-        {
-            // New Entry
-            entry = new AppEntry();
-            entry.version = 0;
-            entry.setLifecycleNode(lifecycle.getNodeByName("undeployed"));
-        }
-        else
-        {
-            // Existing Entry
-            entry.version++;
-
-            // TODO: determine state change
-            // TODO: determine redeploy need?
-        }
-
+        Log.info("App Added: " + app.getOriginId());
+        AppEntry entry = new AppEntry();
         entry.app = app;
-        appmap.put(app.getId(),entry);
+        entry.setLifecycleNode(lifecycle.getNodeByName("undeployed"));
+        apps.add(entry);
 
-        // TODO: Should immediately attempt to start?
-        // this.requestAppGoal(app.getId(),AppState.STARTED);
+        if (defaultLifeCycleState != null)
+        {
+            // Immediately attempt to go to default lifecycle state
+            this.requestAppGoal(entry,defaultLifeCycleState);
+        }
     }
 
     public void addAppProvider(AppProvider provider)
@@ -152,6 +146,11 @@
         }
     }
 
+    public void addLifecycleBinding(Object binding)
+    {
+        lifecycle.addBinding(binding);
+    }
+
     @Override
     protected void doStart() throws Exception
     {
@@ -191,9 +190,53 @@
         super.doStop();
     }
 
-    public App getApp(String appId)
+    private AppEntry findAppByContextId(String contextId)
     {
-        AppEntry entry = appmap.get(appId);
+        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;
@@ -203,12 +246,7 @@
 
     public Collection<AppEntry> getAppEntries()
     {
-        return appmap.values();
-    }
-
-    public AppEntry getAppEntry(String appId)
-    {
-        return appmap.get(appId);
+        return apps;
     }
 
     public Collection<AppProvider> getAppProviders()
@@ -218,12 +256,12 @@
 
     public Collection<App> getApps()
     {
-        List<App> apps = new ArrayList<App>();
-        for (AppEntry entry : appmap.values())
+        List<App> ret = new ArrayList<App>();
+        for (AppEntry entry : apps)
         {
-            apps.add(entry.app);
+            ret.add(entry.app);
         }
-        return apps;
+        return ret;
     }
 
     /**
@@ -235,15 +273,47 @@
      */
     public Collection<App> getApps(Node node)
     {
-        List<App> apps = new ArrayList<App>();
-        for (AppEntry entry : appmap.values())
+        List<App> ret = new ArrayList<App>();
+        for (AppEntry entry : apps)
         {
             if (entry.lifecyleNode == node)
             {
-                apps.add(entry.app);
+                ret.add(entry.app);
             }
         }
-        return apps;
+        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;
     }
 
     /**
@@ -272,6 +342,16 @@
         return contexts;
     }
 
+    public String getDefaultLifeCycleState()
+    {
+        return defaultLifeCycleState;
+    }
+
+    public AppLifecycle getLifecycle()
+    {
+        return lifecycle;
+    }
+
     public Server getServer()
     {
         if (contexts == null)
@@ -281,6 +361,26 @@
         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);
@@ -308,15 +408,36 @@
      * 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 app
+     *            the app to move through the process
      * @param nodeName
      *            the name of the node to attain
      */
-    public void requestAppGoal(String appId, String nodeName)
+    public void requestAppGoal(App app, String nodeName)
     {
-        AppEntry appentry = getAppEntry(appId);
+        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);
@@ -329,10 +450,19 @@
         // Execute each Node binding.  Stopping at any thrown exception.
         try
         {
-            for (Node node : path)
+            Iterator<Node> it = path.iterator();
+            if (it.hasNext()) // Any entries?
             {
-                Log.info("Executing Node: " + node);
-                lifecycle.runBindings(node,appentry.app,this);
+                // 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)
@@ -342,6 +472,29 @@
     }
 
     /**
+     * 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
@@ -367,13 +520,19 @@
         this.contexts = contexts;
     }
 
-    public void addLifecycleBinding(Object binding)
+    public void setDefaultLifeCycleState(String defaultLifeCycleState)
     {
-        lifecycle.addBinding(binding);
+        this.defaultLifeCycleState = defaultLifeCycleState;
     }
 
-    public AppLifecycle getLifecycle()
+    public void undeployAll()
     {
-        return lifecycle;
+        Log.info("Undeploy (All) started");
+        for (AppEntry appentry : apps)
+        {
+            Log.info("Undeploy: " + appentry);
+            requestAppGoal(appentry,"undeployed");
+        }
+        Log.info("Undeploy (All) completed");
     }
 }
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultUndeployer.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultUndeployer.java
deleted file mode 100644
index 25ab5d8..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultUndeployer.java
+++ /dev/null
@@ -1,32 +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.DeploymentManager;
-import org.eclipse.jetty.deploy.annotations.DeployLifecycleBinding;
-import org.eclipse.jetty.deploy.graph.Node;
-import org.eclipse.jetty.server.handler.ContextHandler;
-
-public class DefaultUndeployer
-{
-    @DeployLifecycleBinding(nodes = "undeploying")
-    public void handleAppUndeploy(DeploymentManager deployMgr, Node lifecycleNode, App app) throws Exception
-    {
-        ContextHandler handler = app.getContextHandler(deployMgr);
-        deployMgr.getContexts().removeHandler(handler);
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultDeployer.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardDeployer.java
similarity index 89%
rename from jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultDeployer.java
rename to jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardDeployer.java
index baed599..f790250 100644
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultDeployer.java
+++ b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardDeployer.java
@@ -21,10 +21,10 @@
 import org.eclipse.jetty.deploy.graph.Node;
 import org.eclipse.jetty.server.handler.ContextHandler;
 
-public class DefaultDeployer
+public class StandardDeployer
 {
     @DeployLifecycleBinding(nodes = "deploying")
-    public void handleAppDeploy(DeploymentManager deployMgr, Node lifecycleNode, App app) throws Exception
+    public void handleAppDeploy(Node lifecycleNode, App app, DeploymentManager deployMgr) throws Exception
     {
         ContextHandler handler = app.getContextHandler(deployMgr);
         deployMgr.getContexts().addHandler(handler);
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultStarter.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStarter.java
similarity index 74%
rename from jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultStarter.java
rename to jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStarter.java
index 3e367cc..2ec33f6 100644
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultStarter.java
+++ b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStarter.java
@@ -20,16 +20,24 @@
 import org.eclipse.jetty.deploy.annotations.DeployLifecycleBinding;
 import org.eclipse.jetty.deploy.graph.Node;
 import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.util.log.Log;
 
-public class DefaultStarter
+public class StandardStarter
 {
     @DeployLifecycleBinding(nodes = "starting")
-    public void handleAppStart(DeploymentManager deployMgr, Node lifecycleNode, App app) throws Exception
+    public void handleAppStart(Node lifecycleNode, App app, DeploymentManager deployMgr) throws Exception
     {
         ContextHandler handler = app.getContextHandler(deployMgr);
         if (!handler.isStarted())
         {
             handler.start();
         }
+
+        // Remove other apps at same context
+        for (App other : deployMgr.getAppsWithSameContext(app))
+        {
+            Log.info("Removing apps with same context: " + other);
+            deployMgr.requestAppGoal(other,"undeployed");
+        }
     }
 }
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultStopper.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStopper.java
similarity index 90%
rename from jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultStopper.java
rename to jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStopper.java
index 53470ba..6568b86 100644
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/DefaultStopper.java
+++ b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardStopper.java
@@ -21,10 +21,10 @@
 import org.eclipse.jetty.deploy.graph.Node;
 import org.eclipse.jetty.server.handler.ContextHandler;
 
-public class DefaultStopper
+public class StandardStopper
 {
     @DeployLifecycleBinding(nodes = "stopping")
-    public void handleAppStop(DeploymentManager deployMgr, Node lifecycleNode, App app) throws Exception
+    public void handleAppStop(Node lifecycleNode, App app, DeploymentManager deployMgr) throws Exception
     {
         ContextHandler handler = app.getContextHandler(deployMgr);
         if (!handler.isStopped())
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
new file mode 100644
index 0000000..25ae8d7
--- /dev/null
+++ b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/bindings/StandardUndeployer.java
@@ -0,0 +1,62 @@
+// ========================================================================
+// 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.DeploymentManager;
+import org.eclipse.jetty.deploy.annotations.DeployLifecycleBinding;
+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
+{
+    @DeployLifecycleBinding(nodes = "undeploying")
+    public void handleAppUndeploy(Node lifecycleNode, App app, DeploymentManager deployMgr) throws Exception
+    {
+        ContextHandler handler = app.getContextHandler(deployMgr);
+        ContextHandlerCollection chcoll = deployMgr.getContexts();
+
+        recursiveRemoveContext(chcoll,handler);
+
+        deployMgr.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/providers/ConfiguredContextApp.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/ConfiguredContextApp.java
deleted file mode 100644
index 8ffb50d..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/ConfiguredContextApp.java
+++ /dev/null
@@ -1,94 +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.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jetty.deploy.App;
-import org.eclipse.jetty.deploy.DeploymentManager;
-import org.eclipse.jetty.server.handler.ContextHandler;
-import org.eclipse.jetty.util.AttributesMap;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.xml.XmlConfiguration;
-
-public class ConfiguredContextApp implements App
-{
-    private String filename;
-    private ContextHandler handler;
-
-    public ConfiguredContextApp(String filename)
-    {
-        this.filename = filename;
-    }
-
-    public File getDir()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @SuppressWarnings("unchecked")
-    public ContextHandler getContextHandler(DeploymentManager deploymgr) throws Exception
-    {
-        if (handler == null)
-        {
-            Resource resource = Resource.newResource(filename);
-            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);
-            this.handler = (ContextHandler)xmlc.configure();
-            this.handler.setAttributes(new AttributesMap(deploymgr.getContextAttributes()));
-        }
-        return handler;
-    }
-
-    public String getId()
-    {
-        return null;
-    }
-
-    public String getName()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public String getOrigin()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public File getWorkDir()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/ContextsDirAppProvider.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/ContextsDirAppProvider.java
deleted file mode 100644
index b5acb0e..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/ContextsDirAppProvider.java
+++ /dev/null
@@ -1,152 +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.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 ContextsDirAppProvider implements AppProvider, Scanner.DiscreteListener
-{
-    private Resource contextsDir;
-    private Scanner scanner;
-    private int scanInterval = 10;
-    private boolean recursive = false;
-    private DeploymentManager deploymgr;
-
-    class XmlFilenameFilter implements FilenameFilter
-    {
-        public boolean accept(File dir, String name)
-        {
-            if (name.endsWith(".xml"))
-            {
-                return true;
-            }
-
-            return false;
-        }
-    }
-
-    public ContextsDirAppProvider()
-    {
-        scanner = new Scanner();
-    }
-
-    public void startProvider(DeploymentManager deploymentManager) throws Exception
-    {
-        Log.info(this.getClass().getSimpleName() + ".startProvider(" + deploymentManager + ")");
-        if (contextsDir == null)
-        {
-            throw new IllegalStateException("No configuration dir specified");
-        }
-
-        this.deploymgr = deploymentManager;
-
-        File scandir = contextsDir.getFile();
-        Log.info("ScanDir: " + scandir);
-        this.scanner.setScanDirs(Collections.singletonList(scandir));
-        this.scanner.setScanInterval(scanInterval);
-        this.scanner.setRecursive(recursive);
-        this.scanner.setFilenameFilter(new XmlFilenameFilter());
-        this.scanner.addListener(this);
-        this.scanner.scan();
-        this.scanner.start();
-    }
-
-    public Resource getContextsDir()
-    {
-        return contextsDir;
-    }
-
-    public void setContextsDir(Resource contextsDir)
-    {
-        this.contextsDir = contextsDir;
-    }
-
-    /**
-     * @param dir
-     *            Directory to scan for context descriptors
-     */
-    public void setContextsDir(String dir)
-    {
-        try
-        {
-            contextsDir = Resource.newResource(dir);
-        }
-        catch (Exception e)
-        {
-            throw new IllegalArgumentException(e);
-        }
-    }
-
-    public int getScanInterval()
-    {
-        return scanInterval;
-    }
-
-    public void setScanInterval(int scanInterval)
-    {
-        this.scanInterval = scanInterval;
-    }
-
-    public boolean isRecursive()
-    {
-        return recursive;
-    }
-
-    public void setRecursive(boolean recursive)
-    {
-        this.recursive = recursive;
-    }
-
-    public void stopProvider()
-    {
-        this.scanner.removeListener(this);
-        this.scanner.stop();
-    }
-
-    public void fileAdded(String filename) throws Exception
-    {
-        Log.info("fileAdded(" + filename + ")");
-        App app = new ConfiguredContextApp(filename);
-        this.deploymgr.addApp(app);
-    }
-
-    public void fileChanged(String filename) throws Exception
-    {
-        Log.info("fileChanged(" + filename + ")");
-        App app = new ConfiguredContextApp(filename);
-        this.deploymgr.addApp(app);
-    }
-
-    public void fileRemoved(String filename) throws Exception
-    {
-        Log.info("fileRemoved(" + filename + ")");
-        App app = new ConfiguredContextApp(filename);
-        this.deploymgr.addApp(app);
-    }
-}
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
new file mode 100644
index 0000000..52fccd1
--- /dev/null
+++ b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProvider.java
@@ -0,0 +1,218 @@
+// ========================================================================
+// 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.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 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 startProvider(DeploymentManager deploymentManager) throws Exception
+    {
+        Log.info(this.getClass().getSimpleName() + ".startProvider(" + deploymentManager + ")");
+        if (monitoredDir == null)
+        {
+            throw new IllegalStateException("No configuration dir specified");
+        }
+
+        this.deploymgr = deploymentManager;
+
+        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();
+    }
+
+    public void stopProvider()
+    {
+        this.scanner.removeListener(this);
+        this.scanner.stop();
+    }
+}
diff --git a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/WebappsDirAppProvider.java b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/WebappsDirAppProvider.java
deleted file mode 100644
index 7e526df..0000000
--- a/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/providers/WebappsDirAppProvider.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.providers;
-
-import org.eclipse.jetty.deploy.AppProvider;
-import org.eclipse.jetty.deploy.DeploymentManager;
-
-/**
- * Backwards Compatible AppProvider for Monitoring a Webapps directory and deploying All apps.
- * 
- * Similar in scope to the original org.eclipse.jetty.deploy.WebAppDeployer
- */
-public class WebappsDirAppProvider implements AppProvider
-{
-
-    public void startProvider(DeploymentManager deploymentManager) throws Exception
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    public void stopProvider()
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-}
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
new file mode 100644
index 0000000..634a14b
--- /dev/null
+++ b/jetty-deploy-manager-graph/src/main/java/org/eclipse/jetty/deploy/util/FileID.java
@@ -0,0 +1,76 @@
+// ========================================================================
+// 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/test/java/org/eclipse/jetty/deploy/LifecycleOrderTracker.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/AppLifecyclePathCollector.java
similarity index 81%
rename from jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/LifecycleOrderTracker.java
rename to jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/AppLifecyclePathCollector.java
index f8cbd65..ff82f34 100644
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/LifecycleOrderTracker.java
+++ b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/AppLifecyclePathCollector.java
@@ -25,7 +25,7 @@
 /**
  * Binds to all lifecycle nodes, and tracks the order of the lifecycle nodes for testing purposes.
  */
-public class LifecycleOrderTracker
+public class AppLifecyclePathCollector
 {
     List<Node> actualOrder = new ArrayList<Node>();
 
@@ -40,32 +40,32 @@
     }
 
     @DeployLifecycleBinding(nodes = "*")
-    public void handleAppDeploy(Node node, App app, DeploymentManager depmgr)
+    public void processNode(Node node, App app, DeploymentManager depmgr)
     {
         actualOrder.add(node);
     }
 
-    public void assertExpected(String msg, List<Node> expectedOrder)
+    public void assertExpected(String msg, List<String> expectedOrder)
     {
         if (expectedOrder.size() != actualOrder.size())
         {
             System.out.println("/* Expected Path */");
-            for (Node path : expectedOrder)
+            for (String path : expectedOrder)
             {
                 System.out.println(path);
             }
             System.out.println("/* Actual Path */");
             for (Node path : actualOrder)
             {
-                System.out.println(path);
+                System.out.println(path.getName());
             }
 
-            Assert.assertEquals(msg + " / count",0,actualOrder.size());
+            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));
+            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/DeploymentManagerLifecyclePathTest.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/DeploymentManagerLifecyclePathTest.java
index bebc413..3d5d9c5 100644
--- 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
@@ -17,50 +17,64 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import org.eclipse.jetty.deploy.graph.Node;
 import org.junit.Test;
 
 public class DeploymentManagerLifecyclePathTest
 {
     @Test
-    public void testStateTransition_NewToDeployed()
+    public void testStateTransition_NewToDeployed() throws Exception
     {
-        LifecycleOrderTracker pathtracker = new LifecycleOrderTracker();
         DeploymentManager depman = new DeploymentManager();
-        depman.addLifecycleBinding(pathtracker);
-        App app = new MockApp();
+        depman.setDefaultLifeCycleState(null); // no default
+        AppLifecyclePathCollector pathtracker = new AppLifecyclePathCollector();
+        MockAppProvider mockProvider = new MockAppProvider();
 
-        // Pretend to AppProvider ...
-        depman.addApp(app);
+        depman.addLifecycleBinding(pathtracker);
+        depman.addAppProvider(mockProvider);
+
+        // 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.getId(),"deployed");
+        depman.requestAppGoal(app,"deployed");
 
         // Setup Expectations.
-        List<Node> expectedOrder = new ArrayList<Node>();
-        expectedOrder.add(new Node("pre-deploying"));
-        expectedOrder.add(new Node("deploying"));
-        expectedOrder.add(new Node("deployed"));
+        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",expectedOrder);
+        pathtracker.assertExpected("Test StateTransition / New -> Deployed",expected);
     }
 
     @Test
-    public void testStateTransition_Receive()
+    public void testStateTransition_Receive() throws Exception
     {
-        LifecycleOrderTracker pathtracker = new LifecycleOrderTracker();
         DeploymentManager depman = new DeploymentManager();
-        depman.addLifecycleBinding(pathtracker);
-        App app = new MockApp();
+        depman.setDefaultLifeCycleState(null); // no default
+        AppLifecyclePathCollector pathtracker = new AppLifecyclePathCollector();
+        MockAppProvider mockProvider = new MockAppProvider();
 
-        // Pretend to AppProvider
-        depman.addApp(app);
+        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<Node> expectedOrder = new ArrayList<Node>();
+        List<String> expected = new ArrayList<String>();
 
-        pathtracker.assertExpected("Test StateTransition / New only",expectedOrder);
+        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
index d334fd2..eafa65c 100644
--- 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
@@ -10,15 +10,21 @@
 public class DeploymentManagerTest
 {
     @Test
-    public void testReceiveApp()
+    public void testReceiveApp() throws Exception
     {
-        LifecycleOrderTracker pathtracker = new LifecycleOrderTracker();
         DeploymentManager depman = new DeploymentManager();
-        depman.addLifecycleBinding(pathtracker);
-        App app = new MockApp();
+        depman.setDefaultLifeCycleState(null); // no default
+        AppLifecyclePathCollector pathtracker = new AppLifecyclePathCollector();
+        MockAppProvider mockProvider = new MockAppProvider();
 
-        // Pretend to be AppProvider ...
-        depman.addApp(app);
+        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();
@@ -26,15 +32,15 @@
         Assert.assertEquals("Expected App Count",1,apps.size());
 
         // Test app get
-        App actual = depman.getApp("mock-app");
+        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)",app.getId(),actual.getId());
+        Assert.assertEquals("Should have gotten app (by id)","mock-foo-webapp-1.war",actual.getOriginId());
     }
 
     @Test
     public void testBinding()
     {
-        LifecycleOrderTracker pathtracker = new LifecycleOrderTracker();
+        AppLifecyclePathCollector pathtracker = new AppLifecyclePathCollector();
         DeploymentManager depman = new DeploymentManager();
         depman.addLifecycleBinding(pathtracker);
 
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/MockApp.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/MockApp.java
deleted file mode 100644
index 123b66d..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/MockApp.java
+++ /dev/null
@@ -1,53 +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.server.handler.ContextHandler;
-
-public class MockApp implements App
-{
-    public ContextHandler getContextHandler(DeploymentManager deployMgr)
-    {
-        return null;
-    }
-
-    public File getDir()
-    {
-        return null;
-    }
-
-    public String getId()
-    {
-        return "mock-app";
-    }
-
-    public String getName()
-    {
-        return "Mock App";
-    }
-
-    public String getOrigin()
-    {
-        return "Test Cases";
-    }
-
-    public File getWorkDir()
-    {
-        return null;
-    }
-}
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
new file mode 100644
index 0000000..2e49846
--- /dev/null
+++ b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/MockAppProvider.java
@@ -0,0 +1,44 @@
+// ========================================================================
+// 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;
+
+public class MockAppProvider implements AppProvider
+{
+    private DeploymentManager deployMan;
+    private File webappsDir;
+
+    public void startProvider(DeploymentManager deploymentManager) throws Exception
+    {
+        this.deployMan = deploymentManager;
+        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);
+    }
+
+    public void stopProvider() throws Exception
+    {
+        /* ignore */
+    }
+}
diff --git a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/providers/ContextsDirAppProviderTest.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/providers/ContextsDirAppProviderTest.java
deleted file mode 100644
index 743edb9..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/providers/ContextsDirAppProviderTest.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.providers;
-
-import org.eclipse.jetty.deploy.test.XmlConfiguredJetty;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.HandlerCollection;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class ContextsDirAppProviderTest
-{
-    private static XmlConfiguredJetty jetty;
-
-    @BeforeClass
-    public static 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();
-    }
-
-    @AfterClass
-    public static void teardownEnvironment() throws Exception
-    {
-        // Stop jetty.
-        jetty.stop();
-    }
-
-    @Test
-    public void testFindContext()
-    {
-        // Check Server for Handlers
-        Server server = jetty.getServer();
-        Handler handler = server.getHandler();
-        System.out.println("handler: " + handler);
-
-        if (handler instanceof HandlerCollection)
-        {
-            System.out.printf("Handler Collection (child-handlers:%s - handlers:%d)%n",((HandlerCollection)handler).getChildHandlers().length,
-                    ((HandlerCollection)handler).getHandlers().length);
-            System.out.println("is a HandlerCollection: " + ((HandlerCollection)handler).dump());
-        }
-
-        // TODO: verify that handler was created for context.
-    }
-
-    // TODO: write test that adds new app (after startup).
-
-    // TODO: write test that adds new app (after startup), then removes it from filesystem (resulting in removed from handlers).
-
-    // TODO: write test that adds new app (after startup), then updates it (redeploy).
-
-}
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
new file mode 100644
index 0000000..9b71bee
--- /dev/null
+++ b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProviderRuntimeUpdatesTest.java
@@ -0,0 +1,131 @@
+// ========================================================================
+// 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.DeploymentManager;
+import org.eclipse.jetty.deploy.test.XmlConfiguredJetty;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+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;
+
+    @BeforeClass
+    public static 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();
+    }
+
+    @AfterClass
+    public static void teardownEnvironment() throws Exception
+    {
+        // Stop jetty.
+        jetty.stop();
+    }
+
+    /**
+     * Cleanup / undeploy any handlers currently installed.
+     */
+    @Before
+    public void cleanupHandlers()
+    {
+        DeploymentManager depman = jetty.getActiveDeploymentManager();
+        depman.undeployAll();
+        jetty.assertNoWebAppContexts();
+    }
+
+    /**
+     * 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
+    @Ignore
+    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: 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();
+        // FIXME: jetty.assertWebAppContextsExists("/foo");
+
+        // Test that webapp response contains "-2"
+        // FIXME: 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
new file mode 100644
index 0000000..aa2abfe
--- /dev/null
+++ b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/providers/MonitoredDirAppProviderStartupTest.java
@@ -0,0 +1,62 @@
+// ========================================================================
+// 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/XmlConfiguredJetty.java b/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/test/XmlConfiguredJetty.java
deleted file mode 100644
index 90fc9e4..0000000
--- a/jetty-deploy-manager-graph/src/test/java/org/eclipse/jetty/deploy/test/XmlConfiguredJetty.java
+++ /dev/null
@@ -1,215 +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.net.InetAddress;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-import org.eclipse.jetty.http.HttpSchemes;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.util.IO;
-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;
-
-    public XmlConfiguredJetty() throws IOException
-    {
-        String testname = new Throwable().getStackTrace()[1].getClassName();
-
-        xmlConfigurations = new ArrayList<URL>();
-        properties = new Properties();
-
-        File jettyHome = MavenTestingUtils.getTargetTestingDir(testname);
-        // 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"));
-
-        File webappsDir = new File(jettyHome,"webapps");
-        webappsDir.mkdirs();
-        File tmpDir = new File(MavenTestingUtils.getTargetTestingDir(testname),"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",MavenTestingUtils.getTestResourceDir("webapps").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 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());
-    }
-
-    @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 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();
-    }
-}
diff --git a/jetty-deploy-manager-graph/src/test/resources/contexts/logcommon.xml b/jetty-deploy-manager-graph/src/test/resources/contexts/foo.xml
similarity index 69%
rename from jetty-deploy-manager-graph/src/test/resources/contexts/logcommon.xml
rename to jetty-deploy-manager-graph/src/test/resources/contexts/foo.xml
index 6da9c12..cb3e7dd 100644
--- a/jetty-deploy-manager-graph/src/test/resources/contexts/logcommon.xml
+++ b/jetty-deploy-manager-graph/src/test/resources/contexts/foo.xml
@@ -1,8 +1,8 @@
 <?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">/logcommon</Set>
+    <Set name="contextPath">/foo</Set>
     <Set name="war">
-        <Property name="test.webapps" default="." />/logcommon.war
+        <Property name="test.webapps" default="." />/foo.war
     </Set>
 </Configure>
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
index e917ca9..cd778ce 100644
--- a/jetty-deploy-manager-graph/src/test/resources/jetty-deploymgr-contexts.xml
+++ b/jetty-deploy-manager-graph/src/test/resources/jetty-deploymgr-contexts.xml
@@ -20,30 +20,30 @@
         <!-- Lifecycle Bindings -->
         <Call name="addLifecycleBinding">
           <Arg>
-            <New class="org.eclipse.jetty.deploy.bindings.DefaultDeployer" />
+            <New class="org.eclipse.jetty.deploy.bindings.StandardDeployer" />
           </Arg>
         </Call>
         <Call name="addLifecycleBinding">
           <Arg>
-            <New class="org.eclipse.jetty.deploy.bindings.DefaultUndeployer" />
+            <New class="org.eclipse.jetty.deploy.bindings.StandardUndeployer" />
           </Arg>
         </Call>
         <Call name="addLifecycleBinding">
           <Arg>
-            <New class="org.eclipse.jetty.deploy.bindings.DefaultStarter" />
+            <New class="org.eclipse.jetty.deploy.bindings.StandardStarter" />
           </Arg>
         </Call>
         <Call name="addLifecycleBinding">
           <Arg>
-            <New class="org.eclipse.jetty.deploy.bindings.DefaultStopper" />
+            <New class="org.eclipse.jetty.deploy.bindings.StandardStopper" />
           </Arg>
         </Call>
 
         <!-- Providers of Apps -->
         <Call name="addAppProvider">
           <Arg>
-            <New class="org.eclipse.jetty.deploy.providers.ContextsDirAppProvider">
-              <Set name="contextsDir">
+            <New class="org.eclipse.jetty.deploy.providers.MonitoredDirAppProvider">
+              <Set name="monitoredDir">
                 <Property name="test.resourcesdir" default="src/test/resources" />/contexts
               </Set>
               <Set name="scanInterval">0</Set>
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
new file mode 100644
index 0000000..e4ed5be
--- /dev/null
+++ b/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-1.war
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
new file mode 100644
index 0000000..df0f023
--- /dev/null
+++ b/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-2.war
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
new file mode 100644
index 0000000..649d81b
--- /dev/null
+++ b/jetty-deploy-manager-graph/src/test/resources/webapps/foo-webapp-3.war
Binary files differ
