diff --git a/pom.xml b/pom.xml
index 12aa0af..e0a14cb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -176,44 +176,71 @@
   </build>
 
   <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>findbugs-maven-plugin</artifactId>
-        <version>1.2</version>
-        <configuration>
-          <threshold>Normal</threshold>
-          <effort>Default</effort>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <configuration>
-          <configLocation>src/conf/checkstyle.xml</configLocation>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-pmd-plugin</artifactId>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>cobertura-maven-plugin</artifactId>
-        <version>2.2</version>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>clirr-maven-plugin</artifactId>
-        <version>2.2.1</version>
-        <configuration>
-          <comparisonVersion>1.1</comparisonVersion>
-        </configuration>
-      </plugin>
-    </plugins>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-javadoc-plugin</artifactId>
+          <configuration>
+            <linksource>true</linksource>
+            <links>
+              <link>http://java.sun.com/javase/6/docs/api</link>
+            </links>
+          </configuration>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-changes-plugin</artifactId>
+          <version>2.0</version>
+          <configuration>
+            <xmlPath>${basedir}/xdocs/changes.xml</xmlPath>
+            <issueLinkTemplate>%URL%/%ISSUE%</issueLinkTemplate>
+          </configuration>
+          <reportSets>
+            <reportSet>
+              <reports>
+                 <report>changes-report</report>
+              </reports>
+            </reportSet>
+          </reportSets>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-checkstyle-plugin</artifactId>
+          <version>2.1</version>
+          <configuration>
+            <configLocation>src/conf/checkstyle.xml</configLocation>
+            <enableRulesSummary>false</enableRulesSummary>
+          </configuration>
+        </plugin>
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>findbugs-maven-plugin</artifactId>
+          <version>1.2</version>
+          <configuration>
+            <threshold>Normal</threshold>
+            <effort>Default</effort>
+         </configuration>
+        </plugin>
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>cobertura-maven-plugin</artifactId>
+          <version>2.2</version>
+        </plugin>
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>clirr-maven-plugin</artifactId>
+          <version>2.2.1</version>
+          <configuration>
+            <comparisonVersion>1.1</comparisonVersion>
+          </configuration>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-pmd-plugin</artifactId>
+        </plugin>
+      </plugins>
   </reporting>
 
-
   <profiles>
     <!-- Profile to let Gump choose the name of the jar file generated -->
     <profile>
diff --git a/src/site/site.xml b/src/site/site.xml
index 74c6826..1eef929 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -32,21 +32,13 @@
             <item name="Source Repository"    href="/source-repository.html"/>
         </menu>
 
-        <menu name="CLI 1 User Guide">
+        <menu name="User Guide">
             <item name="Getting started"      href="/introduction.html"/>
             <item name="Usage scenarios"      href="/usage.html"/>
             <item name="Option properties"    href="/properties.html"/>
             <item name="Javadoc (1.2)"        href="api-release/index.html"/>
         </menu>
 
-        <menu name="CLI 2 User Guide (dev)">
-            <item name="Overview"             href="/manual/index.html"/>
-            <item name="Examples"             href="/examples/index.html"/>
-            <item name="Options"              href="/manual/options.html"/>
-            <item name="Validators"           href="/manual/validators.html"/>
-            <item name="Javadoc (SVN latest)" href="apidocs/index.html"/>
-        </menu>
-
     </body>
 
 </project>
diff --git a/xdocs/examples/ant.xml b/xdocs/examples/ant.xml
deleted file mode 100644
index 8be3bf5..0000000
--- a/xdocs/examples/ant.xml
+++ /dev/null
@@ -1,301 +0,0 @@
-<?xml version="1.0"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<document>
-
-  <properties>
-    <author email="dev@commons.apache.org">commons-dev</author>
-    <title>Examples - ant</title>
-  </properties>
-
-  <body>
-    <section name="ant">
-      <p>
-        This example works through modelling Apache Ant using CLI2, the 
-        example is based on Apache Ant version 1.6.1 compiled on February 12 
-        2004.
-      </p>
-      <p>
-        "Apache Ant is a Java-based build tool. In theory, it is kind of like 
-        Make, but without Make's wrinkles." - For more information please 
-        visit <a href="http://ant.apache.org/">http://ant.apache.org/</a>
-      </p>
-      <subsection name="Modelling">
-      <p>
-        To model the ant options we first need to create some Builders so that 
-        each of the option instances can be created:
-      </p>
-<source>final DefaultOptionBuilder obuilder = new DefaultOptionBuilder();
-final ArgumentBuilder abuilder = new ArgumentBuilder();
-final GroupBuilder gbuilder = new GroupBuilder();</source>
-      <p>
-      	For each option we create an Option instance that will model it, built 
-      	using the Builder instances above:
-      </p>
-<source>Option help =
-    obuilder
-        .withShortName("help")
-        .withShortName("h")
-        .withDescription("print this message")
-        .create();
-Option projecthelp =
-    obuilder
-        .withShortName("projecthelp")
-        .withShortName("p")
-        .withDescription("print project help information")
-        .create();
-Option version =
-    obuilder
-        .withShortName("version")
-        .withDescription("print the version information and exit")
-        .create();
-Option diagnostics =
-    obuilder
-        .withShortName("diagnostics")
-        .withDescription("print information that might be helpful to diagnose or report problems.")
-        .create();
-Option quiet =
-    obuilder
-        .withShortName("quiet")
-        .withShortName("q")
-        .withDescription("be extra quiet")
-        .create();
-Option verbose =
-    obuilder
-        .withShortName("verbose")
-        .withShortName("v")
-        .withDescription("be extra verbose")
-        .create();
-Option debug =
-    obuilder
-        .withShortName("debug")
-        .withShortName("d")
-        .withDescription("print debugging information")
-        .create();
-Option emacs =
-    obuilder
-        .withShortName("emacs")
-        .withShortName("e")
-        .withDescription("produce logging information without adornments")
-        .create();
-Option lib =
-    obuilder
-        .withShortName("lib")
-        .withDescription("specifies a path to search for jars and classes")
-        .withArgument(
-            abuilder
-                .withName("path")
-                .withMinimum(1)
-                .withMaximum(1)
-                .create())
-        .create();
-Option logfile =
-    obuilder
-        .withShortName("logfile")
-        .withShortName("l")
-        .withDescription("use given file for log")
-        .withArgument(
-            abuilder
-                .withName("file")
-                .withMinimum(1)
-                .withMaximum(1)
-                .create())
-        .create();
-Option logger =
-    obuilder
-        .withShortName("logger")
-        .withDescription("the class which is to perform logging")
-        .withArgument(
-            abuilder
-                .withName("classname")
-                .withMinimum(1)
-                .withMaximum(1)
-                .create())
-        .create();
-Option listener =
-    obuilder
-        .withShortName("listener")
-        .withDescription("add an instance of class as a project listener")
-        .withArgument(
-            abuilder
-                .withName("classname")
-                .withMinimum(1)
-                .withMaximum(1)
-                .create())
-        .create();
-Option noinput =
-    obuilder
-        .withShortName("noinput")
-        .withDescription("do not allow interactive input")
-        .create();
-Option buildfile =
-    obuilder
-        .withShortName("buildfile")
-        .withShortName("file")
-        .withShortName("f")
-        .withDescription("use given buildfile")
-        .withArgument(
-            abuilder
-                .withName("file")
-                .withMinimum(1)
-                .withMaximum(1)
-                .create())
-        .create();
-Option property = new PropertyOption();
-Option propertyfile =
-    obuilder
-        .withShortName("propertyfile")
-        .withDescription("load all properties from file with -D properties taking precedence")
-        .withArgument(
-            abuilder
-                .withName("name")
-                .withMinimum(1)
-                .withMaximum(1)
-                .create())
-        .create();
-Option inputhandler =
-    obuilder
-        .withShortName("inputhandler")
-        .withDescription("the class which will handle input requests")
-        .withArgument(
-            abuilder
-                .withName("class")
-                .withMinimum(1)
-                .withMaximum(1)
-                .create())
-        .create();
-Option find =
-    obuilder
-        .withShortName("find")
-        .withShortName("s")
-        .withDescription("search for buildfile towards the root of the filesystem and use it")
-        .withArgument(
-            abuilder
-                .withName("file")
-                .withMinimum(1)
-                .withMaximum(1)
-                .create())
-        .create();
-Option targets = abuilder.withName("target").create();</source>
-      <p>
-        We now create a Group instance consisting of all the above options:
-      </p>
-<source>Group options =
-    gbuilder
-        .withName("options")
-        .withOption(help)
-        .withOption(projecthelp)
-        .withOption(version)
-        .withOption(diagnostics)
-        .withOption(quiet)
-        .withOption(verbose)
-        .withOption(debug)
-        .withOption(emacs)
-        .withOption(lib)
-        .withOption(logfile)
-        .withOption(logger)
-        .withOption(listener)
-        .withOption(noinput)
-        .withOption(buildfile)
-        .withOption(property)
-        .withOption(propertyfile)
-        .withOption(inputhandler)
-        .withOption(find)
-        .withOption(targets)
-        .create();</source>
-      </subsection>
-      <subsection name="Querying">
-      <p>
-        Once the model is built, a CommandLine needs to be parsed:
-      </p>
-<source>Parser parser = new Parser();
-parser.setGroup(options);
-CommandLine cl = parser.parse(args);</source>
-      <p>
-        The CommandLine can be tested for the presence of options using the 
-        hasOption() methods which take either an option instance or a trigger 
-        value to lookup against:
-      </p>
-<source>if(cl.hasOption(help)) {
-    //displayHelp();
-    return;
-}
-if(cl.hasOption("-version")) {
-    //displayVersion();
-    return;
-}</source>
-      <p>
-        For those options that have an argument, the argument needs to be 
-        extracted and processed:
-      </p>
-<source>if(cl.hasOption(logfile)) {
-    String file = (String)cl.getValue(logfile);
-    //setLogFile(file);
-}</source>
-      <p>
-        Each target for ant to process could then be processed in order as 
-        specified:
-      </p>
-<source>List targetList = cl.getValues(targets);
-for (Iterator i = targetList.iterator(); i.hasNext();) {
-    String target = (String) i.next();
-    //doTarget(target);
-}</source>
-      </subsection>
-      <subsection name="Helping">
-      <p>
-        To generate a help page for ant we first need to create a 
-        HelpFormatter and set some basic properties.  The shell command is 
-        the command that the user would have typed to invoke the application, 
-        and the group is the group of options that compose the model.
-      </p>
-<source>HelpFormatter hf = new HelpFormatter();
-hf.setShellCommand("ant");
-hf.setGroup(options);</source>
-      <p>
-        The first section of help will display the full usage string for the 
-        application, the appearence of this line can be adjusted using the 
-        HelpFormatter's fullUsageSettings property:
-      </p>
-<source>hf.getFullUsageSettings().add(DisplaySetting.DISPLAY_GROUP_NAME);
-hf.getFullUsageSettings().add(DisplaySetting.DISPLAY_GROUP_ARGUMENT);
-hf.getFullUsageSettings().remove(DisplaySetting.DISPLAY_GROUP_EXPANDED);</source>
-      <p>
-        The main body of the help is based on a line or more of information 
-        about each option in the model.  DisplaySettings can be used again to 
-        adjust which items are included in this display and which aren't.  In 
-        this case, we don't want to display any groups as the top one is the 
-        only one present and can be inferred:
-      </p>
-<source>hf.getDisplaySettings().remove(DisplaySetting.DISPLAY_GROUP_ARGUMENT);</source>
-      <p>
-        Each of the options identified by the displaySettings above has some 
-        usage information displayed, usually this will be a minimal set of 
-        DisplaySettings but these can be adjusted to get the desired effect:
-      </p>
-<source>hf.getLineUsageSettings().add(DisplaySetting.DISPLAY_PROPERTY_OPTION);
-hf.getLineUsageSettings().add(DisplaySetting.DISPLAY_PARENT_ARGUMENT);
-hf.getLineUsageSettings().add(DisplaySetting.DISPLAY_ARGUMENT_BRACKETED);</source>
-      <p>
-        Finally, the help can be printed to System.out with a simple call to 
-        <code>print()</code>:
-      </p>
-<source>hf.print();</source>
-      </subsection>
-    </section>
-  </body>
-</document>
diff --git a/xdocs/examples/index.xml b/xdocs/examples/index.xml
deleted file mode 100644
index b3865e0..0000000
--- a/xdocs/examples/index.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<document>
-
-  <properties>
-    <author email="dev@commons.apache.org">commons-dev</author>
-    <title>Examples</title>
-  </properties>
-
-  <body>
-    <section name="Overview">
-      <p>
-        The examples section aims to show how a variety of applications and 
-        tools could be modelled using CLI2.  We make no claim that these tools 
-        use CLI2 in their implementation but simply use their interfaces to 
-        demonstrate commonly needed features.  Some examples will make 
-        simplifications to keep the documentation consise.
-      </p>
-      <p>
-        Many aspects of the API are touched upon but few are described in 
-        great detail.  If more information is required then the reader is 
-        encouraged to review the API documentation and look at the unit tests 
-        for inspiration.  Failing that, further advice and discussion can be 
-        found on the <code>user@commons.apache.org</code> mailing list.
-      </p>
-    </section>
-
-    <section name="Examples">
-      <ul>
-        <li><a href="ant.html">ant</a></li>
-      </ul>
-    </section>
-  </body>
-</document>
diff --git a/xdocs/index.xml b/xdocs/index.xml
index 215bc31..da69a04 100644
--- a/xdocs/index.xml
+++ b/xdocs/index.xml
@@ -61,16 +61,12 @@
       </p>
     </section>
 
-    <section name="1.x vs 2.x?">
+    <section name="CLI 2?">
       <p>Commons CLI 1.0 was formed from the merger of ideas and code from three different libraries -
       Werken, Avalon and Optz. In dealing with the bugs and the feature requests a freshly designed and not
-      backwards compatible CLI 2 was created, but never finished or released. Since then bugfix releases
-      have been made for CLI 1.</p>
+      backwards compatible CLI 2 was created in 2004, but never finished or released. </p>
 
-      <p>The current plan is to maintain the 1.x line until CLI 2 is officially released. The 2.x design is generally
-      preferred and is in use, however there is no current activity to make a 2.0 release. To this end, the 1.2
-      release is recommended to most users while the 2.x line is recommended for anyone interested in helping to get
-      this better API released.</p>
+      <p>The current plan is to continue to maintain the 1.x line. The CLI2 work may be found in the Commons Sandbox. </p>
     </section>
 
     <section name="Documentation">
@@ -82,10 +78,10 @@
         The Javadoc API documents are available online:
       </p>
       <ul>
+        <li><a href="apidocs/index.html">CLI 1.3-SNAPSHOT (latest SVN)</a></li>
         <li><a href="api-release/index.html">CLI 1.2 (current release)</a></li>
         <li><a href="api-1.1/index.html">CLI 1.1</a></li>
         <li><a href="api-1.0/index.html">CLI 1.0</a></li>
-        <li><a href="apidocs/index.html">CLI 2.0-SNAPSHOT (latest SVN)</a></li>
       </ul>
       <p>
         The <a href="source-repository.html">Subversion repository</a> can be
@@ -114,78 +110,6 @@
       <p>Issues may be reported via the <a href="issue-tracking.html">ASF JIRA</a>.</p>
     </section>
 
-
-      <!--      <p>
-              CLI1 was formed by the merger of ideas and code from three different
-              libraries and allows most simple interfaces to be modelled.  CLI1
-              became increasingly difficult to maintain and develop further and so
-              CLI2 has been developed with the goals of clearer responsibilities and
-              being more flexible.  The intention is that CLI2 should be able to
-              model a far greater selection of interfaces and do so more completely,
-              validating as much as possible.
-            </p>
-            <p>
-              The redesigned CLI2 is rooted in the <code>org.apache.commons.cli2</code>
-              package and the distribution retains the <code>org.apache.commons.cli</code>
-              package so that the upgrade doesn't break old code.  The CLI1 package
-              should be regarded as deprecated to encourage the transition to the
-              more flexible CLI2 framework but minor bug fixes and patches may be
-              accepted to ensure that CLI1 based applications continue to function as
-              expected.
-            </p>
-            <p>
-              The rest of the documentation is split into the following three sections:
-              <ul>
-                <li><a href="manual/index.html">CLI2</a> - a reference manual for version 2</li>
-                <li><a href="introduction.html">CLI1</a> - documentation for version 1 </li>
-                <li><a href="examples/index.html">Examples</a> - a selection of worked examples demonstrating CLI2 features</li>
-              </ul>
-            </p>
-            <p>
-              The latest version of this documentation is available on the web:
-              <ul>
-                <li><a href="http://commons.apache.org/cli/">http://commons.apache.org/cli/</a></li>
-                <li>
-                  <a href="http://commons.apache.org/cli/commons-cli.pdf">http://commons.apache.org/cli/commons-cli.pdf</a>
-                  <a href="http://commons.apache.org/cli/commons-cli.pdf"><img border="0" src="images/pdf.gif"/></a>
-                </li>
-              </ul>
-            </p>
-          </section>
-          <section name="Dependancies">
-            <p>
-              The generated list of <a href="dependencies.html">dependencies</a>
-              lists the libraries needed to compile and test Commons CLI.  To use
-              the precompiled distribution none of these dependancies are strictly
-              necessary.  The following is a breakdown of what is required and when:
-            </p>
-            <table>
-              <tr>
-                <th>Library</th><th>Usage</th>
-              </tr>
-              <tr>
-                <td>Java 1.2</td>
-                <td>This is the minimum java level needed to use CLI2</td>
-              </tr>
-              <tr>
-                <td>Java 1.4</td>
-                <td>Needed if the PreferencesCommandLine is needed</td>
-              </tr>
-              <tr>
-                <td>commons-lang</td>
-                <td>Needed if the CLI1 package is being used</td>
-              </tr>
-              <tr>
-                <td>jdepend</td>
-                <td>Needed to build and test CLI2 only</td>
-              </tr>
-              <tr>
-                <td>junit</td>
-                <td>Needed to build and test CLI1 and CLI2</td>
-              </tr>
-            </table>
-          </section>
-      -->
   </body>
 
 </document>
diff --git a/xdocs/manual/index.xml b/xdocs/manual/index.xml
deleted file mode 100644
index b9c83f3..0000000
--- a/xdocs/manual/index.xml
+++ /dev/null
@@ -1,190 +0,0 @@
-<?xml version="1.0"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<document>
-    
-    <properties>
-        <author email="dev@commons.apache.org">commons-dev</author>
-        <title>CLI2 - Overview</title>
-    </properties>
-    
-    <body>
-        <section name="Overview">
-            <p> 
-                CLI Breaks down command line processing into three distinct phases, the
-                first of which is to create a model of the command line you wish to process. The
-                second phase is arguably the most important as it involves processing the
-                command line arguments of the application according to the model created.
-                Finally the parsed command line is available to be queried by the
-                application proper.  The phases are discussed in more detail below.
-            </p>
-            <subsection name="Modelling the interface">
-                <p> 
-                    In CLI2 a command line is modelled as a Group composed of many Options.
-                    There are a number different Option implementations available to be
-                    used including DefaultOption, Switch and Command which may all have an
-                    Argument and/or a Group of child options associated with them. An
-                    example of where this parental relationship could be used is where you
-                    need to allow for the following scenario where one option
-                    only makes sense within the context of another:
-                </p>
-                <p><code>myapp --output path/to/file --xml</code></p>
-                <p>
-                    Typically this command line would be modelled as a DefaultOption
-                    (<code>--output</code>) with an Argument (to capture
-                    <code>path/to/file</code>) and a Group of children consisting of a
-                    DefaultOption (<code>--xml</code>) since the format only applies if the 
-                    output is specified
-                </p>
-                <p>
-                    The various Option implementations provided need careful configuration 
-                    and constructors take a complex set of arguments.  To ease the construction 
-                    of these options *Builder classes (e.g. DefaultOptionBuilder, GroupBuilder 
-                    and ArgumentBuilder) have been supplied following the 
-                    <a href="http://c2.com/cgi/wiki?BuilderPattern">Builder Pattern</a> 
-                    which essentially involves using the DefaultOptionBuilder class to create 
-                    instances of DefaultOption using descriptive method calls instead of 
-                    anonymous arguments to a constructor.  The following example demonstrates how 
-                    the command line shown above could be modelled in code:
-                </p>
-                <source>
-DefaultOptionBuilder oBuilder = new DefaultOptionBuilder();
-ArgumentBuilder aBuilder = new ArgumentBuilder();
-GroupBuilder gBuilder = new GroupBuilder();
-
-DefaultOption xmlOption = 
-    oBuilder
-        .withLongName("xml")
-        .withDescription("Output using xml format")
-        .create();
-
-Argument pathArgument = 
-    aBuilder
-        .withName("path")
-        .withMinimum(1)
-        .withMaximum(1)
-        .create();
-
-Group outputChildren = 
-    gBuilder
-        .withOption(xmlOption)
-        .create();
-
-Option outputOption = 
-    oBuilder
-        .withLongName("output")
-        .withDescription("Outputs to a file")
-        .withArgument(pathArgument)
-        .withChildren(outputChildren)
-        .create();
-                </source>
-                <p>
-                    The <a href="options.html">Options</a> and 
-                    <a href="builders.html">Builders</a> sections of the manual discuss these 
-                    features in greater detail.
-                </p>
-                <p>
-                    Once all the options have been composed into a Group modelling the complete 
-                    option model then we are ready to parse a command line.
-                </p>
-            </subsection>
-            <subsection name="Parsing the command line">
-                <p>
-                    The Parser class can be used to parse an array of arguments against the 
-                    option model into a CommandLine.  The parsing is driven by the 
-                    <code>parse(String[])</code> method which delegates to the option model to do 
-                    the actual parsing, with each Option implementation providing its own parsing 
-                    logic.  The <code>parseAndHelp(String[])</code> method attempts to simplify 
-                    the use of the former method by automatically handling any <code>--help</code> 
-                    options and displaying error messages where appropriate.
-                </p>
-                <p>
-                    The HelpFormatter class is designed to allow the option model to be described 
-                    to the user in a manner typical of command line applications.  The 
-                    HelpFormatter is designed with flexibility in mind so it should be possible to 
-                    control exactly which structures are described to the user and what level of 
-                    detail to use.  
-                </p>
-                <p>
-                    Any errors that occur while parsing result in an OptionException being thrown 
-                    which attempt to provide a meaningful message describing the problem to the 
-                    user.  Parser's <code>parseAndHelp(String[])</code> method catches any 
-                    OptionException and uses the HelpFormatter to display to the user:
-                </p>
-                <source>
-// configure the options
-Group options = ...;
-                    
-// configure a HelpFormatter
-HelpFormatter hf = new HelpFormatter();
-
-// configure a parser
-Parser p = new Parser();
-p.setGroup(options);
-p.setHelpFormatter(hf);
-p.setHelpTrigger("--help");
-CommandLine cl = p.parseAndHelp(new String[]{});
-                    
-// abort application if no CommandLine was parsed
-if(cl==null) {
-    System.exit(-1);
-}
-                </source>
-                
-                <p>
-                    Assuming that OptionExceptions have been averted then the next step is to have 
-                    the application query the resulting CommandLine instance.
-                </p>
-            </subsection>
-            <subsection name="Querying the result">
-                <p>
-                    The CommandLine interface provides lots of ways to look up information either 
-                    by Option instance or by a String representing any of the forms valid on the 
-                    command line.  For example if an option is configured with multiple names 
-                    (e.g. <code>-?</code>, <code>-h</code>, <code>--help</code>) then any of the 
-                    those strings can be used to look up the value irrespective of which form 
-                    appeared on the command line.
-                </p>
-                <p>
-                    The <code>hasOption()</code> family of methods can be used to simply test for 
-                    the presence of options, while the <code>getValues()</code> family of methods 
-                    can be used to retrieve the values associated with Arguments.  The status of 
-                    any Switch options can be detected through the use of <code>getSwitch()</code> 
-                    methods which will return a Boolean if set or null otherwise:
-                </p>
-                <source>
-// if we have --output option
-if(cl.hasOption("--output")) {
-    // grab the path
-    String path = (String)cl.getValue("--output");
-    // grab the format
-    boolean xml = cl.hasOption("--xml");
-    // configure the application's output
-    configureOutput(path,xml);
-}
-                </source>
-                <p>
-                    To enable complex CommandLine configurations alternative implementations are 
-                    provided that can wrap a Properties or Preferences instance as a CommandLine.
-                    These can then be combined with the DefaultingCommandLine and the parsed 
-                    CommandLine to provide a variety of different defaulting and overriding 
-                    scenarios.  
-                </p>
-            </subsection>
-        </section>
-    </body>
-</document>
diff --git a/xdocs/manual/options.xml b/xdocs/manual/options.xml
deleted file mode 100644
index f61be97..0000000
--- a/xdocs/manual/options.xml
+++ /dev/null
@@ -1,377 +0,0 @@
-<?xml version="1.0"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<document>
-
-  <properties>
-    <author email="dev@commons.apache.org">commons-dev</author>
-    <title>CLI2 - Options</title>
-  </properties>
-
-  <body>
-    <section name="Options">
-      <subsection name="Option">
-      <p>
-        In CLI2 every element of the command line interface is modelled as an 
-        Option instance, and has the following readonly properties that are 
-        inherited by all other Option implementations:
-      </p>
-      <table>
-        <tr>
-          <th>Property</th><th>Type</th><th>Description</th>
-        </tr>
-        <tr>
-          <td>id</td>
-          <td>int</td>
-          <td>
-            Some people find it useful to give each option a unique identifer 
-            so that they can use the options within a java <code>switch</code>
-            statement.  This value is entirely optional and it is up to the 
-            user to ensure any uniqueness.
-          </td>
-        </tr>
-        <tr>
-          <td>preferredName</td>
-          <td>String</td>
-          <td>
-            Every option has a preferred name that can be used for the minimal 
-            <code>toString()</code> implementation.  Options can usually have 
-            many additional names too.
-          </td>
-        </tr>
-        <tr>
-          <td>required</td>
-          <td>boolean</td>
-          <td>
-            True here indicates that the command line is invalid if this 
-            option doesn't appear on it.
-          </td>
-        </tr>
-      </table>
-      </subsection>
-      
-      <subsection name="Group">
-      <source>-a|-b|-c|-d|-e</source>
-      <p>
-        Groups are possible the least intuitive form of Option since they 
-        actually represent a collection of other options.  Most member Options 
-        can appear on a command line in any order with the exception of 
-        Arguments; they must appear in the given order as there is no other 
-        way to identify one from another.  An additional restriction of the 
-        standard Group implementation is that only the final argument can have 
-        variable size (differing minimum and maximum).
-      </p>
-      <p>
-        Groups inherit all the properties of Options.
-      </p>
-      <table>
-        <tr>
-          <th>Property</th><th>Type</th><th>Description</th>
-        </tr>
-        <tr>
-          <td>minimum</td>
-          <td>int</td>
-          <td>
-            The minimum number of member options that must be present on the 
-            command line for this group to be valid.  Typically this will 
-            either be 0 where the group is optional or 1 to indicate at least 
-            one of them is needed.  This value does not count anonymous 
-            options.
-          </td>
-        </tr>
-        <tr>
-          <td>maximum</td>
-          <td>int</td>
-          <td>
-            The maximum number of options from this Group that can appear in a
-            command line.  This would typically be used if you wanted to 
-            create an exclusive group where a maximum of 1 member is allowed 
-            to appear.  This value does not count anonymous options.
-          </td>
-        </tr>
-      </table>
-      </subsection>
-      
-      <subsection name="Argument">
-      <source>&lt;arg1&gt; [&lt;arg2&gt; ...]</source>
-      <p>
-        Arguments are used to pass in values from the command line, for 
-        example to pass in a list of files to be operated on.  Arguments can 
-        appear in two different situations within an option model, the most 
-        frequently used situation is where the value found should be associated 
-        with a Parent option; in this situation the value is expected to 
-        immediately follow the Parent in the command line.  The second 
-        scenario where Arguments are used is when they are added to a Group 
-        directly rather than being composed with a Parent first.  These 
-        'anonymous' arguments have nothing that identifies them on the 
-        command line other than the order in which they appear.
-      </p>
-      <p>
-        Multiple values may be parsed by a single argument and the minimum 
-        and maximum attributes can used to control their validity, 
-        additionally a Validator may be used to identify whether individual 
-        values are valid.  In some situations it can be useful to parse the 
-        supplied string into multiple values and so the initialSeparator and 
-        subsequentSeparator attributes can be used; assuming an 
-        initialSeparator of '=' and a subsequentSeparator of ',', the 
-        string '--file=a,b,c' would be split into a parent option '--file', 
-        and the values 'a', 'b' and 'c'.
-      </p>
-      <p>
-        Arguments inherit all the properties of Options.
-      </p>
-      <table>
-        <tr>
-          <th>Property</th><th>Type</th><th>Description</th>
-        </tr>
-        <tr>
-          <td>minimum</td>
-          <td>int</td>
-          <td>
-            The minimum number of values that must be present for the 
-            Argument to be valid.  The default of 0 implies that the argument 
-            is optional.
-          </td>
-        </tr>
-        <tr>
-          <td>maximum</td>
-          <td>int</td>
-          <td>
-            The maximum number of values that can appear in a valid command 
-            line.  A value less than minimum is not allowed.
-          </td>
-        </tr>
-        <tr>
-          <td>consumeRemaining</td>
-          <td>String</td>
-          <td>
-            A string that can be used to avoid parsing of the remaining 
-            values as options.  Typically '--' is used and allows file names 
-            to be used as values even though they look like options.
-          </td>
-        </tr>
-        <tr>
-          <td>initialSeparator</td>
-          <td>char</td>
-          <td>
-          	A character used to indicate the end of the parent option and the 
-          	beginning of the values.
-          </td>
-        </tr>
-        <tr>
-          <td>subsequentSeparator</td>
-          <td>char</td>
-          <td>
-          	A character used to indicate the boundry between two values in a 
-          	single string.
-          </td>
-        </tr>
-        <tr>
-          <td>defaultValue</td>
-          <td>Object</td>
-          <td>
-          	A value to be used when no other is supplied.
-          </td>
-        </tr>
-      </table>
-      </subsection>
-      
-      <subsection name="Parent">
-      <source>--parent &lt;arg&gt; --child1|--child2</source>
-      <p>
-        Parent options allow an argument to be tied to some othe option, 
-        additionally a group of child options can also be added to the parent.
-        The argument and child options are only valid in the presence of the 
-        parent option, must appear on the command line with the child options 
-        following the argument.
-      </p>
-      <p>
-        Parents are not usable in themselves but DefaultOption, Switch and 
-        Command all inherit the parent features.  Parents inherit the 
-        properties of Options.
-      </p>
-      <table>
-        <tr>
-          <th>Property</th><th>Type</th><th>Description</th>
-        </tr>
-        <tr>
-          <td>argument</td>
-          <td>Argument</td>
-          <td>
-            The Argument to delegate value processing to.  This property is 
-            optional.
-          </td>
-        </tr>
-        <tr>
-          <td>children</td>
-          <td>Group</td>
-          <td>
-            The Group to delegate child processing to.  This property is 
-            optional.
-          </td>
-        </tr>
-      </table>
-      </subsection>
-      
-      
-      
-      <subsection name="DefaultOption">
-      <source>--file (-f)</source>
-      <p>
-        The default option allows an option to exist with both long and short 
-        aliases.  Ordinarily the short aliases would be a single character 
-        long and allow a series of options <code>-x -v -f</code> to be 
-        concatenated into a single element <code>-xvf</code> on the command 
-        line.  This bursting of concatenated options can be turned off if 
-        necessary and the single character restriction can be ignored where 
-        bursting is not required.
-      </p>
-      <p>
-        DefaultOptions inherit all the properties of Options and Parents.
-      </p>
-      <table>
-        <tr>
-          <th>Property</th><th>Type</th><th>Description</th>
-        </tr>
-        <tr>
-          <td>shortName</td>
-          <td>String</td>
-          <td>
-            The short name of the option.  At least one short or long name is 
-            required.
-          </td>
-        </tr>
-        <tr>
-          <td>longName</td>
-          <td>String</td>
-          <td>
-            The long name of the option.  At least one short or long name is 
-            required.
-          </td>
-        </tr>
-        <tr>
-          <td>burstEnabled</td>
-          <td>boolean</td>
-          <td>
-            Whether to allow this option to be concatenated with others.
-          </td>
-        </tr>
-      </table>
-      </subsection>
-      
-      
-      <subsection name="Command">
-      <source>update (up,upd)</source>
-      <p>
-        Commands are basically an option without an identifying prefix and 
-        are usually found in applications that implement a suite of tools 
-        within a single application.  Any of a number of aliases can appear 
-        on the command line with idenentical meaning.
-      </p>
-      <p>
-        Commands inherit all the properties of Options and Parents.
-      </p>
-      </subsection>
-      
-      <subsection name="Switch">
-      <source>+display|-display</source>
-      <p>
-        Switches allow the user to turn a feature on or off.  This becomes 
-        useful when the value would otherwise be taken from a different 
-        source and could change, for example the default value could be 
-        configurable by the user.  A default switch value can be supplied in 
-        case no other source exists and the application writer has a 
-        preference.
-      </p>
-      <p>
-        Switches inherit all the properties of Options and Parents.
-      </p>
-      <table>
-        <tr>
-          <th>Property</th><th>Type</th><th>Description</th>
-        </tr>
-        <tr>
-          <td>defaultSwitch</td>
-          <td>Boolean</td>
-          <td>
-            The value to be used if the option has not been configured.  If 
-            not set the value <code>null</code> is used.
-          </td>
-        </tr>
-      </table>
-      </subsection>
-      
-      <subsection name="PropertyOption">
-      <source>-Dproperty=value</source>
-      <p>
-        Property options allow arbitrary name value pairs to be passed in by 
-        the user.  This style of option is often used to emulate the java 
-        <code>-D</code> option.
-      </p>
-      <p>
-        PropertyOptions inherit the properties of Options.
-      </p>
-      <table>
-        <tr>
-          <th>Property</th><th>Type</th><th>Description</th>
-        </tr>
-        <tr>
-          <td>optionString</td>
-          <td>String</td>
-          <td>
-            The prefix for this option, defaults to <code>-D</code>.
-          </td>
-        </tr>
-      </table>
-      </subsection>
-      
-      <subsection name="SourceDestArgument">
-      
-      
-      
-      <source>&lt;src1&gt; [&lt;src2&gt; ...] &lt;dest&gt;</source>
-      <p>
-        Groups have the restriction that only the final argument can have 
-        variable size.  Using the SourceDestArgument this rule can appear 
-        to be relaxed by shifting the variable size argument to an earlier 
-        position.  A SourceDestArgument is implemented by composing two other 
-        options together.  This option would typically be used when modelling 
-        commands like the unix cp command, 
-      </p>
-      <table>
-        <tr>
-          <th>Property</th><th>Type</th><th>Description</th>
-        </tr>
-        <tr>
-          <td>source</td>
-          <td>Argument</td>
-          <td>
-            The variable size first argument.
-          </td>
-        </tr>
-        <tr>
-          <td>dest</td>
-          <td>Argument</td>
-          <td>
-            The fixed size last argument.
-          </td>
-        </tr>
-      </table>
-      </subsection>
-    </section>
-  </body>
-</document>
diff --git a/xdocs/manual/validators.xml b/xdocs/manual/validators.xml
deleted file mode 100644
index b6e76f9..0000000
--- a/xdocs/manual/validators.xml
+++ /dev/null
@@ -1,202 +0,0 @@
-<?xml version="1.0"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<document>
-
-  <properties>
-    <author email="dev@commons.apache.org">commons-dev</author>
-    <title>CLI2 - Validators</title>
-  </properties>
-
-  <body>
-    <section name="Validators">
-      <p>
-        CLI2 provides a mechanism to validate argument values.  The <code>Validator</code>
-        interface must be implemented to create an argument validator.  This interface has
-        a single method <code>validate(java.util.List values) throws InvalidArgumentException</code>.
-      </p>
-      <p>
-        CLI2 has some standard validators included.  They validate the following:
-      </p>
-      <ul>
-        <li>Java class</li>
-        <li>date</li>
-        <li>enumeration</li>
-        <li>file path</li>
-        <li>number</li>
-        <li>URL</li>
-      </ul>
-      
-      <subsection name="ClassValidator">
-        <p>
-          The <code>ClassValidator</code> validates a value using three criteria:
-        </p>
-        <ol>
-          <li>the value adheres to the Java Language Specification rules</li>
-          <li>the class specified by the name is loadable</li>
-          <li>the class specified by the name can be instantiated</li>
-        </ol>
-        <source>// 1.
-ClassValidator validator = new ClassValidator();
-// 2.
-validator.setLoadable(true);
-// 3.
-validator.setLoadable(true);</source>
-        <p>
-        TODO: add section about values being replaced with class instances
-        </p>
-      </subsection>
-      
-      <subsection name="DateValidator">
-        <p>
-          The <code>DateValidator</code> validates values against a 
-          <code>java.text.DateFormat</code>.  There are three helper methods
-          that create built-in validators.
-        </p>
-        <ol>
-          <li><code>getDateInstance</code> returns a validator for the default
-          date format for the default locale.
-          </li>
-          <li><code>getTimeInstance</code> returns a validator for the default
-          time format for the default locale.
-          </li>
-          <li><code>getDateTimeInstance</code> returns a validator for the default
-          date and time format for the default locale.
-          </li>
-        </ol>
-        <p>
-          A <code>DateValidator</code> can also be created by passing your
-          a custom <code>DateFormat</code> into the constructor.
-        </p>
-        <source>DateFormat myFormat = DateFormat.getDateInstance( DateFormat.LONG, Locale.UK );
-DateValidator myValidator = new DateValidator( myFormat );</source>
-        <p>
-          In addition to basic format checking you can also check if the date/time specified
-          is before/after a specific date/time.  The lower bound is set using the 
-          <code>setMinimum( java.util.Date )</code>, and the upper bound is set using
-          the <code>setMaximum( java.util.Date )</code>.
-        </p>
-        <p>
-        TODO: add section about values being replaced with date instances
-        </p>
-      </subsection>
-      
-      <subsection name="EnumValidator">
-        <p>
-          The <code>EnumValidator</code> validates values against a list of
-          allowed string values.  The values that are allowed are specified in
-          a <code>java.util.Set</code> and passed in to the constructor.
-        </p>
-        <source>Set enumSet = new TreeSet();
-enumSet.add("red");
-enumSet.add("green");
-enumSet.add("blue");
-       
-EnumValidator validator = new EnumValidator( enumSet );</source>
-      </subsection>
-      
-      <subsection name="FileValidator">
-        <p>
-          The <code>FileValidator</code> validates that values represent
-          existing files.  You can also specify a combination of the 
-          following additional criteria:
-        </p>
-        <ol>
-          <li>value is a file</li>
-          <li>value is a directory</li>
-          <li>the file is writable</li>
-          <li>the file is readable</li>
-          <li>the file is hidden</li>
-        </ol>
-        <p>
-          Each of the criteria listed here are specified using the appropriate
-          setter.
-        </p>
-        <p>
-          There are three helper methods to create validators:
-        </p>
-        <ol>
-          <li><code>getExistingInstance</code> returns a validator that ensures
-          a value represents an existing file.
-          </li>
-          <li><code>getExistingFileInstance</code> returns a validator that ensures
-          a value represents an existing file that is not a directory.
-          </li>
-          <li><code>getExistingDirectoryInstance</code> returns a validator that ensures
-          a value represents an existing file this is a directory.
-          </li>
-        </ol>
-        <source>// validate that the value represents a file that exists
-FileValidator validator = FileValidator.getExistingInstance();
-
-// ensure it's not a hidden file
-validator.setHidden( false );
-
-// ensure it's a writable file
-validator.setWritable( true );</source>
-        
-      </subsection>
-      
-      <subsection name="NumberValidator">
-        <p>
-          The <code>NumberValidator</code> validates that values adhere to 
-          certain rules like the following:
-        </p>
-        <ol>
-          <li><code>getCurrencyInstance</code> returns a validator for the default
-          currency format for the default locale.
-          </li>
-          <li><code>getPercentInstance</code> returns a validator for the default
-          percent format for the default locale.
-          </li>
-          <li><code>getIntegerInstance</code> returns a validator for the default
-          integer format for the default locale.
-          </li>
-          <li><code>getNumberInstance</code> returns a validator for the default
-          number format for the default locale.
-          </li>
-        </ol>
-        <p>
-          A <code>NumberValidator</code> can also be created by passing your
-          a custom <code>NumberFormat</code> into the constructor.
-        </p>
-        <source>NumberFormat myFormat = NumberFormat.getCurrencyInstance( Locale.UK );
-NumberValidator myValidator = new NumberValidator( myFormat );</source>
-        <p>
-          In addition to basic format checking you can also check if the number specified
-          is less than or greater than a specific number.  The lower bound is set using 
-          the <code>setMinimum( Number )</code>, and the upper bound is set using
-          the <code>setMaximum( Number )</code>.
-        </p>
-      </subsection>
-      
-      <subsection name="UrlValidator">
-        <p>
-          A <code>UrlValidator</code> validates that values are URLs and if you
-          choose it will also validate the protocol is of the type you have
-          specified.
-        </p>
-        <source>UrlValidator validator = new UrlValidator();
-
-// only accept https URLs
-validator.setProtocol("https");</source>
-        
-      </subsection>
-
-    </section>
-  </body>
-</document>
