diff --git a/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java b/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
index 3f49cf6..7748418 100644
--- a/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
+++ b/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
@@ -48,6 +48,7 @@
 
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.siterenderer.Renderer;
+import org.apache.maven.model.Developer;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.reporting.AbstractMavenReport;
@@ -382,12 +383,26 @@
      */
     protected String displayFileRevDetailUrl;
 
+    /**
+     * List of developers to be shown on the report.
+     *
+     * @parameter expression="${project.developers}"
+     * @since 2.2
+     */
+    protected List developers;
+
     // temporary field holder while generating the report
     private String rptRepository, rptOneRepoParam, rptMultiRepoParam;
 
     // field for SCM Connection URL
     private String connection;
 
+    // field used to hold a map of the developers by Id
+    private HashMap developersById;
+
+    // field used to hold a map of the developers by Name
+    private HashMap developersByName;
+
     /**
      * The system properties to use (needed by the perforce scm provider).
      *
@@ -407,7 +422,9 @@
             return;
         }
 
-        intializeDefaultConfigurationParameters();
+        initializeDefaultConfigurationParameters();
+
+        initializeDeveloperMaps();
 
         verifySCMTypeParams();
 
@@ -435,7 +452,7 @@
      * Initializes any configuration parameters that have not/can not be defined
      * or defaulted by the Mojo API.
      */
-    private void intializeDefaultConfigurationParameters()
+    private void initializeDefaultConfigurationParameters()
     {
         if ( displayFileRevDetailUrl == null || displayFileRevDetailUrl.length() == 0 )
         {
@@ -444,6 +461,27 @@
     }
 
     /**
+     * Creates maps of the project developers by developer Id and developer Name
+     * for quick lookups.
+     */
+    private void initializeDeveloperMaps()
+    {
+        developersById = new HashMap();
+        developersByName = new HashMap();
+
+        if ( developers != null )
+        {
+            for ( Iterator i = developers.iterator(); i.hasNext(); )
+            {
+                Developer developer = (Developer) i.next();
+
+                developersById.put( developer.getId(), developer );
+                developersByName.put( developer.getName(), developer );
+            }
+        }
+    }
+
+    /**
      * populates the changedSets field by either connecting to the SCM or using an existing XML generated in a previous
      * run of the report
      *
@@ -1190,7 +1228,9 @@
         sink.tableCell_();
 
         sink.tableCell();
-        sink.text( entry.getAuthor() );
+
+        sinkAuthorDetails( sink, entry.getAuthor() );
+
         sink.tableCell_();
 
         sink.tableCell();
@@ -1311,6 +1351,35 @@
     }
 
     /**
+     * If the supplied author is a known developer this method outputs a
+     * link to the team members report, or alternatively, if the supplied
+     * author is unknown, outputs the author's name as plain text.
+     *
+     * @param sink Sink to use for outputting
+     * @param author The author's name.
+     */
+    protected void sinkAuthorDetails( Sink sink, String author )
+    {
+        Developer developer = (Developer) developersById.get( author );
+
+        if ( developer == null )
+        {
+            developer = (Developer) developersByName.get( author );
+        }
+
+        if ( developer != null )
+        {
+            sink.link( "team-list.html#" + developer.getId() );
+            sink.text( developer.getName() );
+            sink.link_();
+        }
+        else
+        {
+            sink.text( author );
+        }
+    }
+
+    /**
      * populates the report url used to create links from certain elements of the report
      */
     protected void initReportUrls()
diff --git a/src/main/java/org/apache/maven/plugin/changelog/DeveloperActivityReport.java b/src/main/java/org/apache/maven/plugin/changelog/DeveloperActivityReport.java
index d4e218a..b230e8e 100644
--- a/src/main/java/org/apache/maven/plugin/changelog/DeveloperActivityReport.java
+++ b/src/main/java/org/apache/maven/plugin/changelog/DeveloperActivityReport.java
@@ -20,7 +20,6 @@
  */
 
 import org.apache.maven.doxia.sink.Sink;
-import org.apache.maven.model.Developer;
 import org.apache.maven.scm.ChangeFile;
 import org.apache.maven.scm.ChangeSet;
 import org.apache.maven.scm.command.changelog.ChangeLogSet;
@@ -43,13 +42,6 @@
     extends ChangeLogReport
 {
     /**
-     * List of developers to be shown on the report.
-     *
-     * @parameter expression="${project.developers}"
-     */
-    private List developers;
-
-    /**
      * Used to hold data while creating the report
      */
     private HashMap commits;
@@ -183,42 +175,18 @@
     {
         initDeveloperDetails( set );
 
-        //for( Iterator i=commits.keySet().iterator(); i.hasNext(); )
-        for ( Iterator i = developers.iterator(); i.hasNext(); )
+        for( Iterator i = commits.keySet().iterator(); i.hasNext(); )
         {
-            Developer developer = (Developer) i.next();
+            String author = (String) i.next();
 
-            String name = developer.getName();
-
-            String id = developer.getId();
-
-            LinkedList devCommits;
-            HashMap devFiles;
-
-            if ( !commits.containsKey( name ) )
-            {
-                if ( !commits.containsKey( id ) )
-                {
-                    continue;
-                }
-
-                devCommits = (LinkedList) commits.get( id );
-
-                devFiles = (HashMap) files.get( id );
-            }
-            else
-            {
-                devCommits = (LinkedList) commits.get( name );
-
-                devFiles = (HashMap) files.get( name );
-            }
+            LinkedList devCommits = (LinkedList) commits.get( author );
+            HashMap devFiles = (HashMap) files.get( author );
 
             sink.tableRow();
-
             sink.tableCell();
-            sink.link( "team-list.html#" + developer.getId() );
-            sink.text( name );
-            sink.link_();
+
+            sinkAuthorDetails( sink, author );
+
             sink.tableCell_();
 
             sink.tableCell();
