diff --git a/pom.xml b/pom.xml
index 6ea3f10..e837618 100644
--- a/pom.xml
+++ b/pom.xml
@@ -204,8 +204,11 @@
       <artifactId>maven-scm-provider-clearcase</artifactId>
       <version>${maven-scm.version}</version>
     </dependency>
-        <!-- Replace this cvs provider by a pure java cvs provider when it will be available 
-    -->
+    <dependency>
+      <groupId>org.apache.maven.scm</groupId>
+      <artifactId>maven-scm-provider-hg</artifactId>
+      <version>${maven-scm.version}</version>
+    </dependency>
     <dependency>
       <groupId>org.apache.maven.scm</groupId>
       <artifactId>maven-scm-provider-cvsexe</artifactId>
@@ -213,6 +216,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.maven.scm</groupId>
+      <artifactId>maven-scm-provider-cvsjava</artifactId>
+      <version>${maven-scm.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.scm</groupId>
       <artifactId>maven-scm-provider-local</artifactId>
       <version>${maven-scm.version}</version>
     </dependency>
@@ -249,7 +257,7 @@
     </dependency>
   </dependencies>
   <properties>
-    <maven-scm.version>1.0-beta-4</maven-scm.version>
+    <maven-scm.version>1.0-SNAPSHOT</maven-scm.version>
   </properties>
 </project>
 
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 eacbd75..e9a932f 100644
--- a/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
+++ b/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
@@ -25,9 +25,11 @@
 import org.apache.maven.reporting.MavenReportException;
 import org.apache.maven.scm.ChangeFile;
 import org.apache.maven.scm.ChangeSet;
+import org.apache.maven.scm.ScmBranch;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmRevision;
 import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
 import org.apache.maven.scm.command.changelog.ChangeLogSet;
 import org.apache.maven.scm.manager.ScmManager;
@@ -52,6 +54,8 @@
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -60,8 +64,6 @@
 import java.util.Locale;
 import java.util.ResourceBundle;
 import java.util.StringTokenizer;
-import java.util.Collections;
-import java.util.Comparator;
 
 /**
  * Generate a changelog report.
@@ -258,11 +260,11 @@
      * <ul>
      * <li><code>%FILE%</code> - this is the path to a file</li>
      * </ul>
-     * <p>
+     * <p/>
      * Example:
      * <code>http://checkstyle.cvs.sourceforge.net/checkstyle%FILE%?view=markup</code>
      * </p>
-     * <p>
+     * <p/>
      * <strong>Note:</strong> If you don't supply the token in your template,
      * the path of the file will simply be appended to your template URL.
      * </p>
@@ -314,8 +316,8 @@
 
         if ( outputXML.exists() )
         {
-            if ( outputXMLExpiration > 0
-                && outputXMLExpiration * 60000 > System.currentTimeMillis() - outputXML.lastModified() )
+            if ( outputXMLExpiration > 0 &&
+                outputXMLExpiration * 60000 > System.currentTimeMillis() - outputXML.lastModified() )
             {
                 try
                 {
@@ -417,8 +419,8 @@
 
             if ( "range".equals( type ) )
             {
-                result =
-                    provider.changeLog( repository, new ScmFileSet( basedir ), null, null, range, null, dateFormat );
+                result = provider.changeLog( repository, new ScmFileSet( basedir ), null, null, range, (ScmBranch) null,
+                                             dateFormat );
 
                 checkResult( result );
 
@@ -437,7 +439,8 @@
                     {
                         endTag = (String) tagsIter.next();
 
-                        result = provider.changeLog( repository, new ScmFileSet( basedir ), startTag, endTag );
+                        result = provider.changeLog( repository, new ScmFileSet( basedir ), new ScmRevision( startTag ),
+                                                     new ScmRevision( endTag ) );
 
                         checkResult( result );
 
@@ -469,7 +472,7 @@
                         endDate = (String) dateIter.next();
 
                         result = provider.changeLog( repository, new ScmFileSet( basedir ), parseDate( startDate ),
-                                                     parseDate( endDate ), 0, null );
+                                                     parseDate( endDate ), 0, (ScmBranch) null );
 
                         checkResult( result );
 
@@ -481,7 +484,7 @@
                 else
                 {
                     result = provider.changeLog( repository, new ScmFileSet( basedir ), parseDate( startDate ),
-                                                 parseDate( endDate ), 0, null );
+                                                 parseDate( endDate ), 0, (ScmBranch) null );
 
                     checkResult( result );
 
@@ -726,8 +729,8 @@
         }
         else
         {
-            throw new MavenReportException( "The type parameter has an invalid value: " + type
-                + ".  The value should be \"range\", \"date\", or \"tag\"." );
+            throw new MavenReportException( "The type parameter has an invalid value: " + type +
+                ".  The value should be \"range\", \"date\", or \"tag\"." );
         }
     }
 
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 faf4890..722a6cd 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
@@ -19,6 +19,24 @@
  * under the License.
  */
 
+import org.apache.maven.scm.ScmBranch;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.command.add.AddScmResult;
+import org.apache.maven.scm.command.branch.BranchScmResult;
+import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
+import org.apache.maven.scm.command.checkin.CheckInScmResult;
+import org.apache.maven.scm.command.checkout.CheckOutScmResult;
+import org.apache.maven.scm.command.diff.DiffScmResult;
+import org.apache.maven.scm.command.edit.EditScmResult;
+import org.apache.maven.scm.command.export.ExportScmResult;
+import org.apache.maven.scm.command.list.ListScmResult;
+import org.apache.maven.scm.command.remove.RemoveScmResult;
+import org.apache.maven.scm.command.status.StatusScmResult;
+import org.apache.maven.scm.command.tag.TagScmResult;
+import org.apache.maven.scm.command.unedit.UnEditScmResult;
+import org.apache.maven.scm.command.update.UpdateScmResult;
 import org.apache.maven.scm.manager.NoSuchScmProviderException;
 import org.apache.maven.scm.manager.ScmManager;
 import org.apache.maven.scm.provider.ScmProvider;
@@ -27,16 +45,18 @@
 import org.apache.maven.scm.repository.UnknownRepositoryStructure;
 
 import java.io.File;
+import java.util.Date;
 import java.util.List;
 
 
 /**
- *
  * @author Edwin Punzalan
  */
 public class ScmManagerStub
     implements ScmManager
 {
+    private ScmProvider scmProvider;
+
     public ScmProvider getProviderByType( String string )
         throws NoSuchScmProviderException
     {
@@ -71,4 +91,358 @@
     {
         return new ScmProviderStub();
     }
+
+    public void setScmProvider( ScmProvider scmProvider )
+    {
+        this.scmProvider = scmProvider;
+    }
+
+    public ScmProvider getScmProvider()
+    {
+        return scmProvider;
+    }
+
+    public void setScmProvider( String providerType, ScmProvider provider )
+    {
+        setScmProvider( provider );
+    }
+
+    /**
+     *
+     */
+    public AddScmResult add( ScmRepository repository, ScmFileSet fileSet )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).add( repository, fileSet );
+    }
+
+    /**
+     *
+     */
+    public AddScmResult add( ScmRepository repository, ScmFileSet fileSet, String message )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).add( repository, fileSet, message );
+    }
+
+    /**
+     *
+     */
+    public BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).branch( repository, fileSet, branchName );
+    }
+
+    /**
+     *
+     */
+    public BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName, String message )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).branch( repository, fileSet, branchName, message );
+    }
+
+    /**
+     *
+     */
+    public ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
+                                         int numDays, ScmBranch branch )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).changeLog( repository, fileSet, startDate, endDate, numDays,
+                                                                     branch );
+    }
+
+    /**
+     *
+     */
+    public ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
+                                         int numDays, ScmBranch branch, String datePattern )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).changeLog( repository, fileSet, startDate, endDate, numDays,
+                                                                     branch, datePattern );
+    }
+
+    /**
+     *
+     */
+    public ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, ScmVersion startVersion,
+                                         ScmVersion endVersion )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).changeLog( repository, fileSet, startVersion, endVersion );
+    }
+
+    /**
+     *
+     */
+    public ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, ScmVersion startRevision,
+                                         ScmVersion endRevision, String datePattern )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).changeLog( repository, fileSet, startRevision, endRevision,
+                                                                     datePattern );
+    }
+
+    /**
+     *
+     */
+    public CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, String message )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).checkIn( repository, fileSet, message );
+    }
+
+    /**
+     *
+     */
+    public CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, ScmVersion revision, String message )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).checkIn( repository, fileSet, revision, message );
+    }
+
+    /**
+     *
+     */
+    public CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).checkOut( repository, fileSet );
+    }
+
+    /**
+     *
+     */
+    public CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).checkOut( repository, fileSet, version );
+    }
+
+    /**
+     *
+     */
+    public CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet, boolean recursive )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).checkOut( repository, fileSet, recursive );
+    }
+
+    /**
+     *
+     */
+    public CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet, ScmVersion version,
+                                       boolean recursive )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).checkOut( repository, fileSet, version, recursive );
+    }
+
+    /**
+     *
+     */
+    public DiffScmResult diff( ScmRepository repository, ScmFileSet fileSet, ScmVersion startVersion,
+                               ScmVersion endVersion )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).diff( repository, fileSet, startVersion, endVersion );
+    }
+
+    /**
+     *
+     */
+    public EditScmResult edit( ScmRepository repository, ScmFileSet fileSet )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).edit( repository, fileSet );
+    }
+
+    /**
+     *
+     */
+    public ExportScmResult export( ScmRepository repository, ScmFileSet fileSet )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).export( repository, fileSet );
+    }
+
+    /**
+     *
+     */
+    public ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).export( repository, fileSet, version );
+    }
+
+    /**
+     *
+     */
+    public ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, String outputDirectory )
+        throws ScmException
+    {
+        return this.export( repository, fileSet, outputDirectory );
+    }
+
+    /**
+     *
+     */
+    public ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, ScmVersion version,
+                                   String outputDirectory )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).export( repository, fileSet, version, outputDirectory );
+    }
+
+    /**
+     *
+     */
+    public ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, ScmVersion version )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).list( repository, fileSet, recursive, version );
+    }
+
+    /**
+     *
+     */
+    public RemoveScmResult remove( ScmRepository repository, ScmFileSet fileSet, String message )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).remove( repository, fileSet, message );
+    }
+
+    /**
+     *
+     */
+    public StatusScmResult status( ScmRepository repository, ScmFileSet fileSet )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).status( repository, fileSet );
+    }
+
+    /**
+     *
+     */
+    public TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).tag( repository, fileSet, tagName );
+    }
+
+    /**
+     *
+     */
+    public TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName, String message )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).tag( repository, fileSet, tagName, message );
+    }
+
+    /**
+     *
+     */
+    public UnEditScmResult unedit( ScmRepository repository, ScmFileSet fileSet )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).unedit( repository, fileSet );
+    }
+
+    /**
+     *
+     */
+    public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).update( repository, fileSet );
+    }
+
+    /**
+     *
+     */
+    public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).update( repository, fileSet, version );
+    }
+
+    /**
+     *
+     */
+    public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, boolean runChangelog )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).update( repository, fileSet, runChangelog );
+    }
+
+    /**
+     *
+     */
+    public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version,
+                                   boolean runChangelog )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).update( repository, fileSet, version, runChangelog );
+    }
+
+    /**
+     *
+     */
+    public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String datePattern )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).update( repository, fileSet, (ScmVersion) null, datePattern );
+    }
+
+    /**
+     *
+     */
+    public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version,
+                                   String datePattern )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).update( repository, fileSet, version, datePattern );
+    }
+
+    /**
+     *
+     */
+    public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, Date lastUpdate )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).update( repository, fileSet, (ScmVersion) null, lastUpdate );
+    }
+
+    /**
+     *
+     */
+    public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).update( repository, fileSet, version, lastUpdate );
+    }
+
+    /**
+     *
+     */
+    public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, Date lastUpdate, String datePattern )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).update( repository, fileSet, (ScmVersion) null, lastUpdate,
+                                                                  datePattern );
+    }
+
+    /**
+     *
+     */
+    public UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate,
+                                   String datePattern )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).update( repository, fileSet, version, lastUpdate,
+                                                                  datePattern );
+    }
 }
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 18e0a7e..c45eccf 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
@@ -19,9 +19,12 @@
  * under the License.
  */
 
+import org.apache.maven.scm.ScmBranch;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmVersion;
 import org.apache.maven.scm.command.add.AddScmResult;
+import org.apache.maven.scm.command.branch.BranchScmResult;
 import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
 import org.apache.maven.scm.command.checkin.CheckInScmResult;
 import org.apache.maven.scm.command.checkout.CheckOutScmResult;
@@ -33,6 +36,7 @@
 import org.apache.maven.scm.command.tag.TagScmResult;
 import org.apache.maven.scm.command.unedit.UnEditScmResult;
 import org.apache.maven.scm.command.update.UpdateScmResult;
+import org.apache.maven.scm.command.export.ExportScmResult;
 import org.apache.maven.scm.log.ScmLogger;
 import org.apache.maven.scm.provider.ScmProvider;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -56,14 +60,48 @@
         return null;
     }
 
+    public void addListener( ScmLogger scmLogger )
+    {
+    }
+
+    public String getScmSpecificFilename()
+    {
+        return null;
+    }
+
+    public String getScmType()
+    {
+        return null;
+    }
+
+    public ScmProviderRepository makeProviderScmRepository( File file )
+        throws ScmRepositoryException, UnknownRepositoryStructure
+    {
+        return null;
+    }
+
+    public ScmProviderRepository makeProviderScmRepository( String string, char c )
+        throws ScmRepositoryException
+    {
+        return null;
+    }
+
     public AddScmResult add( ScmRepository scmRepository, ScmFileSet scmFileSet, String message )
         throws ScmException
     {
         return null;
     }
 
-    public void addListener( ScmLogger scmLogger )
+    public BranchScmResult branch( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
+        throws ScmException
     {
+        return null;
+    }
+
+    public BranchScmResult branch( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, String string1 )
+        throws ScmException
+    {
+        return null;
     }
 
     protected ChangeLogScmResult getChangeLogScmResult()
@@ -99,50 +137,159 @@
         return getChangeLogScmResult();
     }
 
+    public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, Date date, Date date1,
+                                         int i, ScmBranch scmBranch )
+        throws ScmException
+    {
+        return getChangeLogScmResult();
+    }
+
+    public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, Date date, Date date1,
+                                         int i, ScmBranch scmBranch, String string )
+        throws ScmException
+    {
+        return getChangeLogScmResult();
+    }
+
+    public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
+                                         ScmVersion scmVersion1 )
+        throws ScmException
+    {
+        return getChangeLogScmResult();
+    }
+
+    public ChangeLogScmResult changeLog( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
+                                         ScmVersion scmVersion1, String string )
+        throws ScmException
+    {
+        return getChangeLogScmResult();
+    }
+
     public CheckInScmResult checkIn( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, String string1 )
         throws ScmException
     {
         return null;
     }
 
+    public CheckInScmResult checkIn( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
+        throws ScmException
+    {
+        return null;
+    }
+
+    public CheckInScmResult checkIn( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
+                                     String string )
+        throws ScmException
+    {
+        return null;
+    }
+
     public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
         throws ScmException
     {
         return null;
     }
 
+    public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet )
+        throws ScmException
+    {
+        return null;
+    }
+
+    public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion )
+        throws ScmException
+    {
+        return null;
+    }
+
+    /**
+     * @deprecated
+     */
+    public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, boolean b )
+        throws ScmException
+    {
+        return null;
+    }
+
+    public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, boolean b )
+        throws ScmException
+    {
+        return null;
+    }
+
+    public CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
+                                       boolean b )
+        throws ScmException
+    {
+        return null;
+    }
+
     public DiffScmResult diff( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, String string1 )
         throws ScmException
     {
         return null;
     }
 
+    public DiffScmResult diff( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
+                               ScmVersion scmVersion1 )
+        throws ScmException
+    {
+        return null;
+    }
+
     public EditScmResult edit( ScmRepository scmRepository, ScmFileSet scmFileSet )
         throws ScmException
     {
         return null;
     }
 
-    public String getScmSpecificFilename()
+    /**
+     * @deprecated
+     */
+    public ExportScmResult export( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
+        throws ScmException
+    {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public ExportScmResult export( ScmRepository scmRepository, ScmFileSet scmFileSet )
+        throws ScmException
+    {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    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
+     */
+    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.
+    }
+
+    public ExportScmResult export( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
+                                   String string )
+        throws ScmException
+    {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, String tag )
+        throws ScmException
     {
         return null;
     }
 
-    public String getScmType()
+    public ListScmResult list( ScmRepository scmRepository, ScmFileSet scmFileSet, boolean b, ScmVersion scmVersion )
+        throws ScmException
     {
-        return null;
-    }
-
-    public ScmProviderRepository makeProviderScmRepository( File file )
-        throws ScmRepositoryException, UnknownRepositoryStructure
-    {
-        return null;
-    }
-
-    public ScmProviderRepository makeProviderScmRepository( String string, char c )
-        throws ScmRepositoryException
-    {
-        return null;
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
     public RemoveScmResult remove( ScmRepository scmRepository, ScmFileSet scmFileSet, String string )
@@ -168,6 +315,12 @@
         return null;
     }
 
+    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.
+    }
+
     public UnEditScmResult unedit( ScmRepository scmRepository, ScmFileSet scmFileSet )
         throws ScmException
     {
@@ -199,17 +352,66 @@
         return null;
     }
 
-    public List validateScmUrl( String string, char c )
+    public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet )
+        throws ScmException
     {
         return null;
     }
 
-    public ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, String tag )
+    public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion )
         throws ScmException
     {
         return null;
     }
 
+    /**
+     * @deprecated
+     */
+    public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, String string, boolean b )
+        throws ScmException
+    {
+        return null;
+    }
+
+    public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, boolean b )
+        throws ScmException
+    {
+        return null;
+    }
+
+    public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
+                                   boolean b )
+        throws ScmException
+    {
+        return null;
+    }
+
+    public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
+                                   String string )
+        throws ScmException
+    {
+        return null;
+    }
+
+    public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion,
+                                   Date date )
+        throws ScmException
+    {
+        return null;
+    }
+
+    public UpdateScmResult update( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion scmVersion, Date date,
+                                   String string )
+        throws ScmException
+    {
+        return null;
+    }
+
+    public List validateScmUrl( String string, char c )
+    {
+        return null;
+    }
+
     public String sanitizeTagName( String tag )
     {
         return tag;
