Index: src/main/java/org/mortbay/jetty/plugin/Jetty6MavenConfiguration.java
===================================================================
--- src/main/java/org/mortbay/jetty/plugin/Jetty6MavenConfiguration.java	(revision 2289)
+++ src/main/java/org/mortbay/jetty/plugin/Jetty6MavenConfiguration.java	(working copy)
@@ -38,8 +38,6 @@
 {
     private List classPathFiles;
     private File webXmlFile;
-    
-    
    
     public Jetty6MavenConfiguration()
     {
@@ -75,7 +73,18 @@
                 Log.debug("Classpath = "+LazyList.array2List(((URLClassLoader)getWebAppContext().getClassLoader()).getURLs()));
         }
         else
+        {
             super.configureClassLoader();
+        }
+
+        // knock out environmental maven and plexus classes from webAppContext
+        String[] existingServerClasses = getWebAppContext().getServerClasses();
+        String[] newServerClasses = new String[2+(existingServerClasses==null?0:existingServerClasses.length)];
+        newServerClasses[0] = "-org.apache.maven.";
+        newServerClasses[1] = "-org.codehaus.plexus.";
+        System.arraycopy( existingServerClasses, 0, newServerClasses, 2, existingServerClasses.length );
+        
+        getWebAppContext().setServerClasses( newServerClasses );
     }
 
     
Index: src/main/java/org/mortbay/jetty/plugin/Jetty6RunWar.java
===================================================================
--- src/main/java/org/mortbay/jetty/plugin/Jetty6RunWar.java	(revision 2289)
+++ src/main/java/org/mortbay/jetty/plugin/Jetty6RunWar.java	(working copy)
@@ -106,29 +106,8 @@
             {
                 try
                 {
-                    getLog().info("Restarting webapp ...");
-                    getLog().debug("Stopping webapp ...");
-                    webAppConfig.stop();
-                    getLog().debug("Reconfiguring webapp ...");
-
-                    checkPomConfiguration();
-                    
-                    // check if we need to reconfigure the scanner,
-                    // which is if the pom changes
-                    if (changes.contains(getProject().getFile().getCanonicalPath()))
-                    {
-                        getLog().info("Reconfiguring scanner after change to pom.xml ...");
-                        ArrayList scanList = getScanList();
-                        scanList.clear();
-                        scanList.add(getProject().getFile());
-                        scanList.add(webApp);
-                        setScanList(scanList);
-                        getScanner().setScanDirs(scanList);
-                    }
-
-                    getLog().debug("Restarting webapp ...");
-                    webAppConfig.start();
-                    getLog().info("Restart completed.");
+                    boolean reconfigure = changes.contains(getProject().getFile().getCanonicalPath());
+                    restartWebApp(reconfigure);
                 }
                 catch (Exception e)
                 {
@@ -140,10 +119,37 @@
         
     }
 
+    
+    
 
+    public void restartWebApp(boolean reconfigureScanner) throws Exception 
+    {
+        getLog().info("Restarting webapp ...");
+        getLog().debug("Stopping webapp ...");
+        webAppConfig.stop();
+        getLog().debug("Reconfiguring webapp ...");
 
+        checkPomConfiguration();
 
+        // check if we need to reconfigure the scanner,
+        // which is if the pom changes
+        if (reconfigureScanner)
+        {
+            getLog().info("Reconfiguring scanner after change to pom.xml ...");
+            ArrayList scanList = getScanList();
+            scanList.clear();
+            scanList.add(getProject().getFile());
+            scanList.add(webApp);
+            setScanList(scanList);
+            getScanner().setScanDirs(scanList);
+        }
 
+        getLog().debug("Restarting webapp ...");
+        webAppConfig.start();
+        getLog().info("Restart completed.");
+    }
+
+
     /**
      * @see org.mortbay.jetty.plugin.AbstractJettyMojo#finishConfigurationBeforeStart()
      */
Index: src/main/java/org/mortbay/jetty/plugin/AbstractJettyMojo.java
===================================================================
--- src/main/java/org/mortbay/jetty/plugin/AbstractJettyMojo.java	(revision 2289)
+++ src/main/java/org/mortbay/jetty/plugin/AbstractJettyMojo.java	(working copy)
@@ -22,16 +22,15 @@
 import java.util.Iterator;
 import java.util.List;
 
-
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
+import org.mortbay.jetty.plugin.util.ConsoleScanner;
 import org.mortbay.jetty.plugin.util.JettyPluginServer;
 import org.mortbay.jetty.plugin.util.PluginLog;
+import org.mortbay.jetty.plugin.util.SystemProperty;
 import org.mortbay.util.Scanner;
-import org.mortbay.jetty.plugin.util.SystemProperty;
-import org.mortbay.jetty.webapp.WebAppContext;
 
 
 
@@ -108,15 +107,27 @@
     
     /**
      * The interval in seconds to scan the webapp for changes 
-     * and restart the context if necessary. Disabled by default.
+     * and restart the context if necessary. Ignored if reload
+     * is enabled. Disabled by default.
      * 
-     * @parameter expression="0"
+     * @parameter expression="${jetty.scanIntervalSeconds}" default-value="0"
      * @required
      */
     protected int scanIntervalSeconds;
     
     
     /**
+     * reload can be set to either 'automatic' or 'manual'
+     *
+     * if 'manual' then the context can be reloaded by a linefeed in the console
+     * if 'automatic' then traditional reloading on changed files is enabled.
+     * 
+     * @parameter expression="${jetty.reload}" default-value="automatic"
+     */
+    protected String reload;
+    
+    
+    /**
      * System properties to set before execution. 
      * Note that these properties will NOT override System properties 
      * that have been set on the command line or by the JVM. Optional.
@@ -164,6 +175,12 @@
     protected ArrayList scannerListeners;
     
     
+    /**
+     * A scanner to check ENTER hits on the console
+     */
+    protected Thread consoleScanner;
+
+    
     public String PORT_SYSPROPERTY = "jetty.port";
     
     /**
@@ -359,8 +376,11 @@
             getLog().info("Started Jetty Server");
             
             // start the scanner thread (if necessary) on the main webapp
-            configureScanner ();            
+            configureScanner ();
             startScanner();
+            
+            // start the new line scanner thread if necessary
+            startConsoleScanner();
 
             // keep the thread going
             server.join();
@@ -377,6 +397,7 @@
     }
     
     
+    public abstract void restartWebApp(boolean reconfigureScanner) throws Exception;
 
     /**
      * Subclasses should invoke this to setup basic info
@@ -416,9 +437,19 @@
      */
     private void startScanner()
     {
+
         // check if scanning is enabled
         if (getScanIntervalSeconds() <= 0) return;
 
+        // check if reload is manual. It disables file scanning
+        if ( "manual".equalsIgnoreCase( reload ) )
+        {
+            // issue a warning if both scanIntervalSeconds and reload
+            // are enabled
+            getLog().warn("scanIntervalSeconds is set to " + scanIntervalSeconds + " but will be IGNORED due to manual reloading");
+            return;
+        }
+
         scanner = new Scanner();
         scanner.setReportExistingFilesOnStartup(false);
         scanner.setScanInterval(getScanIntervalSeconds());
@@ -432,6 +463,20 @@
         scanner.start();
     }
     
+    /**
+     * Run a thread that monitors the console input to detect ENTER hits.
+     */
+    protected void startConsoleScanner() 
+    {
+        if ( "manual".equalsIgnoreCase( reload ) )
+        {
+            getLog().info("Console reloading is ENABLED. Hit ENTER on the console to restart the context.");
+            consoleScanner = new ConsoleScanner(this);
+            consoleScanner.start();
+        }
+        
+    }
+
     private void configureSystemProperties ()
     {
         // get the system properties set up
Index: src/main/java/org/mortbay/jetty/plugin/Jetty6RunWarExploded.java
===================================================================
--- src/main/java/org/mortbay/jetty/plugin/Jetty6RunWarExploded.java	(revision 2289)
+++ src/main/java/org/mortbay/jetty/plugin/Jetty6RunWarExploded.java	(working copy)
@@ -21,9 +21,7 @@
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
-import org.mortbay.jetty.Connector;
 import org.mortbay.util.Scanner;
-import org.mortbay.jetty.security.UserRealm;
 
 /**
  * 
@@ -98,38 +96,8 @@
             {
                 try
                 {
-                    getLog().info("Restarting webapp");
-                    getLog().debug("Stopping webapp ...");
-                    webAppConfig.stop();
-                    getLog().debug("Reconfiguring webapp ...");
-
-                    checkPomConfiguration();
-                    
-                    // check if we need to reconfigure the scanner,
-                    // which is if the pom changes
-                    if (changes.contains(getProject().getFile().getCanonicalPath()))
-                    {
-                        getLog().info("Reconfiguring scanner after change to pom.xml ...");
-                        ArrayList scanList = getScanList();
-                        scanList.clear();
-                        scanList.add(getProject().getFile());
-                        File webInfDir = new File(webApp,"WEB-INF");
-                        scanList.add(new File(webInfDir, "web.xml"));
-                        File jettyWebXmlFile = findJettyWebXmlFile(webInfDir);
-                        if (jettyWebXmlFile != null)
-                            scanList.add(jettyWebXmlFile);
-                        File jettyEnvXmlFile = new File(webInfDir, "jetty-env.xml");
-                        if (jettyEnvXmlFile.exists())
-                            scanList.add(jettyEnvXmlFile);
-                        scanList.add(new File(webInfDir, "classes"));
-                        scanList.add(new File(webInfDir, "lib"));
-                        setScanList(scanList);
-                        getScanner().setScanDirs(scanList);
-                    }
-
-                    getLog().debug("Restarting webapp ...");
-                    webAppConfig.start();
-                    getLog().info("Restart completed.");
+                    boolean reconfigure = changes.contains(getProject().getFile().getCanonicalPath());
+                    restartWebApp(reconfigure);
                 }
                 catch (Exception e)
                 {
@@ -140,7 +108,46 @@
         setScannerListeners(listeners);
     }
 
+    
+    
+    
+    public void restartWebApp(boolean reconfigureScanner) throws Exception 
+    {
+        getLog().info("Restarting webapp");
+        getLog().debug("Stopping webapp ...");
+        webAppConfig.stop();
+        getLog().debug("Reconfiguring webapp ...");
 
+        checkPomConfiguration();
+
+        // check if we need to reconfigure the scanner,
+        // which is if the pom changes
+        if (reconfigureScanner)
+        {
+            getLog().info("Reconfiguring scanner after change to pom.xml ...");
+            ArrayList scanList = getScanList();
+            scanList.clear();
+            scanList.add(getProject().getFile());
+            File webInfDir = new File(webApp,"WEB-INF");
+            scanList.add(new File(webInfDir, "web.xml"));
+            File jettyWebXmlFile = findJettyWebXmlFile(webInfDir);
+            if (jettyWebXmlFile != null)
+                scanList.add(jettyWebXmlFile);
+            File jettyEnvXmlFile = new File(webInfDir, "jetty-env.xml");
+            if (jettyEnvXmlFile.exists())
+                scanList.add(jettyEnvXmlFile);
+            scanList.add(new File(webInfDir, "classes"));
+            scanList.add(new File(webInfDir, "lib"));
+            setScanList(scanList);
+            getScanner().setScanDirs(scanList);
+        }
+
+        getLog().debug("Restarting webapp ...");
+        webAppConfig.start();
+        getLog().info("Restart completed.");
+    }
+
+        
     /* (non-Javadoc)
      * @see org.mortbay.jetty.plugin.util.AbstractJettyMojo#finishConfigurationBeforeStart()
      */
Index: src/main/java/org/mortbay/jetty/plugin/util/ConsoleScanner.java
===================================================================
--- src/main/java/org/mortbay/jetty/plugin/util/ConsoleScanner.java	(revision 0)
+++ src/main/java/org/mortbay/jetty/plugin/util/ConsoleScanner.java	(revision 0)
@@ -0,0 +1,99 @@
+/**
+ * 
+ */
+package org.mortbay.jetty.plugin.util;
+
+import java.io.IOException;
+
+import org.mortbay.jetty.plugin.AbstractJettyMojo;
+
+public class ConsoleScanner extends Thread {
+    
+    private final AbstractJettyMojo mojo;
+    
+    public ConsoleScanner(AbstractJettyMojo mojo) {
+        this.mojo = mojo;
+        setName("Console scanner");
+        setDaemon(true);
+    }
+    
+    public void run() {
+        
+        try 
+        {
+            while (true) 
+            {
+                checkSystemInput();
+                getSomeSleep();
+            }
+        } 
+        catch (IOException e) 
+        {
+            mojo.getLog().warn(e);
+        }
+    }
+    
+    private void getSomeSleep() {
+        try 
+        {
+            Thread.sleep(500);
+        } 
+        catch (InterruptedException e) 
+        {
+            mojo.getLog().debug(e);
+        }
+    }
+    
+    private void checkSystemInput() throws IOException {
+        
+        while (System.in.available() > 0) {
+            int inputByte = System.in.read();
+            if (inputByte >= 0) 
+            {
+                char c = (char)inputByte;
+                if (c == '\n') {
+                    restartWebApp();
+                }
+            }
+        }
+    }
+    
+    
+    /**
+     * Skip buffered bytes of system console.
+     */
+    private void clearInputBuffer() {
+
+        try {
+            while (System.in.available() > 0) 
+            {
+                // System.in.skip doesn't work properly. I don't know why
+                long available = System.in.available();
+                for (int i = 0; i < available; i++) {
+                    if (System.in.read() == -1) 
+                    {
+                        break;
+                    }
+                }
+            }
+        } catch (IOException e) 
+        {
+            mojo.getLog().warn("Error discarding console input buffer", e);
+        }
+        
+    }
+    
+    private void restartWebApp() {
+        try 
+        {
+            mojo.restartWebApp(false);
+            // Clear input buffer to discard anything entered on the console
+            // while the application was being restarted.
+            clearInputBuffer();
+        } 
+        catch (Exception e) 
+        {
+            mojo.getLog().error("Error reconfiguring/restarting webapp after a new line on the console", e);
+        }
+    }
+}
\ No newline at end of file
Index: src/main/java/org/mortbay/jetty/plugin/AbstractJettyRunMojo.java
===================================================================
--- src/main/java/org/mortbay/jetty/plugin/AbstractJettyRunMojo.java	(revision 2289)
+++ src/main/java/org/mortbay/jetty/plugin/AbstractJettyRunMojo.java	(working copy)
@@ -26,9 +26,9 @@
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import org.codehaus.plexus.util.FileUtils;
+import org.mortbay.jetty.plugin.util.ScanTargetPattern;
 import org.mortbay.util.Scanner;
-import org.mortbay.jetty.plugin.util.ScanTargetPattern;
-import org.codehaus.plexus.util.FileUtils;
 
 /**
  * AbstractJettyRunMojo
@@ -227,7 +227,17 @@
             throw new MojoExecutionException("Webapp source directory does not exist", e);
         }
         
-       
+        // check reload mechanic
+        if ( !"automatic".equalsIgnoreCase( reload ) && !"manual".equalsIgnoreCase( reload ) )
+        {
+            throw new MojoExecutionException( "invalid reload mechanic specified, must be 'automatic' or 'manual'" );
+        }
+        else
+        {
+            getLog().info("Reload Mechanic: " + reload );
+        }
+
+
         // get the web.xml file if one has been provided, otherwise assume it is
         // in the webapp src directory
         if (getWebXml() == null )
@@ -382,32 +392,8 @@
             {
                 try
                 {
-                    getLog().info("restarting "+webAppConfig);
-                    getLog().debug("Stopping webapp ...");
-                    webAppConfig.stop();
-                    getLog().debug("Reconfiguring webapp ...");
-
-                    checkPomConfiguration();
-                    configureWebApplication();
-
-                    // check if we need to reconfigure the scanner,
-                    // which is if the pom changes
-                    if (changes.contains(getProject().getFile().getCanonicalPath()))
-                    {
-                        getLog().info("Reconfiguring scanner after change to pom.xml ...");
-                        scanList.clear();
-                        scanList.add(getWebXmlFile());
-                        if (getJettyEnvXmlFile() != null)
-                            scanList.add(getJettyEnvXmlFile());
-                        scanList.addAll(getExtraScanTargets());
-                        scanList.add(getProject().getFile());
-                        scanList.addAll(getClassPathFiles());
-                        getScanner().setScanDirs(scanList);
-                    }
-
-                    getLog().debug("Restarting webapp ...");
-                    webAppConfig.start();
-                    getLog().info("Restart completed at "+new Date().toString());
+                    boolean reconfigure = changes.contains(getProject().getFile().getCanonicalPath());
+                    restartWebApp(reconfigure);
                 }
                 catch (Exception e)
                 {
@@ -420,6 +406,35 @@
         setScannerListeners(listeners);
     }
 
+    public void restartWebApp(boolean reconfigureScanner) throws Exception 
+    {
+        getLog().info("restarting "+webAppConfig);
+        getLog().debug("Stopping webapp ...");
+        webAppConfig.stop();
+        getLog().debug("Reconfiguring webapp ...");
+
+        checkPomConfiguration();
+        configureWebApplication();
+
+        // check if we need to reconfigure the scanner,
+        // which is if the pom changes
+        if (reconfigureScanner)
+        {
+            getLog().info("Reconfiguring scanner after change to pom.xml ...");
+            scanList.clear();
+            scanList.add(getWebXmlFile());
+            if (getJettyEnvXmlFile() != null)
+                scanList.add(getJettyEnvXmlFile());
+            scanList.addAll(getExtraScanTargets());
+            scanList.add(getProject().getFile());
+            scanList.addAll(getClassPathFiles());
+            getScanner().setScanDirs(scanList);
+        }
+
+        getLog().debug("Restarting webapp ...");
+        webAppConfig.start();
+        getLog().info("Restart completed at "+new Date().toString());
+    }
     
     private List getDependencyFiles ()
     {
