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"/>
