Index: pom.xml
===================================================================
--- pom.xml	(revision 804906)
+++ pom.xml	(working copy)
@@ -28,7 +28,7 @@
 
   <groupId>org.apache.maven.reporting</groupId>
   <artifactId>maven-reporting-impl</artifactId>
-  <version>2.0.4.2</version>
+  <version>2.0.4.3-SNAPSHOT</version>
 
   <name>Maven Reporting Implementation</name>
   <description>Abstract classes to manage report generation.</description>
@@ -62,17 +62,15 @@
   </properties>
 
   <dependencies>
+    <!-- maven -->
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-project</artifactId>
       <version>${mavenVersion}</version>
     </dependency>
+
+    <!-- doxia -->
     <dependency>
-      <groupId>commons-validator</groupId>
-      <artifactId>commons-validator</artifactId>
-      <version>1.2.0</version>
-    </dependency>
-    <dependency>
       <groupId>org.apache.maven.doxia</groupId>
       <artifactId>doxia-core</artifactId>
       <version>${doxiaVersion}</version>
@@ -92,7 +90,21 @@
       <artifactId>doxia-site-renderer</artifactId>
       <version>${doxiaVersion}</version>
     </dependency>
+
+    <!-- misc -->
     <dependency>
+      <groupId>commons-validator</groupId>
+      <artifactId>commons-validator</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-doxia-tools</artifactId>
+      <version>1.0.2</version>
+    </dependency>
+
+    <!-- test -->
+    <dependency>
       <groupId>junit-addons</groupId>
       <artifactId>junit-addons</artifactId>
       <version>1.4</version>
Index: src/main/java/org/apache/maven/reporting/AbstractMavenReport.java
===================================================================
--- src/main/java/org/apache/maven/reporting/AbstractMavenReport.java	(revision 804906)
+++ src/main/java/org/apache/maven/reporting/AbstractMavenReport.java	(working copy)
@@ -19,16 +19,30 @@
  * under the License.
  */
 
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
 import org.apache.maven.doxia.sink.Sink;
+import org.apache.maven.doxia.site.decoration.DecorationModel;
 import org.apache.maven.doxia.siterenderer.Renderer;
+import org.apache.maven.doxia.siterenderer.RendererException;
+import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
 import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
+import org.apache.maven.doxia.tools.SiteTool;
+import org.apache.maven.doxia.tools.SiteToolException;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.reporting.sink.SinkFactory;
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.Locale;
+import java.util.Map;
 
 /**
  * The basis for a Maven report.
@@ -50,36 +64,103 @@
 
     protected abstract MavenProject getProject();
 
-    private File reportOutputDirectory;
+    /**
+     * @return the site tool
+     * @since 2.0.4.3
+     */
+    protected abstract SiteTool getSiteTool();
 
     /**
-     * @see org.apache.maven.plugin.Mojo#execute()
+     * @return the local repository
+     * @since 2.0.4.3
      */
+    protected abstract ArtifactRepository getLocalRepository();
+
+    private File reportOutputDirectory;
+
+    /** {@inheritDoc} */
     public void execute()
         throws MojoExecutionException
     {
+        locale = Locale.getDefault();
+
+        if ( !canGenerateReport() )
+        {
+            if ( getLog().isInfoEnabled() )
+            {
+                getLog().info( "Skipped \"" + getName( locale ) + "\" report." );
+            }
+            return;
+        }
+        if ( isExternalReport() )
+        {
+            if ( getLog().isInfoEnabled() )
+            {
+                getLog().info( "Skipped external \"" + getName( locale ) + "\" report." );
+            }
+            return;
+        }
+
         try
         {
-            String outputDirectory = getOutputDirectory();
+            DecorationModel decorationModel =
+                getSiteTool().getDecorationModel( getProject(), Collections.singletonList( getProject() ),
+                                                  getLocalRepository(),
+                                                  getProject().getRemoteArtifactRepositories(),
+                                                  getProject().getBasedir() + "/src/site", locale, "UTF-8",
+                                                  "UTF-8" );
 
-            SiteRendererSink sink =
-                SinkFactory.createSink( new File( outputDirectory ), getOutputName() + ".html" );
+            Map attributes = new HashMap();
+            attributes.put( "outputEncoding", "UTF-8" );
+            attributes.put( "project", getProject() );
 
-            generate( sink, Locale.getDefault() );
+            Artifact defaultSkin =
+                getSiteTool().getDefaultSkinArtifact( getLocalRepository(),
+                                                      getProject().getRemoteArtifactRepositories() );
+            SiteRenderingContext siteContext =
+                getSiteRenderer().createContextForSkin( defaultSkin.getFile(), attributes, decorationModel,
+                                                        getName( locale ), locale );
 
-            // TODO: add back when skinning support is in the site renderer
-//            getSiteRenderer().copyResources( outputDirectory, "maven" );
+            File output = new File( getOutputDirectory() );
+            output.mkdirs();
+
+            RenderingContext context = new RenderingContext( output, getOutputName() + ".html" );
+
+            SiteRendererSink sink = new SiteRendererSink( context );
+            generate( sink, locale );
+
+            Writer writer =
+                new OutputStreamWriter( new FileOutputStream( new File( output, getOutputName() + ".html" ) ),
+                                        "UTF-8" );
+
+            getSiteRenderer().generateDocument( writer, sink, siteContext );
+
+            getSiteRenderer().copyResources( siteContext, new File( getProject().getBasedir(), "src/site/resources" ),
+                                             output );
         }
+        catch ( RendererException e )
+        {
+            throw new MojoExecutionException( "An error has occurred in " + getName( Locale.ENGLISH )
+                + " report generation.", e );
+        }
+        catch ( IOException e )
+        {
+            throw new MojoExecutionException( "An error has occurred in " + getName( Locale.ENGLISH )
+                + " report generation.", e );
+        }
+        catch ( SiteToolException e )
+        {
+            throw new MojoExecutionException( "An error has occurred in " + getName( Locale.ENGLISH )
+                + " report generation.", e );
+        }
         catch ( MavenReportException e )
         {
-            throw new MojoExecutionException( "An error has occurred in " + getName( locale ) + " report generation.",
-                                              e );
+            throw new MojoExecutionException( "An error has occurred in " + getName( Locale.ENGLISH )
+                + " report generation.", e );
         }
     }
 
-    /**
-     * @see org.apache.maven.reporting.MavenReport#generate(org.codehaus.doxia.sink.Sink, java.util.Locale)
-     */
+    /** {@inheritDoc} */
     public void generate( org.codehaus.doxia.sink.Sink sink, Locale locale )
         throws MavenReportException
     {
@@ -100,13 +181,16 @@
 
     protected void closeReport()
     {
+        getSink().close();
     }
 
+    /** {@inheritDoc} */
     public String getCategoryName()
     {
         return CATEGORY_PROJECT_REPORTS;
     }
 
+    /** {@inheritDoc} */
     public File getReportOutputDirectory()
     {
         if ( reportOutputDirectory == null )
@@ -116,6 +200,7 @@
         return reportOutputDirectory;
     }
 
+    /** {@inheritDoc} */
     public void setReportOutputDirectory( File reportOutputDirectory )
     {
         this.reportOutputDirectory = reportOutputDirectory;
@@ -126,11 +211,13 @@
         return sink;
     }
 
+    /** {@inheritDoc} */
     public boolean isExternalReport()
     {
         return false;
     }
 
+    /** {@inheritDoc} */
     public boolean canGenerateReport()
     {
         return true;

