This commit was manufactured by cvs2svn to create tag 'ANT_141'.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/tags/ANT_141@269774 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/README b/README
index 4420f2d..4cd339e 100644
--- a/README
+++ b/README
@@ -53,8 +53,8 @@
   -------------
 
   Documentation is available in HTML format, in the docs/ directory.
-  For building see docs/index.html#buildingant.
-  For installing see docs/index.html#installing.
+  For building see docs/manual/install.html#buildingant.
+  For installing see docs/manual/install.html#installing.
 
 
   Licensing
diff --git a/WHATSNEW b/WHATSNEW
index 6d26cce..8a129d1 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -1,8 +1,55 @@
-Changes from Ant 1.3 to CVS Version
+Changes from Ant 1.4 to Ant 1.4.1
+===========================================
+
+Fixed bugs:
+-----------
+
+* <ant>'s antfile attribute will now also be considered an absolute path on
+  Windows systems, if it starts with a \ and no drive specifier.
+ 
+* The fullpath attribute of <zipfileset> has been ignored if you used
+  the src attribute at the same time.
+
+* The manifest file is now always placed as the second entry (after /META-INF)
+  in generated jars. This allows the manifest to be read by JarInputStreams
+  
+* Fixed bug in depend task which would fail with a NullPointerException if no
+  dependency cache was specified.
+  
+* sql task now handles REM statements correctly so that lines starying with rem
+  but which are not comments are actually processed.
+  
+* XMLLogger now uses the task's name rather than the classname
+  
+* <mapper>s will now work as expected if the to pattern expands to an
+  absolute pathname.
+
+* <javac> didn't ignore memory settings in non-fork mode
+
+* <cab> didn't split the options attribute into several command line
+  arguments correctly.
+
+Other changes:
+--------------
+
+* New source attribute for <javac> to enable assertion in JDK 1.4
+
+* XmlLogger and <antstructure> now add an encoding declaration to the
+  XML files they generate.
+
+* <fileset> has a new attribute "casesensitive" to make it match
+  filenames in a case insensitive way (if you set it to false) - by
+  default filesets remain case sensitive.
+
+Changes from Ant 1.3 to Ant 1.4
 ===========================================
 
 Changes that could break older environments:
 --------------------------------------------
+* JUnitReport now uses the xalan redirect extension for multi-output.
+  With Xalan 1.2.2 it forces the use of bsf.jar in the classpath.
+  (Available in the xalan distribution). It is recommended to switch
+  to Xalan 2.x that do not need it.
 
 * Zip.setWhenempty() has changed its signature.
 
@@ -19,7 +66,7 @@
   encoding attribute of the task and set it to UTF8 to get the old
   behavior.
 
-* The <pvcs> task has been move to a package of its own.
+* The <pvcs> task has been moved to a package of its own.
 
 * JUnitResultFormater has two additional methods that must be
   implemented by custom formatters.
@@ -59,12 +106,40 @@
   been configured from the build file. Custom tasks supporting nested elements 
   starting with the name configured will no longer function.  
 
+* The environment variable JAVACMD that can be used to specify the
+  java executable to Ant's wrapper scripts must not contain additional
+  command line parameters any longer - please use the environment
+  variable ANT_OPTS for such parameters now.
+  
+* Ant's wrapper scripts now quote the CLASSPATH environment variable, thus
+  supporting classpaths which refer to directories containing spaces. This means
+  that the CLASSPATH environment variable cannot have quotes. Any quotes should
+  be removed. This will not affect the operation of the CLASSPATH environment
+  variable in other contexts.
+
+* A delete task like
+  <delete includeEmptyFilesets="true">
+    <fileset dir="somedir" />
+  </delete>
+  will now remove "somedir" as well, unless there are still files left
+  in it (matched by the default excludes).
+  
+* The copy task will now fail if the file to be copied is not found. 
+
+* Ant properties defined in properties files now behave the same way as 
+  properties defined in the build file. In particular the $ character needs
+  to be escaped in property values by doubling it to $$. So, to define a 
+  property with the value $hello, you need to define it in a properties file
+  as
+    test.prop=$$hello
+  This was not the case in Ant 1.3
+
 Other changes:
 --------------
 
 * New tasks: ear, p4counter, record, cvspass, vsscheckin, vsscheckout,
   typedef, sleep, mimemail, set of tasks for Continuus/Synergy, dependset,
-  condition
+  condition, maudit, mmetrics, jpcoverage, jpcovreport, jpcovmerge
 
 * Ant now uses JAXP 1.1
 
@@ -111,7 +186,7 @@
     beans
   * <dtd> elements can now be URLs
   * Allow the manifest to be specified for the generated jars
-  * The weblogic element now supprts an attribte noEJBC to skip the processing
+  * The weblogic element now supprts an attribute noEJBC to skip the processing
     of the jar by ejbc. The ejbc step will then occur at deployment
   * weblogic will tell ejbc to use Jikes compiler if build.compiler is set to 
     jikes. It can be restored to the default, javac, operation if desired.  
@@ -127,7 +202,7 @@
 
 * Data types like <path> can now be defined inside of <target>s
 
-* you can now specify a classpath for <style> - the XSLZ processor
+* you can now specify a classpath for <style> - the XSLT processor
   will be loaded from this path
 
 * added a force attribute to <style> to support dependencies that the
@@ -136,7 +211,7 @@
 
 * added vmlauncher attribute to exec tasks. This defaults to true. If
   it is set to false, the VM's ability to launch commands in bypassed
-  and the OS shell, either directly or through the auxillary antRun 
+  and the OS shell, either directly or through the auxiliary antRun 
   scripts is used. 
 
 * regexp mapper now supports the java.util.regex package of JDK 1.4.
@@ -172,7 +247,7 @@
   In addition extJavac or the new fork attribute can be
   used to run the JDK's javac in a JVM separate from Ant.
 
-* <fixrlf> can now with CR only line-ends and can use an arbitraty
+* <fixrlf> can now with CR only line-ends and can use an arbitrary
   between 2 and 80.
 
 * The .NET tasks have been adapted to the beta2 release of the framework.
@@ -214,6 +289,12 @@
 * Introduced the concept of <filtersets> to allow for more control in which 
   filters get applied in a <copy> or <move> operation.       
 
+* Added nowarn attribute to javac and deprecated the Jikes-magic property
+  build.compiler.warnings.
+  
+* The <depend> task cache format has changed and all dependency information is
+  now stored in a single file.
+
 Fixed bugs:
 -----------
 
@@ -291,7 +372,7 @@
 
 * <move> removed files you tried to move to themselves.
 
-* <sql> task will not trty to print the result set unless the query succeeded.
+* <sql> task will not try to print the result set unless the query succeeded.
 
 * Ant classloader will now ignore paths which are invalid relative to the
   project base
diff --git a/bootstrap.bat b/bootstrap.bat
index 787af61..4629190 100755
--- a/bootstrap.bat
+++ b/bootstrap.bat
@@ -4,7 +4,7 @@
 
 set OLDJAVA=%JAVA%
 set OLDJAVAC=%JAVAC%
-set OLDCLASSPATH=%CLASSPATH%
+set BOOTOLDCLASSPATH=%CLASSPATH%
 set OLDANTHOME=%ANT_HOME%
 
 set ANT_HOME=.
@@ -23,8 +23,8 @@
 if     "%OS%" == "Windows_NT" if exist build\classes\nul rmdir/s/q build\classes
 if not "%OS%" == "Windows_NT" if exist build\classes\nul deltree/y build\classes
 
-SET LOCALCLASSPATH=lib\crimson.jar;lib\jaxp.jar;lib\optional\junit.jar
-
+SET LOCALCLASSPATH=lib\crimson.jar;lib\jaxp.jar;
+for %%i in (lib\optional\*.jar) do call src\script\lcp.bat %%i
 if exist "%JAVA_HOME%\lib\tools.jar" call src\script\lcp.bat %JAVA_HOME%\lib\tools.jar
 if exist "%JAVA_HOME%\lib\classes.zip" call src\script\lcp.bat %JAVA_HOME%\lib\classes.zip
 
@@ -74,11 +74,11 @@
 
 set JAVA=%OLDJAVA%
 set JAVAC=%OLDJAVAC%
-set CLASSPATH=%OLDCLASSPATH%
+set CLASSPATH=%BOOTOLDCLASSPATH%
 set ANT_HOME=%OLDANTHOME%
 set OLDJAVA=
 set OLDJAVAC=
-set OLDCLASSPATH=
+set BOOTOLDCLASSPATH=
 set LOCALCLASSPATH=
 set OLDANTHOME=
 set TOOLS=
diff --git a/build.bat b/build.bat
index c3c315c..cd8d985 100755
--- a/build.bat
+++ b/build.bat
@@ -11,8 +11,8 @@
 
 :runAnt
 set LOCALCLASSPATH=lib\crimson.jar;lib\jaxp.jar;bootstrap\lib\ant.jar
-for %%i in (lib\optional\*.jar) do call bootstrap\bin\lcp.bat "%%i"
-set CLASSPATH=%LOCALCLASSPATH%;%CLASSPATH%
+for %%i in (lib\optional\*.jar) do call bootstrap\bin\lcp.bat %%i
+set CLASSPATH=lib\optional\xalanj1compat.jar;%LOCALCLASSPATH%;%CLASSPATH%
 set LOCALCLASSPATH=
 
 if not "%REAL_ANT_HOME%" == "" goto install_ant
diff --git a/build.xml b/build.xml
index e83367d..eddb77a 100644
--- a/build.xml
+++ b/build.xml
@@ -14,9 +14,9 @@
 
   <property name="Name" value="Ant"/>
   <property name="name" value="ant"/>
-  <property name="version" value="1.4alpha"/>
+  <property name="version" value="1.4.1"/>
 
-  <property name="debug" value="false" />
+  <property name="debug" value="true" />
   <property name="deprecation" value="false" />
   <property name="optimize" value="true" />
   <property name="junit.fork" value="false" />
@@ -58,6 +58,12 @@
   <path id="tests-classpath">
     <pathelement location="${build.classes}" />
     <pathelement location="${build.tests}" />
+    <!--
+        include the test source and test data dirs
+        so that we can pick resources via getResource(AsStream)
+     -->
+    <pathelement location="${tests.dir}"/>
+    <pathelement location="${tests.etc.dir}"/>
     <path refid="classpath" />
   </path>
 
@@ -100,6 +106,9 @@
     <available property="xalan.present" 
                classname="org.apache.xalan.xslt.XSLTProcessorFactory" 
                classpathref="classpath" />
+    <available property="xalan2.present" 
+               classname="org.apache.xalan.transformer.TransformerImpl" 
+               classpathref="classpath" />
     <available property="ejb.ejbc.present" 
                classname="weblogic.ejbc" 
                classpathref="classpath" />
@@ -145,6 +154,13 @@
     <available property="log4j.present"
                classname="org.apache.log4j.Category"
                classpathref="classpath"/>
+    <!-- this is just a way to check for a TraX implementation -->
+    <available property="trax.impl.present"
+               resource="META-INF/services/javax.xml.transform.TransformerFactory"
+               classpathref="classpath"/>
+    <available property="xalan.envcheck"
+               classname="org.apache.xalan.xslt.EnvironmentCheck"
+               classpathref="classpath" />
                
     <condition property="javamail.complete">
       <and>
@@ -165,6 +181,11 @@
     <tstamp>
       <format property="year" pattern="yyyy" />
     </tstamp>
+    <filterset id="ant.filters">
+      <filter token="VERSION" value="${version}" />
+      <filter token="DATE" value="${TODAY}" />
+      <filter token="TIME" value="${TSTAMP}" />
+    </filterset>
   </target>
 
   <!-- 
@@ -241,12 +262,7 @@
         <include name="**/version.txt" />
         <include name="**/defaultManifest.mf" />
       </fileset>
-      <filterset>
-        <filter token="VERSION" value="${version}" />
-        <filter token="DATE" value="${TODAY}" />
-        <filter token="TIME" value="${TSTAMP}" />
-      </filterset>
-      
+      <filterset refid="ant.filters"/>
     </copy>
 
     <copy todir="${build.classes}/${optional.package}/junit/xsl">
@@ -354,9 +370,17 @@
 
     <copy todir="${dist.lib}" file="${lib.dir}/optional/README"/>
     
-    <copy todir="${dist.docs}"
-          filtering="on">
-      <fileset dir="${docs.dir}"/>
+    <copy todir="${dist.docs}">
+      <fileset dir="${docs.dir}">
+        <exclude name="**/images/**"/>
+      </fileset>
+      <filterset refid="ant.filters"/>
+    </copy>
+
+    <copy todir="${dist.docs}" filtering="false">
+      <fileset dir="${docs.dir}">
+        <include name="**/images/**"/>
+      </fileset>
     </copy>
 
     <copy todir="${dist.dir}">
@@ -468,6 +492,7 @@
   -->
   <target name="distribution" 
           description="--> creates a binary distribution">
+    <delete dir="${dist.base}"/>
     <mkdir dir="${dist.base}"/>
 
     <antcall inheritAll="false" target="internal_dist">
@@ -622,10 +647,14 @@
                unless="jdk1.4+" />
       <exclude name="org/apache/tools/ant/taskdefs/optional/sitraka/*.java"
       				 unless="jakarta.oro.present" />
+      <exclude name="org/apache/tools/ant/taskdefs/optional/XslpLiaisonTest.java" 
+               unless="xslp.present"/>
+      <exclude name="org/apache/tools/ant/taskdefs/optional/XalanLiaisonTest.java" 
+               unless="xalan.present"/>
     </javac>
   </target>
 
-  <target name="dump-info">
+  <target name="dump-info" depends="xml-check">
     <echo message="java.vm.info=${java.vm.info}" />
     <echo message="java.vm.name=${java.vm.name}" />
     <echo message="java.vm.vendor=${java.vm.vendor}" />
@@ -636,6 +665,11 @@
     <echo message="file.encoding=${file.encoding}" />
     <echo message="user.language=${user.language}" />
   </target>
+  
+  <!-- helper class from Xalan2 to check for jar versioning of xml/xsl processors -->
+  <target name="xml-check" depends="check_for_optional_packages" if="xalan.envcheck">
+      <java classname="org.apache.xalan.xslt.EnvironmentCheck"/>
+  </target>
 
   <!-- 
        =================================================================== 
@@ -687,6 +721,14 @@
            <!-- run when you have the environment setup to support them -->
           <exclude name="org/apache/tools/ant/taskdefs/optional/net/FtpTest.java" />
 
+          <!-- it's an abstract class, not a test -->
+          <exclude name="org/apache/tools/ant/taskdefs/optional/AbstractXSLTLiaisonTest.java" />
+          <exclude name="org/apache/tools/ant/taskdefs/optional/XslpLiaisonTest.java" unless="xslp.present"/>
+          <exclude name="org/apache/tools/ant/taskdefs/optional/XalanLiaisonTest.java" unless="xalan.present"/>
+          
+          <!-- ehm, this is not really a TraX test but rather a xalan2 test..-->
+          <exclude name="org/apache/tools/ant/taskdefs/optional/TraXLiaisonTest.java" unless="xalan2.present"/>
+
         </fileset>
       </batchtest>
 
@@ -700,6 +742,9 @@
     <delete dir="${tests.etc.dir}/taskdefs.tmp" />
     <delete file="${tests.etc.dir}/taskdefs/tmp.jar" />
     <delete dir="${tests.etc.dir}/types/copytest" />
+    <!-- generated by testcases in jvm dir -->
+    <delete file="${user.dir}/xalan1-redirect-out.tmp" />
+    <delete file="${user.dir}/xalan2-redirect-out.tmp" />
   </target>
 
   <target name="run-single-test" if="testcase" depends="compile-tests">
diff --git a/docs/ant_in_anger.html b/docs/ant_in_anger.html
index da6bef7..edb6d7e 100644
--- a/docs/ant_in_anger.html
+++ b/docs/ant_in_anger.html
@@ -12,7 +12,7 @@
 </h2>
 
 <h4  align="center">
-Steve Loughran (<a href="mailto:steve_l@iseran.com">steve_l@iseran.com</a>)
+Steve Loughran
 </h4>
 
 <a name="introduction">
@@ -38,7 +38,7 @@
 Firstly, here are some assumptions about the projects which this
 document covers
 <ul>
-<li> Pretty much pure Java.
+<li> Pretty much pure Java, maybe with some legacy cruft on the edges.
 
 <li> Team efforts, usually with the petulant prima-donnas all us Java
 programmers become once we realise how much in demand we are.
@@ -52,7 +52,7 @@
 
 <li> Significant mismatch between expectations and time available to
 deliver. 'Last Week' is the ideal delivery date handed down from above,
-next century the date coming up from below.
+late next century the date coming up from below.
 
 <li> Everyone is struggling to keep up with platform and tool evolution.
 
@@ -107,8 +107,8 @@
 With standard target names, it is easy to build encompassing ant build
 files which just hand off the work to the classes below using the
 <a href="manual/CoreTasks/ant.html">ant</a>
-task. For example. the clean target could be handed down to the intf and
-impl subdirectories from a parent directory
+task. For example. the clean target could be handed down to the <tt>intf</tt> and
+<tt>impl</tt> subdirectories from a parent directory
 
 <pre>&lt;target name=&quot;clean&quot;  depends=&quot;clean-intf, clean-impl&quot;&gt;
 &lt;/target&gt;
@@ -121,6 +121,11 @@
 	&lt;ant dir=&quot;impl&quot; target=&quot;clean&quot; /&gt;
 &lt;/target&gt;  </pre>
 
+If you give targets a <tt>description</tt> tag, then calling <tt>ant
+-projecthelp</tt> will list all tasks with their description as 'main targets', and 
+all tasks without a description as subtargets. Describing all your
+entry points is therefore very useful, even before a project becomes big and complicated.
+  
 <h3>
 	Extend ant through new tasks
 </h3>
@@ -178,7 +183,13 @@
 can not run as JUnit tasks- then the <a href= "manual/CoreTasks/java.html">java</a>
 task can be used to invoke them. It is best to specify that you want a
 new JVM for these tests, so that a significant crash does not break the
-full build.
+full build. The Junit extensions such as 
+<a href="http://httpunit.sourceforge.net/">HttpUnit</a> for web pages, and 
+<a href="http://jakarta.apache.org/cactus/">Cactus</a> for J2EE and servlet 
+testing help to expand the testing framework. To test properly you will still
+need to invest a lot of effort in getting these to work with your project, and 
+deriving great unit, system and regression tests -but your customers will love 
+you for shipping software that works.   
 
 
 <a name="crossplatform">
@@ -199,7 +210,7 @@
 in the location of things.
 
 <h3>Command Line apps: <a href="manual/CoreTasks/exec.html">Exec</a>/ <a href=
-"manual/CoreTasks/execon.html">ExecOn</a></h3>
+"manual/CoreTasks/apply.html">Apply</a></h3>
 
 The trouble with external invocation is that not all functions are found
 cross platform, and those that are often have different names -DOS
@@ -225,7 +236,7 @@
 a path in unix. In Windows the path must use semicolon separators,
 colons being used to specify disk drives, and backslash separators
 <i>"c:\bin\java\lib\xerces.jar;c:\bin\java\lib\ant.jar"</i>.
-
+<p>
 This difference between platforms (indeed, the whole java classpath
 paradigm) can cause hours of fun.
 
@@ -242,8 +253,13 @@
 better to build a classpath by listing individual files (using location=
 attributes), or by including a fileset of *.jar in the classpath
 definition.
-
-
+<p>
+There is also the <a
+href="manual/CoreTasks/pathconvert.html">PathConvert</a> task which
+can put a fully resolved path into a property. Why do that? Because then 
+you can use that path in other ways -such as pass it as a parameter to 
+some application you are calling, or use the replace task to patch it
+into a localised shell script or batch file.
 <p>
 Note that DOS descended file systems are case insensitive (apart from
 the obscure aberration of the WinNT posix subsystem run against NTFS),
@@ -254,7 +270,7 @@
 <p>
 
 Ant's policy on case sensitivity is whatever the underlying file system
-implements *VERIFY*, and its handling of file extensions is that *.jav does not
+implements, and its handling of file extensions is that *.jav does not
 find any .java files. The Java compiler is of course case sensitive -you can
 not have a class 'ExampleThree' implemented in "examplethree.java".
 
@@ -336,8 +352,8 @@
 "manual/CoreTasks/fixcrlf.html">FixCRLF task</a> is often a useful interim step if
 you need to ensure that files have unix file extensions before upload. A
 WebDav task has long been discussed, which would provide a more secure
-upload to web servers, but it is still in the todo list. If DAV is your
-required upload mechanism, why not take up the challenge?
+upload to web servers, but it is still in the todo list. Rumour has it
+that there is such a task in the jakarta-slide libraries.
 
 <p>
 
@@ -351,15 +367,19 @@
 Finally, there are of course the fallbacks of just copying files to a
 destination using <a href="manual/CoreTasks/copy.html">Copy</a> and <a href =
 "index.html#copydir">Copydir</a> , or just sending them to a person or
-process using <a href= "manual/CoreTasks/mail.html">Mail</a>.
-
+process using <a href= "manual/CoreTasks/mail.html">Mail</a> or the attachment
+aware <a href= "manual/OptionalTasks/mimemail.html">MimeMail</a>.
+In one project our team even used ant to build CD images through a build followed
+by a long set of Copy tasks, which worked surprisingly well.
 <a name="directories">
 <h2> Directory Structures</h2>
 </a>
 
 How you structure your directory tree is very dependent upon the
 project. Here are some directory layout patterns which can be used as
-starting points.
+starting points. All the jakarta projects follow a roughly similar
+style, which makes it easy to navigate around one form one project to
+another, and easy to clean up when desired. 
 
 <h3>Simple Project</h3>
 
@@ -401,14 +421,25 @@
 <tr>
 	<td><b>src</b>
 	</td>
-	<td>source goes in under this tree
+	<td>source goes in under this tree <i>in a heirarchy which matches
+	the package names<i>. The dependency compilation of javac requires this.  
 	</td>
 </tr>
 </table>
 
 The bin, lib, doc and src directories should be under source code control.
 Slight variations include an extra tree of content to be included in the
-distribution jars -inf files, images, etc. Javadoc output can be
+distribution jars -inf files, images, etc. These can go under source
+too, with a <tt>metadata</tt> directory for web.xml and similar
+manifests, and a <tt>web</tt> folder for web content -JSP, html, images
+and so on. Keeping the content in this folder (or sub heirarchy)
+together makes it easier to test links before deployment. The actual
+production of a deployment image -such as a war file- can be left to the
+appropriate ant task: there is no need to completely model your source tree 
+upon the deployment heirarchy. 
+<p> 
+
+Javadoc output can be
 directed to a doc/ folder beneath build/, or to doc/javadoc.
 
 <h3>Interface and Implementation split</h3>
@@ -439,6 +470,14 @@
 access/commitment rights. The risk is that by giving extra leeway to the
 sub projects, you can end up with incompatible source, libraries, build
 processes and just increase your workload and integration grief all round.
+<p>
+The only way to retain control over a fairly loosely integrated
+collection of projects is to have a fully automated  build 
+and test process which verifies that everything is still compatible. Sam
+Ruby runs one for all the apache java libraries and emails everyone when
+something breaks; your own project may be able to make use of 
+<A href="http://cruisecontrol.sourceforge.net/">Cruise Control</a> for
+an automated, continuous, background build process. 
 
 <h3>Integrated sub projects</h3>
 
@@ -456,7 +495,7 @@
 progress -but by the time this is realised schedule pressure and
 intertwined build files make executing the split well nigh impossible.
 If that happens then just keep with it until there is the time to
-refactor the project directory structures.
+refactor the project directory structures. 
 
 <a name="antupdate">
 <h2>
@@ -505,7 +544,12 @@
 is certainly better than starting work on your 'text case converter'
 task on Ant 0.8 in isolation, announcing its existence six months latter
 and discovering that instead of adulation all you get are helpful
-pointers to the existing implementation.
+pointers to the existing implementation. The final benefit of being
+involved with the process is that it makes it easier for your tasks to 
+be added with the ant CVS tree, bringing forward the date when ant has
+taken on all the changes you needed to make to get your project to work.
+If that happens you can revert to an official ant release, and get on
+with all the other crises. 
 
 <p>
 
@@ -517,7 +561,62 @@
 don't make everyone on the team subscribe; it can be too much of a
 distraction.
 
+<a name="install">
+<h2>
+Installing with Ant.
+</h2>
+</a>
 
+Because ant can read environment variables, copy, unzip and delete files
+and make java and OS calls, it can be used for simple installation
+tasks. For example, an installer for tomcat could extract the
+environment variable TOMCAT_HOME, stop tomcat running, and copy a war
+file to TOMCAT_HOME/webapps. It could even start tomcat again, but the
+build wouldn't complete until tomcat exited, which is probably not what
+was wanted. 
+
+<p>
+
+The advantage of using ant is firstly that the same install targets
+can be used from your local build files (via an <tt>ant</tt> invocation
+of the install.xml file), and secondly that a basic install target is
+quite easy to write. The disadvantages of this approach are that the
+destination must have an up to date version of ant correctly
+pre-installed, and ant doesn't allow you to handle failures well -and a
+good installer is all about handling when things go wrong, from files
+being in use to jar versions being different. This means that ant is not
+suited for shrink wrapped software, but it does work for deployment and
+installation to your local servers.
+
+<p>
+
+One major build project I was involved in had an ant install build file
+for the bluestone application server, which would shutdown all four
+instances of the app server on a single machine, copy the new version of
+the war file (with datestamp and buildstamp) to an archive directory,
+clean up the current deployed version of the war and then install the
+new version. Because bluestone restarted JVMs on demand, this script was
+all you needed for web service deployment. On the systems behind the
+firewall, we upped the ante in the deployment process by using the ftp
+task to copy out the war and build files, then the telnet task to
+remotely invoke the build file. The result was we had automated
+recompile and redeploy to local servers from inside our IDE (Jedit) or
+the command line, which was simply invalualbe. 
+
+<p>
+
+One extra trick I added later was a junit test case to run through 
+the install check list. With tests to verify access permissions on network
+drives, approximate clock synchronisation between servers, DNS functionality,
+ability to spawn executables and all the other trouble spots
+, the install script could automatically do
+a system health test during install time and report problems. [The same tests
+could also be invoked from a JMX MBean, but that's another story]. 
+<p>
+
+So, ant is not a substitute for a real installer tool, except in the
+special case of servers you control, but in that context it does let
+you integrate remote installation with your build. 
 <a name="tips">
 <h2>
 Tips and Tricks</h2>
@@ -530,7 +629,7 @@
 The <a href="manual/CoreTasks/get.html">get</a> task can fetch any URL, so be used
 to trigger remote server side code during the build process, from remote
 server restarts to sending SMS/pager messages to the developer
-cellphones
+cellphones.
 
 <dt><b>
 i18n
@@ -560,8 +659,16 @@
 </b><dd>
 
 The <a href="http://www.jikes.org/">jikes compiler</a> is usually much
-faster than javac, and does dependency checking. Get it. Then set
+faster than javac, does dependency checking and has better error
+messages (usually). Get it. Then set
 build.compiler to "jikes" for it to be used in your build files.
+Doing this explicitly in your build files is a bit dubious as it requires the
+whole team (and sub projects) to be using jikes too -something you can only
+control in small, closed source projects. But if you set 
+<tt>ANT_OPTS&nbsp;=&nbsp;-Dbuild.compiler=jikes</tt>
+in your environment, then all your builds on your system will use 
+Jikes automatically, while others can choose their own compiler, or let
+ant choose whichever is appropriate for the current version of Java.   
 
 <dt><b>
 #include targets to simplify multi build.xml projects
@@ -584,8 +691,6 @@
 	&lt;!DOCTYPE project [
 	  &lt;!ENTITY IncludeBuildCore SYSTEM &quot;buildCore.xml&quot;&gt;
 	  &lt;!ENTITY IncludeBuildSecondary SYSTEM &quot;buildSecondary.xml&quot;&gt;
-	%IncludeBuildCore;
-	%IncludeBuildSecondary;
 	]&gt;  
 	
 	&lt;target name=&quot;includedBuild&quot;&gt;
@@ -593,12 +698,27 @@
 		&amp;IncludeBuildSecondary;
 	&lt;/target&gt;
 </pre>
-The clean method using XInclude/Xpath will let you include named 
+The cleaner method using XInclude/Xpath will let you include named 
 targets from one build file or another, using
 <a href="http://www.w3.org/XML/Linking"> 
 the xpointer syntax</a>. You'll need to wait for the W3C proposals
 to finalise and the java XML parsers to implement it before
-using xpointer references.  
+using xpointer references.
+<p>
+Before you go overboard with using XML inclusion, note that the <tt>ant</tt> task lets 
+you call any target in any other build file -with all your property settings propagating down to 
+that target. So you can actually have a suite of utility targets -"deploy-to-stack-a", "email-to-team", 
+"cleanup-installation" which can be called from any of your main build files, perhaps with subtly changed
+parameters. Indeed, after a couple of projects you may be able to create a re-usable core build file which
+contains the core targets of a basic java development project -compile, debug, deploy- which project specific
+build files call with their own settings. If you can achive this then
+you are definately making your way up the software maturity ladder. NB,
+<tt>ant</tt> copies all your properties unless the <i>inheritall</i> attribute is set to false. Before that
+attribute existed you had to carefully name all property definitions in all build files to prevent unintentional
+overwriting of the invoked property by that of the caller, now you just have to remember to set
+<tt>inheritall="false"</tt> on all uses of the ant task.   
+
+	
 <dt><b>
 Implement complex Ant builds through XSL
 </b><dd>
@@ -606,7 +726,8 @@
 XSLT can be used to dynamically generate build.xml files from a source
 xml file, with the <a href="manual/CoreTasks/style.html">Style</a> task controlling
 the transform. This is the current recommended strategy for creating
-complex build files dynamically.
+complex build files dynamically. However, its use is still apparently
+quite rare -which means you will be on the bleeding edge of technology.
 
 
 <dt><b>
@@ -654,6 +775,33 @@
 because it eliminates the startup time of the JVM, perhaps even some of
 the XML parsing delays. 
 
+<dt><b>
+Use the replace task to programmatic modify text files in your project.  
+</b><dd>
+Imagine your project has some source files -BAT files, ASP pages (!), anything
+which needs to be statically customised at compile time for particular
+installations, such driven from some properties of the project such as JVM options, or the URL
+to direct errors too. The replace task can be used to modify files, substituting text and creating
+versions customised for that build or destination. Of course, per-destination customisation
+should be delayed until installation, but if you are using ant for the remote installation
+that suddenly becomes feasible.     
+
+<dt><b>
+Use the mailing lists
+</b><dd>
+There are two 
+<a href="http://jakarta.apache.org/site/mail.html">mailing lists</a> 
+related to ant, ant-user and ant-developer. Ant user is where <i>all</i>
+questions related to using ant should go. Installation, syntax, code
+samples, etc -post your questions there or search the archives for 
+whether the query has been posted and answered before. Ant-developer
+is where ant development takes place -so it is <i>not</i> the place to
+post things like "I get a compilation error when I build my project" or
+"how do I make a zip file". If you are actually extending ant, on the other
+hand, it is the ideal place to ask questions about how to add new tasks, make
+changes to existing ones -and to post the results of your work, if you want them
+incorporated into the ant source tree.  
+   
 </dl>
 
 <a name="puttingtogether">
@@ -684,7 +832,8 @@
 <p>
 Debug/release switching can be handled with separate initialisation
 targets called before the compile tasks which define the appropriate
-properties.
+properties. Antcall is the trick here, as it allows you to have two paths
+of property initialisation in a build file.   
 
 <p>
 Internal targets should be used to structure the process
@@ -773,7 +922,7 @@
 
 <h3>It's not meant to be a nice language for humans</h3>
 
-XML isnt a nice representation of information for humans. It's a
+XML isn't a nice representation of information for humans. It's a
 reasonable representation for programs, and text editors and source code
 management systems can all handle it nicely. But a complex ant file can
 get ugly because XML is a bit ugly, and a complex build is, well,
@@ -781,6 +930,43 @@
 still makes sense when you get back to it, and use Antidote to edit the
 files if you prefer it. 
 
+<h3>Big projects still get complicated fast</h3>
+
+Large software projects create their own complexity, with inter-dependent
+libraries, long test cycles, hard deployment processes and a multitude of
+people each working on their own bit of the solution. That's even before
+the deadlines loom close, the integration problems become insurmountable,
+weekends become indistinguishable from weekdays in terms of workload and 
+half the team stops talking to the other half. Ant may simplify the
+build and test process, and can eliminate the full time 'makefile engineer'
+role, but that doesn't mean that someone can stop 'owning the build'. 
+Being in charge of the build has to mean more than they type 'ant all' on
+their system, it means they need to set the standards of what build tools to
+use, what the common targets, what property names and files should be
+and generally oversee the sub projects build processes. On a small project,
+you don't need to do that -but remember: small projects become big projects
+when you aren't looking. If you start off with a little bit of process, then
+you can scale it if needed. Ff you start with none, by the time you need 
+it it will be too late.   
+
+<h3>You still need all the other foundational bits of a software
+project</h3>
+
+If you don't have an source code management system, you are going to end
+up hosed. If you don't have everything under SCM, including web pages,
+dependent jars, installation files, you are still going to end up hosed,
+it's just a question of when it's going to happen.
+CVS is effectively free and works well with ant, but Sourcesafe, Perforce,
+Clearcase and StarTeam also have ant tasks. These tasks
+let you have auto-incrementing build counters, and automated file
+update processes. 
+
+<p>
+
+You also need some kind of change control process, to resist
+uncontrolled feature creep. Bugzilla is a simple and low cost tool for
+this, using ant and a continuous test process enables a rapid evolution of code
+to adapt to those changes which are inevitable.  
 
 <h2>Endpiece</h2>
 
@@ -809,8 +995,22 @@
 	code you will soon have.
 
 </ul>
+
+<a name="author">
+<h3>About the Author</h3>
+</a>
+
+Steve Loughran is a research scientist at a corporate R&amp;D lab,
+currently on a sabbatical building production web services against
+implausible deadlines for the fun of it. Because of those implausible
+deadlines, email questions related to this document are generally, and
+regretfully unwelcome, unless they are corrections to the content,
+advanced discourse on how to evolve software engineering processes to
+meet the next generation of challenges, or from someone he knows. Even
+then, a timely response is unlikely. Please use the mailing lists
+instead. 
+
 <hr>
-<p align="center">Copyright &copy; 2000 Apache Software Foundation. All rights
+<p align="center">Copyright &copy; 2000, 2001 Apache Software Foundation. All rights
 Reserved.</p>
-
-
+</body>
diff --git a/docs/antnews.html b/docs/antnews.html
index 62fc0ec..acf6548 100644
--- a/docs/antnews.html
+++ b/docs/antnews.html
@@ -110,7 +110,7 @@
     <tr><td>
       <blockquote>
                         <p>A commented version of the collected user requirements is now
-      available <a href="/ant/ant2/features.html">here</a> - it is not
+      available <a href="ant2/features.html">here</a> - it is not
       complete as some details still have to be defined, but it should
       give you an idea of what Ant2 is going to look like.</p>
                                 <p>Several details can only be decided in the light of real code
@@ -164,18 +164,18 @@
         To advance the definition of Ant, user requirements are now being accepted on the 
         Ant-Dev mailing list. Any requirement will be accepted for consideration. The 
         requirements are being collected into a document which is available 
-        <a href="/ant/ant2/requested-features.txt">on-line</a>. New features will be excepted 
+        <a href="ant2/requested-features.txt">on-line</a>. New features will be excepted 
         until March 21st, 2001. At that time, each requirement will be discussed 
         for inclusion in an Ant 2.0 requirement document.
       </p>
                                 <p>
         For your reference some of the goals which have shaped the development of Ant 1.x are
-        available <a href="/ant/ant2/original-specification.html">here</a>. These continue to be
+        available <a href="ant2/original-specification.html">here</a>. These continue to be
         relevant to Ant 2.0.
       </p>
                                 <p>
         If you want to shape the future of Ant, join the 
-        <a href="/site/mail.html">Ant-Dev mailing list</a> and contribute
+        <a href="http://jakarta.apache.org/site/mail.html">Ant-Dev mailing list</a> and contribute
         your ideas.
       </p>
                     </blockquote>
@@ -194,7 +194,7 @@
     took the time to test the beta and report bugs and enhancements.
     </p>
                                 <p>You can download the release from 
-        <a href="http://jakarta.apache.org/builds/jakarta-ant/release/v1.3/">here</a>. 
+        <a href="http://www.apache.org/dist/jakarta/jakarta-ant/release/v1.3/">here</a>. 
        Both source and binary releases are available in zip, tarball and RPM formats.
     </p>
                                 <p>Please report all bugs using the 
diff --git a/docs/external.html b/docs/external.html
index c82ffaf..db40538 100644
--- a/docs/external.html
+++ b/docs/external.html
@@ -687,7 +687,7 @@
         <table border="0" cellspacing="0" cellpadding="2" width="100%">
     <tr><td bgcolor="#525D76">
       <font color="#ffffff" face="arial,helvetica,sanserif">
-        <a name="IDE/Editor Integration"><strong>IDE/Editor Integration</strong></a>
+        <a name="IDE and Editor Integration"><strong>IDE and Editor Integration</strong></a>
       </font>
     </td></tr>
     <tr><td>
@@ -695,6 +695,76 @@
                           <table border="0" cellspacing="0" cellpadding="2" width="100%">
     <tr><td bgcolor="#828DA6">
       <font color="#ffffff" face="arial,helvetica,sanserif">
+        <a name="AntFarm"><strong>AntFarm</strong></a>
+      </font>
+    </td></tr>
+    <tr><td>
+      <blockquote>
+                        <p>A plugin that integrates Ant into the jEdit editor.</p>
+                                  <table>
+              <tr>
+                  <td bgcolor="#039acc" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          Compatibility:
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          bundles Ant 1.3
+        </font>
+  </td>
+      </tr>
+                  <tr>
+                  <td bgcolor="#039acc" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          URL:
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          <a href="http://plugins.jedit.org/plugins/AntFarm">http://plugins.jedit.org/plugins/AntFarm</a>
+        </font>
+  </td>
+      </tr>
+                  <tr>
+                  <td bgcolor="#039acc" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          Contact:
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          <a href="mailto:jedit-devel@lists.sourceforge.net">jEdit developers mailinglist</a>
+        </font>
+  </td>
+      </tr>
+                  <tr>
+                  <td bgcolor="#039acc" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          License:
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          Apache Software License
+        </font>
+  </td>
+      </tr>
+        </table>
+                    </blockquote>
+    </td></tr>
+  </table>
+                                  <table border="0" cellspacing="0" cellpadding="2" width="100%">
+    <tr><td bgcolor="#828DA6">
+      <font color="#ffffff" face="arial,helvetica,sanserif">
         <a name="AntRunner"><strong>AntRunner</strong></a>
       </font>
     </td></tr>
diff --git a/docs/faq.html b/docs/faq.html
index 65acf7a..70e7af4 100644
--- a/docs/faq.html
+++ b/docs/faq.html
@@ -512,26 +512,6 @@
                   <td bgcolor="#a0ddf0" colspan="" rowspan="" 
       valign="top" align="left">
     <font color="#000000" size="-1" face="arial,helvetica,sanserif">
-          -nowarn
-        </font>
-  </td>
-                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
-      valign="top" align="left">
-    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
-          build.compiler.warnings
-        </font>
-  </td>
-                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
-      valign="top" align="left">
-    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
-          true == not set
-        </font>
-  </td>
-      </tr>
-                  <tr>
-                  <td bgcolor="#a0ddf0" colspan="" rowspan="" 
-      valign="top" align="left">
-    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
           +P
         </font>
   </td>
@@ -568,6 +548,27 @@
         </font>
   </td>
       </tr>
+                  <tr>
+                  <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          <strong>only for Ant &lt; 1.4, replaced by the nowarn
+                attribute of javac after that</strong> -nowarn
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          build.compiler.warnings
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          true == not set
+        </font>
+  </td>
+      </tr>
         </table>
                         </blockquote>
     </td></tr>
@@ -697,7 +698,7 @@
     </td></tr>
     <tr><td>
       <blockquote>
-                              <p>See the <a href="external.html#IDE%47Editor+Integration">section 
+                              <p>See the <a href="external.html#IDE and Editor Integration">section 
         on IDE integration</a> on our external tools page.</p>
                         </blockquote>
     </td></tr>
diff --git a/docs/index.html b/docs/index.html
index 9f2f8be..aa873c4 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -162,11 +162,11 @@
     You can download the latest release:
     </p>
                                 <ul>
-        <li><a href="http://jakarta.apache.org/builds/jakarta-ant/release/v1.3/bin/">
+        <li><a href="http://www.apache.org/dist/jakarta/jakarta-ant/release/v1.4/bin/">
                 Download the binary release</a></li>
-        <li><a href="http://jakarta.apache.org/builds/jakarta-ant/release/v1.3/src/">
+        <li><a href="http://www.apache.org/dist/jakarta/jakarta-ant/release/v1.4/src/">
                 Download the source release</a></li>
-        <li><a href="http://jakarta.apache.org/builds/jakarta-ant/release/v1.3/rpms/">
+        <li><a href="http://www.apache.org/dist/jakarta/jakarta-ant/release/v1.4/rpms/">
                 Download source and binary RPMs</a></li>
     </ul>
                     </blockquote>
@@ -182,7 +182,7 @@
       <blockquote>
                         <p>
     If you wish to use the latest Ant features, you can try downloading a nightly 
-    build from <a href="http://jakarta.apache.org/builds/jakarta-ant/nightly/">here</a>
+    build from <a href="http://www.apache.org/dist/jakarta/jakarta-ant/nightly/">here</a>
     </p>
                     </blockquote>
     </td></tr>
diff --git a/docs/manual/CoreTasks/antcall.html b/docs/manual/CoreTasks/antcall.html
index 2c4c946..e612a76 100644
--- a/docs/manual/CoreTasks/antcall.html
+++ b/docs/manual/CoreTasks/antcall.html
@@ -24,10 +24,10 @@
 <p>
 When a target is invoked by antcall, all of its dependent targets will
 also be called within the context of any new parameters. For example. if
-the target "doSomethingElse" depended on the target "init", then the <i>antcall</i> of 
-"doSomethingElse" will call "init" during the call. Of course, any properties defined in the
-antcall task or inherited from the calling target will be fixed and not overridable
-in the init task -or indeed in the "doSomethingElse" task.  
+the target &quot;doSomethingElse&quot; depended on the target &quot;init&quot;, then the 
+<i>antcall</i> of &quot;doSomethingElse&quot; will call &quot;init&quot; during the call. 
+Of course, any properties defined in the antcall task or inherited from the calling target 
+will be fixed and not overridable in the init task -or indeed in the &quot;doSomethingElse&quot; task.  
 </p>
 <h3>Parameters</h3>
 <table border="1" cellpadding="2" cellspacing="0">
diff --git a/docs/manual/CoreTasks/apply.html b/docs/manual/CoreTasks/apply.html
index ae64d4e..a7aa77f 100644
--- a/docs/manual/CoreTasks/apply.html
+++ b/docs/manual/CoreTasks/apply.html
@@ -166,7 +166,7 @@
 <blockquote><pre>
 &lt;apply executable=&quot;somecommand&quot; parallel=&quot;false&quot; &gt;
   &lt;arg value=&quot;arg1&quot;/&gt;
-  &lt;srfile/&gt;
+  &lt;srcfile/&gt;
   &lt;arg value=&quot;arg2&quot;/&gt;
   &lt;fileset dir=&quot;/tmp&quot;/&gt;
 &lt;/apply&gt;
diff --git a/docs/manual/CoreTasks/available.html b/docs/manual/CoreTasks/available.html
index 6652f47..8182918 100644
--- a/docs/manual/CoreTasks/available.html
+++ b/docs/manual/CoreTasks/available.html
@@ -52,13 +52,20 @@
     <td align="center" valign="top">No</td>    
   </tr>
   <tr>
+    <td valign="top">filepath</td>
+    <td valign="top">The path to use when looking up <code>file</code>.</td>
+    <td align="center" valign="top">No</td>    
+  </tr>
+  <tr>
     <td valign="top">classpathref</td>
     <td valign="top">The classpath to use, given as a <a href="../using.html#references">reference</a> to a path defined elsewhere.</td>
     <td align="center" valign="top">No</td>    
   </tr>
   <tr>
     <td valign="top">type</td>
-    <td valign="top">The type of <code>file</code> to look for, either a directory (<code>type="dir"</code>) or a file (<code>type="file"</code>). If not set, the property will be set if the name specified in the <code>file</code> attribute exists as either a file or a directory.</td>
+    <td valign="top">The type of <code>file</code> to look for, either a directory (<code>type=&quot;dir&quot;</code>) or a file 
+      (<code>type=&quot;file&quot;</code>). If not set, the property will be set if the name specified in the <code>file</code> 
+      attribute exists as either a file or a directory.</td>
     <td align="center" valign="top">No</td>    
   </tr>
   
@@ -68,6 +75,10 @@
 <p><code>Available</code>'s <code>classpath</code> attribute is a <a
 href="../using.html#path">path-like structure</a> and can also be set via a nested
 <code>&lt;classpath&gt;</code> element.</p>
+<h4>filepath</h4>
+<p><code>Available</code>'s <code>filepath</code> attribute is a <a
+href="../using.html#path">path-like structure</a> and can also be set via a nested
+<code>&lt;filepath&gt;</code> element.</p>
 <h3>Examples</h3>
 <pre>  &lt;available classname=&quot;org.whatever.Myclass&quot; property=&quot;Myclass.present&quot;/&gt;</pre>
 <p>sets the <code>Myclass.present</code> property to the value &quot;true&quot;
diff --git a/docs/manual/CoreTasks/chmod.html b/docs/manual/CoreTasks/chmod.html
index 918cd2d..fefd8f6 100644
--- a/docs/manual/CoreTasks/chmod.html
+++ b/docs/manual/CoreTasks/chmod.html
@@ -44,7 +44,7 @@
   <tr>
     <td valign="top">includes</td>
     <td valign="top">comma separated list of patterns of files that must be
-      included. All files are included when omitted.</td>
+      included.</td>
     <td valign="top" align="center">No</td>
   </tr>
   <tr>
diff --git a/docs/manual/CoreTasks/copy.html b/docs/manual/CoreTasks/copy.html
index 65a2a8d..7c06147 100644
--- a/docs/manual/CoreTasks/copy.html
+++ b/docs/manual/CoreTasks/copy.html
@@ -53,8 +53,9 @@
   </tr>
   <tr>
     <td valign="top">filtering</td>
-    <td valign="top">Indicates whether token filtering should take place during
-      the copy. Defaults to &quot;no&quot;.</td>
+    <td valign="top">Indicates whether token filtering using the global build file
+                     filters should take place during the copy. Defaults to &quot;no&quot;. 
+                     Nested filtersets will be used even if this value is &quot;no&quot;</td>
     <td valign="top" align="center">No</td>
   </tr>
   <tr>
@@ -73,11 +74,22 @@
   </tr>
 </table>
 <h3>Parameters specified as nested elements</h3>
+ 
+<h4>fileset</h4>
+ <p><a href="../CoreTypes/fileset.html">FileSets</a> are used to select files to copy.  
+ To use a fileset, the <var>todir</var> attribute must be set.</p>
+ 
 <h4>mapper</h4>
-<p>You can define file name transformations by using a nested <a
-href="../CoreTypes/mapper.html">mapper</a> element. The default mapper used by
-<code>&lt;copy&gt;</code> is the <a
-href="../CoreTypes/mapper.html#identity-mapper">identity</a>.</p>
+ <p>You can define file name transformations by using a nested <a
+ href="../CoreTypes/mapper.html">mapper</a> element. The default mapper used by
+ <code>&lt;copy&gt;</code> is the <a
+ href="../CoreTypes/mapper.html#identity-mapper">identity</a>.</p>
+ 
+<h4>filterset</h4>
+ <p><a href="../CoreTypes/filterset.html">Filtersets</a> are used to replace tokens in files that are copied.  
+ To use a filterset just add the nested filterset elements.</P>
+ 
+  
 <h3>Examples</h3>
 <p><b>Copy a single file</b></p>
 <pre>
@@ -113,6 +125,19 @@
     &lt;mapper type=&quot;glob&quot; from=&quot;*&quot; to=&quot;*.bak&quot;/&gt;
   &lt;/copy&gt;
 </pre>
+
+
+<p><b>Copy a set of files to a replacing @TITLE@ with Foo Bar in all files.</b></p>
+<pre>
+  &lt;copy todir=&quot;../backup/dir&quot; &gt;
+    &lt;fileset dir=&quot;src_dir&quot; /&gt;
+    &lt;filterset&gt;
+      &lt;filter token=&quot;TITLE&quot; value=&quot;Foo Bar&quot; /&gt;
+    &lt;/filterset&gt;
+  &lt;/copy&gt;
+</pre>
+
+
 <hr><p align="center">Copyright &copy; 2000,2001 Apache Software Foundation. All rights
 Reserved.</p>
 
diff --git a/docs/manual/CoreTasks/delete.html b/docs/manual/CoreTasks/delete.html
index 96de2d7..b8ece05 100644
--- a/docs/manual/CoreTasks/delete.html
+++ b/docs/manual/CoreTasks/delete.html
@@ -112,7 +112,7 @@
     &lt;fileset dir=&quot;build&quot; /&gt;
   &lt;/delete&gt;
 </pre>
-<p>deletes all files and subdirectories of <code>build</code>, but not
+<p>deletes all files and subdirectories of <code>build</code>, including
 <code>build</code> itself.</p>
 <hr><p align="center">Copyright &copy; 2000,2001 Apache Software Foundation. All rights
 Reserved.</p>
diff --git a/docs/manual/CoreTasks/dependset.html b/docs/manual/CoreTasks/dependset.html
index d2088c8..61a78ae 100644
--- a/docs/manual/CoreTasks/dependset.html
+++ b/docs/manual/CoreTasks/dependset.html
@@ -110,12 +110,12 @@
 <p> 
 In this example derived HTML files in the ${output.dir} directory 
 will be removed if any are out-of-date with respect to:
-<olist>
+<ol>
 <li>the DTD of their source XML files</li>
 <li>a common DTD (imported by the main DTD)</li>
 <li>a subordinate XSLT stylesheet (imported by the main stylesheet), or</li>
 <li>the buildfile</li>
-</olist>
+</ol>
 </p>
 <p>
 If any of the source files in the above example does not exist, all
diff --git a/docs/manual/CoreTasks/ear.html b/docs/manual/CoreTasks/ear.html
index d404127..9d8db64 100644
--- a/docs/manual/CoreTasks/ear.html
+++ b/docs/manual/CoreTasks/ear.html
@@ -92,6 +92,12 @@
     <td valign="top" align="center">No</td>
   </tr>
   <tr>
+    <td valign="top">update</td>
+    <td valign="top">indicates whether to update or overwrite
+      the destination file if it already exists.</td>
+    <td valign="top" align="center">No</td>
+  </tr>
+  <tr>
     <td valign="top">whenempty</td>
     <td valign="top">Behavior to use if no files match.</td>
     <td valign="top" align="center">No</td>
@@ -106,8 +112,8 @@
 ignored and you will get a warning.</p>
 <h2>Example</h2>
 <pre>
-    &lt;ear earfile="${build.dir}/myapp.ear" appxml="${src.dir}/metadata/application.xml"&gt;
-      &lt;fileset dir="${build.dir}" includes="*.jar,*.war"/&gt;
+    &lt;ear earfile=&quot;${build.dir}/myapp.ear&quot; appxml=&quot;${src.dir}/metadata/application.xml&quot;&gt;
+      &lt;fileset dir=&quot;${build.dir}&quot; includes=&quot;*.jar,*.war&quot;/&gt;
     &lt;/ear&gt;
 </pre>
 <hr>
diff --git a/docs/manual/CoreTasks/fixcrlf.html b/docs/manual/CoreTasks/fixcrlf.html
index 98a6309..131340a 100644
--- a/docs/manual/CoreTasks/fixcrlf.html
+++ b/docs/manual/CoreTasks/fixcrlf.html
@@ -102,9 +102,9 @@
 	      <li>crlf: convert all EOLs to the pair CRLF</li>
 	    </ul>
 	    Default is based on the platform on which you are running
-	    this task.  For Unix platforms, the default is "lf".
+	    this task.  For Unix platforms, the default is &quot;lf&quot;.
 	    For DOS based systems (including Windows), the default is
-	    "crlf".  For Mac OS, the default is "cr".
+	    &quot;crlf&quot;.  For Mac OS, the default is &quot;cr&quot;.
 	    <p>
 	      This is the preferred method for specifying EOL.  The
 	      &quot;<i><b>cr</b></i>&quot; attribute (see below) is
@@ -138,9 +138,9 @@
 	      </li>
 	    </ul>
 	    Default is based on the platform on which you are running
-	    this task.  For Unix platforms, the default is "remove".
+	    this task.  For Unix platforms, the default is &quot;remove&quot;.
 	    For DOS based systems (including Windows), the default is
-	    "add".
+	    &quot;add&quot;.
 	    <p>
 	      <i>N.B.</i>: One special case is recognized. The three
 	      characters CR-CR-LF are regarded as a single EOL.
@@ -164,7 +164,6 @@
 	  <td valign="top" align="center">No</td>
 	</tr>
 	<tr>
-  <tr>
     <td valign="top">tab</td>
     <td valign="top">Specifies how tab characters are to be handled.  Valid
       values for this property are:
diff --git a/docs/manual/CoreTasks/jar.html b/docs/manual/CoreTasks/jar.html
index 74d0ca2..d442093 100644
--- a/docs/manual/CoreTasks/jar.html
+++ b/docs/manual/CoreTasks/jar.html
@@ -33,6 +33,11 @@
 See the <a href="zip.html">Zip</a> task for more details and examples.</p>
 <p>If the manifest is omitted, a simple one will be supplied by Ant.
 You should not include <samp>META-INF/MANIFEST.MF</samp> in your set of files.</p>
+<p>The <code>update</code> parameter controls what happens if the
+JAR file already exists. When set to <code>yes</code>, the JAR file is
+updated with the files specified. When set to <code>no</code> (the
+default) the JAR file is overwritten. An example use of this is
+provided in the <a href="zip.html">Zip task documentation</a>.
 <p>The <code>whenempty</code> parameter controls what happens when no files match.
 If <code>create</code> (the default), the JAR is created anyway with only a manifest.
 If <code>skip</code>, the JAR is not created and a warning is issued.
@@ -114,6 +119,12 @@
     <td valign="top" align="center">No</td>
   </tr>
   <tr>
+    <td valign="top">update</td>
+    <td valign="top">indicates whether to update or overwrite
+      the destination file if it already exists.</td>
+    <td valign="top" align="center">No</td>
+  </tr>
+  <tr>
     <td valign="top">whenempty</td>
     <td valign="top">Behavior to use if no files match.</td>
     <td valign="top" align="center">No</td>
diff --git a/docs/manual/CoreTasks/javac.html b/docs/manual/CoreTasks/javac.html
index 9387ed6..e7977d7 100644
--- a/docs/manual/CoreTasks/javac.html
+++ b/docs/manual/CoreTasks/javac.html
@@ -9,7 +9,7 @@
 
 <h2><a name="javac">Javac</a></h2>
 <h3>Description</h3>
-<p>Compiles a source tree within the running (Ant) VM.</p>
+<p>Compiles a Java source tree.</p>
 <p>The source and destination directory will be recursively scanned for Java
 source files to compile. Only Java files that have no corresponding class file
 or where the class file is older than the java file will be compiled.</p>
@@ -29,7 +29,7 @@
 href="../dirtasks.html#directorybasedtasks">directory based tasks</a>, on how the
 inclusion/exclusion of files works, and how to write patterns.</p>
 <p>It is possible to use different compilers. This can be selected with the
-&quot;build.compiler&quot; property. There are four choices:</p>
+&quot;build.compiler&quot; property. Here are the choices:-</p>
 <ul>
   <li>classic (the standard compiler of JDK 1.1/1.2) - javac1.1 and
      javac1.2 can be used as aliases</li>
@@ -47,7 +47,7 @@
   <li>extJavac (run either modern or classic in a JVM of its own)</li>
 </ul>
 <p>For JDK 1.1/1.2, classic is the default. For JDK 1.3/1.4, modern is the default.
-If you wish to use a different compiler interface than one of the four
+If you wish to use a different compiler interface than those
 supplied, write a class that implements the CompilerAdapter interface
 (package org.apache.tools.ant.taskdefs.compilers). Supply the full
 classname in the &quot;build.compiler&quot; property.
@@ -138,6 +138,12 @@
     <td align="center" valign="top">No</td>
   </tr>
   <tr>
+    <td valign="top">nowarn</td>
+    <td valign="top">indicates whether -nowarn switch should be passed
+      to the compiler; defaults to <code>off</code>.</td>
+    <td align="center" valign="top">No</td>
+  </tr>
+  <tr>
     <td valign="top">debug</td>
     <td valign="top">indicates whether source should be compiled with debug
       information; defaults to <code>off</code>.</td>
@@ -190,11 +196,34 @@
     <td align="center" valign="top">No</td>
   </tr>  
   <tr>
+    <td valign="top">memoryInitialSize</td> 
+    <td valign="top">the initial size of the memory for the underlying VM, if javac is run
+    externally, ignored otherwise; defaults to the standard VM memory setting.
+    (examples: <code>83886080</code>, <code>81920k</code>, or <code>80m</code>)</td>
+    <td align="center" valign="top">No</td>
+  </tr>  
+  <tr>
+    <td valign="top">memoryMaximumSize</td> 
+    <td valign="top">the maximum size of the memory for the underlying VM, if javac is run
+    externally, ignored otherwise; defaults to the standard VM memory setting.
+    (examples: <code>83886080</code>, <code>81920k</code>, or <code>80m</code>)</td>
+    <td align="center" valign="top">No</td>
+  </tr>  
+  <tr>
     <td valign="top">failonerror</td> <td valign="top">
         indicates whether the build will continue even if there are compilation errors; defaults to <code>true</code>.
     </td>
     <td align="center" valign="top">No</td>
   </tr>
+  <tr>
+    <td valign="top">source</td> 
+    <td valign="top">Value of the <code>-source</code> command line
+    switch, will be ignored by all implementations except
+    <code>modern</code>, legal values are &quot;1.3&quot; and
+    &quot;1.4&quot; - by default, no <code>-source</code> argument
+    will be used at all.</td>
+    <td align="center" valign="top">No</td>
+  </tr>  
 </table>
 
 <h3>Parameters specified as nested elements</h3>
@@ -267,8 +296,54 @@
 <p><b>Note:</b> If you wish to compile only source-files located in some packages below a
 common root you should not include these packages in the srcdir-attribute. Use include/exclude-attributes
 or elements to filter for these packages. If you include part of your package-structure inside the srcdir-attribute 
-(or nested src-elements) Ant will start to recompile your sources everytime you call it.</p>
+(or nested src-elements) Ant will start to recompile your sources every time you call it.</p>
 
+<h3>Jikes Notes</h3>
+
+Jikes supports some extra options, which can be set be defining
+properties prior to invoking the task. The ant developers are aware that
+this is ugly and inflexible -expect a better solution in the future. All
+the options are boolean, and must be set to &quot;true&quot; or &quot;yes&quot; to be
+interpreted as anything other than false; by default
+build.compiler.warnings is &quot;true&quot; while all others are &quot;false&quot;
+
+<table border="1" cellpadding="2" cellspacing="0">
+  <tr>
+    <td valign="top">
+	build.compiler.emacs
+	</td> 
+	<td valign="top">
+	Enable emacs compatible error messages
+    </td>
+  </tr>
+  <tr>
+    <td valign="top">
+	build.compiler.warnings<br>
+        <b>This property has been deprecated, use the nowarn attribute
+          instead</b>
+	</td> 
+	<td valign="top">
+	don't disable warning messages
+    </td>
+  </tr>
+  <tr>
+    <td valign="top">
+	build.compiler.pedantic
+	</td> 
+	<td valign="top">
+	enable pedantic warnings
+    </td>
+  </tr>
+  <tr>
+    <td valign="top">
+	build.compiler.fulldepend
+	</td> 
+	<td valign="top">
+	enable full dependency checking,<br> 
+	&quot;+F&quot; in the jikes manual.
+    </td>
+  </tr>
+</table>
 <hr>
 <p align="center">Copyright &copy; 2000,2001 Apache Software Foundation. All rights
 Reserved.</p>
diff --git a/docs/manual/CoreTasks/mail.html b/docs/manual/CoreTasks/mail.html
index 61da405..43a8add 100644
--- a/docs/manual/CoreTasks/mail.html
+++ b/docs/manual/CoreTasks/mail.html
@@ -9,7 +9,10 @@
 
 <h2><a name="mail">Mail</a></h2>
 <h3>Description</h3>
-<p>A task to send SMTP email.</p>
+<p>A task to send SMTP email. Text and text files to include in the message
+body may be specified. To send binary attachments the optional
+<a href="../OptionalTasks/mimemail.html">MimeMail</a> task should be used instead</p>
+
 <h3>Parameters</h3>
 <table border="1" cellpadding="2" cellspacing="0">
   <tr>
diff --git a/docs/manual/CoreTasks/overview.html b/docs/manual/CoreTasks/overview.html
index 7d5c113..58d5ae5 100644
--- a/docs/manual/CoreTasks/overview.html
+++ b/docs/manual/CoreTasks/overview.html
@@ -36,7 +36,7 @@
   </tr>
   
   <tr valign="top">
-    <td><a href="apply.html">Apply</a></td>
+    <td><a href="apply.html">Apply/<i>ExecOn</i></a></td>
     <td><p>Executes a system command. When the <i>os</i> attribute is specified, then
 the command is only executed when Ant is run on one of the specified operating
 systems.</p></td>
@@ -56,6 +56,13 @@
   </tr>
 
   <tr valign="top">
+    <td><a href="condition.html">Condition</a></td>
+    <td><p>Sets a property if a certain condition holds true - this is a
+    generalization of <a href="available.html">Available</a> and 
+    <a href="uptodate.html">Uptodate</a>.</p></td>
+  </tr>
+
+  <tr valign="top">
     <td><a href="copy.html">Copy</a></td>
     <td><p>Copies a file or Fileset to a new file or directory.</p></td>
   </tr>
@@ -95,6 +102,13 @@
   </tr>
 
   <tr valign="top">
+    <td><a href="dependset.html">Dependset</a></td>
+    <td><p>The dependset task compares a set of source files with a set of target
+    files.  If any of the source files is more recent than any of
+    the target files, all of the target files are removed. </p></td>
+  </tr>
+
+  <tr valign="top">
     <td><a href="ear.html">Ear</a></td>
     <td><p>An extension of the <a href="jar.html">Jar</a> task with special
     treatment for files that should end up in an Enterprise Application archive.</p></td>
@@ -113,16 +127,6 @@
   </tr>
 
   <tr valign="top">
-    <td><a href="execon.html">ExecOn</a></td>
-    <td><p>Executes a system command. When the <i>os</i> attribute is specified, then
-the command is only executed when Ant is run on one of the specified operating
-systems.</p>
-<p>The files and/or directories of a number of <a
-href="../CoreTypes/fileset.html">FileSet</a>s are passed as arguments to the system
-command. At least one nested <code>&lt;fileset&gt;</code> is required.</p></td>
-  </tr>
-
-  <tr valign="top">
     <td><a href="fail.html">Fail</a></td>
     <td><p>Exits the current build (just throwing a BuildException), optionally printing additional information.</p></td>
   </tr>
@@ -192,16 +196,22 @@
   <tr valign="top">
     <td><a href="mkdir.html">Mkdir</a></td>
     <td><p>Creates a directory. Also non-existent parent directories are created, when
-necessary.</p></td>
+    necessary.</p></td>
   </tr>
 
   <tr valign="top">
     <td><a href="move.html">Move</a></td>
     <td><p>Moves a file to a new file or directory, or sets of files to
-a new directory.</p></td>
+    a new directory.</p></td>
   </tr>
 
   <tr valign="top">
+    <td><a href="parallel.html">Parallel</a></td>
+    <td><p>Parallel is a container task - it can contain other Ant tasks. Each nested
+    task within the parallel task will be executed in its own thread. </p>  </td>
+  </tr>
+  
+  <tr valign="top">
     <td><a href="patch.html">Patch</a></td>
     <td><p>Applies a diff file to originals.</p></td>
   </tr>
@@ -215,13 +225,13 @@
   <tr valign="top">
     <td><a href="property.html">Property</a></td>
     <td><p>Sets a property (by name and value), or set of properties (from file or
-resource) in the project.</p></td>
+    resource) in the project.</p></td>
   </tr>
 
   <tr valign="top">
     <td><a href="recorder.html">Record</a></td>
     <td><p>A recorder is a listener to the current build process that records the
-output to a file.</p></td>
+    output to a file.</p></td>
   </tr>
 
   <tr valign="top">
@@ -232,7 +242,7 @@
   <tr valign="top">
     <td><a href="replace.html">Replace</a></td>
     <td><p>Replace is a directory based task for replacing the occurrence of a given string with another string 
-in selected file.</p></td>
+    in selected file.</p></td>
   </tr>
 
   <tr valign="top">
@@ -241,6 +251,14 @@
   </tr>
 
   <tr valign="top">
+    <td><a href="sequential.html">Sequential</a></td>
+    <td><p>Sequential is a container task - it can contain other Ant tasks. The nested 
+    tasks are simply executed in sequence. Sequential's primary use is to support 
+    the sequential execution of a subset of tasks within the 
+    <a href="parallel.html">parallel</a> task</p></td>
+  </tr>
+  
+  <tr valign="top">
     <td><a href="signjar.html">SignJar</a></td>
     <td><p>Signs a jar or zip file with the javasign command line tool.</p></td>
   </tr>
@@ -271,13 +289,13 @@
   <tr valign="top">
     <td><a href="taskdef.html">Taskdef</a></td>
     <td><p>Adds a task definition to the current project, such that this new task can be
-used in the current project.</p></td>
+    used in the current project.</p></td>
   </tr>
 
   <tr valign="top">
     <td><a href="touch.html">Touch</a></td>
     <td><p>Changes the modification time of a file and possibly creates it at
-the same time.</p></td>
+    the same time.</p></td>
   </tr>
 
   <tr valign="top">
@@ -290,7 +308,7 @@
   <tr valign="top">
     <td><a href="typedef.html">Typedef</a></td>
     <td><p>Adds a data type definition to the current project, such that this
-new type can be used in the current project.</p></td>
+    new type can be used in the current project.</p></td>
   </tr>
 
   <tr valign="top">
@@ -316,7 +334,7 @@
   <tr valign="top">
     <td><a href="uptodate.html">Uptodate</a></td>
     <td><p>Sets a property if a target files are more up to date than a set of
-Source files.</p></td>
+    Source files.</p></td>
   </tr>
 
   <tr valign="top">
diff --git a/docs/manual/CoreTasks/parallel.html b/docs/manual/CoreTasks/parallel.html
index d4d49b6..183389c 100644
--- a/docs/manual/CoreTasks/parallel.html
+++ b/docs/manual/CoreTasks/parallel.html
@@ -22,7 +22,7 @@
 <p>Care must be taken when using multithreading to ensure the tasks within the
 threads do not interact. For example, two javac compile tasks which write 
 classes into the same destination directory may interact where one tries to
-read a class for depenency information while the other task is writing the 
+read a class for dependency information while the other task is writing the 
 class file. Be sure to avoid these types of interactions within a 
 &lt;parallel&gt; task</p>
   
@@ -35,7 +35,7 @@
 
 <p>If any of the tasks within the &lt;parallel&gt; task fails, the remaining 
 tasks in other threads will continue to run until all threads have completed. 
-In this sitiuation, the parallel task will also fail.</p>
+In this situation, the parallel task will also fail.</p>
 
 <p>The parallel task may be combined with the <a href="sequential.html">
 sequential</a> task to define sequences of tasks to be executed on each thread
@@ -55,7 +55,7 @@
 <p>This example represents a typical pattern for testing a server application. 
 In one thread the server is started (the wlrun task). The other thread consists 
 of a three tasks which are performed in sequence. The sleep task is used to 
-give the server time to come up. Another task which is capabale of validating 
+give the server time to come up. Another task which is capable of validating 
 that the server is available could be used in place of the sleep task. The 
 test harness is then run. Once the tests are complete, the server is stopped 
 (using wlstop in this example), allowing both threads to complete. The 
diff --git a/docs/manual/CoreTasks/pathconvert.html b/docs/manual/CoreTasks/pathconvert.html
new file mode 100644
index 0000000..20e45ca
--- /dev/null
+++ b/docs/manual/CoreTasks/pathconvert.html
@@ -0,0 +1,195 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<title>Ant User Manual</title>
+</head>
+
+<body>
+
+<h2><a name="foreach">Pathconvert</a></h2>
+<h3>Description</h3>
+<p>Converts a nested path, path reference, or fileset reference to the form usable on a
+   specified platform
+   and stores the result in a given property.  This operation is useful when script files
+   (batch files or shell scripts) must be generated my the build system and they contain
+   path information that must be properly formatted for the target architecture, not the
+   architecture on which the build is running, or when you need to create a list of files
+   separated by a given character, like a comma or a space.
+</p>
+<p>Prefix maps can be specified to map Windows drive letters to Unix paths and vice
+   versa.</p>
+
+<h3>Parameters</h3>
+<table border="1" cellpadding="2" cellspacing="0">
+  <tr>
+    <td valign="top"><b>Attribute</b></td>
+    <td valign="top"><b>Description</b></td>
+    <td align="center" valign="top"><b>Required</b></td>
+  </tr>
+  <tr>
+    <td valign="top">targetos</td>
+    <td valign="top">
+        The target architecture.  Must be one of 'unix' or 'windows'.  <BR>This is a
+        shorthand mechanism for specifying both <tt>pathsep</tt> and <tt>dirsep</tt>
+        according to the specified target architecture.
+    </td>
+    <td valign="top" align="center">
+       Must specify one of <tt>targetos</tt>, <tt>pathsep</tt>,or <tt>dirsep</tt>.
+    </td>
+  </tr>
+  <tr>
+    <td valign="top">dirsep</td>
+    <td valign="top">
+       The character to use as the directory separator in the generated paths.
+    </td>
+    <td valign="top" align="center">No, defaults to current JVM <tt>File.separator</tt></td>
+  </tr>
+  <tr>
+    <td valign="top">pathsep</td>
+    <td valign="top">
+       The character to use as the path element separator in the generated paths.
+    </td>
+    <td valign="top" align="center">No, defaults to current JVM <tt>File.pathSeparator</tt></td>
+  </tr>
+  <tr>
+    <td valign="top">property</td>
+    <td valign="top">The name of the property in which to place the converted path</td>
+    <td valign="top" align="center">Yes</td>
+  </tr>
+  <tr>
+    <td valign="top">refid</td>
+    <td valign="top">What to convert, given as a
+        <a href="../using.html#references">reference</a> to a PATH or FILESET
+        defined elsewhere</td>
+    <td valign="top" align="center">No, if omitted a nested &lt;path> element must be supplied.</td>
+  </tr>
+</table>
+<h3>Parameters specified as nested elements</h3>
+<h4>map</h4>
+<p>Specifies the mapping of path prefixes between Unix and Windows.</p>
+<table border="1" cellpadding="2" cellspacing="0">
+  <tr>
+    <td valign="top"><b>Attribute</b></td>
+    <td valign="top"><b>Description</b></td>
+    <td align="center" valign="top"><b>Required</b></td>
+  </tr>
+  <tr>
+    <td valign="top">from</td>
+    <td valign="top">The prefix to match.  Note that this value is case insensitive when
+    the build is running on a windows platform and case sensitive when running on a
+    Unix platform.</td>
+    <td valign="top" align="center">Yes</td>
+  </tr>
+  <tr>
+    <td valign="top">to</td>
+    <td valign="top">The replacement text to use when <i>from</i> is matched.</td>
+    <td valign="top" align="center">Yes</td>
+  </tr>
+</table>
+
+<p>Each map element specifies a single replacement map to be applied to the elements of
+   the path being processed.  If no map entries are specified, then no path prefix mapping
+   is performed.
+</p>
+<p><i>Note that the map elements are applied in the order specified and the only the first
+   matching map element is applied.  So, the ordering of your map elements can be important
+   if any <TT>from</tt> values are prefixes of other <tt>from</tt> values.</i>
+</p>   
+<h4>path</h4>
+<p>If a path reference is not supplied using the <i>refid</i> attribute, then a
+   nested path element must be supplied.  See
+   <a href="../using.html#path">Path-like Structures</a> for details.</p>
+
+<h3>Examples</h3>
+<p>In the examples below, assume that the property <b>wl.home</b> has the value
+<tt>d:\weblogic</tt> on Windows and <tt>/weblogic</tt> on Unix.</p>
+<h4>Example 1</h4>
+<pre>
+    &lt;path id="wl.path"&gt;
+      &lt;pathelement location=&quot;${wl.home}/lib/weblogicaux.jar&quot; /&gt;
+      &lt;pathelement location=&quot;${wl.home}/classes&quot; /&gt;
+      &lt;pathelement location=&quot;${wl.home}/mssqlserver4/classes&quot; /&gt;
+      &lt;pathelement location=&quot;c:\winnt\System32&quot; /&gt;
+    &lt;/path&gt;
+    
+    &lt;pathconvert targetos=&quot;unix&quot; property=&quot;newpath&quot; refid=&quot;wl.path&quot;/&gt;
+</pre>
+<p>Assuming wl.property has the value "d:\weblogic", will generate the path shown below
+   and store it in the property named <tt>newpath</tt>
+</p>   
+<pre>
+/weblogic/lib/weblogicaux.jar:/weblogic/classes:/weblogic/mssqlserver4/classes:/WINNT/SYSTEM32
+</pre>
+Note that the drive letters have been removed.  This is the default behavior when no map
+elements have been specified.
+
+<h4>Example 2</h4>
+<pre>
+    
+    &lt;pathconvert targetos=&quot;unix&quot; property=&quot;newpath&quot; &gt;
+      &lt;path id="wl.path"&gt;
+        &lt;pathelement location=&quot;${wl.home}/lib/weblogicaux.jar&quot; /&gt;
+        &lt;pathelement location=&quot;${wl.home}/classes&quot; /&gt;
+        &lt;pathelement location=&quot;${wl.home}/mssqlserver4/classes&quot; /&gt;
+        &lt;pathelement location=&quot;c:\winnt\System32&quot; /&gt;
+      &lt;/path&gt;
+    &lt;/pathconvert&gt;
+</pre>
+This generates the exact same path as the previous example.  It demonstrates the use of
+a nested path element.
+<h4>Example 3</h4>
+<pre>
+    &lt;pathconvert targetos=&quot;unix&quot; property=&quot;newpath&quot; refid=&quot;wl.path&quot;&gt;
+      &lt;map from=&quot;d:&quot; to=&quot;/foo&quot;/&gt;
+      &lt;map from=&quot;c:&quot; to=&quot;/bar&quot;/&gt;
+    &lt;/pathconvert&gt;
+</pre>
+<p>This example specifies two map entries that will convert path elements that start with
+<tt>c:</tt> to <TT>/dos</tt> and <tt>d:</tt> to <TT>/</tt>.  The resulting path is shown
+below.</p>
+<pre>
+/weblogic/lib/weblogicaux.jar:/weblogic/classes:/weblogic/mssqlserver4/classes:/dos/WINNT/SYSTEM32
+</pre>
+<h4>Example 4</h4>
+<pre>
+    &lt;pathconvert targetos=&quot;windows&quot; property=&quot;newpath&quot; &gt;
+      &lt;path id="wl.path"&gt;
+        &lt;pathelement location=&quot;${wl.home}/lib/weblogicaux.jar&quot; /&gt;
+        &lt;pathelement location=&quot;${wl.home}/classes&quot; /&gt;
+        &lt;pathelement location=&quot;${wl.home}/mssqlserver4/classes&quot; /&gt;
+        &lt;pathelement location=&quot;/dos/winnt/System32&quot; /&gt;
+      &lt;/path&gt;
+      &lt;map from=&quot;/dos&quot; to=&quot;c:\&quot;/&gt;
+      &lt;map from=&quot;/&quot; to=&quot;d:\&quot;/&gt;
+    &lt;/pathconvert&gt;
+</pre>
+<p>This example, similar to the one above but targetting windows, specifies two map
+entries that will convert path elements that start with
+<tt>/dos</tt> to <TT>c:\</tt> and <tt>/</tt> to <TT>d:\</tt>.  Note that the order of the
+map elements was important here since <tt>/</tt> is a prefix of <tt>/dos</tt>.
+The resulting path is shown below.</p>
+<pre>
+d:\weblogic\lib\weblogicaux.jar;d:\weblogic\classes;d:\weblogic\mssqlserver4\classes;c:\WINNT\SYSTEM32
+</pre>
+<h4>Example 5</h4>
+<pre>
+    &lt;fileset dir=&quot;${src.dir}&quot; id=&quot;src.files&quot;&gt;
+      &lt;include name=&quot;**/*.java&quot;/&gt;
+    &lt;/fileset&gt;
+  
+    &lt;pathconvert pathsep=&quot;,&quot; property=&quot;javafiles&quot; refid=&quot;src.files&quot;/&gt;
+</pre>
+<p>This example takes the set of files determined by the fileset (all files ending
+in <tt>.java</tt>), joins them together separated by commas, and places the resulting
+list into the property <tt>javafiles</tt>.  The directory separator is not specified, so
+it defaults to the appropriate character for the current platform.  Such a list could
+then be used in another task, like <tt>javadoc</tt>, that requires a comma separated
+list of files.
+</p>
+<hr>
+
+</body>
+</html>
+
+ 
\ No newline at end of file
diff --git a/docs/manual/CoreTasks/property.html b/docs/manual/CoreTasks/property.html
index 1d45a9d..a3c5315 100644
--- a/docs/manual/CoreTasks/property.html
+++ b/docs/manual/CoreTasks/property.html
@@ -36,6 +36,8 @@
 <p>The value part of the properties being set, might contain references to other
 properties. These references are resolved at the time these properties are set.
 This also holds for properties loaded from a property file.</p>
+<p>A list of predefined properties can be found <a
+href="../using.html#built-in-props">here</a>.</p>
 <h3>Parameters</h3>
 <table border="1" cellpadding="2" cellspacing="0">
   <tr>
@@ -46,12 +48,21 @@
   <tr>
     <td valign="top">name</td>
     <td valign="top">the name of the property to set.</td>
-    <td valign="top" align="center">Yes</td>
+    <td valign="top" align="center">No</td>
   </tr>
   <tr>
     <td valign="top">value</td>
     <td valign="top">the value of the property.</td>
-    <td valign="middle" align="center" rowspan="6">Yes</td>
+    <td valign="middle" align="center" rowspan="3">One of these, when using the
+       name attribute</td>
+  </tr>
+  <tr>
+    <td valign="top">location</td>
+    <td valign="top">Sets the property to the absolute filename of the
+      given file. If the value of this attribute is an absolute path, it
+      is left unchanged (with / and \ characters converted to the
+      current platforms conventions). Otherwise it is taken as a path
+      relative to the project's basedir and expanded.</td>
   </tr>
   <tr>
     <td valign="top">refid</td>
@@ -62,20 +73,14 @@
   <tr>
     <td valign="top">resource</td>
     <td valign="top">the resource name of the property file.</td>
+    <td valign="middle" align="center" rowspan="3">One of these, when
+      <b>not</b> using the name attribute</td>
   </tr>
   <tr>
     <td valign="top">file</td>
     <td valign="top">the filename of the property file .</td>
   </tr>
   <tr>
-    <td valign="top">location</td>
-    <td valign="top">Sets the property to the absolute filename of the
-      given file. If the value of this attribute is an absolute path, it
-      is left unchanged (with / and \ characters converted to the
-      current platforms conventions). Otherwise it is taken as a path
-      relative to the project's basedir and expanded.</td>
-  </tr>
-  <tr>
     <td valign="top">environment</td>
     <td valign="top">the prefix to use when retrieving environment variables. Thus
     if you specify environment=&quot;myenv&quot; you will be able to access OS-specific 
diff --git a/docs/manual/CoreTasks/recorder.html b/docs/manual/CoreTasks/recorder.html
index 0c45ef2..15c9214 100644
--- a/docs/manual/CoreTasks/recorder.html
+++ b/docs/manual/CoreTasks/recorder.html
@@ -16,11 +16,11 @@
 associated with a file.  The filename is used as a unique identifier for
 the recorders.  The first call to the recorder task with an unused filename
 will create a recorder (using the parameters provided) and add it to the
-listeners of the build.  All subsiquent calls to the recorder task using
+listeners of the build.  All subsequent calls to the recorder task using
 this filename will modify that recorders state (recording or not) or other
 properties (like logging level).
 
-<p>Some technical issues: the file's print stream is flushed for "finished"
+<p>Some technical issues: the file's print stream is flushed for &quot;finished&quot;
 events (buildFinished, targetFinished and taskFinished), and is closed on
 a buildFinished event.
 
@@ -41,8 +41,8 @@
     <td valign="top">This tells the logger what to do: should it start
     recording or stop?  The first time that the recorder task is called for
     this logfile, and if this attribute is not provided, then the default
-    for this attribute is "start".  If this attribute is not provided on
-    subsiquest calls, then the state remains as previous.
+    for this attribute is &quot;start&quot;.  If this attribute is not provided on
+    subsequent calls, then the state remains as previous.
     [Values = {start|stop}, Default = no state change]</td>
     <td align="center" valign="middle">no</td>
   </tr>
@@ -50,7 +50,7 @@
     <td valign="top">append</td>
     <td valign="top">Should the recorder append to a file, or create a new
     one? This is only applicable the first time this task is called for
-    this file.  [Vaules = {yes|no}, Default=yes]</td>
+    this file.  [Values = {yes|no}, Default=yes]</td>
     <td align="center" valign="middle">no</td>
   </tr>
   <tr>
@@ -58,38 +58,38 @@
     <td valign="top">At what logging level should this recorder instance
     record to?  This is not a once only parameter (like <code>append</code>
     is) -- you can increase or decrease the logging level as the build process
-    continues.  [Vaules= {error|warn|info|verbose|debug}, Default = no change]
+    continues.  [Values= {error|warn|info|verbose|debug}, Default = no change]
     </td>
     <td align="center" valign="middle">no</td>
   </tr>
 </table>
 
 <h3>Examples</h3>
-<p>The following build.xml snippit is an example of how to use the recorder
+<p>The following build.xml snippet is an example of how to use the recorder
 to record just the <code>&lt;javac&gt;</code> task:
 <pre>
     ...
     &lt;compile &gt;
-        &lt;record name="log.txt" action="start" /&gt;
+        &lt;record name=&quot;log.txt&quot; action=&quot;start&quot; /&gt;
         &lt;javac ...
-        &lt;record name="log.txt" action="stop" /&gt;
+        &lt;record name=&quot;log.txt&quot; action=&quot;stop&quot; /&gt;
     &lt;compile/&gt;
     ...
 </pre>
 
 <p>The following two calls to <code>&lt;record&gt;</code> set up two
-recorders: one to file "records-simple.log" at logging level <code>info</code>
-(the default) and one to file "ISO.log" using logging level of
+recorders: one to file &quot;records-simple.log&quot; at logging level <code>info</code>
+(the default) and one to file &quot;ISO.log&quot; using logging level of
 <code>verbose</code>.
 <pre>
     ...
-    &lt;record name="records-simple.log" /&gt;
-    &lt;record name="ISO.log" loglevel="verbose" /&gt;
+    &lt;record name=&quot;records-simple.log&quot; /&gt;
+    &lt;record name=&quot;ISO.log&quot; loglevel=&quot;verbose&quot; /&gt;
     ...
 </pre>
 
 <h3>Notes</h3>
-<p>There is some funtionality that I would like to be able to add in the
+<p>There is some functionality that I would like to be able to add in the
 future.  They include things like the following:
 <table border="1" cellpadding="2" cellspacing="0">
   <tr>
@@ -113,8 +113,8 @@
   </tr>
   <tr>
     <td valign="top">includetarget</td>
-    <td valign="top" rowspan=2>A comma-separated list of targets to automaticly
-    record.  If this value is "all", then all targets are recorded.
+    <td valign="top" rowspan=2>A comma-separated list of targets to automatically
+    record.  If this value is &quot;all&quot;, then all targets are recorded.
     [Default = all]</td>
     <td align="center" valign="middle">no</td>
   </tr>
@@ -124,10 +124,10 @@
   </tr>
   <tr>
     <td valign="top">includetask</td>
-    <td valign="top" rowspan=2>A comma-separated list of task to automaticly
+    <td valign="top" rowspan=2>A comma-separated list of task to automatically
     record or not.  This could be difficult as it could conflict with the
     <code>includetarget/excludetarget</code>.  (e.g.:
-    <code>includetarget="compile" exlcudetask="javac"</code>, what should
+    <code>includetarget=&quot;compile&quot; exlcudetask=&quot;javac&quot;</code>, what should
     happen?)</td>
     <td align="center" valign="middle">no</td>
   </tr>
@@ -137,7 +137,7 @@
   </tr>
   <tr>
     <td valign="top">action</td>
-    <td valign="top">add greater flexability to the action attribute.  Things
+    <td valign="top">add greater flexibility to the action attribute.  Things
     like <code>close</code> to close the print stream.</td>
     <td align="center" valign="top">no</td>
   </tr>
diff --git a/docs/manual/CoreTasks/sleep.html b/docs/manual/CoreTasks/sleep.html
index 0835696..0d77e3f 100644
--- a/docs/manual/CoreTasks/sleep.html
+++ b/docs/manual/CoreTasks/sleep.html
@@ -57,8 +57,8 @@
 Sleep for about 10 mS. 
 <pre>   &lt;sleep seconds=&quot;2&quot;/&gt;</pre>
 Sleep for about 2 seconds. 
-<pre>   &lt;sleep minutes=&quot;-59&quot; seconds=&quot;-58&quot;/&gt;</pre>
-<p>Sleep for -one hour less 59:58, or two seconds again </p>
+<pre>   &lt;sleep hours=&quot;1&quot; minutes=&quot;-59&quot; seconds=&quot;-58&quot;/&gt;</pre>
+<p>Sleep for one hour less 59:58, or two seconds again </p>
 <pre>   &lt;sleep /&gt;</pre>
 Sleep for no time at all. This may yield the CPU time to another thread or process. 
 <hr>
diff --git a/docs/manual/CoreTasks/sql.html b/docs/manual/CoreTasks/sql.html
index 8e719a2..c3a5b00 100644
--- a/docs/manual/CoreTasks/sql.html
+++ b/docs/manual/CoreTasks/sql.html
@@ -7,13 +7,21 @@
 
 <h2><a name="sql">Sql</a></h2>
 <h3>Description</h3>
-<p>Executes a series of SQL statements via JDBC to a database. Statements can either be read in from a text file using the <i>src</i> attribute or from between the enclosing SQL tags.</p>
+<p>Executes a series of SQL statements via JDBC to a database. Statements can 
+either be read in from a text file using the <i>src</i> attribute or from 
+between the enclosing SQL tags.</p>
 
-<p>Multiple statements can be provided, separated by semi-colons (or the defined <i>delimiter</i>). Individual lines within the statements can be commented using either --, // or REM at the start of the line.</p>
+<p>Multiple statements can be provided, separated by semicolons (or the 
+defined <i>delimiter</i>). Individual lines within the statements can be 
+commented using either --, // or REM at the start of the line.</p>
 
-<p>The <i>autocommit</i> attribute specifies whether auto-commit should be turned on or off whilst executing the statements. If auto-commit is turned on each statement will be executed and committed. If it is turned off the statements will all be executed as one transaction.</p>
+<p>The <i>autocommit</i> attribute specifies whether auto-commit should be 
+turned on or off whilst executing the statements. If auto-commit is turned 
+on each statement will be executed and committed. If it is turned off the 
+statements will all be executed as one transaction.</p>
 
-<p>The <i>onerror</i> attribute specifies how to proceed when an error occurs during the execution of one of the statements. 
+<p>The <i>onerror</i> attribute specifies how to proceed when an error occurs 
+during the execution of one of the statements. 
 The possible values are: <b>continue</b> execution, only show the error;
 <b>stop</b> execution and commit transaction;
 and <b>abort</b> execution and transaction and fail task.</p>
@@ -53,7 +61,7 @@
 <tr>
   <td width="12%" valign="top">delimiter</td>
   <td width="78%" valign="top">String that separates SQL statements</td>
-  <td width="10%" valign="top">No, default ";"</td>
+  <td width="10%" valign="top">No, default &quot;;&quot;</td>
 </tr>
 <tr>
   <td width="12%" valign="top">autocommit</td>
@@ -116,6 +124,12 @@
     <td valign="top" align="center">Yes, unless statements enclosed within tags</td>
   </tr>
 </table>
+<h4>fileset</h4>
+<p>You can specify multiple source files via nested <a
+href="../CoreTypes/fileset.html">fileset</a> elements.  Each file of
+the fileset will be run in a transaction of its own, the order by
+which the files of a single fileset will be executed is not
+defined.</p>
 <h4>classpath</h4>
 <p><code>Sql</code>'s <em>classpath</em> attribute is a <a
 href="../using.html#path">PATH like structure</a> and can also be set via a nested
@@ -134,7 +148,9 @@
 /&gt;
 </pre></blockquote>
 
-<p>Connects to the database given in <i>url</i> as the sa user using the org.database.jdbcDriver and executes the SQL statements contained within the file data.sql</p>
+<p>Connects to the database given in <i>url</i> as the sa user using the 
+org.database.jdbcDriver and executes the SQL statements contained within 
+the file data.sql</p>
 
 <blockquote><pre>&lt;sql
     driver=&quot;org.database.jdbcDriver&quot;
@@ -151,7 +167,8 @@
 </pre></blockquote>
 
 <p>Connects to the database given in <i>url</i> as the sa
- user using the org.database.jdbcDriver and executes the two SQL statements inserting data into some_table and truncating some_other_table </p>
+ user using the org.database.jdbcDriver and executes the two SQL statements 
+ inserting data into some_table and truncating some_other_table </p>
 
 <p>Note that you may want to enclose your statements in
 <code>&lt;![CDATA[</code> ... <code>]]&gt;</code> sections so you don't
@@ -170,7 +187,10 @@
 ]]&gt;&lt;/sql&gt;
 </pre></blockquote>
 
-<p>The following connects to the database given in url as the sa user using the org.database.jdbcDriver and executes the SQL statements contained within the files data1.sql, data2.sql and data3.sql and then executes the truncate operation on <i>some_other_table</i>.</p>
+<p>The following connects to the database given in url as the sa user using 
+the org.database.jdbcDriver and executes the SQL statements contained within 
+the files data1.sql, data2.sql and data3.sql and then executes the truncate 
+operation on <i>some_other_table</i>.</p>
 
 <blockquote><pre>&lt;sql
     driver=&quot;org.database.jdbcDriver&quot;
@@ -186,7 +206,29 @@
 &lt;/sql&gt;
 </pre></blockquote>
 
-<p>The following connects to the database given in url as the sa user using the org.database.jdbcDriver and executes the SQL statements contained within the file data.sql, with output piped to outputfile.txt, searching /some/jdbc.jar as well as the system classpath for the driver class.</p>
+<p>The following example does the same as (and may execute additional
+SQL files if there are more files matching the pattern
+<code>data*.sql</code>) but doesn't guarantee that data1.sql will be
+run before <code>data2.sql</code>.</p>
+
+<blockquote><pre>&lt;sql
+    driver=&quot;org.database.jdbcDriver&quot;
+    url=&quot;jdbc:database-url&quot;
+    userid=&quot;sa&quot;
+    password=&quot;pass&quot; &gt;
+  &lt;fileset dir=&quot;.&quot;&gt;
+    &lt;include name=&quot;data*.sql&quot; /&gt;
+  &lt;/fileset&gt;
+  &lt;transaction&gt;
+    truncate table some_other_table;
+  &lt;/transaction&gt;
+&lt;/sql&gt;
+</pre></blockquote>
+
+<p>The following connects to the database given in url as the sa user using the 
+org.database.jdbcDriver and executes the SQL statements contained within the 
+file data.sql, with output piped to outputfile.txt, searching /some/jdbc.jar 
+as well as the system classpath for the driver class.</p>
 
 <blockquote><pre>&lt;sql
     driver=&quot;org.database.jdbcDriver&quot;
diff --git a/docs/manual/CoreTasks/style.html b/docs/manual/CoreTasks/style.html
index 6069130..d15444e 100644
--- a/docs/manual/CoreTasks/style.html
+++ b/docs/manual/CoreTasks/style.html
@@ -12,6 +12,8 @@
 <p>Process a set of documents via XSLT.</p>
 <p>This is useful for building views of XML based documentation,
 or in generating code.</p>
+<p><b>Note:</b> This task depends on external libraries not included in the Ant distribution.
+See <a href="../install.html#librarydependencies">Library Dependencies</a> for more information.</p>
 <p>It is possible to refine the set of files that are being copied. This can be
 done with the <i>includes</i>, <i>includesfile</i>, <i>excludes</i>, <i>excludesfile</i> and <i>defaultexcludes</i>
 attributes. With the <i>includes</i> or <i>includesfile</i> attribute you specify the files you want to
@@ -87,7 +89,10 @@
       XSL:P processor, &quot;xalan&quot; for the Apache XML Xalan (version 1) 
       processor, or the name of an arbitrary XSLTLiaison class. Defaults to trax, 
       followed by xslp then xalan (in that order). The first one found in your 
-      class path is the one that is used.</td>
+      class path is the one that is used.
+      <em><strong>DEPRECATED</strong> - XSL:P is deprecated and will be removed
+          in the next version. Use trax or xalan instead.</em>.      
+      </td>
     <td align="center" valign="top">No</td>
   </tr>
   <tr>
diff --git a/docs/manual/CoreTasks/tstamp.html b/docs/manual/CoreTasks/tstamp.html
index bb98da6..894d985 100644
--- a/docs/manual/CoreTasks/tstamp.html
+++ b/docs/manual/CoreTasks/tstamp.html
@@ -36,7 +36,7 @@
 The Tstamp task supports a <code>&lt;format&gt;</code> nested element that
 allows a property to be set to the current date and time in a given format.
 The date/time patterns are as defined in the Java 
-<a href=http://java.sun.com/products/jdk/1.2/docs/api/java/text/SimpleDateFormat.html>SimpleDateFormat</a> class. 
+<a href="http://java.sun.com/products/jdk/1.2/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat</a> class. 
 The format element also allows offsets to be applied to the time to generate different time values.
 <br><br>
 <table width="60%" border="1" cellpadding="2" cellspacing="0">
@@ -82,7 +82,7 @@
   <tr>
     <td valign="top">locale</td>
     <td valign="top">The locale used to create date/time string. The general
-      form is "language, country, variant" but either variant or variant and
+      form is &quot;language, country, variant&quot; but either variant or variant and
       country may be omitted. For more information please refer to documentation
       for the 
       <a href="http://java.sun.com/j2se/1.3/docs/api/java/util/Locale.html">Locale</a>
diff --git a/docs/manual/CoreTasks/war.html b/docs/manual/CoreTasks/war.html
index bb19991..cee6822 100644
--- a/docs/manual/CoreTasks/war.html
+++ b/docs/manual/CoreTasks/war.html
@@ -94,6 +94,12 @@
     <td valign="top" align="center">No</td>
   </tr>
   <tr>
+    <td valign="top">update</td>
+    <td valign="top">indicates whether to update or overwrite
+      the destination file if it already exists.</td>
+    <td valign="top" align="center">No</td>
+  </tr>
+  <tr>
     <td valign="top">whenempty</td>
     <td valign="top">Behavior to use if no files match.</td>
     <td valign="top" align="center">No</td>
diff --git a/docs/manual/CoreTasks/zip.html b/docs/manual/CoreTasks/zip.html
index 57ed597..315c862 100644
--- a/docs/manual/CoreTasks/zip.html
+++ b/docs/manual/CoreTasks/zip.html
@@ -33,6 +33,11 @@
 and optional subelements like <code>&lt;include&gt;</code>); explicit nested
 <code>&lt;fileset&gt;</code> elements so long as at least one fileset total is specified. The ZIP file will
 only reflect the relative paths of files <i>within</i> each fileset. The Zip task and its derivatives know a special form of a fileset named zipfileset that has additional attributes (described below). </p>
+<p>The <code>update</code> parameter controls what happens if the
+ZIP file already exists. When set to <code>yes</code>, the ZIP file is
+updated with the files specified. (New files are added; old files are
+replaced with the new versions.) When set to <code>no</code> (the
+default) the ZIP file is overwritten.
 <p>The <code>whenempty</code> parameter controls what happens when no files match.
 If <code>skip</code> (the default), the ZIP is not created and a warning is issued.
 If <code>fail</code>, the ZIP is not created and the build is halted with an error.
@@ -42,7 +47,7 @@
 for filenames - this is consistent with the command line ZIP tools,
 but causes problems if you try to open them from within Java and your
 filenames contain non US-ASCII characters. Use the encoding attribute
-and set it to UTF8 to create zip files that can savely be read by
+and set it to UTF8 to create zip files that can safely be read by
 Java.</p>
 <h3>Parameters</h3>
 <table border="1" cellpadding="2" cellspacing="0">
@@ -110,6 +115,12 @@
     <td valign="top" align="center">No</td>
   </tr>
   <tr>
+    <td valign="top">update</td>
+    <td valign="top">indicates whether to update or overwrite
+      the destination file if it already exists.</td>
+    <td valign="top" align="center">No</td>
+  </tr>
+  <tr>
     <td valign="top">whenempty</td>
     <td valign="top">Behavior when no files match.</td>
     <td valign="top" align="center">No</td>
@@ -138,6 +149,14 @@
 in the <code>${dist}</code> directory.</p>
 <pre>  &lt;zip zipfile=&quot;${dist}/manual.zip&quot;
        basedir=&quot;htdocs/manual&quot;
+       update=&quot;true&quot;
+  /&gt;</pre>
+<p>zips all files in the <code>htdocs/manual</code> directory into a file called <code>manual.zip</code>
+in the <code>${dist}</code> directory. If <code>manual.zip</code>
+doesn't exist, it is created; otherwise it is updated with the
+new/changed files.</p>
+<pre>  &lt;zip zipfile=&quot;${dist}/manual.zip&quot;
+       basedir=&quot;htdocs/manual&quot;
        excludes=&quot;mydocs/**, **/todo.html&quot;
   /&gt;</pre>
 <p>zips all files in the <code>htdocs/manual</code> directory. Files in the directory <code>mydocs</code>,
@@ -169,8 +188,6 @@
     docs/ChangeLog.txt
     docs/examples/index.html
 </code></pre>
-
-
 <hr>
 <p align="center">Copyright &copy; 2000,2001 Apache Software Foundation. All rights
 Reserved.</p>
diff --git a/docs/manual/CoreTypes/filelist.html b/docs/manual/CoreTypes/filelist.html
index bb67949..353e7f5 100644
--- a/docs/manual/CoreTypes/filelist.html
+++ b/docs/manual/CoreTypes/filelist.html
@@ -34,7 +34,6 @@
     <td valign="top">Comma-separated list of file names.</td>
     <td valign="top" align="center">Yes</td>
   </tr>
-  </tr>
 </table>
 
 <h4>Examples</h4>
diff --git a/docs/manual/CoreTypes/fileset.html b/docs/manual/CoreTypes/fileset.html
index 91bafd5..318d931 100644
--- a/docs/manual/CoreTypes/fileset.html
+++ b/docs/manual/CoreTypes/fileset.html
@@ -62,11 +62,17 @@
       taken to be an exclude pattern.</td>
     <td valign="top" align="center">No</td>
   </tr>
+  <tr>
+    <td valign="top">casesensitive</td>
+    <td valign="top">Must the file system be treated in a case sensitive way?
+        Defaults to true.</td>
+    <td valign="top" align="center">No</td>
+  </tr>
 </table>
 
 <h4>Examples</h4>
 <blockquote><pre>
-&lt;fileset dir=&quot;${server.src}&quot; &gt;
+&lt;fileset dir=&quot;${server.src}&quot; casesensitive=&quot;yes&quot; &gt;
   &lt;patternset id=&quot;non.test.sources&quot; &gt;
     &lt;include name=&quot;**/*.java&quot;/&gt;
     &lt;exclude name=&quot;**/*Test*&quot;/&gt;
diff --git a/docs/manual/CoreTypes/filterset.html b/docs/manual/CoreTypes/filterset.html
new file mode 100644
index 0000000..36e5507
--- /dev/null
+++ b/docs/manual/CoreTypes/filterset.html
@@ -0,0 +1,118 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<HTML>
+<HEAD>
+  <TITLE>Ant User Manual</TITLE>
+  <META http-equiv="Content-Type" content="text/html; charset=windows-1252">
+  <META http-equiv="Content-Language" content="en-us">
+  <META content="MSHTML 5.50.4522.1800" name=GENERATOR>
+</HEAD>
+
+<BODY>
+<H2><A name="fileset">Filterset</A></H2>
+
+<P>FilterSets are groups of filters. Filters can be defined as token value pairs 
+or be read in from a file. FilterSets can appear inside tasks that support this 
+feature or at the same level as <CODE>target</CODE> - i.e., as children of 
+<CODE>project</CODE>.</P>In addition, Filtersets can have begintoken and/or 
+endtoken attributes to define what to match. <BR>Filtersets are used for doing 
+replacements in tasks like copy etc.<BR>
+
+<H2>Filterset</H2>
+
+<TABLE cellSpacing=0 cellPadding=2 border=1>
+  <TR>
+    <TD vAlign=top><B>Attribute</B></TD>
+    <TD vAlign=top><B>Description</B></TD>
+    <TD vAlign=top><B>Default</B></TD>
+    <TD vAlign=top align="center"><B>Required</B></TD>
+  </TR>
+  <TR>
+    <TD vAlign=top>begintoken</TD>
+    <TD vAlign=top>The string marking the beginning of a token. eg 
+      <STRONG>@</STRONG>Date@</TD>
+    <TD vAlign=top>@</TD>
+    <TD vAlign=top align="center">No</TD>
+  </TR>
+  <TR>
+    <TD vAlign=top>endtoken</TD>
+    <TD vAlign=top>The string marking the end of a token. eg 
+      @Date<STRONG>@</STRONG></TD>
+    <TD vAlign=top>@</TD>
+    <TD vAlign=top align="center">No</TD>
+  </TR>
+</TABLE>
+
+<H2>Filter</H2>
+<TABLE cellSpacing=0 cellPadding=2 border=1>
+  <TR>
+    <TD vAlign=top><B>Attribute</B></TD>
+    <TD vAlign=top><B>Description</B></TD>
+    <TD vAlign=top align="center"><B>Required</B></TD>
+  </TR>
+  <TR>
+    <TD vAlign=top>token</TD>
+    <TD vAlign=top>The token to replace eg @<STRONG>Date</STRONG>@</TD>
+    <TD vAlign=top align="center">Yes</TD>
+  </TR>
+  <TR>
+    <TD vAlign=top>value</TD>
+    <TD vAlign=top>The value to replace it with eg Thursday, April 26, 2001</TD>
+    <TD vAlign=top align="center">Yes</TD>
+  </TR>
+</TABLE>
+
+<H2>Filtersfile</H2>
+<TABLE cellSpacing=0 cellPadding=2 border=1>
+  <TR>
+    <TD vAlign=top><B>Attribute</B></TD>
+    <TD vAlign=top><B>Description</B></TD>
+    <TD vAlign=top align="center"><B>Required</B></TD>
+  </TR>
+  <TR>
+    <TD vAlign=top>file</TD>
+    <TD vAlign=top>The file to load tokens from should be a properties file of 
+      name value pairs.</TD>
+    <TD vAlign=top align="center">Yes</TD>
+  </TR>
+</TABLE>
+
+<H4>Examples</H4>
+
+<p>You are copying the version.txt file to the dist directory from the build directory 
+but wish to replace the token @DATE@ with todays date.</p>
+<BLOCKQUOTE><PRE>
+&lt;copy file=&quot;${build.home}/version.txt&quot; toFile=&quot;${dist.home}/version.txt&quot;&gt;
+  &lt;filterset&gt;
+    &lt;filter token=&quot;DATE&quot; value=&quot;${DATE}&quot;/&gt;
+  &lt;/filterset&gt;
+&lt;/copy&gt;
+</PRE></BLOCKQUOTE>
+
+<p>You are copying the version.txt file to the dist directory from the build directory 
+but wish to replace the token %DATE* with todays date.</p>
+<BLOCKQUOTE><PRE>
+&lt;copy file=&quot;${build.home}/version.txt&quot; toFile=&quot;${dist.home}/version.txt&quot;&gt;
+  &lt;filterset begintoken=&quot;%&quot; endtoken=&quot;*&quot;&gt;
+    &lt;filter token=&quot;DATE&quot; value=&quot;${DATE}&quot;/&gt;
+  &lt;/filterset&gt;
+&lt;/copy&gt;
+</PRE></BLOCKQUOTE>
+
+<p>Copy all the docs but change all dates and appropriate notices as stored in a file.</p>
+<BLOCKQUOTE><PRE>
+&lt;copy toDir=&quot;${dist.home}/docs&quot; &gt;
+  &lt;fileset dir=&quot;${build.home}/docs&quot;&gt;
+    &lt;include name=&quot;**/*.html&quot;&gt;
+  &lt;/fileset&gt;
+  &lt;filterset begintoken=&quot;%&quot; endtoken=&quot;*&quot;&gt;
+    &lt;filter token=&quot;DATE&quot; value=&quot;${DATE}&quot;/&gt;
+    &lt;filtersfile file=&quot;${user.home}/dist.properties&quot;/&gt;
+  &lt;/filterset&gt;
+&lt;/copy&gt;
+</PRE></BLOCKQUOTE>
+
+<HR>
+
+<P align=center>Copyright &copy; 2000,2001 Apache Software Foundation. All rights 
+Reserved.</P></BODY></HTML>
diff --git a/docs/manual/CoreTypes/mapper.html b/docs/manual/CoreTypes/mapper.html
index aafa38e..72f4341 100644
--- a/docs/manual/CoreTypes/mapper.html
+++ b/docs/manual/CoreTypes/mapper.html
@@ -63,6 +63,10 @@
     <td align="center" valign="top">Depends on implementation.</td>
   </tr>
 </table>
+<p>Note that Ant will not automatically convert / or \ characters in
+the <code>to</code> and <code>from</code> attributes to the correct
+directory separator of your current platform.  If you need to specify
+this separator, use <code>${file.separator}</code> instead.</p>
 <p>The classpath can be specified via a nested
 <code>&lt;classpath&gt;</code>, as well - that is,
 a <a href="../using.html#path">path</a>-like structure.</p>
diff --git a/docs/manual/CoreTypes/patternset.html b/docs/manual/CoreTypes/patternset.html
index b575d72..44d2173 100644
--- a/docs/manual/CoreTypes/patternset.html
+++ b/docs/manual/CoreTypes/patternset.html
@@ -59,7 +59,7 @@
   </tr>
   <tr>
     <td valign="top">name</td>
-    <td valign="top">the <a href=="../dirtasks.html#patterns">pattern</a>
+    <td valign="top">the <a href="../dirtasks.html#patterns">pattern</a>
       to in/exclude.</td>
     <td align="center" valign="top">Yes</td>
   </tr>
diff --git a/docs/manual/Integration/Antidote.html b/docs/manual/Integration/Antidote.html
index 5a73d82..cce9259 100644
--- a/docs/manual/Integration/Antidote.html
+++ b/docs/manual/Integration/Antidote.html
@@ -23,7 +23,7 @@
     quick generation, modification, and use of Ant build files,
     helping the user define a build process and track down build
     problems. It is not meant to be an IDE, but an enabler for the
-    powerful features available in Ant, particularlyl for novice
+    powerful features available in Ant, particularly for novice
     users, or users who want a rapid way of controlling their build
     process.</P>
 
@@ -59,36 +59,25 @@
 
     <H2>Getting Involved</H2>
 
-    <P>The source code for Antidote is included with the <A
-    HREF="http://jakarta.apache.org/site/cvsindex.html">CVS</A>
-    version of <A
-    HREF="http://jakarta.apache.org/cvsweb/index.cgi/jakarta-ant">Ant</A>,
-    starting in the directory <A
-    HREF="http://jakarta.apache.org/cvsweb/index.cgi/jakarta-ant/src/antidote">
-    jakarta-ant/src/antidote</A>. All the existing documentation can
+    <P>The source code for Antidote is located in a separate Module 
+    (<a href="http://cvs.apache.org/viewcvs/jakarta-ant-antidote/">jakarta-ant-antidote</a>) in CVS.
+    All the existing documentation can
     be found there where new contributors should read:
     <UL>
-      <LI><A
-      HREF="http://jakarta.apache.org/cvsweb/index.cgi/~checkout~/jakarta-ant/src/antidote/docs/design-overview.html">Design
-      Overview</A></LI> 
-      <LI><A HREF="http://jakarta.apache.org/cvsweb/index.cgi/~checkout~/jakarta-ant/src/antidote/docs/gui-requirements.html">Feature List</A></LI>
-      <LI><A
-      HREF="http://jakarta.apache.org/cvsweb/index.cgi/~checkout~/jakarta-ant/src/antidote/docs/gui-ideas.txt">Idea Refinement</A></LI>
-      <LI><A
-      HREF="http://jakarta.apache.org/cvsweb/index.cgi/~checkout~/jakarta-ant/src/antidote/docs/new-module-howto.html">New Module HOWTO</A></LI>
-      <LI><A
-      HREF="http://jakarta.apache.org/cvsweb/index.cgi/~checkout~/jakarta-ant/src/antidote/docs/uml/index.html">Static
-      Class Diagrams</A></LI>
+      <LI><A HREF="http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant-antidote/docs/developer/design/design-overview.html">Design Overview</A></LI> 
+      <LI><A HREF="http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant-antidote/docs/developer/design/gui-requirements.html">Feature List</A></LI>
+      <LI><A HREF="http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant-antidote/docs/developer/design/gui-ideas.txt">Idea Refinement</A></LI>
+      <LI><A HREF="http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant-antidote/docs/developer/design/new-module-howto.html">New Module HOWTO</A></LI>
+      <LI><A HREF="http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant-antidote/docs/developer/design/uml/index.html">Static Class Diagrams</A></LI>
     </UL>
 
-
     <P>Online discussions about Antidote occur on the <A
     HREF="http://jakarta.apache.org/site/mail.html">jakarta-ant
     mailing list</A>. The application infrastructure is fairly
-    complete, but there are almost unlimited oppotunities for feature
+    complete, but there are almost unlimited opportunities for feature
     contributions.
 
-    <P>Asipring contributors new to the Jakarta Project should
+    <P>Aspiring contributors new to the Jakarta Project should
     (carefully) read the following for details on the contribution
     process:
     <UL>
@@ -104,7 +93,7 @@
     
 
     <HR>
-    <P ALIGN="center">Copyright &copy; 2000 Apache Software Foundation. All
+    <P ALIGN="center">Copyright &copy; 2000,2001 Apache Software Foundation. All
     rights Reserved.</P>
 
   </BODY>
diff --git a/docs/manual/Integration/VAJAntTool.html b/docs/manual/Integration/VAJAntTool.html
index ea6ecab..174eee8 100644
--- a/docs/manual/Integration/VAJAntTool.html
+++ b/docs/manual/Integration/VAJAntTool.html
@@ -19,18 +19,20 @@
 <h2>Table of Contents</h2>
 <ul>
   <li><a href="#introduction">Introduction</a></li>
-  <li><a href="#tasks">The Tasks</a><a href="#introduction"></a></li>
-  <ul>
-    <li><a href="#vajload">VAJLoad</a></li>
-    <li><a href="#vajexport">VAJExport</a></li>
-    <li><a href="#vajimport">VAJImport</a></li>
-  </ul>
+  <li><a href="#tasks">The Tasks</a><a href="#introduction"></a>
+    <ul>
+      <li><a href="#vajload">VAJLoad</a></li>
+      <li><a href="#vajexport">VAJExport</a></li>
+      <li><a href="#vajimport">VAJImport</a></li>
+    </ul>
+  </li>
   <li><a href="#sample_buildfile">A sample build file</a><br></li>
-  <li><a href="#plugin">The Plugin</a></li>
-  <ul>
-    <li><a href="#installation">Installation</a></li>
-    <li><a href="#usage">Usage</a></li>
-  </ul>
+  <li><a href="#plugin">The Plugin</a>
+    <ul>
+      <li><a href="#installation">Installation</a></li>
+      <li><a href="#usage">Usage</a></li>
+    </ul>
+  </li>
   <li><a href="#faq">Frequently Asked Questions</a></li>
   <li><a href="#va_versions">Visual Age Versions</a></li>
   <li><a href="#history">History</a><a href="#history"></a></li>
@@ -114,8 +116,8 @@
 <h3>Example</h3>
 <pre>
 &lt;vajload&gt;
-    &lt;vajproject name="My Testcases" version="1.7beta" /&gt;
-    &lt;vajproject name="JUnit" version="3.2" /&gt;
+    &lt;vajproject name=&quot;My Testcases&quot; version=&quot;1.7beta&quot; /&gt;
+    &lt;vajproject name=&quot;JUnit&quot; version=&quot;3.2&quot; /&gt;
 &lt;/vajload&gt;
 </pre>
 
@@ -125,7 +127,7 @@
 <h3>Description:</h3>
 <p>Exports Java source files, class files and/or resources from the workspace
 to the file system. Exports can be specified by giving the VAJ project
-name and package name(s). This works very similar to <a href="index.html#fileset">
+name and package name(s). This works very similar to <a href="../CoreTypes/fileset.html">
 FileSets</a>. </p>
 
 <h3>Parameters</h3>
@@ -143,28 +145,28 @@
      </tr>
      <tr>
        <td valign="Top">exportSources</td>
-       <td valign="Top">export source files (default: "yes")</td>
+       <td valign="Top">export source files (default: &quot;yes&quot;)</td>
        <td valign="Top" align="Center">no</td>
      </tr>
      <tr valign="Top">
        <td valign="Top">exportResources</td>
-       <td valign="Top">export resource files (default: "yes")</td>
+       <td valign="Top">export resource files (default: &quot;yes&quot;)</td>
        <td valign="Top" align="Center">no</td>
      </tr>
      <tr valign="Top">
        <td valign="Top">exportClasses</td>
-       <td valign="Top">export class files (default: "no")</td>
+       <td valign="Top">export class files (default: &quot;no&quot;)</td>
        <td valign="Top" align="Center">no</td>
      </tr>
      <tr valign="Top">
        <td valign="Top">exportDebugInfo</td>
        <td valign="Top">include debug info in exported
-       class files (default: "no")</td>
+       class files (default: &quot;no&quot;)</td>
        <td valign="Top" align="Center">no</td>
      </tr>
      <tr valign="Top">
        <td valign="Top">defaultexcludes       </td>
-       <td valign="Top">use default excludes when exporting (default: "yes")
+       <td valign="Top">use default excludes when exporting (default: &quot;yes&quot;)
        <td valign="Top" align="Center">no</td>
      </tr>
   </tbody>
@@ -212,9 +214,9 @@
 
 <h3>Example</h3>
 <pre>
-&lt;vajexport destdir="${src.dir}" exportResources="no"&gt;
-    &lt;include name="MyProject/**"/&gt;
-    &lt;exclude name="MyProject/test/**"/&gt;
+&lt;vajexport destdir=&quot;${src.dir}&quot; exportResources=&quot;no&quot;&gt;
+    &lt;include name=&quot;MyProject/**&quot;/&gt;
+    &lt;exclude name=&quot;MyProject/test/**&quot;/&gt;
 &lt;/vajexport&gt;
 </pre>
 This example exports all packages in the VAJ project 'MyProject', except
@@ -268,7 +270,7 @@
 <h3>Parameters specified as nested elements</h3>
 
 <h4>fileset</h4>
-A <a href="index.html#fileset">FileSet</a> specifies the files to import.
+A <a href="../CoreTypes/fileset.html">FileSet</a> specifies the files to import.
 
 <h3>Example</h3>
 <pre>
diff --git a/docs/manual/OptionalTasks/BorlandEJBTasks.html b/docs/manual/OptionalTasks/BorlandEJBTasks.html
index 79aaf7e..c4723e2 100644
--- a/docs/manual/OptionalTasks/BorlandEJBTasks.html
+++ b/docs/manual/OptionalTasks/BorlandEJBTasks.html
@@ -9,10 +9,10 @@
 
 <h2><a name="log">BorlandDeploy</a>Tool</h2>
 <h3>Description</h3>
-<p>The BorlandDeployTool is a vendor specifc nested element for the Ejbjar optionaltask.
+<p>The BorlandDeployTool is a vendor specific nested element for the Ejbjar optional task.
 <p>BorlandDeploymentTool is dedicated to the Borland Application Server 4.5. It 
   generates and compiles the stubs and skeletons for all ejb described into the 
-  Deployement Descriptor, builds the jar file including the support files and 
+  Deployment Descriptor, builds the jar file including the support files and 
   verify whether the produced jar is valid or not.
 <h3>Borland element</h3>
 <table border="1" cellpadding="2" cellspacing="0">
@@ -55,7 +55,7 @@
     <td valign="top" width="915"><b>Deprecated</b>. Defines the location of the 
       weblogic-ejb-jar DTD which covers the Borland specific deployment descriptors. 
       This should not be necessary if you have borland in your classpath. If you 
-      do not, you should use a nested <dtd> element, described above</td>
+      do not, you should use a nested &lt;dtd&gt; element, described above</td>
     <td align="center" valign="middle" width="62">no</td>
   </tr>
   <tr> 
@@ -63,7 +63,7 @@
     <td valign="top" width="915"><b>Deprecated</b>. Defines the location of the 
       ejb-jar DTD in the weblogic class hierarchy. This should not be necessary 
       if you have weblogic in your classpath. If you do not, you should use a 
-      nested <dtd> element, described above. </td>
+      nested &lt;dtd&gt; element, described above. </td>
     <td align="center" valign="middle" width="62">no</td>
   </tr>
   <tr> 
@@ -75,7 +75,7 @@
 </table>
 
 <h3>Examples</h3>
-<p>The following build.xml snippit is an example of how to use Borland element 
+<p>The following build.xml snippet is an example of how to use Borland element 
   into the ejbjar task
 <pre>    &lt;ejbjar srcdir=&quot;${build.classes}&quot;  basejarname=&quot;vsmp&quot;  descriptordir=&quot;${rsc.dir}/hrmanager&quot;&gt;
         &lt;borland destdir=&quot;lib&quot; verify=&quot;on&quot; generateclient=&quot;on&quot;&gt;
diff --git a/docs/manual/OptionalTasks/BorlandGenerateClient.html b/docs/manual/OptionalTasks/BorlandGenerateClient.html
index cd7a993..82159d7 100644
--- a/docs/manual/OptionalTasks/BorlandGenerateClient.html
+++ b/docs/manual/OptionalTasks/BorlandGenerateClient.html
@@ -46,7 +46,7 @@
 </table>
 
 <h3>Examples</h3>
-<p>The following build.xml snippit is an example of how to use Borland element 
+<p>The following build.xml snippet is an example of how to use Borland element 
    into the ejbjar task using the java mode.
 <pre>
 &lt;blgenclient ejbjar=&quot;lib/secutest-ejb.jar&quot; clientjar=&quot;lib/client.jar&quot; debug=&quot;true&quot; mode=&quot;java&quot;&gt;
diff --git a/docs/manual/OptionalTasks/ccm.html b/docs/manual/OptionalTasks/ccm.html
index 1425c19..0b405a7 100644
--- a/docs/manual/OptionalTasks/ccm.html
+++ b/docs/manual/OptionalTasks/ccm.html
@@ -16,12 +16,12 @@
   <li><a href="#ccmcreatetask">CCMCreateTask</a></li>
 </ul>
 
-<p>These ant tasks are wrapper around Continnus Source Manager. It have been tested 
-  under version 5.1 on Windows 2000.</p>
+<p>These ant tasks are wrappers around Continuus Source Manager. They have been tested 
+  with version 5.1 on Windows 2000, but should work on other platforms with ccm installed.</p>
 <hr>
 <h2><a name="cccheckin">CCMCheckin</a></h2>
 <h3>Description</h3>
-Task to perform a Checkin command to Continnus 
+Task to checkin a file
 <h3>Parameters</h3>
 <table border="1" cellpadding="2" cellspacing="0" width="598">
   <tr> 
@@ -36,75 +36,75 @@
   </tr>
   <tr> 
     <td>comment</td>
+    <td>Specify a comment. Default is &quot;Checkin&quot; plus the date</td>
+    <td>No</td>
+  </tr>
+  <tr> 
+    <td>task</td>
+    <td>Specify the task number used to check in the file (may use 'default')</td>
+    <td>No</td>
+  </tr>
+  <tr> 
+    <td>ccmcommand</td>
+    <td>path to the ccm executable file, required if it is not on the PATH</td>
+    <td>No</td>
+  </tr>
+</table> 
+<h3>Examples</h3>
+<blockquote>
+  <pre>&lt;ccmcheckin file=&quot;c:/wa/com/foo/MyFile.java&quot;
+        comment=&quot;mycomment&quot; /&gt;
+</pre>
+</blockquote>
+<p>Checks in the file <i>c:/wa/com/foo/MyFile.java</i>. 
+  Comment attribute <i>mycomment</i> is added as a task comment. The task 
+  used is the one set as the default.</p>
+<hr>
+<h2><a name="cccheckout">CCMCheckout</a></h2>
+<h3>Description</h3>
+Task to perform a Checkout command to Continuus 
+<h3>Parameters</h3>
+<table border="1" cellpadding="2" cellspacing="0" width="614">
+  <tr> 
+    <th>Attribute</th>
+    <th>Values</th>
+    <th>Required</th>
+  </tr>
+  <tr> 
+    <td>file</td>
+    <td>Path to the file that the command will operate on</td>
+    <td>Yes</td>
+  </tr>
+  <tr> 
+    <td>comment</td>
     <td>Specify a comment.</td>
     <td>No</td>
   </tr>
   <tr> 
     <td>task</td>
-    <td>Specify the task number used to checkin the file (may use 'default')</td>
+    <td>Specify the task number used to checkin the file (may use 
+      'default')</td>
     <td>No</td>
   </tr>
   <tr> 
     <td>ccmcommand</td>
-    <td>path to the ccm excutable file. default serach into the PATH</td>
+    <td>path to the ccm executable file, required if it is not on the PATH</td>
     <td>No</td>
   </tr>
 </table>
 <h3>Examples</h3>
-<blockquote>
-  <pre>&lt;ccmcheckin file=&quot;c:/wa/com/foo/MyFile.java&quot;
-        comment=&quot;mycomment&quot; /&gt;
-</pre>
-</blockquote>
-<p>Does a Continnuus <i>checkin</i> on the file <i>c:/wa/com/foo/MyFile.java</i>. 
-  Comment attribute <i>mycomment</i> is added as a task comment. The task 
-  used is the one set as the fault.</p>
-<hr>
-<h2><a name="cccheckout">CCMCheckout</a></h2>
-<h3>Description</h3>
-Task to perform a Checkout command to Continuus 
-<h3>Parameters</h3>
-<table border="1" cellpadding="2" cellspacing="0" width="614">
-  <tr> 
-    <th width="84">Attribute</th>
-    <th width="396">Values</th>
-    <th width="24">Required</th>
-  </tr>
-  <tr> 
-    <td width="84">file</td>
-    <td width="396">Path to the file that the command will operate on</td>
-    <td width="24">Yes</td>
-  </tr>
-  <tr> 
-    <td width="84">comment</td>
-    <td width="396">Specify a comment.</td>
-    <td width="24">No</td>
-  </tr>
-  <tr> 
-    <td width="84">task</td>
-    <td width="396">Specify the task number used to checkin the file (may use 
-      'default')</td>
-    <td width="24">No</td>
-  </tr>
-  <tr> 
-    <td width="84">ccmcommand</td>
-    <td width="396">path to the ccm excutable file. default serach into the PATH</td>
-    <td width="24">No</td>
-  </tr>
-</table>
-<h3>Examples</h3>
 <blockquote> 
-  <pre>&lt;ccmcheckin file=&quot;c:/wa/com/foo/MyFile.java&quot;
+  <pre>&lt;ccmcheckout file=&quot;c:/wa/com/foo/MyFile.java&quot;
         comment=&quot;mycomment&quot;/&gt;
 </pre>
 </blockquote>
-<p>Does a Continnuus <i>checkout</i> on the file <i>c:/wa/com/foo/MyFile.java</i>. 
+<p>Check out the file <i>c:/wa/com/foo/MyFile.java</i>. 
   Comment attribute <i>mycomment</i> is added as a task comment
-   The used task is the one set as the fault.</p>
+   The used task is the one set as the default.</p>
 <hr>
 <h2><a name="ccmcheckintask">CCMCheckinTask</a></h2>
 <h3>Description</h3>
-Task to perform a check in default task command to Continnuus 
+Task to perform a check in default task command to Continuus 
 <h3>Parameters</h3>
 <table border="1" cellpadding="2" cellspacing="0">
   <tr> 
@@ -119,12 +119,12 @@
   </tr>
   <tr> 
     <td>task</td>
-    <td>Specify the task number used to checkin the file (may use 'default')</td>
+    <td>Specify the task number used to check in the file (may use 'default')</td>
     <td>No</td>
   </tr>
   <tr> 
     <td>ccmcommand</td>
-    <td>path to the ccm excutable file. default serach into the PATH</td>
+    <td >path to the ccm executable file, required if it is not on the PATH</td>
     <td>No</td>
   </tr>
 </table>
@@ -133,7 +133,7 @@
   <pre>&lt;ccmcheckintask comment=&quot;blahblah/&gt;
 </pre>
 </blockquote>
-<p>Does a Checkin default task on all the checkou-ed filed in the current task.</p>
+<p>Does a Checkin default task on all the checked out files in the current task.</p>
 <hr>
 <h2><a name="ccmreconfigure">CCMReconfigure</a></h2>
 <h3>Description</h3>
@@ -162,22 +162,22 @@
   </tr>
   <tr> 
     <td>ccmcommand</td>
-    <td>path to the ccm excutable file. default serach into the PATH</td>
+    <td >path to the ccm executable file, required if it is not on the PATH</td>
     <td>No</td>
   </tr>
 </table>
 <h3>Examples</h3>
 <blockquote>
-  <pre>&lt;ccmreconfigure ccmproject=&quot;ANTCCM_TEST#BMO_1&quot; verbose=&quot;true&quot; /&gt;
-
+ <pre>&lt;ccmreconfigure ccmproject=&quot;ANTCCM_TEST#BMO_1&quot; 
+         verbose=&quot;true&quot; /&gt;
 </pre>
 </blockquote>
-<p>Does a Continuus <i>reconfiguree</i> on the project <i>ANTCCM_TEST#BMO_1</i>. 
+<p>Does a Continuus <i>reconfigure</i> on the project <i>ANTCCM_TEST#BMO_1</i>. 
 </p>
 <hr>
 <h2><a name="ccmcreatetask">CCMCreateTask</a></h2>
 <h3>Description</h3>
-Task to perform an create task command to Continuus. 
+Create a Continuus task. 
 <h3>Parameters</h3>
 <table border="1" cellpadding="2" cellspacing="0">
   <tr> 
@@ -197,7 +197,7 @@
   </tr>
   <tr> 
     <td>ccmcommand</td>
-    <td>path to the ccm excutable file. default serach into the PATH</td>
+    <td >path to the ccm executable file, required if it is not on the PATH</td>
     <td>No</td>
   </tr>
   <tr> 
@@ -223,12 +223,12 @@
 </table>
 <h3>Examples</h3>
 <blockquote> 
-  <pre>&lt;ccmcreatetask resolver=&quot;{user.name}&quot; release=&quot;ANTCCM_TEST&quot; comment=&quot;blahblah&quot; /&gt;
+  <pre>&lt;ccmcreatetask resolver=&quot;${user.name}&quot; 
+            release=&quot;ANTCCM_TEST&quot; comment=&quot;blahblah&quot; /&gt;
 </pre>
 </blockquote>
-<p>Does a Continuus <i>create task</i> for the release <i>ANTCCM_TEST</i> to the 
-  current logged person as the resolver for this task.</p>
-<p>&nbsp;</p>
+<p>Creates a task for the release <i>ANTCCM_TEST</i> with the 
+  current user as the resolver for this task.</p>
 
 </body>
 
diff --git a/docs/manual/OptionalTasks/depend.html b/docs/manual/OptionalTasks/depend.html
index d8d4293..1e6547d 100644
--- a/docs/manual/OptionalTasks/depend.html
+++ b/docs/manual/OptionalTasks/depend.html
@@ -54,41 +54,30 @@
 without having a direct relationship. With closure set, you will notice that 
 depend typically removes far more class files. </p>
 
+<p>The classpath attribute for <code>&lt;depend&gt;</code> is optional. If it is present, 
+depend will check class dependencies against classes and jars on this classpath.
+Any classes which depend on an element from this classpath and which are older 
+than that element will be deleted. A typical example where you would use this 
+facility would be where you are building a utility jar and want to make sure 
+classes which are out of date with respect to this jar are rebuilt. You should
+<b>not</b> include jars in this classpath which you do not expect to change, 
+such as the JDK runtime jar or third party jars, since doing so will just slow 
+down the dependency check. This means that if you do use a classpath for the 
+depend task it may be different from the classpath necessary to actually 
+compile your code.</p>
+
 <h3>Performance</h3> 
 
 <p> The performance of the depend task is dependent on a 
 number of factors such as class relationship complexity and how many class files 
-are out of date. The following tests have been run when build Ant itself, on the 
-author's machine using JDK1.3 </p>
-
-<table border="1" cellpadding="2" cellspacing="0">
-  <tr>
-    <td>Building Ant from clean using Javac</td>
-    <td>11 seconds</td>
-  </tr>
-  <tr>
-    <td>Building Ant from clean using Jikes</td>
-    <td>5 seconds</td>
-  </tr>
-  <tr>
-    <td>Running &lt;depend&gt; when up-to-date and no cache</td>
-    <td>4 seconds (Depend takes 2 seconds)</td>
-  </tr>
-  <tr>
-    <td>Running &lt;depend&gt; when up-to-date and with a cache</td>
-    <td>2 seconds (Depend takes 1 seconds)</td>
-  </tr>
-</table>
-
-<p> This involves compiling 177 files. The above figures are indicative only. 
-The decision about whether it is cheaper to just recompile all classes or to 
-use the depend task will depend on the size of your project and how interrelated 
-your classes are. </p>
+are out of date. The decision about whether it is cheaper to just recompile all 
+classes or to use the depend task will depend on the size of your project and 
+how interrelated your classes are. </p>
 
 
 <h3>Limitations</h3>
 
-<p> There are some dependencies which depend will not detect. </p>
+<p> There are some source dependencies which depend will not detect. </p>
 
 <ul>
 <li>If the Java compiler optimizes away a class relationship, 
@@ -112,8 +101,8 @@
   <tr>
     <td valign="top">srcDir</td>
     <td valign="top">This is the directory where the source exists. depend
-will examine this to determine which classes. If you use multiple
-source directories you can pass this a path of source directories.</td>
+will examine this to determine which classes are out of date. If you use multiple
+source directories you can pass this attribute a path of source directories.</td>
     <td valign="top" align="center">Yes</td>
   </tr>
   <tr>
@@ -137,14 +126,31 @@
 classes. Defaults to false</td>
     <td valign="top" align="center">No</td>
   </tr>
+  <tr>
+    <td valign="top">dump</td>
+    <td valign="top">If true the dependency information will be written to the debug level log
+                     </td>
+    <td valign="top" align="center">No</td>
+  </tr>
+  <tr>
+    <td valign="top">classpath</td>
+    <td valign="top">The classpath containg jars and classes for which <code>&lt;depend&gt;</code> should also
+                     check dependencies</td>
+    <td valign="top" align="center">No</td>
+  </tr>
 </table>
 
+<h3>Nested Elements</h3>
+<p><code>depend</code>'s <i>classpath</i> attribute is a 
+<a href="../using.html#path">PATH like structure</a> and can also be set
+via a nested <i>classpath</i> element.</p>
+
 <h3>Examples</h3>
 <blockquote>
-  <pre>    &lt;depend srcdir=&quot;${java.dir}&quot;
-    destdir=&quot;${build.classes}&quot;
-    cache=&quot;depcache&quot;
-    closure=&quot;yes&quot;/&gt;</pre>
+<pre>&lt;depend srcdir=&quot;${java.dir}&quot;
+        destdir=&quot;${build.classes}&quot;
+        cache=&quot;depcache&quot;
+        closure=&quot;yes&quot;/&gt;</pre>
 </blockquote>
 
 <p> In this example classes in the ${build.classes} directory will be removed if 
diff --git a/docs/manual/OptionalTasks/ejb.html b/docs/manual/OptionalTasks/ejb.html
index 736c8e6..33770fb 100644
--- a/docs/manual/OptionalTasks/ejb.html
+++ b/docs/manual/OptionalTasks/ejb.html
@@ -533,20 +533,6 @@
   <li>TOPLink for WebLogic 2.5.1-enabled entity beans</li>
 </ul>
 
-<p>This task supports two approaches to creating ejb jar files. The first 
-approach assumes a particular naming convention for deployment descriptor files. 
-For an Account bean, for example, the deployment descriptor would be named 
-<code>Account-ejb-jar.xml</code>. This naming convention allows the task to 
-distinguish deployment descriptors without relying on their positioning within a 
-source tree. It is also used to derive the name of the .jar file which is 
-generated. For the example this would be <code>Account.jar</code>. Vendor 
-specific files are assumed to be named in a similar fashion. The deployment 
-descriptor file which defines additional weblogic specific information for the 
-above bean would be <code>Account-weblogic-ejb-jar.xml</code>. The second 
-approach does not require a naming convention. This approach uses a specified a 
-jar name for the resultant ejb jar. If the jar name is present, then no naming 
-convention is required. If the jar name is not specified, then the default 
-naming convention is expected for the deployment descriptor files.</p>
 
 <p>The task works as a directory scanning task, and performs an action for each 
 deployment descriptor found. As such the includes and excludes should be set 
@@ -571,6 +557,75 @@
 any of these files are newer than the jar file the jar will be rebuilt otherwise 
 a message is logged that the jar file is up to date.</p>
 
+<h3>Naming Convention</h3>
+
+Ejbjar handles the processing of multiple beans, and it uses a set of naming 
+conventions to determine the name of the generated EJB jars. The naming convention 
+that is used is controlled by the &quot;naming&quot; attribute. It supports the 
+following values
+<ul>
+
+<li>descriptor</li>
+<p>This is the default naming scheme. The name of the generated bean is derived from the 
+name of the deployment descriptor.  For an Account bean, for example, the deployment 
+descriptor would be named <code>Account-ejb-jar.xml</code>. Vendor specific descriptors are
+located using the same naming convention. The weblogic bean, for example, would be named
+<code>Account-weblogic-ejb-jar.xml</code>. Under this arrangment, the deployment descriptors
+can be separated from the code implementing the beans, which can be useful whe the same bean code
+is deployed in separate beans. 
+</p>
+
+<p>This scheme is useful when you are using one bean per EJB jar and where you may be 
+deploying the same bean classes in different beans, with different deployment characteristics.  
+
+<li>ejb-name</li>
+<p> This naming scheme uses the &lt;ejb-name&gt; element from the deployment descriptor to
+determine the bean name. In this situation, the descriptors normally use the generic
+descriptor names, such as <code>ejb-jar.xml</code> along with any associated vendor specific descriptor
+names. For example, If the value of the &lt;ejb-name&gt; were to be given in the deployment descriptor 
+as follows:
+<pre>
+&lt;ejb-jar&gt;
+    &lt;enterprise-beans&gt;
+        &lt;entity&gt;
+            &lt;ejb-name&gt;Sample&lt;/ejb-name&gt;
+            &lt;home&gt;org.apache.ant.ejbsample.SampleHome&lt;/home&gt;
+</pre>
+
+then the name of the generated bean would be <code>Sample.jar</code> 
+</p>
+<p> This scheme is useful where you want to use the standard deployment descriptor names, which may be more
+compatible with other EJB tools. This scheme must have one bean per jar.
+</p>
+<li>directory</li>
+<p>
+In this mode, the name of the generated bean jar is derived from the directory 
+containing the deployment descriptors. Again the deployment descriptors typically use
+the standard filenames. For example, if the path to the deployment descriptor is 
+<code>/home/user/dev/appserver/dd/sample</code>, then the generated 
+bean will be named <code>sample.jar</code>
+</p>
+<p>
+This scheme is also useful when you want to use standard style descriptor names. It is often
+most useful when the  descriptors are located in the same directory as the bean source code, 
+although that is not mandatory. This scheme can handle multiple beans per jar.  
+</p>
+
+<li>basejarname</li>
+<p>
+The final scheme supported by the &lt;ejbjar&gt; task is used when you want to specify the generated
+bean jar name directly. In this case the name of the generated jar is specified by the 
+&quot;basejarname&quot; attribute. Since all generated beans will have the same name, this task should
+be only used when each descriptor is in its own directory.
+</p>
+
+<p>
+This scheme is most appropriate when you are using multiple beans per jar and only process a single 
+deployment descriptor. You typically want to specify the name of the jar and not derive it from the
+beans in the jar.
+</p>
+
+</ul>
 <h3>Parameters:</h3>
 <table border="1" cellpadding="2" cellspacing="0">
   <tr>
@@ -606,6 +661,12 @@
     <td valign="top" align="center">Yes</td>
   </tr>
   <tr>
+    <td valign="top">naming</td>
+    <td valign="top">Controls the naming convention used to name generated
+                     EJB jars. Please refer to the description above.</td>
+    <td valign="top" align="center">No</td>
+  </tr>
+  <tr>
     <td valign="top">basejarname</td>
     <td valign="top">The base name that is used for the generated jar files. 
                      If this attribute is specified, the generic jar file name 
diff --git a/docs/manual/OptionalTasks/ftp.html b/docs/manual/OptionalTasks/ftp.html
index 3108ab8..cd161b2 100644
--- a/docs/manual/OptionalTasks/ftp.html
+++ b/docs/manual/OptionalTasks/ftp.html
@@ -9,11 +9,11 @@
 
 <h2><a name="ftp">FTP</a></h2>
 <h3>Description</h3>
-<p><b>Note:</b> The ftp-task uses the NetComponents-Package which you will need to download from
-<a href="http://www.savarese.org" target="_top">http://www.savarese.org</a> and add to your classpath.</p>
 <p>The ftp task implements a basic FTP client that can send, receive,
 list, delete files, and create directories.  See below for descriptions and examples of how
 to perform each task.</p>
+<p><b>Note:</b> This task depends on external libraries not included in the Ant distribution.
+See <a href="../install.html#librarydependencies">Library Dependencies</a> for more information.</p>
 <p>The ftp task makes no attempt to determine what file system syntax is
 required by the remote server, and defaults to Unix standards.
 <i>remotedir</i> must be specified in the exact syntax required by the ftp
diff --git a/docs/manual/OptionalTasks/icontract.html b/docs/manual/OptionalTasks/icontract.html
index 3d54c93..f57fe52 100644
--- a/docs/manual/OptionalTasks/icontract.html
+++ b/docs/manual/OptionalTasks/icontract.html
@@ -16,8 +16,7 @@
  The task can generate a properties file for <a href="http://home.sol.no/~hellesoy/icplus.html">iControl</a>,
  a graphical user interface that lets you turn on/off assertions. iControl generates a control file that you can refer to
  from this task using the controlfile attribute.
- <p/>
-&nbsp;
+ </p>
 
 <h3>Parameters</h3>
  <table border="1" cellpadding="2" cellspacing="0">
@@ -133,13 +132,13 @@
 
  <p><b>Example:</b></p>
 
- <p/>
+ <p>
  <b>Note:</b> iContract will use the java compiler indicated by the project's
  <code>build.compiler</code> property. See documentation of the Javac task for
- more information.
- <p/>
+ more information.</p>
+ <p>
  Nested includes and excludes can be done very much the same way as any subclass
- of MatchingTask.
+ of MatchingTask.</p>
 
  <p><b>Example:</b></p>
 
diff --git a/docs/manual/OptionalTasks/jdepend.html b/docs/manual/OptionalTasks/jdepend.html
index 55a3a35..a8b1902 100644
--- a/docs/manual/OptionalTasks/jdepend.html
+++ b/docs/manual/OptionalTasks/jdepend.html
@@ -1,30 +1,27 @@
 <!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+
 <html>
 <head>
+   <title>JDepend Task</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta http-equiv="Content-Language" content="en-us">
-   <title>JDepend Task</title>
 </head>
+
 <body>
 
-<h2>
-<a NAME="JDepend"></a>JDepend</h2>
+<h2><a NAME="JDepend"></a>JDepend</h2>
 
-<h3>
-Description</h3>
+<h3>Description</h3>
 
-<P>Invokes the <a href="http://www.clarkware.com/software/JDepend.html">JDepend</a> parser.
-</P>
+<P>Invokes the <a href="http://www.clarkware.com/software/JDepend.html">JDepend</a> parser.</P>
 
-<P>
-This parser "traverses a set of Java source file directories and generates design quality metrics for each Java package".
-It allows to "automatically measure the quality of a design in terms of its extensibility, reusability, and maintainability to effectively manage and control package dependencies."
-</P>
+<P>This parser "traverses a set of Java source file directories and generates design quality metrics for each Java package".
+It allows to "automatically measure the quality of a design in terms of its extensibility, reusability, and maintainability to 
+effectively manage and control package dependencies."</P>
 
-<p>Source file directories are defined by nested <code>&lt;sourcespath&gt;</code>, see <a href="#nested">nested
-elements</a>.<BR>
-Optionally, you can also set the <code>outputfile</code> name where the output is stored. By default the task writes its report to the standard output.
-</P>
+<p>Source file directories are defined by nested <code>&lt;sourcespath&gt;</code>, see <a href="#nested">nested elements</a>.</p>
+
+<p>Optionally, you can also set the <code>outputfile</code> name where the output is stored. By default the task writes its report to the standard output.</P>
 
 <p> The task requires at least the JDepend 1.2 version. </p>	
 
@@ -32,88 +29,59 @@
 
 <p>
 
-<h3>
-Parameters</h3>
+<h3>Parameters</h3>
 
-<table BORDER CELLSPACING=0 CELLPADDING=2 >
-<tr>
-<td VALIGN=TOP><b>Attribute</b></td>
-
-<td VALIGN=TOP><b>Description</b></td>
-
-<td ALIGN=CENTER VALIGN=TOP><b>Required</b></td>
-</tr>
-
-<tr>
-<td VALIGN=TOP>outputfile</td>
-
-<td VALIGN=TOP>The output file name. If not set, the output is printed on the standard output.</td>
-
-<td ALIGN=CENTER VALIGN=TOP>No</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP>fork</td>
-
-<td VALIGN=TOP>Run the tests in a separate VM.</td>
-
-<td ALIGN=CENTER VALIGN=TOP>No, default is "off"</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP>haltonerror</td>
-
-<td VALIGN=TOP>Stop the build process if an error occurs during the jdepend analysis.</td>
-
-<td ALIGN=CENTER VALIGN=TOP>No, default is "off"</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP>timeout</td>
-
-<td VALIGN=TOP>Cancel the operation if it doesn't finish in the given time (measured in milliseconds). (Ignored if fork is disabled.)</td>
-
-<td ALIGN=CENTER VALIGN=TOP>No</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP>jvm</td>
-
-<td VALIGN=TOP>The command used to invoke the Java Virtual Machine, default is 'java'. The command is resolved by java.lang.Runtime.exec(). (Ignored if fork is disabled.)</td>
-
-<td ALIGN=CENTER VALIGN=TOP>No, default "java"</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP>dir</td>
-
-<td VALIGN=TOP>The directory to invoke the VM in. (Ignored if fork is disabled)</td>
-
-<td ALIGN=CENTER VALIGN=TOP>No</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP>classpathref</td>
-
-<td VALIGN=TOP>the classpath to use, given as reference to a PATH defined elsewhere.</td>
-
-<td ALIGN=CENTER VALIGN=TOP>No</td>
-</tr>
-
+<table BORDER=1 CELLSPACING=0 CELLPADDING=2 >
+  <tr>
+    <td VALIGN=TOP><b>Attribute</b></td>
+    <td VALIGN=TOP><b>Description</b></td>
+    <td ALIGN=CENTER VALIGN=TOP><b>Required</b></td>
+  </tr>
+  <tr>
+    <td VALIGN=TOP>outputfile</td>
+    <td VALIGN=TOP>The output file name. If not set, the output is printed on the standard output.</td>
+    <td ALIGN=CENTER VALIGN=TOP>No</td>
+  </tr>
+  <tr>
+    <td VALIGN=TOP>fork</td>
+    <td VALIGN=TOP>Run the tests in a separate VM.</td>
+    <td ALIGN=CENTER VALIGN=TOP>No, default is "off"</td>
+  </tr>
+  <tr>
+    <td VALIGN=TOP>haltonerror</td>
+    <td VALIGN=TOP>Stop the build process if an error occurs during the jdepend analysis.</td>
+    <td ALIGN=CENTER VALIGN=TOP>No, default is "off"</td>
+  </tr>
+  <tr>
+    <td VALIGN=TOP>timeout</td>
+    <td VALIGN=TOP>Cancel the operation if it doesn't finish in the given time (measured in milliseconds). (Ignored if fork is disabled.)</td>
+    <td ALIGN=CENTER VALIGN=TOP>No</td>
+  </tr>
+  <tr>
+    <td VALIGN=TOP>jvm</td>
+    <td VALIGN=TOP>The command used to invoke the Java Virtual Machine, default is 'java'. The command is resolved by java.lang.Runtime.exec(). (Ignored if fork is disabled.)</td>
+    <td ALIGN=CENTER VALIGN=TOP>No, default "java"</td>
+  </tr>
+  <tr>
+    <td VALIGN=TOP>dir</td>
+    <td VALIGN=TOP>The directory to invoke the VM in. (Ignored if fork is disabled)</td>
+    <td ALIGN=CENTER VALIGN=TOP>No</td>
+  </tr>
+  <tr>
+    <td VALIGN=TOP>classpathref</td>
+    <td VALIGN=TOP>the classpath to use, given as reference to a PATH defined elsewhere.</td>
+    <td ALIGN=CENTER VALIGN=TOP>No</td>
+  </tr>
 </table>
 
-
 <h3><a name="nested">Nested Elements</a></h3>
 
+<p><code>jdepend</code> supports two nested elements <code>&lt;classpath&gt;</code> and <code>&lt;sourcespath&gt;</code>, 
+that represent <a href="../using.html#path">PATH like structures</a>.</p> 
 
-<p><code>jdepend</code> supports two nested elements <code>&lt;classpath&gt;</code> and <code>&lt;sourcespath&gt;</code>, that represent <a href="../using.html#path">PATH like
-structures</a>. 
+<p><code>&lt;sourcespath&gt;</code> is used to define the paths of the source code to analyze.</p>
 
-<BR><code>&lt;sourcespath&gt;</code> is used to define the paths of the source code to analyze.</BR>
-</p> 
-
-<h3>
-Examples</h3>
+<h3>Examples</h3>
 
 <blockquote>
 <pre>
@@ -127,6 +95,7 @@
 
 This invokes JDepend on the <code>src</code> directory, writing the output on the standard output.
 The classpath is defined using a classpath reference.
+
 <blockquote>
 <pre>
 &lt;jdepend outputfile="docs/jdepend.txt" fork="yes">
@@ -143,8 +112,10 @@
 
 This invokes JDepend in a separate VM on the <code>src</code> and <code>testsrc</code> directories, writing the output in the <code>&lt;docs/jdepend.txt&gt;</code> file.
 The classpath is defined using nested elements. 
-<br>
+
 <hr>
 </body>
 </html>
 
+
+
diff --git a/docs/manual/OptionalTasks/junitreport.html b/docs/manual/OptionalTasks/junitreport.html
index 696836e..fa2f364 100644
--- a/docs/manual/OptionalTasks/junitreport.html
+++ b/docs/manual/OptionalTasks/junitreport.html
@@ -14,7 +14,10 @@
 or <a href="http://xml.apache.org/dist/xalan-j/old/xalan-j_1_2_2.zip">Xalan 1.2.2</a>.
 <p>
 Note:<i>For a framed format Xalan 1.2.2 will need Xerces(xerces.jar) as well as BSF(bsf.jar)
-that can be found in the distribution archive.</i>
+that can be found in the distribution archive. Xerces will need to be before any other
+parser (such as the shipped crimson). It is *highly* recommended to use Xalan2 instead
+because Xalan1 is no more supported.
+</i>
 <h3>Parameters</h3>
 <table border="1" cellpadding="2" cellspacing="0">
   <tr>
diff --git a/docs/manual/OptionalTasks/script.html b/docs/manual/OptionalTasks/script.html
index fdb8a26..9aec649 100644
--- a/docs/manual/OptionalTasks/script.html
+++ b/docs/manual/OptionalTasks/script.html
@@ -11,6 +11,8 @@
 <h3>Description</h3>
 <p>Execute a script in a 
   <a href="http://oss.software.ibm.com/developerworks/opensource/bsf/" target="_top">BSF</a> supported language.</p>
+<p><b>Note:</b> This task depends on external libraries not included in the Ant distribution.
+See <a href="../install.html#librarydependencies">Library Dependencies</a> for more information.</p>
 <p>All items (tasks, targets, etc) of the running project are
 accessible from the script, using either their <code>name</code> or
 <code>id</code> attributes.</p>
diff --git a/docs/manual/OptionalTasks/sound.html b/docs/manual/OptionalTasks/sound.html
index 1e35997..da360a2 100644
--- a/docs/manual/OptionalTasks/sound.html
+++ b/docs/manual/OptionalTasks/sound.html
@@ -19,6 +19,18 @@
 directory you specify.</p>
 
 <h3>Parameters</h3>
+<p>(none)</p>
+
+<h3>Nested Elements</h3>
+<h4>success</h4>
+<p>Specifies the sound to be played if the build succeeded.</p>
+<h4>fail</h4>
+<p>Specifies the sound to be played if the build failed.</p>
+
+<h3>Nested Element Parameters</h3>
+<p>
+The following attributes may be used on the <code>&lt;success&gt;</code> 
+and <code>&lt;fail&gt;</code> elements:</p>
 <table border="1" cellpadding="2" cellspacing="0">
   <tr>
     <td valign="top"><b>Attribute</b></td>
@@ -26,6 +38,13 @@
     <td align="center" valign="top"><b>Required</b></td>
   </tr>
   <tr>
+    <td valign="top">source</td>
+    <td valign="top">the path to a sound-file directory, or the name of a
+specific sound-file, to be played.
+    </td>
+    <td valign="top" align="center">Yes</td>
+  </tr>
+  <tr>
     <td valign="top">loops</td>
     <td valign="top">the number of extra times to play the sound-file;
       default is <code>0</code>.
@@ -40,26 +59,14 @@
     <td valign="top" align="center">No</td>
   </tr>
 </table>
-<p>
-To specify the sound-files or the sound-file directories, use the
-nested <code>&lt;success&gt;</code> and <code>&lt;fail&gt;</code> 
-elements:</p>
-<blockquote>
-<pre>
-&lt;success&gt;     the path to a sound-file directory, or the name of a
-              specific sound-file, to be played if the build succeeded.
-&lt;fail&gt;        the path to a sound-file directory, or the name of a
-              specific sound-file, to be played if the build succeeded.
-</pre>
-</blockquote>
 
 <h3>Examples</h3>
 <blockquote>
 <pre>
 &lt;target name=&quot;fun&quot; if=&quot;fun&quot; unless=&quot;fun.done&quot;&gt;
-  &lt;sound loops=&quot;2&quot;&gt;
+  &lt;sound&gt;
     &lt;success source=&quot;${user.home}/sounds/bell.wav&quot;/&gt;
-    &lt;fail source=&quot;${user.home}/sounds/ohno.wav&quot;/&gt;
+    &lt;fail source=&quot;${user.home}/sounds/ohno.wav&quot; loops=&quot;2&quot;/&gt;
   &lt;/sound&gt;
   &lt;property name=&quot;fun.done&quot; value=&quot;true&quot;/&gt;
 &lt;/target&gt;
diff --git a/docs/manual/OptionalTasks/stylebook.html b/docs/manual/OptionalTasks/stylebook.html
index e1d39f2..e52056c 100644
--- a/docs/manual/OptionalTasks/stylebook.html
+++ b/docs/manual/OptionalTasks/stylebook.html
@@ -12,6 +12,8 @@
 <p>This executes the apache Stylebook documentation generator. 
 Unlike the commandline version of this tool, all three arguments
 are required to run stylebook.</p>
+<p><b>Note:</b> This task depends on external libraries not included in the Ant distribution.
+See <a href="../install.html#librarydependencies">Library Dependencies</a> for more information.</p>
 
 <h3>Parameters</h3>
 <table border="1" cellpadding="2" cellspacing="0">
diff --git a/docs/manual/coretasklist.html b/docs/manual/coretasklist.html
index 14e5bd9..e8ba44b 100644
--- a/docs/manual/coretasklist.html
+++ b/docs/manual/coretasklist.html
@@ -15,6 +15,7 @@
 <a href="sysclasspath.html">build.sysclasspath</a><br>
 <a href="CoreTypes/patternset.html">Patternset</a><br>
 <a href="CoreTypes/fileset.html">Fileset</a><br>
+<a href="CoreTypes/filterset.html">Filterset</a><br>
 <a href="CoreTypes/mapper.html">File Mappers</a><br>
 <a href="CoreTasks/common.html">Common Attributes</a><br>
 
diff --git a/docs/manual/install.html b/docs/manual/install.html
index b060aa3..8902285 100644
--- a/docs/manual/install.html
+++ b/docs/manual/install.html
@@ -8,18 +8,18 @@
 <body>
 <h1>Installing Ant</h1>
 <h2><a name="getting">Getting Ant</a></h2>
-<h3>Binary edition</h3>
+<h3>Binary Edition</h3>
 <p>The latest stable version of Ant can be downloaded from <a
-href="http://jakarta.apache.org/builds/ant/release/v1.3/bin/">
-http://jakarta.apache.org/builds/ant/release/v1.3/bin/</a>.
+href="http://jakarta.apache.org/builds/ant/release/v1.4.1/bin/">
+http://jakarta.apache.org/builds/ant/release/v1.4.1/bin/</a>.
 
 If you like living on the edge, you can download the latest version from <a
 href="http://jakarta.apache.org/builds/ant/nightly/">http://jakarta.apache.org/builds/ant/nightly/</a>.</p>
 <h3>Source Edition</h3>
 
 <p>If you prefer the source edition, you can download the source for the latest Ant release from <a
-href="http://jakarta.apache.org/builds/ant/release/v1.3/src/">
-http://jakarta.apache.org/builds/ant/release/v1.3/src/</a>. 
+href="http://jakarta.apache.org/builds/ant/release/v1.4.1/src/">
+http://jakarta.apache.org/builds/ant/release/v1.4.1/src/</a>. 
 
 Again, if you prefer the edge, you can access 
 the code as it is being developed via CVS. The Jakarta website has details on 
@@ -38,10 +38,11 @@
 To build and use Ant, you must have a JAXP-compliant XML parser installed and 
 available on your classpath.</p>
 <p>
-The binary distribution of Ant includes the reference 
-implementation of JAXP 1.1. Please see 
+The binary distribution of Ant includes the latest version of the 
+<a href="http://xml.apache.org/crimson/index.html">Apache Crimson</a> XML parser. 
+Please see 
 <a href="http://java.sun.com/xml/" target="_top">http://java.sun.com/xml/</a> 
-for more information. 
+for more information about JAXP. 
 If you wish to use a different JAXP-compliant parser, you should remove
 <code>jaxp.jar</code> and <code>crimson.jar</code>
 from Ant's <code>lib</code> directory.
@@ -105,12 +106,12 @@
 directory is intended for JDK extensions. In particular there are security 
 restrictions on the classes which may be loaded by an extension.</p>
 
-<h3>Optional Tasks</h3>
+<h3><a name="optionalTasks">Optional Tasks</a></h3>
 <p>Ant supports a number of optional tasks. An optional task is a task which
 typically requires an external library to function. The optional tasks are 
 packaged separately from the core Ant tasks. This package is available in 
 the same download directory as the core ant distribution. The current 
-jar containing optional tasks is named <code>jakarta-ant-1.3-optional.jar</code>.
+jar containing optional tasks is named <code>jakarta-ant-1.4.1-optional.jar</code>.
 This jar should be downloaded and placed in the lib directory of your Ant 
 installation.</p> 
 
@@ -233,8 +234,8 @@
 indicated feature. Note that only one of the regexp libraries is
 needed for use with the mappers. You will also need to install the
 Ant optional jar containing the task definitions to make these
-tasks available. Please refer to the <a href="#installing">
-Installing Ant</a> section above.</p>
+tasks available. Please refer to the <a href="#optionalTasks">
+Installing Ant / Optional Tasks</a> section above.</p>
 
 <table border="1" cellpadding="2" cellspacing="0">
   <tr>
diff --git a/docs/manual/resources.html b/docs/manual/resources.html
deleted file mode 100644
index 593bf3a..0000000
--- a/docs/manual/resources.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<title>Ant User Manual</title>
-</head>
-
-<body>
-<h1>Ant Resources</h1>
-
-<h2><a name="faq">FAQ</a></h2>
-<p>There is an on-line FAQ for Ant at <a target="_top"
-href="http://jakarta.apache.org/ant/faq.html">jakarta.apache.org</a>.</p>
-
-<h2><a name="external">External Resources</a></h2>
-
-<p>There is a powerpoint presentation by Patrick Chanezon (chanezon@netscape.com)
-here: 
-<a href="http://people.netscape.com/chanezon/tech/ant/ant_preso.ppt">http://people.netscape.com/chanezon/tech/ant/ant_preso.ppt</a></p>
-
-<p>Another pres by Steve Loughran (steve_l@iseran.com)
-<a href="http://www.iseran.com/Steve/modern_development_processes.html">http://www.iseran.com/Steve/modern_development_processes.html</a></a>.</p>
-
-<p>and some articles to get ideas from here:
-<a href="http://www-106.ibm.com/developerworks/library/j-ant/?dwzone=java">http://www-106.ibm.com/developerworks/library/j-ant/?dwzone=java</a>
-<a href="http://www.javaworld.com/javaworld/jw-10-2000/jw-1020-ant.html">http://www.javaworld.com/javaworld/jw-10-2000/jw-1020-ant.html</a>
-<a href="http://jakarta.apache.org/commons/cactus/ant.html">http://jakarta.apache.org/commons/cactus/ant.html</a></p>
-
-<p>Here's another Ant presentation, made at the St. Louis Java Users
-Group meeting in March (PowerPoint):
-<a href="http://www.ociweb.com/javasig/knowledgebase/March2001/index.html">http://www.ociweb.com/javasig/knowledgebase/March2001/index.html</a></p>
-
-<p>An article about developing tasks with VAJ by Glenn McAllister can
-be found at <a href="http://www7.software.ibm.com/vad.nsf/data/document2366?OpenDocument&p=1&BCT=1&Footer=1">http://www7.software.ibm.com/vad.nsf/data/document2366?OpenDocument&amp;p=1&amp;BCT=1&amp;Footer=1</a></p>
-
-<hr>
-<p align="center">Copyright &copy; 2000,2001 Apache Software Foundation. All rights
-Reserved.</p>
-
-</body>
-</html>
-
diff --git a/docs/manual/toc.html b/docs/manual/toc.html
index f3ac396..697d0c0 100644
--- a/docs/manual/toc.html
+++ b/docs/manual/toc.html
@@ -18,7 +18,6 @@
 <a href="ide.html" target="navFrame">Editor/IDE Integration</a><br>
 <a href="develop.html">Developing with Ant</a><br>
 <a href="api/index.html" target="_top">Ant API</a><br>
-<a href="resources.html">Ant Resources</a><br>
 <a href="LICENSE">License</a><br>
 <a href="feedback.html">Feedback</a><br><br>
 <a href="credits.html">Authors</a><br>
diff --git a/docs/manual/using.html b/docs/manual/using.html
index 7c635ae..12abd42 100644
--- a/docs/manual/using.html
+++ b/docs/manual/using.html
@@ -200,7 +200,7 @@
 <code>${builddir}/classes</code>.
 This is resolved as <code>build/classes</code>.</p>
 
-<h3>Built-in Properties</h3>
+<h3><a name="built-in-props">Built-in Properties</a></h3>
 <p>Ant provides access to all system properties as if they had been
 defined using a <code>&lt;property&gt;</code> task.
 For example, <code>${os.name}</code> expands to the
@@ -216,7 +216,7 @@
 ant.project.name    the name of the project that is currently executing;
                     it is set in the name attribute of &lt;project&gt;.
 ant.java.version    the JVM version Ant detected; currently it can hold
-                    the values &quot;1.1&quot;, &quot;1.2&quot; and &quot;1.3&quot;.
+                    the values &quot;1.1&quot;, &quot;1.2&quot;, &quot;1.3&quot; and &quot;1.4&quot;.
 </pre>
 
 <h3>Example</h3>
@@ -307,7 +307,7 @@
       &lt;pathelement path=&quot;${classpath}&quot;/&gt;
     &lt;/classpath&gt;
 </pre>
-<p>can be abreviated to:</p>
+<p>can be abbreviated to:</p>
 <pre>
     &lt;classpath path=&quot;${classpath}&quot;/&gt;
 </pre>
diff --git a/docs/problems.html b/docs/problems.html
index 873e086..2610358 100644
--- a/docs/problems.html
+++ b/docs/problems.html
@@ -241,12 +241,12 @@
           Chances are that someone else may have already encountered this problem and perhaps it has been
           fixed. The next step, therefore, may be to try a nightly build of Ant to see if the 
           problem has been fixed. Nightly builds for Ant are available from the 
-          <a href="/builds/jakarta-ant/nightly/">Jakarta web site</a>. While Ant nightly
-          builds are typically quite stable and are used by <a href="/builds/gump/latest/">
+          <a href="http://www.apache.org/dist/jakarta/jakarta-ant/nightly/">Jakarta web site</a>. While Ant nightly
+          builds are typically quite stable and are used by <a href="http://www.apache.org/dist/jakarta/gump/latest/">
           Gump</a> to build many other Jakarta projects, these builds should be treated as experimental. You can 
           install and verify whether your problem has been fixed. Note that nightly builds do not build many of the
           optional tasks the come with Ant. A snapshot of these optional tasks is occasionally uploaded to the nightly 
-          download <a href="/builds/jakarta-ant/nightly/optional/">area</a>. Note that even 
+          download <a href="http://www.apache.org/dist/jakarta/jakarta-ant/nightly/optional/">area</a>. Note that even 
           this snapshot does not contain every optional task.
         </p>
                     </blockquote>
diff --git a/docs/resources.html b/docs/resources.html
index 11954c0..cf265d4 100644
--- a/docs/resources.html
+++ b/docs/resources.html
@@ -86,12 +86,95 @@
         <table border="0" cellspacing="0" cellpadding="2" width="100%">
     <tr><td bgcolor="#525D76">
       <font color="#ffffff" face="arial,helvetica,sanserif">
+        <a name="FAQs"><strong>FAQs</strong></a>
+      </font>
+    </td></tr>
+    <tr><td>
+      <blockquote>
+                          <table border="0" cellspacing="0" cellpadding="2" width="100%">
+    <tr><td bgcolor="#828DA6">
+      <font color="#ffffff" face="arial,helvetica,sanserif">
+        <a name="At Ant's website"><strong>At Ant's website</strong></a>
+      </font>
+    </td></tr>
+    <tr><td>
+      <blockquote>
+                        <p>Starting with the release of Ant 1.4 the Ant's FAQ is
+        bundled with the distribution, the most recent version can
+        always be found at the website.</p>
+                                  <table>
+              <tr>
+                  <td bgcolor="#039acc" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          FAQ
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          <a href="faq.html">http://jakarta.apache.org/ant/faq.html</a>
+        </font>
+  </td>
+      </tr>
+        </table>
+                    </blockquote>
+    </td></tr>
+  </table>
+                                  <table border="0" cellspacing="0" cellpadding="2" width="100%">
+    <tr><td bgcolor="#828DA6">
+      <font color="#ffffff" face="arial,helvetica,sanserif">
+        <a name="jGuru"><strong>jGuru</strong></a>
+      </font>
+    </td></tr>
+    <tr><td>
+      <blockquote>
+                        <p>jGuru hosts an interactive Ant discussion forum and FAQ system</p>
+                                  <table>
+              <tr>
+                  <td bgcolor="#039acc" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          Forum
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          <a href="http://www.jguru.com/forums/home.jsp?topic=Ant">http://www.jguru.com/forums/home.jsp?topic=Ant</a>
+        </font>
+  </td>
+      </tr>
+                  <tr>
+                  <td bgcolor="#039acc" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          FAQ
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          <a href="http://www.jguru.com/faq/home.jsp?topic=Ant">http://www.jguru.com/faq/home.jsp?topic=Ant</a>
+        </font>
+  </td>
+      </tr>
+        </table>
+                    </blockquote>
+    </td></tr>
+  </table>
+                    </blockquote>
+    </td></tr>
+  </table>
+        <table border="0" cellspacing="0" cellpadding="2" width="100%">
+    <tr><td bgcolor="#525D76">
+      <font color="#ffffff" face="arial,helvetica,sanserif">
         <a name="Articles and Presentations"><strong>Articles and Presentations</strong></a>
       </font>
     </td></tr>
     <tr><td>
       <blockquote>
-                        <p>This page lists articles and presentations written about Ant.  If
+                        <p>The following sections list articles and presentations written about Ant.  If
       you've written something that should be included, please post it to one
       of the mailing lists.</p>
                     </blockquote>
@@ -140,7 +223,7 @@
                       <td bgcolor="#a0ddf0" colspan="" rowspan="" 
       valign="top" align="left">
     <font color="#000000" size="-1" face="arial,helvetica,sanserif">
-          <a href="http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant/docs/ant_in_anger.html?content-type=text/html">http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant/docs/ant_in_anger.html?content-type=text/html</a>
+          <a href="ant_in_anger.html">http://jakarta.apache.org/ant/ant_in_anger.html</a>
         </font>
   </td>
       </tr>
@@ -183,7 +266,49 @@
                       <td bgcolor="#a0ddf0" colspan="" rowspan="" 
       valign="top" align="left">
     <font color="#000000" size="-1" face="arial,helvetica,sanserif">
-          <a href="http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant/docs/ant_task_guidelines.html?content-type=text/html">http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant/docs/ant_task_guidelines.html?content-type=text/html</a>
+          <a href="ant_task_guidelines.html">http://jakarta.apache.org/ant/ant_task_guidelines.html</a>
+        </font>
+  </td>
+      </tr>
+        </table>
+                    </blockquote>
+    </td></tr>
+  </table>
+                                  <table border="0" cellspacing="0" cellpadding="2" width="100%">
+    <tr><td bgcolor="#828DA6">
+      <font color="#ffffff" face="arial,helvetica,sanserif">
+        <a name="Automating the build and test process"><strong>Automating the build and test process</strong></a>
+      </font>
+    </td></tr>
+    <tr><td>
+      <blockquote>
+                        <p>This article demonstrates an approach to the automated build and test process. Working with Ant 1.3 and the JUnit test framework, it shows how to automate a process that captures pertinent information about each test suite run, generates an attractive report, and e-mails the report.</p>
+                                  <table>
+              <tr>
+                  <td bgcolor="#039acc" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          Author:
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          <a href="mailto:erik@hatcher.net">Erik Hatcher</a>
+        </font>
+  </td>
+      </tr>
+                  <tr>
+                  <td bgcolor="#039acc" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          URL:
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          <a href="http://www.ibm.com/developerworks/java/library/j-junitmail/">http://www.ibm.com/developerworks/java/library/j-junitmail/</a>
         </font>
   </td>
       </tr>
@@ -314,7 +439,7 @@
                       <td bgcolor="#a0ddf0" colspan="" rowspan="" 
       valign="top" align="left">
     <font color="#000000" size="-1" face="arial,helvetica,sanserif">
-          <a href="http://jakarta.apache.org/commons/cactus/ant.html">http://jakarta.apache.org/commons/cactus/ant.html</a>
+          <a href="http://jakarta.apache.org/cactus/howto_ant_primer.html">http://jakarta.apache.org/cactus/howto_ant_primer.html</a>
         </font>
   </td>
       </tr>
@@ -596,6 +721,48 @@
                           <table border="0" cellspacing="0" cellpadding="2" width="100%">
     <tr><td bgcolor="#828DA6">
       <font color="#ffffff" face="arial,helvetica,sanserif">
+        <a name="Ant - presented to the Tucson Java Users Group"><strong>Ant - presented to the Tucson Java Users Group</strong></a>
+      </font>
+    </td></tr>
+    <tr><td>
+      <blockquote>
+                        <p>A PowerPoint technical overview presentation on Ant.  Comes complete with a straightforward example demonstrating code compilation, JAR'ing, JUnit testing, JUnit reporting, and Zipping a distribution.  A few advanced topics are touched upon like property immutabality and using &lt;antcall&gt; to get around it, build listeners, and writing custom tasks.</p>
+                                  <table>
+              <tr>
+                  <td bgcolor="#039acc" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          Author:
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          <a href="mailto:erik@hatcher.net">Erik Hatcher</a>
+        </font>
+  </td>
+      </tr>
+                  <tr>
+                  <td bgcolor="#039acc" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          URL:
+        </font>
+  </td>
+                      <td bgcolor="#a0ddf0" colspan="" rowspan="" 
+      valign="top" align="left">
+    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
+          <a href="http://erik.hatcher.net/ant-jug.zip">http://erik.hatcher.net/ant-jug.zip</a>
+        </font>
+  </td>
+      </tr>
+        </table>
+                    </blockquote>
+    </td></tr>
+  </table>
+                                  <table border="0" cellspacing="0" cellpadding="2" width="100%">
+    <tr><td bgcolor="#828DA6">
+      <font color="#ffffff" face="arial,helvetica,sanserif">
         <a name="Ant Build Tool"><strong>Ant Build Tool</strong></a>
       </font>
     </td></tr>
diff --git a/src/etc/junit-frames.xsl b/src/etc/junit-frames.xsl
index 7924cb6..71670a9 100644
--- a/src/etc/junit-frames.xsl
+++ b/src/etc/junit-frames.xsl
@@ -6,7 +6,7 @@
 
 <!-- ======================================================================
 
-    Stylesheet to transform an XML file generated by the Ant MAudit task into
+    Stylesheet to transform an XML file generated by the Ant JUnit task into
     a set of JavaDoc-like HTML page to make pages more convenient to be browsed.
     
     It use the Xalan redirect extension to write to multiple output files.
@@ -14,8 +14,8 @@
     Note: HTML output can be made much more clean by removing non css attributes
 
     ====================================================================== -->
-<xsl:output	method="html" indent="yes"/>
-<xsl:decimal-format decimal-separator="." grouping-separator="," />
+<xsl:output method="html" indent="yes"/>
+<xsl:decimal-format decimal-separator="." grouping-separator=","/>
 
 <!--
     Xalan redirect extension writes relative file based on the parent directory
@@ -27,7 +27,7 @@
     
     This has to be invoked as follows from the command line:
     
-    java -classpath bsf.jar;xalan.jar;xerces.jar org.apache.xalan.xslt.Process -IN testsuites.xml -XSL maudit.xsl -PARAM output.dir './report'
+    java -classpath bsf.jar;xalan.jar;xerces.jar org.apache.xalan.xslt.Process -IN testsuites.xml -XSL junit-frames.xsl -PARAM output.dir './report'
 -->
 <xsl:param name="output.dir" select="'.'"/>
 
@@ -98,55 +98,65 @@
 </xsl:template>
 
 <xsl:template name="index.html">
-<HTML>
-	<HEAD><TITLE>Unit Test Results.</TITLE></HEAD>
-	<FRAMESET cols="20%,80%">
-		<FRAMESET rows="30%,70%">
-			<FRAME src="overview-frame.html" name="packageListFrame"/>
-			<FRAME src="allclasses-frame.html" name="classListFrame"/>
-		</FRAMESET>
-		<FRAME src="overview-summary.html" name="classFrame"/>
-	</FRAMESET>
+<html>
+	<head>
+		<title>Unit Test Results.</title>
+	</head>
+	<frameset cols="20%,80%">
+		<frameset rows="30%,70%">
+			<frame src="overview-frame.html" name="packageListFrame"/>
+			<frame src="allclasses-frame.html" name="classListFrame"/>
+		</frameset>
+		<frame src="overview-summary.html" name="classFrame"/>
+	</frameset>
 	<noframes>
-		<H2>Frame Alert</H2>
-		<P>
+		<h2>Frame Alert</h2>
+		<p>
 		This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
-		</P>
+		</p>
 	</noframes>
-</HTML>
+</html>
 </xsl:template>
 
-
 <!-- this is the stylesheet css to use for nearly everything -->
 <xsl:template name="stylesheet.css">
-BODY {
+body {
 	font:normal 68% verdana,arial,helvetica;
 	color:#000000;
 }
-TD {
-	FONT-SIZE: 68%
+table tr td, table tr th {
+    font-size: 68%;
 }
-P {
+table.details tr th{
+	font-weight: bold;
+	text-align:left;
+	background:#a6caf0;
+}
+table.details tr td{
+	background:#eeeee0;
+}
+
+p {
 	line-height:1.5em;
 	margin-top:0.5em; margin-bottom:1.0em;
 }
-H1 {
-	MARGIN: 0px 0px 5px; FONT: 165% verdana,arial,helvetica
+h1 {
+	margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
 }
-H2 {
-	MARGIN-TOP: 1em; MARGIN-BOTTOM: 0.5em; FONT: bold 125% verdana,arial,helvetica
+h2 {
+	margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
 }
-H3 {
-	MARGIN-BOTTOM: 0.5em; FONT: bold 115% verdana,arial,helvetica
+h3 {
+	margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
 }
-H4 {
-	MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica
+h4 {
+	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
 }
-H5 {
-	MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica
+h5 {
+	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
 }
-H6 {
-	MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica
+h6 {
+	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
 }
 .Error {
 	font-weight:bold; color:red;
@@ -154,7 +164,9 @@
 .Failure {
 	font-weight:bold; color:purple;
 }
-
+.Properties {
+  text-align:right;
+}
 </xsl:template>
 
 
@@ -165,34 +177,92 @@
      ====================================================================== -->
 <xsl:template match="testsuite" mode="class.details">
 	<xsl:variable name="package.name" select="@package"/>
-	<HTML>
-		<HEAD>
+	<html>
+		<head>
 			<xsl:call-template name="create.stylesheet.link">
 				<xsl:with-param name="package.name" select="$package.name"/>
 			</xsl:call-template>
-		</HEAD>
-		<BODY>
+      <script language="JavaScript">
+        var TestCases = new Array();
+        var cur;
+        <xsl:apply-templates select="properties"/>
+       </script>
+       <script language="JavaScript"><![CDATA[
+        function displayProperties (name) {
+          var win = window.open('','JUnitSystemProperties','scrollbars=1,resizable=1');
+          var doc = win.document.open();
+          doc.write("<html><head><title>Properties of " + name + "</title>");
+          doc.write("<style>")
+          doc.write("body {font:normal 68% verdana,arial,helvetica;	color:#000000; }");
+          doc.write("table tr td, table tr th { font-size: 68%; }");
+          doc.write("table.properties { border-collapse:collapse; border-left:solid 1 #cccccc; border-top:solid 1 #cccccc; padding:5px; }");
+          doc.write("table.properties th { text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#eeeeee; }");
+          doc.write("table.properties td { font:normal; text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#fffffff; }");
+          doc.write("h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica }");
+          doc.write("</style>");
+          doc.write("</head><body>");
+          doc.write("<h3>Properties of " + name + "</h3>");
+          doc.write("<div align=\"right\"><a href=\"javascript:window.close();\">Close</a></div>");
+          doc.write("<table class='properties'>");
+          doc.write("<tr><th>Name</th><th>Value</th></tr>");
+          for (prop in TestCases[name]) {
+            doc.write("<tr><th>" + prop + "</th><td>" + TestCases[name][prop] + "</td></tr>");
+          }
+          doc.write("</table>");
+          doc.write("</body></html>");
+          doc.close();
+          win.focus();
+        }
+      ]]>  
+      </script>
+		</head>
+		<body>
 			<xsl:call-template name="pageHeader"/>	
-			<H3>Class <xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></H3>
+			<h3>Class <xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></h3>
 
 			
-			<table border="0" cellpadding="5" cellspacing="2" width="95%">
+			<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
 				<xsl:call-template name="testsuite.test.header"/>
 				<xsl:apply-templates select="." mode="print.test"/>
 			</table>
 	
-			<H2>Tests</H2>
+			<h2>Tests</h2>
 			<p>
-			<table border="0" cellpadding="5" cellspacing="2" width="95%">
-				<xsl:call-template name="testcase.test.header"/>
+			<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+			  <!--
+			  test can even not be started at all (failure to load the class)
+			  so report the error directly
+			  -->
+				<xsl:if test="./error">
+					<tr class="Error">
+						<td colspan="4"><xsl:apply-templates select="./error"/></td>
+					</tr>
+				</xsl:if>
 				<xsl:apply-templates select="./testcase" mode="print.test"/>
 			</table>
-			
 			</p>
-		</BODY>
-	</HTML>
+      <div class="Properties">
+        <a>
+          <xsl:attribute name="href">javascript:displayProperties('<xsl:value-of select="@package"/>.<xsl:value-of select="@name"/>');</xsl:attribute>
+          Properties &gt;&gt;
+        </a>
+      </div>
+		</body>
+	</html>
 </xsl:template>
 
+  <!--
+   Write properties into a JavaScript data structure.
+   This is based on the original idea by Erik Hatcher (erik@hatcher.net)
+   -->
+  <xsl:template match="properties">
+    cur = TestCases['<xsl:value-of select="../@package"/>.<xsl:value-of select="../@name"/>'] = new Array();
+  	<xsl:for-each select="property">
+    <xsl:sort select="@name"/>
+        cur['<xsl:value-of select="@name"/>'] = '<xsl:call-template name="JS-escape"><xsl:with-param name="string" select="@value"/></xsl:call-template>';
+  	</xsl:for-each>
+  </xsl:template>
+
 
 <!-- ======================================================================
     This page is created for every package.
@@ -202,24 +272,24 @@
 <!-- list of classes in a package -->
 <xsl:template name="classes.list">
 	<xsl:param name="name"/>
-	<HTML>
-		<HEAD>
+	<html>
+		<head>
 			<xsl:call-template name="create.stylesheet.link">
 				<xsl:with-param name="package.name" select="$name"/>
 			</xsl:call-template>
-		</HEAD>
-		<BODY>
+		</head>
+		<body>
 			<table width="100%">
 				<tr>
 					<td nowrap="nowrap">
-						<H2><a href="package-summary.html" target="classFrame"><xsl:value-of select="$name"/></a></H2>
+						<h2><a href="package-summary.html" target="classFrame"><xsl:value-of select="$name"/></a></h2>
 					</td>
 				</tr>
 			</table>
 	
-			<H2>Classes</H2>
+			<h2>Classes</h2>
 			<p>
-			<TABLE WIDTH="100%">
+			<table width="100%">
 				<xsl:for-each select="/testsuites/testsuite[./@package = $name]">
 					<xsl:sort select="@name"/>
 					<tr>
@@ -228,10 +298,10 @@
 						</td>
 					</tr>
 				</xsl:for-each>
-			</TABLE>
+			</table>
 			</p>
-		</BODY>
-	</HTML>
+		</body>
+	</html>
 </xsl:template>
 
 
@@ -260,8 +330,8 @@
 </xsl:template>
 
 <xsl:template match="testsuite" mode="all.classes">
-    <!-- (ancestor::package)[last()] is buggy in MSXML3, fixed in SP1 ? -->
-    <xsl:variable name="package.name" select="@package"/>
+	<!-- (ancestor::package)[last()] is buggy in MSXML3, fixed in SP1? -->
+	<xsl:variable name="package.name" select="@package"/>
 	<tr>
 		<td nowrap="nowrap">
 			<a target="classFrame">
@@ -295,7 +365,7 @@
 			<p>
 				<table width="100%">
 					<xsl:apply-templates select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]" mode="all.packages">
-						<xsl:sort select="@name"/>
+						<xsl:sort select="@package"/>
 					</xsl:apply-templates>
 				</table>
 			</p>
@@ -321,7 +391,7 @@
 				<xsl:with-param name="package.name"/>
 			</xsl:call-template>
 		</head>
-		<body onload="open('allclasses-frame.html','classListFrame')">
+		<body>
 		<xsl:call-template name="pageHeader"/>
 		<h2>Summary</h2>
 		<xsl:variable name="testCount" select="sum(testsuite/@tests)"/>
@@ -329,22 +399,22 @@
 		<xsl:variable name="failureCount" select="sum(testsuite/@failures)"/>
 		<xsl:variable name="timeCount" select="sum(testsuite/@time)"/>
 		<xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/>
-		<table border="0" cellpadding="5" cellspacing="2" width="95%">
-		<tr bgcolor="#A6CAF0" valign="top">
-			<td><b>Tests</b></td>
-			<td><b>Failures</b></td>
-			<td><b>Errors</b></td>
-			<td><b>Success rate</b></td>
-			<td><b>Time</b></td>
+		<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+		<tr valign="top">
+			<th>Tests</th>
+			<th>Failures</th>
+			<th>Errors</th>
+			<th>Success rate</th>
+			<th>Time</th>
 		</tr>
-		<tr bgcolor="#EEEEE" valign="top">
-            <xsl:attribute name="class">
-                <xsl:choose>
-                    <xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
-                    <xsl:when test="$errorCount &gt; 0">Error</xsl:when>
-                    <xsl:otherwise>Pass</xsl:otherwise>
-                </xsl:choose>
-            </xsl:attribute>
+		<tr valign="top">
+			<xsl:attribute name="class">
+				<xsl:choose>
+					<xsl:when test="$errorCount &gt; 0">Error</xsl:when>
+					<xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
+					<xsl:otherwise>Pass</xsl:otherwise>
+				</xsl:choose>
+			</xsl:attribute>
 			<td><xsl:value-of select="$testCount"/></td>
 			<td><xsl:value-of select="$failureCount"/></td>
 			<td><xsl:value-of select="$errorCount"/></td>
@@ -364,26 +434,27 @@
 		<table border="0" width="95%">
 		<tr>
 		<td	style="text-align: justify;">
-		Note: <i>failures</i> are anticipated and checked for with assertions while <i>errors</i> are unanticipated.
+		Note: <em>failures</em> are anticipated and checked for with assertions while <em>errors</em> are unanticipated.
 		</td>
 		</tr>
 		</table>
 		
 		<h2>Packages</h2>
-		<table border="0" cellpadding="5" cellspacing="2" width="95%">
+		<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
 			<xsl:call-template name="testsuite.test.header"/>
 			<xsl:for-each select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
 				<xsl:sort select="@package" order="ascending"/>
 				<!-- get the node set containing all testsuites that have the same package -->
 				<xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = current()/@package]"/>
-				<tr bgcolor="#EEEEE" valign="top">
-				    <!-- display a failure if there is any failure/error in the package -->
-                    <xsl:attribute name="class">
-                        <xsl:choose>
-                            <xsl:when test="sum($insamepackage/@errors) + sum($insamepackage/@failures) &gt; 0">Failure</xsl:when>
-                            <xsl:otherwise>Pass</xsl:otherwise>
-                        </xsl:choose>
-                    </xsl:attribute>
+				<tr valign="top">
+					<!-- display a failure if there is any failure/error in the package -->
+					<xsl:attribute name="class">
+						<xsl:choose>
+							<xsl:when test="sum($insamepackage/@errors) &gt; 0">Error</xsl:when>
+							<xsl:when test="sum($insamepackage/@failures) &gt; 0">Failure</xsl:when>
+							<xsl:otherwise>Pass</xsl:otherwise>
+						</xsl:choose>
+					</xsl:attribute>
 					<td><a href="{translate(@package,'.','/')}/package-summary.html"><xsl:value-of select="@package"/></a></td>
 					<td><xsl:value-of select="sum($insamepackage/@tests)"/></td>
 					<td><xsl:value-of select="sum($insamepackage/@errors)"/></td>
@@ -403,13 +474,13 @@
 
 <xsl:template name="package.summary">
 	<xsl:param name="name"/>
-	<HTML>
-		<HEAD>
+	<html>
+		<head>
 			<xsl:call-template name="create.stylesheet.link">
 				<xsl:with-param name="package.name" select="$name"/>
 			</xsl:call-template>
-		</HEAD>
-		<BODY>
+		</head>
+		<body>
 			<xsl:attribute name="onload">open('package-frame.html','classListFrame')</xsl:attribute>
 			<xsl:call-template name="pageHeader"/>
 			<h3>Package <xsl:value-of select="$name"/></h3>
@@ -421,9 +492,9 @@
 			
 			<xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = $name]"/>
 			<xsl:if test="count($insamepackage) &gt; 0">
-				<H2>Classes</H2>
+				<h2>Classes</h2>
 				<p>
-				<table border="0" cellpadding="5" cellspacing="2" width="95%">
+				<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
 					<xsl:call-template name="testsuite.test.header"/>
 					<xsl:apply-templates select="$insamepackage" mode="print.test">
 						<xsl:sort select="@name"/>
@@ -431,8 +502,8 @@
 				</table>
 				</p>
 			</xsl:if>
-		</BODY>
-	</HTML>
+		</body>
+	</html>
 </xsl:template>
 
 
@@ -457,7 +528,7 @@
 <!-- create the link to the stylesheet based on the package name -->
 <xsl:template name="create.stylesheet.link">
 	<xsl:param name="package.name"/>
-	<LINK REL ="stylesheet" TYPE="text/css" TITLE="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></LINK>
+	<link rel="stylesheet" type="text/css" title="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></link>
 </xsl:template>
 
 
@@ -475,33 +546,33 @@
 
 <!-- class header -->
 <xsl:template name="testsuite.test.header">
-	<tr bgcolor="#A6CAF0" valign="top">
-		<td width="80%"><b>Name</b></td>
-		<td><b>Tests</b></td>
-		<td><b>Errors</b></td>
-		<td><b>Failures</b></td>
-		<td nowrap="nowrap"><b>Time(s)</b></td>
+	<tr valign="top">
+		<th width="80%">Name</th>
+		<th>Tests</th>
+		<th>Errors</th>
+		<th>Failures</th>
+		<th nowrap="nowrap">Time(s)</th>
 	</tr>
 </xsl:template>
 
 <!-- method header -->
 <xsl:template name="testcase.test.header">
-	<tr bgcolor="#A6CAF0" valign="top">
-		<td><b>Name</b></td>
-		<td><b>Status</b></td>
-		<td width="80%"><b>Type</b></td>
-		<td nowrap="nowrap"><b>Time(s)</b></td>
+	<tr valign="top">
+		<th>Name</th>
+		<th>Status</th>
+		<th width="80%">Type</th>
+		<th nowrap="nowrap">Time(s)</th>
 	</tr>
 </xsl:template>
 
 
 <!-- class information -->
 <xsl:template match="testsuite" mode="print.test">
-	<tr bgcolor="#EEEEE" valign="top">
+	<tr valign="top">		
 		<xsl:attribute name="class">
 			<xsl:choose>
-			    <xsl:when test="@failures[.&gt; 0]">Failure</xsl:when>
 				<xsl:when test="@errors[.&gt; 0]">Error</xsl:when>
+				<xsl:when test="@failures[.&gt; 0]">Failure</xsl:when>
 				<xsl:otherwise>Pass</xsl:otherwise>
 			</xsl:choose>
 		</xsl:attribute>
@@ -517,10 +588,11 @@
 </xsl:template>
 
 <xsl:template match="testcase" mode="print.test">
-	<tr bgcolor="#EEEEE" valign="top">
+	<tr valign="top">
 	    <xsl:attribute name="class">
 			<xsl:choose>
-				<xsl:when test="failure | error">Error</xsl:when>
+				<xsl:when test="error">Error</xsl:when>
+				<xsl:when test="failure">Failure</xsl:when>
 				<xsl:otherwise>TableRowColor</xsl:otherwise>
 			</xsl:choose>
 		</xsl:attribute>
@@ -558,7 +630,7 @@
 	<xsl:call-template name="display-failures"/>
 </xsl:template>
 
-<!-- Style for the error and failure in the tescase template -->
+<!-- Style for the error and failure in the testcase template -->
 <xsl:template name="display-failures">
 	<xsl:choose>
 		<xsl:when test="not(@message)">N/A</xsl:when>
@@ -573,10 +645,32 @@
 			<xsl:with-param name="word" select="."/>
 		</xsl:call-template>
 	</code>
-	<!-- the later is better but might be problematic for non-21" monitors... -->
+	<!-- the latter is better but might be problematic for non-21" monitors... -->
 	<!--pre><xsl:value-of select="."/></pre-->
 </xsl:template>
 
+<xsl:template name="JS-escape">
+	<xsl:param name="string"/>
+	<xsl:choose><!-- something isn't right here, basically all single quotes need to be replaced with backslash-single-quote
+		<xsl:when test="contains($string,'&apos;')">
+			<xsl:value-of select="substring-before($string,'&apos;')"/>
+			\&apos;
+			<xsl:call-template name="JS-escape">
+				<xsl:with-param name="string" select="substring-after($string,'&apos;')"/>
+			</xsl:call-template>
+		</xsl:when> -->
+		<xsl:when test="contains($string,'\')">
+			<xsl:value-of select="substring-before($string,'\')"/>\\<xsl:call-template name="JS-escape">
+				<xsl:with-param name="string" select="substring-after($string,'\')"/>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:value-of select="$string"/>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+
 <!--
 	template that will convert a carriage return into a br tag
 	@param word the text from which to convert CR to BR tag
@@ -606,6 +700,5 @@
 	<xsl:param name="value"/>
 	<xsl:value-of select="format-number($value,'0.00%')"/>
 </xsl:template>
-
 </xsl:stylesheet>
 	
diff --git a/src/etc/junit-noframes.xsl b/src/etc/junit-noframes.xsl
index 06e41ca..a7dd9ab 100644
--- a/src/etc/junit-noframes.xsl
+++ b/src/etc/junit-noframes.xsl
@@ -1,68 +1,95 @@
 <xsl:stylesheet	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-
-
-<!-- ======================================================================
-
-	Stylesheet to transform an XML file generated by the Ant MAudit task into
-	a set of JavaDoc-like HTML page to make pages more convenient to be browsed.
-	
-	It use the Xalan redirect extension to write to multiple output files.
-	
-	Note: HTML output can be made much more clean by removing non css attributes
-
-	====================================================================== -->
 <xsl:output method="html" indent="yes"/>
 <xsl:decimal-format decimal-separator="." grouping-separator="," />
 
 <xsl:template match="testsuites">
 	<HTML>
 		<HEAD>
-		<style type="text/css">
-		BODY {
-			font:normal 68% verdana,arial,helvetica;
-			color:#000000;
-		}
-		TABLE TR TD, TABLE TR TH {
-		    font-size: 68%;
-		}
-		TABLE.details TR TH{
-			font-weight: bold;
-			text-align:left;
-			background:#A6CAF0;
-		}
-		TABLE.details TR TD{
-			background:#EEEEE0;
-		}
-		
-		P {
-			line-height:1.5em;
-			margin-top:0.5em; margin-bottom:1.0em;
-		}
-		H1 {
-			MARGIN: 0px 0px 5px; FONT: 165% verdana,arial,helvetica
-		}
-		H2 {
-			MARGIN-TOP: 1em; MARGIN-BOTTOM: 0.5em; FONT: bold 125% verdana,arial,helvetica
-		}
-		H3 {
-			MARGIN-BOTTOM: 0.5em; FONT: bold 115% verdana,arial,helvetica
-		}
-		H4 {
-			MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica
-		}
-		H5 {
-			MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica
-		}
-		H6 {
-			MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica
-		}
-		.Error {
-			font-weight:bold; color:red;
-		}
-		.Failure {
-			font-weight:bold; color:purple;
-		}
-		</style>
+    <style type="text/css">
+      body {
+      	font:normal 68% verdana,arial,helvetica;
+      	color:#000000;
+      }
+      table tr td, table tr th {
+          font-size: 68%;
+      }
+      table.details tr th{
+      	font-weight: bold;
+      	text-align:left;
+      	background:#a6caf0;
+      }
+      table.details tr td{
+      	background:#eeeee0;
+      }
+      
+      p {
+      	line-height:1.5em;
+      	margin-top:0.5em; margin-bottom:1.0em;
+      }
+      h1 {
+      	margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
+      }
+      h2 {
+      	margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
+      }
+      h3 {
+      	margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
+      }
+      h4 {
+      	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+      }
+      h5 {
+      	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+      }
+      h6 {
+      	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+      }
+      .Error {
+      	font-weight:bold; color:red;
+      }
+      .Failure {
+      	font-weight:bold; color:purple;
+      }
+      .Properties {
+      	text-align:right;
+      }
+      </style>
+      <script language="JavaScript">
+        var TestCases = new Array();
+        var cur;
+        <xsl:for-each select="./testsuite">      
+            <xsl:apply-templates select="properties"/>
+        </xsl:for-each>
+
+       </script>
+       <script language="JavaScript"><![CDATA[
+        function displayProperties (name) {
+          var win = window.open('','JUnitSystemProperties','scrollbars=1,resizable=1');
+          var doc = win.document.open();
+          doc.write("<html><head><title>Properties of " + name + "</title>");
+          doc.write("<style>")
+          doc.write("body {font:normal 68% verdana,arial,helvetica;	color:#000000; }");
+          doc.write("table tr td, table tr th { font-size: 68%; }");
+          doc.write("table.properties { border-collapse:collapse; border-left:solid 1 #cccccc; border-top:solid 1 #cccccc; padding:5px; }");
+          doc.write("table.properties th { text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#eeeeee; }");
+          doc.write("table.properties td { font:normal; text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#fffffff; }");
+          doc.write("h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica }");
+          doc.write("</style>");
+          doc.write("</head><body>");
+          doc.write("<h3>Properties of " + name + "</h3>");
+          doc.write("<div align=\"right\"><a href=\"javascript:window.close();\">Close</a></div>");
+          doc.write("<table class='properties'>");
+          doc.write("<tr><th>Name</th><th>Value</th></tr>");
+          for (prop in TestCases[name]) {
+            doc.write("<tr><th>" + prop + "</th><td>" + TestCases[name][prop] + "</td></tr>");
+          }
+          doc.write("</table>");
+          doc.write("</body></html>");
+          doc.close();
+          win.focus();
+        }
+      ]]>  
+      </script>
 		</HEAD>
 		<body>
 			<a name="#top"></a>
@@ -163,14 +190,25 @@
 			<h3>TestCase <xsl:value-of select="@name"/></h3>
 			
 			<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
-				<!-- Header -->
-				<xsl:call-template name="testcase.test.header"/>
-
-				<!-- match the testcases of this package -->
-				<xsl:apply-templates select="testcase" mode="print.test"/>
+			  <xsl:call-template name="testcase.test.header"/>
+			  <!--
+			  test can even not be started at all (failure to load the class)
+			  so report the error directly
+			  -->
+				<xsl:if test="./error">
+					<tr class="Error">
+						<td colspan="4"><xsl:apply-templates select="./error"/></td>
+					</tr>
+				</xsl:if>
+				<xsl:apply-templates select="./testcase" mode="print.test"/>
 			</table>
+            <div class="Properties">
+                <a>
+			        <xsl:attribute name="href">javascript:displayProperties('<xsl:value-of select="@package"/>.<xsl:value-of select="@name"/>');</xsl:attribute>
+			        Properties &gt;&gt;
+			    </a>
+            </div>
 			<p/>
-			<xsl:apply-templates select="properties"/>
 			
 			<a href="#top">Back to top</a>
 		</xsl:for-each>
@@ -223,28 +261,17 @@
 		</table>
 	</xsl:template>
 	
-	<xsl:template match="properties">
-	<!--
-	    I have NO idea how to display properties ! :-(
-	    It takes an incredible amount of space in the page and it's
-	    really unreadable.
-	    <xsl:variable name="count" select="count(property)"/>
-	    <h3>System Properties</h3>
-		<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
-		<tr valign="top">
-			<th>Name</th>
-			<th>Value</th>
-		</tr>
-		<xsl:for-each select="property">
-			<tr valign="top">
-				<td><xsl:value-of select="@name"/></td>
-				<td><xsl:value-of select="@value"/></td>
-			</tr>
-		</xsl:for-each>
-		</table>
-	-->
-	</xsl:template>
-	
+  <!--
+   Write properties into a JavaScript data structure.
+   This is based on the original idea by Erik Hatcher (erik@hatcher.net)
+   -->
+  <xsl:template match="properties">
+    cur = TestCases['<xsl:value-of select="../@package"/>.<xsl:value-of select="../@name"/>'] = new Array();
+  	<xsl:for-each select="property">
+    <xsl:sort select="@name"/>
+        cur['<xsl:value-of select="@name"/>'] = '<xsl:call-template name="JS-escape"><xsl:with-param name="string" select="@value"/></xsl:call-template>';
+  	</xsl:for-each>
+  </xsl:template>
 	
 <!-- Page HEADER -->
 <xsl:template name="pageHeader">
@@ -345,8 +372,6 @@
 </xsl:template>
 
 
-<!-- Note : the below template error and failure are the same style
-			so just call the same style store in the toolkit template -->
 <xsl:template match="failure">
 	<xsl:call-template name="display-failures"/>
 </xsl:template>
@@ -374,6 +399,28 @@
 	<!--pre><xsl:value-of select="."/></pre-->
 </xsl:template>
 
+<xsl:template name="JS-escape">
+	<xsl:param name="string"/>
+	<xsl:choose><!-- something isn't right here, basically all single quotes need to be replaced with backslash-single-quote
+		<xsl:when test="contains($string,'&apos;')">
+			<xsl:value-of select="substring-before($string,'&apos;')"/>
+			\&apos;
+			<xsl:call-template name="JS-escape">
+				<xsl:with-param name="string" select="substring-after($string,'&apos;')"/>
+			</xsl:call-template>
+		</xsl:when> -->
+		<xsl:when test="contains($string,'\')">
+			<xsl:value-of select="substring-before($string,'\')"/>\\<xsl:call-template name="JS-escape">
+				<xsl:with-param name="string" select="substring-after($string,'\')"/>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:value-of select="$string"/>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+
 <!--
 	template that will convert a carriage return into a br tag
 	@param word the text from which to convert CR to BR tag
diff --git a/src/etc/testcases/taskdefs/optional/antlr/antlr.xml b/src/etc/testcases/taskdefs/optional/antlr/antlr.xml
index 1dec35f..a2c3988 100644
--- a/src/etc/testcases/taskdefs/optional/antlr/antlr.xml
+++ b/src/etc/testcases/taskdefs/optional/antlr/antlr.xml
@@ -2,7 +2,7 @@
 
 <project name="antlr-test" basedir="." default="test1">
 
-  <property name="tmp.dir" value="antlr.tmp"/>
+  <property name="tmp.dir" location="antlr.tmp"/>
 
 
   <target name="test1">
@@ -18,6 +18,7 @@
   </target>
 
   <target name="test3">
+    <deltree dir="${tmp.dir}"/>
     <mkdir dir="${tmp.dir}"/>
     <antlr target="antlr.g" outputdirectory="${tmp.dir}"/>
   </target>
diff --git a/src/etc/testcases/taskdefs/optional/xalan-redirect-in.xsl b/src/etc/testcases/taskdefs/optional/xalan-redirect-in.xsl
new file mode 100644
index 0000000..2271b81
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/xalan-redirect-in.xsl
@@ -0,0 +1,20 @@
+<xsl:stylesheet	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+	xmlns:lxslt="http://xml.apache.org/xslt"
+	xmlns:redirect="org.apache.xalan.xslt.extensions.Redirect"
+	extension-element-prefixes="redirect">
+<!--
+This is a test to ensure that systemid is set correctly
+for a xsl...the behavior might be dependent on Xalan1
+and Xalan2...this will be a problem to erase the files :(
+Can take as a systemid the base for the xsl document or
+the base or the JVM working dir just like: new File("xalan-redirect-out.tmp")
+-->	
+<xsl:param name="xalan-version" select="'x'"/>
+
+<xsl:template match="/">
+<redirect:write file="./xalan{$xalan-version}-redirect-out.tmp">
+	<test>This should be written to the file</test>
+</redirect:write>
+</xsl:template>
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xml b/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xml
new file mode 100644
index 0000000..e95cd64
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<root>
+    <message>éàèïù</message>
+</root>
diff --git a/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xsl b/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xsl
new file mode 100644
index 0000000..0b4bc36
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xsl
@@ -0,0 +1,10 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<xsl:template match="/">
+    <root>
+    <xsl:for-each select="/root/message">
+        <message><xsl:value-of select="."/></message>
+    </xsl:for-each>
+    </root>
+</xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/src/etc/testcases/taskdefs/optional/xsltliaison-in.xml b/src/etc/testcases/taskdefs/optional/xsltliaison-in.xml
new file mode 100644
index 0000000..fbab456
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/xsltliaison-in.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!DOCTYPE project [
+    <!ENTITY include SYSTEM "xsltliaison-include.xml">
+]>
+<project>
+    &include;
+</project>
diff --git a/src/etc/testcases/taskdefs/optional/xsltliaison-in.xsl b/src/etc/testcases/taskdefs/optional/xsltliaison-in.xsl
new file mode 100644
index 0000000..987de88
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/xsltliaison-in.xsl
@@ -0,0 +1,3 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+<xsl:include href="xsltliaison-include.xsl"/>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/src/etc/testcases/taskdefs/optional/xsltliaison-include.xml b/src/etc/testcases/taskdefs/optional/xsltliaison-include.xml
new file mode 100644
index 0000000..b925522
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/xsltliaison-include.xml
@@ -0,0 +1,2 @@
+<!-- to be included by xsltliaison-include.xsl -->
+<task/>
diff --git a/src/etc/testcases/taskdefs/optional/xsltliaison-include.xsl b/src/etc/testcases/taskdefs/optional/xsltliaison-include.xsl
new file mode 100644
index 0000000..1008094
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/xsltliaison-include.xsl
@@ -0,0 +1,3 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+<!-- to be included by xsltliaison-in.xsl -->
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/src/etc/testcases/types/description1.xml b/src/etc/testcases/types/description1.xml
new file mode 100644
index 0000000..845d840
--- /dev/null
+++ b/src/etc/testcases/types/description1.xml
@@ -0,0 +1,5 @@
+<project name="test" default="main" basedir=".">
+  <description>Test Project Description</description>
+  <target name="main">
+  </target>
+</project>
diff --git a/src/etc/testcases/types/description2.xml b/src/etc/testcases/types/description2.xml
new file mode 100644
index 0000000..4935eaa
--- /dev/null
+++ b/src/etc/testcases/types/description2.xml
@@ -0,0 +1,6 @@
+<project name="test" default="main" basedir=".">
+  <description>Multi Line
+Project Description</description>
+  <target name="main">
+  </target>
+</project>
diff --git a/src/etc/testcases/types/description3.xml b/src/etc/testcases/types/description3.xml
new file mode 100644
index 0000000..6171dd7
--- /dev/null
+++ b/src/etc/testcases/types/description3.xml
@@ -0,0 +1,6 @@
+<project name="test" default="main" basedir=".">
+  <description>Multi Instance </description>
+  <description>Project Description</description>
+  <target name="main">
+  </target>
+</project>
diff --git a/src/etc/testcases/types/description4.xml b/src/etc/testcases/types/description4.xml
new file mode 100644
index 0000000..4d2197c
--- /dev/null
+++ b/src/etc/testcases/types/description4.xml
@@ -0,0 +1,6 @@
+<project name="test" default="main" basedir=".">
+  <description>Multi Instance </description>
+  <target name="main">
+      <description>Nested Project Description</description>
+  </target>
+</project>
diff --git a/src/etc/testcases/types/filterset.xml b/src/etc/testcases/types/filterset.xml
new file mode 100644
index 0000000..9980c99
--- /dev/null
+++ b/src/etc/testcases/types/filterset.xml
@@ -0,0 +1,43 @@
+<project name="test" default="new" basedir=".">
+  <filterset id="testset.one">
+    <filter token="aaaa" value="1111"/>
+    <filter token="bbbb" value="2222"/>
+  </filterset>
+  
+  <filterset id="testset.two" beginToken="%" endToken="^">
+    <filter token="cccc" value="3333"/>
+    <filter token="dddd" value="4444"/>
+  </filterset>
+  
+  <target name="test1">
+    <delete file="dest1.txt"/>
+    <copy file="filterseta.txt" tofile="dest1.txt">
+        <filterset refid="testset.one"/> 
+    </copy>
+    <fixcrlf eol="lf" srcdir="." includes="dest1.txt"/>
+  </target>
+
+  <target name="test2">
+    <delete file="dest2.txt"/>
+    <copy file="filtersetb.txt" tofile="dest2.txt">
+        <filterset refid="testset.two"/> 
+    </copy>
+    <fixcrlf eol="lf" srcdir="." includes="dest2.txt"/>
+  </target>
+
+  <target name="test3">
+    <delete file="dest3.txt"/>
+    <copy file="filtersetc.txt" tofile="dest3.txt">
+        <filterset refid="testset.one"/> 
+        <filterset refid="testset.two"/> 
+    </copy>
+    <fixcrlf eol="lf" srcdir="." includes="dest3.txt"/>
+  </target>
+  
+  <target name="cleanup">
+    <delete file="dest1.txt" quiet="true" />
+    <delete file="dest2.txt" quiet="true" />
+    <delete file="dest3.txt" quiet="true" />
+  </target>
+
+</project>
diff --git a/src/etc/testcases/types/filterseta.txt b/src/etc/testcases/types/filterseta.txt
new file mode 100644
index 0000000..4404995
--- /dev/null
+++ b/src/etc/testcases/types/filterseta.txt
@@ -0,0 +1,2 @@
+This is a test file for filters @aaaa@
+It has two lines @bbbb@
diff --git a/src/etc/testcases/types/filtersetb.txt b/src/etc/testcases/types/filtersetb.txt
new file mode 100644
index 0000000..f49640a
--- /dev/null
+++ b/src/etc/testcases/types/filtersetb.txt
@@ -0,0 +1,5 @@
+This is a test file for filters with non default markers
+@cccc@ - should not change
+%cccc^ - should change
+^dddd% - should not change
+%dddd^ - should change
diff --git a/src/etc/testcases/types/filtersetc.txt b/src/etc/testcases/types/filtersetc.txt
new file mode 100644
index 0000000..2522d35
--- /dev/null
+++ b/src/etc/testcases/types/filtersetc.txt
@@ -0,0 +1,7 @@
+Combined filter test
+@aaaa@ - should change
+@bbbb@ - should change
+@cccc@ - should not change
+%cccc^ - should change
+^dddd% - should not change
+%dddd^ - should change
diff --git a/src/etc/testcases/types/gold/filterset1.txt b/src/etc/testcases/types/gold/filterset1.txt
new file mode 100644
index 0000000..975416f
--- /dev/null
+++ b/src/etc/testcases/types/gold/filterset1.txt
@@ -0,0 +1,2 @@
+This is a test file for filters 1111
+It has two lines 2222
diff --git a/src/etc/testcases/types/gold/filterset2.txt b/src/etc/testcases/types/gold/filterset2.txt
new file mode 100644
index 0000000..eaab021
--- /dev/null
+++ b/src/etc/testcases/types/gold/filterset2.txt
@@ -0,0 +1,5 @@
+This is a test file for filters with non default markers
+@cccc@ - should not change
+3333 - should change
+^dddd% - should not change
+4444 - should change
diff --git a/src/etc/testcases/types/gold/filterset3.txt b/src/etc/testcases/types/gold/filterset3.txt
new file mode 100644
index 0000000..3516e62
--- /dev/null
+++ b/src/etc/testcases/types/gold/filterset3.txt
@@ -0,0 +1,7 @@
+Combined filter test
+1111 - should change
+2222 - should change
+@cccc@ - should not change
+3333 - should change
+^dddd% - should not change
+4444 - should change
diff --git a/src/main/org/apache/tools/ant/AntClassLoader.java b/src/main/org/apache/tools/ant/AntClassLoader.java
index 4752c2f..93dd269 100644
--- a/src/main/org/apache/tools/ant/AntClassLoader.java
+++ b/src/main/org/apache/tools/ant/AntClassLoader.java
@@ -866,6 +866,9 @@
                 if (t instanceof ClassFormatError) {
                     throw (ClassFormatError)t;
                 }
+                else if (t instanceof NoClassDefFoundError) {
+                    throw (NoClassDefFoundError)t;
+                }
                 else {
                     throw new IOException(t.toString());
                 }
@@ -914,6 +917,7 @@
                     }
                 }
                 catch (IOException ioe) {
+                    // ioe.printStackTrace();
                     log("Exception reading component " + pathComponent , Project.MSG_VERBOSE);
                 }
             }
diff --git a/src/main/org/apache/tools/ant/DefaultLogger.java b/src/main/org/apache/tools/ant/DefaultLogger.java
index 4d990fe..3aa4db3 100644
--- a/src/main/org/apache/tools/ant/DefaultLogger.java
+++ b/src/main/org/apache/tools/ant/DefaultLogger.java
@@ -143,7 +143,12 @@
                 error.printStackTrace(err);
             }
             else {
-                err.println(error.getMessage());
+                if (error instanceof BuildException) {
+                    err.println(error.toString());
+                }
+                else {
+                    err.println(error.getMessage());
+                }
             }
         }
 
diff --git a/src/main/org/apache/tools/ant/DirectoryScanner.java b/src/main/org/apache/tools/ant/DirectoryScanner.java
index ba6d9e7..a64eac6 100644
--- a/src/main/org/apache/tools/ant/DirectoryScanner.java
+++ b/src/main/org/apache/tools/ant/DirectoryScanner.java
@@ -113,6 +113,9 @@
  * "**\test\**\XYZ*" matches all files/dirs that start with "XYZ" and where
  * there is a parent directory called test (e.g. "abc\test\def\ghi\XYZ123").
  * <p>
+ * Case sensitivity may be turned off if necessary.  By default, it is
+ * turned on.
+ * <p>
  * Example of usage:
  * <pre>
  *   String[] includes = {"**\\*.class"};
@@ -120,6 +123,7 @@
  *   ds.setIncludes(includes);
  *   ds.setExcludes(excludes);
  *   ds.setBasedir(new File("test"));
+ *   ds.setCaseSensitive(true);
  *   ds.scan();
  *
  *   System.out.println("FILES:");
@@ -132,6 +136,7 @@
  * .class files in all directories under a directory called "modules"
  *
  * @author Arnout J. Kuiper <a href="mailto:ajkuiper@wxs.nl">ajkuiper@wxs.nl</a>
+ * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a>
  */
 public class DirectoryScanner implements FileScanner {
 
@@ -208,6 +213,11 @@
     protected boolean haveSlowResults = false;
 
     /**
+     * Should the file system be treated as a case sensitive one?
+     */
+    protected boolean isCaseSensitive = true;
+
+    /**
      * Constructor.
      */
     public DirectoryScanner() {
@@ -216,7 +226,7 @@
 
     /**
      * Does the path match the start of this pattern up to the first "**".
-     +
+     *
      * <p>This is not a general purpose test and should only be used if you
      * can live with false positives.</p>
      *
@@ -226,6 +236,23 @@
      * @param str     the (non-null) string (path) to match
      */
     protected static boolean matchPatternStart(String pattern, String str) {
+        return matchPatternStart(pattern, str, true);
+    }
+
+    /**
+     * Does the path match the start of this pattern up to the first "**".
+     *
+     * <p>This is not a general purpose test and should only be used if you
+     * can live with false positives.</p>
+     *
+     * <p><code>pattern=**\\a</code> and <code>str=b</code> will yield true.
+     *
+     * @param pattern             the (non-null) pattern to match against
+     * @param str                 the (non-null) string (path) to match
+     * @param isCaseSensitive     must matches be case sensitive?
+     */
+    protected static boolean matchPatternStart(String pattern, String str,
+                                               boolean isCaseSensitive) {
         // When str starts with a File.separator, pattern has to start with a
         // File.separator.
         // When pattern starts with a File.separator, str has to start with a
@@ -258,7 +285,7 @@
             if (patDir.equals("**")) {
                 break;
             }
-            if (!match(patDir,(String)strDirs.elementAt(strIdxStart))) {
+            if (!match(patDir,(String)strDirs.elementAt(strIdxStart), isCaseSensitive)) {
                 return false;
             }
             patIdxStart++;
@@ -288,6 +315,20 @@
      *         <code>false</code> otherwise.
      */
     protected static boolean matchPath(String pattern, String str) {
+        return matchPath(pattern, str, true);
+    }
+
+    /**
+     * Matches a path against a pattern.
+     *
+     * @param pattern            the (non-null) pattern to match against
+     * @param str                the (non-null) string (path) to match
+     * @param isCaseSensitive    must a case sensitive match be done?
+     *
+     * @return <code>true</code> when the pattern matches against the string.
+     *         <code>false</code> otherwise.
+     */
+    protected static boolean matchPath(String pattern, String str, boolean isCaseSensitive) {
         // When str starts with a File.separator, pattern has to start with a
         // File.separator.
         // When pattern starts with a File.separator, str has to start with a
@@ -320,7 +361,7 @@
             if (patDir.equals("**")) {
                 break;
             }
-            if (!match(patDir,(String)strDirs.elementAt(strIdxStart))) {
+            if (!match(patDir,(String)strDirs.elementAt(strIdxStart), isCaseSensitive)) {
                 return false;
             }
             patIdxStart++;
@@ -347,7 +388,7 @@
             if (patDir.equals("**")) {
                 break;
             }
-            if (!match(patDir,(String)strDirs.elementAt(strIdxEnd))) {
+            if (!match(patDir,(String)strDirs.elementAt(strIdxEnd), isCaseSensitive)) {
                 return false;
             }
             patIdxEnd--;
@@ -386,7 +427,7 @@
                 for (int j = 0; j < patLength; j++) {
                     String subPat = (String)patDirs.elementAt(patIdxStart+j+1);
                     String subStr = (String)strDirs.elementAt(strIdxStart+i+j);
-                    if (!match(subPat,subStr)) {
+                    if (!match(subPat,subStr, isCaseSensitive)) {
                         continue strLoop;
                     }
                 }
@@ -413,7 +454,6 @@
     }
 
 
-
     /**
      * Matches a string against a pattern. The pattern contains two special
      * characters:
@@ -428,6 +468,24 @@
      *         <code>false</code> otherwise.
      */
     protected static boolean match(String pattern, String str) {
+        return match(pattern, str, true);
+    }
+
+
+    /**
+     * Matches a string against a pattern. The pattern contains two special
+     * characters:
+     * '*' which means zero or more characters,
+     * '?' which means one and only one character.
+     *
+     * @param pattern the (non-null) pattern to match against
+     * @param str     the (non-null) string that must be matched against the
+     *                pattern
+     *
+     * @return <code>true</code> when the string matches against the pattern,
+     *         <code>false</code> otherwise.
+     */
+    protected static boolean match(String pattern, String str, boolean isCaseSensitive) {
         char[] patArr = pattern.toCharArray();
         char[] strArr = str.toCharArray();
         int patIdxStart = 0;
@@ -451,21 +509,33 @@
             }
             for (int i = 0; i <= patIdxEnd; i++) {
                 ch = patArr[i];
-                if (ch != '?' && ch != strArr[i]) {
-                    return false; // Character mismatch
+                if (ch != '?') {
+                    if (isCaseSensitive && ch != strArr[i]) {
+                        return false;// Character mismatch
+                    }
+                    if (!isCaseSensitive && Character.toUpperCase(ch) !=
+                        Character.toUpperCase(strArr[i])) {
+                        return false; // Character mismatch
+                    }
                 }
             }
             return true; // String matches against pattern
         }
-
+        
         if (patIdxEnd == 0) {
             return true; // Pattern contains only '*', which matches anything
         }
 
         // Process characters before first star
         while((ch = patArr[patIdxStart]) != '*' && strIdxStart <= strIdxEnd) {
-            if (ch != '?' && ch != strArr[strIdxStart]) {
-                return false;
+            if (ch != '?') {
+                if (isCaseSensitive && ch != strArr[strIdxStart]) {
+                    return false;// Character mismatch
+                }
+                if (!isCaseSensitive && Character.toUpperCase(ch) !=
+                    Character.toUpperCase(strArr[strIdxStart])) {
+                    return false;// Character mismatch
+                }
             }
             patIdxStart++;
             strIdxStart++;
@@ -483,8 +553,14 @@
 
         // Process characters after last star
         while((ch = patArr[patIdxEnd]) != '*' && strIdxStart <= strIdxEnd) {
-            if (ch != '?' && ch != strArr[strIdxEnd]) {
-                return false;
+            if (ch != '?') {
+                if (isCaseSensitive && ch != strArr[strIdxEnd]) {
+                    return false;// Character mismatch
+                }
+                if (!isCaseSensitive && Character.toUpperCase(ch) !=
+                    Character.toUpperCase(strArr[strIdxEnd])) {
+                    return false;// Character mismatch
+                }
             }
             patIdxEnd--;
             strIdxEnd--;
@@ -520,12 +596,18 @@
             int patLength = (patIdxTmp-patIdxStart-1);
             int strLength = (strIdxEnd-strIdxStart+1);
             int foundIdx  = -1;
-strLoop:
+            strLoop:
             for (int i = 0; i <= strLength - patLength; i++) {
                 for (int j = 0; j < patLength; j++) {
                     ch = patArr[patIdxStart+j+1];
-                    if (ch != '?' && ch != strArr[strIdxStart+i+j]) {
-                        continue strLoop;
+                    if (ch != '?') {
+                        if (isCaseSensitive && ch != strArr[strIdxStart+i+j]) {
+                            continue strLoop;
+                        }
+                        if (!isCaseSensitive && Character.toUpperCase(ch) !=
+                            Character.toUpperCase(strArr[strIdxStart+i+j])) {
+                            continue strLoop;
+                        }
                     }
                 }
 
@@ -592,6 +674,15 @@
 
 
     /**
+     * Sets the case sensitivity of the file system
+     *
+     * @param specifies if the filesystem is case sensitive
+     */
+    public void setCaseSensitive(boolean isCaseSensitive) {
+        this.isCaseSensitive = isCaseSensitive;
+    }
+
+    /**
      * Sets the set of include patterns to use. All '/' and '\' characters are
      * replaced by <code>File.separatorChar</code>. So the separator used need
      * not match <code>File.separatorChar</code>.
@@ -808,7 +899,7 @@
      */
     protected boolean isIncluded(String name) {
         for (int i = 0; i < includes.length; i++) {
-            if (matchPath(includes[i],name)) {
+            if (matchPath(includes[i],name, isCaseSensitive)) {
                 return true;
             }
         }
@@ -824,7 +915,7 @@
      */
     protected boolean couldHoldIncluded(String name) {
         for (int i = 0; i < includes.length; i++) {
-            if (matchPatternStart(includes[i],name)) {
+            if (matchPatternStart(includes[i],name, isCaseSensitive)) {
                 return true;
             }
         }
@@ -840,7 +931,7 @@
      */
     protected boolean isExcluded(String name) {
         for (int i = 0; i < excludes.length; i++) {
-            if (matchPath(excludes[i],name)) {
+            if (matchPath(excludes[i],name, isCaseSensitive)) {
                 return true;
             }
         }
diff --git a/src/main/org/apache/tools/ant/FileScanner.java b/src/main/org/apache/tools/ant/FileScanner.java
index f973ac0..c8f578c 100644
--- a/src/main/org/apache/tools/ant/FileScanner.java
+++ b/src/main/org/apache/tools/ant/FileScanner.java
@@ -152,4 +152,10 @@
      * @param includes list of include patterns
      */
     public void setIncludes(String[] includes);
+    /**
+     * Sets the case sensitivity of the file system
+     *
+     * @param specifies if the filesystem is case sensitive
+     */
+    public void setCaseSensitive(boolean isCaseSensitive);
 }
diff --git a/src/main/org/apache/tools/ant/Main.java b/src/main/org/apache/tools/ant/Main.java
index e12581b..a5d0bc8 100644
--- a/src/main/org/apache/tools/ant/Main.java
+++ b/src/main/org/apache/tools/ant/Main.java
@@ -69,7 +69,6 @@
  *
  * @author duncan@x180.com
  */
-
 public class Main {
 
     /** The default build file name */
@@ -132,7 +131,7 @@
      * Entry point allowing for more options from other front ends
      */
     public static void start(String[] args, Properties additionalUserProperties,
-                             ClassLoader systemLoader) {
+                             ClassLoader coreLoader) {
         Main m = null;
 
         try {
@@ -151,7 +150,7 @@
         }
         
         try {
-            m.runBuild(systemLoader);
+            m.runBuild(coreLoader);
             System.exit(0);
         } catch (BuildException be) {
             if (m.err != System.err) {
@@ -390,7 +389,7 @@
     /**
      * Executes the build.
      */
-    private void runBuild(ClassLoader systemLoader) throws BuildException {
+    private void runBuild(ClassLoader coreLoader) throws BuildException {
 
         if (!readyToRun) {
             return;
@@ -403,7 +402,7 @@
         }
 
         final Project project = new Project();
-        project.setSystemLoader(systemLoader);
+        project.setCoreLoader(coreLoader);
         
         Throwable error = null;
 
@@ -433,15 +432,17 @@
                 
                 // first use the ProjectHelper to create the project object
                 // from the given build file.
+                String noParserMessage = 
+                    "No JAXP compliant XML parser found. Please visit http://xml.apache.org for a suitable parser";
                 try {
                     Class.forName("javax.xml.parsers.SAXParserFactory");
                     ProjectHelper.configureProject(project, buildFile);
                 } catch (NoClassDefFoundError ncdfe) {
-                    throw new BuildException("No JAXP compliant XML parser found. See http://java.sun.com/xml for the\nreference implementation.", ncdfe);
+                    throw new BuildException(noParserMessage, ncdfe);
                 } catch (ClassNotFoundException cnfe) {
-                    throw new BuildException("No JAXP compliant XML parser found. See http://java.sun.com/xml for the\nreference implementation.", cnfe);
+                    throw new BuildException(noParserMessage, cnfe);
                 } catch (NullPointerException npe) {
-                    throw new BuildException("No JAXP compliant XML parser found. See http://java.sun.com/xml for the\nreference implementation.", npe);
+                    throw new BuildException(noParserMessage, npe);
                 }
                 
                 // make sure that we have a target to execute
diff --git a/src/main/org/apache/tools/ant/Project.java b/src/main/org/apache/tools/ant/Project.java
index 745a501..9636050 100644
--- a/src/main/org/apache/tools/ant/Project.java
+++ b/src/main/org/apache/tools/ant/Project.java
@@ -59,6 +59,7 @@
 import java.text.*;
 
 import org.apache.tools.ant.types.FilterSet; 
+import org.apache.tools.ant.types.FilterSetCollection; 
 import org.apache.tools.ant.util.FileUtils; 
 
 /**
@@ -108,12 +109,13 @@
     private Hashtable taskClassDefinitions = new Hashtable();
     private Hashtable targets = new Hashtable();
     private FilterSet globalFilterSet = new FilterSet();
+    private FilterSetCollection globalFilters = new FilterSetCollection(globalFilterSet);
     private File baseDir;
 
     private Vector listeners = new Vector();
 
-    /** The system classloader - may be null */    
-    private ClassLoader systemLoader = null;
+    /** The Ant core classloader - may be null if using system loader */    
+    private ClassLoader coreLoader = null;
 
     /** Records the latest task on a thread */ 
     private Hashtable threadTasks = new Hashtable();
@@ -216,12 +218,12 @@
         setSystemProperties();
     }
 
-    public void setSystemLoader(ClassLoader systemLoader) {
-        this.systemLoader = systemLoader;
+    public void setCoreLoader(ClassLoader coreLoader) {
+        this.coreLoader = coreLoader;
     }
     
-    public ClassLoader getSystemLoader() {
-        return systemLoader;
+    public ClassLoader getCoreLoader() {
+        return coreLoader;
     }
     
     public void addBuildListener(BuildListener listener) {
@@ -671,7 +673,7 @@
      */
     public void copyFile(String sourceFile, String destFile, boolean filtering)
         throws IOException {
-        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null);
+        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null);
     }
 
     /**
@@ -685,7 +687,7 @@
      */
     public void copyFile(String sourceFile, String destFile, boolean filtering,
                          boolean overwrite) throws IOException {
-        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null, overwrite);
+        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, overwrite);
     }
 
      /**
@@ -702,7 +704,7 @@
     public void copyFile(String sourceFile, String destFile, boolean filtering,
                          boolean overwrite, boolean preserveLastModified)
         throws IOException {
-        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null, 
+        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, 
                            overwrite, preserveLastModified);
     }
 
@@ -728,7 +730,7 @@
      */
     public void copyFile(File sourceFile, File destFile, boolean filtering)
         throws IOException {
-        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null);
+        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null);
     }
 
     /**
@@ -742,7 +744,7 @@
      */
     public void copyFile(File sourceFile, File destFile, boolean filtering,
                          boolean overwrite) throws IOException {
-        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null, overwrite);
+        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, overwrite);
     }
 
     /**
@@ -759,7 +761,7 @@
     public void copyFile(File sourceFile, File destFile, boolean filtering,
                          boolean overwrite, boolean preserveLastModified)
         throws IOException {
-        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null, 
+        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, 
                            overwrite, preserveLastModified);
     }
 
diff --git a/src/main/org/apache/tools/ant/ProjectHelper.java b/src/main/org/apache/tools/ant/ProjectHelper.java
index 0d35ebe..62e1887 100644
--- a/src/main/org/apache/tools/ant/ProjectHelper.java
+++ b/src/main/org/apache/tools/ant/ProjectHelper.java
@@ -421,11 +421,7 @@
             // take care of dependencies
 
             if (depends.length() > 0) {
-                StringTokenizer tok =
-                    new StringTokenizer(depends, ",", false);
-                while (tok.hasMoreTokens()) {
-                    target.addDependency(tok.nextToken().trim());
-                }
+                target.setDepends(depends);
             }
         }
 
@@ -464,6 +460,8 @@
             if (task == null) {
                 task = new UnknownElement(tag);
                 task.setProject(project);
+                task.setTaskType(tag);
+                task.setTaskName(tag);
             }
 
             task.setLocation(new Location(buildFile.toString(), locator.getLineNumber(), locator.getColumnNumber()));
diff --git a/src/main/org/apache/tools/ant/Target.java b/src/main/org/apache/tools/ant/Target.java
index 4fd72dc..b9b861c 100644
--- a/src/main/org/apache/tools/ant/Target.java
+++ b/src/main/org/apache/tools/ant/Target.java
@@ -83,9 +83,29 @@
     public void setDepends(String depS) {
         if (depS.length() > 0) {
             StringTokenizer tok =
-                new StringTokenizer(depS, ",", false);
+                new StringTokenizer(depS, ",", true);
             while (tok.hasMoreTokens()) {
-                addDependency(tok.nextToken().trim());
+                String token = tok.nextToken().trim();
+
+                //Make sure the dependency is not empty string
+                if (token.equals("") || token.equals(",")) {
+                    throw new BuildException( "Syntax Error: Depend attribute " +
+                                              "for target \"" + getName() + 
+                                              "\" has an empty string for dependency." );
+                }
+
+                addDependency(token);
+                
+                //Make sure that depends attribute does not
+                //end in a ,
+                if (tok.hasMoreTokens()) {
+                    token = tok.nextToken();
+                    if (!tok.hasMoreTokens() || !token.equals(",")) {
+                        throw new BuildException( "Syntax Error: Depend attribute " +
+                                                  "for target \"" + getName() + 
+                                                  "\" ends with a , character" );
+                    }
+                }
             }
         }
     }
diff --git a/src/main/org/apache/tools/ant/UnknownElement.java b/src/main/org/apache/tools/ant/UnknownElement.java
index c4d9386..a96cb7d 100644
--- a/src/main/org/apache/tools/ant/UnknownElement.java
+++ b/src/main/org/apache/tools/ant/UnknownElement.java
@@ -169,4 +169,13 @@
         return task;
     }
 
+    /**
+     * Get the name to use in logging messages.
+     *
+     * @return the name to use in logging messages.
+     */
+    public String getTaskName() {
+        return realTask == null ? super.getTaskName() : realTask.getTaskName();
+    }
+
 }// UnknownElement
diff --git a/src/main/org/apache/tools/ant/XmlLogger.java b/src/main/org/apache/tools/ant/XmlLogger.java
index fcd573d..aeac5a8 100644
--- a/src/main/org/apache/tools/ant/XmlLogger.java
+++ b/src/main/org/apache/tools/ant/XmlLogger.java
@@ -136,6 +136,7 @@
             Writer out =
                 new OutputStreamWriter(new FileOutputStream(outFilename),
                                        "UTF8");
+            out.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
             out.write("<?xml:stylesheet type=\"text/xsl\" href=\"log.xsl\"?>\n\n");
                       (new DOMElementWriter()).write(buildElement.element, out, 0, "\t");
             out.flush();
@@ -200,11 +201,7 @@
         taskElement.startTime = System.currentTimeMillis();
         taskElement.element = doc.createElement(TASK_TAG);
         
-        String name = task.getClass().getName();
-        int pos = name.lastIndexOf(".");
-        if (pos != -1) {
-            name = name.substring(pos + 1);
-        }
+        String name = event.getTask().getTaskName();
         taskElement.element.setAttribute(NAME_ATTR, name);
         taskElement.element.setAttribute(LOCATION_ATTR, event.getTask().getLocation().toString());
         tasks.put(task, taskElement);
@@ -248,7 +245,7 @@
         }
         messageElement.setAttribute(PRIORITY_ATTR, name);
 
-        Text messageText = doc.createTextNode(event.getMessage());
+        Text messageText = doc.createCDATASection(event.getMessage());
         messageElement.appendChild(messageText);
 
         TimedElement parentElement = null;
diff --git a/src/main/org/apache/tools/ant/listener/Log4jListener.java b/src/main/org/apache/tools/ant/listener/Log4jListener.java
index b93082e..263cd7f 100644
--- a/src/main/org/apache/tools/ant/listener/Log4jListener.java
+++ b/src/main/org/apache/tools/ant/listener/Log4jListener.java
@@ -73,7 +73,8 @@
     public Log4jListener() {
         initialized = false;
         Category cat = Category.getInstance("org.apache.tools.ant");
-        if (!(cat.getAllAppenders() instanceof NullEnumeration)) {
+        Category rootCat = Category.getRoot();
+        if (!(rootCat.getAllAppenders() instanceof NullEnumeration)) {
             initialized = true;
         }
         else {
@@ -90,7 +91,7 @@
     
     public void buildFinished(BuildEvent event) {
         if (initialized) {
-            Category cat = Category.getInstance(Target.class.getName());
+            Category cat = Category.getInstance(Project.class.getName());
             if (event.getException() == null) {
                 cat.info("Build finished.");
             }
diff --git a/src/main/org/apache/tools/ant/taskdefs/Ant.java b/src/main/org/apache/tools/ant/taskdefs/Ant.java
index 1e66a48..459b4bc 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Ant.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Ant.java
@@ -55,6 +55,7 @@
 package org.apache.tools.ant.taskdefs;
 
 import org.apache.tools.ant.*;
+import org.apache.tools.ant.util.FileUtils;
 import java.io.*;
 import java.util.*;
 
@@ -79,28 +80,40 @@
  */
 public class Ant extends Task {
 
+    /** the basedir where is executed the build file */
     private File dir = null;
+    
+    /** the build.xml file (can be absolute) in this case dir will be ignored */
     private String antFile = null;
+    
+    /** the target to call if any */
     private String target = null;
+    
+    /** the output */
     private String output = null;
+    
+    /** should we inherit properties from the parent ? */
     private boolean inheritAll = true;
-
-    Vector properties = new Vector();
-    Project p1;
+    
+    /** the properties to pass to the new project */
+    private Vector properties = new Vector();
+    
+    /** the temporary project created to run the build file */
+    private Project newProject;
 
     /**
      * If true, inherit all properties from parent Project
      * If false, inherit only userProperties and those defined
      * inside the ant call itself
-     **/
-    public void setInheritAll(boolean inherit) {
-       inheritAll = inherit;
-    } //-- setInheritAll
+     */
+    public void setInheritAll(boolean value) {
+       inheritAll = value;
+    }
 
     public void init() {
-        p1 = new Project();
-        p1.setJavaVersionProperty();
-        p1.addTaskDefinition("property", 
+        newProject = new Project();
+        newProject.setJavaVersionProperty();
+        newProject.addTaskDefinition("property", 
                              (Class)project.getTaskDefinitions().get("property"));
     }
 
@@ -108,7 +121,7 @@
         init();
         for (int i=0; i<properties.size(); i++) {
             Property p = (Property) properties.elementAt(i);
-            Property newP = (Property) p1.createTask("property");
+            Property newP = (Property) newProject.createTask("property");
             newP.setName(p.getName());
             if (p.getValue() != null) {
                 newP.setValue(p.getValue());
@@ -126,7 +139,7 @@
     private void initializeProject() {
         Vector listeners = project.getBuildListeners();
         for (int i = 0; i < listeners.size(); i++) {
-            p1.addBuildListener((BuildListener)listeners.elementAt(i));
+            newProject.addBuildListener((BuildListener)listeners.elementAt(i));
         }
 
         if (output != null) {
@@ -136,7 +149,7 @@
                 logger.setMessageOutputLevel(Project.MSG_INFO);
                 logger.setOutputPrintStream(out);
                 logger.setErrorPrintStream(out);
-                p1.addBuildListener(logger);
+                newProject.addBuildListener(logger);
             }
             catch( IOException ex ) {
                 log( "Ant: Can't set output to " + output );
@@ -148,7 +161,7 @@
         while (et.hasMoreElements()) {
             String taskName = (String) et.nextElement();
             Class taskClass = (Class) taskdefs.get(taskName);
-            p1.addTaskDefinition(taskName, taskClass);
+            newProject.addTaskDefinition(taskName, taskClass);
         }
 
         Hashtable typedefs = project.getDataTypeDefinitions();
@@ -156,7 +169,7 @@
         while (e.hasMoreElements()) {
             String typeName = (String) e.nextElement();
             Class typeClass = (Class) typedefs.get(typeName);
-            p1.addDataTypeDefinition(typeName, typeClass);
+            newProject.addDataTypeDefinition(typeName, typeClass);
         }
 
         // set user-defined or all properties from calling project
@@ -169,23 +182,24 @@
 
            // set Java built-in properties separately,
            // b/c we won't inherit them.
-           project.setSystemProperties();
+           newProject.setSystemProperties();
         }
         
         e = prop1.keys();
         while (e.hasMoreElements()) {
             String arg = (String) e.nextElement();
             String value = (String) prop1.get(arg);
-            if (inheritAll == true)
-               p1.setProperty(arg, value);
-            else
-               p1.setUserProperty(arg, value);
+            if (inheritAll == true){
+               newProject.setProperty(arg, value);
+            } else {
+               newProject.setUserProperty(arg, value);
+            }
         }
     }
 
     protected void handleOutput(String line) {
-        if (p1 != null) {
-            p1.demuxOutput(line, false);
+        if (newProject != null) {
+            newProject.demuxOutput(line, false);
         }
         else {
             super.handleOutput(line);
@@ -193,8 +207,8 @@
     }
     
     protected void handleErrorOutput(String line) {
-        if (p1 != null) {
-            p1.demuxOutput(line, true);
+        if (newProject != null) {
+            newProject.demuxOutput(line, true);
         }
         else {
             super.handleErrorOutput(line);
@@ -206,17 +220,18 @@
      */
     public void execute() throws BuildException {
         try {
-            if (p1 == null) {
+            if (newProject == null) {
                 reinit();
             }
         
-            if(dir == null) 
+            if (dir == null) {
                 dir = project.getBaseDir();
+            }
 
             initializeProject();
 
-            p1.setBaseDir(dir);
-            p1.setUserProperty("basedir" , dir.getAbsolutePath());
+            newProject.setBaseDir(dir);
+            newProject.setUserProperty("basedir" , dir.getAbsolutePath());
             
             // Override with local-defined properties
             Enumeration e = properties.elements();
@@ -225,49 +240,59 @@
                 p.execute();
             }
             
-            if (antFile == null) 
+            if (antFile == null){
                 antFile = "build.xml";
-
-            File file = new File(antFile);
-            if (!file.isAbsolute()) {
-                antFile = (new File(dir, antFile)).getAbsolutePath();
-                file = (new File(antFile)) ;
-                if( ! file.isFile() ) {
-                  throw new BuildException("Build file " + file + " not found.");
-                }
             }
 
-            p1.setUserProperty( "ant.file" , antFile );
-            ProjectHelper.configureProject(p1, new File(antFile));
+            File file = FileUtils.newFileUtils().resolveFile(dir, antFile);
+            antFile = file.getAbsolutePath();
+
+            newProject.setUserProperty( "ant.file" , antFile );
+            ProjectHelper.configureProject(newProject, new File(antFile));
             
             if (target == null) {
-                target = p1.getDefaultTarget();
+                target = newProject.getDefaultTarget();
             }
 
             // Are we trying to call the target in which we are defined?
-            if (p1.getBaseDir().equals(project.getBaseDir()) &&
-                p1.getProperty("ant.file").equals(project.getProperty("ant.file")) &&
+            if (newProject.getBaseDir().equals(project.getBaseDir()) &&
+                newProject.getProperty("ant.file").equals(project.getProperty("ant.file")) &&
                 getOwningTarget() != null &&
                 target.equals(this.getOwningTarget().getName())) { 
 
                 throw new BuildException("ant task calling its own parent target");
             }
 
-            p1.executeTarget(target);
+            newProject.executeTarget(target);
         } finally {
             // help the gc
-            p1 = null;
+            newProject = null;
         }
     }
 
+    /**
+     * ...
+     */
     public void setDir(File d) {
         this.dir = d;
     }
 
+    /**
+     * set the build file, it can be either absolute or relative.
+     * If it is absolute, <tt>dir</tt> will be ignored, if it is
+     * relative it will be resolved relative to <tt>dir</tt>.
+     */
     public void setAntfile(String s) {
+        // @note: it is a string and not a file to handle relative/absolute
+        // otherwise a relative file will be resolved based on the current
+        // basedir.
         this.antFile = s;
     }
 
+    /**
+     * set the target to execute. If none is defined it will
+     * execute the default target of the build file
+     */
     public void setTarget(String s) {
         this.target = s;
     }
@@ -276,12 +301,12 @@
         this.output = s;
     }
 
+    /** create a property to pass to the new project as a 'user property' */
     public Property createProperty() {
-        if (p1 == null) {
+        if (newProject == null) {
             reinit();
         }
-
-        Property p=(Property)p1.createTask("property");
+        Property p=(Property)newProject.createTask("property");
         p.setUserProperty(true);
         properties.addElement( p );
         return p;
diff --git a/src/main/org/apache/tools/ant/taskdefs/AntStructure.java b/src/main/org/apache/tools/ant/taskdefs/AntStructure.java
index 6157659..0e7b1a2 100644
--- a/src/main/org/apache/tools/ant/taskdefs/AntStructure.java
+++ b/src/main/org/apache/tools/ant/taskdefs/AntStructure.java
@@ -146,7 +146,7 @@
 
     private void printHead(PrintWriter out, Enumeration tasks, 
                            Enumeration types) {
-        out.println("<?xml version=\"1.0\" ?>");
+        out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
         out.println("<!ENTITY % boolean \"(true|false|on|off|yes|no)\">");
         out.print("<!ENTITY % tasks \"");
         boolean first = true;
diff --git a/src/main/org/apache/tools/ant/taskdefs/Copy.java b/src/main/org/apache/tools/ant/taskdefs/Copy.java
index 28c9627..89c680b 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Copy.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Copy.java
@@ -365,14 +365,14 @@
                 try {
                     log("Copying " + fromFile + " to " + toFile, verbosity);
                     
-                    FilterSet executionFilterSet = new FilterSet();
+                    FilterSetCollection executionFilters = new FilterSetCollection();
                     if (filtering) {
-                        executionFilterSet.addFilterSet(project.getGlobalFilterSet());
+                        executionFilters.addFilterSet(project.getGlobalFilterSet());
                     }
                     for (Enumeration filterEnum = filterSets.elements(); filterEnum.hasMoreElements();) {
-                        executionFilterSet.addFilterSet((FilterSet)filterEnum.nextElement());
+                        executionFilters.addFilterSet((FilterSet)filterEnum.nextElement());
                     }
-                    fileUtils.copyFile(fromFile, toFile, executionFilterSet,
+                    fileUtils.copyFile(fromFile, toFile, executionFilters,
                                        forceOverwrite, preserveLastModified);
                 } catch (IOException ioe) {
                     String msg = "Failed to copy " + fromFile + " to " + toFile
diff --git a/src/main/org/apache/tools/ant/taskdefs/DependSet.java b/src/main/org/apache/tools/ant/taskdefs/DependSet.java
index 35f8b0c..215f585 100644
--- a/src/main/org/apache/tools/ant/taskdefs/DependSet.java
+++ b/src/main/org/apache/tools/ant/taskdefs/DependSet.java
@@ -187,7 +187,7 @@
            for (int i = 0; i < targetFiles.length; i++) {
                     
               File dest = new File(targetFS.getDir(project), targetFiles[i]);
-              allTargets.add(dest);
+              allTargets.addElement(dest);
 
               if (dest.lastModified() > now) {
                  log("Warning: "+targetFiles[i]+" modified in the future.", 
@@ -215,7 +215,7 @@
                  continue;
               }
               else {
-                 allTargets.add(dest);
+                 allTargets.addElement(dest);
               }
               if (dest.lastModified() > now) {
                  log("Warning: "+targetFiles[i]+" modified in the future.", 
diff --git a/src/main/org/apache/tools/ant/taskdefs/ExecuteJava.java b/src/main/org/apache/tools/ant/taskdefs/ExecuteJava.java
index d3e9398..f94cdd8 100644
--- a/src/main/org/apache/tools/ant/taskdefs/ExecuteJava.java
+++ b/src/main/org/apache/tools/ant/taskdefs/ExecuteJava.java
@@ -114,7 +114,7 @@
             if (classpath == null) {
                 target = Class.forName(classname);
             } else {
-                loader = new AntClassLoader(project.getSystemLoader(), project, classpath, false);
+                loader = new AntClassLoader(project.getCoreLoader(), project, classpath, false);
                 loader.setIsolated(true);
                 loader.setThreadContextLoader();
                 target = loader.forceLoadClass(classname);
diff --git a/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java b/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java
index 398385a..31ee4a4 100644
--- a/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java
+++ b/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java
@@ -330,7 +330,14 @@
             }
 
         } else { // no targetFilePos
+
+            // 0 --> srcIndex
             System.arraycopy(orig, 0, result, 0, srcIndex);
+            // srcIndex --> end
+            System.arraycopy(orig, srcIndex, result, 
+                             srcIndex + srcFiles.length,
+                             orig.length - srcIndex);
+
         }
 
         // fill in source file names
diff --git a/src/main/org/apache/tools/ant/taskdefs/Jar.java b/src/main/org/apache/tools/ant/taskdefs/Jar.java
index c60fa91..8f6fe70 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Jar.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Jar.java
@@ -70,7 +70,9 @@
 
     private File manifestFile;
     private Manifest manifest;
-    private Manifest execManifest;    
+    private Manifest execManifest;  
+    
+    /** true if a manifest has been specified in the task */
     private boolean buildFileManifest = false;
     
     public Jar() {
@@ -138,20 +140,29 @@
         throws IOException, BuildException
     {
         try {
-            // If no manifest is specified, add the default one.
-            if (manifest == null) {
-                execManifest = null;
-            }
-            else {
-                execManifest = new Manifest();
+            execManifest = getDefaultManifest();
+
+            if (manifest != null) {
                 execManifest.merge(manifest);
             }
+            for (Enumeration e = execManifest.getWarnings(); e.hasMoreElements(); ) {
+                log("Manifest warning: " + (String)e.nextElement(), Project.MSG_WARN);
+            }
+        
             zipDir(null, zOut, "META-INF/");
+            // time to write the manifest
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            PrintWriter writer = new PrintWriter(baos);
+            execManifest.write(writer);
+            writer.flush();
+        
+            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+            super.zipFile(bais, zOut, "META-INF/MANIFEST.MF", System.currentTimeMillis());
             super.initZipOutputStream(zOut);
         }
         catch (ManifestException e) {
-                log("Manifest is invalid: " + e.getMessage(), Project.MSG_ERR);
-                throw new BuildException("Invalid Manifest", e, getLocation());
+            log("Manifest is invalid: " + e.getMessage(), Project.MSG_ERR);
+            throw new BuildException("Invalid Manifest", e, getLocation());
         }
     }
         
@@ -172,28 +183,6 @@
         }
     }   
     
-    protected void finalizeZipOutputStream(ZipOutputStream zOut)
-        throws IOException, BuildException {
-
-        if (execManifest == null) {
-            execManifest = getDefaultManifest();
-        }
-
-        for (Enumeration e = execManifest.getWarnings(); e.hasMoreElements(); ) {
-            log("Manifest warning: " + (String)e.nextElement(), Project.MSG_WARN);
-        }
-        
-        // time to write the manifest
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        PrintWriter writer = new PrintWriter(baos);
-        execManifest.write(writer);
-        writer.flush();
-        
-        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-        super.zipFile(bais, zOut, "META-INF/MANIFEST.MF", System.currentTimeMillis());
-        super.finalizeZipOutputStream(zOut);
-    }
-
     /**
      * Handle situation when we encounter a manifest file
      *
@@ -220,30 +209,17 @@
     protected void zipFile(File file, ZipOutputStream zOut, String vPath)
         throws IOException
     {
-        // If the file being added is META-INF/MANIFEST.MF, we merge it with the
-        // current manifest 
+        // If the file being added is META-INF/MANIFEST.MF, we warn if it's not the
+        // one specified in the "manifest" attribute - or if it's being added twice, 
+        // meaning the same file is specified by the "manifeset" attribute and in
+        // a <fileset> element.
         if (vPath.equalsIgnoreCase("META-INF/MANIFEST.MF"))  {
-            InputStream is = null;
-            try {
-                is = new FileInputStream(file);
-                zipManifestEntry(is);
-            }
-            catch (IOException e) {
-                throw new BuildException("Unable to read manifest file: " + file, e);
-            }
-            finally {
-                if (is != null) {
-                    try {
-                        is.close();
-                    }
-                    catch (IOException e) {
-                        // do nothing
-                    }
-                }
-            }
+            log("Warning: selected "+archiveType+" files include a META-INF/MANIFEST.MF which will be ignored " +
+                "(please use manifest attribute to "+archiveType+" task)", Project.MSG_WARN);
         } else {
             super.zipFile(file, zOut, vPath);
         }
+
     }
 
     protected void zipFile(InputStream is, ZipOutputStream zOut, String vPath, long lastModified)
@@ -279,15 +255,22 @@
                 theZipFile = new java.util.zip.ZipFile(zipFile);
                 java.util.zip.ZipEntry entry = theZipFile.getEntry("META-INF/MANIFEST.MF");
                 if (entry == null) {
+                    log("Updating jar since the current jar has no manifest", Project.MSG_VERBOSE);
                     return false;
                 }
                 Manifest currentManifest = new Manifest(theZipFile.getInputStream(entry));
+                if (manifest == null) {
+                    manifest = getDefaultManifest();
+                }
                 if (!currentManifest.equals(manifest)) {
+                    log("Updating jar since jar manifest has changed", Project.MSG_VERBOSE);
                     return false;
                 }
             }
             catch (Exception e) {
                 // any problems and we will rebuild
+                log("Updating jar since cannot read current jar manifest: " + e.getClass().getName() + e.getMessage(), 
+                    Project.MSG_VERBOSE);
                 return false;
             }
             finally {
diff --git a/src/main/org/apache/tools/ant/taskdefs/Javac.java b/src/main/org/apache/tools/ant/taskdefs/Javac.java
index af0ac7d..8e9ff97 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Javac.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Javac.java
@@ -82,22 +82,23 @@
  * <li>failonerror
  * <li>includeantruntime
  * <li>includejavaruntime
+ * <li>source
  * </ul>
  * Of these arguments, the <b>sourcedir</b> and <b>destdir</b> are required.
  * <p>
  * When this task executes, it will recursively scan the sourcedir and
  * destdir looking for Java source files to compile. This task makes its
- * compile decision based on timestamp. 
+ * compile decision based on timestamp.
  *
  * @author James Davidson <a href="mailto:duncan@x180.com">duncan@x180.com</a>
  * @author Robin Green <a href="mailto:greenrd@hotmail.com">greenrd@hotmail.com</a>
- * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> 
+ * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
  * @author <a href="mailto:jayglanville@home.com">J D Glanville</a>
  */
 
 public class Javac extends MatchingTask {
 
-    private static final String FAIL_MSG 
+    private static final String FAIL_MSG
         = "Compile failed, messages should have been provided.";
 
     private Path src;
@@ -115,10 +116,31 @@
     private boolean includeAntRuntime = true;
     private boolean includeJavaRuntime = false;
     private boolean fork = false;
+    private boolean nowarn = false;
+    private String memoryInitialSize;
+    private String memoryMaximumSize;
 
     protected boolean failOnError = true;
     protected File[] compileList = new File[0];
 
+    private String source;
+    
+    /**
+     * Get the value of source.
+     * @return value of source.
+     */
+    public String getSource() {
+        return source;
+    }
+    
+    /**
+     * Set the value of source.
+     * @param v  Value to assign to source.
+     */
+    public void setSource(String  v) {
+        this.source = v;
+    }
+
     /**
      * Create a nested <src ...> element for multiple source path
      * support.
@@ -156,7 +178,7 @@
         this.destDir = destDir;
     }
 
-    /** 
+    /**
      * Gets the destination directory into which the java source files
      * should be compiled.
      */
@@ -298,6 +320,30 @@
     }
 
     /**
+     * Set the memoryInitialSize flag.
+     */
+    public void setMemoryInitialSize(String memoryInitialSize) {
+        this.memoryInitialSize = memoryInitialSize;
+    }
+
+    /** Gets the memoryInitialSize flag. */
+    public String getMemoryInitialSize() {
+        return memoryInitialSize;
+    }
+
+    /**
+     * Set the memoryMaximumSize flag.
+     */
+    public void setMemoryMaximumSize(String memoryMaximumSize) {
+        this.memoryMaximumSize = memoryMaximumSize;
+    }
+
+    /** Gets the memoryMaximumSize flag. */
+    public String getMemoryMaximumSize() {
+        return memoryMaximumSize;
+    }
+
+    /**
      * Set the Java source file encoding name.
      */
     public void setEncoding(String encoding) {
@@ -333,21 +379,21 @@
         return optimize;
     }
 
-    /** 
+    /**
      * Set the depend flag.
-     */ 
+     */
     public void setDepend(boolean depend) {
         this.depend = depend;
-    }  
+    }
 
     /** Gets the depend flag. */
     public boolean getDepend() {
         return depend;
     }
 
-    /** 
+    /**
      * Set the verbose flag.
-     */ 
+     */
     public void setVerbose(boolean verbose) {
         this.verbose = verbose;
     }
@@ -403,12 +449,34 @@
 
     /**
      * Sets whether to fork the javac compiler.
-     */    
-    public void setFork(boolean fork) 
+     */
+    public void setFork(boolean fork)
     {
-	this.fork = fork;
+        this.fork = fork;
     }
-	
+
+    /**
+     * Is this a forked invocation of JDK's javac?
+     */
+    public boolean isForkedJavac() {
+        return fork || 
+            "extJavac".equals(project.getProperty("build.compiler"));
+    }
+
+
+    /**
+     * Sets whether the -nowarn option should be used.
+     */
+    public void setNowarn(boolean flag) {
+        this.nowarn = flag;
+    }
+
+    /**
+     * Should the -nowarn option be used.
+     */
+    public boolean getNowarn() {
+        return nowarn;
+    }
 
     /**
      * Executes the task.
@@ -423,12 +491,12 @@
         if (list.length == 0) {
             throw new BuildException("srcdir attribute must be set!", location);
         }
-        
+
         if (destDir != null && !destDir.isDirectory()) {
             throw new BuildException("destination directory \"" + destDir + "\" does not exist or is not a directory", location);
         }
 
-        // scan source directories and dest directory to build up 
+        // scan source directories and dest directory to build up
         // compile lists
         resetFileLists();
         for (int i=0; i<list.length; i++) {
@@ -443,13 +511,13 @@
 
             scanDir(srcDir, destDir != null ? destDir : srcDir, files);
         }
-        
+
         // compile the source files
 
         String compiler = project.getProperty("build.compiler");
-	
-	if (fork) {
-	    if (compiler != null) {
+
+        if (fork) {
+            if (compiler != null) {
                 if (isJdkCompiler(compiler)) {
                     log("Since fork is true, ignoring build.compiler setting.",
                         Project.MSG_WARN);
@@ -458,13 +526,13 @@
                 else {
                     log("Since build.compiler setting isn't classic or modern, ignoring fork setting.", Project.MSG_WARN);
                 }
-	    }
+            }
             else {
                 compiler = "extJavac";
             }
-	} 
+        }
 
-	if (compiler == null) {
+        if (compiler == null) {
             if (Project.getJavaVersion() != Project.JAVA_1_1 &&
                 Project.getJavaVersion() != Project.JAVA_1_2) {
                 compiler = "modern";
@@ -477,14 +545,14 @@
 
             CompilerAdapter adapter = CompilerAdapterFactory.getCompiler(
               compiler, this );
-            log("Compiling " + compileList.length + 
+            log("Compiling " + compileList.length +
                 " source file"
                 + (compileList.length == 1 ? "" : "s")
                 + (destDir != null ? " to " + destDir : ""));
 
             // now we need to populate the compiler adapter
             adapter.setJavac( this );
-            
+
             // finally, lets execute the compiler!!
             if (!adapter.execute()) {
                 if (failOnError) {
@@ -498,14 +566,14 @@
     }
 
     /**
-     * Clear the list of files to be compiled and copied.. 
+     * Clear the list of files to be compiled and copied..
      */
     protected void resetFileLists() {
         compileList = new File[0];
     }
 
     /**
-     * Scans the directory looking for source files to be compiled.  
+     * Scans the directory looking for source files to be compiled.
      * The results are returned in the class variable compileList
      */
     protected void scanDir(File srcDir, File destDir, String files[]) {
@@ -514,7 +582,7 @@
         m.setTo("*.class");
         SourceFileScanner sfs = new SourceFileScanner(this);
         File[] newFiles = sfs.restrictAsFiles(files, srcDir, destDir, m);
-        
+
         if (newFiles.length > 0) {
             File[] newCompileList = new File[compileList.length +
                 newFiles.length];
diff --git a/src/main/org/apache/tools/ant/taskdefs/Javadoc.java b/src/main/org/apache/tools/ant/taskdefs/Javadoc.java
index 64efe93..91bd6dd 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Javadoc.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Javadoc.java
@@ -679,13 +679,13 @@
         }
 
         public String getPackages() {
-            StringBuffer p = new StringBuffer( "\"" );
+            StringBuffer p = new StringBuffer();
             for (int i = 0; i < packages.size(); i++) {
-                p.append( packages.elementAt( i ).toString() );
-                if ( i > 0 )
+                if ( i > 0 ) {
                     p.append( ":" );
+                }
+                p.append( packages.elementAt(i).toString() );
             }
-            p.append( "\"" );
             return p.toString();
         }
     }
diff --git a/src/main/org/apache/tools/ant/taskdefs/Manifest.java b/src/main/org/apache/tools/ant/taskdefs/Manifest.java
index 947aa97..2c62575 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Manifest.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Manifest.java
@@ -450,11 +450,6 @@
      */
     public Manifest(InputStream is) throws ManifestException, IOException {
         BufferedReader reader = new BufferedReader(new InputStreamReader(is));
-        String line = reader.readLine();
-        if (line == null) {
-            return;
-        }
-        
         // This should be the manifest version
         String nextSectionName = mainSection.read(reader);
         String readManifestVersion = mainSection.getAttributeValue(ATTRIBUTE_MANIFEST_VERSION);
@@ -463,6 +458,7 @@
             mainSection.removeAttribute(ATTRIBUTE_MANIFEST_VERSION);
         }
 
+        String line = null;
         while ((line = reader.readLine()) != null) {
             if (line.length() == 0) {
                 continue;
diff --git a/src/main/org/apache/tools/ant/taskdefs/Move.java b/src/main/org/apache/tools/ant/taskdefs/Move.java
index bfe07fd..a4f23a9 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Move.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Move.java
@@ -123,14 +123,14 @@
                     try {
                         log("Moving " + fromFile + " to " + toFile, verbosity);
                     
-                        FilterSet executionFilterSet = new FilterSet();
+                        FilterSetCollection executionFilters = new FilterSetCollection();
                         if (filtering) {
-                            executionFilterSet.addFilterSet(project.getGlobalFilterSet());
+                            executionFilters.addFilterSet(project.getGlobalFilterSet());
                         }
                         for (Enumeration filterEnum = getFilterSets().elements(); filterEnum.hasMoreElements();) {
-                            executionFilterSet.addFilterSet((FilterSet)filterEnum.nextElement());
+                            executionFilters.addFilterSet((FilterSet)filterEnum.nextElement());
                         }
-                        getFileUtils().copyFile(f, d, executionFilterSet,
+                        getFileUtils().copyFile(f, d, executionFilters,
                                                 forceOverwrite);
                         
                         f = new File(fromFile);
diff --git a/src/main/org/apache/tools/ant/taskdefs/Property.java b/src/main/org/apache/tools/ant/taskdefs/Property.java
index aa775c0..53c1e4f 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Property.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Property.java
@@ -160,6 +160,18 @@
     }
 
     public void execute() throws BuildException {
+        if (name != null) {
+            if (value == null && ref == null) {
+                throw new BuildException("You must specify value, location or refid with the name attribute",
+                                         location);
+            }
+        } else {
+            if (file == null && resource == null && env == null) {
+                throw new BuildException("You must specify file, resource or environment when not using the name attribute",
+                                         location);
+            }
+        }
+
         if ((name != null) && (value != null)) {
             addProperty(name, value);
         }
diff --git a/src/main/org/apache/tools/ant/taskdefs/SQLExec.java b/src/main/org/apache/tools/ant/taskdefs/SQLExec.java
index afa5d44..6f404e2 100644
--- a/src/main/org/apache/tools/ant/taskdefs/SQLExec.java
+++ b/src/main/org/apache/tools/ant/taskdefs/SQLExec.java
@@ -497,8 +497,13 @@
                                                        project.getProperties());
                 if (line.startsWith("//")) continue;
                 if (line.startsWith("--")) continue;
-                if (line.length() > 2 &&
-                    line.substring(0,3).equalsIgnoreCase("REM")) continue;
+                StringTokenizer st = new StringTokenizer(line);
+                if (st.hasMoreTokens()) {
+                    String token = st.nextToken();
+                    if ("REM".equalsIgnoreCase(token)) {
+                        continue;
+                    }
+                }
 
                 sql += " " + line;
                 sql = sql.trim();
diff --git a/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java b/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java
index c8c35eb..4325f42 100644
--- a/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java
+++ b/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java
@@ -54,19 +54,51 @@
 
 package org.apache.tools.ant.taskdefs;
 
-import org.apache.tools.ant.*;
+import java.io.File;
 
 /**
+ * Proxy interface for XSLT processors.
  *
  * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a>
- * @version $Revision$ $Date$
+ * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
+ * @see #XSLTProcess
  */
 public interface XSLTLiaison {
 
-    public void setStylesheet(String fileName) throws Exception;
+    /**
+     * the file protocol prefix for systemid.
+     * This file protocol must be appended to an absolute path.
+     * Typically: <tt>FILE_PROTOCOL_PREFIX + file.getAbsolutePath()</tt>
+     * This is not correct in specification terms since an absolute
+     * url in Unix is file:// + file.getAbsolutePath() while it is
+     * file:/// + file.getAbsolutePath() under Windows.
+     * Whatever, it should not be a problem to put file:/// in every
+     * case since most parsers for now incorrectly makes no difference
+     * between it.. and users also have problem with that :)
+     */
+    public final static String FILE_PROTOCOL_PREFIX = "file:///";
 
+    /**
+     * set the stylesheet to use for the transformation.
+     * @param stylesheet the stylesheet to be used for transformation.
+     */
+    public void setStylesheet(File stylesheet) throws Exception;
+
+    /**
+     * Add a parameter to be set during the XSL transformation.
+     * @param name the parameter name.
+     * @param expression the parameter value as an expression string.
+     * @throws Exception thrown if any problems happens.
+     */
     public void addParam(String name, String expression) throws Exception;
 
-    public void transform(String infile, String outfile) throws Exception;
+    /**
+     * Perform the transformation of a file into another.
+     * @param infile the input file, probably an XML one. :-)
+     * @param outfile the output file resulting from the transformation
+     * @throws Exception thrown if any problems happens.
+     * @see #setStylesheet(File)
+     */
+    public void transform(File infile, File outfile) throws Exception;
 
 } //-- XSLTLiaison
diff --git a/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java b/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java
index 9496c32..2d29412 100644
--- a/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java
+++ b/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java
@@ -100,9 +100,9 @@
 
     private String targetExtension = ".html";
     private Vector params = new Vector();
- 
+
     private File inFile = null;
- 
+
     private File outFile = null;
 
     private String processor;
@@ -137,7 +137,7 @@
         if (baseDir == null) {
             baseDir = project.resolveFile(".");
         }
-        
+
         liaison = getLiaison();
         log("Using "+liaison.getClass().toString(), Project.MSG_VERBOSE);
 
@@ -178,7 +178,7 @@
         for (int i = 0;i < list.length; ++i) {
             process( baseDir, list[i], destDir, stylesheet );
         }
-        
+
         // Process all the directoried marked for styling
         dirs = scanner.getIncludedDirectories();
         for (int j = 0;j < dirs.length;++j){
@@ -264,15 +264,16 @@
      */
     private void resolveProcessor(String proc) throws Exception {
         if (proc.equals("trax")) {
-            final Class clazz = 
+            final Class clazz =
                 loadClass("org.apache.tools.ant.taskdefs.optional.TraXLiaison");
             liaison = (XSLTLiaison)clazz.newInstance();
         } else if (proc.equals("xslp")) {
-            final Class clazz = 
+            log("DEPRECATED - xslp processor is deprecated. Use trax or xalan instead.");
+            final Class clazz =
                 loadClass("org.apache.tools.ant.taskdefs.optional.XslpLiaison");
             liaison = (XSLTLiaison) clazz.newInstance();
         } else if (proc.equals("xalan")) {
-            final Class clazz = 
+            final Class clazz =
                 loadClass("org.apache.tools.ant.taskdefs.optional.XalanLiaison");
             liaison = (XSLTLiaison)clazz.newInstance();
         } else {
@@ -313,14 +314,14 @@
      * Processes the given input XML file and stores the result
      * in the given resultFile.
      **/
-    private void process(File baseDir, String xmlFile, File destDir, 
+    private void process(File baseDir, String xmlFile, File destDir,
                          File stylesheet)
         throws BuildException {
 
         String fileExt=targetExtension;
         File   outFile=null;
         File   inFile=null;
-        
+
         try {
             long styleSheetLastModified = stylesheet.lastModified();
             inFile = new File(baseDir,xmlFile);
@@ -337,7 +338,7 @@
                 log("Transforming into "+destDir);
 
                 configureLiaison(stylesheet);
-                liaison.transform(inFile.toString(), outFile.toString());
+                liaison.transform(inFile, outFile);
             }
         }
         catch (Exception ex) {
@@ -347,7 +348,7 @@
             if (outFile != null) {
                 outFile.delete();
             }
-        
+
             throw new BuildException(ex);
         }
 
@@ -365,7 +366,7 @@
                 ensureDirectoryFor( outFile );
                 log("Processing " + inFile + " to " + outFile, Project.MSG_INFO);
                 configureLiaison(stylesheet);
-                liaison.transform(inFile.toString(), outFile.toString());
+                liaison.transform(inFile, outFile);
             }
         }catch (Exception ex) {
             log("Failed to process " + inFile, Project.MSG_INFO);
@@ -378,12 +379,12 @@
         File directory = new File( targetFile.getParent() );
         if (!directory.exists()) {
             if (!directory.mkdirs()) {
-                throw new BuildException("Unable to create directory: " 
+                throw new BuildException("Unable to create directory: "
                                          + directory.getAbsolutePath() );
             }
         }
     }
-    
+
     protected XSLTLiaison getLiaison() {
         // if processor wasn't specified, see if TraX is available.  If not,
         // default it to xslp or xalan, depending on which is in the classpath
@@ -424,20 +425,20 @@
     public class Param {
         private String name=null;
         private String expression=null;
-        
+
         public void setName(String name){
             this.name = name;
         }
-        
+
         public void setExpression(String expression){
             this.expression = expression;
         }
-        
+
         public String getName() throws BuildException{
             if(name==null)throw new BuildException("Name attribute is missing.");
             return name;
         }
-        
+
         public String getExpression() throws BuildException{
             if(expression==null)throw new BuildException("Expression attribute is missing.");
             return expression;
@@ -455,7 +456,7 @@
 
         try {
             log( "Loading stylesheet " + stylesheet, Project.MSG_INFO);
-            liaison.setStylesheet( stylesheet.toString() );
+            liaison.setStylesheet( stylesheet );
             for(Enumeration e = params.elements();e.hasMoreElements();) {
                 Param p = (Param)e.nextElement();
                 liaison.addParam( p.getName(), p.getExpression() );
diff --git a/src/main/org/apache/tools/ant/taskdefs/Zip.java b/src/main/org/apache/tools/ant/taskdefs/Zip.java
index 7691db4..58d270e 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Zip.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Zip.java
@@ -397,9 +397,12 @@
     }
 
     protected void addZipEntries(ZipFileSet fs, DirectoryScanner ds,
-      ZipOutputStream zOut, String prefix)
+                                 ZipOutputStream zOut, String prefix, String fullpath)
         throws IOException
     {
+        if (prefix.length() > 0 && fullpath.length() > 0)
+            throw new BuildException("Both prefix and fullpath attributes may not be set on the same fileset.");
+
         ZipScanner zipScanner = (ZipScanner) ds;
         File zipSrc = fs.getSrc();
 
@@ -413,9 +416,14 @@
                 entry = new ZipEntry(origEntry);
                 String vPath = entry.getName();
                 if (zipScanner.match(vPath)) {
-                    addParentDirs(null, vPath, zOut, prefix);
-                    if (! entry.isDirectory()) {
-                        zipFile(in, zOut, prefix+vPath, entry.getTime());
+                    if (fullpath.length() > 0) {
+                        addParentDirs(null, fullpath, zOut, "");
+                        zipFile(in, zOut, fullpath, entry.getTime());
+                    } else {
+                        addParentDirs(null, vPath, zOut, prefix);
+                        if (! entry.isDirectory()) {
+                            zipFile(in, zOut, prefix+vPath, entry.getTime());
+                        }
                     }
                 }
             }
@@ -679,7 +687,8 @@
 
     /**
      * Iterate over the given Vector of (zip)filesets and add
-     * all files to the ZipOutputStream using the given prefix.
+     * all files to the ZipOutputStream using the given prefix
+     * or fullpath.
      */
     protected void addFiles(Vector filesets, ZipOutputStream zOut)
         throws IOException {
@@ -713,7 +722,7 @@
 
             if (fs instanceof ZipFileSet
                 && ((ZipFileSet) fs).getSrc() != null) {
-                addZipEntries((ZipFileSet) fs, ds, zOut, prefix);
+                addZipEntries((ZipFileSet) fs, ds, zOut, prefix, fullpath);
             } else {
                 // Add the fileset.
                 addFiles(ds, zOut, prefix, fullpath);
diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
index 708379e..ab30ca4 100644
--- a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
@@ -67,7 +67,7 @@
  *
  * @author James Davidson <a href="mailto:duncan@x180.com">duncan@x180.com</a>
  * @author Robin Green <a href="mailto:greenrd@hotmail.com">greenrd@hotmail.com</a>
- * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> 
+ * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
  * @author <a href="mailto:jayglanville@home.com">J D Glanville</a>
  */
 public abstract class DefaultCompilerAdapter implements CompilerAdapter {
@@ -92,6 +92,8 @@
     protected Location location;
     protected boolean includeAntRuntime;
     protected boolean includeJavaRuntime;
+    protected String memoryInitialSize;
+    protected String memoryMaximumSize;
 
     protected File[] compileList;
     protected static String lSep = System.getProperty("line.separator");
@@ -116,6 +118,8 @@
         location = attributes.getLocation();
         includeAntRuntime = attributes.getIncludeantruntime();
         includeJavaRuntime = attributes.getIncludejavaruntime();
+        memoryInitialSize = attributes.getMemoryInitialSize();
+        memoryMaximumSize = attributes.getMemoryMaximumSize();
     }
 
     public Javac getJavac() {
@@ -136,7 +140,7 @@
             classpath.setLocation(destDir);
         }
 
-        // Combine the build classpath with the system classpath, in an 
+        // Combine the build classpath with the system classpath, in an
         // order determined by the value of build.classpath
 
         if (compileClasspath == null) {
@@ -166,7 +170,7 @@
                 classpath.addExisting(new Path(null,
                                                 System.getProperty("java.home")
                                                 + File.separator + "lib"
-                                                + File.separator 
+                                                + File.separator
                                                 + "classes.zip"));
             } else {
                 // JDK > 1.1 seems to set java.home to the JRE directory.
@@ -195,7 +199,7 @@
                                                + File.separator + "ui.jar"));
             }
         }
-            
+
         return classpath;
     }
 
@@ -206,6 +210,33 @@
     protected Commandline setupJavacCommandlineSwitches(Commandline cmd) {
         Path classpath = getCompileClasspath();
 
+        // we cannot be using Java 1.0 when forking, so we only have to
+        // distinguish between Java 1.1, and Java 1.2 and higher, as Java 1.1
+        // has its own parameter format
+        boolean usingJava1_1 = Project.getJavaVersion().equals(Project.JAVA_1_1);
+        String memoryParameterPrefix = usingJava1_1 ? "-J-" : "-J-X";
+        if (memoryInitialSize != null) {
+            if (!attributes.isForkedJavac()) {
+                attributes.log("Since fork is false, ignoring memoryInitialSize setting.",
+                               Project.MSG_WARN);
+            } else {
+                cmd.createArgument().setValue(memoryParameterPrefix+"ms"+memoryInitialSize);
+            }
+        }
+
+        if (memoryMaximumSize != null) {
+            if (!attributes.isForkedJavac()) {
+                attributes.log("Since fork is false, ignoring memoryMaximumSize setting.",
+                               Project.MSG_WARN);
+            } else {
+                cmd.createArgument().setValue(memoryParameterPrefix+"mx"+memoryMaximumSize);
+            }
+        }
+
+        if (attributes.getNowarn()) {
+            cmd.createArgument().setValue("-nowarn");
+        }
+
         if (deprecation == true) {
             cmd.createArgument().setValue("-deprecation");
         }
@@ -214,7 +245,7 @@
             cmd.createArgument().setValue("-d");
             cmd.createArgument().setFile(destDir);
         }
-        
+
         cmd.createArgument().setValue("-classpath");
 
         // Just add "sourcepath" to classpath ( for JDK1.1 )
@@ -286,6 +317,23 @@
      * Does the command line argument processing common to classic and
      * modern and adds the files to compile as well.
      */
+    protected Commandline setupModernJavacCommand() {
+        Commandline cmd = new Commandline();
+        setupJavacCommandlineSwitches(cmd);
+
+        if (attributes.getSource() != null) {
+            cmd.createArgument().setValue("-source");
+            cmd.createArgument().setValue(attributes.getSource());
+        }
+        
+        logAndAddFilesToCompile(cmd);
+        return cmd;
+    }
+
+    /**
+     * Does the command line argument processing common to classic and
+     * modern and adds the files to compile as well.
+     */
     protected Commandline setupJavacCommand() {
         Commandline cmd = new Commandline();
         setupJavacCommandlineSwitches(cmd);
@@ -294,7 +342,7 @@
     }
 
     /**
-     * Logs the compilation parameters, adds the files to compile and logs the 
+     * Logs the compilation parameters, adds the files to compile and logs the
      * &qout;niceSourceList&quot;
      */
     protected void logAndAddFilesToCompile(Commandline cmd) {
@@ -329,10 +377,10 @@
 
         try {
             /*
-             * Many system have been reported to get into trouble with 
+             * Many system have been reported to get into trouble with
              * long command lines - no, not only Windows ;-).
              *
-             * POSIX seems to define a lower limit of 4k, so use a temporary 
+             * POSIX seems to define a lower limit of 4k, so use a temporary
              * file if the total length of the command line exceeds this limit.
              */
             if (Commandline.toString(args).length() > 4096) {
@@ -357,9 +405,9 @@
             } else {
                 commandArray = args;
             }
-            
+
             try {
-                Execute exe = new Execute(new LogStreamHandler(attributes, 
+                Execute exe = new Execute(new LogStreamHandler(attributes,
                                                                Project.MSG_INFO,
                                                                Project.MSG_WARN));
                 exe.setAntRun(project);
@@ -368,7 +416,7 @@
                 exe.execute();
                 return exe.getExitValue();
             } catch (IOException e) {
-                throw new BuildException("Error running " + args[0] 
+                throw new BuildException("Error running " + args[0]
                         + " compiler", e, location);
             }
         } finally {
diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/Javac13.java b/src/main/org/apache/tools/ant/taskdefs/compilers/Javac13.java
index 34641bf..9da55f5 100644
--- a/src/main/org/apache/tools/ant/taskdefs/compilers/Javac13.java
+++ b/src/main/org/apache/tools/ant/taskdefs/compilers/Javac13.java
@@ -81,7 +81,7 @@
 
     public boolean execute() throws BuildException {
         attributes.log("Using modern compiler", Project.MSG_VERBOSE);
-        Commandline cmd = setupJavacCommand();
+        Commandline cmd = setupModernJavacCommand();
 
         // Use reflection to be able to build on all JDKs >= 1.1:
         try {
diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/Jikes.java b/src/main/org/apache/tools/ant/taskdefs/compilers/Jikes.java
index fbc4e12..fc5b39a 100644
--- a/src/main/org/apache/tools/ant/taskdefs/compilers/Jikes.java
+++ b/src/main/org/apache/tools/ant/taskdefs/compilers/Jikes.java
@@ -173,7 +173,21 @@
          * warning can be pretty annoying.
          */
         String warningsProperty = project.getProperty("build.compiler.warnings");
-        if (warningsProperty != null && !Project.toBoolean(warningsProperty)) {
+        if (warningsProperty != null) {
+            attributes.log("!! the build.compiler.warnings property is deprecated. !!",
+                           Project.MSG_WARN);
+            attributes.log("!! Use the nowarn attribute instead. !!",
+                           Project.MSG_WARN);
+            if (!Project.toBoolean(warningsProperty)) {
+                cmd.createArgument().setValue("-nowarn");
+            }
+        } if (attributes.getNowarn()) {
+            /* 
+             * FIXME later
+             *
+             * let the magic property win over the attribute for backwards 
+             * compatibility
+             */
             cmd.createArgument().setValue("-nowarn");
         }
 
diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties
index c318b02..32fb02c 100644
--- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties
+++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties
@@ -96,6 +96,8 @@
 p4edit=org.apache.tools.ant.taskdefs.optional.perforce.P4Edit
 p4submit=org.apache.tools.ant.taskdefs.optional.perforce.P4Submit
 p4counter=org.apache.tools.ant.taskdefs.optional.perforce.P4Counter
+p4reopen=org.apache.tools.ant.taskdefs.optional.perforce.P4Reopen
+p4revert=org.apache.tools.ant.taskdefs.optional.perforce.P4Revert
 javah=org.apache.tools.ant.taskdefs.optional.Javah
 ccupdate=org.apache.tools.ant.taskdefs.optional.clearcase.CCUpdate
 cccheckout=org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckout
@@ -113,8 +115,8 @@
 iplanet-ejbc=org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask
 jdepend=org.apache.tools.ant.taskdefs.optional.jdepend.JDependTask
 mimemail=org.apache.tools.ant.taskdefs.optional.net.MimeMail
-cccheckin=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin
-cccheckout=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckout
+ccmcheckin=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin
+ccmcheckout=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckout
 ccmcheckintask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckinDefault
 ccmreconfigure=org.apache.tools.ant.taskdefs.optional.ccm.CCMReconfigure
 ccmcreatetask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCreateTask
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java b/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
index 1ea8b9c..75adb14 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
@@ -200,7 +200,7 @@
 
         if (cmdOptions != null)
         {
-            command.createArgument().setValue(cmdOptions);
+            command.createArgument().setLine(cmdOptions);
         }
         
         command.createArgument().setValue("n");
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java b/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java
index 38f5973..565d8d5 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java
@@ -54,61 +54,109 @@
 
 package org.apache.tools.ant.taskdefs.optional;
 
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.IOException;
 
 import org.apache.tools.ant.taskdefs.XSLTLiaison;
 
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.Templates;
+import javax.xml.transform.Source;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
 
 /**
+ * Concrete liaison for XSLT processor implementing TraX. (ie JAXP 1.1)
  *
  * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a>
  * @author <a href="mailto:dims@yahoo.com">Davanum Srinivas</a>
- * @version $Revision$ $Date$
+ * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
  */
 public class TraXLiaison implements XSLTLiaison {
 
-    protected final static String FILEURL = "file:";
-
     /** The trax TransformerFactory */
     private TransformerFactory tfactory = null;
 
+    /** stylesheet stream, close it asap */
+    private FileInputStream xslStream = null;
+
     /** Stylesheet template */
     private Templates templates = null;
 
-    /** The trax Transformer itself */
-    private Transformer transformer;
+    /** transformer */
+    private Transformer transformer = null;
 
     public TraXLiaison() throws Exception {
         tfactory = TransformerFactory.newInstance();
     }
+//------------------- IMPORTANT
+    // 1) Don't use the StreamSource(File) ctor. It won't work with
+    // xalan prior to 2.2 because of systemid bugs.
 
-    public void setStylesheet(String fileName) throws Exception {
-        templates = tfactory.newTemplates(new StreamSource(normalize(fileName)));
+    // 2) Use a stream so that you can close it yourself quickly
+    // and avoid keeping the handle until the object is garbaged.
+    // (always keep control), otherwise you won't be able to delete
+    // the file quickly on windows.
+
+    // 3) Always set the systemid to the source for imports, includes...
+    // in xsl and xml...
+
+    public void setStylesheet(File stylesheet) throws Exception {
+        xslStream = new FileInputStream(stylesheet);
+        StreamSource src = new StreamSource(xslStream);
+        src.setSystemId(getSystemId(stylesheet));
+        templates = tfactory.newTemplates(src);
         transformer = templates.newTransformer();
-    };
+    }
 
-    public void transform(String infile, String outfile) throws Exception {
-        FileOutputStream out = new FileOutputStream(outfile);
+    public void transform(File infile, File outfile) throws Exception {
+        FileInputStream fis = null;
+        FileOutputStream fos = null;
         try {
-            transformer.transform(new StreamSource(normalize(infile)), 
-                                  new StreamResult(out));
+            fis = new FileInputStream(infile);
+            fos = new FileOutputStream(outfile);
+            StreamSource src = new StreamSource(fis);
+            src.setSystemId(getSystemId(infile));
+            StreamResult res = new StreamResult(fos);
+            // not sure what could be the need of this...
+            res.setSystemId(getSystemId(outfile));
+
+            transformer.transform(src, res);
         } finally {
-            out.close();
+            // make sure to close all handles, otherwise the garbage
+            // collector will close them...whenever possible and
+            // Windows may complain about not being able to delete files.
+            try {
+                if (xslStream != null){
+                    xslStream.close();
+                }
+            } catch (IOException ignored){}
+            try {
+                if (fis != null){
+                    fis.close();
+                }
+            } catch (IOException ignored){}
+            try {
+                if (fos != null){
+                    fos.close();
+                }
+            } catch (IOException ignored){}
         }
     }
 
-    protected String normalize(String fileName) {
-        if(fileName != null && !fileName.startsWith(FILEURL)) {
-            return FILEURL + "///" + fileName;
-        }
-        return fileName;
+    // make sure that the systemid is made of '/' and not '\' otherwise
+    // crimson will complain that it cannot resolve relative entities
+    // because it grabs the base uri via lastIndexOf('/') without
+    // making sure it is really a /'ed path
+    protected String getSystemId(File file){
+      String path = file.getAbsolutePath();
+      path = path.replace('\\','/');
+      return FILE_PROTOCOL_PREFIX + path;
     }
-    
+
     public void addParam(String name, String value){
         transformer.setParameter(name, value);
     }
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java b/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java
index e3a805d..b5d9443 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/XalanLiaison.java
@@ -60,39 +60,70 @@
 import org.apache.xalan.xslt.XSLTProcessor;
 import org.apache.xalan.xslt.XSLTInputSource;
 import org.apache.xalan.xslt.XSLTResultTarget;
+import org.xml.sax.InputSource;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
 
 /**
+ * Concrete liaison for Xalan 1.x API.
  *
  * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a>
- * @version $Revision$ $Date$
+ * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
  */
 public class XalanLiaison implements XSLTLiaison {
 
-    protected final static String FILEURL = "file:";
-
-    XSLTProcessor processor;
-    XSLTInputSource xslSheet;
+    protected XSLTProcessor processor;
+    protected File stylesheet;
 
     public XalanLiaison() throws Exception {
       processor = XSLTProcessorFactory.getProcessor();
     }
 
-    public void setStylesheet(String fileName) throws Exception {
-        xslSheet = new XSLTInputSource (normalize(fileName));
-    };
-
-    public void transform(String infile, String outfile) throws Exception {
-        processor.process(new XSLTInputSource(normalize(infile)), xslSheet,
-                        new XSLTResultTarget(outfile));
+    public void setStylesheet(File stylesheet) throws Exception {
+        this.stylesheet = stylesheet;
     }
 
-    protected String normalize(String fileName) {
-        if(fileName != null && !fileName.startsWith(FILEURL)) {
-            return FILEURL + fileName;
+    public void transform(File infile, File outfile) throws Exception {
+        FileInputStream fis = null;
+        FileOutputStream fos = null;
+        FileInputStream xslStream = null;
+        try {
+            xslStream = new FileInputStream(stylesheet);
+            fis = new FileInputStream(infile);
+            fos = new FileOutputStream(outfile);
+            // systemid such as file:/// + getAbsolutePath() are considered
+            // invalid here...
+            XSLTInputSource xslSheet = new XSLTInputSource(xslStream);
+            xslSheet.setSystemId(stylesheet.getAbsolutePath());
+            XSLTInputSource src = new XSLTInputSource(fis);
+            src.setSystemId(infile.getAbsolutePath());
+            XSLTResultTarget res = new XSLTResultTarget(fos);
+            processor.process(src, xslSheet, res);
+        } finally {
+            // make sure to close all handles, otherwise the garbage
+            // collector will close them...whenever possible and
+            // Windows may complain about not being able to delete files.
+            try {
+                if (xslStream != null){
+                    xslStream.close();
+                }
+            } catch (IOException ignored){}
+            try {
+                if (fis != null){
+                    fis.close();
+                }
+            } catch (IOException ignored){}
+            try {
+                if (fos != null){
+                    fos.close();
+                }
+            } catch (IOException ignored){}
         }
-        return fileName;
     }
-    
+
     public void addParam(String name, String value){
         processor.setStylesheetParam(name, value);
     }
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/XslpLiaison.java b/src/main/org/apache/tools/ant/taskdefs/optional/XslpLiaison.java
index 7ec791e..7176819 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/XslpLiaison.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/XslpLiaison.java
@@ -54,40 +54,45 @@
 
 package org.apache.tools.ant.taskdefs.optional;
 
-import java.io.FileWriter;
+import java.io.*;
+import java.net.URL;
 
 import org.apache.tools.ant.taskdefs.XSLTLiaison;
+import org.xml.sax.InputSource;
 
-import com.kvisco.xsl.XSLProcessor;
-import com.kvisco.xsl.XSLReader;
-import com.kvisco.xsl.XSLStylesheet;
+import com.kvisco.xsl.*;
 
 /**
+ * Concrete liaison for XSLP
  *
  * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a>
- * @version $Revision$ $Date$
+ * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
  */
 public class XslpLiaison implements XSLTLiaison {
 
-    XSLProcessor processor;
-    XSLStylesheet xslSheet;
+    protected XSLProcessor processor;
+    protected XSLStylesheet xslSheet;
 
     public XslpLiaison() {
       processor = new XSLProcessor();
+      // uh ?! I'm forced to do that otherwise a setProperty crashes with NPE !
+      // I don't understand why the property map is static though...
+      // how can we do multithreading w/ multiple identical parameters ?
+      processor.getProperty("dummy-to-init-properties-map");
     }
 
-    public void setStylesheet(String fileName) throws Exception {
+    public void setStylesheet(File fileName) throws Exception {
       XSLReader xslReader = new XSLReader();
-      xslSheet = xslReader.read( fileName );
-    };
+      // a file:/// + getAbsolutePath() does not work here
+      // it is really the pathname
+      xslSheet = xslReader.read( fileName.getAbsolutePath() );
+    }
 
-    public void transform(String infile, String outfile) throws Exception {
-        FileWriter out = new FileWriter(outfile);
-        try {
-            processor.process(infile, xslSheet, out);
-        } finally {
-            out.close();
-        }
+    public void transform(File infile, File outfile) throws Exception {
+        FileOutputStream fos = new FileOutputStream(outfile);
+        // XSLP does not support encoding...we're in hot water.
+        OutputStreamWriter out = new OutputStreamWriter(fos,"UTF8");
+        processor.process(infile.getAbsolutePath(), xslSheet, out);
     }
 
     public void addParam(String name, String expression){
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java b/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java
index 70fc4ea..4fd9680 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java
@@ -138,6 +138,12 @@
     private Path dependClasspath;
 
     /**
+     * constants used with the cache file
+     */
+    private final static String CACHE_FILE_NAME = "dependencies.txt";
+    private final static String CLASSNAME_PREPEND = "||:";
+
+    /**
      * Set the classpath to be used for this dependency check.
      */
     public void setClasspath(Path classpath) {
@@ -169,46 +175,74 @@
     public void setClasspathRef(Reference r) {
         createClasspath().setRefid(r);
     }
-    
-    private void writeDependencyList(File depFile, Vector dependencyList) throws IOException {
-        // new dependencies so need to write them out to the cache
-        PrintWriter pw = null;
-        try {
-            String parent = depFile.getParent();
-            if (parent != null) {
-                new File(parent).mkdirs(); 
-            }
-            
-            pw = new PrintWriter(new FileWriter(depFile));
-            for (Enumeration deps = dependencyList.elements(); deps.hasMoreElements();) {
-                pw.println(deps.nextElement());
-            }
-        }
-        finally {
-            if (pw != null) { 
-                pw.close();
-            }
-        }
-    }
-
-    private Vector readDependencyList(File depFile) throws IOException {
-        Vector dependencyList = null;
-        BufferedReader in = null;
-        try {
-            in = new BufferedReader(new FileReader(depFile));
-            String line = null;
-            dependencyList = new Vector();
-            while ((line = in.readLine()) != null) {
-                dependencyList.addElement(line);
-            }
-        }
-        finally {
-            if (in != null) { 
-                in.close();
+        
+    /**
+     * Read the dependencies from cache file
+     */
+    private Hashtable readCachedDependencies() throws IOException{
+        Hashtable dependencyMap = new Hashtable();
+        
+        if (cache != null) {
+            File depFile = new File(cache, CACHE_FILE_NAME);
+            BufferedReader in = null;
+            if (depFile.exists()) {
+                try {
+                    in = new BufferedReader(new FileReader(depFile));
+                    String line = null;
+                    Vector dependencyList = null;
+                    String className = null;
+                    int prependLength = CLASSNAME_PREPEND.length();
+                    while ((line = in.readLine()) != null) {
+                        if (line.startsWith(CLASSNAME_PREPEND)) {
+                            dependencyList = new Vector();
+                            className = line.substring(prependLength);
+                            dependencyMap.put(className, dependencyList);
+                        }
+                        else {
+                            dependencyList.addElement(line);
+                        }
+                    }
+                }
+                finally {
+                    if (in != null) { 
+                        in.close();
+                    }
+                }
             }
         }
         
-        return dependencyList;
+        return dependencyMap;
+    }
+    
+    /**
+     * Write the dependencies to cache file
+     */
+    private void writeCachedDependencies(Hashtable dependencyMap) throws IOException{
+        if (cache != null) {
+            PrintWriter pw = null;
+            try {
+                cache.mkdirs(); 
+                File depFile = new File(cache, CACHE_FILE_NAME);
+                
+                pw = new PrintWriter(new FileWriter(depFile));
+                for (Enumeration deps = dependencyMap.keys(); deps.hasMoreElements();) {
+                    String className = (String)deps.nextElement();
+                    
+                    pw.println(CLASSNAME_PREPEND + className);
+                    
+                    Vector dependencyList = (Vector)dependencyMap.get(className);
+                    int size = dependencyList.size();
+                    for (int x = 0; x < size; x++) {
+                        pw.println(dependencyList.elementAt(x));
+                    }
+                }
+            }
+            finally {
+                if (pw != null) { 
+                    pw.close();
+                }
+            }
+        }
     }
 
 
@@ -221,7 +255,20 @@
     private void determineDependencies() throws IOException {
         affectedClassMap = new Hashtable();
         classFileInfoMap = new Hashtable();
+        boolean cacheDirty = false;
+        
         Hashtable dependencyMap = new Hashtable();
+        File depCacheFile = null;
+        boolean depCacheFileExists = true;
+        long depCacheFileLastModified = Long.MAX_VALUE;
+        
+        // read the dependency cache from the disk
+        if (cache != null) {
+            dependencyMap = readCachedDependencies();
+            depCacheFile = new File(cache, CACHE_FILE_NAME);
+            depCacheFileExists = depCacheFile.exists();
+            depCacheFileLastModified = depCacheFile.lastModified();
+        }
         for (Enumeration e = getClassFiles(destPath).elements(); e.hasMoreElements(); ) {
             ClassFileInfo info = (ClassFileInfo)e.nextElement();
             log("Adding class info for " + info.className, Project.MSG_DEBUG);
@@ -230,12 +277,11 @@
             Vector dependencyList = null;
             
             if (cache != null) {
-                // try to read the dependency info from the cache if it is not out of date
-                File depFile = new File(cache, info.relativeName + ".dep");
-                if (depFile.exists() && depFile.lastModified() > info.absoluteFile.lastModified()) {
+                // try to read the dependency info from the map if it is not out of date
+                if (depCacheFileExists && depCacheFileLastModified > info.absoluteFile.lastModified()) {
                     // depFile exists and is newer than the class file
-                    // need to read dependency list from the file.
-                    dependencyList = readDependencyList(depFile);
+                    // need to get dependency list from the map.
+                    dependencyList = (Vector)dependencyMap.get(info.className);
                 }
             }
             
@@ -248,12 +294,11 @@
                     classFile.read(inFileStream);
                     
                     dependencyList = classFile.getClassRefs();
-                    
-                    if (cache != null) {
-                        // new dependencies so need to write them out to the cache
-                        File depFile = new File(cache, info.relativeName + ".dep");
-                        writeDependencyList(depFile, dependencyList);
+                    if (dependencyList != null) {
+                        cacheDirty = true;
+                        dependencyMap.put(info.className, dependencyList);
                     }
+                    
                 }
                 finally {
                     if (inFileStream != null) {
@@ -261,8 +306,7 @@
                     }
                 }
             }
-            
-            dependencyMap.put(info.className, dependencyList);
+                        
             // This class depends on each class in the dependency list. For each
             // one of those, add this class into their affected classes list 
             for (Enumeration depEnum = dependencyList.elements(); depEnum.hasMoreElements(); ) {
@@ -283,6 +327,7 @@
             // now determine which jars each class depends upon
             classpathDependencies = new Hashtable();
             AntClassLoader loader = new AntClassLoader(getProject(), dependClasspath);
+            
             Hashtable classpathFileCache = new Hashtable();
             Object nullFileMarker = new Object();
             for (Enumeration e = dependencyMap.keys(); e.hasMoreElements();) {
@@ -326,6 +371,11 @@
                 }
             }
         }
+        
+        // write the dependency cache to the disk
+        if (cache != null && cacheDirty) {
+            writeCachedDependencies(dependencyMap);
+        }
     }
     
     private int deleteAllAffectedFiles() {
@@ -461,14 +511,19 @@
                     String className = (String)e.nextElement();
                     if (!outOfDateClasses.containsKey(className)) {
                         ClassFileInfo info = (ClassFileInfo)classFileInfoMap.get(className);
-                        Hashtable dependencies = (Hashtable)classpathDependencies.get(className);
-                        for (Enumeration e2 = dependencies.elements(); e2.hasMoreElements();) {
-                            File classpathFile = (File)e2.nextElement();
-                            if (classpathFile.lastModified() > info.absoluteFile.lastModified()) {
-                                log("Class " + className + 
+                        
+                        // if we have no info about the class - it may have been deleted already and we 
+                        // are using cached info.
+                        if (info != null) {
+                            Hashtable dependencies = (Hashtable)classpathDependencies.get(className);
+                            for (Enumeration e2 = dependencies.elements(); e2.hasMoreElements();) {
+                                File classpathFile = (File)e2.nextElement();
+                                if (classpathFile.lastModified() > info.absoluteFile.lastModified()) {
+                                    log("Class " + className + 
                                     " is out of date with respect to " + classpathFile, Project.MSG_DEBUG);
-                                outOfDateClasses.put(className, className);
-                                break;
+                                    outOfDateClasses.put(className, className);
+                                    break;
+                                }
                             }
                         }
                     }
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/BorlandDeploymentTool.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/BorlandDeploymentTool.java
index 7383163..5b40e66 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/BorlandDeploymentTool.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/BorlandDeploymentTool.java
@@ -215,10 +215,10 @@
      */
     protected void addVendorFiles(Hashtable ejbFiles, String ddPrefix) {
 
-        File borlandDD = new File(getConfig().descriptorDir,BAS_DD);
+        File borlandDD = new File(getConfig().descriptorDir,ddPrefix + BAS_DD);
         if (borlandDD.exists()) {
             log("Borland specific file found "+ borlandDD,  Project.MSG_VERBOSE);
-            ejbFiles.put(META_DIR + BAS_DD, ddPrefix + borlandDD);
+            ejbFiles.put(META_DIR + BAS_DD,  borlandDD);
         }
         else {
             log("Unable to locate borland deployment descriptor. It was expected to be in " + 
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DescriptorHandler.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DescriptorHandler.java
index ed43ace..ea8df9a 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DescriptorHandler.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DescriptorHandler.java
@@ -87,6 +87,7 @@
      * Bunch of constants used for storing entries in a hashtable, and for
      * constructing the filenames of various parts of the ejb jar.
      */
+    private static final String EJB_REF   = "ejb-ref";
     private static final String HOME_INTERFACE   = "home";
     private static final String REMOTE_INTERFACE = "remote";
     private static final String BEAN_CLASS       = "ejb-class";
@@ -130,6 +131,8 @@
     
     private Hashtable resourceDTDs = new Hashtable();
 
+    private boolean inEJBRef = false;
+
     private Hashtable urlDTDs = new Hashtable();
 
     /**
@@ -244,6 +247,7 @@
     public void startDocument() throws SAXException {
         this.ejbFiles = new Hashtable(10, 1);
         this.currentElement = null;
+        inEJBRef = false;
     }
 
 
@@ -258,7 +262,10 @@
         throws SAXException {
         this.currentElement = name;
         currentText = "";
-        if (parseState == STATE_LOOKING_EJBJAR && name.equals(EJB_JAR)) {
+        if (name.equals(EJB_REF)) {
+            inEJBRef = true;
+        }
+        else if (parseState == STATE_LOOKING_EJBJAR && name.equals(EJB_JAR)) {
             parseState = STATE_IN_EJBJAR;
         }
         else if (parseState == STATE_IN_EJBJAR && name.equals(ENTERPRISE_BEANS)) {
@@ -286,7 +293,10 @@
         processElement();
         currentText = "";
         this.currentElement = "";
-        if (parseState == STATE_IN_ENTITY && name.equals(ENTITY_BEAN )) {
+        if (name.equals(EJB_REF)) {
+            inEJBRef = false;
+        }
+        else if (parseState == STATE_IN_ENTITY && name.equals(ENTITY_BEAN )) {
             parseState = STATE_IN_BEANS;
         }
         else if (parseState == STATE_IN_SESSION && name.equals(SESSION_BEAN)) {
@@ -323,7 +333,8 @@
     
     
     protected void processElement() {
-        if (parseState != STATE_IN_ENTITY && parseState != STATE_IN_SESSION) {
+        if (inEJBRef || 
+            (parseState != STATE_IN_ENTITY && parseState != STATE_IN_SESSION)) {
             return;
         }
         
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java
index 75779d0..1cd06ad 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java
@@ -183,34 +183,34 @@
                                      " is not valid");
         }
 
-        File securityPolicyFile = null;
-        if (securityPolicy == null) {
-            securityPolicyFile = new File(weblogicSystemHome, DEFAULT_WL60_POLICY_FILE);
-        }
-        else {
-            securityPolicyFile = new File(weblogicSystemHome, securityPolicy);
-        }
-
-        if (!securityPolicyFile.exists()) {
-            // OK it maybe an absolute path. Use the project to resolve it
-            securityPolicyFile = project.resolveFile(securityPolicy);
-            if (!securityPolicyFile.exists()) {
-                throw new BuildException("Security policy " + securityPolicy +
-                                         " was not found.");
-            }                                         
-        }
-
-
         if (beaHome != null) {
-            executeWLS6(securityPolicyFile);
-        }
-        else {
-            executeWLS(securityPolicyFile);
+            executeWLS6();
+        } else {
+            executeWLS();
         }
     }
     
-    private void executeWLS6(File securityPolicyFile) {
-        
+    private File findSecurityPolicyFile(String defaultSecurityPolicy) {
+        String securityPolicy = this.securityPolicy;
+        if (securityPolicy == null) {
+            securityPolicy = defaultSecurityPolicy;
+        }
+        File securityPolicyFile = new File( weblogicSystemHome, securityPolicy );
+        // If an explicit securityPolicy file was specified, it maybe an
+        // absolute path.  Use the project to resolve it.
+        if (this.securityPolicy != null && !securityPolicyFile.exists()) {
+            securityPolicyFile = project.resolveFile(securityPolicy);
+        }
+        // If we still can't find it, complain
+        if (!securityPolicyFile.exists()) {
+            throw new BuildException("Security policy " + securityPolicy +
+                                     " was not found.");
+        }
+        return securityPolicyFile;
+    }
+    
+    private void executeWLS6() {
+        File securityPolicyFile = findSecurityPolicyFile( DEFAULT_WL60_POLICY_FILE );
         if (!beaHome.isDirectory()) {
             throw new BuildException("BEA home " + beaHome.getPath() + 
                                      " is not valid");
@@ -259,16 +259,15 @@
         }
      }
     
-    private void executeWLS(File securityPolicyFile) {
-
+    private void executeWLS() {
+        File securityPolicyFile = findSecurityPolicyFile( DEFAULT_WL51_POLICY_FILE );
         File propertiesFile = null;
         
+
         if (weblogicPropertiesFile == null) {
-            propertiesFile = new File(weblogicSystemHome, DEFAULT_PROPERTIES_FILE);
+            weblogicPropertiesFile = DEFAULT_PROPERTIES_FILE;
         }
-        else {
-            propertiesFile = new File(weblogicSystemHome, weblogicPropertiesFile);
-        }
+        propertiesFile = new File(weblogicSystemHome, weblogicPropertiesFile);
         if (!propertiesFile.exists()) {
             // OK, properties file may be absolute
             propertiesFile = project.resolveFile(weblogicPropertiesFile);
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java
index e9fa549..98202a3 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java
@@ -586,7 +586,9 @@
 
         FTPFile[] files = ftp.listFiles(remoteFile);
 
-        if (files == null)
+        // For Microsoft's Ftp-Service an Array with length 0 is 
+        // returned if configured to return listings in "MS-DOS"-Format
+        if (files == null || files.length == 0)
         {
             // If we are sending files, then assume out of date.
             // If we are getting files, then throw an error
@@ -804,12 +806,12 @@
         }
 
         if( ! ftp.makeDirectory( dir ) ) {
-            // Both codes 550 and 553 can be produced by FTP Servers
+            // codes 521, 550 and 553 can be produced by FTP Servers
             //  to indicate that an attempt to create a directory has
             //  failed because the directory already exists.
 
             int rc = ftp.getReplyCode();
-            if( rc != 550 && rc != 553 && !ignoreNoncriticalErrors) {
+            if( !(ignoreNoncriticalErrors && (rc == 550 || rc == 553 || rc==521))) {
                 throw new BuildException( "could not create directory: " +
                                           ftp.getReplyString() );
             }
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/CovReport.java b/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/CovReport.java
index 248f4ff..8704caf 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/CovReport.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/CovReport.java
@@ -84,303 +84,303 @@
  * @author <a href="sbailliez@imediation.com">Stephane Bailliez</a>
  */
 public class CovReport extends Task {
-/*
-jpcoverport [options] -output=file -snapshot=snapshot.jpc
-jpcovreport [options] [-paramfile=file] -output=<fileName> -snapshot=<fileName>
+    /*
+      jpcoverport [options] -output=file -snapshot=snapshot.jpc
+      jpcovreport [options] [-paramfile=file] -output=<fileName> -snapshot=<fileName>
 
-		Generate a report based on the indicated snapshot
+      Generate a report based on the indicated snapshot
 
-		-paramfile=file
-						A text file containing the report generation options.
+      -paramfile=file
+      A text file containing the report generation options.
 
-		-format=(html|text|xml) defaults to html
-						The format of the generated report.
+      -format=(html|text|xml) defaults to html
+      The format of the generated report.
 
-		-type=(executive|summary|detailed|verydetailed) defaults to detailed
-						The type of report to be generated. For -format=xml,
-						use -type=verydetailed to include source code lines.
+      -type=(executive|summary|detailed|verydetailed) defaults to detailed
+      The type of report to be generated. For -format=xml,
+      use -type=verydetailed to include source code lines.
 
-						Note: A very detailed report can be VERY large.
+      Note: A very detailed report can be VERY large.
 
-		-percent=num            Min 1 Max 101 Default 101
-						An integer representing a percentage of coverage.
-						Only methods with test case coverage less than the
-						percentage are included in reports.
+      -percent=num            Min 1 Max 101 Default 101
+      An integer representing a percentage of coverage.
+      Only methods with test case coverage less than the
+      percentage are included in reports.
 
-		-filters=string
-						A comma-separated list of filters in the form
-						<package>.<class>:V, where V can be I for Include or
-						E for Exclude. For the default package, omit <package>.
+      -filters=string
+      A comma-separated list of filters in the form
+      <package>.<class>:V, where V can be I for Include or
+      E for Exclude. For the default package, omit <package>.
 
-		-filters_method=string
-						Optional. A comma-separated list of methods that
-						correspond one-to-one with the entries in -filters.
+      -filters_method=string
+      Optional. A comma-separated list of methods that
+      correspond one-to-one with the entries in -filters.
 
-		-output=string  Must be specified
-						The absolute path and file name for the generated
-						report file.
+      -output=string  Must be specified
+      The absolute path and file name for the generated
+      report file.
 
-		-snapshot=string        Must be specified
-						The absolute path and file name of the snapshot file.
+      -snapshot=string        Must be specified
+      The absolute path and file name of the snapshot file.
 
-		-inc_src_text=(on|off)  defaults to on
-						Include text of the source code lines.
-						Only applies for -format=xml and -type=verydetailed.
+      -inc_src_text=(on|off)  defaults to on
+      Include text of the source code lines.
+      Only applies for -format=xml and -type=verydetailed.
 
-		-sourcepath=string      defaults to .
-						A semicolon-separated list of source paths.
+      -sourcepath=string      defaults to .
+      A semicolon-separated list of source paths.
 
-/*
+      /*
 
-	/** coverage home,  mandatory */
-	private File home = null;
+      /** coverage home,  mandatory */
+    private File home = null;
 
-	/** format of generated report, optional */
-	private String format = null;
+    /** format of generated report, optional */
+    private String format = null;
 
-	/** the name of the output snapshot, mandatory */
-	private File tofile = null;
+    /** the name of the output snapshot, mandatory */
+    private File tofile = null;
 
-	/** type of report, optional */
-	private String type = null;
+    /** type of report, optional */
+    private String type = null;
 
-	/** threshold value for printing methods, optional */
-	private Integer percent = null;
+    /** threshold value for printing methods, optional */
+    private Integer percent = null;
 
-	/** comma separated list of filters (???)*/
-	private String filters = null;
+    /** comma separated list of filters (???)*/
+    private String filters = null;
 
-	/** name of the snapshot file to create report from */
-	private File snapshot = null;
+    /** name of the snapshot file to create report from */
+    private File snapshot = null;
 
-	/** sourcepath to use */
-	private Path sourcePath = null;
+    /** sourcepath to use */
+    private Path sourcePath = null;
 
-	/** include the text for each line of code (xml report verydetailed)*/
-	private boolean includeSource = true;
+    /** include the text for each line of code (xml report verydetailed)*/
+    private boolean includeSource = true;
 
-	private Path coveragePath = null;
+    private Path coveragePath = null;
 
-	/** */
-	private Reference reference = null;
+    /** */
+    private Reference reference = null;
 
 
-	/**
-	 * Set the coverage home. it must point to JProbe coverage
-	 * directories where are stored native libraries and jars.
-	 */
-	public void setHome(File value) {
-		this.home = value;
-	}
+    /**
+     * Set the coverage home. it must point to JProbe coverage
+     * directories where are stored native libraries and jars.
+     */
+    public void setHome(File value) {
+        this.home = value;
+    }
 
-	public static class ReportFormat extends EnumeratedAttribute {
-		public String[] getValues(){
-			return new String[]{"html", "text", "xml"};
-		}
-	}
-	/** set the format of the report html|text|xml*/
-	public void setFormat(ReportFormat value){
-		this.format = value.getValue();
-	}
+    public static class ReportFormat extends EnumeratedAttribute {
+        public String[] getValues(){
+            return new String[]{"html", "text", "xml"};
+        }
+    }
+    /** set the format of the report html|text|xml*/
+    public void setFormat(ReportFormat value){
+        this.format = value.getValue();
+    }
 
-	public static class ReportType extends EnumeratedAttribute {
-		public String[] getValues(){
-			return new String[]{"executive", "summary", "detailed", "verydetailed"};
-		}
-	}
-	/** sets the report type executive|summary|detailed|verydetailed */
-	public void setType(ReportType value){
-		this.type =  value.getValue();
-	}
+    public static class ReportType extends EnumeratedAttribute {
+        public String[] getValues(){
+            return new String[]{"executive", "summary", "detailed", "verydetailed"};
+        }
+    }
+    /** sets the report type executive|summary|detailed|verydetailed */
+    public void setType(ReportType value){
+        this.type =  value.getValue();
+    }
 
-	/** include source code lines. XML report only */
-	public void setIncludesource(boolean value){
-		this.includeSource = value;
-	}
+    /** include source code lines. XML report only */
+    public void setIncludesource(boolean value){
+        this.includeSource = value;
+    }
 
-	/** sets the threshold printing method 0-100*/
-	public void setPercent(Integer value){
-		this.percent = value;
-	}
+    /** sets the threshold printing method 0-100*/
+    public void setPercent(Integer value){
+        this.percent = value;
+    }
 
-	/** set the filters */
-	public void setFilters(String values){
-		this.filters = values;
-	}
+    /** set the filters */
+    public void setFilters(String values){
+        this.filters = values;
+    }
 
-	public Path createSourcepath(){
-		if (sourcePath == null) {
-			sourcePath = new Path(project);
-		}
-		return sourcePath.createPath();
-	}
+    public Path createSourcepath(){
+        if (sourcePath == null) {
+            sourcePath = new Path(project);
+        }
+        return sourcePath.createPath();
+    }
 
-	public void setSnapshot(File value){
-		this.snapshot = value;
-	}
+    public void setSnapshot(File value){
+        this.snapshot = value;
+    }
 
-	/**
-	 * Set the output snapshot file
-	 */
-	public void setTofile(File value) {
-		this.tofile = value;
-	}
+    /**
+     * Set the output snapshot file
+     */
+    public void setTofile(File value) {
+        this.tofile = value;
+    }
 
-	//@todo to remove
-	public Path createCoveragepath(){
-		if (coveragePath == null) {
-			coveragePath = new Path(project);
-		}
-		return coveragePath.createPath();
-	}
+    //@todo to remove
+    public Path createCoveragepath(){
+        if (coveragePath == null) {
+            coveragePath = new Path(project);
+        }
+        return coveragePath.createPath();
+    }
 
-	public Reference createReference(){
-		if (reference == null){
-			reference = new Reference();
-		}
-		return reference;
-	}
+    public Reference createReference(){
+        if (reference == null){
+            reference = new Reference();
+        }
+        return reference;
+    }
 
 
-	public CovReport() {
-	}
+    public CovReport() {
+    }
 
-	/** check for mandatory options */
-	protected void checkOptions() throws BuildException {
-		if (tofile == null) {
-			throw new BuildException("'tofile' attribute must be set.");
-		}
-		if (snapshot == null) {
-			throw new BuildException("'snapshot' attribute must be set.");
-		}
-		if (home == null) {
-			throw new BuildException("'home' attribute must be set to JProbe home directory");
-		}
-		home = new File(home,"Coverage");
-		File jar = new File(home, "coverage.jar");
-		if (!jar.exists()) {
-			throw new BuildException("Cannot find Coverage directory: " + home);
-		}
-		if (reference != null && !"xml".equals(format)){
-			log("Ignored reference. It cannot be used in non XML report.");
-			reference = null; // nullify it so that there is no ambiguity
-		}
+    /** check for mandatory options */
+    protected void checkOptions() throws BuildException {
+        if (tofile == null) {
+            throw new BuildException("'tofile' attribute must be set.");
+        }
+        if (snapshot == null) {
+            throw new BuildException("'snapshot' attribute must be set.");
+        }
+        if (home == null) {
+            throw new BuildException("'home' attribute must be set to JProbe home directory");
+        }
+        home = new File(home,"Coverage");
+        File jar = new File(home, "coverage.jar");
+        if (!jar.exists()) {
+            throw new BuildException("Cannot find Coverage directory: " + home);
+        }
+        if (reference != null && !"xml".equals(format)){
+            log("Ignored reference. It cannot be used in non XML report.");
+            reference = null; // nullify it so that there is no ambiguity
+        }
 
-	}
+    }
 
-	public void execute() throws BuildException {
-		checkOptions();
-		try {
-			Commandline cmdl = new Commandline();
-			// we need to run Coverage from his directory due to dll/jar issues
-			cmdl.setExecutable( new File(home, "jpcovreport").getAbsolutePath() );
-			String[] params = getParameters();
-			for (int i = 0; i < params.length; i++) {
-				cmdl.createArgument().setValue(params[i]);
-			}
+    public void execute() throws BuildException {
+        checkOptions();
+        try {
+            Commandline cmdl = new Commandline();
+            // we need to run Coverage from his directory due to dll/jar issues
+            cmdl.setExecutable( new File(home, "jpcovreport").getAbsolutePath() );
+            String[] params = getParameters();
+            for (int i = 0; i < params.length; i++) {
+                cmdl.createArgument().setValue(params[i]);
+            }
 
-			// use the custom handler for stdin issues
-			LogStreamHandler handler = new LogStreamHandler(this,Project.MSG_INFO,Project.MSG_WARN);
-			Execute exec = new Execute( handler );
-			log(cmdl.toString(), Project.MSG_VERBOSE);
-			exec.setCommandline(cmdl.getCommandline());
-			int exitValue = exec.execute();
-			if (exitValue != 0) {
-				throw new BuildException("JProbe Coverage Report failed (" + exitValue + ")");
-			}
-			log("coveragePath: " + coveragePath, Project.MSG_VERBOSE);
-			log("format: " + format, Project.MSG_VERBOSE);
-			if (reference != null && "xml".equals(format)){
-				reference.createEnhancedXMLReport();
-			}
+            // use the custom handler for stdin issues
+            LogStreamHandler handler = new LogStreamHandler(this,Project.MSG_INFO,Project.MSG_WARN);
+            Execute exec = new Execute( handler );
+            log(cmdl.toString(), Project.MSG_VERBOSE);
+            exec.setCommandline(cmdl.getCommandline());
+            int exitValue = exec.execute();
+            if (exitValue != 0) {
+                throw new BuildException("JProbe Coverage Report failed (" + exitValue + ")");
+            }
+            log("coveragePath: " + coveragePath, Project.MSG_VERBOSE);
+            log("format: " + format, Project.MSG_VERBOSE);
+            if (reference != null && "xml".equals(format)){
+                reference.createEnhancedXMLReport();
+            }
 
-		} catch (IOException e){
-			throw new BuildException("Failed to execute JProbe Coverage Report.", e);
-		}
-	}
+        } catch (IOException e){
+            throw new BuildException("Failed to execute JProbe Coverage Report.", e);
+        }
+    }
 
 
-	protected String[] getParameters(){
-		Vector v = new Vector();
-		if (format != null) {
-			v.addElement("-format=" + format);
-		}
-		if (type != null) {
-			v.addElement("-type=" + type);
-		}
-		if (percent != null) {
-			v.addElement("-percent=" + percent);
-		}
-		if (filters != null) {
-			v.addElement("-filters=" + filters);
-		}
-		v.addElement("-output=" + project.resolveFile(tofile.getPath()));
-		v.addElement("-snapshot=" + project.resolveFile(snapshot.getPath()));
-		// as a default -sourcepath use . in JProbe, so use project .
-		if (sourcePath == null) {
-			sourcePath = new Path(project);
-			sourcePath.createPath().setLocation(project.resolveFile("."));
-		}
-		v.addElement("-sourcepath=" + sourcePath);
+    protected String[] getParameters(){
+        Vector v = new Vector();
+        if (format != null) {
+            v.addElement("-format=" + format);
+        }
+        if (type != null) {
+            v.addElement("-type=" + type);
+        }
+        if (percent != null) {
+            v.addElement("-percent=" + percent);
+        }
+        if (filters != null) {
+            v.addElement("-filters=" + filters);
+        }
+        v.addElement("-output=" + project.resolveFile(tofile.getPath()));
+        v.addElement("-snapshot=" + project.resolveFile(snapshot.getPath()));
+        // as a default -sourcepath use . in JProbe, so use project .
+        if (sourcePath == null) {
+            sourcePath = new Path(project);
+            sourcePath.createPath().setLocation(project.resolveFile("."));
+        }
+        v.addElement("-sourcepath=" + sourcePath);
 
-		if ("verydetailed".equalsIgnoreCase(format) && "xml".equalsIgnoreCase(type)) {
-			v.addElement("-inc_src_text=" + (includeSource ? "on" : "off"));
-		}
+        if ("verydetailed".equalsIgnoreCase(format) && "xml".equalsIgnoreCase(type)) {
+            v.addElement("-inc_src_text=" + (includeSource ? "on" : "off"));
+        }
 
-		String[] params = new String[v.size()];
-		v.copyInto(params);
-		return params;
-	}
+        String[] params = new String[v.size()];
+        v.copyInto(params);
+        return params;
+    }
 
 
-	public class Reference {
-		protected Path classPath;
-		protected ReportFilters filters;
-		public Path createClasspath(){
-			if (classPath == null) {
-				classPath = new Path(project);
-			}
-			return classPath.createPath();
-		}
-		public ReportFilters createFilters(){
-			if (filters == null){
-				filters = new ReportFilters();
-			}
-			return filters;
-		}
-		protected void createEnhancedXMLReport() throws BuildException {
-			// we need a classpath element
-			if (classPath == null){
-				throw new BuildException("Need a 'classpath' element.");
-			}
-			// and a valid one...
-			String[] paths = classPath.list();
-			if (paths.length == 0){
-				throw new BuildException("Coverage path is invalid. It does not contain any existing path.");
-			}
-			// and we need at least one filter include/exclude.
-			if (filters == null || filters.size() == 0){
-				createFilters();
-				log("Adding default include filter to *.*()", Project.MSG_VERBOSE);
-				ReportFilters.Include include = new ReportFilters.Include();
-				filters.addInclude( include );
-			}
-			try {
-				log("Creating enhanced XML report", Project.MSG_VERBOSE);
-				XMLReport report = new XMLReport(CovReport.this, tofile);
-				report.setReportFilters(filters);
-				report.setJProbehome( new File(home.getParent()) );
-				Document doc = report.createDocument(paths);
-				TransformerFactory tfactory = TransformerFactory.newInstance();
-				Transformer transformer = tfactory.newTransformer();
-				transformer.setOutputProperty(OutputKeys.INDENT, "yes");
-				transformer.setOutputProperty(OutputKeys.METHOD, "xml");
-				Source src = new DOMSource(doc);
-				Result res = new StreamResult( "file:///" + tofile.toString() );
-				transformer.transform(src, res);
-			} catch (Exception e){
-				throw new BuildException("Error while performing enhanced XML report from file " + tofile, e);
-			}
-		}
-	}
+    public class Reference {
+        protected Path classPath;
+        protected ReportFilters filters;
+        public Path createClasspath(){
+            if (classPath == null) {
+                classPath = new Path(CovReport.this.project);
+            }
+            return classPath.createPath();
+        }
+        public ReportFilters createFilters(){
+            if (filters == null){
+                filters = new ReportFilters();
+            }
+            return filters;
+        }
+        protected void createEnhancedXMLReport() throws BuildException {
+            // we need a classpath element
+            if (classPath == null){
+                throw new BuildException("Need a 'classpath' element.");
+            }
+            // and a valid one...
+            String[] paths = classPath.list();
+            if (paths.length == 0){
+                throw new BuildException("Coverage path is invalid. It does not contain any existing path.");
+            }
+            // and we need at least one filter include/exclude.
+            if (filters == null || filters.size() == 0){
+                createFilters();
+                log("Adding default include filter to *.*()", Project.MSG_VERBOSE);
+                ReportFilters.Include include = new ReportFilters.Include();
+                filters.addInclude( include );
+            }
+            try {
+                log("Creating enhanced XML report", Project.MSG_VERBOSE);
+                XMLReport report = new XMLReport(CovReport.this, tofile);
+                report.setReportFilters(filters);
+                report.setJProbehome( new File(home.getParent()) );
+                Document doc = report.createDocument(paths);
+                TransformerFactory tfactory = TransformerFactory.newInstance();
+                Transformer transformer = tfactory.newTransformer();
+                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+                transformer.setOutputProperty(OutputKeys.METHOD, "xml");
+                Source src = new DOMSource(doc);
+                Result res = new StreamResult( "file:///" + tofile.toString() );
+                transformer.transform(src, res);
+            } catch (Exception e){
+                throw new BuildException("Error while performing enhanced XML report from file " + tofile, e);
+            }
+        }
+    }
 }
diff --git a/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java b/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java
index 47caa9c..cf118dd 100644
--- a/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java
+++ b/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java
@@ -78,9 +78,9 @@
         try {
             // Create an instance of the rmic
             Class c = Class.forName("weblogic.rmic");
-            Method doRmic = c.getMethod("main", 
+            Method doRmic = c.getMethod("main",
                                         new Class [] { String[].class });
-            doRmic.invoke(null, new Object[] {  });
+            doRmic.invoke(null, new Object[] {cmd.getArguments()  });
             return true;
         } catch (ClassNotFoundException ex) {
             throw new BuildException("Cannot use WebLogic rmic, as it is not available"+
diff --git a/src/main/org/apache/tools/ant/types/CommandlineJava.java b/src/main/org/apache/tools/ant/types/CommandlineJava.java
index 52071c1..bbc3ddb 100644
--- a/src/main/org/apache/tools/ant/types/CommandlineJava.java
+++ b/src/main/org/apache/tools/ant/types/CommandlineJava.java
@@ -221,7 +221,7 @@
      * @return the list of all arguments necessary to run the vm.
      */
     public String[] getCommandline() {
-       String[] result = new String[size()];
+        String[] result = new String[size()];
         int pos = 0;
         String[] vmArgs = getActualVMCommand().getCommandline();
         // first argument is the java.exe path...
@@ -285,7 +285,8 @@
     public int size() {
         int size = getActualVMCommand().size() + javaCommand.size() + sysProperties.size();
         // classpath is "-classpath <classpath>" -> 2 args
-        if (classpath != null && classpath.size() > 0) {
+        Path fullClasspath = classpath != null ? classpath.concatSystemClasspath("ignore") : null;
+        if (fullClasspath != null && fullClasspath.toString().trim().length() > 0) {
             size += 2;
         }
         // jar execution requires an additional -jar option
diff --git a/src/main/org/apache/tools/ant/types/Description.java b/src/main/org/apache/tools/ant/types/Description.java
index d343b47..0a7f962 100644
--- a/src/main/org/apache/tools/ant/types/Description.java
+++ b/src/main/org/apache/tools/ant/types/Description.java
@@ -70,17 +70,16 @@
  * @version $Revision$ $Date$
  */
 public class Description extends DataType {
-   
-   private Project project;
-   
-   public Description(Project project) {
-      this.project = project;
-   }
 
     /**
      * Adds descriptive text to the project.
      */
-   public void addText(String text) {
-      project.setDescription(text);
-   }
+    public void addText(String text) {
+        String currentDescription = project.getDescription();
+        if (currentDescription == null) {
+            project.setDescription(text);
+        } else {
+            project.setDescription(currentDescription + text);
+        }
+    }
 }
diff --git a/src/main/org/apache/tools/ant/types/FileSet.java b/src/main/org/apache/tools/ant/types/FileSet.java
index 85868e4..9bca0f2 100644
--- a/src/main/org/apache/tools/ant/types/FileSet.java
+++ b/src/main/org/apache/tools/ant/types/FileSet.java
@@ -72,6 +72,7 @@
  * @author Sam Ruby <a href="mailto:rubys@us.ibm.com">rubys@us.ibm.com</a>
  * @author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a>
  * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
+ * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a>
  */
 public class FileSet extends DataType {
     
@@ -80,6 +81,7 @@
 
     private File dir;
     private boolean useDefaultExcludes = true;
+    private boolean isCaseSensitive = true;
 
     public FileSet() {
         super();
@@ -90,6 +92,7 @@
         this.defaultPatterns = fileset.defaultPatterns;
         this.additionalPatterns = fileset.additionalPatterns;
         this.useDefaultExcludes = fileset.useDefaultExcludes;
+        this.isCaseSensitive = fileset.isCaseSensitive;
     }
     
     
@@ -245,6 +248,16 @@
     }
 
     /**
+     * Sets case sensitivity of the file system
+     *
+     * @param isCaseSensitive "true"|"on"|"yes" if file system is case
+     *                           sensitive, "false"|"off"|"no" when not.
+     */
+    public void setCaseSensitive(boolean isCaseSensitive) {
+        this.isCaseSensitive = isCaseSensitive;
+    }
+
+    /**
      * Returns the directory scanner needed to access the files to process.
      */
     public DirectoryScanner getDirectoryScanner(Project p) {
@@ -287,6 +300,7 @@
         ds.setIncludes(defaultPatterns.getIncludePatterns(p));
         ds.setExcludes(defaultPatterns.getExcludePatterns(p));
         if (useDefaultExcludes) ds.addDefaultExcludes();
+        ds.setCaseSensitive(isCaseSensitive);
     }
 
     /**
diff --git a/src/main/org/apache/tools/ant/types/FilterSet.java b/src/main/org/apache/tools/ant/types/FilterSet.java
index 67ff8d8..efc3137 100644
--- a/src/main/org/apache/tools/ant/types/FilterSet.java
+++ b/src/main/org/apache/tools/ant/types/FilterSet.java
@@ -72,7 +72,7 @@
 /**
  * A set of filters to be applied to something.
  *
- * A filter set may have starttoken and endtokens defined.
+ * A filter set may have begintoken and endtokens defined.
  *
  * @author     <A href="mailto:gholam@xtra.co.nz">  Michael McCallum  </A>
  * @created   14 March 2001
@@ -176,8 +176,8 @@
     /** The default token end string */
     public static final String DEFAULT_TOKEN_END = "@";
     
-    private String startOftoken = DEFAULT_TOKEN_START;
-    private String endOftoken = DEFAULT_TOKEN_END;
+    private String startOfToken = DEFAULT_TOKEN_START;
+    private String endOfToken = DEFAULT_TOKEN_END;
     
     /**
      * List of ordered filters and filter files.
@@ -245,8 +245,16 @@
         if (isReference()) {
             throw tooManyAttributes();
         }
-        startOftoken = startOfToken;
+        this.startOfToken = startOfToken;
     }
+
+    public String getBeginToken() {
+        if (isReference()) {
+            return getRef().getBeginToken();
+        }
+        return startOfToken;
+    }
+    
     
     /**
      * The string used to id the end of a token.
@@ -257,8 +265,16 @@
         if (isReference()) {
             throw tooManyAttributes();
         }
-        endOftoken = endOfToken;
+        this.endOfToken = endOfToken;
     }
+
+    public String getEndToken() {
+        if (isReference()) {
+            return getRef().getEndToken();
+        }
+        return endOfToken;
+    }
+    
     
     /**
      * Read the filters from the given file.
@@ -268,6 +284,10 @@
      * file.
      */
     public void readFiltersFromFile(File filtersFile) throws BuildException {
+        if (isReference()) {
+            throw tooManyAttributes();
+        }
+
         if (filtersFile.isFile()) {
            log("Reading filters from " + filtersFile, Project.MSG_VERBOSE );
            FileInputStream in = null;
@@ -304,13 +324,15 @@
     
     /**
      * Does replacement on the given string with token matching.
-     * This uses the defined starttoken and endtoken values which default to @ for both.
+     * This uses the defined begintoken and endtoken values which default to @ for both.
      *
      * @param line  The line to process the tokens in.
      * @return      The string with the tokens replaced.
      */
     public String replaceTokens(String line) {
-        int index = line.indexOf(startOftoken);
+        String beginToken = getBeginToken();
+        String endToken = getEndToken();
+        int index = line.indexOf(beginToken);
         
         if (index > -1) {
             Hashtable tokens = getFilterHash();
@@ -321,24 +343,24 @@
                 String value = null;
                 
                 do {
-                    int endIndex = line.indexOf(endOftoken, index + startOftoken.length() + 1 );
+                    int endIndex = line.indexOf(endToken, index + beginToken.length() + 1 );
                     if (endIndex == -1) {
                         break;
                     }
-                    token = line.substring(index + startOftoken.length(), endIndex );
+                    token = line.substring(index + beginToken.length(), endIndex );
                     b.append(line.substring(i, index));
                     if (tokens.containsKey(token)) {
                         value = (String)tokens.get(token);
-                        log( "Replacing: " + startOftoken + token + endOftoken + " -> " + value, Project.MSG_VERBOSE );
+                        log( "Replacing: " + beginToken + token + endToken + " -> " + value, Project.MSG_VERBOSE );
                         b.append(value);
-                        i = index + startOftoken.length() + token.length() + endOftoken.length();
+                        i = index + beginToken.length() + token.length() + endToken.length();
                     }
                     else {
-                        // just append startOftoken and search further
-                        b.append(startOftoken);
-                        i = index + startOftoken.length();
+                        // just append beginToken and search further
+                        b.append(beginToken);
+                        i = index + beginToken.length();
                     }
-                } while ((index = line.indexOf( startOftoken, i )) > -1 );
+                } while ((index = line.indexOf( beginToken, i )) > -1 );
                 
                 b.append(line.substring(i));
                 return b.toString();
diff --git a/src/main/org/apache/tools/ant/types/FilterSetCollection.java b/src/main/org/apache/tools/ant/types/FilterSetCollection.java
new file mode 100644
index 0000000..e521a26
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/FilterSetCollection.java
@@ -0,0 +1,127 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Ant", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.tools.ant.types;
+
+// java io classes
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+// java util classes
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Properties;
+import java.util.Vector;
+
+// ant classes
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+/**
+ * A FilterSetCollection is a collection of filtersets each of which may have
+ * a different start/end token settings.
+ *
+ * @author     <A href="mailto:conor@apache.org">Conor MacNeill</A>
+ */
+public class FilterSetCollection {
+    
+    private Vector filterSets = new Vector();
+
+    public FilterSetCollection() {
+    }
+    
+    public FilterSetCollection(FilterSet filterSet) {
+        addFilterSet(filterSet);
+    }
+    
+    
+    public void addFilterSet(FilterSet filterSet) {
+        filterSets.addElement(filterSet);
+    }
+    
+    /**
+     * Does replacement on the given string with token matching.
+     * This uses the defined begintoken and endtoken values which default to @ for both.
+     *
+     * @param line  The line to process the tokens in.
+     * @return      The string with the tokens replaced.
+     */
+    public String replaceTokens(String line) {
+        String replacedLine = line;
+        for (Enumeration e = filterSets.elements(); e.hasMoreElements();) {
+            FilterSet filterSet = (FilterSet)e.nextElement();
+            replacedLine = filterSet.replaceTokens(replacedLine);
+        }
+        return replacedLine;
+    }
+    
+    /**
+    * Test to see if this filter set it empty.
+    *
+    * @return   Return true if there are filter in this set otherwise false.
+    */
+    public boolean hasFilters() {
+        for (Enumeration e = filterSets.elements(); e.hasMoreElements();) {
+            FilterSet filterSet = (FilterSet)e.nextElement();
+            if (filterSet.hasFilters()) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
+ 
+
+
diff --git a/src/main/org/apache/tools/ant/util/FileUtils.java b/src/main/org/apache/tools/ant/util/FileUtils.java
index 03d3b96..3e01bda 100644
--- a/src/main/org/apache/tools/ant/util/FileUtils.java
+++ b/src/main/org/apache/tools/ant/util/FileUtils.java
@@ -61,7 +61,7 @@
 
 import org.apache.tools.ant.BuildException; 
 import org.apache.tools.ant.Project; 
-import org.apache.tools.ant.types.FilterSet; 
+import org.apache.tools.ant.types.FilterSetCollection; 
 
 /**
  * This class also encapsulates methods which allow Files to be
@@ -106,10 +106,10 @@
      *
      * @throws IOException
      */
-    public void copyFile(String sourceFile, String destFile, FilterSet filterSet)
+    public void copyFile(String sourceFile, String destFile, FilterSetCollection filters)
         throws IOException
     {
-        copyFile(new File(sourceFile), new File(destFile), filterSet, false, false);
+        copyFile(new File(sourceFile), new File(destFile), filters, false, false);
     }
 
     /**
@@ -119,9 +119,9 @@
      *
      * @throws IOException 
      */
-    public void copyFile(String sourceFile, String destFile, FilterSet filterSet,
+    public void copyFile(String sourceFile, String destFile, FilterSetCollection filters,
                          boolean overwrite) throws IOException {
-        copyFile(new File(sourceFile), new File(destFile), filterSet, 
+        copyFile(new File(sourceFile), new File(destFile), filters, 
                  overwrite, false);
     }
 
@@ -134,10 +134,10 @@
      *
      * @throws IOException 
      */
-    public void copyFile(String sourceFile, String destFile, FilterSet filterSet,
+    public void copyFile(String sourceFile, String destFile, FilterSetCollection filters,
                          boolean overwrite, boolean preserveLastModified)
         throws IOException {
-        copyFile(new File(sourceFile), new File(destFile), filterSet, 
+        copyFile(new File(sourceFile), new File(destFile), filters, 
                  overwrite, preserveLastModified);
     }
 
@@ -157,9 +157,9 @@
      *
      * @throws IOException
      */
-    public void copyFile(File sourceFile, File destFile, FilterSet filterSet)
+    public void copyFile(File sourceFile, File destFile, FilterSetCollection filters)
         throws IOException {
-        copyFile(sourceFile, destFile, filterSet, false, false);
+        copyFile(sourceFile, destFile, filters, false, false);
     }
 
     /**
@@ -169,9 +169,9 @@
      *
      * @throws IOException 
      */
-    public void copyFile(File sourceFile, File destFile, FilterSet filterSet,
+    public void copyFile(File sourceFile, File destFile, FilterSetCollection filters,
                          boolean overwrite) throws IOException {
-        copyFile(sourceFile, destFile, filterSet, overwrite, false);
+        copyFile(sourceFile, destFile, filters, overwrite, false);
     }
 
     /**
@@ -183,7 +183,7 @@
      *
      * @throws IOException 
      */
-    public void copyFile(File sourceFile, File destFile, FilterSet filterSet,
+    public void copyFile(File sourceFile, File destFile, FilterSetCollection filters,
                          boolean overwrite, boolean preserveLastModified)
         throws IOException {
         
@@ -201,7 +201,7 @@
                 parent.mkdirs();
             }
 
-            if (filterSet != null && filterSet.hasFilters()) {
+            if (filters != null && filters.hasFilters()) {
                 BufferedReader in = new BufferedReader(new FileReader(sourceFile));
                 BufferedWriter out = new BufferedWriter(new FileWriter(destFile));
 
@@ -212,7 +212,7 @@
                     if (line.length() == 0) {
                         out.newLine();
                     } else {
-                        newline = filterSet.replaceTokens(line);
+                        newline = filters.replaceTokens(line);
                         out.write(newline);
                         out.newLine();
                     }
diff --git a/src/main/org/apache/tools/ant/util/SourceFileScanner.java b/src/main/org/apache/tools/ant/util/SourceFileScanner.java
index 57d7771..ac15e41 100644
--- a/src/main/org/apache/tools/ant/util/SourceFileScanner.java
+++ b/src/main/org/apache/tools/ant/util/SourceFileScanner.java
@@ -74,11 +74,14 @@
 
     protected Task task;
 
+    private FileUtils fileUtils;
+
     /**
      * @param task The task we should log messages through
      */
     public SourceFileScanner(Task task) {
         this.task = task;
+        fileUtils = FileUtils.newFileUtils();
     }
 
     /**
@@ -118,7 +121,13 @@
                 continue;
             }
 
-            File src = new File(srcDir, files[i]);
+            File src = null;
+            if (srcDir == null) {
+                src = new File(files[i]);
+            } else {
+                src = fileUtils.resolveFile(srcDir, files[i]);
+            }
+
             if (src.lastModified() > now) {
                 task.log("Warning: "+files[i]+" modified in the future.", 
                          Project.MSG_WARN);
@@ -131,7 +140,7 @@
                 if (destDir == null) {
                     dest = new File(targets[j]);
                 } else {
-                    dest = new File(destDir, targets[j]);
+                    dest = fileUtils.resolveFile(destDir, targets[j]);
                 }
                 
                 if (!dest.exists()) {
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/TaskdefsTest.java b/src/testcases/org/apache/tools/ant/taskdefs/TaskdefsTest.java
index 7e67ce9..dede67a 100644
--- a/src/testcases/org/apache/tools/ant/taskdefs/TaskdefsTest.java
+++ b/src/testcases/org/apache/tools/ant/taskdefs/TaskdefsTest.java
@@ -66,6 +66,7 @@
     protected Project project;
     
     private StringBuffer logBuffer;
+    private StringBuffer fullLogBuffer;
     private StringBuffer outBuffer;
     private StringBuffer errBuffer;
     private BuildException buildException;
@@ -78,6 +79,12 @@
         return logBuffer.toString();
     }
 
+    protected String getFullLog() { 
+        return fullLogBuffer.toString();
+    }
+
+    
+
     protected void expectBuildException(String taskname, String cause) { 
         expectSpecificBuildException(taskname, cause, null);
     }
@@ -136,6 +143,7 @@
     
     protected void configureProject(String filename) { 
         logBuffer = new StringBuffer();
+        fullLogBuffer = new StringBuffer();
         project = new Project();
         project.init();
         project.setUserProperty( "ant.file" , new File(filename).getAbsolutePath() );
@@ -156,6 +164,7 @@
             PrintStream err = new PrintStream(new AntOutputStream());
             System.setErr(err);
             logBuffer = new StringBuffer();
+            fullLogBuffer = new StringBuffer();
             buildException = null;
             project.executeTarget(targetName);
         } finally { 
@@ -253,6 +262,8 @@
             {
                 logBuffer.append(event.getMessage());
             }
+            fullLogBuffer.append(event.getMessage());
+            
         }
     }
 
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/AbstractXSLTLiaisonTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/AbstractXSLTLiaisonTest.java
new file mode 100644
index 0000000..3b617f8
--- /dev/null
+++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/AbstractXSLTLiaisonTest.java
@@ -0,0 +1,133 @@
+package org.apache.tools.ant.taskdefs.optional;
+
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Jakarta-Regexp", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+import junit.framework.TestCase;
+import org.apache.tools.ant.taskdefs.XSLTLiaison;
+import org.w3c.dom.Document;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.net.URL;
+
+/**
+ * Abtract testcase for XSLTLiaison.
+ * Override createLiaison for each XSLTLiaison.
+ *
+ * <a href="sbailliez@apache.org">Stephane Bailliez</a>
+ */
+public abstract class AbstractXSLTLiaisonTest extends TestCase {
+
+    protected XSLTLiaison liaison;
+
+    protected  AbstractXSLTLiaisonTest(String name){
+        super(name);
+    }
+
+    protected void setUp() throws Exception {
+        liaison = createLiaison();
+    }
+
+    // to override
+    protected abstract XSLTLiaison createLiaison() throws Exception ;
+
+    /** load the file from the caller classloader that loaded this class */
+    protected File getFile(String name) throws FileNotFoundException {
+        URL url = getClass().getResource(name);
+        if (url == null){
+          throw new FileNotFoundException("Unable to load '" + name + "' from classpath");
+        }
+        return new File(url.getFile());
+    }
+
+    /** keep it simple stupid */
+    public void testTransform() throws Exception {
+        File xsl = getFile("/taskdefs/optional/xsltliaison-in.xsl");
+        liaison.setStylesheet(xsl);
+        liaison.addParam("param", "value");
+        File in = getFile("/taskdefs/optional/xsltliaison-in.xml");
+        File out = new File("xsltliaison.tmp");
+        try {
+            liaison.transform(in, out);
+        } finally {
+            out.delete();
+        }
+    }
+
+    public void testEncoding() throws Exception {
+        File xsl = getFile("/taskdefs/optional/xsltliaison-encoding-in.xsl");
+        liaison.setStylesheet(xsl);
+        File in = getFile("/taskdefs/optional/xsltliaison-encoding-in.xml");
+        File out = new File("xsltliaison-encoding.tmp");
+        try {
+            liaison.transform(in, out);
+            Document doc = parseXML(out);
+            assertEquals("root",doc.getDocumentElement().getNodeName());
+            assertEquals("message",doc.getDocumentElement().getFirstChild().getNodeName());
+            assertEquals("\u00E9\u00E0\u00E8\u00EF\u00F9",doc.getDocumentElement().getFirstChild().getFirstChild().getNodeValue());
+        } finally {
+            out.delete();
+        }
+    }
+
+    public Document parseXML(File file) throws Exception {
+        DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder dbuilder = dbfactory.newDocumentBuilder();
+        return dbuilder.parse(file);
+    }
+}
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/TraXLiaisonTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/TraXLiaisonTest.java
new file mode 100644
index 0000000..0e63e64
--- /dev/null
+++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/TraXLiaisonTest.java
@@ -0,0 +1,87 @@
+package org.apache.tools.ant.taskdefs.optional;
+
+import org.apache.tools.ant.taskdefs.XSLTLiaison;
+
+import java.io.File;
+
+/* 
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:  
+ *       "This product includes software developed by the 
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Jakarta-Regexp", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written 
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+/**
+ * TraX XSLTLiaison testcase
+ * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
+ */
+public class TraXLiaisonTest extends AbstractXSLTLiaisonTest {
+    public TraXLiaisonTest(String name){
+        super(name);
+    }
+
+    public XSLTLiaison createLiaison() throws Exception {
+        return new TraXLiaison();
+    }
+
+    public void testXalan2Redirect() throws Exception {
+        File xsl = getFile("/taskdefs/optional/xalan-redirect-in.xsl");
+        liaison.setStylesheet(xsl);
+        File out = new File("xalan2-redirect-out-dummy.tmp");
+        File in = getFile("/taskdefs/optional/xsltliaison-in.xsl");
+        try {
+            liaison.addParam("xalan-version", "2");
+            liaison.transform(in, out);
+        } finally {
+            out.delete();
+        }
+    }
+}
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/XalanLiaisonTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/XalanLiaisonTest.java
new file mode 100644
index 0000000..4aa4c13
--- /dev/null
+++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/XalanLiaisonTest.java
@@ -0,0 +1,88 @@
+package org.apache.tools.ant.taskdefs.optional;
+
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:  
+ *       "This product includes software developed by the 
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Jakarta-Regexp", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written 
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+import org.apache.tools.ant.taskdefs.XSLTLiaison;
+
+import java.io.File;
+
+/**
+ * Xalan Liaison testcase
+ * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
+ */
+public class XalanLiaisonTest extends AbstractXSLTLiaisonTest {
+    public XalanLiaisonTest(String name){
+        super(name);
+    }
+
+    protected XSLTLiaison createLiaison() throws Exception {
+        return new XalanLiaison();
+    }
+
+    public void testXalan1Redirect() throws Exception {
+        File xsl = getFile("/taskdefs/optional/xalan-redirect-in.xsl");
+        liaison.setStylesheet(xsl);
+        File out = new File("xalan1-redirect-out-dummy.tmp");
+        File in = getFile("/taskdefs/optional/xsltliaison-in.xsl");
+        try {
+            liaison.addParam("xalan-version", "1");
+            liaison.transform(in, out);
+        } finally {
+            out.delete();
+        }
+    }
+}
+
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/XslpLiaisonTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/XslpLiaisonTest.java
new file mode 100644
index 0000000..fb6a771
--- /dev/null
+++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/XslpLiaisonTest.java
@@ -0,0 +1,72 @@
+package org.apache.tools.ant.taskdefs.optional;
+
+import org.apache.tools.ant.taskdefs.XSLTLiaison;
+
+/* 
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:  
+ *       "This product includes software developed by the 
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Jakarta-Regexp", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written 
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+/**
+ * XSLP Liaison testcase
+ * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
+ */
+public class XslpLiaisonTest extends AbstractXSLTLiaisonTest {
+    public XslpLiaisonTest(String name){
+        super(name);
+    }
+
+    protected XSLTLiaison createLiaison() throws Exception {
+        return new XslpLiaison();
+    }
+}
diff --git a/src/testcases/org/apache/tools/ant/types/DescriptionTest.java b/src/testcases/org/apache/tools/ant/types/DescriptionTest.java
new file mode 100644
index 0000000..a0ffe8b
--- /dev/null
+++ b/src/testcases/org/apache/tools/ant/types/DescriptionTest.java
@@ -0,0 +1,102 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Ant", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.tools.ant.types;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.TaskdefsTest;
+
+import junit.framework.TestCase;
+import junit.framework.AssertionFailedError;
+
+import java.io.*;
+
+/**
+ * FilterSet testing
+ *
+ * @author <a href="mailto:conor@apache.org">Conor MacNeill</a>
+ */
+public class DescriptionTest extends TaskdefsTest {
+
+    public DescriptionTest(String name) {
+        super(name);
+    }
+
+    public void setUp() { 
+    }
+
+    public void tearDown() {
+    }
+
+    public void test1() { 
+        configureProject("src/etc/testcases/types/description1.xml");
+        assertEquals("Single description failed", "Test Project Description", project.getDescription());
+    }
+
+    public void test2() { 
+        configureProject("src/etc/testcases/types/description2.xml");
+        assertEquals("Multi line description failed", "Multi Line\nProject Description", project.getDescription());
+    }
+    
+    public void test3() { 
+        configureProject("src/etc/testcases/types/description3.xml");
+        assertEquals("Multi instance description failed", "Multi Instance Project Description", project.getDescription());
+    }
+    
+    public void test4() { 
+        configureProject("src/etc/testcases/types/description4.xml");
+        assertEquals("Multi instance nested description failed", "Multi Instance Nested Project Description", project.getDescription());
+    }
+}
diff --git a/src/testcases/org/apache/tools/ant/types/FilterSetTest.java b/src/testcases/org/apache/tools/ant/types/FilterSetTest.java
new file mode 100644
index 0000000..9982c31
--- /dev/null
+++ b/src/testcases/org/apache/tools/ant/types/FilterSetTest.java
@@ -0,0 +1,146 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2001 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Ant", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.tools.ant.types;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.TaskdefsTest;
+
+import junit.framework.TestCase;
+import junit.framework.AssertionFailedError;
+
+import java.io.*;
+
+/**
+ * FilterSet testing
+ *
+ * @author <a href="mailto:conor@apache.org">Conor MacNeill</a>
+ */
+public class FilterSetTest extends TaskdefsTest {
+
+    static private final int BUF_SIZE = 32768;
+    
+    public FilterSetTest(String name) {
+        super(name);
+    }
+
+    public void setUp() { 
+        configureProject("src/etc/testcases/types/filterset.xml");
+    }
+
+    public void tearDown() {
+        executeTarget("cleanup");
+    }
+
+    public void test1() { 
+        executeTarget("test1");
+        assertTrue("Filterset 1 failed", compareFiles("src/etc/testcases/types/gold/filterset1.txt",
+                                                      "src/etc/testcases/types/dest1.txt"));
+    }
+
+    public void test2() { 
+        executeTarget("test2");
+        assertTrue("Filterset 2 failed", compareFiles("src/etc/testcases/types/gold/filterset2.txt",
+                                                      "src/etc/testcases/types/dest2.txt"));
+    }
+
+    public void test3() { 
+        executeTarget("test3");
+        assertTrue("Filterset 3 failed", compareFiles("src/etc/testcases/types/gold/filterset3.txt",
+                                                      "src/etc/testcases/types/dest3.txt"));
+    }
+
+    private boolean compareFiles(String name1, String name2) {
+        File file1 = new File(name1);
+        File file2 = new File(name2);
+        
+        try {
+            if (!file1.exists() || !file2.exists()) {
+                System.out.println("One or both files do not exist:" + name1 + ", " + name2);
+                return false;
+            }
+            
+            if (file1.length() != file2.length()) {
+                System.out.println("File size mismatch:" + name1 + "(" + file1.length() + "), " + 
+                                   name2  + "(" + file2.length() + ")");
+                return false;
+            }
+            
+            // byte - byte compare
+            byte[] buffer1 = new byte[BUF_SIZE];
+            byte[] buffer2 = new byte[BUF_SIZE];
+            
+            FileInputStream fis1 = new FileInputStream(file1);
+            FileInputStream fis2 = new FileInputStream(file2);
+            int index = 0;
+            int read = 0;
+            while ((read = fis1.read(buffer1)) != -1) {
+                fis2.read(buffer2);
+                for (int i = 0; i < read; ++i, ++index) {
+                    if (buffer1[i] != buffer2[i]) {
+                        System.out.println("Bytes mismatch:" + name1 + ", " + name2 + 
+                                           " at byte " + index);
+                        return false;
+                    }
+                }
+            }
+            return true;
+        }
+        catch (IOException e) {
+            System.out.println("IOException comparing files: " + name1 + ", " + name2);
+            return false;
+        }
+    }
+}
diff --git a/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java b/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java
index cdceb38..a33699f 100644
--- a/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java
+++ b/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java
@@ -77,7 +77,8 @@
 
     public void setUp() {
         fu = FileUtils.newFileUtils();
-        root = new File(File.separator).getAbsolutePath();
+        // Windows adds the drive letter in uppercase, unless you run Cygnus
+        root = new File(File.separator).getAbsolutePath().toUpperCase();
     }
 
     public void tearDown() {
diff --git a/xdocs/antnews.xml b/xdocs/antnews.xml
index 92a90c9..600d523 100644
--- a/xdocs/antnews.xml
+++ b/xdocs/antnews.xml
@@ -19,7 +19,7 @@
 
   <section name="Ant 2.0 Requirements Collected - Next is Design">
       <p>A commented version of the collected user requirements is now
-      available <a href="/ant/ant2/features.html">here</a> - it is not
+      available <a href="ant2/features.html">here</a> - it is not
       complete as some details still have to be defined, but it should
       give you an idea of what Ant2 is going to look like.</p>
 
@@ -61,20 +61,20 @@
         To advance the definition of Ant, user requirements are now being accepted on the 
         Ant-Dev mailing list. Any requirement will be accepted for consideration. The 
         requirements are being collected into a document which is available 
-        <a href="/ant/ant2/requested-features.txt">on-line</a>. New features will be excepted 
+        <a href="ant2/requested-features.txt">on-line</a>. New features will be excepted 
         until March 21st, 2001. At that time, each requirement will be discussed 
         for inclusion in an Ant 2.0 requirement document.
       </p>
       
       <p>
         For your reference some of the goals which have shaped the development of Ant 1.x are
-        available <a href="/ant/ant2/original-specification.html">here</a>. These continue to be
+        available <a href="ant2/original-specification.html">here</a>. These continue to be
         relevant to Ant 2.0.
       </p>
       
       <p>
         If you want to shape the future of Ant, join the 
-        <a href="/site/mail.html">Ant-Dev mailing list</a> and contribute
+        <a href="http://jakarta.apache.org/site/mail.html">Ant-Dev mailing list</a> and contribute
         your ideas.
       </p>
   </section>
@@ -87,7 +87,7 @@
     </p>
     
     <p>You can download the release from 
-        <a href="http://jakarta.apache.org/builds/jakarta-ant/release/v1.3/">here</a>. 
+        <a href="http://www.apache.org/dist/jakarta/jakarta-ant/release/v1.3/">here</a>. 
        Both source and binary releases are available in zip, tarball and RPM formats.
     </p>
     <p>Please report all bugs using the 
diff --git a/xdocs/external.xml b/xdocs/external.xml
index 7bf5780..98e5bba 100644
--- a/xdocs/external.xml
+++ b/xdocs/external.xml
@@ -241,7 +241,31 @@
 
     </section>
 
-    <section name="IDE/Editor Integration">
+    <section name="IDE and Editor Integration">
+
+      <subsection name="AntFarm">
+
+        <p>A plugin that integrates Ant into the jEdit editor.</p>
+
+        <table>
+          <tr>
+            <th>Compatibility:</th>
+            <td>bundles Ant 1.3</td>
+          </tr>
+          <tr>
+            <th>URL:</th>
+            <td><a href="http://plugins.jedit.org/plugins/AntFarm">http://plugins.jedit.org/plugins/AntFarm</a></td>
+          </tr>
+          <tr>
+            <th>Contact:</th>
+            <td><a href="mailto:jedit-devel@lists.sourceforge.net">jEdit developers mailinglist</a></td>
+          </tr>
+          <tr>
+            <th>License:</th>
+            <td>Apache Software License</td>
+          </tr>
+        </table>
+      </subsection>
 
       <subsection name="AntRunner">
 
diff --git a/xdocs/faq.xml b/xdocs/faq.xml
index 932b30a..f9f0aab 100644
--- a/xdocs/faq.xml
+++ b/xdocs/faq.xml
@@ -81,6 +81,16 @@
             <td>1.3</td>
             <td>3 March 2001</td>
           </tr>
+
+          <tr>
+            <td>1.4</td>
+            <td>3 September 2001</td>
+          </tr>
+
+          <tr>
+            <td>1.4.1</td>
+            <td>11 October 2001</td>
+          </tr>
         </table>
       </answer>
     </faq>
@@ -176,12 +186,6 @@
           </tr>
 
           <tr>
-            <td>-nowarn</td>
-            <td>build.compiler.warnings</td>
-            <td>true == not set</td>
-          </tr>
-
-          <tr>
             <td>+P</td>
             <td>build.compiler.pedantic</td>
             <td>false == not set</td>
@@ -192,6 +196,14 @@
             <td>build.compiler.fulldepend</td>
             <td>false == not set</td>
           </tr>
+
+          <tr>
+            <td><strong>only for Ant &lt; 1.4, replaced by the nowarn
+                attribute of javac after that</strong> -nowarn</td>
+            <td>build.compiler.warnings</td>
+            <td>true == not set</td>
+          </tr>
+
         </table>
 
       </answer>
@@ -252,7 +264,7 @@
     <faq id="integration">
       <question>Is Ant supported by my IDE/Editor?</question>
       <answer>
-        <p>See the <a href="external.html#IDE%47Editor+Integration">section 
+        <p>See the <a href="external.html#IDE and Editor Integration">section 
         on IDE integration</a> on our external tools page.</p>
       </answer>
     </faq>
diff --git a/xdocs/index.xml b/xdocs/index.xml
index 7bfc2d8..0c56163 100644
--- a/xdocs/index.xml
+++ b/xdocs/index.xml
@@ -72,11 +72,11 @@
     You can download the latest release:
     </p>
     <ul>
-        <li><a href="http://jakarta.apache.org/builds/jakarta-ant/release/v1.3/bin/">
+        <li><a href="http://www.apache.org/dist/jakarta/jakarta-ant/release/v1.4.1/bin/">
                 Download the binary release</a></li>
-        <li><a href="http://jakarta.apache.org/builds/jakarta-ant/release/v1.3/src/">
+        <li><a href="http://www.apache.org/dist/jakarta/jakarta-ant/release/v1.4.1/src/">
                 Download the source release</a></li>
-        <li><a href="http://jakarta.apache.org/builds/jakarta-ant/release/v1.3/rpms/">
+        <li><a href="http://www.apache.org/dist/jakarta/jakarta-ant/release/v1.4.1/rpms/">
                 Download source and binary RPMs</a></li>
     </ul>  
   </section>
@@ -84,7 +84,7 @@
   <section name="Nightly Builds">
     <p>
     If you wish to use the latest Ant features, you can try downloading a nightly 
-    build from <a href="http://jakarta.apache.org/builds/jakarta-ant/nightly/">here</a>
+    build from <a href="http://www.apache.org/dist/jakarta/jakarta-ant/nightly/">here</a>
     </p>
     
   </section>
diff --git a/xdocs/problems.xml b/xdocs/problems.xml
index 34a4897..c422c11 100644
--- a/xdocs/problems.xml
+++ b/xdocs/problems.xml
@@ -101,12 +101,12 @@
           Chances are that someone else may have already encountered this problem and perhaps it has been
           fixed. The next step, therefore, may be to try a nightly build of Ant to see if the 
           problem has been fixed. Nightly builds for Ant are available from the 
-          <a href="/builds/jakarta-ant/nightly/">Jakarta web site</a>. While Ant nightly
-          builds are typically quite stable and are used by <a href="/builds/gump/latest/">
+          <a href="http://www.apache.org/dist/jakarta/jakarta-ant/nightly/">Jakarta web site</a>. While Ant nightly
+          builds are typically quite stable and are used by <a href="http://www.apache.org/dist/jakarta/gump/latest/">
           Gump</a> to build many other Jakarta projects, these builds should be treated as experimental. You can 
           install and verify whether your problem has been fixed. Note that nightly builds do not build many of the
           optional tasks the come with Ant. A snapshot of these optional tasks is occasionally uploaded to the nightly 
-          download <a href="/builds/jakarta-ant/nightly/optional/">area</a>. Note that even 
+          download <a href="http://www.apache.org/dist/jakarta/jakarta-ant/nightly/optional/">area</a>. Note that even 
           this snapshot does not contain every optional task.
         </p>
       </subsection>
diff --git a/xdocs/resources.xml b/xdocs/resources.xml
index beb3995..108a046 100644
--- a/xdocs/resources.xml
+++ b/xdocs/resources.xml
@@ -7,10 +7,41 @@
   </properties>
 
   <body>
+
+    <section name="FAQs">
+      <subsection name="At Ant's website">
+
+        <p>Starting with the release of Ant 1.4 the Ant's FAQ is
+        bundled with the distribution, the most recent version can
+        always be found at the website.</p>
+
+        <table>
+          <tr>
+            <th>FAQ</th>
+            <td><a href="faq.html">http://jakarta.apache.org/ant/faq.html</a></td>
+          </tr>
+        </table>
+      </subsection>
+
+      <subsection name="jGuru">
+        <p>jGuru hosts an interactive Ant discussion forum and FAQ system</p>
+
+        <table>
+          <tr>
+            <th>Forum</th>
+            <td><a href="http://www.jguru.com/forums/home.jsp?topic=Ant">http://www.jguru.com/forums/home.jsp?topic=Ant</a></td>
+          </tr>
+          <tr>
+            <th>FAQ</th>
+            <td><a href="http://www.jguru.com/faq/home.jsp?topic=Ant">http://www.jguru.com/faq/home.jsp?topic=Ant</a></td>
+          </tr>
+        </table>
+      </subsection>
+    </section>
     
     <section name="Articles and Presentations">
 
-      <p>This page lists articles and presentations written about Ant.  If
+      <p>The following sections list articles and presentations written about Ant.  If
       you've written something that should be included, please post it to one
       of the mailing lists.</p>
 
@@ -30,7 +61,7 @@
           </tr>
           <tr>
             <th>URL:</th>
-            <td><a href="http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant/docs/ant_in_anger.html?content-type=text/html">http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant/docs/ant_in_anger.html?content-type=text/html</a></td>
+            <td><a href="ant_in_anger.html">http://jakarta.apache.org/ant/ant_in_anger.html</a></td>
           </tr>
         </table>
       </subsection>
@@ -46,7 +77,22 @@
           </tr>
           <tr>
             <th>URL:</th>
-            <td><a href="http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant/docs/ant_task_guidelines.html?content-type=text/html">http://cvs.apache.org/viewcvs/~checkout~/jakarta-ant/docs/ant_task_guidelines.html?content-type=text/html</a></td>
+            <td><a href="ant_task_guidelines.html">http://jakarta.apache.org/ant/ant_task_guidelines.html</a></td>
+          </tr>
+        </table>
+      </subsection>
+
+      <subsection name="Automating the build and test process">
+        <p>This article demonstrates an approach to the automated build and test process. Working with Ant 1.3 and the JUnit test framework, it shows how to automate a process that captures pertinent information about each test suite run, generates an attractive report, and e-mails the report.</p>
+
+        <table>
+          <tr>
+            <th>Author:</th>
+            <td><a href="mailto:erik@hatcher.net">Erik Hatcher</a></td>
+          </tr>
+          <tr>
+            <th>URL:</th>
+            <td><a href="http://www.ibm.com/developerworks/java/library/j-junitmail/">http://www.ibm.com/developerworks/java/library/j-junitmail/</a></td>
           </tr>
         </table>
       </subsection>
@@ -97,7 +143,7 @@
           </tr>
           <tr>
             <th>URL:</th>
-            <td><a href="http://jakarta.apache.org/commons/cactus/ant.html">http://jakarta.apache.org/commons/cactus/ant.html</a></td>
+            <td><a href="http://jakarta.apache.org/cactus/howto_ant_primer.html">http://jakarta.apache.org/cactus/howto_ant_primer.html</a></td>
           </tr>
         </table>
       </subsection>
@@ -203,6 +249,22 @@
     </section>
 
     <section name="Presentations">
+
+      <subsection name="Ant - presented to the Tucson Java Users Group">
+        <p>A PowerPoint technical overview presentation on Ant.  Comes complete with a straightforward example demonstrating code compilation, JAR'ing, JUnit testing, JUnit reporting, and Zipping a distribution.  A few advanced topics are touched upon like property immutabality and using &lt;antcall&gt; to get around it, build listeners, and writing custom tasks.</p>
+
+        <table>
+          <tr>
+            <th>Author:</th>
+            <td><a href="mailto:erik@hatcher.net">Erik Hatcher</a></td>
+          </tr>
+          <tr>
+            <th>URL:</th>
+            <td><a href="http://erik.hatcher.net/ant-jug.zip">http://erik.hatcher.net/ant-jug.zip</a></td>
+          </tr>
+        </table>
+      </subsection>
+
       <subsection name="Ant Build Tool">
         <p>A PowerPoint presentation on Ant 1.2.  It provides a basic overview
         of Ant&apos;s capabilities.</p>