diff --git a/src/main/java/org/apache/maven/reporting/exec/DefaultMavenReportExecutor.java b/src/main/java/org/apache/maven/reporting/exec/DefaultMavenReportExecutor.java
index 378392a..f923791 100644
--- a/src/main/java/org/apache/maven/reporting/exec/DefaultMavenReportExecutor.java
+++ b/src/main/java/org/apache/maven/reporting/exec/DefaultMavenReportExecutor.java
@@ -23,10 +23,7 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
 
 import org.apache.maven.artifact.repository.RepositoryRequest;
@@ -184,7 +181,7 @@
         PluginDescriptor pluginDescriptor =
             mavenPluginManagerHelper.getPluginDescriptor( plugin, remoteRepositories, session );
 
-        Map<String, PlexusConfiguration> goalsWithConfiguration = new LinkedHashMap<String, PlexusConfiguration>();
+        List<GoalWithConf> goalsWithConfiguration = new ArrayList<GoalWithConf>();
 
         if ( reportPlugin.getReportSets().isEmpty() && reportPlugin.getReports().isEmpty() )
         {
@@ -192,7 +189,8 @@
             List<MojoDescriptor> mojoDescriptors = pluginDescriptor.getMojos();
             for ( MojoDescriptor mojoDescriptor : mojoDescriptors )
             {
-                goalsWithConfiguration.put( mojoDescriptor.getGoal(), mojoDescriptor.getConfiguration() );
+                goalsWithConfiguration.add( new GoalWithConf( mojoDescriptor.getGoal(),
+                                                              mojoDescriptor.getConfiguration() ) );
             }
         }
         else
@@ -201,29 +199,31 @@
             {
                 for ( String report : reportSet.getReports() )
                 {
-                    goalsWithConfiguration.put( report, reportSet.getConfiguration() );
+                    goalsWithConfiguration.add( new GoalWithConf( report, reportSet.getConfiguration() ) );
                 }
             }
 
             for ( String report : reportPlugin.getReports() )
             {
-                goalsWithConfiguration.put( report, reportPlugin.getConfiguration() );
+                goalsWithConfiguration.add( new GoalWithConf( report, reportPlugin.getConfiguration() ) );
             }
         }
 
         List<MavenReportExecution> reports = new ArrayList<MavenReportExecution>();
-        for ( Entry<String, PlexusConfiguration> entry : goalsWithConfiguration.entrySet() )
+        for ( GoalWithConf report : goalsWithConfiguration )
         {
-            MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( entry.getKey() );
+            MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( report.getGoal() );
             if ( mojoDescriptor == null )
             {
-                throw new MojoNotFoundException( entry.getKey(), pluginDescriptor );
+                throw new MojoNotFoundException( report.getGoal(), pluginDescriptor );
             }
 
-            MojoExecution mojoExecution = new MojoExecution( plugin, entry.getKey(), "report:" + entry.getKey() );
+            MojoExecution mojoExecution = new MojoExecution( plugin, report.getGoal(), "report:" + report.getGoal() );
 
-            mojoExecution.setConfiguration( mergeConfiguration( mojoDescriptor.getMojoConfiguration(), reportPlugin.getConfiguration(),
-                                                   entry.getValue(), mojoDescriptor.getParameterMap().keySet() ) );
+            mojoExecution.setConfiguration( mergeConfiguration( mojoDescriptor.getMojoConfiguration(),
+                                                                reportPlugin.getConfiguration(),
+                                                                report.getConfiguration(),
+                                                                mojoDescriptor.getParameterMap().keySet() ) );
 
             mojoExecution.setMojoDescriptor( mojoDescriptor );
 
@@ -578,5 +578,27 @@
                 buildPlugin.getDependencies().addAll( configuredPlugin.getDependencies() );
             }
         }
-    }   
+    }
+
+    private static class GoalWithConf
+    {
+        private final String goal;
+        private final PlexusConfiguration configuration;
+
+        public GoalWithConf( String goal, PlexusConfiguration configuration )
+        {
+            this.goal = goal;
+            this.configuration = configuration;
+        }
+
+        public String getGoal()
+        {
+            return goal;
+        }
+
+        public PlexusConfiguration getConfiguration()
+        {
+            return configuration;
+        }
+    }
 }
diff --git a/src/test/java/org/apache/maven/reporting/exec/TestDefaultMavenReportExecutor.java b/src/test/java/org/apache/maven/reporting/exec/TestDefaultMavenReportExecutor.java
index 5f66e3d..a6c37bf 100644
--- a/src/test/java/org/apache/maven/reporting/exec/TestDefaultMavenReportExecutor.java
+++ b/src/test/java/org/apache/maven/reporting/exec/TestDefaultMavenReportExecutor.java
@@ -75,6 +75,39 @@
     public void testSimpleBuildReports()
         throws Exception
     {
+        ReportSet reportSet = new ReportSet();
+        reportSet.getReports().add( "test-javadoc" );
+        reportSet.getReports().add( "javadoc" );
+
+        List<MavenReportExecution> mavenReportExecutions = buildReports( reportSet );
+
+        assertNotNull( mavenReportExecutions );
+        assertEquals( 2, mavenReportExecutions.size() );
+        assertEquals( "testapidocs/index", mavenReportExecutions.get( 0 ).getMavenReport().getOutputName() );
+        assertEquals( "apidocs/index", mavenReportExecutions.get( 1 ).getMavenReport().getOutputName() );
+    }
+
+    public void testMultipleReportSets()
+        throws Exception
+    {
+        ReportSet reportSet = new ReportSet();
+        reportSet.getReports().add( "javadoc" );
+        ReportSet reportSet2 = new ReportSet();
+        reportSet2.getReports().add( "test-javadoc" );
+        reportSet2.getReports().add( "javadoc" );
+
+        List<MavenReportExecution> mavenReportExecutions = buildReports( reportSet, reportSet2 );
+
+        assertNotNull( mavenReportExecutions );
+        assertEquals( 3, mavenReportExecutions.size() );
+        assertEquals( "apidocs/index", mavenReportExecutions.get( 0 ).getMavenReport().getOutputName() );
+        assertEquals( "testapidocs/index", mavenReportExecutions.get( 1 ).getMavenReport().getOutputName() );
+        assertEquals( "apidocs/index", mavenReportExecutions.get( 2 ).getMavenReport().getOutputName() );
+    }
+
+    private List<MavenReportExecution> buildReports( ReportSet... javadocReportSets )
+        throws Exception
+    {
         ClassLoader orig = Thread.currentThread().getContextClassLoader();
         ClassRealm realm = getContainer().getContainerRealm();
 
@@ -99,10 +132,10 @@
             reportPlugin.setArtifactId( "maven-javadoc-plugin" );
             reportPlugin.setVersion( "2.7" );
 
-            ReportSet reportSet = new ReportSet();
-            reportSet.getReports().add( "test-javadoc" );
-            reportSet.getReports().add( "javadoc" );
-            reportPlugin.getReportSets().add( reportSet );
+            for ( ReportSet reportSet : javadocReportSets )
+            {
+                reportPlugin.getReportSets().add( reportSet );
+            }
 
             List<ReportPlugin> reportPlugins = Lists.newArrayList( reportPlugin );
 
@@ -110,13 +143,7 @@
 
             MavenReportExecutor mavenReportExecutor = lookup( MavenReportExecutor.class );
 
-            List<MavenReportExecution> mavenReportExecutions =
-                mavenReportExecutor.buildMavenReports( mavenReportExecutorRequest );
-
-            assertNotNull( mavenReportExecutions );
-            assertEquals( 2, mavenReportExecutions.size() );
-            assertEquals( "testapidocs/index", mavenReportExecutions.get( 0 ).getMavenReport().getOutputName() );
-            assertEquals( "apidocs/index", mavenReportExecutions.get( 1 ).getMavenReport().getOutputName() );
+            return mavenReportExecutor.buildMavenReports( mavenReportExecutorRequest );
         }
         finally
         {
