[maven-scm] copy for tag doxia-sitetools-1.1.1

git-svn-id: https://svn.apache.org/repos/asf/maven/doxia/doxia-sitetools/tags/doxia-sitetools-1.1.1@785657 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/PathUtils.java b/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/PathUtils.java
index 5752e32..b9ba076 100644
--- a/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/PathUtils.java
+++ b/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/PathUtils.java
@@ -42,7 +42,7 @@
     }
 
     /**
-     * <p>convertPath</p>
+     * <p>convertPath.</p>
      *
      * @param oldPath not null
      * @param newPath not null
@@ -63,7 +63,7 @@
     }
 
     /**
-     * <p>getRelativePath</p>
+     * <p>getRelativePath.</p>
      *
      * @param oldPathDescriptor not null
      * @param newPathDescriptor not null
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
index ebf19cf..311e902 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
@@ -79,11 +79,11 @@
     //--------------------------------------------
 
     /**
-     * Render a document from the files found in a Map.
+     * Render an aggregate document from the files found in a Map.
      *
      * @param filesToProcess the Map of Files to process. The Map should contain as keys the paths of the
      *      source files (relative to {@link #getBaseDir() baseDir}), and the corresponding SiteModule as values.
-     * @param outputDirectory the output directory where the document should be generated.
+     * @param outputDirectory the output directory where the aggregate document should be generated.
      * @param documentModel the document model, containing all the metadata, etc.
      * @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any
      * @throws java.io.IOException if any
@@ -118,11 +118,12 @@
      * @param outputDirectory the output directory where the document should be generated.
      * @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any
      * @throws java.io.IOException if any
+     * @see #render(File, File, DocumentModel)
      */
     public void render( File baseDirectory, File outputDirectory )
         throws DocumentRendererException, IOException
     {
-        render( baseDirectory, outputDirectory, new DocumentModel() );
+        render( baseDirectory, outputDirectory, (DocumentModel) null );
     }
 
     /**
@@ -135,6 +136,8 @@
      *              If this file does not exist or is null, some default settings will be used.
      * @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any
      * @throws java.io.IOException if any
+     * @see #render(File, File) if documentDescriptor does not exist or is null
+     * @see #render(Map, File, DocumentModel) otherwise
      */
     public void render( File baseDirectory, File outputDirectory, File documentDescriptor )
         throws DocumentRendererException, IOException
@@ -155,6 +158,22 @@
     }
 
     /**
+     * Render documents separately for each file found in a Map.
+     *
+     * @param filesToProcess the Map of Files to process. The Map should contain as keys the paths of the
+     *      source files (relative to {@link #getBaseDir() baseDir}), and the corresponding SiteModule as values.
+     * @param outputDirectory the output directory where the documents should be generated.
+     * @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any
+     * @throws java.io.IOException if any
+     * @since 1.1.1
+     */
+    public void renderIndividual( Map filesToProcess, File outputDirectory )
+        throws DocumentRendererException, IOException
+    {
+        // nop
+    }
+
+    /**
      * Returns a Map of files to process. The Map contains as keys the paths of the source files
      *      (relative to {@link #getBaseDir() baseDir}), and the corresponding SiteModule as values.
      *
@@ -340,6 +359,11 @@
     protected void parse( String fullDocPath, String parserId, Sink sink )
         throws DocumentRendererException, IOException
     {
+        if ( getLogger().isDebugEnabled() )
+        {
+            getLogger().debug( "Parsing file " + fullDocPath );
+        }
+
         Reader reader = null;
         try
         {
@@ -391,10 +415,17 @@
     {
         File resourcesDirectory = new File( getBaseDir(), "resources" );
 
-        if ( resourcesDirectory.isDirectory() && outputDirectory.isDirectory() )
+        if ( !resourcesDirectory.isDirectory() )
         {
-            copyDirectory( resourcesDirectory, outputDirectory );
+            return;
         }
+
+        if ( !outputDirectory.exists() )
+        {
+            outputDirectory.mkdirs();
+        }
+
+        copyDirectory( resourcesDirectory, outputDirectory );
     }
 
     /**
@@ -435,4 +466,34 @@
             }
         }
     }
+
+    /**
+     * @param documentModel not null
+     * @return the output name defined in the documentModel without the output extension. If the output name is not
+     * defined, return target by default.
+     * @since 1.1.1
+     * @see org.apache.maven.doxia.document.DocumentModel#getOutputName()
+     * @see #getOutputExtension()
+     */
+    protected String getOutputName( DocumentModel documentModel )
+    {
+        String outputName = documentModel.getOutputName();
+        if ( outputName == null )
+        {
+            getLogger().info( "No outputName is defined in the document descriptor. Using 'target'" );
+
+            documentModel.setOutputName( "target" );
+        }
+
+        outputName = outputName.trim();
+        if ( outputName.toLowerCase( Locale.ENGLISH ).endsWith( "." + getOutputExtension() ) )
+        {
+            outputName =
+                outputName.substring( 0, outputName.toLowerCase( Locale.ENGLISH )
+                                                   .lastIndexOf( "." + getOutputExtension() ) );
+        }
+        documentModel.setOutputName( outputName );
+
+        return documentModel.getOutputName();
+    }
 }
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocRenderer.java
index f3d1464..bece559 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocRenderer.java
@@ -27,7 +27,7 @@
  *
  * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
  * @version $Id$
- * @deprecated Use {@link DocumentRenderer} instead.
+ * @deprecated Since 1.1, use {@link DocumentRenderer} instead.
  */
 public interface DocRenderer
 {
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
index f951ee4..818c535 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
@@ -47,6 +47,7 @@
      * @param documentModel the document model, containing all the metadata, etc.
      *              If the model contains a TOC, only the files found in this TOC are rendered,
      *              otherwise all files from the Collection of files will be processed.
+     *              If the model is null, render all files individually.
      * @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any.
      * @throws java.io.IOException if any.
      */
@@ -62,6 +63,7 @@
      * @param documentModel the document model, containing all the metadata, etc.
      *              If the model contains a TOC, only the files found in this TOC are rendered,
      *              otherwise all files found under baseDirectory will be processed.
+     *              If the model is null, render all files from baseDirectory individually.
      * @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any
      * @throws java.io.IOException if any
      */
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/AbstractITextRender.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/AbstractITextRender.java
index 8e9a22b..27eff21 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/AbstractITextRender.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/AbstractITextRender.java
@@ -75,12 +75,13 @@
  *
  * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
  * @version $Id$
+ * @deprecated since 1.1, use an implementation of {@link org.apache.maven.doxia.docrenderer.DocumentRenderer}.
  */
 public abstract class AbstractITextRender
     extends AbstractLogEnabled
     implements DocRenderer
 {
-    private static final String XSLT_RESOURCE = "org/apache/maven/doxia/docrenderer/itext/xslt/TOC.xslt";
+    private static final String XSLT_RESOURCE = "org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt";
 
     private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance();
 
@@ -316,6 +317,8 @@
                 reader = ReaderFactory.newPlatformReader( f );
             }
 
+            System.setProperty( "itext.basedir", outputITextFile.getParentFile().getAbsolutePath() );
+
             doxia.parse( reader, module.getParserId(), sink );
         }
         catch ( ParserNotFoundException e )
@@ -335,6 +338,10 @@
             sink.flush();
 
             sink.close();
+
+            IOUtil.close( writer );
+
+            System.getProperties().remove( "itext.basedir" );
         }
     }
 
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRenderer.java
index 92f5188..b70c40b 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRenderer.java
@@ -33,6 +33,7 @@
  * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
  * @version $Id$
  * @plexus.component role="org.apache.maven.doxia.docrenderer.itext.PdfRenderer" role-hint="itext.pdf"
+ * @deprecated since 1.1, use {@link org.apache.maven.doxia.docrenderer.pdf.itext.ITextPdfRenderer}.
  */
 public class DefaultPdfRenderer
     extends AbstractITextRender
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultRtfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultRtfRenderer.java
index 80a525f..caed6b1 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultRtfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultRtfRenderer.java
@@ -33,6 +33,7 @@
  * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
  * @version $Id$
  * @plexus.component role="org.apache.maven.doxia.docrenderer.itext.RtfRenderer" role-hint="itext.rtf"
+ * @deprecated since 1.1, use {@link org.apache.maven.doxia.docrenderer.pdf.itext.ITextPdfRenderer}.
  */
 public class DefaultRtfRenderer
     extends AbstractITextRender
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/PdfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/PdfRenderer.java
index d4a01f7..23d26de 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/PdfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/PdfRenderer.java
@@ -26,8 +26,10 @@
  *
  * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
  * @version $Id$
+ * @deprecated since 1.1, use an implementation of {@link org.apache.maven.doxia.docrenderer.DocumentRenderer}.
  */
-public interface PdfRenderer extends DocRenderer
+public interface PdfRenderer
+    extends DocRenderer
 {
     String ROLE = PdfRenderer.class.getName();
 }
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/RtfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/RtfRenderer.java
index 39e7a24..b1b7c54 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/RtfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/RtfRenderer.java
@@ -26,8 +26,10 @@
  *
  * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
  * @version $Id$
+ * @deprecated since 1.1, use an implementation of {@link org.apache.maven.doxia.docrenderer.DocumentRenderer}.
  */
-public interface RtfRenderer extends DocRenderer
+public interface RtfRenderer
+    extends DocRenderer
 {
     String ROLE = RtfRenderer.class.getName();
 }
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
index 4eff891..165ea6e 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
@@ -35,6 +35,8 @@
 import org.apache.maven.doxia.document.DocumentTOC;
 import org.apache.maven.doxia.document.DocumentTOCItem;
 import org.apache.maven.doxia.module.fo.FoAggregateSink;
+import org.apache.maven.doxia.module.fo.FoSink;
+import org.apache.maven.doxia.module.fo.FoSinkFactory;
 import org.apache.maven.doxia.module.fo.FoUtils;
 import org.apache.maven.doxia.module.site.SiteModule;
 
@@ -62,72 +64,39 @@
     public void generatePdf( File inputFile, File pdfFile )
         throws DocumentRendererException
     {
-        if ( getLogger().isDebugEnabled() )
-        {
-            getLogger().debug( "Generating: " + pdfFile );
-        }
-
-        try
-        {
-            FoUtils.convertFO2PDF( inputFile, pdfFile, null );
-        }
-        catch ( TransformerException e )
-        {
-            if ( ( e.getCause() != null ) && ( e.getCause() instanceof SAXParseException ) )
-            {
-                SAXParseException sax = (SAXParseException) e.getCause();
-
-                StringBuffer sb = new StringBuffer();
-                sb.append( "Error creating PDF from " ).append( inputFile.getAbsolutePath() ).append( ":" )
-                    .append( sax.getLineNumber() ).append( ":" ).append( sax.getColumnNumber() ).append( "\n" );
-                sb.append( e.getMessage() );
-
-                throw new DocumentRendererException( sb.toString() );
-            }
-
-            throw new DocumentRendererException( "Error creating PDF from " + inputFile + ": " + e.getMessage() );
-        }
+        // Should take care of the document model for the metadata...
+        generatePdf( inputFile, pdfFile, null );
     }
 
     /** {@inheritDoc} */
     public void render( Map filesToProcess, File outputDirectory, DocumentModel documentModel )
         throws DocumentRendererException, IOException
     {
-        String outputName = documentModel.getOutputName();
+        // copy resources, images, etc.
+        copyResources( outputDirectory );
 
-        if ( outputName == null )
+        if ( documentModel == null )
         {
-            getLogger().info( "No outputName is defined in the document descriptor. Using 'target.pdf'" );
+            getLogger().debug( "No document model, generating all documents individually." );
 
-            documentModel.setOutputName( "target" );
+            renderIndividual( filesToProcess, outputDirectory );
+            return;
         }
 
-        outputName = outputName.trim();
-        if ( outputName.toLowerCase( Locale.ENGLISH ).endsWith( ".pdf" ) )
-        {
-            documentModel.setOutputName( outputName.substring( 0, outputName.toLowerCase( Locale.ENGLISH )
-                                                                            .lastIndexOf( ".pdf" ) ) );
-        }
-
-        outputName = documentModel.getOutputName();
+        String outputName = getOutputName( documentModel );
 
         File outputFOFile = new File( outputDirectory, outputName + ".fo" );
-
         if ( !outputFOFile.getParentFile().exists() )
         {
             outputFOFile.getParentFile().mkdirs();
         }
 
         File pdfOutputFile = new File( outputDirectory, outputName + ".pdf" );
-
         if ( !pdfOutputFile.getParentFile().exists() )
         {
             pdfOutputFile.getParentFile().mkdirs();
         }
 
-        // copy resources, images, etc.
-        copyResources( outputDirectory );
-
         Writer writer = null;
         try
         {
@@ -159,6 +128,8 @@
             }
             else
             {
+                getLogger().debug( "Using TOC defined in the document descriptor." );
+
                 mergeSourcesFromTOC( documentModel.getToc(), sink );
             }
 
@@ -169,7 +140,48 @@
             IOUtil.close( writer );
         }
 
-        generatePdf( outputFOFile, pdfOutputFile );
+        generatePdf( outputFOFile, pdfOutputFile, documentModel );
+    }
+
+    /** {@inheritDoc} */
+    public void renderIndividual( Map filesToProcess, File outputDirectory )
+        throws DocumentRendererException, IOException
+    {
+        for ( Iterator j = filesToProcess.keySet().iterator(); j.hasNext(); )
+        {
+            String key = (String) j.next();
+            SiteModule module = (SiteModule) filesToProcess.get( key );
+
+            File fullDoc = new File( getBaseDir(), module.getSourceDirectory() + File.separator + key );
+
+            String output = key;
+            String lowerCaseExtension = module.getExtension().toLowerCase( Locale.ENGLISH );
+            if ( output.toLowerCase( Locale.ENGLISH ).indexOf( "." + lowerCaseExtension ) != -1 )
+            {
+                output =
+                    output.substring( 0, output.toLowerCase( Locale.ENGLISH ).indexOf( "." + lowerCaseExtension ) );
+            }
+
+            File outputFOFile = new File( outputDirectory, output + ".fo" );
+            if ( !outputFOFile.getParentFile().exists() )
+            {
+                outputFOFile.getParentFile().mkdirs();
+            }
+
+            File pdfOutputFile = new File( outputDirectory, output + ".pdf" );
+            if ( !pdfOutputFile.getParentFile().exists() )
+            {
+                pdfOutputFile.getParentFile().mkdirs();
+            }
+
+            FoSink sink =
+                (FoSink) new FoSinkFactory().createSink( outputFOFile.getParentFile(), outputFOFile.getName() );
+            sink.beginDocument();
+            parse( fullDoc.getAbsolutePath(), module.getParserId(), sink );
+            sink.endDocument();
+
+            generatePdf( outputFOFile, pdfOutputFile, null );
+        }
     }
 
     private void mergeAllSources( Map filesToProcess, FoAggregateSink sink )
@@ -180,14 +192,9 @@
             String key = (String) j.next();
             SiteModule module = (SiteModule) filesToProcess.get( key );
             sink.setDocumentName( key );
-            String fullDocPath = getBaseDir() + File.separator + module.getSourceDirectory() + File.separator + key;
+            File fullDoc = new File( getBaseDir(), module.getSourceDirectory() + File.separator + key );
 
-            if ( getLogger().isDebugEnabled() )
-            {
-                getLogger().debug( "Parsing file " + fullDocPath );
-            }
-
-            parse( fullDocPath, module.getParserId(), sink );
+            parse( fullDoc.getAbsolutePath(), module.getParserId(), sink );
         }
     }
 
@@ -215,7 +222,6 @@
             }
 
             String href = StringUtils.replace( tocItem.getRef(), "\\", "/" );
-
             if ( href.lastIndexOf( "." ) != -1 )
             {
                 href = href.substring( 0, href.lastIndexOf( "." ) );
@@ -245,11 +251,6 @@
 
                 if ( source.exists() )
                 {
-                    if ( getLogger().isDebugEnabled() )
-                    {
-                        getLogger().debug( "Parsing file " + source );
-                    }
-
                     sink.setDocumentName( doc );
                     sink.setDocumentTitle( tocItem.getName() );
 
@@ -258,4 +259,41 @@
             }
         }
     }
+
+    /**
+     * @param inputFile
+     * @param pdfFile
+     * @param documentModel could be null
+     * @throws DocumentRendererException if any
+     * @since 1.1.1
+     */
+    private void generatePdf( File inputFile, File pdfFile, DocumentModel documentModel )
+        throws DocumentRendererException
+    {
+        if ( getLogger().isDebugEnabled() )
+        {
+            getLogger().debug( "Generating: " + pdfFile );
+        }
+
+        try
+        {
+            FoUtils.convertFO2PDF( inputFile, pdfFile, null, documentModel );
+        }
+        catch ( TransformerException e )
+        {
+            if ( ( e.getCause() != null ) && ( e.getCause() instanceof SAXParseException ) )
+            {
+                SAXParseException sax = (SAXParseException) e.getCause();
+
+                StringBuffer sb = new StringBuffer();
+                sb.append( "Error creating PDF from " ).append( inputFile.getAbsolutePath() ).append( ":" )
+                  .append( sax.getLineNumber() ).append( ":" ).append( sax.getColumnNumber() ).append( "\n" );
+                sb.append( e.getMessage() );
+
+                throw new DocumentRendererException( sb.toString() );
+            }
+
+            throw new DocumentRendererException( "Error creating PDF from " + inputFile + ": " + e.getMessage() );
+        }
+    }
 }
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
index 8ba91f9..15d337b 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
@@ -24,13 +24,18 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.Writer;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.OutputKeys;
@@ -44,12 +49,17 @@
 
 import org.apache.maven.doxia.docrenderer.DocumentRendererException;
 import org.apache.maven.doxia.docrenderer.pdf.AbstractPdfRenderer;
+import org.apache.maven.doxia.document.DocumentCover;
+import org.apache.maven.doxia.document.DocumentMeta;
 import org.apache.maven.doxia.document.DocumentModel;
+import org.apache.maven.doxia.document.DocumentTOCItem;
 import org.apache.maven.doxia.module.itext.ITextSink;
 import org.apache.maven.doxia.module.itext.ITextSinkFactory;
 import org.apache.maven.doxia.module.itext.ITextUtil;
 import org.apache.maven.doxia.module.site.SiteModule;
 import org.apache.xml.utils.DefaultErrorHandler;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.WriterFactory;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
@@ -71,7 +81,7 @@
     extends AbstractPdfRenderer
 {
     /** The xslt style sheet used to transform a Document to an iText file. */
-    private static final String XSLT_RESOURCE = "org/apache/maven/doxia/docrenderer/itext/xslt/TOC.xslt";
+    private static final String XSLT_RESOURCE = "TOC.xslt";
 
     /** The TransformerFactory. */
     private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance();
@@ -79,9 +89,21 @@
     /** The DocumentBuilderFactory. */
     private static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY = DocumentBuilderFactory.newInstance();
 
+    /** The DocumentBuilder. */
+    private static final DocumentBuilder DOCUMENT_BUILDER;
+
     static
     {
         TRANSFORMER_FACTORY.setErrorListener( new DefaultErrorHandler() );
+
+        try
+        {
+            DOCUMENT_BUILDER = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder();
+        }
+        catch ( ParserConfigurationException e )
+        {
+            throw new RuntimeException( "Error building document :" + e.getMessage() );
+        }
     }
 
     /** {@inheritDoc} */
@@ -108,70 +130,90 @@
     }
 
     /** {@inheritDoc} */
-    public void render( Map filesToProcess, File outputDirectory, DocumentModel documentModel    )
+    public void render( Map filesToProcess, File outputDirectory, DocumentModel documentModel )
         throws DocumentRendererException, IOException
     {
-        String outputName = documentModel.getOutputName();
+        // copy resources, images, etc.
+        copyResources( outputDirectory );
 
-        if ( outputName == null )
+        if ( documentModel == null )
         {
-            if ( getLogger().isInfoEnabled() )
-            {
-                getLogger().info( "No outputName is defined in the document descriptor. Using 'target.pdf'" );
-            }
+            getLogger().debug( "No document model, generating all documents individually." );
 
-            documentModel.setOutputName( "target" );
-        }
-        else if ( outputName.lastIndexOf( "." ) != -1 )
-        {
-            documentModel.setOutputName( outputName.substring( 0, outputName.lastIndexOf( "." ) ) );
+            renderIndividual( filesToProcess, outputDirectory );
+            return;
         }
 
-// TODO: adjust from o.a.m.d.docrenderer.itext.AbstractITextRender
-//        if ( ( documentModel.getToc() == null ) || ( documentModel.getToc().getItems() == null ) )
-//        {
-//            getLogger().info( "No TOC is defined in the document descriptor. Generating all documents." );
+        String outputName = getOutputName( documentModel );
 
-            for ( Iterator j = filesToProcess.keySet().iterator(); j.hasNext(); )
-            {
-                String key = (String) j.next();
+        File outputITextFile = new File( outputDirectory, outputName + ".xml" );
+        if ( !outputITextFile.getParentFile().exists() )
+        {
+            outputITextFile.getParentFile().mkdirs();
+        }
 
-                SiteModule module = (SiteModule) filesToProcess.get( key );
+        File pdfOutputFile = new File( outputDirectory, outputName + ".pdf" );
+        if ( !pdfOutputFile.getParentFile().exists() )
+        {
+            pdfOutputFile.getParentFile().mkdirs();
+        }
 
+        List iTextFiles;
+        if ( ( documentModel.getToc() == null ) || ( documentModel.getToc().getItems() == null ) )
+        {
+            getLogger().info( "No TOC is defined in the document descriptor. Merging all documents." );
 
-                String fullDocPath = getBaseDir() + File.separator
-                            + module.getSourceDirectory() + File.separator + key;
-
-                String iTextFileName = key.substring( 0, key.indexOf( "." ) + 1 ) + "xml";
-
-                File iTextFile = new File( outputDirectory, iTextFileName );
-                if ( !iTextFile.getParentFile().exists() )
-                {
-                    iTextFile.getParentFile().mkdirs();
-                }
-
-                String pdfFileName = key.substring( 0, key.indexOf( "." ) + 1 ) + getOutputExtension();
-
-                File pdfFile = new File( outputDirectory, pdfFileName );
-                if ( !pdfFile.getParentFile().exists() )
-                {
-                    pdfFile.getParentFile().mkdirs();
-                }
-
-                parse( fullDocPath, module, iTextFile );
-
-                generatePdf( iTextFile, pdfFile );
-            }
-/*
+            iTextFiles = parseAllFiles( filesToProcess, outputDirectory );
         }
         else
         {
-            // TODO: adjust from o.a.m.d.docrenderer.itext.AbstractITextRender
-        }
-*/
+            getLogger().debug( "Using TOC defined in the document descriptor." );
 
+            iTextFiles = parseTOCFiles( filesToProcess, outputDirectory, documentModel );
+        }
+
+        File iTextFile = new File( outputDirectory, outputName + ".xml" );
+        File iTextOutput = new File( outputDirectory, outputName + "." + getOutputExtension() );
+        Document document = generateDocument( iTextFiles );
+        transform( documentModel, document, iTextFile );
+        generatePdf( iTextFile, iTextOutput );
     }
 
+    /** {@inheritDoc} */
+    public void renderIndividual( Map filesToProcess, File outputDirectory )
+        throws DocumentRendererException, IOException
+    {
+        for ( Iterator it = filesToProcess.keySet().iterator(); it.hasNext(); )
+        {
+            String key = (String) it.next();
+            SiteModule module = (SiteModule) filesToProcess.get( key );
+            File fullDoc = new File( getBaseDir(), module.getSourceDirectory() + File.separator + key );
+
+            String output = key;
+            String lowerCaseExtension = module.getExtension().toLowerCase( Locale.ENGLISH );
+            if ( output.toLowerCase( Locale.ENGLISH ).indexOf( "." + lowerCaseExtension ) != -1 )
+            {
+                output =
+                    output.substring( 0, output.toLowerCase( Locale.ENGLISH ).indexOf( "." + lowerCaseExtension ) );
+            }
+
+            File outputITextFile = new File( outputDirectory, output + ".xml" );
+            if ( !outputITextFile.getParentFile().exists() )
+            {
+                outputITextFile.getParentFile().mkdirs();
+            }
+
+            File pdfOutputFile = new File( outputDirectory, output + ".pdf" );
+            if ( !pdfOutputFile.getParentFile().exists() )
+            {
+                pdfOutputFile.getParentFile().mkdirs();
+            }
+
+            parse( fullDoc, module, outputITextFile );
+
+            generatePdf( outputITextFile, pdfOutputFile );
+        }
+    }
 
       //--------------------------------------------
      //
@@ -181,23 +223,43 @@
     /**
      * Parse a source document and emit results into a sink.
      *
-     * @param fullDocPath absolute path to the source document.
+     * @param fullDocPath file to the source document.
      * @param module the site module associated with the source document (determines the parser to use).
      * @param iTextFile the resulting iText xml file.
      * @throws DocumentRendererException in case of a parsing problem.
      * @throws IOException if the source and/or target document cannot be opened.
      */
-    private void parse( String fullDocPath, SiteModule module, File iTextFile )
+    private void parse( File fullDoc, SiteModule module, File iTextFile )
         throws DocumentRendererException, IOException
     {
-        Writer writer = WriterFactory.newXmlWriter( iTextFile );
-        ITextSink sink = (ITextSink) new ITextSinkFactory().createSink( writer );
+        if ( getLogger().isDebugEnabled() )
+        {
+            getLogger().debug( "Parsing file " + fullDoc.getAbsolutePath() );
+        }
 
-        sink.setClassLoader( new URLClassLoader( new URL[] { iTextFile.getParentFile().toURI().toURL() } ) );
+        System.setProperty( "itext.basedir", iTextFile.getParentFile().getAbsolutePath() );
 
-        parse( fullDocPath, module.getParserId(), sink );
+        Writer writer = null;
+        ITextSink sink = null;
+        try
+        {
+            writer = WriterFactory.newXmlWriter( iTextFile );
+            sink = (ITextSink) new ITextSinkFactory().createSink( writer );
 
-        sink.close();
+            sink.setClassLoader( new URLClassLoader( new URL[] { iTextFile.getParentFile().toURI().toURL() } ) );
+
+            parse( fullDoc.getAbsolutePath(), module.getParserId(), sink );
+        }
+        finally
+        {
+            if ( sink != null )
+            {
+                sink.flush();
+                sink.close();
+            }
+            IOUtil.close( writer );
+            System.getProperties().remove( "itext.basedir" );
+        }
     }
 
     /**
@@ -211,17 +273,7 @@
     private Document generateDocument( List iTextFiles )
         throws DocumentRendererException, IOException
     {
-        Document document;
-
-        try
-        {
-            document = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder().newDocument();
-        }
-        catch ( ParserConfigurationException e )
-        {
-            throw new DocumentRendererException( "Error building document :" + e.getMessage() );
-        }
-
+        Document document = DOCUMENT_BUILDER.newDocument();
         document.appendChild( document.createElement( ElementTags.ITEXT ) ); // Used only to set a root
 
         for ( int i = 0; i < iTextFiles.size(); i++ )
@@ -232,16 +284,12 @@
 
             try
             {
-                iTextDocument = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder().parse( iTextFile );
+                iTextDocument = DOCUMENT_BUILDER.parse( iTextFile );
             }
             catch ( SAXException e )
             {
                 throw new DocumentRendererException( "SAX Error : " + e.getMessage() );
             }
-            catch ( ParserConfigurationException e )
-            {
-                throw new DocumentRendererException( "Error parsing configuration : " + e.getMessage() );
-            }
 
             // Only one chapter per doc
             Node chapter = iTextDocument.getElementsByTagName( ElementTags.CHAPTER ).item( 0 );
@@ -271,8 +319,8 @@
     {
         try
         {
-            Transformer transformer = TRANSFORMER_FACTORY.newTransformer( new StreamSource( AbstractPdfRenderer.class
-                .getResourceAsStream( "/" + XSLT_RESOURCE ) ) );
+            Transformer transformer = TRANSFORMER_FACTORY.newTransformer( new StreamSource( ITextPdfRenderer.class
+                .getResourceAsStream( XSLT_RESOURCE ) ) );
 
             transformer.setErrorListener( TRANSFORMER_FACTORY.getErrorListener() );
 
@@ -284,6 +332,8 @@
 
             transformer.setOutputProperty( OutputKeys.ENCODING, "UTF-8" );
 
+            // No doctype since itext doctype is not up to date!
+
             return transformer;
         }
         catch ( TransformerConfigurationException e )
@@ -302,57 +352,119 @@
      * Add transformer parameters from a DocumentModel.
      *
      * @param transformer the Transformer to set the parameters.
-     * @param documentModel the DocumentModel to take the parameters from.
+     * @param documentModel the DocumentModel to take the parameters from, could be null.
+     * @param iTextFile the iTextFile not null for the relative paths.
      */
-    private void addTransformerParameters( Transformer transformer, DocumentModel documentModel )
+    private void addTransformerParameters( Transformer transformer, DocumentModel documentModel, File iTextFile )
     {
-        if ( documentModel.getMeta().getTitle() != null )
+        if ( documentModel == null )
         {
-            transformer.setParameter( "title", documentModel.getMeta().getTitle() );
+            return;
         }
 
-        if ( documentModel.getMeta().getAuthor() != null )
+        // Meta parameters
+        boolean hasNullMeta = false;
+        if ( documentModel.getMeta() == null )
         {
-            transformer.setParameter( "author", documentModel.getMeta().getAuthor() );
+            hasNullMeta = true;
+            documentModel.setMeta( new DocumentMeta() );
+        }
+        addTransformerParameter( transformer, "meta.author", documentModel.getMeta().getAllAuthorNames(),
+                                 System.getProperty( "user.name", "null" ) );
+        addTransformerParameter( transformer, "meta.creator", documentModel.getMeta().getCreator(),
+                                 System.getProperty( "user.name", "null" ) );
+        // see com.lowagie.text.Document#addCreationDate()
+        SimpleDateFormat sdf = new SimpleDateFormat( "EEE MMM dd HH:mm:ss zzz yyyy" );
+        addTransformerParameter( transformer, "meta.creationdate", documentModel.getMeta().getCreationdate(),
+                                 sdf.format( new Date() ) );
+        addTransformerParameter( transformer, "meta.keywords", documentModel.getMeta().getAllKeyWords() );
+        addTransformerParameter( transformer, "meta.pagesize", documentModel.getMeta().getPageSize(),
+                                 ITextUtil.getPageSize( ITextUtil.getDefaultPageSize() ) );
+        addTransformerParameter( transformer, "meta.producer", documentModel.getMeta().getGenerator(),
+                                 "Apache Doxia iText" );
+        addTransformerParameter( transformer, "meta.subject", documentModel.getMeta().getSubject(),
+                                 ( documentModel.getMeta().getTitle() != null ? documentModel.getMeta().getTitle()
+                                                 : "" ) );
+        addTransformerParameter( transformer, "meta.title", documentModel.getMeta().getTitle() );
+        if ( hasNullMeta )
+        {
+            documentModel.setMeta( null );
         }
 
-        transformer.setParameter( "creationdate", new Date().toString() );
-
-        if ( documentModel.getMeta().getSubject() != null )
+        // cover parameter
+        boolean hasNullCover = false;
+        if ( documentModel.getCover() == null )
         {
-            transformer.setParameter( "subject", documentModel.getMeta().getSubject() );
+            hasNullCover = true;
+            documentModel.setCover( new DocumentCover() );
         }
-
-        if ( documentModel.getMeta().getKeywords() != null )
+        addTransformerParameter( transformer, "cover.author", documentModel.getCover().getAllAuthorNames(),
+                                 System.getProperty( "user.name", "null" ) );
+        String companyLogo = getLogoURL( documentModel.getCover().getCompanyLogo(), iTextFile.getParentFile() );
+        addTransformerParameter( transformer, "cover.companyLogo", companyLogo );
+        addTransformerParameter( transformer, "cover.companyName", documentModel.getCover().getCompanyName() );
+        if ( documentModel.getCover().getCoverdate() == null )
         {
-            transformer.setParameter( "keywords", documentModel.getMeta().getKeywords() );
-        }
-
-        transformer.setParameter( "producer", "Generated with Doxia by " + System.getProperty( "user.name" ) );
-
-        if ( ITextUtil.isPageSizeSupported( documentModel.getMeta().getTitle() ) )
-        {
-            transformer.setParameter( "pagesize", documentModel.getMeta().getPageSize() );
+            documentModel.getCover().setCoverDate( new Date() );
+            addTransformerParameter( transformer, "cover.date", documentModel.getCover().getCoverdate() );
+            documentModel.getCover().setCoverDate( null );
         }
         else
         {
-            transformer.setParameter( "pagesize", "A4" );
+            addTransformerParameter( transformer, "cover.date", documentModel.getCover().getCoverdate() );
         }
-
-        transformer.setParameter( "frontPageHeader", "" );
-
-        if ( documentModel.getMeta().getTitle() != null )
+        addTransformerParameter( transformer, "cover.subtitle", documentModel.getCover().getCoverSubTitle() );
+        addTransformerParameter( transformer, "cover.title", documentModel.getCover().getCoverTitle() );
+        addTransformerParameter( transformer, "cover.type", documentModel.getCover().getCoverType() );
+        addTransformerParameter( transformer, "cover.version", documentModel.getCover().getCoverVersion() );
+        String projectLogo = getLogoURL( documentModel.getCover().getProjectLogo(), iTextFile.getParentFile() );
+        addTransformerParameter( transformer, "cover.projectLogo", projectLogo );
+        addTransformerParameter( transformer, "cover.projectName", documentModel.getCover().getProjectName() );
+        if ( hasNullCover )
         {
-            transformer.setParameter( "frontPageTitle", documentModel.getMeta().getTitle() );
+            documentModel.setCover( null );
+        }
+    }
+
+    /**
+     * @param transformer not null
+     * @param name not null
+     * @param value could be empty
+     * @param defaultValue could be empty
+     * @since 1.1.1
+     */
+    private void addTransformerParameter( Transformer transformer, String name, String value, String defaultValue )
+    {
+        if ( StringUtils.isEmpty( value ) )
+        {
+            addTransformerParameter( transformer, name, defaultValue );
+        }
+        else
+        {
+            addTransformerParameter( transformer, name, value );
+        }
+    }
+
+    /**
+     * @param transformer not null
+     * @param name not null
+     * @param value could be empty
+     * @since 1.1.1
+     */
+    private void addTransformerParameter( Transformer transformer, String name, String value )
+    {
+        if ( StringUtils.isEmpty( value ) )
+        {
+            return;
         }
 
-        transformer.setParameter( "frontPageFooter", "Generated date " + new Date().toString() );
+        transformer.setParameter( name, value );
     }
 
     /**
      * Transform a document to an iTextFile.
      *
-     * @param documentModel the DocumentModel to take the parameters from.
+     * @param documentModel the DocumentModel to take the parameters from, could be null.
      * @param document the Document to transform.
      * @param iTextFile the resulting iText xml file.
      * @throws DocumentRendererException in case of a transformation error.
@@ -362,7 +474,7 @@
     {
         Transformer transformer = initTransformer();
 
-        addTransformerParameters( transformer, documentModel );
+        addTransformerParameters( transformer, documentModel, iTextFile );
 
         try
         {
@@ -373,4 +485,137 @@
             throw new DocumentRendererException( "Error transforming Document " + document + ": " + e.getMessage() );
         }
     }
+
+    /**
+     * @param filesToProcess not null
+     * @param outputDirectory not null
+     * @return a list of all parsed files.
+     * @throws DocumentRendererException if any
+     * @throws IOException if any
+     * @since 1.1.1
+     */
+    private List parseAllFiles( Map filesToProcess, File outputDirectory )
+        throws DocumentRendererException, IOException
+    {
+        List iTextFiles = new LinkedList();
+        for ( Iterator it = filesToProcess.keySet().iterator(); it.hasNext(); )
+        {
+            String key = (String) it.next();
+            SiteModule module = (SiteModule) filesToProcess.get( key );
+            File fullDoc = new File( getBaseDir(), module.getSourceDirectory() + File.separator + key );
+
+            String outputITextName = key.substring( 0, key.lastIndexOf( "." ) + 1 ) + "xml";
+            File outputITextFileTmp = new File( outputDirectory, outputITextName );
+            outputITextFileTmp.deleteOnExit();
+            if ( !outputITextFileTmp.getParentFile().exists() )
+            {
+                outputITextFileTmp.getParentFile().mkdirs();
+            }
+
+            iTextFiles.add( outputITextFileTmp );
+            parse( fullDoc, module, outputITextFileTmp );
+        }
+
+        return iTextFiles;
+    }
+
+    /**
+     * @param filesToProcess not null
+     * @param outputDirectory not null
+     * @return a list of all parsed files.
+     * @throws DocumentRendererException if any
+     * @throws IOException if any
+     * @since 1.1.1
+     */
+    private List parseTOCFiles( Map filesToProcess, File outputDirectory, DocumentModel documentModel )
+        throws DocumentRendererException, IOException
+    {
+        List iTextFiles = new LinkedList();
+        for ( Iterator it = documentModel.getToc().getItems().iterator(); it.hasNext(); )
+        {
+            DocumentTOCItem tocItem = (DocumentTOCItem) it.next();
+
+            if ( tocItem.getRef() == null )
+            {
+                getLogger().debug(
+                                   "No ref defined for the tocItem '" + tocItem.getName()
+                                       + "' in the document descriptor. IGNORING" );
+                continue;
+            }
+
+            String href = StringUtils.replace( tocItem.getRef(), "\\", "/" );
+            if ( href.lastIndexOf( "." ) != -1 )
+            {
+                href = href.substring( 0, href.lastIndexOf( "." ) );
+            }
+
+            for ( Iterator i = siteModuleManager.getSiteModules().iterator(); i.hasNext(); )
+            {
+                SiteModule module = (SiteModule) i.next();
+                File moduleBasedir = new File( getBaseDir(), module.getSourceDirectory() );
+
+                if ( moduleBasedir.exists() )
+                {
+                    String doc = href + "." + module.getExtension();
+                    File source = new File( moduleBasedir, doc );
+
+                    if ( source.exists() )
+                    {
+                        String outputITextName = doc.substring( 0, doc.lastIndexOf( "." ) + 1 ) + "xml";
+                        File outputITextFileTmp = new File( outputDirectory, outputITextName );
+                        outputITextFileTmp.deleteOnExit();
+                        if ( !outputITextFileTmp.getParentFile().exists() )
+                        {
+                            outputITextFileTmp.getParentFile().mkdirs();
+                        }
+
+                        iTextFiles.add( outputITextFileTmp );
+                        parse( source, module, outputITextFileTmp );
+                    }
+                }
+            }
+        }
+
+        return iTextFiles;
+    }
+
+    /**
+     * @param logo
+     * @param parentFile
+     * @return the logo url or null if unable to create it.
+     * @since 1.1.1
+     */
+    private String getLogoURL( String logo, File parentFile )
+    {
+        if ( logo == null )
+        {
+            return null;
+        }
+
+        try
+        {
+            return new URL( logo ).toString();
+        }
+        catch ( MalformedURLException e )
+        {
+            try
+            {
+                File f = new File( parentFile, logo );
+                if ( !f.exists() )
+                {
+                    getLogger().warn( "The logo " + f.getAbsolutePath() + " doesnt exist. IGNORING" );
+                }
+                else
+                {
+                    return f.toURL().toString();
+                }
+            }
+            catch ( MalformedURLException e1 )
+            {
+                // nope
+            }
+        }
+
+        return null;
+    }
 }
diff --git a/doxia-doc-renderer/src/test/resources/doc-without-TOC.xml b/doxia-doc-renderer/src/main/javadoc/org/apache/maven/doxia/docrenderer/itext/package.html
similarity index 64%
rename from doxia-doc-renderer/src/test/resources/doc-without-TOC.xml
rename to doxia-doc-renderer/src/main/javadoc/org/apache/maven/doxia/docrenderer/itext/package.html
index 329459f..7dc901f 100644
--- a/doxia-doc-renderer/src/test/resources/doc-without-TOC.xml
+++ b/doxia-doc-renderer/src/main/javadoc/org/apache/maven/doxia/docrenderer/itext/package.html
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
 
 <!--
 Licensed to the Apache Software Foundation (ASF) under one
@@ -9,7 +9,7 @@
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at
 
-  http://www.apache.org/licenses/LICENSE-2.0
+    http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
@@ -19,11 +19,9 @@
 under the License.
 -->
 
-<document outputName="doc-with-merged">
-  <meta>
-    <title>Merged site</title>
-    <author>Vincent Siveton</author>
-    <subject>Merged site</subject>
-    <keywords>test</keywords>
-  </meta>
-</document>
+<body>
+  <h1><b>DEPRECATED</b>.</h1>
+  <p>Since 1.1, the <i>org.apache.maven.doxia.docrenderer.itext</i> package is all deprecated and is unmaintained.
+  It will be removed in the future. You could use an implementation of
+  <a href="../DocumentRenderer.html">DocumentRenderer</a> interface.</p>
+</body>
diff --git a/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/itext/xslt/TOC.xslt b/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt
similarity index 67%
rename from doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/itext/xslt/TOC.xslt
rename to doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt
index 4162fd4..e50aed8 100644
--- a/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/itext/xslt/TOC.xslt
+++ b/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt
@@ -21,51 +21,86 @@
 <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
-    <!--  MetaData Parameters -->
-    <xsl:param name="title" />
-    <xsl:param name="author" />
-    <xsl:param name="creationdate" />
-    <xsl:param name="subject" />
-    <xsl:param name="keywords" />
-    <xsl:param name="producer" />
-    <xsl:param name="pagesize" />
+    <!-- MetaData Parameters -->
+    <xsl:param name="meta.author" />
+    <xsl:param name="meta.creator" />
+    <xsl:param name="meta.creationdate" />
+    <xsl:param name="meta.keywords" />
+    <xsl:param name="meta.pagesize" />
+    <xsl:param name="meta.producer" />
+    <xsl:param name="meta.subject" />
+    <xsl:param name="meta.title" />
 
     <!--  FrontPage Parameters -->
-    <xsl:param name="frontPageTitle" />
-    <xsl:param name="frontPageFooter" />
+    <xsl:param name="cover.author" />
+    <xsl:param name="cover.companyLogo" />
+    <xsl:param name="cover.companyName" />
+    <xsl:param name="cover.date" />
+    <xsl:param name="cover.subtitle" />
+    <xsl:param name="cover.title" />
+    <xsl:param name="cover.type" />
+    <xsl:param name="cover.version" />
+    <xsl:param name="cover.projectLogo" />
+    <xsl:param name="cover.projectName" />
 
     <xsl:template match="/itext">
-        <itext title="{$title}" author="{$author}" creationdate="{$creationdate}"
-            subject="{$subject}" keywords="{$keywords}" producer="{$producer}"
-            pagesize="{$pagesize}">
+      <itext
+        author="{$meta.author}"
+        creator="{$meta.creator}"
+        creationdate="{$meta.creationdate}"
+        keywords="{$meta.keywords}"
+        pagesize="{$meta.pagesize}"
+        producer="{$meta.producer}"
+        subject="{$meta.subject}"
+        title="{$meta.title}">
         <!-- Start Front page -->
         <paragraph>
             <chunk font="Helvetica" size="12.0" fontstyle="normal"
                 blue="0" green="0" red="0">
-                <table columns="1" left="false" right="false"
+                <table columns="2" left="false" right="false"
                     top="false" bottom="false" align="Center" width="100%">
                     <row>
                         <cell left="false" right="false" top="false"
                             bottom="false" horizontalalign="Left" verticalalign="middle">
-                            <image
-                                url="http://maven.apache.org/images/apache-maven-project.png"
-                                plainwidth="306.0" plainheight="27.867857" />
+                            <xsl:if test="$cover.companyLogo != ''">
+                                <image url="{$cover.companyLogo}" />
+                            </xsl:if>
+                        </cell>
+                        <cell left="false" right="false" top="false"
+                          bottom="false" horizontalalign="Left" verticalalign="middle">
+                          <xsl:if test="$cover.projectLogo != ''">
+                            <image url="{$cover.projectLogo}" />
+                          </xsl:if>
                         </cell>
                     </row>
                     <row>
                         <cell left="false" right="false" top="false"
                             bottom="false" horizontalalign="Center" verticalalign="middle"
-                            leading="330">
+                            leading="300" colspan="2">
                             <chunk font="Helvetica" size="24.0"
-                                fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$frontPageTitle"/></chunk>
+                              fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$cover.title"/></chunk>
+                        </cell>
+                    </row>
+                    <row>
+                        <cell left="false" right="false" top="false"
+                          bottom="false" horizontalalign="Center" verticalalign="middle"
+                          colspan="2">
+                          <chunk font="Helvetica" size="24.0"
+                            fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$cover.subtitle"/></chunk>
                         </cell>
                     </row>
                     <row>
                         <cell left="false" right="false" top="false"
                             bottom="false" horizontalalign="Left" verticalalign="middle"
-                            leading="330">
+                            leading="300">
                             <chunk font="Helvetica" size="16.0"
-                                fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$frontPageFooter"/></chunk>
+                              fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$cover.companyName"/></chunk>
+                        </cell>
+                        <cell left="false" right="false" top="false"
+                            bottom="false" horizontalalign="right" verticalalign="middle"
+                            leading="300">
+                            <chunk font="Helvetica" size="16.0"
+                              fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$cover.date"/></chunk>
                         </cell>
                     </row>
                 </table>
@@ -76,6 +111,7 @@
         <!-- Start TOC -->
         <newpage />
         <paragraph align="Center">
+          <!-- TODO i18N -->
             <chunk font="Helvetica" size="24" fontstyle="bold" blue="0"
                 green="0" red="0">Table Of Contents</chunk>
         </paragraph>
diff --git a/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/DocumentRendererTest.java b/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/DocumentRendererTest.java
new file mode 100644
index 0000000..ef27c94
--- /dev/null
+++ b/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/DocumentRendererTest.java
@@ -0,0 +1,146 @@
+package org.apache.maven.doxia.docrenderer;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.maven.doxia.docrenderer.pdf.PdfRenderer;
+import org.apache.maven.doxia.document.DocumentModel;
+import org.codehaus.plexus.PlexusTestCase;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
+ * @version $Id$
+ * @since 1.1.1
+ */
+public class DocumentRendererTest
+    extends PlexusTestCase
+{
+    private PdfRenderer docRenderer;
+
+    private File siteDirectoryFile;
+
+    /** @throws java.lang.Exception */
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        siteDirectoryFile = getTestFile( "src/test/resources/site" );
+    }
+
+    /** @throws java.lang.Exception */
+    protected void tearDown()
+        throws Exception
+    {
+        release( docRenderer );
+        super.tearDown();
+    }
+
+    /** @throws java.lang.Exception */
+    public void testFo()
+        throws Exception
+    {
+        renderImpl( "fo" );
+    }
+
+    /** @throws java.lang.Exception */
+    public void testFoAggregate()
+        throws Exception
+    {
+        renderAggregatedImpl( "fo" );
+    }
+
+    /** @throws java.lang.Exception */
+    public void testIText()
+        throws Exception
+    {
+        renderImpl( "itext" );
+    }
+
+    /** @throws java.lang.Exception */
+    public void testITextAggregate()
+        throws Exception
+    {
+        renderAggregatedImpl( "itext" );
+    }
+
+    private void renderImpl( String implementation )
+        throws Exception
+    {
+        File outputDirectory = getTestFile( "target/output/" + implementation );
+        if ( outputDirectory.exists() )
+        {
+            FileUtils.deleteDirectory( outputDirectory );
+        }
+        outputDirectory.mkdirs();
+
+        docRenderer = (PdfRenderer) lookup( PdfRenderer.ROLE, implementation );
+        assertNotNull( docRenderer );
+
+        docRenderer.render( siteDirectoryFile, outputDirectory, null );
+
+        List files =
+            FileUtils.getFileNames( new File( siteDirectoryFile, "apt" ), "**/*.apt",
+                                    FileUtils.getDefaultExcludesAsString(), false );
+        files.addAll( FileUtils.getFileNames( new File( siteDirectoryFile, "fml" ), "**/*.fml",
+                                              FileUtils.getDefaultExcludesAsString(), false ) );
+        files.addAll( FileUtils.getFileNames( new File( siteDirectoryFile, "xdoc" ), "**/*.xml",
+                                              FileUtils.getDefaultExcludesAsString(), false ) );
+
+        for ( Iterator it = files.iterator(); it.hasNext(); )
+        {
+            String relativeFile = it.next().toString();
+            String relativePdf = StringUtils.replace( relativeFile, FileUtils.getExtension( relativeFile ), "pdf" );
+            File pdf = new File( outputDirectory, relativePdf );
+
+            assertTrue( pdf.exists() );
+            assertTrue( pdf.length() > 0 );
+        }
+    }
+
+    private void renderAggregatedImpl( String implementation )
+        throws Exception
+    {
+        File outputDirectory = getTestFile( "target/output/" + implementation + "-aggregated" );
+        if ( outputDirectory.exists() )
+        {
+            FileUtils.deleteDirectory( outputDirectory );
+        }
+        outputDirectory.mkdirs();
+
+        docRenderer = (PdfRenderer) lookup( PdfRenderer.ROLE, implementation );
+        assertNotNull( docRenderer );
+
+        DocumentModel descriptor = docRenderer.readDocumentModel( new File( siteDirectoryFile, "pdf.xml" ) );
+        assertNotNull( descriptor );
+
+        docRenderer.render( siteDirectoryFile, outputDirectory, descriptor );
+
+        File pdf = new File( outputDirectory, descriptor.getOutputName() + ".pdf" );
+
+        assertTrue( pdf.exists() );
+        assertTrue( pdf.length() > 0 );
+    }
+}
diff --git a/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.java b/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.java
deleted file mode 100644
index 65dcf47..0000000
--- a/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.apache.maven.doxia.docrenderer.itext;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-
-import org.apache.maven.doxia.docrenderer.DocRenderer;
-import org.codehaus.plexus.PlexusTestCase;
-import org.codehaus.plexus.util.FileUtils;
-
-/**
- * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
- * @version $Id$
- */
-public class DefaultPdfRendererTest
-    extends PlexusTestCase
-{
-    private static final String OUTPUT = "target/output";
-
-    private static final String SITE = "src/test/resources/site";
-
-    private static final String DESCRIPTOR_WITHOUT_TOC = "src/test/resources/doc-without-TOC.xml";
-
-    private File outputDirectory;
-
-    private File siteDirectoryFile;
-
-    private DocRenderer docRenderer;
-
-    /** {@inheritDoc} */
-    protected void setUp()
-        throws Exception
-    {
-        super.setUp();
-
-        docRenderer = (DocRenderer) lookup( DocRenderer.ROLE );
-
-        outputDirectory = getTestFile( OUTPUT );
-        outputDirectory.mkdirs();
-
-        siteDirectoryFile = getTestFile( SITE );
-
-        FileUtils.copyDirectory( new File( siteDirectoryFile, "resources/css" ), new File( outputDirectory, "css" ),
-                                 "*.css", ".svn" );
-        FileUtils.copyDirectory( new File( siteDirectoryFile, "resources/images" ),
-                                 new File( outputDirectory, "images" ), "*.png", ".svn" );
-    }
-
-    /** {@inheritDoc} */
-    protected void tearDown()
-        throws Exception
-    {
-        release( docRenderer );
-        super.tearDown();
-    }
-
-    /**
-     * @throws Exception
-     */
-    public void testRenderFileFile()
-        throws Exception
-    {
-        docRenderer.render( siteDirectoryFile, outputDirectory );
-
-        assertTrue( new File( outputDirectory, "faq.pdf" ).exists() );
-        assertTrue( new File( outputDirectory, "faq.pdf" ).length() > 0 );
-        assertTrue( new File( outputDirectory, "index.pdf" ).exists() );
-        assertTrue( new File( outputDirectory, "index.pdf" ).length() > 0 );
-        assertTrue( new File( outputDirectory, "overview.pdf" ).exists() );
-        assertTrue( new File( outputDirectory, "overview.pdf" ).length() > 0 );
-        assertTrue( new File( outputDirectory, "resources.pdf" ).exists() );
-        assertTrue( new File( outputDirectory, "resources.pdf" ).length() > 0 );
-
-    }
-
-    /**
-     * @throws Exception
-     */
-    public void testRenderFileFileFile()
-        throws Exception
-    {
-        File descriptor = getTestFile( DESCRIPTOR_WITHOUT_TOC );
-
-        docRenderer.render( siteDirectoryFile, outputDirectory, descriptor );
-
-        assertTrue( new File( outputDirectory, "doc-with-merged.pdf" ).exists() );
-        assertTrue( new File( outputDirectory, "doc-with-merged.pdf" ).length() > 0 );
-    }
-}
diff --git a/doxia-doc-renderer/src/test/resources/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.xml b/doxia-doc-renderer/src/test/resources/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.xml
deleted file mode 100644
index 6ef4e2a..0000000
--- a/doxia-doc-renderer/src/test/resources/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- -->
-<plexus>
-  <components>
-    <component>
-      <role>org.apache.maven.doxia.docrenderer.DocRenderer</role>
-      <implementation>org.apache.maven.doxia.docrenderer.itext.DefaultPdfRenderer</implementation>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.doxia.module.site.manager.SiteModuleManager</role>
-          <field-name>siteModuleManager</field-name>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.doxia.Doxia</role>
-          <field-name>doxia</field-name>
-        </requirement>
-      </requirements>
-    </component>
-  </components>
-</plexus>
diff --git a/doxia-doc-renderer/src/test/resources/site/fml/faq.fml b/doxia-doc-renderer/src/test/resources/site/fml/faq.fml
index 0381d2a..94ec21d 100644
--- a/doxia-doc-renderer/src/test/resources/site/fml/faq.fml
+++ b/doxia-doc-renderer/src/test/resources/site/fml/faq.fml
@@ -19,9 +19,9 @@
 under the License.
 -->
 
-<faqs xmlns="http://maven.apache.org/FML/1.0"
+<faqs xmlns="http://maven.apache.org/FML/1.0.1"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/FML/1.0 file:../../../../../../../doxia/doxia-modules/doxia-module-fml/src/main/resources/fml-1.0.xsd"
+  xsi:schemaLocation="http://maven.apache.org/FML/1.0.1 file:../../../../../../../doxia/doxia-modules/doxia-module-fml/src/main/resources/fml-1.0.1.xsd"
   title="Frequently Asked Questions">
   <part id="General">
     <faq id="How_to_handle_style_in_the_APT_markup_language">
diff --git a/doxia-doc-renderer/src/test/resources/site/pdf.xml b/doxia-doc-renderer/src/test/resources/site/pdf.xml
new file mode 100644
index 0000000..79f1ae0
--- /dev/null
+++ b/doxia-doc-renderer/src/test/resources/site/pdf.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+ -->
+<document xmlns="http://maven.apache.org/DOCUMENT/1.0.1"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/DOCUMENT/1.0.1 file:../../../../../../doxia/doxia-core/target/generated-site/xsd/document-1.0.1.xsd"
+  outputName="doxia-1.1.1">
+
+  <meta>
+    <title>Apache Maven Doxia</title>
+    <author>The Apache Maven Project</author>
+    <keyWords>
+      <keyWord>Content generation framework</keyWord>
+      <keyWord>Lightweight markup language</keyWord>
+      <keyWord>APT</keyWord>
+      <keyWord>FML</keyWord>
+      <keyWord>XDOC</keyWord>
+    </keyWords>
+  </meta>
+
+  <toc name="Table of Contents">
+    <item name="What is Doxia?" ref="index.html"/>
+    <item name="Overview" ref="overview.html"/>
+    <item name="FAQ" ref="faq.html"/>
+    <item name="Resources" ref="resources.html"/>
+    <item name="FML Format" ref="references/fml-format.html"/>
+    <item name="XDoc Format" ref="references/xdoc-format.html"/>
+  </toc>
+
+  <cover>
+    <coverTitle>Apache Maven Doxia Test</coverTitle>
+    <coverSubTitle>v. 1.1.1-SNAPSHOT</coverSubTitle>
+    <coverType>User Guide</coverType>
+    <companyName>The Apache Software Foundation</companyName>
+    <companyLogo>http://www.apache.org/images/asf_logo_wide.png</companyLogo>
+    <projectLogo>./images/doxia-logo.png</projectLogo>
+  </cover>
+</document>
diff --git a/doxia-doc-renderer/src/test/resources/site/resources/images/doxia-logo.png b/doxia-doc-renderer/src/test/resources/site/resources/images/doxia-logo.png
new file mode 100644
index 0000000..8c15655
--- /dev/null
+++ b/doxia-doc-renderer/src/test/resources/site/resources/images/doxia-logo.png
Binary files differ
diff --git a/doxia-site-renderer/pom.xml b/doxia-site-renderer/pom.xml
index 7acf057..0d6df2d 100644
--- a/doxia-site-renderer/pom.xml
+++ b/doxia-site-renderer/pom.xml
@@ -139,5 +139,43 @@
       <artifactId>commons-collections</artifactId>
       <version>3.2</version>
     </dependency>
+
+    <!-- test -->
+    <dependency>
+      <groupId>org.apache.maven.doxia</groupId>
+      <artifactId>doxia-core</artifactId>
+      <version>${doxiaVersion}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
+
+  <profiles>
+    <profile>
+      <id>reporting</id>
+      <reporting>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>l10n-maven-plugin</artifactId>
+            <version>1.0-alpha-2</version>
+            <configuration>
+              <locales>
+                <locale>de</locale>
+                <locale>en</locale>
+                <locale>es</locale>
+                <locale>fr</locale>
+                <locale>it</locale>
+                <locale>ja</locale>
+                <locale>nl</locale>
+                <locale>pl</locale>
+                <locale>pt_BR</locale>
+                <locale>zh_CN</locale>
+              </locales>
+            </configuration>
+          </plugin>
+        </plugins>
+      </reporting>
+    </profile>
+  </profiles>
 </project>
diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
index 811c241..d4738a6 100644
--- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
+++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
@@ -217,7 +217,7 @@
     }
 
     /**
-     * <p>isUsingDefaultTemplate</p>
+     * <p>isUsingDefaultTemplate.</p>
      *
      * @return a boolean.
      */
@@ -227,7 +227,7 @@
     }
 
     /**
-     * <p>addSiteDirectory</p>
+     * <p>addSiteDirectory.</p>
      *
      * @param file a {@link java.io.File} object.
      */
@@ -237,7 +237,7 @@
     }
 
     /**
-     * <p>addModuleDirectory</p>
+     * <p>addModuleDirectory.</p>
      *
      * @param file a {@link java.io.File} object.
      * @param moduleParserId a {@link java.lang.String} object.
diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java
index 79d47bb..187560a 100644
--- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java
+++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java
@@ -25,7 +25,6 @@
 import java.util.List;
 
 import javax.swing.text.html.HTML.Attribute;
-import javax.swing.text.html.HTML.Tag;
 
 import org.apache.maven.doxia.module.xhtml.XhtmlSink;
 import org.apache.maven.doxia.sink.render.RenderingContext;
@@ -53,6 +52,8 @@
 
     private final StringWriter headWriter;
 
+    private StringBuffer sectionTitleBuffer;
+
     private boolean sectionHasID;
 
     private final Writer writer;
@@ -183,7 +184,7 @@
     }
 
     /**
-     * <p>getBody</p>
+     * <p>getBody.</p>
      *
      * @return a {@link java.lang.String} object.
      */
@@ -193,7 +194,7 @@
     }
 
     /**
-     * <p>getHead</p>
+     * <p>getHead.</p>
      *
      * @return a {@link java.lang.String} object.
      *
@@ -216,103 +217,32 @@
         setHeadFlag( true );
     }
 
-
     /** {@inheritDoc} */
-    public void sectionTitle( int level, SinkEventAttributes attributes )
+    protected void onSectionTitle( int depth, SinkEventAttributes attributes )
     {
-        if ( level == SECTION_LEVEL_1 || level == SECTION_LEVEL_2 )
-        {
-            setHeadFlag( true );
+        this.sectionTitleBuffer = new StringBuffer();
+        sectionHasID = ( attributes != null && attributes.isDefined ( Attribute.ID.toString() ) );
 
-            sectionHasID = ( attributes != null && attributes.isDefined ( Attribute.ID.toString() ) );
-        }
-        else
-        {
-            super.sectionTitle( level, attributes );
-        }
+        super.onSectionTitle( depth, attributes );
     }
 
     /** {@inheritDoc} */
-    public void sectionTitle_( int level )
+    protected void onSectionTitle_( int depth )
     {
-        if ( level == SECTION_LEVEL_1 || level == SECTION_LEVEL_2 )
+        String sectionTitle = sectionTitleBuffer.toString();
+        this.sectionTitleBuffer = null;
+
+        if ( !sectionHasID && !StringUtils.isEmpty( sectionTitle ) )
         {
-            String sectionTitle = "";
-
-            if ( getTextBuffer().length() > 0 )
-            {
-                sectionTitle = getTextBuffer().toString();
-            }
-
-            resetTextBuffer();
-
-            setHeadFlag( false );
-
-            writeStartTag( level == SECTION_LEVEL_1 ? Tag.H2 : Tag.H3  );
-
-            if ( !sectionHasID && !StringUtils.isEmpty( sectionTitle ) )
-            {
-                anchor( HtmlTools.encodeId( sectionTitle ) );
-                anchor_();
-            }
-            else
-            {
-                sectionHasID = false;
-            }
-
-            text( sectionTitle );
-            writeEndTag( level == SECTION_LEVEL_1 ? Tag.H2 : Tag.H3 );
+            anchor( HtmlTools.encodeId( sectionTitle ) );
+            anchor_();
         }
         else
         {
-            super.sectionTitle_( level );
+            sectionHasID = false;
         }
-    }
 
-    /**
-     * {@inheritDoc}
-     *
-     * Sets the head flag to true so the title text is buffered until the closing tag.
-     * @see org.apache.maven.doxia.sink.XhtmlBaseSink#sectionTitle1()
-     */
-    public void sectionTitle1()
-    {
-        sectionTitle( SECTION_LEVEL_1, null );
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * Writes out a sectionTitle1 block, including an anchor that is constructed from the
-     * buffered title text via {@link org.apache.maven.doxia.util.HtmlTools#encodeId(String)}.
-     * @see org.apache.maven.doxia.sink.XhtmlBaseSink#sectionTitle1_()
-     */
-    public void sectionTitle1_()
-    {
-        sectionTitle_( SECTION_LEVEL_1 );
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * Sets the head flag to true so the title text is buffered until the closing tag.
-     * @see org.apache.maven.doxia.sink.XhtmlBaseSink#sectionTitle2()
-     */
-    public void sectionTitle2()
-    {
-        sectionTitle( SECTION_LEVEL_2, null );
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * Writes out a sectionTitle2 block, including an anchor that is constructed from the
-     * buffered title text via {@link org.apache.maven.doxia.util.HtmlTools#encodeId(String)}.
-     * @see org.apache.maven.doxia.sink.XhtmlBaseSink#sectionTitle2_()
-     */
-    public void sectionTitle2_()
-    {
-        sectionTitle_( SECTION_LEVEL_2 );
+        super.onSectionTitle_( depth );
     }
 
     /**
@@ -327,6 +257,18 @@
     }
 
     /** {@inheritDoc} */
+    public void text( String text )
+    {
+        if ( sectionTitleBuffer != null )
+        {
+            // this implies we're inside a section title, collect text events for anchor generation
+            sectionTitleBuffer.append( text );
+        }
+
+        super.text( text );
+    }
+
+    /** {@inheritDoc} */
     protected void write( String text )
     {
         if ( isHeadFlag() )
diff --git a/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm b/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm
index 6453a36..2c0b3dd 100644
--- a/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm
+++ b/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm
@@ -149,9 +149,9 @@
 
 #macro ( copyright )
   #if ( $project )
-    #if ( ${project.organization} && ${project.organization.name} ) 
+    #if ( ${project.organization} && ${project.organization.name} )
       #set ( $period = "" )
-    #else 
+    #else
       #set ( $period = "." )
    #end
 
@@ -284,9 +284,9 @@
             <a href="$href" title="$name" class="poweredBy">
               #set ( $img = $PathTool.calculateLink( $img, $relativePath ) )
               #set ( $img = $img.replaceAll( "\\", "/" ) )
-              <img  class="poweredBy"  
-                    alt="$name" 
-                    src="$img" 
+              <img  class="poweredBy"
+                    alt="$name"
+                    src="$img"
                     width="90"
                     height="30"
               />
@@ -294,9 +294,9 @@
         #end
         #if( $poweredBy.isEmpty() )
           <a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">
-            <img class="poweredBy" 
-                 alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" 
-                 src="$relativePath/images/logos/maven-feather.png" 
+            <img class="poweredBy"
+                 alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven"
+                 src="$relativePath/images/logos/maven-feather.png"
                  width="90"
                  height="30"
                  border="1" />
@@ -304,9 +304,9 @@
         #end
     #else
         <a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">
-          <img class="poweredBy" 
-               alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" 
-               src="$relativePath/images/logos/maven-feather.png" 
+          <img class="poweredBy"
+               alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven"
+               src="$relativePath/images/logos/maven-feather.png"
                width="90"
                height="30"
                border="1"
@@ -328,6 +328,12 @@
     #foreach( $author in $authors )
       <meta name="author" content="$author" />
     #end
+#if ( $dateCreation )
+    <meta name="Date-Creation-yyyymmdd" content="$dateCreation" />
+#end
+#if ( $dateRevision )
+    <meta name="Date-Revision-yyyymmdd" content="$dateRevision" />
+#end
     #if ( $decoration.body.head )
       #foreach( $item in $decoration.body.head.getChildren() )
         ## Workaround for DOXIA-150 due to a non-desired behaviour in p-u
diff --git a/doxia-site-renderer/src/main/resources/site-renderer_en.properties b/doxia-site-renderer/src/main/resources/site-renderer_en.properties
new file mode 100644
index 0000000..0c479bc
--- /dev/null
+++ b/doxia-site-renderer/src/main/resources/site-renderer_en.properties
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# NOTE:
+# This bundle is intentionally empty because English strings are provided by the base bundle via the parent chain. It
+# must be provided nevertheless such that a request for locale "en" will not errorneously pick up the bundle for the
+# JVM's default locale (which need not be "en"). See the method javadoc about
+#   ResourceBundle.getBundle(String, Locale, ClassLoader)
+# for a full description of the lookup strategy.
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java
index 7748097..9307897 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java
@@ -23,14 +23,16 @@
 import com.gargoylesoftware.htmlunit.html.HtmlDivision;
 import com.gargoylesoftware.htmlunit.html.HtmlElement;
 import com.gargoylesoftware.htmlunit.html.HtmlHeader2;
+import com.gargoylesoftware.htmlunit.html.HtmlHeader3;
 import com.gargoylesoftware.htmlunit.html.HtmlPage;
 import com.gargoylesoftware.htmlunit.html.HtmlParagraph;
+import com.gargoylesoftware.htmlunit.html.UnknownHtmlElement;
 
 import java.util.Iterator;
 
 
 /**
- * 
+ * Verifies apt transformations.
  *
  * @author ltheussl
  * @version $Id$
@@ -69,6 +71,7 @@
         HtmlParagraph p = (HtmlParagraph) elementIterator.next();
         assertNotNull( p );
 
+        // Expected log: [APT Parser] Ambiguous link: 'cdc.html'. If this is a local link, prepend "./"!
         a = (HtmlAnchor) elementIterator.next();
         assertEquals( "Anchor", a.getAttributeValue( "name" ) );
         a = (HtmlAnchor) elementIterator.next();
@@ -91,6 +94,7 @@
         assertEquals( "http://maven.apache.org/", a.getAttributeValue( "href" ) );
         assertEquals( "externalLink", a.getAttributeValue( "class" ) );
 
+        // Expected log: [APT Parser] Ambiguous link: 'cdc.html'. If this is a local link, prepend "./"!
         a = (HtmlAnchor) elementIterator.next();
         assertEquals( "./cdc.html", a.getAttributeValue( "href" ) );
         a = (HtmlAnchor) elementIterator.next();
@@ -98,5 +102,64 @@
 
         a = (HtmlAnchor) elementIterator.next();
         assertEquals( "/index.html", a.getAttributeValue( "href" ) );
+
+        div = (HtmlDivision) elementIterator.next();
+        assertEquals( "section", div.getAttributeValue( "class" ) );
+
+        h2 = (HtmlHeader2) elementIterator.next();
+        assertNotNull( h2 );
+        assertEquals( "Section formatting: italic bold mono", h2.asText().trim() );
+
+        UnknownHtmlElement unknown = (UnknownHtmlElement) elementIterator.next();
+        assertEquals( "i", unknown.getTagName() );
+        assertEquals( "italic", unknown.asText().trim() );
+
+        unknown = (UnknownHtmlElement) elementIterator.next();
+        assertEquals( "b", unknown.getTagName() );
+        assertEquals( "bold", unknown.asText().trim() );
+
+        unknown = (UnknownHtmlElement) elementIterator.next();
+        assertEquals( "tt", unknown.getTagName() );
+        assertEquals( "mono", unknown.asText().trim() );
+
+        a = (HtmlAnchor) elementIterator.next();
+        assertEquals( "Section_formatting:_italic_bold_mono", a.getAttributeValue( "name" ) );
+
+        div = (HtmlDivision) elementIterator.next();
+        assertEquals( "section", div.getAttributeValue( "class" ) );
+
+        HtmlHeader3 h3 = (HtmlHeader3) elementIterator.next();
+        assertNotNull( h3 );
+        assertEquals( "SubSection formatting: italic bold mono", h3.asText().trim() );
+
+        unknown = (UnknownHtmlElement) elementIterator.next();
+        assertEquals( "i", unknown.getTagName() );
+        assertEquals( "italic", unknown.asText().trim() );
+
+        unknown = (UnknownHtmlElement) elementIterator.next();
+        assertEquals( "b", unknown.getTagName() );
+        assertEquals( "bold", unknown.asText().trim() );
+
+        unknown = (UnknownHtmlElement) elementIterator.next();
+        assertEquals( "tt", unknown.getTagName() );
+        assertEquals( "mono", unknown.asText().trim() );
+
+        a = (HtmlAnchor) elementIterator.next();
+        assertEquals( "SubSection_formatting:_italic_bold_mono", a.getAttributeValue( "name" ) );
+
+        p = (HtmlParagraph) elementIterator.next();
+        assertNotNull( p );
+
+        unknown = (UnknownHtmlElement) elementIterator.next();
+        assertEquals( "i", unknown.getTagName() );
+        assertEquals( "italic", unknown.asText().trim() );
+
+        unknown = (UnknownHtmlElement) elementIterator.next();
+        assertEquals( "b", unknown.getTagName() );
+        assertEquals( "bold", unknown.asText().trim() );
+
+        unknown = (UnknownHtmlElement) elementIterator.next();
+        assertEquals( "tt", unknown.getTagName() );
+        assertEquals( "mono", unknown.asText().trim() );
     }
 }
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
index b84e488..62048fb 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
@@ -20,18 +20,26 @@
  */
 
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.io.Reader;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.maven.doxia.site.decoration.DecorationModel;
 import org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Reader;
+import org.apache.maven.doxia.xsd.AbstractXmlValidatorTest;
 
 import org.codehaus.plexus.PlexusTestCase;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.ReaderFactory;
+import org.codehaus.plexus.util.StringUtils;
 
 
 /**
@@ -63,6 +71,21 @@
 
         renderer = (Renderer) lookup( Renderer.ROLE );
 
+        // copy the default-site.vm
+        InputStream is =
+            this.getResourceAsStream( "/org/apache/maven/doxia/siterenderer/resources/default-site.vm" );
+        assertNotNull( is );
+        OutputStream os = new FileOutputStream( new File( getBasedir(), "target/test-classes/default-site.vm" ) );
+        try
+        {
+            IOUtil.copy( is, os );
+        }
+        finally
+        {
+            IOUtil.close( is );
+            IOUtil.close( os );
+        }
+
         // Safety
         FileUtils.deleteDirectory( getTestFile( OUTPUT ) );
     }
@@ -117,6 +140,11 @@
         verifyMisc();
         verifyDocbookPageExists();
         verifyApt();
+
+        // ----------------------------------------------------------------------
+        // Validate the rendering pages
+        // ----------------------------------------------------------------------
+        validatePages();
     }
 
     /**
@@ -252,4 +280,82 @@
         AptVerifier verifier = new AptVerifier();
         verifier.verify( "target/output/apt.html" );
     }
+
+    /**
+     * Validate the generated pages.
+     *
+     * @throws Exception if something goes wrong.
+     * @since 1.1.1
+     */
+    public void validatePages() throws Exception
+    {
+        // Need to refactor...
+        XhtmlValidatorTest validator = new XhtmlValidatorTest();
+        validator.setUp();
+        validator.testValidateFiles();
+    }
+
+    protected static class XhtmlValidatorTest
+        extends AbstractXmlValidatorTest
+    {
+        /** {@inheritDoc} */
+        protected void setUp()
+            throws Exception
+        {
+            super.setUp();
+        }
+
+        /** {@inheritDoc} */
+        protected void tearDown()
+            throws Exception
+        {
+            super.tearDown();
+        }
+
+        /** {@inheritDoc} */
+        protected String[] getIncludes()
+        {
+            return new String[] { "**/*.html" };
+        }
+
+        /** {@inheritDoc} */
+        protected String addNamespaces( String content )
+        {
+            return content;
+        }
+
+        /** {@inheritDoc} */
+        protected Map getTestDocuments()
+            throws IOException
+        {
+            Map testDocs = new HashMap();
+
+            File dir = new File( getBasedir(), "target/output" );
+
+            List l = FileUtils.getFileNames( dir, getIncludes()[0], FileUtils.getDefaultExcludesAsString(), true );
+            for ( Iterator it = l.iterator(); it.hasNext(); )
+            {
+                String file = it.next().toString();
+                file = StringUtils.replace( file, "\\", "/" );
+
+                Reader reader = ReaderFactory.newXmlReader( new File( file ) );
+                try
+                {
+                    testDocs.put( file, IOUtil.toString( reader ) );
+                }
+                finally
+                {
+                    IOUtil.close( reader );
+                }
+            }
+
+            return testDocs;
+        }
+
+        /** {@inheritDoc} */
+        protected boolean isFailErrorMessage( String message )
+        {
+            return true;
+        }
+    }
 }
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java
index c1200cb..07a4595 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java
@@ -51,7 +51,7 @@
         HtmlMeta author = (HtmlMeta) page.getHtmlElementsByName( "author" ).get( 0 );
         assertNotNull( author );
         assertTrue( author.toString().indexOf( "Ligature &#198;" ) > 0 );
-        assertEquals( "Ligature Æ", author.getContentAttribute() );
+        assertEquals( "Ligature \u00C6", author.getContentAttribute() );
 
         author = (HtmlMeta) page.getHtmlElementsByName( "author" ).get( 1 );
         assertNotNull( author );
@@ -109,7 +109,7 @@
 
         HtmlAnchor a = (HtmlAnchor) elementIterator.next();
         assertNotNull( a );
-        assertEquals( a.getAttributeValue( "name" ), "section_name_with_entities:____x1d7ed" );
+        assertEquals( a.getAttributeValue( "name" ), "section_name_with_entities:____" );
 
         div = (HtmlDivision) elementIterator.next();
         assertNotNull( div );
@@ -123,6 +123,10 @@
         assertNotNull( h4 );
         assertEquals( h4.asText().trim(), "Entities" );
 
+        a = (HtmlAnchor) elementIterator.next();
+        assertNotNull( a );
+        assertEquals( a.getAttributeValue( "name" ), "Entities" );
+
         div = (HtmlDivision) elementIterator.next();
 
         HtmlHeader3 h3 = (HtmlHeader3) elementIterator.next();
@@ -145,7 +149,7 @@
 
         p = (HtmlParagraph) elementIterator.next();
         assertNotNull( p );
-        assertEquals( p.asText().trim(), "'\u0391' '\u0392' '\u0393' '\uD7ED'" );
+        assertEquals( p.asText().trim(), "'\u0391' '\u0392' '\u0393' '\uD7ED\uD7ED' '\u0159\u0159' '\u0159'" );
 
         div = (HtmlDivision) elementIterator.next();
 
@@ -167,6 +171,10 @@
         assertNotNull( h4 );
         assertEquals( h4.asText().trim(), "CDATA" );
 
+        a = (HtmlAnchor) elementIterator.next();
+        assertNotNull( a );
+        assertEquals( a.getAttributeValue( "name" ), "CDATA" );
+
         div = (HtmlDivision) elementIterator.next();
         assertNotNull( div );
         assertEquals( div.getAttributeValue( "class" ), "source" );
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/FaqVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/FaqVerifier.java
index d5862bb..0d00641 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/FaqVerifier.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/FaqVerifier.java
@@ -31,9 +31,6 @@
 import com.gargoylesoftware.htmlunit.html.HtmlPage;
 import com.gargoylesoftware.htmlunit.html.HtmlParagraph;
 import com.gargoylesoftware.htmlunit.html.HtmlPreformattedText;
-import com.gargoylesoftware.htmlunit.html.HtmlTable;
-import com.gargoylesoftware.htmlunit.html.HtmlTableDataCell;
-import com.gargoylesoftware.htmlunit.html.HtmlTableRow;
 
 import java.util.Iterator;
 
@@ -72,6 +69,9 @@
         assertEquals( h2.asText().trim(), "Oft Asked Questions" );
 
         HtmlAnchor a = (HtmlAnchor) elementIterator.next();
+        assertEquals( a.getAttributeValue( "name" ), "top" );
+
+        a = (HtmlAnchor) elementIterator.next();
         assertEquals( a.getAttributeValue( "name" ), "Oft_Asked_Questions" );
 
         HtmlParagraph p = (HtmlParagraph) elementIterator.next();
@@ -148,16 +148,8 @@
         assertEquals( element.getTagName(), "i" );
         assertEquals( element.asText().trim(), "italic" );
 
-        HtmlTable table = (HtmlTable) elementIterator.next();
-        assertEquals( table.getAttributeValue( "border" ), "0" );
-
-        element = (HtmlElement) elementIterator.next();
-        // this is a htmlunit bug
-        assertEquals( element.getTagName(), "tbody" );
-
-        HtmlTableRow tr = (HtmlTableRow) elementIterator.next();
-        HtmlTableDataCell td = (HtmlTableDataCell) elementIterator.next();
-        assertEquals( td.getAttributeValue( "align" ), "right" );
+        p = (HtmlParagraph) elementIterator.next();
+        assertEquals( p.getAttributeValue( "align" ), "right" );
 
         a = (HtmlAnchor) elementIterator.next();
         assertEquals( a.getAttributeValue( "href" ), "#top" );
@@ -195,16 +187,8 @@
         HtmlPreformattedText pre = (HtmlPreformattedText) elementIterator.next();
         assertEquals( pre.asText().trim(), "<source>1.5</source>" );
 
-        table = (HtmlTable) elementIterator.next();
-        assertEquals( table.getAttributeValue( "border" ), "0" );
-
-        element = (HtmlElement) elementIterator.next();
-        // this is a htmlunit bug
-        assertEquals( element.getTagName(), "tbody" );
-
-        tr = (HtmlTableRow) elementIterator.next();
-        td = (HtmlTableDataCell) elementIterator.next();
-        assertEquals( td.getAttributeValue( "align" ), "right" );
+        p = (HtmlParagraph) elementIterator.next();
+        assertEquals( p.getAttributeValue( "align" ), "right" );
 
         a = (HtmlAnchor) elementIterator.next();
         assertEquals( a.getAttributeValue( "href" ), "#top" );
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java
index 1c7f53d..83fd239 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java
@@ -37,7 +37,7 @@
 
 
 /**
- * 
+ * Verify javascript code.
  *
  * @author ltheussl
  * @version $Id$
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java
index 1267dc4..7b6d9da 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java
@@ -90,6 +90,10 @@
         assertNotNull( h4 );
         assertEquals( h4.asText().trim(), "Unordered lists" );
 
+        a = (HtmlAnchor) elementIterator.next();
+        assertNotNull( a );
+        assertEquals( a.getAttributeValue( "name" ), "Unordered_lists" );
+
         HtmlParagraph p = (HtmlParagraph) elementIterator.next();
         assertNotNull( p );
         assertEquals( p.asText().trim(), "Below is an unordered list, followed by six paragraphs." );
@@ -176,6 +180,10 @@
         assertNotNull( h4 );
         assertEquals( h4.asText().trim(), "Ordered lists" );
 
+        a = (HtmlAnchor) elementIterator.next();
+        assertNotNull( a );
+        assertEquals( a.getAttributeValue( "name" ), "Ordered_lists" );
+
         p = (HtmlParagraph) elementIterator.next();
         assertNotNull( p );
         assertEquals( p.asText().trim(), "Below is an ordered list, followed by six paragraphs." );
@@ -258,6 +266,10 @@
         assertNotNull( h4 );
         assertEquals( h4.asText().trim(), "Definition lists" );
 
+        a = (HtmlAnchor) elementIterator.next();
+        assertNotNull( a );
+        assertEquals( a.getAttributeValue( "name" ), "Definition_lists" );
+
         p = (HtmlParagraph) elementIterator.next();
         assertNotNull( p );
         assertEquals( p.asText().trim(), "Below is a definition list, followed by six paragraphs." );
diff --git a/doxia-site-renderer/src/test/resources/default-site.vm b/doxia-site-renderer/src/test/resources/default-site.vm
deleted file mode 100644
index ef1a4b0..0000000
--- a/doxia-site-renderer/src/test/resources/default-site.vm
+++ /dev/null
@@ -1,391 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-#macro ( link $href $name )
-  #if ( ( $href.toLowerCase().startsWith("http") || $href.toLowerCase().startsWith("https") ) )
-    <a href="$href" class="externalLink">$name</a>
-  #else
-    <a href="$href">$name</a>
-  #end
-#end
-
-#macro ( banner $banner $id )
-  #if ( $banner )
-    #if( $banner.href )
-      <a href="$banner.href" id="$id" #if( $banner.alt ) title="$banner.alt" #end >
-    #else
-        <div id="$id">
-    #end
-
-    #if( $banner.src )
-        #set ( $src = $banner.src )
-        #if ( ! ( $src.toLowerCase().startsWith("http") || $src.toLowerCase().startsWith("https") ) )
-            #set ( $src = $PathTool.calculateLink( $src, $relativePath ) )
-            #set ( $src = $src.replaceAll( "\\", "/" ) )
-        #end
-        #if ( $banner.alt )
-            #set ( $alt = $banner.alt )
-        #else
-            #set ( $alt = $banner.name )
-        #end
-        <img src="$src" alt="$alt" />
-    #else
-        $banner.name
-    #end
-
-    #if( $banner.href )
-        </a>
-    #else
-        </div>
-    #end
-  #end
-#end
-
-#macro ( links $links )
-  #set ( $counter = 0 )
-  #foreach( $item in $links )
-    #set ( $counter = $counter + 1 )
-    #set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
-    #set ( $currentItemHref = $currentItemHref.replaceAll( "\\", "/" ) )
-    #link( $currentItemHref $item.name )
-    #if ( $links.size() > $counter )
-      |
-    #end
-  #end
-#end
-
-#macro ( breadcrumbs $breadcrumbs )
-  #set ( $counter = 0 )
-  #foreach( $item in $breadcrumbs )
-    #set ( $counter = $counter + 1 )
-    #set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
-    #set ( $currentItemHref = $currentItemHref.replaceAll( "\\", "/" ) )
-
-    #if ( $currentItemHref == $alignedFileName || $currentItemHref == "" )
-      $item.name
-    #else
-      #link( $currentItemHref $item.name )
-    #end
-    #if ( $breadcrumbs.size() > $counter )
-      &gt;
-    #end
-  #end
-#end
-
-#macro ( displayTree $display $item )
-  #if ( $item && $item.items && $item.items.size() > 0 )
-    #foreach( $subitem in $item.items )
-      #set ( $subitemHref = $PathTool.calculateLink( $subitem.href, $relativePath ) )
-      #set ( $subitemHref = $subitemHref.replaceAll( "\\", "/" ) )
-      #if ( $alignedFileName == $subitemHref )
-        #set ( $display = true )
-      #end
-
-      #displayTree( $display $subitem )
-    #end
-  #end
-#end
-
-#macro ( menuItem $item )
-  #set ( $collapse = "none" )
-  #set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
-  #set ( $currentItemHref = $currentItemHref.replaceAll( "\\", "/" ) )
-
-  #if ( $item && $item.items && $item.items.size() > 0 )
-    #if ( $item.collapse == false )
-      #set ( $collapse = "expanded" )
-    #else
-      ## By default collapsed
-      #set ( $collapse = "collapsed" )
-    #end
-
-    #set ( $display = false )
-    #displayTree( $display $item )
-
-    #if ( $alignedFileName == $currentItemHref || $display )
-      #set ( $collapse = "expanded" )
-    #end
-  #end
-  <li class="$collapse">
-    #if ( $item.img )
-      #if ( ! ( $item.img.toLowerCase().startsWith("http") || $item.img.toLowerCase().startsWith("https") ) )
-        #set ( $src = $PathTool.calculateLink( $item.img, $relativePath ) )
-        #set ( $src = $src.replaceAll( "\\", "/" ) )
-        <img src="$src"/>
-      #else
-        <img src="$item.img" align="absbottom" style="border-width: 0"/>
-      #end
-    #end
-    #if ( $alignedFileName == $currentItemHref )
-      <strong>$item.name</strong>
-    #else
-      #link( $currentItemHref $item.name )
-    #end
-  #if ( $item && $item.items && $item.items.size() > 0 )
-    #if ( $collapse == "expanded" )
-      <ul>
-        #foreach( $subitem in $item.items )
-          #menuItem( $subitem )
-        #end
-      </ul>
-    #end
-  #end
-  </li>
-#end
-
-#macro ( mainMenu $menus )
-  #foreach( $menu in $menus )
-    #if ( $menu.name )
-    <h5>$menu.name</h5>
-    #end
-    #if ( $menu.items && $menu.items.size() > 0 )
-    <ul>
-      #foreach( $item in $menu.items )
-        #menuItem( $item )
-      #end
-    </ul>
-    #end
-  #end
-#end
-
-#macro ( copyright )
-  #if ( $project )
-    #if ( ${project.organization} && ${project.organization.name} )
-      #set ( $period = "" )
-    #else
-      #set ( $period = "." )
-   #end
-
-   #set ( $currentYear = ${currentDate.year} + 1900 )
-
-    #if ( ${project.inceptionYear} && ( ${project.inceptionYear} != ${currentYear.toString()} ) )
-      ${project.inceptionYear}-${currentYear}${period}
-    #else
-      ${currentYear}${period}
-    #end
-
-    #if ( ${project.organization} )
-      #if ( ${project.organization.name} && ${project.organization.url} )
-          <a href="$project.organization.url">${project.organization.name}</a>.
-      #elseif ( ${project.organization.name} )
-        ${project.organization.name}.
-      #end
-    #end
-  #end
-#end
-
-#macro ( publishDate $position $publishDate $version )
-  #if ( $publishDate && $publishDate.format )
-    #set ( $format = $publishDate.format )
-  #else
-    #set ( $format = "yyyy-MM-dd" )
-  #end
-
-  $dateFormat.applyPattern( $format )
-
-  #set ( $dateToday = $dateFormat.format( $currentDate ) )
-
-  #if ( $publishDate && $publishDate.position )
-    #set ( $datePosition = $publishDate.position )
-  #else
-    #set ( $datePosition = "left" )
-  #end
-
-  #if ( $version )
-    #if ( $version.position )
-      #set ( $versionPosition = $version.position )
-    #else
-      #set ( $versionPosition = "left" )
-    #end
-  #else
-    #set ( $version = "" )
-    #set ( $versionPosition = "left" )
-  #end
-
-  #set ( $breadcrumbs = $decoration.body.breadcrumbs )
-  #set ( $links = $decoration.body.links )
-
-  #if ( $datePosition.equalsIgnoreCase( "right" ) && $links && $links.size() > 0 )
-    #set ( $prefix = "&nbsp;|" )
-  #else
-    #set ( $prefix = "" )
-  #end
-
-  #if ( $datePosition.equalsIgnoreCase( $position ) )
-    #if ( ( $datePosition.equalsIgnoreCase( "right" ) ) || ( $datePosition.equalsIgnoreCase( "bottom" ) ) )
-      $prefix <span id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateToday</span>
-      #if ( $versionPosition.equalsIgnoreCase( $position ) )
-        &nbsp;| <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
-      #end
-    #elseif ( ( $datePosition.equalsIgnoreCase( "navigation-bottom" ) ) || ( $datePosition.equalsIgnoreCase( "navigation-top" ) ) )
-      <div id="lastPublished">
-        <span id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateToday</span>
-        #if ( $versionPosition.equalsIgnoreCase( $position ) )
-          &nbsp;| <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
-        #end
-      </div>
-    #elseif ( $datePosition.equalsIgnoreCase("left") )
-      <div class="xleft">
-        <span id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateToday</span>
-        #if ( $versionPosition.equalsIgnoreCase( $position ) )
-          &nbsp;| <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
-        #end
-        #if ( $breadcrumbs && $breadcrumbs.size() > 0 )
-          | #breadcrumbs( $breadcrumbs )
-        #end
-      </div>
-    #end
-  #elseif ( $versionPosition.equalsIgnoreCase( $position ) )
-    #if ( ( $versionPosition.equalsIgnoreCase( "right" ) ) || ( $versionPosition.equalsIgnoreCase( "bottom" ) ) )
-      $prefix <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
-    #elseif ( ( $versionPosition.equalsIgnoreCase( "navigation-bottom" ) ) || ( $versionPosition.equalsIgnoreCase( "navigation-top" ) ) )
-      <div id="lastPublished">
-        <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
-      </div>
-    #elseif ( $versionPosition.equalsIgnoreCase("left") )
-      <div class="xleft">
-        <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
-        #if ( $breadcrumbs && $breadcrumbs.size() > 0 )
-          | #breadcrumbs( $breadcrumbs )
-        #end
-      </div>
-    #end
-  #elseif ( $position.equalsIgnoreCase( "left" ) )
-    #if ( $breadcrumbs && $breadcrumbs.size() > 0 )
-      <div class="xleft">
-        #breadcrumbs( $breadcrumbs )
-      </div>
-    #end
-  #end
-#end
-
-#macro ( poweredByLogo $poweredBy )
-    #if( $poweredBy )
-        #foreach ($item in $poweredBy)
-            #if( $item.href )
-                #set ( $href = $PathTool.calculateLink( $item.href, $relativePath ) )
-                #set ( $href = $href.replaceAll( "\\", "/" ) )
-            #else
-                #set ( $href="http://maven.apache.org/" )
-            #end
-
-            #if( $item.name )
-                #set ( $name = $item.name )
-            #else
-                #set ( $name = $i18n.getString( "site-renderer", $locale, "template.builtby" )  )
-                #set ( $name = "${name} Maven"  )
-            #end
-
-            #if( $item.img )
-                #set ( $img = $item.img )
-            #else
-                #set ( $img = "images/logos/maven-feather.png" )
-            #end
-
-            <a href="$href" title="$name" class="poweredBy">
-              #set ( $img = $PathTool.calculateLink( $img, $relativePath ) )
-              #set ( $img = $img.replaceAll( "\\", "/" ) )
-              <img  class="poweredBy"
-                    alt="$name"
-                    src="$img"
-                    width="90"
-                    height="30"
-              />
-            </a>
-        #end
-        #if( $poweredBy.isEmpty() )
-          <a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">
-            <img class="poweredBy"
-                 alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven"
-                 src="$relativePath/images/logos/maven-feather.png"
-                 width="90"
-                 height="30"
-                 border="1" />
-          </a>
-        #end
-    #else
-        <a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">
-          <img class="poweredBy"
-               alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven"
-               src="$relativePath/images/logos/maven-feather.png"
-               width="90"
-               height="30"
-               border="1"
-               />
-        </a>
-    #end
-#end
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=${outputEncoding}" />
-    <title>$title</title>
-    <style type="text/css" media="all">
-      @import url("$relativePath/css/maven-base.css");
-      @import url("$relativePath/css/maven-theme.css");
-      @import url("$relativePath/css/site.css");
-    </style>
-    <link rel="stylesheet" href="$relativePath/css/print.css" type="text/css" media="print" />
-#foreach( $author in $authors )
-    <meta name="author" content="$author" />
-#end
-#if ( $dateCreation )
-    <meta name="Date-Creation-yyyymmdd" content="$dateCreation">
-#end
-#if ( $dateRevision )
-    <meta name="Date-Revision-yyyymmdd" content="$dateRevision">
-#end
-    #if ( $decoration.body.head )
-      #foreach( $item in $decoration.body.head.getChildren() )
-        ## Workaround for DOXIA-150 due to a non-desired behaviour in p-u
-        ## @see org.codehaus.plexus.util.xml.Xpp3Dom#toString()
-        ## @see org.codehaus.plexus.util.xml.Xpp3Dom#toUnescapedString()
-        #set ( $documentHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" )
-        #set ( $documentHeader = $documentHeader.replaceAll( "\\", "" ) )
-        #if ( $item.name == "script" )
-          $StringUtils.replace( $item.toUnescapedString(), $documentHeader, "" )
-        #else
-          $StringUtils.replace( $item.toString(), $documentHeader, "" )
-        #end
-      #end
-    #end
-    $headContent
-  </head>
-  <body class="composite">
-    <div id="banner">
-      #banner( $decoration.bannerLeft "bannerLeft" )
-      #banner( $decoration.bannerRight "bannerRight" )
-      <div class="clear">
-        <hr/>
-      </div>
-    </div>
-    <div id="breadcrumbs">
-      #publishDate( "left" $decoration.publishDate $decoration.version )
-      <div class="xright">#links( $decoration.body.links )#publishDate( "right" $decoration.publishDate $decoration.version )</div>
-      <div class="clear">
-        <hr/>
-      </div>
-    </div>
-    <div id="leftColumn">
-      <div id="navcolumn">
-       #publishDate( "navigation-top" $decoration.publishDate $decoration.version )
-       #mainMenu( $decoration.body.menus )
-       #poweredByLogo( $decoration.poweredBy )
-       #publishDate( "navigation-bottom" $decoration.publishDate $decoration.version )
-      </div>
-    </div>
-    <div id="bodyColumn">
-      <div id="contentBox">
-        $bodyContent
-      </div>
-    </div>
-    <div class="clear">
-      <hr/>
-    </div>
-    <div id="footer">
-      <div class="xright">Copyright &#169;#copyright()All Rights Reserved.#publishDate( "bottom" $decoration.publishDate $decoration.version )</div>
-      <div class="clear">
-        <hr/>
-      </div>
-    </div>
-  </body>
-</html>
diff --git a/doxia-site-renderer/src/test/resources/site/apt/apt.apt b/doxia-site-renderer/src/test/resources/site/apt/apt.apt
index a58316a..c387e55 100644
--- a/doxia-site-renderer/src/test/resources/site/apt/apt.apt
+++ b/doxia-site-renderer/src/test/resources/site/apt/apt.apt
@@ -38,6 +38,12 @@
   Link to {{{./cdc.html}other document}} and within {{{cdc.html}same document}}.
   Link to {{{/index.html}root document}}.
 
+Section formatting: <italic> <<bold>> <<<mono>>>
+
+* SubSection formatting: <italic> <<bold>> <<<mono>>>
+
+  <italic> <<bold>> <<<mono>>>
+
 TOC Macro
 
 %{toc}
diff --git a/doxia-site-renderer/src/test/resources/site/apt/cdc.apt b/doxia-site-renderer/src/test/resources/site/apt/cdc.apt
index 8f10cf1..b61ce89 100644
--- a/doxia-site-renderer/src/test/resources/site/apt/cdc.apt
+++ b/doxia-site-renderer/src/test/resources/site/apt/cdc.apt
@@ -1,7 +1,7 @@
  -----
  Plexus Component Descriptor Creator
  -----
- Trygve Laugst�l
+ Trygve Laugstøl
  -----
  25th May 2005
  -----
diff --git a/doxia-site-renderer/src/test/resources/site/docbook/sdocbook_full.xml b/doxia-site-renderer/src/test/resources/site/docbook/sdocbook_full.xml
new file mode 100644
index 0000000..085eeda
--- /dev/null
+++ b/doxia-site-renderer/src/test/resources/site/docbook/sdocbook_full.xml
@@ -0,0 +1,546 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<!DOCTYPE article PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.1//EN" "http://www.oasis-open.org/docbook/xml/simple/1.1/sdocbook.dtd">
+
+<article>
+
+  <articleinfo>
+
+    <title>Title</title>
+    <subtitle>Or How I Learned to Live</subtitle>
+    <citetitle>citetitle</citetitle>
+    <!-- Abbreviated titles are usually used only in specific contexts, such as headers and footers, and suppressed everywhere else. -->
+    <titleabbrev>Configuring Menus</titleabbrev>
+
+    <corpauthor>CorpAuthor</corpauthor><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+
+    <date>Date</date><!-- DocBook does not specify the format of the date. -->
+
+    <abbrev>Assn.</abbrev>
+
+    <abstract><!-- Formatted as a displayed block. Sometimes suppressed. Often presented in alternate outputs. -->
+      <title>articleinfo Abstract Title</title>
+      <para>articleinfo Abstract Content</para>
+    </abstract>
+
+    <author><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+      <honorific>PhD</honorific>
+      <firstname>Main</firstname>
+      <surname>Author</surname>
+      <lineage>Sr.</lineage>
+      <othername>D</othername>
+      <affiliation>
+        <jobtitle>Director of Cooperative Efforts</jobtitle>
+        <orgname>Cooperative Engineering</orgname>
+      </affiliation>
+      <authorblurb>
+        <title>Title</title>
+        <para>super hero.</para>
+      </authorblurb>
+    </author>
+
+    <honorific>Dr</honorific>
+    <firstname>Peter</firstname>
+    <surname>Doe</surname>
+    <lineage>Sr.</lineage>
+    <othername>Spiderman</othername>
+    <affiliation>
+      <jobtitle>Director of Cooperative Efforts</jobtitle>
+      <orgname>Cooperative Engineering</orgname>
+    </affiliation>
+    <authorblurb>
+      <title>Title</title>
+      <para>super hero.</para>
+    </authorblurb>
+
+    <authorgroup>
+      <corpauthor>Authorgroup CorpAuthor</corpauthor><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+
+      <author><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+        <honorific>Dr</honorific>
+        <firstname>Authorgroup</firstname>
+        <surname>Author</surname>
+        <lineage>Sr.</lineage>
+        <othername>D</othername>
+        <affiliation>
+          <jobtitle>Director of Cooperative Efforts</jobtitle>
+          <orgname>Cooperative Engineering</orgname>
+        </affiliation>
+        <authorblurb>
+          <title>authorblurb title</title>
+          <para>He's a super hero in his spare time.</para>
+        </authorblurb>
+      </author>
+
+      <editor><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+        <honorific>Dr</honorific>
+        <firstname>Authorgroup</firstname>
+        <surname>Editor</surname>
+        <lineage>Sr.</lineage>
+        <othername>Spiderman</othername>
+        <affiliation>
+          <jobtitle>Director of Cooperative Efforts</jobtitle>
+          <orgname>Cooperative Engineering</orgname>
+        </affiliation>
+        <authorblurb>
+          <title>authorblurb title</title>
+          <para>He's a super hero in his spare time.</para>
+        </authorblurb>
+      </editor>
+
+      <othercredit><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+        <honorific>Dr</honorific>
+        <firstname>Authorgroup</firstname>
+        <surname>OtherCredit</surname>
+        <lineage>Sr.</lineage>
+        <othername>AlterEgo</othername>
+        <affiliation>
+          <jobtitle>Director of Cooperative Efforts</jobtitle>
+          <orgname>Cooperative Engineering</orgname>
+        </affiliation>
+        <authorblurb>
+          <title>authorblurb title</title>
+          <para>He's a super hero in his spare time.</para>
+        </authorblurb>
+      </othercredit>
+    </authorgroup>
+
+    <bibliomisc role="url"><ulink url="http://www.net/"/></bibliomisc>
+
+    <copyright>
+      <year>1996</year>
+      <year>1997</year>
+      <holder>me</holder>
+    </copyright>
+
+    <edition>Edition</edition>
+
+    <editor><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+      <honorific>Dr</honorific>
+      <firstname>Peter</firstname>
+      <surname>Parker</surname>
+      <lineage>Sr.</lineage>
+      <othername>Spiderman</othername>
+      <affiliation>
+        <jobtitle>Director of Cooperative Efforts</jobtitle>
+        <orgname>Cooperative Engineering</orgname>
+      </affiliation>
+      <authorblurb>
+        <title>Title</title>
+        <para>Peter's a super hero in his spare time.</para>
+      </authorblurb>
+    </editor>
+
+    <keywordset>
+      <keyword>key1</keyword>
+      <keyword>key2</keyword>
+    </keywordset>
+
+    <mediaobject>
+      <textobject><phrase>The Eiffel Tower</phrase></textobject>
+    </mediaobject>
+
+    <othercredit><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+      <honorific>Dr</honorific>
+      <firstname>John</firstname>
+      <surname>Doe</surname>
+      <lineage>Sr.</lineage>
+      <othername>Spiderman</othername>
+      <affiliation>
+        <jobtitle>Director of Cooperative Efforts</jobtitle>
+        <orgname>Cooperative Engineering</orgname>
+      </affiliation>
+      <authorblurb>
+        <title>Title</title>
+        <para>Peter's a super hero in his spare time.</para>
+      </authorblurb>
+    </othercredit>
+
+    <pubdate>1994</pubdate>
+    <publishername>The TeX User's Group</publishername>
+    <releaseinfo>beta</releaseinfo>
+    <volumenum>15</volumenum>
+    <issuenum>3</issuenum>
+    <legalnotice><para>No notice is required.</para></legalnotice>
+
+    <revhistory>
+      <revision>
+        <revnumber>0.91</revnumber>
+        <date>11 Dec 1996</date>
+        <authorinitials>ndw</authorinitials>
+        <revremark>Bug fixes</revremark>
+      </revision>
+      <revision>
+        <revnumber>0.90</revnumber>
+        <date>30 Nov 1996</date>
+        <authorinitials>ndw</authorinitials>
+        <revdescription><para>long write up</para></revdescription>
+      </revision>
+    </revhistory>
+
+    <subjectset scheme="libraryofcongress">
+      <subject><subjectterm>Electronic Publishing</subjectterm></subject>
+      <subject><subjectterm>SGML (Computer program language)</subjectterm></subject>
+    </subjectset>
+
+  </articleinfo>
+
+
+  <abstract>
+    <title>Abstract Title</title>
+    <para>In brief.</para>
+  </abstract>
+
+  <section>
+    <sectioninfo>
+      <abstract><para>A trivial example of recursive sections.</para></abstract>
+    </sectioninfo>
+    <title>Section title</title>
+    <section><title>Sub-section title</title>
+      <section><title>Sub-sub-section title</title>
+        <section><title>Sub-sub-sub-section title</title>
+          <section id="ch02"><title>Sub-sub-sub-sub-section title</title>
+
+  <epigraph>
+    <attribution>William Shakespeare</attribution>
+    <literallayout>Epigraph: What say you?</literallayout>
+  </epigraph>
+
+  <para>
+    The <abbrev>Assn.</abbrev> of Computing Machinery
+    has published <citetitle pubwork="book">Developing SGML DTDs</citetitle>.
+  </para>
+
+  <para>
+    In <acronym>UNIX</acronym> command <command>ls</command>
+    with the <option>-a</option> option is used to get a directory listing.
+  </para>
+
+  <para>
+    The output from the date command is eg
+    <computeroutput>Sun  Nov 16, 1997  21:03:29</computeroutput>.
+  </para>
+
+  <para>
+    An email address is eg <email>yo@tu.com</email>.
+  </para>
+
+  <para>
+    The symbolic constants for error numbers are defined in
+    <filename class="headerfile">errno.h</filename> in
+    <filename class="directory">/usr/include/sys</filename>.
+      </para>
+
+  <para>
+    This software is provided <quote>as is</quote>.
+  </para>
+
+  <para>
+    Execute the command with
+    <command>command</command>
+    <option>options</option>
+    <replaceable>filename</replaceable>.
+  </para>
+
+  <para>
+    This is hosted at <systemitem class="systemname">helio.com</systemitem>.
+    The name <trademark>pipipo</trademark> is traded.
+    The name <trademark class="registered">pipipo</trademark> is registered.
+    The name <trademark class="copyright">pipipo</trademark> is copyrighted.
+    The name <trademark class="service">pipipo</trademark> is serviced.
+    The name <trademark class="trade">pipipo</trademark> is traded.
+  </para>
+
+  <para>
+    At the system prompt, enter <userinput>xyzzy</userinput>.
+  </para>
+
+  <sidebar>
+    <title>A Sidebar</title>
+    <para>Sidebar content.</para>
+  </sidebar>
+
+  <para>
+    A link to an element with an XRefLabel: <xref linkend="ch03"/>.
+    A straight link generates the cross-reference text: <xref linkend="ch02"/>.
+  </para>
+
+  <mediaobject>
+    <audioobject>
+      <objectinfo><title>Phaser sound effect</title></objectinfo>
+      <audiodata fileref="phaser.wav"/>
+    </audioobject>
+    <textobject><phrase>A sound effect.</phrase></textobject>
+  </mediaobject>
+
+  <mediaobject>
+    <videoobject><videodata fileref="movie.avi"/></videoobject>
+  </mediaobject>
+
+  <para>
+    <emphasis>Italic</emphasis> font.
+    <emphasis role="bold">Bold</emphasis> font.
+    <literal>Monospaced</literal> font.
+  </para>
+
+  <example>
+    <title>A Real Function</title>
+    <programlisting>
+      real function()<lineannotation>Error!</lineannotation>
+    </programlisting>
+  </example>
+
+  <blockquote>
+    <attribution>William Shakespeare</attribution>
+    <literallayout>Blockquote: What say you?</literallayout>
+  </blockquote>
+
+  <para>
+    An annual percentage rate of
+    <literal>3.27</literal>%<footnote id="footnote"><para>The prime rate.</para></footnote>
+    will be charged on all balances<footnoteref linkend="footnote"/>.
+  </para>
+
+  <itemizedlist>
+    <listitem><para>List item 1.</para></listitem>
+    <listitem><para>List item 2.</para><para>Paragraph contained in list item 2.</para>
+    <itemizedlist>
+      <listitem><para>Sub-list item 1.</para></listitem>
+      <listitem><para>Sub-list item 2.</para></listitem>
+    </itemizedlist>
+    </listitem>
+    <listitem><para>List item 3. Force end of list:</para></listitem>
+  </itemizedlist>
+
+  <programlisting>Verbatim text not contained in list item 3</programlisting>
+
+  <orderedlist numeration="arabic">
+    <listitem><para>Numbered item 1.</para>
+    <orderedlist numeration="upperalpha">
+      <listitem><para>Numbered item A.</para></listitem>
+      <listitem><para>Numbered item B.</para></listitem>
+    </orderedlist>
+    </listitem>
+    <listitem><para>Numbered item 2.</para></listitem>
+  </orderedlist>
+
+  <para>List numbering schemes: [[1]], [[a]], [[A]], [[i]], [[I]].</para>
+
+  <variablelist>
+    <varlistentry><term>Defined term 1</term><listitem><para>of definition list.</para></listitem></varlistentry>
+    <varlistentry><term>Defined term 2</term><listitem><para>of definition list.</para><programlisting>Verbatim text
+              in a box        </programlisting></listitem></varlistentry>
+  </variablelist>
+
+  <figure>
+    <title>Figure title</title>
+    <mediaobject>
+      <imageobject><imagedata fileref="figure.png" format="JPEG" /></imageobject>
+      <caption id="ch03" xreflabel="Chapter the Third"><para>Figure caption</para></caption>
+    </mediaobject>
+  </figure>
+
+<para>
+  Here is an inline image: <inlinemediaobject><imageobject><imagedata fileref="figure.png"/></imageobject></inlinemediaobject>.
+</para>
+
+<!-- FIXME: DOXIA-339 table caption is not emitted correctly
+  <table frame="all" rowsep="1" colsep="1">
+    <title>Table caption</title>
+    <tgroup cols="3">
+      <colspec align="center" /><colspec align="left" /><colspec align="right" />
+      <tbody>
+        <row>
+          <entry>Centered --><!-- LB --><!-- cell 1,1</entry>
+          <entry>Left-aligned --><!-- LB --><!-- cell 1,2</entry>
+          <entry>Right-aligned --><!-- LB --><!-- cell 1,3</entry>
+        </row>
+        <row>
+          <entry>cell 2,1</entry>
+          <entry>cell 2,2</entry>
+          <entry>cell 2,3</entry>
+        </row>
+      </tbody>
+    </tgroup>
+  </table>
+-->
+
+  <para>No grid, no caption:</para>
+
+  <informaltable frame="none" rowsep="0" colsep="0">
+    <tgroup cols="2">
+      <colspec align="center" /><colspec align="center" />
+      <tbody>
+        <row>
+          <entry>cell</entry>
+          <entry>cell</entry>
+        </row>
+        <row>
+          <entry>cell</entry>
+          <entry>cell</entry>
+        </row>
+      </tbody>
+    </tgroup>
+  </informaltable>
+
+  <informaltable frame="all" rowsep="1" colsep="1">
+    <tgroup cols="2">
+      <colspec align="center" /><colspec align="center" />
+      <thead>
+        <row>
+          <entry>header</entry>
+          <entry>header</entry>
+        </row>
+      </thead>
+      <tbody>
+        <row>
+          <entry>cell</entry>
+          <entry>cell</entry>
+        </row>
+      </tbody>
+    </tgroup>
+  </informaltable>
+
+  <informaltable frame="all">
+    <tgroup cols="5" align="left" colsep="1" rowsep="1">
+      <colspec colname="c1"/>
+      <colspec colname="c2"/>
+      <colspec colname="c3"/>
+      <colspec colnum="5" colname="c5"/>
+      <thead>
+        <row>
+          <entry namest="c1" nameend="c2" align="center">Horizontal Span</entry>
+          <entry>a3</entry><entry>a4</entry><entry>a5</entry>
+        </row>
+      </thead>
+      <tfoot>
+        <row>
+          <entry>f1</entry><entry>f2</entry><entry>f3</entry><entry>f4</entry><entry>f5</entry>
+        </row>
+      </tfoot>
+      <tbody>
+        <row>
+          <entry>b1</entry><entry>b2</entry><entry>b3</entry><entry>b4</entry>
+          <entry morerows="1" valign="middle"><para>  <!-- Pernicous Mixed Content -->
+          Vertical Span</para></entry>
+        </row>
+        <row>
+          <entry>c1</entry>
+          <entry namest="c2" nameend="c3" align="center" morerows="1" valign="bottom">Span Both</entry>
+          <entry>c4</entry>
+        </row>
+        <row>
+          <entry>d1</entry><entry>d4</entry><entry>d5</entry>
+        </row>
+      </tbody>
+    </tgroup>
+  </informaltable>
+
+  <informaltable frame="all">
+    <tgroup cols="5" align="left" colsep="1" rowsep="1">
+      <colspec colname="c1"/>
+      <colspec colname="c2"/>
+      <colspec colname="c3"/>
+      <colspec colname="c4"/>
+      <colspec colname="c5"/>
+      <spanspec spanname="span" namest="c2" nameend="c4"/>
+      <tbody>
+        <row>
+          <entry>a1</entry><entry align="center" spanname="span">a2</entry><entry>a5</entry>
+        </row>
+        <row>
+          <entry>b1</entry><entry>b2</entry><entry>b3</entry><entry>b4</entry><entry>b5</entry>
+        </row>
+        <row>
+          <entry>c1</entry><entry spanname="span">c2</entry><entry>c5</entry>
+        </row>
+      </tbody>
+    </tgroup>
+  </informaltable>
+
+  <informaltable frame="all">
+    <tgroup cols="3">
+      <tbody>
+        <row>
+          <entry>a1</entry><entry>b1</entry><entry>c1</entry>
+        </row>
+        <row>
+          <entry>a2</entry>
+          <entrytbl cols="3">
+            <tbody>
+              <row>
+                <entry>b2a1</entry><entry>b2b1</entry><entry>b2c1</entry>
+              </row>
+              <row>
+                <entry>b2a2</entry><entry>b2b2</entry><entry>b2c2</entry>
+              </row>
+              <row>
+                <entry>b2a3</entry><entry>b2b3</entry><entry>b2c3</entry>
+              </row>
+            </tbody>
+          </entrytbl>
+          <entry>c2</entry>
+        </row>
+        <row>
+          <entry>a3</entry><entry>b3</entry><entry>c3</entry>
+        </row>
+      </tbody>
+    </tgroup>
+  </informaltable>
+
+  <para>
+    <anchor id="Anchor" />Anchor<!-- anchor_end -->.
+    Link to <link linkend="Anchor">Anchor</link>.
+    Link to <ulink url="http://www.pixware.fr">http://www.pixware.fr</ulink>.
+    Link to <link linkend="Anchor">showing alternate text</link>.
+    Link to <ulink url="http://www.pixware.fr">Pixware home page</ulink>.
+  </para>
+
+  <note>
+    <title>Upcoming Changes</title>
+    <para>Future versions of this feature may not be backward-compatible.</para>
+  </note>
+          </section>
+        </section>
+      </section>
+    </section>
+  </section>
+
+  <bibliography>
+    <title>A Test Bibliography</title>
+    <bibliodiv><title>Books</title>
+      <bibliomixed>
+        <bibliomset relation="journal">
+          <title>The World Wide Web Journal</title>
+          <volumenum>2</volumenum><issuenum>1</issuenum>.
+          <publishername>O'Reilly &amp; Associates, Inc.</publishername> and
+          <pubdate>Winter, 1996</pubdate></bibliomset>.
+      </bibliomixed>
+    </bibliodiv>
+  </bibliography>
+
+  <appendix>
+    <title>Demonstration Appendix</title>
+    <para>This appendix demonstrates an appendix.</para>
+  </appendix>
+
+</article>
\ No newline at end of file
diff --git a/doxia-site-renderer/src/test/resources/site/fml/faq.fml b/doxia-site-renderer/src/test/resources/site/fml/faq.fml
index 0fa4ede..10c68e9 100644
--- a/doxia-site-renderer/src/test/resources/site/fml/faq.fml
+++ b/doxia-site-renderer/src/test/resources/site/fml/faq.fml
@@ -18,9 +18,9 @@
 under the License.
 -->
 
-<faqs xmlns="http://maven.apache.org/FML/1.0"
+<faqs xmlns="http://maven.apache.org/FML/1.0.1"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/FML/1.0 file:../../../../../../../doxia/doxia-modules/doxia-module-fml/src/main/resources/fml-1.0.xsd"
+  xsi:schemaLocation="http://maven.apache.org/FML/1.0.1 file:../../../../../../../doxia/doxia-modules/doxia-module-fml/src/main/resources/fml-1.0.1.xsd"
   title="Oft Asked Questions">
 
   <part id="contributing">
diff --git a/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml b/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml
index 51ce2d9..c514905 100644
--- a/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml
+++ b/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml
@@ -27,6 +27,8 @@
 <!ENTITY Beta     "&#914;"> <!-- greek capital letter beta, U+0392 -->
 <!ENTITY Gamma    "&#915;"> <!-- greek capital letter gamma, U+0393 ISOgrk3 -->
 <!ENTITY tritPos  "&#x1d7ed;"> <!-- MATHEMATICAL SANS-SERIF BOLD DIGIT ONE -->
+<!ENTITY flo "&#x159;">
+<!ENTITY myCustomEntity "&flo;">
 ]>
 <document xmlns="http://maven.apache.org/XDOC/2.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -53,7 +55,7 @@
       <p>'&amp;' '&lt;' '&gt;' '&quot;' '&apos;'</p>
 
       <h3>Local Entities: '&Alpha;' '&Beta;' '&Gamma;' '&tritPos;'</h3>
-      <p>'&Alpha;' '&Beta;' '&Gamma;' '&tritPos;'</p>
+      <p>'&Alpha;' '&Beta;' '&Gamma;' '&tritPos;&#x1d7ed;' '&flo;&#x159;' '&myCustomEntity;'</p>
 
       <h3>DTD Entities: '&nbsp;' '&iexcl;' '&cent;'</h3>
       <p>'&nbsp;' '&iexcl;' '&cent;'</p>
diff --git a/doxia-site-renderer/src/test/resources/site/xdoc/javascript.xml b/doxia-site-renderer/src/test/resources/site/xdoc/javascript.xml
index 3fa84d1..16114a4 100644
--- a/doxia-site-renderer/src/test/resources/site/xdoc/javascript.xml
+++ b/doxia-site-renderer/src/test/resources/site/xdoc/javascript.xml
@@ -33,7 +33,9 @@
       <p>You should see a JavaScript alert...</p>
 
       <script type="text/javascript">
-        <![CDATA[alert("Hello!");]]>
+        //<![CDATA[
+        alert("Hello!");
+        //]]>
       </script>
 
     </section>
diff --git a/pom.xml b/pom.xml
index a7d37b8..8bc4fe5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,7 +25,7 @@
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven-parent</artifactId>
-    <version>11</version>
+    <version>12</version>
     <relativePath>../../pom/maven/pom.xml</relativePath>
   </parent>
 
@@ -186,7 +186,7 @@
       <dependency>
         <groupId>org.codehaus.plexus</groupId>
         <artifactId>plexus-utils</artifactId>
-        <version>1.5.7</version>
+        <version>1.5.15</version>
       </dependency>
     </dependencies>
   </dependencyManagement>
@@ -215,6 +215,11 @@
       <plugins>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-assembly-plugin</artifactId>
+          <version>2.2-beta-4</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-release-plugin</artifactId>
           <configuration>
             <tagBase>https://svn.apache.org/repos/asf/maven/doxia/doxia-sitetools/tags</tagBase>
@@ -229,10 +234,51 @@
         <plugin>
           <groupId>org.codehaus.modello</groupId>
           <artifactId>modello-maven-plugin</artifactId>
-          <version>1.0.1</version>
+          <version>1.0.2</version>
+        </plugin>
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>clirr-maven-plugin</artifactId>
+          <version>2.2.2</version>
+          <configuration>
+            <comparisonVersion>1.1</comparisonVersion>
+          </configuration>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-javadoc-plugin</artifactId>
+          <configuration>
+            <source>1.4</source>
+            <links>
+              <link>http://java.sun.com/j2se/1.4.2/docs/api/</link>
+              <link>http://plexus.codehaus.org/plexus-utils/apidocs/</link>
+              <link>http://junit.sourceforge.net/javadoc/</link>
+            </links>
+            <tagletArtifacts>
+              <tagletArtifact>
+                <groupId>org.codehaus.plexus</groupId>
+                <artifactId>plexus-javadoc</artifactId>
+                <version>1.0</version>
+              </tagletArtifact>
+            </tagletArtifacts>
+          </configuration>
         </plugin>
       </plugins>
     </pluginManagement>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>clirr-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>verify</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
   </build>
 
   <reporting>
@@ -246,6 +292,31 @@
 
   <profiles>
     <profile>
+      <id>apache-release</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-assembly-plugin</artifactId>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>single</goal>
+                </goals>
+                <phase>package</phase>
+                <configuration>
+                  <descriptors>
+                   <descriptor>src/assembly/source-release.xml</descriptor>
+                  </descriptors>
+                  <tarLongFileMode>gnu</tarLongFileMode>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
       <id>reporting</id>
       <reporting>
         <plugins>
@@ -274,6 +345,10 @@
               <configLocation>http://svn.apache.org/repos/asf/maven/doxia/doxia/trunk/src/main/resources/config/doxia_checkstyle.xml</configLocation>
             </configuration>
           </plugin>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>clirr-maven-plugin</artifactId>
+          </plugin>
         </plugins>
       </reporting>
     </profile>
diff --git a/src/assembly/source-release.xml b/src/assembly/source-release.xml
new file mode 100644
index 0000000..5c70b93
--- /dev/null
+++ b/src/assembly/source-release.xml
@@ -0,0 +1,62 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<assembly xmlns="http://maven.apache.org/xsd/assembly-1.1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/xsd/assembly-1.1.1 http://maven.apache.org/xsd/assembly-1.1.1.xsd">
+  <id>source-release</id>
+  <formats>
+    <format>tar.gz</format>
+    <format>tar.bz2</format>
+    <format>zip</format>
+  </formats>
+  <fileSets>
+    <fileSet>
+      <directory>.</directory>
+      <outputDirectory>/</outputDirectory>
+      <useDefaultExcludes>true</useDefaultExcludes>
+      <excludes>
+        <!-- IDE -->
+        <exclude>**/*.iws</exclude>
+        <exclude>**/*.ipr</exclude>
+        <exclude>**/*.iml</exclude>
+        <exclude>**/.project</exclude>
+        <exclude>**/.classpath</exclude>
+        <exclude>**/.settings/**</exclude>
+        <exclude>**/.externalToolBuilders/**</exclude>
+        <exclude>**/maven-eclipse.xml</exclude>
+        <exclude>**/.deployables/**</exclude>
+        <exclude>**/.wtpmodules/**</exclude>
+        <!-- maven -->
+        <exclude>**/target/**</exclude>
+        <exclude>**/pom.xml.releaseBackup</exclude>
+        <exclude>**/release.properties</exclude>
+        <!-- misc -->
+        <exclude>**/*.patch</exclude>
+        <exclude>**/*.diff</exclude>
+        <exclude>**/*.bak</exclude>
+        <exclude>**/*.log</exclude>
+      </excludes>
+    </fileSet>
+    <fileSet>
+      <directory>target/maven-shared-archive-resources/META-INF</directory>
+      <outputDirectory>/</outputDirectory>
+    </fileSet>
+  </fileSets>
+</assembly>
diff --git a/src/site/site.xml b/src/site/site.xml
index 4a114c0..91dbeb9 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -50,6 +50,10 @@
       </script>
     </head>
 
+    <menu name="Downloads" inherit="bottom">
+      <item name="Download ${project.name}" href="http://maven.apache.org/doxia/downloads.html"/>
+    </menu>
+
     <menu ref="modules"/>
 
     <menu ref="reports"/>