diff --git a/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java b/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
index 9b63b9d..bfc149c 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
@@ -507,6 +507,7 @@
         PmdReportGenerator doxiaRenderer = new PmdReportGenerator( getLog(), sink, getBundle( locale ), aggregate );
         doxiaRenderer.setFiles( filesToProcess );
         doxiaRenderer.setViolations( renderer.getViolations() );
+        doxiaRenderer.setProcessingErrors( renderer.getErrors() );
 
         try
         {
diff --git a/src/main/java/org/apache/maven/plugins/pmd/PmdReportGenerator.java b/src/main/java/org/apache/maven/plugins/pmd/PmdReportGenerator.java
index 54fa04f..152064a 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/PmdReportGenerator.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/PmdReportGenerator.java
@@ -29,13 +29,15 @@
 import java.util.List;
 import java.util.Map;
 import java.util.ResourceBundle;
-
-import net.sourceforge.pmd.RuleViolation;
+import java.util.Set;
 
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.plugin.logging.Log;
 import org.codehaus.plexus.util.StringUtils;
 
+import net.sourceforge.pmd.Report.ProcessingError;
+import net.sourceforge.pmd.RuleViolation;
+
 /**
  * Render the PMD violations into Doxia events.
  *
@@ -52,7 +54,9 @@
 
     private ResourceBundle bundle;
 
-    private HashSet<RuleViolation> violations = new HashSet<>();
+    private Set<RuleViolation> violations = new HashSet<>();
+
+    private List<ProcessingError> processingErrors = new ArrayList<>();
 
     private boolean aggregate;
 
@@ -86,6 +90,16 @@
         return new ArrayList<>( violations );
     }
 
+    public void setProcessingErrors( Collection<ProcessingError> errors )
+    {
+        this.processingErrors = new ArrayList<>( errors );
+    }
+
+    public List<ProcessingError> getProcessingErrors()
+    {
+        return processingErrors;
+    }
+
     // public List<Metric> getMetrics()
     // {
     // return metrics;
@@ -96,26 +110,46 @@
     // this.metrics = metrics;
     // }
 
+    private String shortenFilename( String filename, PmdFileInfo fileInfo )
+    {
+        String result = filename;
+        if ( fileInfo != null && fileInfo.getSourceDirectory() != null )
+        {
+            result =
+                StringUtils.substring( result, fileInfo.getSourceDirectory().getAbsolutePath().length() + 1 );
+        }
+        result = StringUtils.replace( result, "\\", "/" );
+
+        if ( aggregate && fileInfo != null && fileInfo.getProject() != null )
+        {
+            result = fileInfo.getProject().getName() + " - " + result;
+        }
+
+        return result;
+    }
+
+    private PmdFileInfo determineFileInfo( String filename ) throws IOException
+    {
+        File canonicalFilename = new File( filename ).getCanonicalFile();
+        PmdFileInfo fileInfo = files.get( canonicalFilename );
+        if ( fileInfo == null )
+        {
+            log.warn( "Couldn't determine PmdFileInfo for file " + filename + " (canonical: " + canonicalFilename
+                + "). XRef links won't be available." );
+        }
+
+        return fileInfo;
+    }
+
     private void startFileSection( String currentFilename, PmdFileInfo fileInfo )
     {
         sink.section2();
         sink.sectionTitle2();
 
         // prepare the filename
-        this.currentFilename = currentFilename;
-        if ( fileInfo != null && fileInfo.getSourceDirectory() != null )
-        {
-            this.currentFilename =
-                StringUtils.substring( currentFilename, fileInfo.getSourceDirectory().getAbsolutePath().length() + 1 );
-        }
-        this.currentFilename = StringUtils.replace( this.currentFilename, "\\", "/" );
+        this.currentFilename = shortenFilename( currentFilename, fileInfo );
 
-        String title = this.currentFilename;
-        if ( aggregate && fileInfo != null && fileInfo.getProject() != null )
-        {
-            title = fileInfo.getProject().getName() + " - " + this.currentFilename;
-        }
-        sink.text( title );
+        sink.text( this.currentFilename );
         sink.sectionTitle2_();
 
         sink.table();
@@ -162,8 +196,15 @@
     private void processViolations()
         throws IOException
     {
+        sink.section1();
+        sink.sectionTitle1();
+        sink.text( bundle.getString( "report.pmd.files" ) );
+        sink.sectionTitle1_();
+
+        // TODO files summary
+
         fileCount = files.size();
-        ArrayList<RuleViolation> violations2 = new ArrayList<>( violations );
+        List<RuleViolation> violations2 = new ArrayList<>( violations );
         Collections.sort( violations2, new Comparator<RuleViolation>()
         {
             /** {@inheritDoc} */
@@ -186,13 +227,7 @@
         for ( RuleViolation ruleViolation : violations2 )
         {
             String currentFn = ruleViolation.getFilename();
-            File canonicalFilename = new File( currentFn ).getCanonicalFile();
-            PmdFileInfo fileInfo = files.get( canonicalFilename );
-            if ( fileInfo == null )
-            {
-                log.warn( "Couldn't determine PmdFileInfo for file " + currentFn + " (canonical: " + canonicalFilename
-                    + "). XRef links won't be available." );
-            }
+            PmdFileInfo fileInfo = determineFileInfo( currentFn );
 
             if ( !currentFn.equalsIgnoreCase( previousFilename ) && fileSectionStarted )
             {
@@ -214,6 +249,15 @@
         {
             endFileSection();
         }
+
+        if ( fileCount == 0 )
+        {
+            sink.paragraph();
+            sink.text( bundle.getString( "report.pmd.noProblems" ) );
+            sink.paragraph_();
+        }
+
+        sink.section1_();
     }
 
     private void outputLineLink( int line, PmdFileInfo fileInfo )
@@ -235,6 +279,63 @@
         }
     }
 
+    private void processProcessingErrors() throws IOException
+    {
+        // sort the problem by filename first, since PMD is executed multi-threaded
+        // and might reports the results unsorted
+        Collections.sort( processingErrors, new Comparator<ProcessingError>()
+        {
+            @Override
+            public int compare( ProcessingError e1, ProcessingError e2 )
+            {
+                return e1.getFile().compareTo( e2.getFile() );
+            }
+        } );
+
+        sink.section1();
+        sink.sectionTitle1();
+        sink.text( bundle.getString( "report.pmd.processingErrors.title" ) );
+        sink.sectionTitle1_();
+
+        sink.table();
+        sink.tableRow();
+        sink.tableHeaderCell();
+        sink.text( bundle.getString( "report.pmd.processingErrors.column.filename" ) );
+        sink.tableHeaderCell_();
+        sink.tableHeaderCell();
+        sink.text( bundle.getString( "report.pmd.processingErrors.column.problem" ) );
+        sink.tableHeaderCell_();
+        sink.tableRow_();
+
+        for ( ProcessingError error : processingErrors )
+        {
+            processSingleProcessingError( error );
+        }
+
+        sink.table_();
+
+        sink.section1_();
+    }
+
+    private void processSingleProcessingError( ProcessingError error ) throws IOException
+    {
+        String filename = error.getFile();
+        PmdFileInfo fileInfo = determineFileInfo( filename );
+        filename = shortenFilename( filename, fileInfo );
+
+        sink.tableRow();
+        sink.tableCell();
+        sink.text( filename );
+        sink.tableCell_();
+        sink.tableCell();
+        sink.text( error.getMsg() );
+        sink.verbatim( null );
+        sink.rawText( error.getDetail() );
+        sink.verbatim_();
+        sink.tableCell_();
+        sink.tableRow_();
+    }
+
     public void beginDocument()
     {
         sink.head();
@@ -261,13 +362,6 @@
         sink.section1_();
 
         // TODO overall summary
-
-        sink.section1();
-        sink.sectionTitle1();
-        sink.text( bundle.getString( "report.pmd.files" ) );
-        sink.sectionTitle1_();
-
-        // TODO files summary
     }
 
     /*
@@ -288,20 +382,16 @@
         throws IOException
     {
         processViolations();
+
+        if ( !processingErrors.isEmpty() )
+        {
+            processProcessingErrors();
+        }
     }
 
     public void endDocument()
         throws IOException
     {
-        if ( fileCount == 0 )
-        {
-            sink.paragraph();
-            sink.text( bundle.getString( "report.pmd.noProblems" ) );
-            sink.paragraph_();
-        }
-
-        sink.section1_();
-
         // The Metrics report useless with the current PMD metrics impl.
         // For instance, run the coupling ruleset and you will get a boatload
         // of excessive imports metrics, none of which is really any use.
diff --git a/src/main/resources/pmd-report.properties b/src/main/resources/pmd-report.properties
index 798c806..031ceef 100644
--- a/src/main/resources/pmd-report.properties
+++ b/src/main/resources/pmd-report.properties
@@ -23,3 +23,6 @@
 report.pmd.pmdlink=The following document contains the results of
 report.pmd.files=Files
 report.pmd.noProblems=PMD found no problems in your source code.
+report.pmd.processingErrors.title=Processing Errors
+report.pmd.processingErrors.column.filename=Filename
+report.pmd.processingErrors.column.problem=Problem
diff --git a/src/main/resources/pmd-report_de.properties b/src/main/resources/pmd-report_de.properties
index 71bb460..36a7cd7 100644
--- a/src/main/resources/pmd-report_de.properties
+++ b/src/main/resources/pmd-report_de.properties
@@ -23,3 +23,6 @@
 report.pmd.pmdlink=Dieses Dokument enth\u00e4lt die Ergebnisse von
 report.pmd.files=Dateien
 report.pmd.noProblems=PMD hat keine Probleme in dem Quellcode gefunden.
+report.pmd.processingErrors.title=Verarbeitungsprobleme
+report.pmd.processingErrors.column.filename=Datei
+report.pmd.processingErrors.column.problem=Problem
diff --git a/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java b/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java
index ee3bd1e..614c58f 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java
@@ -81,7 +81,7 @@
         assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
 
         // check if there's a link to the JXR files
-        String str = readFile( new File( getBasedir(), "target/test/unit/default-configuration/target/site/pmd.html" ) );
+        String str = readFile( generatedFile );
 
         assertTrue( str.contains( "/xref/def/configuration/App.html#L31" ) );
 
@@ -202,7 +202,7 @@
         assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
 
         // check if there's a link to the JXR files
-        String str = readFile( new File( getBasedir(), "target/test/unit/default-configuration/target/site/pmd.html" ) );
+        String str = readFile( generatedFile );
 
         assertTrue( str.contains( "/xref/def/configuration/App.html#L31" ) );
 
@@ -244,11 +244,10 @@
 
         generatedFile = new File( getBasedir(), "target/test/unit/custom-configuration/target/site/pmd.html" );
         renderer( mojo, generatedFile );
-        renderer( mojo, generatedFile );
         assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
 
         // check if custom ruleset was applied
-        String str = readFile( new File( getBasedir(), "target/test/unit/custom-configuration/target/site/pmd.html" ) );
+        String str = readFile( generatedFile );
         assertTrue( lowerCaseContains( str, "Avoid using if statements without curly braces" ) );
 
         // Must be false as IfElseStmtsMustUseBraces is excluded!
@@ -309,7 +308,7 @@
         // verify the generated files do exist, even if there are no violations
         File generatedFile = new File( getBasedir(), "target/test/unit/empty-report/target/site/pmd.html" );
         assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-        String str = readFile( new File( getBasedir(), "target/test/unit/empty-report/target/site/pmd.html" ) );
+        String str = readFile( generatedFile );
         assertFalse( lowerCaseContains( str, "Hello.java" ) );
     }
 
@@ -368,6 +367,7 @@
             {
                 str.append( ' ' );
                 str.append( line );
+                str.append( '\n' );
             }
             return str.toString();
         }
@@ -411,7 +411,7 @@
         File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd.xml" );
         assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
 
-        String str = readFile( new File( getBasedir(), "target/test/unit/default-configuration/target/pmd.xml" ) );
+        String str = readFile( generatedFile );
 
         // check that there is no violation reported for "unusedVar2" - as it is suppressed
         assertFalse( str.contains( "Avoid unused private fields such as 'unusedVar2'." ) );
@@ -487,9 +487,16 @@
 
             File generatedFile = new File( getBasedir(), "target/test/unit/parse-error/target/pmd.xml" );
             assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-            String str = readFile( new File( getBasedir(), "target/test/unit/parse-error/target/pmd.xml" ) );
-
+            String str = readFile( generatedFile );
             assertTrue( str.contains( "Error while parsing" ) );
+            // The parse exception must be in the XML report
+            assertTrue( str.contains( "ParseException: Encountered \"\" at line 23, column 5." ) );
+
+            generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/site/pmd.html" );
+            renderer( mojo, generatedFile );
+            assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+            str = readFile( generatedFile );
+            // The parse exception must also be in the HTML report
             assertTrue( str.contains( "ParseException: Encountered \"\" at line 23, column 5." ) );
 
         } finally {
