diff --git a/src/main/java/org/apache/maven/plugin/changelog/ChangeLog.java b/src/main/java/org/apache/maven/plugin/changelog/ChangeLog.java
index d41920a..c5c3e2b 100644
--- a/src/main/java/org/apache/maven/plugin/changelog/ChangeLog.java
+++ b/src/main/java/org/apache/maven/plugin/changelog/ChangeLog.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-// java imports
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
@@ -64,12 +62,12 @@
         SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
 
         List changeLogSets = new ArrayList();
-        
+
         parser.parse( stream, new ChangeLogHandler( changeLogSets ) );
 
         return changeLogSets;
     }
-    
+
     public static List loadChangedSets( Reader reader )
         throws ParserConfigurationException, SAXException, IOException
     {
@@ -80,6 +78,6 @@
         parser.parse( new InputSource( reader ), new ChangeLogHandler( changeLogSets ) );
 
         return changeLogSets;
-    }    
-    
+    }
+
 } // end of ChangeLog
diff --git a/src/main/java/org/apache/maven/plugin/changelog/ChangeLogHandler.java b/src/main/java/org/apache/maven/plugin/changelog/ChangeLogHandler.java
index ba2364d..aaadb01 100644
--- a/src/main/java/org/apache/maven/plugin/changelog/ChangeLogHandler.java
+++ b/src/main/java/org/apache/maven/plugin/changelog/ChangeLogHandler.java
@@ -37,6 +37,8 @@
 /**
  * Change log generated xml parser.  SAXParser listener for processing a previously generated xml into several
  * change log sets.
+ *
+ * @version $Id$
  */
 public class ChangeLogHandler
     extends DefaultHandler
@@ -65,18 +67,14 @@
         this.changeSets = changeSets;
     }
 
-    /**
-     * @see org.xml.sax.helpers.DefaultHandler#characters(char[],int,int)
-     */
+    /** {@inheritDoc} */
     public void characters( char[] ch, int start, int length )
         throws SAXException
     {
         bufData += new String( ch, start, length );
     }
 
-    /**
-     * @see org.xml.sax.helpers.DefaultHandler#endElement(String,String,String)
-     */
+    /** {@inheritDoc} */
     public void endElement( String uri, String localName, String qName )
         throws SAXException
     {
@@ -146,9 +144,7 @@
         }
     }
 
-    /**
-     * @see org.xml.sax.helpers.DefaultHandler#startElement(String,String,String,Attributes)
-     */
+    /** {@inheritDoc} */
     public void startElement( String uri, String localName, String qName, Attributes attributes )
         throws SAXException
     {
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 cc61de8..d5003fa 100644
--- a/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
+++ b/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
@@ -74,6 +74,7 @@
 /**
  * Generate a changelog report.
  *
+ * @version $Id$
  * @goal changelog
  */
 public class ChangeLogReport
@@ -1421,13 +1422,15 @@
     }
 
     /**
-     * @see org.apache.maven.reporting.MavenReport#getOutputName()
+     * @param locale
+     * @return the current bundle
      */
     protected ResourceBundle getBundle( Locale locale )
     {
         return ResourceBundle.getBundle( "scm-activity", locale, this.getClass().getClassLoader() );
     }
 
+    /** {@inheritDoc} */
     public boolean canGenerateReport()
     {
         if ( offline && !outputXML.exists() )
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 f5b4ef7..089b93b 100644
--- a/src/main/java/org/apache/maven/plugin/changelog/DeveloperActivityReport.java
+++ b/src/main/java/org/apache/maven/plugin/changelog/DeveloperActivityReport.java
@@ -36,6 +36,7 @@
 /**
  * Generate a developer activity report.
  *
+ * @version $Id$
  * @goal dev-activity
  */
 public class DeveloperActivityReport
@@ -73,12 +74,7 @@
         return "dev-activity";
     }
 
-    /**
-     * generates an empty report in case there are no sources to generate a report with
-     *
-     * @param bundle the resource bundle to retrieve report phrases from
-     * @param sink   the report formatting tool
-     */
+    /** {@inheritDoc} */
     protected void doGenerateEmptyReport( ResourceBundle bundle, Sink sink )
     {
         sink.head();
@@ -105,13 +101,7 @@
         sink.close();
     }
 
-    /**
-     * method that generates the report for this mojo.
-     *
-     * @param changeLogSets changed sets to generate the report from
-     * @param bundle        the resource bundle to retrieve report phrases from
-     * @param sink          the report formatting tool
-     */
+    /** {@inheritDoc} */
     protected void doGenerateReport( List changeLogSets, ResourceBundle bundle, Sink sink )
     {
         sink.head();
diff --git a/src/main/java/org/apache/maven/plugin/changelog/FileActivityComparator.java b/src/main/java/org/apache/maven/plugin/changelog/FileActivityComparator.java
index 62cd6cc..27a30c6 100644
--- a/src/main/java/org/apache/maven/plugin/changelog/FileActivityComparator.java
+++ b/src/main/java/org/apache/maven/plugin/changelog/FileActivityComparator.java
@@ -27,14 +27,14 @@
 
 
 /**
- * Object used to sort the file-activity report into descending order
+ * Object used to sort the file-activity report into descending order.
+ *
+ * @version $Id$
  */
 public class FileActivityComparator
     implements Comparator
 {
-    /**
-     * @see java.util.Comparator#compare(Object,Object)
-     */
+    /** {@inheritDoc} */
     public int compare( Object o1, Object o2 )
         throws ClassCastException
     {
diff --git a/src/main/java/org/apache/maven/plugin/changelog/FileActivityReport.java b/src/main/java/org/apache/maven/plugin/changelog/FileActivityReport.java
index 4656f10..d39992f 100644
--- a/src/main/java/org/apache/maven/plugin/changelog/FileActivityReport.java
+++ b/src/main/java/org/apache/maven/plugin/changelog/FileActivityReport.java
@@ -37,6 +37,7 @@
 /**
  * Generate a file activity report.
  *
+ * @version $Id$
  * @goal file-activity
  */
 public class FileActivityReport
@@ -60,12 +61,7 @@
         return "file-activity";
     }
 
-    /**
-     * generates an empty report in case there are no sources to generate a report with
-     *
-     * @param bundle the resource bundle to retrieve report phrases from
-     * @param sink   the report formatting tool
-     */
+    /** {@inheritDoc} */
     protected void doGenerateEmptyReport( ResourceBundle bundle, Sink sink )
     {
         sink.head();
@@ -92,13 +88,7 @@
         sink.close();
     }
 
-    /**
-     * method that generates the report for this mojo.
-     *
-     * @param changeLogSets changed sets to generate the report from
-     * @param bundle        the resource bundle to retrieve report phrases from
-     * @param sink          the report formatting tool
-     */
+    /** {@inheritDoc} */
     protected void doGenerateReport( List changeLogSets, ResourceBundle bundle, Sink sink )
     {
         sink.head();
diff --git a/src/test/java/org/apache/maven/plugin/changelog/AbstractChangeLogReportTest.java b/src/test/java/org/apache/maven/plugin/changelog/AbstractChangeLogReportTest.java
index a3ac0ac..6a6800b 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/AbstractChangeLogReportTest.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/AbstractChangeLogReportTest.java
@@ -1,17 +1,5 @@
 package org.apache.maven.plugin.changelog;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.Writer;
-
-import org.apache.maven.doxia.site.decoration.DecorationModel;
-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.plugin.testing.AbstractMojoTestCase;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.WriterFactory;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -31,9 +19,22 @@
  * under the License.
  */
 
+import java.io.File;
+import java.io.IOException;
+import java.io.Writer;
+
+import org.apache.maven.doxia.site.decoration.DecorationModel;
+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.plugin.testing.AbstractMojoTestCase;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.WriterFactory;
+
 /**
  * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
  * @version $Id$
+ * @since 2.2
  */
 public abstract class AbstractChangeLogReportTest
     extends AbstractMojoTestCase
diff --git a/src/test/java/org/apache/maven/plugin/changelog/ChangeLogReportTest.java b/src/test/java/org/apache/maven/plugin/changelog/ChangeLogReportTest.java
index cb8d7b7..923e04a 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/ChangeLogReportTest.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/ChangeLogReportTest.java
@@ -22,7 +22,6 @@
 import org.apache.maven.plugin.changelog.stubs.ScmManagerStub;
 import org.apache.maven.plugin.changelog.stubs.FailedScmManagerStub;
 import org.apache.maven.plugin.changelog.stubs.ScmManagerWithHostStub;
-import org.apache.maven.plugin.Mojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.scm.manager.ScmManager;
 import org.codehaus.plexus.util.FileUtils;
@@ -31,6 +30,7 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class ChangeLogReportTest
     extends AbstractChangeLogReportTest
diff --git a/src/test/java/org/apache/maven/plugin/changelog/ChangeLogTest.java b/src/test/java/org/apache/maven/plugin/changelog/ChangeLogTest.java
index c9ea806..3fb9411 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/ChangeLogTest.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/ChangeLogTest.java
@@ -32,6 +32,7 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class ChangeLogTest
     extends TestCase
diff --git a/src/test/java/org/apache/maven/plugin/changelog/DeveloperActivityReportTest.java b/src/test/java/org/apache/maven/plugin/changelog/DeveloperActivityReportTest.java
index dfc8106..b524b83 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/DeveloperActivityReportTest.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/DeveloperActivityReportTest.java
@@ -27,6 +27,7 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class DeveloperActivityReportTest
     extends AbstractChangeLogReportTest
diff --git a/src/test/java/org/apache/maven/plugin/changelog/FileActivityComparatorTest.java b/src/test/java/org/apache/maven/plugin/changelog/FileActivityComparatorTest.java
index ec47df4..90f420d 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/FileActivityComparatorTest.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/FileActivityComparatorTest.java
@@ -27,12 +27,14 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class FileActivityComparatorTest
     extends TestCase
 {
     private FileActivityComparator comparator;
 
+    /** {@inheritDoc} */
     protected void setUp()
         throws Exception
     {
diff --git a/src/test/java/org/apache/maven/plugin/changelog/FileActivityReportTest.java b/src/test/java/org/apache/maven/plugin/changelog/FileActivityReportTest.java
index 6218b8f..0d9a281 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/FileActivityReportTest.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/FileActivityReportTest.java
@@ -27,6 +27,7 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class FileActivityReportTest
     extends AbstractChangeLogReportTest
diff --git a/src/test/java/org/apache/maven/plugin/changelog/stubs/ChangeLogScmResultStub.java b/src/test/java/org/apache/maven/plugin/changelog/stubs/ChangeLogScmResultStub.java
index bf5e6c2..ab345d5 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/stubs/ChangeLogScmResultStub.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/stubs/ChangeLogScmResultStub.java
@@ -26,6 +26,7 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class ChangeLogScmResultStub
     extends org.apache.maven.scm.command.changelog.ChangeLogScmResult
@@ -40,6 +41,7 @@
         super( "", "", "", true );
     }
 
+    /** {@inheritDoc} */
     public ChangeLogSet getChangeLog()
     {
         return new ChangeLogSet( Collections.EMPTY_LIST, new Date( 360 ), new Date( 720 ) );
diff --git a/src/test/java/org/apache/maven/plugin/changelog/stubs/DevelopersStub.java b/src/test/java/org/apache/maven/plugin/changelog/stubs/DevelopersStub.java
index 22a07f7..84f5898 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/stubs/DevelopersStub.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/stubs/DevelopersStub.java
@@ -26,6 +26,7 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class DevelopersStub
     extends ArrayList
diff --git a/src/test/java/org/apache/maven/plugin/changelog/stubs/FailedScmManagerStub.java b/src/test/java/org/apache/maven/plugin/changelog/stubs/FailedScmManagerStub.java
index b8eaaf5..e9ed8a3 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/stubs/FailedScmManagerStub.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/stubs/FailedScmManagerStub.java
@@ -26,29 +26,35 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class FailedScmManagerStub
     extends ScmManagerStub
 {
+    /** {@inheritDoc} */
     public ScmProvider getProviderByRepository( ScmRepository scmRepository )
         throws NoSuchScmProviderException
     {
         return new ScmProviderStub()
         {
+            /** {@inheritDoc} */
             protected ChangeLogScmResult getChangeLogScmResult()
             {
                 return new ChangeLogScmResultStub()
                 {
+                    /** {@inheritDoc} */
                     public String getCommandOutput()
                     {
                         return "Provider Stub Commandline";
                     }
 
+                    /** {@inheritDoc} */
                     public String getProviderMessage()
                     {
                         return "Provider Stub Error Message";
                     }
 
+                    /** {@inheritDoc} */
                     public boolean isSuccess()
                     {
                         return false;
diff --git a/src/test/java/org/apache/maven/plugin/changelog/stubs/MavenProjectStub.java b/src/test/java/org/apache/maven/plugin/changelog/stubs/MavenProjectStub.java
index 12082ec..4f5f313 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/stubs/MavenProjectStub.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/stubs/MavenProjectStub.java
@@ -26,6 +26,7 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class MavenProjectStub
     extends org.apache.maven.plugin.testing.stubs.MavenProjectStub
@@ -39,6 +40,7 @@
         testCounter++;
     }
 
+    /** {@inheritDoc} */
     public Scm getScm()
     {
         Scm scm = new Scm();
@@ -48,6 +50,7 @@
         return scm;
     }
 
+    /** {@inheritDoc} */
     public File getBasedir()
     {
         return new File( PlexusTestCase.getBasedir(), "target/test-harness/" + testCounter );
diff --git a/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmManagerStub.java b/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmManagerStub.java
index f69f051..cc8adde 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmManagerStub.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmManagerStub.java
@@ -50,59 +50,48 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class ScmManagerStub
     implements ScmManager
 {
     private ScmProvider scmProvider;
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#getProviderByType(java.lang.String)
-     */
+    /** {@inheritDoc} */
     public ScmProvider getProviderByType( String string )
         throws NoSuchScmProviderException
     {
         return null;
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#getProviderByUrl(java.lang.String)
-     */
+    /** {@inheritDoc} */
     public ScmProvider getProviderByUrl( String string )
         throws ScmRepositoryException, NoSuchScmProviderException
     {
         return null;
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#makeProviderScmRepository(java.lang.String, java.io.File)
-     */
+    /** {@inheritDoc} */
     public ScmRepository makeProviderScmRepository( String string, File file )
         throws ScmRepositoryException, UnknownRepositoryStructure, NoSuchScmProviderException
     {
         return null;
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#makeScmRepository(java.lang.String)
-     */
+    /** {@inheritDoc} */
     public ScmRepository makeScmRepository( String string )
         throws ScmRepositoryException, NoSuchScmProviderException
     {
         return new ScmRepositoryStub();
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#validateScmRepository(java.lang.String)
-     */
+    /** {@inheritDoc} */
     public List validateScmRepository( String string )
     {
         return null;
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#getProviderByRepository(org.apache.maven.scm.repository.ScmRepository)
-     */
+    /** {@inheritDoc} */
     public ScmProvider getProviderByRepository( ScmRepository scmRepository )
         throws NoSuchScmProviderException
     {
@@ -119,53 +108,41 @@
         return scmProvider;
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#setScmProvider(java.lang.String, org.apache.maven.scm.provider.ScmProvider)
-     */
+    /** {@inheritDoc} */
     public void setScmProvider( String providerType, ScmProvider provider )
     {
         setScmProvider( provider );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#add(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet)
-     */
+    /** {@inheritDoc} */
     public AddScmResult add( ScmRepository repository, ScmFileSet fileSet )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).add( repository, fileSet );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#add(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public AddScmResult add( ScmRepository repository, ScmFileSet fileSet, String message )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).add( repository, fileSet, message );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#branch(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).branch( repository, fileSet, branchName );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#branch(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.lang.String, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName, String message )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).branch( repository, fileSet, branchName, message );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#changeLog(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.util.Date, java.util.Date, int, org.apache.maven.scm.ScmBranch)
-     */
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
                                          int numDays, ScmBranch branch )
         throws ScmException
@@ -174,9 +151,7 @@
                                                                      branch );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#changeLog(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.util.Date, java.util.Date, int, org.apache.maven.scm.ScmBranch, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
                                          int numDays, ScmBranch branch, String datePattern )
         throws ScmException
@@ -185,9 +160,7 @@
                                                                      branch, datePattern );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#changeLog(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, org.apache.maven.scm.ScmVersion)
-     */
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, ScmVersion startVersion,
                                          ScmVersion endVersion )
         throws ScmException
@@ -195,9 +168,7 @@
         return this.getProviderByRepository( repository ).changeLog( repository, fileSet, startVersion, endVersion );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#changeLog(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, org.apache.maven.scm.ScmVersion, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, ScmVersion startRevision,
                                          ScmVersion endRevision, String datePattern )
         throws ScmException
@@ -206,54 +177,42 @@
                                                                      datePattern );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#checkIn(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, String message )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).checkIn( repository, fileSet, message );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#checkIn(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, ScmVersion revision, String message )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).checkIn( repository, fileSet, revision, message );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#checkOut(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet)
-     */
+    /** {@inheritDoc} */
     public CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).checkOut( repository, fileSet );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#checkOut(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion)
-     */
+    /** {@inheritDoc} */
     public CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).checkOut( repository, fileSet, version );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#checkOut(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, boolean)
-     */
+    /** {@inheritDoc} */
     public CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet, boolean recursive )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).checkOut( repository, fileSet, recursive );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#checkOut(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, boolean)
-     */
+    /** {@inheritDoc} */
     public CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet, ScmVersion version,
                                        boolean recursive )
         throws ScmException
@@ -261,9 +220,7 @@
         return this.getProviderByRepository( repository ).checkOut( repository, fileSet, version, recursive );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#diff(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, org.apache.maven.scm.ScmVersion)
-     */
+    /** {@inheritDoc} */
     public DiffScmResult diff( ScmRepository repository, ScmFileSet fileSet, ScmVersion startVersion,
                                ScmVersion endVersion )
         throws ScmException
@@ -271,45 +228,35 @@
         return this.getProviderByRepository( repository ).diff( repository, fileSet, startVersion, endVersion );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#edit(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet)
-     */
+    /** {@inheritDoc} */
     public EditScmResult edit( ScmRepository repository, ScmFileSet fileSet )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).edit( repository, fileSet );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#export(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet)
-     */
+    /** {@inheritDoc} */
     public ExportScmResult export( ScmRepository repository, ScmFileSet fileSet )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).export( repository, fileSet );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#export(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion)
-     */
+    /** {@inheritDoc} */
     public ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).export( repository, fileSet, version );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#export(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, String outputDirectory )
         throws ScmException
     {
         return this.export( repository, fileSet, outputDirectory );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#export(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, ScmVersion version,
                                    String outputDirectory )
         throws ScmException
@@ -317,90 +264,70 @@
         return this.getProviderByRepository( repository ).export( repository, fileSet, version, outputDirectory );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#list(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, boolean, org.apache.maven.scm.ScmVersion)
-     */
+    /** {@inheritDoc} */
     public ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, ScmVersion version )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).list( repository, fileSet, recursive, version );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#remove(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public RemoveScmResult remove( ScmRepository repository, ScmFileSet fileSet, String message )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).remove( repository, fileSet, message );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#status(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet)
-     */
+    /** {@inheritDoc} */
     public StatusScmResult status( ScmRepository repository, ScmFileSet fileSet )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).status( repository, fileSet );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#tag(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).tag( repository, fileSet, tagName );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#tag(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.lang.String, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName, String message )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).tag( repository, fileSet, tagName, message );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#unedit(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet)
-     */
+    /** {@inheritDoc} */
     public UnEditScmResult unedit( ScmRepository repository, ScmFileSet fileSet )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).unedit( repository, fileSet );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#update(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet)
-     */
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).update( repository, fileSet );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#update(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion)
-     */
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).update( repository, fileSet, version );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#update(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, boolean)
-     */
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, boolean runChangelog )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).update( repository, fileSet, runChangelog );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#update(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, boolean)
-     */
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version,
                                    boolean runChangelog )
         throws ScmException
@@ -408,18 +335,14 @@
         return this.getProviderByRepository( repository ).update( repository, fileSet, version, runChangelog );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#update(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String datePattern )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).update( repository, fileSet, (ScmVersion) null, datePattern );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#update(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version,
                                    String datePattern )
         throws ScmException
@@ -427,27 +350,21 @@
         return this.getProviderByRepository( repository ).update( repository, fileSet, version, datePattern );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#update(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.util.Date)
-     */
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, Date lastUpdate )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).update( repository, fileSet, (ScmVersion) null, lastUpdate );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#update(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, java.util.Date)
-     */
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate )
         throws ScmException
     {
         return this.getProviderByRepository( repository ).update( repository, fileSet, version, lastUpdate );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#update(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, java.util.Date, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, Date lastUpdate, String datePattern )
         throws ScmException
     {
@@ -455,9 +372,7 @@
                                                                   datePattern );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#update(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, java.util.Date, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate,
                                    String datePattern )
         throws ScmException
@@ -466,9 +381,7 @@
                                                                   datePattern );
     }
 
-    /**
-     * @see org.apache.maven.scm.manager.ScmManager#setScmProviderImplementation(java.lang.String, java.lang.String)
-     */
+    /** {@inheritDoc} */
     public void setScmProviderImplementation( String providerType, String providerImplementation )
     {
         // nop
diff --git a/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmManagerWithHostStub.java b/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmManagerWithHostStub.java
index 53f26df..b63b5f7 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmManagerWithHostStub.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmManagerWithHostStub.java
@@ -22,22 +22,28 @@
 import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 import org.apache.maven.scm.manager.NoSuchScmProviderException;
-import org.apache.maven.scm.provider.ScmProviderRepositoryWithHost;/**
+import org.apache.maven.scm.provider.ScmProviderRepositoryWithHost;
+
+/**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class ScmManagerWithHostStub
     extends ScmManagerStub
 {
+    /** {@inheritDoc} */
     public ScmRepository makeScmRepository( String string )
         throws ScmRepositoryException, NoSuchScmProviderException
     {
         ScmProviderRepositoryWithHost scmRepository = new ScmProviderRepositoryWithHost()
         {
+            /** {@inheritDoc} */
             public String getHost()
             {
                 return "scmHost";
             }
 
+            /** {@inheritDoc} */
             public int getPort()
             {
                 return 7777;
diff --git a/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmProviderRepositoryStub.java b/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmProviderRepositoryStub.java
index ed94c9f..25f33dc 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmProviderRepositoryStub.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmProviderRepositoryStub.java
@@ -23,6 +23,7 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class ScmProviderRepositoryStub
     extends ScmProviderRepository
diff --git a/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmProviderStub.java b/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmProviderStub.java
index 89c85d0..b336f8a 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmProviderStub.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmProviderStub.java
@@ -51,65 +51,77 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class ScmProviderStub
     implements ScmProvider
 {
+    /** {@inheritDoc} */
     public AddScmResult add( ScmRepository scmRepository, ScmFileSet scmFileSet )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public void addListener( ScmLogger scmLogger )
     {
     }
 
+    /** {@inheritDoc} */
     public String getScmSpecificFilename()
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public String getScmType()
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public ScmProviderRepository makeProviderScmRepository( File file )
         throws ScmRepositoryException, UnknownRepositoryStructure
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public ScmProviderRepository makeProviderScmRepository( String string, char c )
         throws ScmRepositoryException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public AddScmResult add( ScmRepository scmRepository, ScmFileSet scmFileSet, String message )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public BranchScmResult branch( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public BranchScmResult branch( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, String string1 )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     protected ChangeLogScmResult getChangeLogScmResult()
     {
         return new ChangeLogScmResultStub();
     }
 
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, Date date, Date date1,
                                          int i, String string )
         throws ScmException
@@ -117,6 +129,7 @@
         return getChangeLogScmResult();
     }
 
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, Date date, Date date1,
                                          int i, String string, String string1 )
         throws ScmException
@@ -124,6 +137,7 @@
         return getChangeLogScmResult();
     }
 
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, String string,
                                          String string1 )
         throws ScmException
@@ -131,6 +145,7 @@
         return getChangeLogScmResult();
     }
 
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, String string,
                                          String string1, String string2 )
         throws ScmException
@@ -138,6 +153,7 @@
         return getChangeLogScmResult();
     }
 
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, Date date, Date date1,
                                          int i, ScmBranch scmBranch )
         throws ScmException
@@ -145,6 +161,7 @@
         return getChangeLogScmResult();
     }
 
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, Date date, Date date1,
                                          int i, ScmBranch scmBranch, String string )
         throws ScmException
@@ -152,6 +169,7 @@
         return getChangeLogScmResult();
     }
 
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
                                          ScmVersion scmVersion1 )
         throws ScmException
@@ -159,6 +177,7 @@
         return getChangeLogScmResult();
     }
 
+    /** {@inheritDoc} */
     public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
                                          ScmVersion scmVersion1, String string )
         throws ScmException
@@ -166,18 +185,21 @@
         return getChangeLogScmResult();
     }
 
+    /** {@inheritDoc} */
     public CheckInScmResult checkIn( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, String string1 )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public CheckInScmResult checkIn( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public CheckInScmResult checkIn( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
                                      String string )
         throws ScmException
@@ -185,39 +207,42 @@
         return null;
     }
 
+    /** {@inheritDoc} */
     public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion )
         throws ScmException
     {
         return null;
     }
 
-    /**
-     * @deprecated
-     */
+    /** {@inheritDoc} */
     public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, boolean b )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, boolean b )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
                                        boolean b )
         throws ScmException
@@ -225,12 +250,14 @@
         return null;
     }
 
+    /** {@inheritDoc} */
     public DiffScmResult diff( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, String string1 )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public DiffScmResult diff( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
                                ScmVersion scmVersion1 )
         throws ScmException
@@ -238,42 +265,42 @@
         return null;
     }
 
+    /** {@inheritDoc} */
     public EditScmResult edit( ScmRepository scmRepository, ScmFileSet scmFileSet )
         throws ScmException
     {
         return null;
     }
 
-    /**
-     * @deprecated
-     */
+    /** {@inheritDoc} */
     public ExportScmResult export( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
         throws ScmException
     {
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
+    /** {@inheritDoc} */
     public ExportScmResult export( ScmRepository scmRepository, ScmFileSet scmFileSet )
         throws ScmException
     {
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
+    /** {@inheritDoc} */
     public ExportScmResult export( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion )
         throws ScmException
     {
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
-    /**
-     * @deprecated
-     */
+    /** {@inheritDoc} */
     public ExportScmResult export( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, String string1 )
         throws ScmException
     {
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
+    /** {@inheritDoc} */
     public ExportScmResult export( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
                                    String string )
         throws ScmException
@@ -281,65 +308,76 @@
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
+    /** {@inheritDoc} */
     public ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, String tag )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public ListScmResult list( ScmRepository scmRepository, ScmFileSet scmFileSet, boolean b, ScmVersion scmVersion )
         throws ScmException
     {
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
+    /** {@inheritDoc} */
     public RemoveScmResult remove( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public boolean requiresEditMode()
     {
         return false;
     }
 
+    /** {@inheritDoc} */
     public StatusScmResult status( ScmRepository scmRepository, ScmFileSet scmFileSet )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public TagScmResult tag( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public TagScmResult tag( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, String string1 )
         throws ScmException
     {
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
+    /** {@inheritDoc} */
     public UnEditScmResult unedit( ScmRepository scmRepository, ScmFileSet scmFileSet )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, Date date )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, Date date,
                                    String string1 )
         throws ScmException
@@ -347,6 +385,7 @@
         return null;
     }
 
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, String string1 )
         throws ScmException
     {
@@ -374,12 +413,14 @@
         return null;
     }
 
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, boolean b )
         throws ScmException
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
                                    boolean b )
         throws ScmException
@@ -387,6 +428,7 @@
         return null;
     }
 
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
                                    String string )
         throws ScmException
@@ -394,6 +436,7 @@
         return null;
     }
 
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
                                    Date date )
         throws ScmException
@@ -401,6 +444,7 @@
         return null;
     }
 
+    /** {@inheritDoc} */
     public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion, Date date,
                                    String string )
         throws ScmException
@@ -408,25 +452,28 @@
         return null;
     }
 
+    /** {@inheritDoc} */
     public List validateScmUrl( String string, char c )
     {
         return null;
     }
 
+    /** {@inheritDoc} */
     public String sanitizeTagName( String tag )
     {
         return tag;
     }
 
+    /** {@inheritDoc} */
     public boolean validateTagName( String tag )
     {
         return true;
     }
 
+    /** {@inheritDoc} */
     public TagScmResult tag( ScmRepository arg0, ScmFileSet arg1, String arg2, ScmTagParameters arg3 )
         throws ScmException
     {
-        // TODO Auto-generated method stub
         return null;
     }
 }
diff --git a/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmRepositoryStub.java b/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmRepositoryStub.java
index 4eadcc3..8e6222f 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmRepositoryStub.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/stubs/ScmRepositoryStub.java
@@ -24,6 +24,7 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class ScmRepositoryStub
     extends ScmRepository
diff --git a/src/test/java/org/apache/maven/plugin/changelog/stubs/SettingsStub.java b/src/test/java/org/apache/maven/plugin/changelog/stubs/SettingsStub.java
index 2c30b87..4541e96 100644
--- a/src/test/java/org/apache/maven/plugin/changelog/stubs/SettingsStub.java
+++ b/src/test/java/org/apache/maven/plugin/changelog/stubs/SettingsStub.java
@@ -24,29 +24,35 @@
 
 /**
  * @author Edwin Punzalan
+ * @version $Id$
  */
 public class SettingsStub
     extends Settings
 {
+    /** {@inheritDoc} */
     public Server getServer( String serverId )
     {
         return new Server()
         {
+            /** {@inheritDoc} */
             public String getUsername()
             {
                 return "anonymous";
             }
 
+            /** {@inheritDoc} */
             public String getPassword()
             {
                 return "password";
             }
 
+            /** {@inheritDoc} */
             public String getPassphrase()
             {
                 return "passphrase";
             }
 
+            /** {@inheritDoc} */
             public String getPrivateKey()
             {
                 return "private-key";
