You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kw...@apache.org on 2025/07/30 17:12:44 UTC

(maven-scm) 01/01: Add type parameter for Command interface

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch feature/command-with-generics
in repository https://gitbox.apache.org/repos/asf/maven-scm.git

commit 66a85a704755b32aedd3ea4f9a93faf7f826b559
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Wed Jul 30 19:12:33 2025 +0200

    Add type parameter for Command interface
    
    Strong typing of Command's response type
    This closes #1272
---
 .../apache/maven/scm/command/AbstractCommand.java  |  7 +-
 .../java/org/apache/maven/scm/command/Command.java |  7 +-
 .../maven/scm/command/add/AbstractAddCommand.java  |  7 +-
 .../scm/command/blame/AbstractBlameCommand.java    |  5 +-
 .../scm/command/branch/AbstractBranchCommand.java  | 11 ++--
 .../changelog/AbstractChangeLogCommand.java        |  7 +-
 .../command/checkin/AbstractCheckInCommand.java    |  7 +-
 .../command/checkout/AbstractCheckOutCommand.java  |  7 +-
 .../scm/command/diff/AbstractDiffCommand.java      |  5 +-
 .../scm/command/edit/AbstractEditCommand.java      |  9 ++-
 .../scm/command/export/AbstractExportCommand.java  |  5 +-
 .../command/fileinfo/AbstractFileInfoCommand.java  |  5 +-
 .../maven/scm/command/info/InfoScmResult.java      |  1 +
 .../scm/command/list/AbstractListCommand.java      |  7 +-
 .../scm/command/login/AbstractLoginCommand.java    |  5 +-
 .../scm/command/mkdir/AbstractMkdirCommand.java    |  5 +-
 .../remoteinfo/AbstractRemoteInfoCommand.java      |  5 +-
 .../scm/command/remove/AbstractRemoveCommand.java  |  7 +-
 .../scm/command/status/AbstractStatusCommand.java  |  7 +-
 .../maven/scm/command/tag/AbstractTagCommand.java  | 11 ++--
 .../scm/command/unedit/AbstractUnEditCommand.java  |  9 ++-
 .../scm/command/untag/AbstractUntagCommand.java    |  9 ++-
 .../scm/command/update/AbstractUpdateCommand.java  |  7 +-
 .../scm/provider/hg/command/add/HgAddCommand.java  |  5 +-
 .../hg/command/branch/HgBranchCommand.java         |  7 +-
 .../hg/command/changelog/HgChangeLogCommand.java   |  3 +-
 .../hg/command/checkout/HgCheckOutCommand.java     |  3 +-
 .../provider/hg/command/diff/HgDiffCommand.java    |  3 +-
 .../provider/hg/command/info/HgInfoCommand.java    |  5 +-
 .../hg/command/inventory/HgListCommand.java        |  3 +-
 .../hg/command/remove/HgRemoveCommand.java         |  5 +-
 .../hg/command/status/HgStatusCommand.java         |  3 +-
 .../scm/provider/hg/command/tag/HgTagCommand.java  |  7 +-
 .../hg/command/update/HgUpdateCommand.java         |  3 +-
 .../maven/scm/provider/local/LocalScmProvider.java |  8 +--
 .../scm/provider/local/command/LocalCommand.java   |  4 +-
 .../local/command/add/LocalAddCommand.java         |  5 +-
 .../command/changelog/LocalChangeLogCommand.java   |  3 +-
 .../local/command/checkin/LocalCheckInCommand.java |  2 +-
 .../command/checkout/LocalCheckOutCommand.java     |  2 +-
 .../local/command/list/LocalListCommand.java       |  3 +-
 .../local/command/mkdir/LocalMkdirCommand.java     |  3 +-
 .../local/command/status/LocalStatusCommand.java   |  2 +-
 .../local/command/tag/LocalTagCommand.java         |  7 +-
 .../local/command/update/LocalUpdateCommand.java   |  2 +-
 .../scm/provider/git/AbstractGitScmProvider.java   | 73 ++++++++++----------
 .../maven/scm/provider/git/command/GitCommand.java |  5 +-
 .../git/gitexe/command/add/GitAddCommand.java      |  5 +-
 .../git/gitexe/command/blame/GitBlameCommand.java  |  5 +-
 .../gitexe/command/branch/GitBranchCommand.java    |  7 +-
 .../command/changelog/GitChangeLogCommand.java     |  7 +-
 .../gitexe/command/checkin/GitCheckInCommand.java  |  2 +-
 .../command/checkout/GitCheckOutCommand.java       |  7 +-
 .../git/gitexe/command/diff/GitDiffCommand.java    |  2 +-
 .../git/gitexe/command/info/GitInfoCommand.java    |  5 +-
 .../command/remoteinfo/GitRemoteInfoCommand.java   |  2 +-
 .../gitexe/command/remove/GitRemoveCommand.java    |  5 +-
 .../gitexe/command/status/GitStatusCommand.java    |  2 +-
 .../git/gitexe/command/tag/GitTagCommand.java      | 10 ++-
 .../git/gitexe/command/untag/GitUntagCommand.java  |  5 +-
 .../gitexe/command/update/GitUpdateCommand.java    |  2 +-
 .../scm/provider/git/jgit/JGitScmProvider.java     | 47 ++++++++-----
 .../git/jgit/command/add/JGitAddCommand.java       |  5 +-
 .../git/jgit/command/blame/JGitBlameCommand.java   |  2 +-
 .../git/jgit/command/branch/JGitBranchCommand.java |  5 +-
 .../command/changelog/JGitChangeLogCommand.java    |  2 +-
 .../jgit/command/checkin/JGitCheckInCommand.java   |  2 +-
 .../jgit/command/checkout/JGitCheckOutCommand.java |  2 +-
 .../git/jgit/command/diff/JGitDiffCommand.java     |  2 +-
 .../git/jgit/command/info/JGitInfoCommand.java     |  4 +-
 .../git/jgit/command/list/JGitListCommand.java     |  2 +-
 .../command/remoteinfo/JGitRemoteInfoCommand.java  |  2 +-
 .../git/jgit/command/remove/JGitRemoveCommand.java |  5 +-
 .../git/jgit/command/status/JGitStatusCommand.java |  2 +-
 .../git/jgit/command/tag/JGitTagCommand.java       |  8 +--
 .../git/jgit/command/untag/JGitUntagCommand.java   |  6 +-
 .../scm/provider/git/jgit/JGitTestScmProvider.java | 18 +++--
 .../scm/provider/svn/AbstractSvnScmProvider.java   | 77 ++++++++++------------
 .../maven/scm/provider/svn/command/SvnCommand.java |  6 +-
 .../svn/svnexe/command/add/SvnAddCommand.java      |  5 +-
 .../svn/svnexe/command/blame/SvnBlameCommand.java  |  2 +-
 .../svnexe/command/branch/SvnBranchCommand.java    |  9 ++-
 .../command/changelog/SvnChangeLogCommand.java     |  7 +-
 .../svnexe/command/checkin/SvnCheckInCommand.java  |  2 +-
 .../command/checkout/SvnCheckOutCommand.java       |  2 +-
 .../svn/svnexe/command/diff/SvnDiffCommand.java    |  2 +-
 .../svnexe/command/export/SvnExeExportCommand.java |  2 +-
 .../svn/svnexe/command/list/SvnListCommand.java    |  2 +-
 .../svn/svnexe/command/mkdir/SvnMkdirCommand.java  |  2 +-
 .../command/remoteinfo/SvnRemoteInfoCommand.java   |  2 +-
 .../svnexe/command/remove/SvnRemoveCommand.java    |  5 +-
 .../svnexe/command/status/SvnStatusCommand.java    |  2 +-
 .../svn/svnexe/command/tag/SvnTagCommand.java      |  7 +-
 .../svn/svnexe/command/untag/SvnUntagCommand.java  |  5 +-
 .../svnexe/command/update/SvnUpdateCommand.java    |  2 +-
 95 files changed, 307 insertions(+), 335 deletions(-)

diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/AbstractCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/AbstractCommand.java
index cb12be3ca..30fb2bd8e 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/AbstractCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/AbstractCommand.java
@@ -29,16 +29,17 @@
 /**
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
+ * @param <T>
  *
  */
-public abstract class AbstractCommand implements Command {
+public abstract class AbstractCommand<T extends ScmResult> implements Command<T> {
     protected Logger logger = LoggerFactory.getLogger(getClass());
 
-    protected abstract ScmResult executeCommand(
+    protected abstract T executeCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException;
 
     /** {@inheritDoc} */
-    public final ScmResult execute(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
+    public final T execute(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
         if (repository == null) {
             throw new NullPointerException("repository cannot be null");
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/Command.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/Command.java
index 7debbf0bd..2d8512d37 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/Command.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/Command.java
@@ -27,9 +27,9 @@
 /**
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
- *
+ * @param <T> the type of result returned by this command
  */
-public interface Command {
+public interface Command<T extends ScmResult> {
     /** Plexus component key */
     String ROLE = Command.class.getName();
 
@@ -40,6 +40,5 @@ public interface Command {
      * @return the result object
      * @throws ScmException if any
      */
-    ScmResult execute(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException;
+    T execute(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException;
 }
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/add/AbstractAddCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/add/AbstractAddCommand.java
index 8553d6da6..4bc492770 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/add/AbstractAddCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/add/AbstractAddCommand.java
@@ -22,7 +22,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
@@ -30,12 +29,12 @@
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
  *
  */
-public abstract class AbstractAddCommand extends AbstractCommand {
-    protected abstract ScmResult executeAddCommand(
+public abstract class AbstractAddCommand extends AbstractCommand<AddScmResult> {
+    protected abstract AddScmResult executeAddCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, String message, boolean binary) throws ScmException;
 
     /** {@inheritDoc} */
-    protected ScmResult executeCommand(
+    protected AddScmResult executeCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         return executeAddCommand(
                 repository,
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java
index 763d82f96..e4800fa7a 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java
@@ -22,7 +22,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
@@ -30,11 +29,11 @@
  * @author Evgeny Mandrikov
  * @since 1.4
  */
-public abstract class AbstractBlameCommand extends AbstractCommand {
+public abstract class AbstractBlameCommand extends AbstractCommand<BlameScmResult> {
     public abstract BlameScmResult executeBlameCommand(
             ScmProviderRepository repo, ScmFileSet workingDirectory, String filename) throws ScmException;
 
-    protected ScmResult executeCommand(
+    protected BlameScmResult executeCommand(
             ScmProviderRepository repository, ScmFileSet workingDirectory, CommandParameters parameters)
             throws ScmException {
         String file = parameters.getString(CommandParameter.FILE);
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/branch/AbstractBranchCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/branch/AbstractBranchCommand.java
index cce5e2532..6e61a5a31 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/branch/AbstractBranchCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/branch/AbstractBranchCommand.java
@@ -24,7 +24,6 @@
 import org.apache.maven.scm.ScmBranchParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
@@ -33,8 +32,8 @@
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
  *
  */
-public abstract class AbstractBranchCommand extends AbstractCommand {
-    protected abstract ScmResult executeBranchCommand(
+public abstract class AbstractBranchCommand extends AbstractCommand<BranchScmResult> {
+    protected abstract BranchScmResult executeBranchCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, String branchName, String message)
             throws ScmException;
 
@@ -48,7 +47,7 @@ protected abstract ScmResult executeBranchCommand(
      * @return TODO
      * @throws ScmException if any
      */
-    protected ScmResult executeBranchCommand(
+    protected BranchScmResult executeBranchCommand(
             ScmProviderRepository repository,
             ScmFileSet fileSet,
             String branchName,
@@ -58,8 +57,8 @@ protected ScmResult executeBranchCommand(
     }
 
     /** {@inheritDoc} */
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public BranchScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         String branchName = parameters.getString(CommandParameter.BRANCH_NAME);
 
         ScmBranchParameters scmBranchParameters =
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/changelog/AbstractChangeLogCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/changelog/AbstractChangeLogCommand.java
index 1dd6f01cc..8097f030d 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/changelog/AbstractChangeLogCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/changelog/AbstractChangeLogCommand.java
@@ -25,7 +25,6 @@
 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.ScmVersion;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -35,7 +34,7 @@
  * @author Olivier Lamy
  *
  */
-public abstract class AbstractChangeLogCommand extends AbstractCommand implements ChangeLogCommand {
+public abstract class AbstractChangeLogCommand extends AbstractCommand<ChangeLogScmResult> implements ChangeLogCommand {
     @Deprecated
     protected abstract ChangeLogScmResult executeChangeLogCommand(
             ScmProviderRepository repository,
@@ -67,8 +66,8 @@ protected ChangeLogScmResult executeChangeLogCommand(
     /**
      * {@inheritDoc}
      */
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public ChangeLogScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         Date startDate = parameters.getDate(CommandParameter.START_DATE, null);
 
         Date endDate = parameters.getDate(CommandParameter.END_DATE, null);
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/checkin/AbstractCheckInCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/checkin/AbstractCheckInCommand.java
index c09abd374..ccb808427 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/checkin/AbstractCheckInCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/checkin/AbstractCheckInCommand.java
@@ -22,7 +22,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -33,15 +32,15 @@
  * @author Olivier Lamy
  *
  */
-public abstract class AbstractCheckInCommand extends AbstractCommand {
+public abstract class AbstractCheckInCommand extends AbstractCommand<CheckInScmResult> {
     public static final String NAME = "check-in";
 
     protected abstract CheckInScmResult executeCheckInCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, String message, ScmVersion scmVersion)
             throws ScmException;
 
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public CheckInScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         String message = parameters.getString(CommandParameter.MESSAGE);
 
         ScmVersion scmVersion = parameters.getScmVersion(CommandParameter.SCM_VERSION, null);
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/checkout/AbstractCheckOutCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/checkout/AbstractCheckOutCommand.java
index 90ce3f40d..8abd816b8 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/checkout/AbstractCheckOutCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/checkout/AbstractCheckOutCommand.java
@@ -22,7 +22,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -33,7 +32,7 @@
  * @author Olivier Lamy
  *
  */
-public abstract class AbstractCheckOutCommand extends AbstractCommand {
+public abstract class AbstractCheckOutCommand extends AbstractCommand<CheckOutScmResult> {
     /**
      * Execute Check out command line in a recursive check out way.
      *
@@ -70,8 +69,8 @@ protected abstract CheckOutScmResult executeCheckOutCommand(
             throws ScmException;
 
     /** {@inheritDoc} */
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public CheckOutScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         ScmVersion scmVersion = parameters.getScmVersion(CommandParameter.SCM_VERSION, null);
         boolean recursive = parameters.getBoolean(CommandParameter.RECURSIVE, true);
         boolean shallow = parameters.getBoolean(CommandParameter.SHALLOW, false);
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/diff/AbstractDiffCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/diff/AbstractDiffCommand.java
index 37d549546..97b9d3020 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/diff/AbstractDiffCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/diff/AbstractDiffCommand.java
@@ -22,7 +22,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -37,13 +36,13 @@
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  *
  */
-public abstract class AbstractDiffCommand extends AbstractCommand {
+public abstract class AbstractDiffCommand extends AbstractCommand<DiffScmResult> {
     protected abstract DiffScmResult executeDiffCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, ScmVersion startRevision, ScmVersion endRevision)
             throws ScmException;
 
     /** {@inheritDoc} */
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
+    public DiffScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
         ScmVersion startRevision = parameters.getScmVersion(CommandParameter.START_SCM_VERSION, null);
 
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/edit/AbstractEditCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/edit/AbstractEditCommand.java
index 333de68cf..5ffc0a253 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/edit/AbstractEditCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/edit/AbstractEditCommand.java
@@ -21,20 +21,19 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
 /**
  *
  */
-public abstract class AbstractEditCommand extends AbstractCommand {
+public abstract class AbstractEditCommand extends AbstractCommand<EditScmResult> {
     /** {@inheritDoc} */
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public EditScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         return executeEditCommand(repository, fileSet);
     }
 
-    protected abstract ScmResult executeEditCommand(ScmProviderRepository repository, ScmFileSet fileSet)
+    protected abstract EditScmResult executeEditCommand(ScmProviderRepository repository, ScmFileSet fileSet)
             throws ScmException;
 }
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/export/AbstractExportCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/export/AbstractExportCommand.java
index 1de37edec..825098633 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/export/AbstractExportCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/export/AbstractExportCommand.java
@@ -22,7 +22,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -31,13 +30,13 @@
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  *
  */
-public abstract class AbstractExportCommand extends AbstractCommand {
+public abstract class AbstractExportCommand extends AbstractCommand<ExportScmResult> {
     protected abstract ExportScmResult executeExportCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, ScmVersion scmVersion, String outputDirectory)
             throws ScmException;
 
     /** {@inheritDoc} */
-    protected ScmResult executeCommand(
+    protected ExportScmResult executeCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         ScmVersion scmVersion = parameters.getScmVersion(CommandParameter.SCM_VERSION, null);
 
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/fileinfo/AbstractFileInfoCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/fileinfo/AbstractFileInfoCommand.java
index a3a40bed7..f978a6d5e 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/fileinfo/AbstractFileInfoCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/fileinfo/AbstractFileInfoCommand.java
@@ -30,9 +30,10 @@
 /**
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
- *
+ * @deprecated since 1.11.0, use {@link org.apache.maven.scm.command.fileinfo.FileInfoCommand} instead.
  */
-public abstract class AbstractFileInfoCommand extends AbstractCommand {
+@Deprecated
+public abstract class AbstractFileInfoCommand extends AbstractCommand<ScmResult> {
     protected abstract ScmResult executeFileInfoCommand(
             ScmProviderRepository repository, File workingDirectory, String filename) throws ScmException;
 
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/info/InfoScmResult.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/info/InfoScmResult.java
index 0c4e963be..d0082999c 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/info/InfoScmResult.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/info/InfoScmResult.java
@@ -26,6 +26,7 @@
 /**
  * @author <a href="mailto:kenney@apache.org">Kenney Westerhof</a>
  * @author Olivier Lamy
+ * TODO: which command uses this class?
  *
  */
 public class InfoScmResult extends ScmResult {
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/list/AbstractListCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/list/AbstractListCommand.java
index ed7cb581e..99be3b279 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/list/AbstractListCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/list/AbstractListCommand.java
@@ -22,7 +22,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -31,7 +30,7 @@
  * @author <a href="mailto:carlos@apache.org">Carlos Sanchez</a>
  *
  */
-public abstract class AbstractListCommand extends AbstractCommand {
+public abstract class AbstractListCommand extends AbstractCommand<ListScmResult> {
     /**
      * List contents of the remote repository
      *
@@ -47,8 +46,8 @@ protected abstract ListScmResult executeListCommand(
             throws ScmException;
 
     /** {@inheritDoc} */
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public ListScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         if (fileSet.getFileList().isEmpty()) {
             throw new IllegalArgumentException("fileSet can not be empty");
         }
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/login/AbstractLoginCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/login/AbstractLoginCommand.java
index 7dac7ee17..9a81b0d82 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/login/AbstractLoginCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/login/AbstractLoginCommand.java
@@ -21,7 +21,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
@@ -29,12 +28,12 @@
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  *
  */
-public abstract class AbstractLoginCommand extends AbstractCommand {
+public abstract class AbstractLoginCommand extends AbstractCommand<LoginScmResult> {
     public abstract LoginScmResult executeLoginCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException;
 
     /** {@inheritDoc} */
-    protected ScmResult executeCommand(
+    protected LoginScmResult executeCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         return executeLoginCommand(repository, fileSet, parameters);
     }
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/mkdir/AbstractMkdirCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/mkdir/AbstractMkdirCommand.java
index e2534b113..5755ad244 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/mkdir/AbstractMkdirCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/mkdir/AbstractMkdirCommand.java
@@ -22,7 +22,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
@@ -30,7 +29,7 @@
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  *
  */
-public abstract class AbstractMkdirCommand extends AbstractCommand {
+public abstract class AbstractMkdirCommand extends AbstractCommand<MkdirScmResult> {
     /**
      * Creates directories in the remote repository.
      *
@@ -46,7 +45,7 @@ protected abstract MkdirScmResult executeMkdirCommand(
             throws ScmException;
 
     /** {@inheritDoc} */
-    protected ScmResult executeCommand(
+    protected MkdirScmResult executeCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         if (fileSet.getFileList().isEmpty()) {
             throw new IllegalArgumentException("fileSet can not be empty");
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/remoteinfo/AbstractRemoteInfoCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/remoteinfo/AbstractRemoteInfoCommand.java
index 00aa1b5eb..793471f72 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/remoteinfo/AbstractRemoteInfoCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/remoteinfo/AbstractRemoteInfoCommand.java
@@ -21,7 +21,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
@@ -29,13 +28,13 @@
  * @author Olivier Lamy
  * @since 1.6
  */
-public abstract class AbstractRemoteInfoCommand extends AbstractCommand {
+public abstract class AbstractRemoteInfoCommand extends AbstractCommand<RemoteInfoScmResult> {
 
     public abstract RemoteInfoScmResult executeRemoteInfoCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException;
 
     @Override
-    protected ScmResult executeCommand(
+    protected RemoteInfoScmResult executeCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         return executeRemoteInfoCommand(repository, fileSet, parameters);
     }
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/remove/AbstractRemoveCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/remove/AbstractRemoveCommand.java
index a89c230b3..151f58364 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/remove/AbstractRemoveCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/remove/AbstractRemoveCommand.java
@@ -22,7 +22,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
@@ -31,12 +30,12 @@
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
  *
  */
-public abstract class AbstractRemoveCommand extends AbstractCommand {
-    protected abstract ScmResult executeRemoveCommand(
+public abstract class AbstractRemoveCommand extends AbstractCommand<RemoveScmResult> {
+    protected abstract RemoveScmResult executeRemoveCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, String message) throws ScmException;
 
     /** {@inheritDoc} */
-    protected ScmResult executeCommand(
+    protected RemoveScmResult executeCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         String message = parameters.getString(CommandParameter.MESSAGE);
 
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/status/AbstractStatusCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/status/AbstractStatusCommand.java
index 5b48be64f..549d28159 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/status/AbstractStatusCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/status/AbstractStatusCommand.java
@@ -21,7 +21,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
@@ -29,13 +28,13 @@
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  *
  */
-public abstract class AbstractStatusCommand extends AbstractCommand {
+public abstract class AbstractStatusCommand extends AbstractCommand<StatusScmResult> {
     protected abstract StatusScmResult executeStatusCommand(ScmProviderRepository repository, ScmFileSet fileSet)
             throws ScmException;
 
     /** {@inheritDoc} */
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public StatusScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         return executeStatusCommand(repository, fileSet);
     }
 }
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/tag/AbstractTagCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/tag/AbstractTagCommand.java
index 0dec628c8..41223e134 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/tag/AbstractTagCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/tag/AbstractTagCommand.java
@@ -22,7 +22,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmTagParameters;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -32,7 +31,7 @@
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
  *
  */
-public abstract class AbstractTagCommand extends AbstractCommand {
+public abstract class AbstractTagCommand extends AbstractCommand<TagScmResult> {
     /**
      * @deprecated use method {@link #executeTagCommand(ScmProviderRepository, ScmFileSet, String, ScmTagParameters)}
      * @param repository TODO
@@ -42,18 +41,18 @@ public abstract class AbstractTagCommand extends AbstractCommand {
      * @return TODO
      * @throws ScmException if any
      */
-    protected ScmResult executeTagCommand(
+    protected TagScmResult executeTagCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, String tagName, String message) throws ScmException {
         return executeTagCommand(repository, fileSet, tagName, new ScmTagParameters(message));
     }
 
-    protected abstract ScmResult executeTagCommand(
+    protected abstract TagScmResult executeTagCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, String tagName, ScmTagParameters scmTagParameters)
             throws ScmException;
 
     /** {@inheritDoc} */
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public TagScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         String tagName = parameters.getString(CommandParameter.TAG_NAME);
 
         ScmTagParameters scmTagParameters = parameters.getScmTagParameters(CommandParameter.SCM_TAG_PARAMETERS);
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/unedit/AbstractUnEditCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/unedit/AbstractUnEditCommand.java
index 929d2ca7d..b5ab5ed32 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/unedit/AbstractUnEditCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/unedit/AbstractUnEditCommand.java
@@ -21,20 +21,19 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
 /**
  *
  */
-public abstract class AbstractUnEditCommand extends AbstractCommand {
+public abstract class AbstractUnEditCommand extends AbstractCommand<UnEditScmResult> {
     /** {@inheritDoc} */
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public UnEditScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         return executeUnEditCommand(repository, fileSet);
     }
 
-    protected abstract ScmResult executeUnEditCommand(ScmProviderRepository repository, ScmFileSet fileSet)
+    protected abstract UnEditScmResult executeUnEditCommand(ScmProviderRepository repository, ScmFileSet fileSet)
             throws ScmException;
 }
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/untag/AbstractUntagCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/untag/AbstractUntagCommand.java
index da9079e56..6a9c00154 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/untag/AbstractUntagCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/untag/AbstractUntagCommand.java
@@ -22,13 +22,12 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmUntagParameters;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
 /** Removes a tag */
-public abstract class AbstractUntagCommand extends AbstractCommand {
+public abstract class AbstractUntagCommand extends AbstractCommand<UntagScmResult> {
     /**
      * execute untag command
      *
@@ -38,14 +37,14 @@ public abstract class AbstractUntagCommand extends AbstractCommand {
      * @return result of untag command
      * @throws ScmException  in case of error
      */
-    protected abstract ScmResult executeUntagCommand(
+    protected abstract UntagScmResult executeUntagCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, ScmUntagParameters scmUntagParameters)
             throws ScmException;
 
     /** {@inheritDoc} */
     @Override
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public UntagScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         String tagName = parameters.getString(CommandParameter.TAG_NAME);
         String message = parameters.getString(CommandParameter.MESSAGE, "[maven-scm] remove tag " + tagName);
         ScmUntagParameters scmUntagParameters = new ScmUntagParameters(tagName, message);
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/update/AbstractUpdateCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/update/AbstractUpdateCommand.java
index 22521b6f3..423b713f1 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/update/AbstractUpdateCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/update/AbstractUpdateCommand.java
@@ -28,7 +28,6 @@
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFile;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.command.changelog.ChangeLogCommand;
@@ -41,13 +40,13 @@
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
  *
  */
-public abstract class AbstractUpdateCommand extends AbstractCommand {
+public abstract class AbstractUpdateCommand extends AbstractCommand<UpdateScmResult> {
     protected abstract UpdateScmResult executeUpdateCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, ScmVersion scmVersion) throws ScmException;
 
     /** {@inheritDoc} */
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public UpdateScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         ScmVersion scmVersion = parameters.getScmVersion(CommandParameter.SCM_VERSION, null);
 
         boolean runChangelog = Boolean.valueOf(parameters.getString(CommandParameter.RUN_CHANGELOG_WITH_UPDATE, "true"))
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/add/HgAddCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/add/HgAddCommand.java
index 22f722a02..1c2c69c15 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/add/HgAddCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/add/HgAddCommand.java
@@ -25,7 +25,6 @@
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmFileStatus;
 import org.apache.maven.scm.ScmResult;
-import org.apache.maven.scm.command.Command;
 import org.apache.maven.scm.command.add.AbstractAddCommand;
 import org.apache.maven.scm.command.add.AddScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -38,9 +37,9 @@
  * @author <a href="mailto:thurner.rupert@ymono.net">thurner rupert</a>
  *
  */
-public class HgAddCommand extends AbstractAddCommand implements Command {
+public class HgAddCommand extends AbstractAddCommand {
     /** {@inheritDoc} */
-    protected ScmResult executeAddCommand(
+    protected AddScmResult executeAddCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, String message, boolean binary) throws ScmException {
         // String[] addCmd = new String[] { ADD_CMD, NO_RECURSE_OPTION };
         String[] addCmd = new String[] {HgCommandConstants.ADD_CMD, HgCommandConstants.VERBOSE_OPTION};
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/branch/HgBranchCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/branch/HgBranchCommand.java
index d857d16a7..1ebe25b8b 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/branch/HgBranchCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/branch/HgBranchCommand.java
@@ -29,7 +29,6 @@
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmFileStatus;
 import org.apache.maven.scm.ScmResult;
-import org.apache.maven.scm.command.Command;
 import org.apache.maven.scm.command.branch.AbstractBranchCommand;
 import org.apache.maven.scm.command.branch.BranchScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -46,9 +45,9 @@
  * @author Henning Schmiedehausen
  *
  */
-public class HgBranchCommand extends AbstractBranchCommand implements Command {
+public class HgBranchCommand extends AbstractBranchCommand {
 
-    protected ScmResult executeBranchCommand(
+    protected BranchScmResult executeBranchCommand(
             ScmProviderRepository scmProviderRepository, ScmFileSet fileSet, String branch, String message)
             throws ScmException {
         return executeBranchCommand(scmProviderRepository, fileSet, branch, new ScmBranchParameters(message));
@@ -57,7 +56,7 @@ protected ScmResult executeBranchCommand(
     /**
      * {@inheritDoc}
      */
-    protected ScmResult executeBranchCommand(
+    protected BranchScmResult executeBranchCommand(
             ScmProviderRepository scmProviderRepository,
             ScmFileSet fileSet,
             String branch,
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/changelog/HgChangeLogCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/changelog/HgChangeLogCommand.java
index e09e7fad8..c6d853099 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/changelog/HgChangeLogCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/changelog/HgChangeLogCommand.java
@@ -30,7 +30,6 @@
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
-import org.apache.maven.scm.command.Command;
 import org.apache.maven.scm.command.changelog.AbstractChangeLogCommand;
 import org.apache.maven.scm.command.changelog.ChangeLogScmRequest;
 import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
@@ -43,7 +42,7 @@
  * @author <a href="mailto:thurner.rupert@ymono.net">thurner rupert</a>
  * @author Olivier Lamy
  */
-public class HgChangeLogCommand extends AbstractChangeLogCommand implements Command {
+public class HgChangeLogCommand extends AbstractChangeLogCommand {
     /**
      * {@inheritDoc}
      */
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/checkout/HgCheckOutCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/checkout/HgCheckOutCommand.java
index fc0b737dd..08b1f33a4 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/checkout/HgCheckOutCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/checkout/HgCheckOutCommand.java
@@ -28,7 +28,6 @@
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
-import org.apache.maven.scm.command.Command;
 import org.apache.maven.scm.command.checkout.AbstractCheckOutCommand;
 import org.apache.maven.scm.command.checkout.CheckOutScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -43,7 +42,7 @@
  * @author Olivier Lamy
  *
  */
-public class HgCheckOutCommand extends AbstractCheckOutCommand implements Command {
+public class HgCheckOutCommand extends AbstractCheckOutCommand {
     /**
      * {@inheritDoc}
      */
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/diff/HgDiffCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/diff/HgDiffCommand.java
index e3ab4825f..7115822c3 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/diff/HgDiffCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/diff/HgDiffCommand.java
@@ -23,7 +23,6 @@
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
-import org.apache.maven.scm.command.Command;
 import org.apache.maven.scm.command.diff.AbstractDiffCommand;
 import org.apache.maven.scm.command.diff.DiffScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -34,7 +33,7 @@
  * @author <a href="mailto:thurner.rupert@ymono.net">thurner rupert</a>
  *
  */
-public class HgDiffCommand extends AbstractDiffCommand implements Command {
+public class HgDiffCommand extends AbstractDiffCommand {
     /** {@inheritDoc} */
     protected DiffScmResult executeDiffCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, ScmVersion startRevision, ScmVersion endRevision)
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/info/HgInfoCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/info/HgInfoCommand.java
index cf8a27192..1e363a462 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/info/HgInfoCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/info/HgInfoCommand.java
@@ -23,7 +23,6 @@
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
-import org.apache.maven.scm.command.Command;
 import org.apache.maven.scm.command.info.InfoScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 import org.apache.maven.scm.provider.hg.HgUtils;
@@ -33,10 +32,10 @@
  * @author Olivier Lamy
  * @since 1.5
  */
-public class HgInfoCommand extends AbstractCommand implements Command {
+public class HgInfoCommand extends AbstractCommand<InfoScmResult> {
 
     @Override
-    protected ScmResult executeCommand(
+    protected InfoScmResult executeCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         String[] revCmd = new String[] {HgCommandConstants.REVNO_CMD, "-i"};
         HgInfoConsumer consumer = new HgInfoConsumer();
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgListCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgListCommand.java
index 2c11233d7..2ee7b7c46 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgListCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgListCommand.java
@@ -24,7 +24,6 @@
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
-import org.apache.maven.scm.command.Command;
 import org.apache.maven.scm.command.list.AbstractListCommand;
 import org.apache.maven.scm.command.list.ListScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -37,7 +36,7 @@
  * @author <a href="mailto:ryan@darksleep.com">ryan daum</a>
  *
  */
-public class HgListCommand extends AbstractListCommand implements Command {
+public class HgListCommand extends AbstractListCommand {
     /** {@inheritDoc} */
     protected ListScmResult executeListCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, boolean recursive, ScmVersion scmVersion)
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/remove/HgRemoveCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/remove/HgRemoveCommand.java
index 24a0e86ac..a5c034f5a 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/remove/HgRemoveCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/remove/HgRemoveCommand.java
@@ -23,7 +23,6 @@
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
-import org.apache.maven.scm.command.Command;
 import org.apache.maven.scm.command.remove.AbstractRemoveCommand;
 import org.apache.maven.scm.command.remove.RemoveScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -34,9 +33,9 @@
  * @author <a href="mailto:thurner.rupert@ymono.net">thurner rupert</a>
  *
  */
-public class HgRemoveCommand extends AbstractRemoveCommand implements Command {
+public class HgRemoveCommand extends AbstractRemoveCommand {
     /** {@inheritDoc} */
-    protected ScmResult executeRemoveCommand(ScmProviderRepository repository, ScmFileSet fileSet, String message)
+    protected RemoveScmResult executeRemoveCommand(ScmProviderRepository repository, ScmFileSet fileSet, String message)
             throws ScmException {
 
         String[] command = new String[] {HgCommandConstants.REMOVE_CMD};
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/status/HgStatusCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/status/HgStatusCommand.java
index 0641e295b..7429794f4 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/status/HgStatusCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/status/HgStatusCommand.java
@@ -23,7 +23,6 @@
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
-import org.apache.maven.scm.command.Command;
 import org.apache.maven.scm.command.status.AbstractStatusCommand;
 import org.apache.maven.scm.command.status.StatusScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -33,7 +32,7 @@
 /**
  * @author <a href="mailto:thurner.rupert@ymono.net">thurner rupert</a>
  */
-public class HgStatusCommand extends AbstractStatusCommand implements Command {
+public class HgStatusCommand extends AbstractStatusCommand {
 
     public HgStatusCommand() {
         super();
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java
index 3e0ffa660..6a85f036a 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java
@@ -28,7 +28,6 @@
 import org.apache.maven.scm.ScmFileStatus;
 import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmTagParameters;
-import org.apache.maven.scm.command.Command;
 import org.apache.maven.scm.command.tag.AbstractTagCommand;
 import org.apache.maven.scm.command.tag.TagScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -45,9 +44,9 @@
  * @author Olivier Lamy
  *
  */
-public class HgTagCommand extends AbstractTagCommand implements Command {
+public class HgTagCommand extends AbstractTagCommand {
 
-    protected ScmResult executeTagCommand(
+    protected TagScmResult executeTagCommand(
             ScmProviderRepository scmProviderRepository, ScmFileSet fileSet, String tag, String message)
             throws ScmException {
         return executeTagCommand(scmProviderRepository, fileSet, tag, new ScmTagParameters(message));
@@ -56,7 +55,7 @@ protected ScmResult executeTagCommand(
     /**
      * {@inheritDoc}
      */
-    protected ScmResult executeTagCommand(
+    protected TagScmResult executeTagCommand(
             ScmProviderRepository scmProviderRepository,
             ScmFileSet fileSet,
             String tag,
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/update/HgUpdateCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/update/HgUpdateCommand.java
index 8a80be9e4..06f68903b 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/update/HgUpdateCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/update/HgUpdateCommand.java
@@ -30,7 +30,6 @@
 import org.apache.maven.scm.ScmFileStatus;
 import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
-import org.apache.maven.scm.command.Command;
 import org.apache.maven.scm.command.changelog.ChangeLogCommand;
 import org.apache.maven.scm.command.update.AbstractUpdateCommand;
 import org.apache.maven.scm.command.update.UpdateScmResult;
@@ -47,7 +46,7 @@
  * @author Olivier Lamy
  *
  */
-public class HgUpdateCommand extends AbstractUpdateCommand implements Command {
+public class HgUpdateCommand extends AbstractUpdateCommand {
     /** {@inheritDoc} */
     protected UpdateScmResult executeUpdateCommand(ScmProviderRepository repo, ScmFileSet fileSet, ScmVersion tag)
             throws ScmException {
diff --git a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/LocalScmProvider.java b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/LocalScmProvider.java
index 8c1abd6d9..1ce6be088 100644
--- a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/LocalScmProvider.java
+++ b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/LocalScmProvider.java
@@ -138,7 +138,7 @@ public StatusScmResult status(ScmProviderRepository repository, ScmFileSet fileS
             throws ScmException {
         LocalStatusCommand command = new LocalStatusCommand();
 
-        return (StatusScmResult) command.execute(repository, fileSet, parameters);
+        return command.execute(repository, fileSet, parameters);
     }
 
     /** {@inheritDoc} */
@@ -147,7 +147,7 @@ public TagScmResult tag(ScmProviderRepository repository, ScmFileSet fileSet, Co
             throws ScmException {
         LocalTagCommand command = new LocalTagCommand();
 
-        return (TagScmResult) command.execute(repository, fileSet, parameters);
+        return command.execute(repository, fileSet, parameters);
     }
 
     /** {@inheritDoc} */
@@ -156,7 +156,7 @@ public AddScmResult add(ScmProviderRepository repository, ScmFileSet fileSet, Co
             throws ScmException {
         LocalAddCommand command = new LocalAddCommand();
 
-        return (AddScmResult) command.execute(repository, fileSet, parameters);
+        return command.execute(repository, fileSet, parameters);
     }
 
     /** {@inheritDoc} */
@@ -174,7 +174,7 @@ public CheckInScmResult checkin(ScmProviderRepository repository, ScmFileSet fil
             throws ScmException {
         LocalCheckInCommand command = new LocalCheckInCommand();
 
-        return (CheckInScmResult) command.execute(repository, fileSet, parameters);
+        return command.execute(repository, fileSet, parameters);
     }
 
     /** {@inheritDoc} */
diff --git a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/LocalCommand.java b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/LocalCommand.java
index e3b39ef13..8d5ec7747 100644
--- a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/LocalCommand.java
+++ b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/LocalCommand.java
@@ -18,10 +18,12 @@
  */
 package org.apache.maven.scm.provider.local.command;
 
+import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.Command;
 
 /**
+ * @param <T> the type of the result returned by this command
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
  *
  */
-public interface LocalCommand extends Command {}
+public interface LocalCommand<T extends ScmResult> extends Command<T> {}
diff --git a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/add/LocalAddCommand.java b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/add/LocalAddCommand.java
index 3f4e0efad..659d4a8a6 100644
--- a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/add/LocalAddCommand.java
+++ b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/add/LocalAddCommand.java
@@ -26,7 +26,6 @@
 import org.apache.maven.scm.ScmFile;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmFileStatus;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.add.AbstractAddCommand;
 import org.apache.maven.scm.command.add.AddScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -37,9 +36,9 @@
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  *
  */
-public class LocalAddCommand extends AbstractAddCommand implements LocalCommand {
+public class LocalAddCommand extends AbstractAddCommand implements LocalCommand<AddScmResult> {
     /** {@inheritDoc} */
-    protected ScmResult executeAddCommand(
+    protected AddScmResult executeAddCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, String message, boolean binary) throws ScmException {
         LocalScmProviderRepository localRepo = (LocalScmProviderRepository) repository;
 
diff --git a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/changelog/LocalChangeLogCommand.java b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/changelog/LocalChangeLogCommand.java
index eca02275e..a39901ce6 100644
--- a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/changelog/LocalChangeLogCommand.java
+++ b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/changelog/LocalChangeLogCommand.java
@@ -33,6 +33,7 @@
 import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
 import org.apache.maven.scm.command.changelog.ChangeLogSet;
 import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.local.command.LocalCommand;
 import org.apache.maven.scm.provider.local.repository.LocalScmProviderRepository;
 import org.codehaus.plexus.util.FileUtils;
 
@@ -41,7 +42,7 @@
  * @author Olivier Lamy
  *
  */
-public class LocalChangeLogCommand extends AbstractChangeLogCommand {
+public class LocalChangeLogCommand extends AbstractChangeLogCommand implements LocalCommand<ChangeLogScmResult> {
     /** {@inheritDoc} */
     protected ChangeLogScmResult executeChangeLogCommand(
             ScmProviderRepository repository,
diff --git a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/checkin/LocalCheckInCommand.java b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/checkin/LocalCheckInCommand.java
index 89582f390..b3a99c27e 100644
--- a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/checkin/LocalCheckInCommand.java
+++ b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/checkin/LocalCheckInCommand.java
@@ -41,7 +41,7 @@
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
  *
  */
-public class LocalCheckInCommand extends AbstractCheckInCommand implements LocalCommand {
+public class LocalCheckInCommand extends AbstractCheckInCommand implements LocalCommand<CheckInScmResult> {
     /** {@inheritDoc} */
     protected CheckInScmResult executeCheckInCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, String message, ScmVersion version) throws ScmException {
diff --git a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/checkout/LocalCheckOutCommand.java b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/checkout/LocalCheckOutCommand.java
index f6653f58b..58c0d0819 100644
--- a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/checkout/LocalCheckOutCommand.java
+++ b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/checkout/LocalCheckOutCommand.java
@@ -40,7 +40,7 @@
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
  *
  */
-public class LocalCheckOutCommand extends AbstractCheckOutCommand implements LocalCommand {
+public class LocalCheckOutCommand extends AbstractCheckOutCommand implements LocalCommand<CheckOutScmResult> {
     /** {@inheritDoc} */
     protected CheckOutScmResult executeCheckOutCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, ScmVersion version, boolean recursive, boolean shallow)
diff --git a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/list/LocalListCommand.java b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/list/LocalListCommand.java
index 004346742..d88e403f8 100644
--- a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/list/LocalListCommand.java
+++ b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/list/LocalListCommand.java
@@ -31,13 +31,14 @@
 import org.apache.maven.scm.command.list.AbstractListCommand;
 import org.apache.maven.scm.command.list.ListScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.local.command.LocalCommand;
 import org.apache.maven.scm.provider.local.repository.LocalScmProviderRepository;
 
 /**
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  *
  */
-public class LocalListCommand extends AbstractListCommand {
+public class LocalListCommand extends AbstractListCommand implements LocalCommand<ListScmResult> {
     /** {@inheritDoc} */
     protected ListScmResult executeListCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, boolean recursive, ScmVersion version) throws ScmException {
diff --git a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/mkdir/LocalMkdirCommand.java b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/mkdir/LocalMkdirCommand.java
index 457c995a0..af893c6ea 100644
--- a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/mkdir/LocalMkdirCommand.java
+++ b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/mkdir/LocalMkdirCommand.java
@@ -32,6 +32,7 @@
 import org.apache.maven.scm.command.mkdir.AbstractMkdirCommand;
 import org.apache.maven.scm.command.mkdir.MkdirScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.local.command.LocalCommand;
 import org.apache.maven.scm.provider.local.command.add.LocalAddCommand;
 import org.apache.maven.scm.provider.local.repository.LocalScmProviderRepository;
 import org.codehaus.plexus.util.FileUtils;
@@ -40,7 +41,7 @@
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  *
  */
-public class LocalMkdirCommand extends AbstractMkdirCommand {
+public class LocalMkdirCommand extends AbstractMkdirCommand implements LocalCommand<MkdirScmResult> {
     protected MkdirScmResult executeMkdirCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, String message, boolean createInLocal)
             throws ScmException {
diff --git a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/status/LocalStatusCommand.java b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/status/LocalStatusCommand.java
index 8738f247f..766b04000 100644
--- a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/status/LocalStatusCommand.java
+++ b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/status/LocalStatusCommand.java
@@ -31,7 +31,7 @@
  * @author <a href="mailto:matthewm@ambientideas.com">Matthew McCullough</a>
  *
  */
-public class LocalStatusCommand extends AbstractStatusCommand implements LocalCommand {
+public class LocalStatusCommand extends AbstractStatusCommand implements LocalCommand<StatusScmResult> {
     /** {@inheritDoc} */
     protected StatusScmResult executeStatusCommand(ScmProviderRepository repository, ScmFileSet fileSet)
             throws ScmException {
diff --git a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/tag/LocalTagCommand.java b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/tag/LocalTagCommand.java
index 7b498af25..a43afa80f 100644
--- a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/tag/LocalTagCommand.java
+++ b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/tag/LocalTagCommand.java
@@ -22,7 +22,6 @@
 
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmTagParameters;
 import org.apache.maven.scm.command.tag.AbstractTagCommand;
 import org.apache.maven.scm.command.tag.TagScmResult;
@@ -34,9 +33,9 @@
  * @author Olivier Lamy
  *
  */
-public class LocalTagCommand extends AbstractTagCommand implements LocalCommand {
+public class LocalTagCommand extends AbstractTagCommand implements LocalCommand<TagScmResult> {
     /** {@inheritDoc} */
-    protected ScmResult executeTagCommand(
+    protected TagScmResult executeTagCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, String message, ScmTagParameters scmTagParameters)
             throws ScmException {
         return new TagScmResult(null, Collections.emptyList());
@@ -44,7 +43,7 @@ protected ScmResult executeTagCommand(
 
     // Satisfies deprecated interface
     /** {@inheritDoc} */
-    protected ScmResult executeTagCommand(
+    protected TagScmResult executeTagCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, String tagName, String message) throws ScmException {
         return new TagScmResult(null, Collections.emptyList());
     }
diff --git a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/update/LocalUpdateCommand.java b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/update/LocalUpdateCommand.java
index bff005eff..078ba940d 100644
--- a/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/update/LocalUpdateCommand.java
+++ b/maven-scm-providers/maven-scm-provider-local/src/main/java/org/apache/maven/scm/provider/local/command/update/LocalUpdateCommand.java
@@ -45,7 +45,7 @@
  * @author Olivier Lamy
  *
  */
-public class LocalUpdateCommand extends AbstractUpdateCommand implements LocalCommand {
+public class LocalUpdateCommand extends AbstractUpdateCommand implements LocalCommand<UpdateScmResult> {
     /** {@inheritDoc} */
     protected UpdateScmResult executeUpdateCommand(ScmProviderRepository repo, ScmFileSet fileSet, ScmVersion version)
             throws ScmException {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/AbstractGitScmProvider.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/AbstractGitScmProvider.java
index c4cc398bc..662c23937 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/AbstractGitScmProvider.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/AbstractGitScmProvider.java
@@ -154,141 +154,140 @@ private ScmUrlParserResult parseScmUrl(String scmSpecificUrl, char delimiter) th
         return result;
     }
 
-    protected abstract GitCommand getAddCommand();
+    protected abstract GitCommand<AddScmResult> getAddCommand();
 
     /** {@inheritDoc} */
     public AddScmResult add(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (AddScmResult) executeCommand(getAddCommand(), repository, fileSet, parameters);
+        return executeCommand(getAddCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getBranchCommand();
+    protected abstract GitCommand<BranchScmResult> getBranchCommand();
 
     /** {@inheritDoc} */
     protected BranchScmResult branch(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (BranchScmResult) executeCommand(getBranchCommand(), repository, fileSet, parameters);
+        return executeCommand(getBranchCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getChangeLogCommand();
+    protected abstract GitCommand<ChangeLogScmResult> getChangeLogCommand();
 
     /** {@inheritDoc} */
     public ChangeLogScmResult changelog(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
-        return (ChangeLogScmResult) executeCommand(getChangeLogCommand(), repository, fileSet, parameters);
+        return executeCommand(getChangeLogCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getCheckInCommand();
+    protected abstract GitCommand<CheckInScmResult> getCheckInCommand();
 
     /** {@inheritDoc} */
     public CheckInScmResult checkin(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (CheckInScmResult) executeCommand(getCheckInCommand(), repository, fileSet, parameters);
+        return executeCommand(getCheckInCommand(), repository, fileSet, parameters);
     }
 
     @Override
     public CheckInScmResult checkIn(ScmRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (CheckInScmResult) getCheckInCommand().execute(repository.getProviderRepository(), fileSet, parameters);
+        return getCheckInCommand().execute(repository.getProviderRepository(), fileSet, parameters);
     }
 
-    protected abstract GitCommand getCheckOutCommand();
+    protected abstract GitCommand<CheckOutScmResult> getCheckOutCommand();
 
     /** {@inheritDoc} */
     public CheckOutScmResult checkout(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
-        return (CheckOutScmResult) executeCommand(getCheckOutCommand(), repository, fileSet, parameters);
+        return executeCommand(getCheckOutCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getDiffCommand();
+    protected abstract GitCommand<DiffScmResult> getDiffCommand();
 
     /** {@inheritDoc} */
     public DiffScmResult diff(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (DiffScmResult) executeCommand(getDiffCommand(), repository, fileSet, parameters);
+        return executeCommand(getDiffCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getExportCommand();
+    protected abstract GitCommand<ExportScmResult> getExportCommand();
 
     /** {@inheritDoc} */
     protected ExportScmResult export(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (ExportScmResult) executeCommand(getExportCommand(), repository, fileSet, parameters);
+        return executeCommand(getExportCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getRemoveCommand();
+    protected abstract GitCommand<RemoveScmResult> getRemoveCommand();
 
     /** {@inheritDoc} */
     public RemoveScmResult remove(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (RemoveScmResult) executeCommand(getRemoveCommand(), repository, fileSet, parameters);
+        return executeCommand(getRemoveCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getStatusCommand();
+    protected abstract GitCommand<StatusScmResult> getStatusCommand();
 
     /** {@inheritDoc} */
     public StatusScmResult status(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (StatusScmResult) executeCommand(getStatusCommand(), repository, fileSet, parameters);
+        return executeCommand(getStatusCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getTagCommand();
+    protected abstract GitCommand<TagScmResult> getTagCommand();
 
     /** {@inheritDoc} */
     public TagScmResult tag(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (TagScmResult) executeCommand(getTagCommand(), repository, fileSet, parameters);
+        return executeCommand(getTagCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getUntagCommand();
+    protected abstract GitCommand<UntagScmResult> getUntagCommand();
 
     /** {@inheritDoc} */
     public UntagScmResult untag(ScmRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (UntagScmResult)
-                executeCommand(getUntagCommand(), repository.getProviderRepository(), fileSet, parameters);
+        return executeCommand(getUntagCommand(), repository.getProviderRepository(), fileSet, parameters);
     }
 
-    protected abstract GitCommand getUpdateCommand();
+    protected abstract GitCommand<UpdateScmResult> getUpdateCommand();
 
     /** {@inheritDoc} */
     public UpdateScmResult update(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (UpdateScmResult) executeCommand(getUpdateCommand(), repository, fileSet, parameters);
+        return executeCommand(getUpdateCommand(), repository, fileSet, parameters);
     }
 
-    protected ScmResult executeCommand(
-            GitCommand command, ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
+    protected <T extends ScmResult> T executeCommand(
+            GitCommand<T> command, ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
         return command.execute(repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getInfoCommand();
+    protected abstract GitCommand<InfoScmResult> getInfoCommand();
 
     public InfoScmResult info(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        GitCommand cmd = getInfoCommand();
+        GitCommand<InfoScmResult> cmd = getInfoCommand();
 
-        return (InfoScmResult) executeCommand(cmd, repository, fileSet, parameters);
+        return executeCommand(cmd, repository, fileSet, parameters);
     }
 
     /** {@inheritDoc} */
     protected BlameScmResult blame(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        GitCommand cmd = getBlameCommand();
+        GitCommand<BlameScmResult> cmd = getBlameCommand();
 
-        return (BlameScmResult) executeCommand(cmd, repository, fileSet, parameters);
+        return executeCommand(cmd, repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getBlameCommand();
+    protected abstract GitCommand<BlameScmResult> getBlameCommand();
 
     /** {@inheritDoc} */
     public RemoteInfoScmResult remoteInfo(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
-        GitCommand cmd = getRemoteInfoCommand();
+        GitCommand<RemoteInfoScmResult> cmd = getRemoteInfoCommand();
 
-        return (RemoteInfoScmResult) executeCommand(cmd, repository, fileSet, parameters);
+        return executeCommand(cmd, repository, fileSet, parameters);
     }
 
-    protected abstract GitCommand getRemoteInfoCommand();
+    protected abstract GitCommand<RemoteInfoScmResult> getRemoteInfoCommand();
 }
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/command/GitCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/command/GitCommand.java
index 50dd61158..b7edc5084 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/command/GitCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/command/GitCommand.java
@@ -18,10 +18,13 @@
  */
 package org.apache.maven.scm.provider.git.command;
 
+import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.Command;
 
 /**
+ * Interface for Git commands.
+ * @param <T> the type of the result returned by this command
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
  *
  */
-public interface GitCommand extends Command {}
+public interface GitCommand<T extends ScmResult> extends Command<T> {}
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/add/GitAddCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/add/GitAddCommand.java
index 922045df0..e87b17268 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/add/GitAddCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/add/GitAddCommand.java
@@ -28,7 +28,6 @@
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFile;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.add.AbstractAddCommand;
 import org.apache.maven.scm.command.add.AddScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -44,11 +43,11 @@
 /**
  * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
  */
-public class GitAddCommand extends AbstractAddCommand implements GitCommand {
+public class GitAddCommand extends AbstractAddCommand implements GitCommand<AddScmResult> {
     /**
      * {@inheritDoc}
      */
-    protected ScmResult executeAddCommand(
+    protected AddScmResult executeAddCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, String message, boolean binary) throws ScmException {
         GitScmProviderRepository repository = (GitScmProviderRepository) repo;
 
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java
index b6b8350be..306cb60e4 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java
@@ -24,7 +24,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.blame.AbstractBlameCommand;
 import org.apache.maven.scm.command.blame.BlameScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -38,10 +37,10 @@
  * @author Olivier Lamy
  * @since 1.4
  */
-public class GitBlameCommand extends AbstractBlameCommand implements GitCommand {
+public class GitBlameCommand extends AbstractBlameCommand implements GitCommand<BlameScmResult> {
 
     @Override
-    protected ScmResult executeCommand(
+    protected BlameScmResult executeCommand(
             ScmProviderRepository repository, ScmFileSet workingDirectory, CommandParameters parameters)
             throws ScmException {
         String filename = parameters.getString(CommandParameter.FILE);
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitBranchCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitBranchCommand.java
index fb3c130db..e861943fc 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitBranchCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitBranchCommand.java
@@ -24,7 +24,6 @@
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmFileStatus;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.branch.AbstractBranchCommand;
 import org.apache.maven.scm.command.branch.BranchScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -40,7 +39,7 @@
  * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
  *
  */
-public class GitBranchCommand extends AbstractBranchCommand implements GitCommand {
+public class GitBranchCommand extends AbstractBranchCommand implements GitCommand<BranchScmResult> {
     private final Map<String, String> environmentVariables;
 
     public GitBranchCommand(Map<String, String> environmentVariables) {
@@ -48,8 +47,8 @@ public GitBranchCommand(Map<String, String> environmentVariables) {
     }
 
     /** {@inheritDoc} */
-    public ScmResult executeBranchCommand(ScmProviderRepository repo, ScmFileSet fileSet, String branch, String message)
-            throws ScmException {
+    public BranchScmResult executeBranchCommand(
+            ScmProviderRepository repo, ScmFileSet fileSet, String branch, String message) throws ScmException {
         if (branch == null || branch.trim().isEmpty()) {
             throw new ScmException("branch name must be specified");
         }
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogCommand.java
index 6fa930824..b1e9ad182 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogCommand.java
@@ -29,7 +29,6 @@
 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.ScmVersion;
 import org.apache.maven.scm.command.changelog.AbstractChangeLogCommand;
 import org.apache.maven.scm.command.changelog.ChangeLogScmRequest;
@@ -47,12 +46,12 @@
  * @author Olivier Lamy
  *
  */
-public class GitChangeLogCommand extends AbstractChangeLogCommand implements GitCommand {
+public class GitChangeLogCommand extends AbstractChangeLogCommand implements GitCommand<ChangeLogScmResult> {
     private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss Z";
 
     @Override
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public ChangeLogScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         return executeChangeLogCommand(
                 repository,
                 fileSet,
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java
index 94c166f75..235e633f0 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java
@@ -53,7 +53,7 @@
  * @author Olivier Lamy
  *
  */
-public class GitCheckInCommand extends AbstractCheckInCommand implements GitCommand {
+public class GitCheckInCommand extends AbstractCheckInCommand implements GitCommand<CheckInScmResult> {
     private final Map<String, String> environmentVariables;
 
     public GitCheckInCommand(Map<String, String> environmentVariables) {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java
index 9ff18288e..abe4b2113 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java
@@ -28,7 +28,6 @@
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmFileStatus;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmTag;
 import org.apache.maven.scm.ScmVersion;
 import org.apache.maven.scm.command.checkout.AbstractCheckOutCommand;
@@ -48,7 +47,7 @@
  * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
  *
  */
-public class GitCheckOutCommand extends AbstractCheckOutCommand implements GitCommand {
+public class GitCheckOutCommand extends AbstractCheckOutCommand implements GitCommand<CheckOutScmResult> {
     private final Map<String, String> environmentVariables;
 
     public GitCheckOutCommand(Map<String, String> environmentVariables) {
@@ -65,8 +64,8 @@ public GitCheckOutCommand(Map<String, String> environmentVariables) {
      * {@inheritDoc}
      */
     @Override
-    public ScmResult executeCommand(ScmProviderRepository repo, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public CheckOutScmResult executeCommand(
+            ScmProviderRepository repo, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         ScmVersion version = parameters.getScmVersion(CommandParameter.SCM_VERSION, null);
         boolean binary = parameters.getBoolean(CommandParameter.BINARY, false);
         boolean shallow = parameters.getBoolean(CommandParameter.SHALLOW, false);
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/diff/GitDiffCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/diff/GitDiffCommand.java
index 98ede5731..70d408bab 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/diff/GitDiffCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/diff/GitDiffCommand.java
@@ -37,7 +37,7 @@
  * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
  *
  */
-public class GitDiffCommand extends AbstractDiffCommand implements GitCommand {
+public class GitDiffCommand extends AbstractDiffCommand implements GitCommand<DiffScmResult> {
     /** {@inheritDoc} */
     protected DiffScmResult executeDiffCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, ScmVersion startVersion, ScmVersion endVersion)
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/info/GitInfoCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/info/GitInfoCommand.java
index 7e398d526..c7853e111 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/info/GitInfoCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/info/GitInfoCommand.java
@@ -27,7 +27,6 @@
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.command.info.InfoItem;
 import org.apache.maven.scm.command.info.InfoScmResult;
@@ -42,12 +41,12 @@
  * @author Olivier Lamy
  * @since 1.5
  */
-public class GitInfoCommand extends AbstractCommand implements GitCommand {
+public class GitInfoCommand extends AbstractCommand<InfoScmResult> implements GitCommand<InfoScmResult> {
 
     public static final int NO_REVISION_LENGTH = -1;
 
     @Override
-    protected ScmResult executeCommand(
+    protected InfoScmResult executeCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
 
         Commandline baseCli = GitCommandLineUtils.getBaseGitCommandLine(fileSet.getBasedir(), "log");
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remoteinfo/GitRemoteInfoCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remoteinfo/GitRemoteInfoCommand.java
index 5fc7f7ffc..243f7c7fb 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remoteinfo/GitRemoteInfoCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remoteinfo/GitRemoteInfoCommand.java
@@ -35,7 +35,7 @@
 /**
  * @author Bertrand Paquet
  */
-public class GitRemoteInfoCommand extends AbstractRemoteInfoCommand implements GitCommand {
+public class GitRemoteInfoCommand extends AbstractRemoteInfoCommand implements GitCommand<RemoteInfoScmResult> {
     private final Map<String, String> environmentVariables;
 
     public GitRemoteInfoCommand(Map<String, String> environmentVariables) {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveCommand.java
index 8a3227367..aaf654cec 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveCommand.java
@@ -24,7 +24,6 @@
 
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.remove.AbstractRemoveCommand;
 import org.apache.maven.scm.command.remove.RemoveScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -39,11 +38,11 @@
  * @author Olivier Lamy
  *
  */
-public class GitRemoveCommand extends AbstractRemoveCommand implements GitCommand {
+public class GitRemoveCommand extends AbstractRemoveCommand implements GitCommand<RemoveScmResult> {
     /**
      * {@inheritDoc}
      */
-    protected ScmResult executeRemoveCommand(ScmProviderRepository repo, ScmFileSet fileSet, String message)
+    protected RemoveScmResult executeRemoveCommand(ScmProviderRepository repo, ScmFileSet fileSet, String message)
             throws ScmException {
 
         if (fileSet.getFileList().isEmpty()) {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusCommand.java
index ac6086a20..1ad59d57a 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusCommand.java
@@ -36,7 +36,7 @@
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  *
  */
-public class GitStatusCommand extends AbstractStatusCommand implements GitCommand {
+public class GitStatusCommand extends AbstractStatusCommand implements GitCommand<StatusScmResult> {
     /** {@inheritDoc} */
     protected StatusScmResult executeStatusCommand(ScmProviderRepository repo, ScmFileSet fileSet) throws ScmException {
         int exitCode;
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
index e12c09208..b93cc520a 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
@@ -25,9 +25,7 @@
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmFileStatus;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmTagParameters;
-import org.apache.maven.scm.command.checkout.CheckOutScmResult;
 import org.apache.maven.scm.command.tag.AbstractTagCommand;
 import org.apache.maven.scm.command.tag.TagScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -44,20 +42,20 @@
  * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
  *
  */
-public class GitTagCommand extends AbstractTagCommand implements GitCommand {
+public class GitTagCommand extends AbstractTagCommand implements GitCommand<TagScmResult> {
     private final Map<String, String> environmentVariables;
 
     public GitTagCommand(Map<String, String> environmentVariables) {
         this.environmentVariables = environmentVariables;
     }
 
-    public ScmResult executeTagCommand(ScmProviderRepository repo, ScmFileSet fileSet, String tag, String message)
+    public TagScmResult executeTagCommand(ScmProviderRepository repo, ScmFileSet fileSet, String tag, String message)
             throws ScmException {
         return executeTagCommand(repo, fileSet, tag, new ScmTagParameters(message));
     }
 
     /** {@inheritDoc} */
-    public ScmResult executeTagCommand(
+    public TagScmResult executeTagCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, String tag, ScmTagParameters scmTagParameters)
             throws ScmException {
         if (tag == null || tag.trim().isEmpty()) {
@@ -119,7 +117,7 @@ public ScmResult executeTagCommand(
 
             exitCode = GitCommandLineUtils.execute(clList, listConsumer, stderr);
             if (exitCode != 0) {
-                return new CheckOutScmResult(
+                return new TagScmResult(
                         clList.toString(), "The git-ls-files command failed.", stderr.getOutput(), false);
             }
 
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/untag/GitUntagCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/untag/GitUntagCommand.java
index 8abf00f4e..5d2763040 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/untag/GitUntagCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/untag/GitUntagCommand.java
@@ -23,7 +23,6 @@
 
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmUntagParameters;
 import org.apache.maven.scm.command.untag.AbstractUntagCommand;
 import org.apache.maven.scm.command.untag.UntagScmResult;
@@ -35,7 +34,7 @@
 import org.codehaus.plexus.util.cli.Commandline;
 
 /** {@inheritDoc} */
-public class GitUntagCommand extends AbstractUntagCommand implements GitCommand {
+public class GitUntagCommand extends AbstractUntagCommand implements GitCommand<UntagScmResult> {
     private final Map<String, String> environmentVariables;
 
     public GitUntagCommand(Map<String, String> environmentVariables) {
@@ -43,7 +42,7 @@ public GitUntagCommand(Map<String, String> environmentVariables) {
     }
 
     /** {@inheritDoc} */
-    public ScmResult executeUntagCommand(
+    public UntagScmResult executeUntagCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, ScmUntagParameters scmUntagParameters) throws ScmException {
         String tag = scmUntagParameters.getTag();
         if (tag == null || tag.trim().isEmpty()) {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/update/GitUpdateCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/update/GitUpdateCommand.java
index 1682b5d26..05c54d8b0 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/update/GitUpdateCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/update/GitUpdateCommand.java
@@ -44,7 +44,7 @@
  * @since 10 august 2008
  *
  */
-public class GitUpdateCommand extends AbstractUpdateCommand implements GitCommand {
+public class GitUpdateCommand extends AbstractUpdateCommand implements GitCommand<UpdateScmResult> {
     /** {@inheritDoc} */
     protected UpdateScmResult executeUpdateCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, ScmVersion scmVersion) throws ScmException {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/JGitScmProvider.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/JGitScmProvider.java
index 2bc872cf5..807a9b579 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/JGitScmProvider.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/JGitScmProvider.java
@@ -26,7 +26,22 @@
 
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.add.AddScmResult;
+import org.apache.maven.scm.command.blame.BlameScmResult;
+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.export.ExportScmResult;
 import org.apache.maven.scm.command.info.InfoScmResult;
+import org.apache.maven.scm.command.list.ListScmResult;
+import org.apache.maven.scm.command.remoteinfo.RemoteInfoScmResult;
+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.untag.UntagScmResult;
+import org.apache.maven.scm.command.update.UpdateScmResult;
 import org.apache.maven.scm.provider.git.AbstractGitScmProvider;
 import org.apache.maven.scm.provider.git.command.GitCommand;
 import org.apache.maven.scm.provider.git.jgit.command.PlexusInteractivityCredentialsProvider;
@@ -73,7 +88,7 @@ public void setInteractive(boolean interactive) {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getAddCommand() {
+    protected GitCommand<AddScmResult> getAddCommand() {
         return new JGitAddCommand();
     }
 
@@ -81,7 +96,7 @@ protected GitCommand getAddCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getBranchCommand() {
+    protected GitCommand<BranchScmResult> getBranchCommand() {
         return new JGitBranchCommand();
     }
 
@@ -89,7 +104,7 @@ protected GitCommand getBranchCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getChangeLogCommand() {
+    protected GitCommand<ChangeLogScmResult> getChangeLogCommand() {
         return new JGitChangeLogCommand();
     }
 
@@ -97,7 +112,7 @@ protected GitCommand getChangeLogCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getCheckInCommand() {
+    protected GitCommand<CheckInScmResult> getCheckInCommand() {
         return new JGitCheckInCommand();
     }
 
@@ -105,7 +120,7 @@ protected GitCommand getCheckInCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getCheckOutCommand() {
+    protected GitCommand<CheckOutScmResult> getCheckOutCommand() {
         return new JGitCheckOutCommand();
     }
 
@@ -113,7 +128,7 @@ protected GitCommand getCheckOutCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getDiffCommand() {
+    protected GitCommand<DiffScmResult> getDiffCommand() {
         return new JGitDiffCommand();
     }
 
@@ -121,7 +136,7 @@ protected GitCommand getDiffCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getExportCommand() {
+    protected GitCommand<ExportScmResult> getExportCommand() {
         throw new UnsupportedOperationException("getExportCommand");
     }
 
@@ -129,7 +144,7 @@ protected GitCommand getExportCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getRemoveCommand() {
+    protected GitCommand<RemoveScmResult> getRemoveCommand() {
         return new JGitRemoveCommand();
     }
 
@@ -137,7 +152,7 @@ protected GitCommand getRemoveCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getStatusCommand() {
+    protected GitCommand<StatusScmResult> getStatusCommand() {
         return new JGitStatusCommand();
     }
 
@@ -145,7 +160,7 @@ protected GitCommand getStatusCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getTagCommand() {
+    protected GitCommand<TagScmResult> getTagCommand() {
         return new JGitTagCommand();
     }
 
@@ -153,7 +168,7 @@ protected GitCommand getTagCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getUntagCommand() {
+    protected GitCommand<UntagScmResult> getUntagCommand() {
         return new JGitUntagCommand();
     }
 
@@ -161,14 +176,14 @@ protected GitCommand getUntagCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getUpdateCommand() {
+    protected GitCommand<UpdateScmResult> getUpdateCommand() {
         throw new UnsupportedOperationException("getUpdateCommand");
     }
 
     /**
      * {@inheritDoc}
      */
-    protected GitCommand getListCommand() {
+    protected GitCommand<ListScmResult> getListCommand() {
         return new JGitListCommand();
     }
 
@@ -176,7 +191,7 @@ protected GitCommand getListCommand() {
      * {@inheritDoc}
      */
     @Override
-    public GitCommand getInfoCommand() {
+    public GitCommand<InfoScmResult> getInfoCommand() {
         return new JGitInfoCommand();
     }
 
@@ -202,7 +217,7 @@ protected String getRepositoryURL(File path) throws ScmException {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getBlameCommand() {
+    protected GitCommand<BlameScmResult> getBlameCommand() {
         return new JGitBlameCommand();
     }
 
@@ -210,7 +225,7 @@ protected GitCommand getBlameCommand() {
      * {@inheritDoc}
      */
     @Override
-    protected GitCommand getRemoteInfoCommand() {
+    protected GitCommand<RemoteInfoScmResult> getRemoteInfoCommand() {
         return new JGitRemoteInfoCommand();
     }
 }
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/add/JGitAddCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/add/JGitAddCommand.java
index 75396dd47..86deb7318 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/add/JGitAddCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/add/JGitAddCommand.java
@@ -23,7 +23,6 @@
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFile;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.add.AbstractAddCommand;
 import org.apache.maven.scm.command.add.AddScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -36,11 +35,11 @@
  * @author Dominik Bartholdi (imod)
  * @since 1.9
  */
-public class JGitAddCommand extends AbstractAddCommand implements GitCommand {
+public class JGitAddCommand extends AbstractAddCommand implements GitCommand<AddScmResult> {
     /**
      * {@inheritDoc}
      */
-    protected ScmResult executeAddCommand(
+    protected AddScmResult executeAddCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, String message, boolean binary) throws ScmException {
 
         if (fileSet.getFileList().isEmpty()) {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/blame/JGitBlameCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/blame/JGitBlameCommand.java
index 684074b6c..21e2de00f 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/blame/JGitBlameCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/blame/JGitBlameCommand.java
@@ -37,7 +37,7 @@
  * @author Dominik Bartholdi (imod)
  * @since 1.9
  */
-public class JGitBlameCommand extends AbstractBlameCommand implements GitCommand {
+public class JGitBlameCommand extends AbstractBlameCommand implements GitCommand<BlameScmResult> {
 
     @Override
     public BlameScmResult executeBlameCommand(ScmProviderRepository repo, ScmFileSet workingDirectory, String filename)
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/branch/JGitBranchCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/branch/JGitBranchCommand.java
index 05ad6986c..5e4f73503 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/branch/JGitBranchCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/branch/JGitBranchCommand.java
@@ -30,7 +30,6 @@
 import org.apache.maven.scm.ScmFile;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmFileStatus;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.branch.AbstractBranchCommand;
 import org.apache.maven.scm.command.branch.BranchScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -57,7 +56,7 @@
  * @since 1.9
  */
 public class JGitBranchCommand extends AbstractBranchCommand
-        implements GitCommand, CustomizableSshSessionFactoryCommand {
+        implements GitCommand<BranchScmResult>, CustomizableSshSessionFactoryCommand {
 
     private BiFunction<GitScmProviderRepository, Logger, ScmProviderAwareSshdSessionFactory> sshSessionFactorySupplier;
 
@@ -76,7 +75,7 @@ public void setSshSessionFactorySupplier(
      * {@inheritDoc}
      */
     @Override
-    protected ScmResult executeBranchCommand(
+    protected BranchScmResult executeBranchCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, String branch, String message) throws ScmException {
         if (branch == null || branch.trim().isEmpty()) {
             throw new ScmException("branch name must be specified");
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/changelog/JGitChangeLogCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/changelog/JGitChangeLogCommand.java
index b32ae91d1..236aacceb 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/changelog/JGitChangeLogCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/changelog/JGitChangeLogCommand.java
@@ -49,7 +49,7 @@
  * @author Dominik Bartholdi (imod)
  * @since 1.9
  */
-public class JGitChangeLogCommand extends AbstractChangeLogCommand implements GitCommand {
+public class JGitChangeLogCommand extends AbstractChangeLogCommand implements GitCommand<ChangeLogScmResult> {
 
     /**
      * {@inheritDoc}
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/checkin/JGitCheckInCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/checkin/JGitCheckInCommand.java
index 5b5ae5930..ab2234c5d 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/checkin/JGitCheckInCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/checkin/JGitCheckInCommand.java
@@ -74,7 +74,7 @@
  * @since 1.9
  */
 public class JGitCheckInCommand extends AbstractCheckInCommand
-        implements GitCommand, CustomizableSshSessionFactoryCommand {
+        implements GitCommand<CheckInScmResult>, CustomizableSshSessionFactoryCommand {
 
     protected static final String GIT_MAVEN_SECTION = "maven-scm";
 
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/checkout/JGitCheckOutCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/checkout/JGitCheckOutCommand.java
index e08419726..92e9a3d28 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/checkout/JGitCheckOutCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/checkout/JGitCheckOutCommand.java
@@ -63,7 +63,7 @@
  * @since 1.9
  */
 public class JGitCheckOutCommand extends AbstractCheckOutCommand
-        implements GitCommand, CustomizableSshSessionFactoryCommand {
+        implements GitCommand<CheckOutScmResult>, CustomizableSshSessionFactoryCommand {
     private BiFunction<GitScmProviderRepository, Logger, ScmProviderAwareSshdSessionFactory> sshSessionFactorySupplier;
 
     public JGitCheckOutCommand() {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/diff/JGitDiffCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/diff/JGitDiffCommand.java
index 3fc6cd84b..c723c6771 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/diff/JGitDiffCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/diff/JGitDiffCommand.java
@@ -44,7 +44,7 @@
  * @author Dominik Bartholdi (imod)
  * @since 1.9
  */
-public class JGitDiffCommand extends AbstractDiffCommand implements GitCommand {
+public class JGitDiffCommand extends AbstractDiffCommand implements GitCommand<DiffScmResult> {
 
     @Override
     protected DiffScmResult executeDiffCommand(
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/info/JGitInfoCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/info/JGitInfoCommand.java
index 06a93dc0c..eb7f20f5e 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/info/JGitInfoCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/info/JGitInfoCommand.java
@@ -49,9 +49,9 @@
 /**
  * @since 1.9.5
  */
-public class JGitInfoCommand extends AbstractCommand implements GitCommand {
+public class JGitInfoCommand extends AbstractCommand<InfoScmResult> implements GitCommand<InfoScmResult> {
     @Override
-    protected ScmResult executeCommand(
+    protected InfoScmResult executeCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         File basedir = fileSet.getBasedir();
         Git git = null;
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/list/JGitListCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/list/JGitListCommand.java
index 2edeabdf2..85ae4beda 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/list/JGitListCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/list/JGitListCommand.java
@@ -45,7 +45,7 @@
  * @author Dominik Bartholdi (imod)
  * @since 1.9
  */
-public class JGitListCommand extends AbstractListCommand implements GitCommand {
+public class JGitListCommand extends AbstractListCommand implements GitCommand<ListScmResult> {
 
     private BiFunction<GitScmProviderRepository, Logger, ScmProviderAwareSshdSessionFactory> sshSessionFactorySupplier;
 
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/remoteinfo/JGitRemoteInfoCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/remoteinfo/JGitRemoteInfoCommand.java
index f02dbb305..3b5901956 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/remoteinfo/JGitRemoteInfoCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/remoteinfo/JGitRemoteInfoCommand.java
@@ -45,7 +45,7 @@
  * @author Dominik Bartholdi (imod)
  * @since 1.9
  */
-public class JGitRemoteInfoCommand extends AbstractRemoteInfoCommand implements GitCommand {
+public class JGitRemoteInfoCommand extends AbstractRemoteInfoCommand implements GitCommand<RemoteInfoScmResult> {
 
     private BiFunction<GitScmProviderRepository, Logger, ScmProviderAwareSshdSessionFactory> sshSessionFactorySupplier;
 
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/remove/JGitRemoveCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/remove/JGitRemoveCommand.java
index 4e47e7a3d..919a13110 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/remove/JGitRemoveCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/remove/JGitRemoveCommand.java
@@ -23,7 +23,6 @@
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFile;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.remove.AbstractRemoveCommand;
 import org.apache.maven.scm.command.remove.RemoveScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -35,10 +34,10 @@
  * @author Georg Tsakumagos
  * @since 2.0.0-M2
  */
-public class JGitRemoveCommand extends AbstractRemoveCommand implements GitCommand {
+public class JGitRemoveCommand extends AbstractRemoveCommand implements GitCommand<RemoveScmResult> {
 
     @Override
-    protected ScmResult executeRemoveCommand(ScmProviderRepository repository, ScmFileSet fileSet, String message)
+    protected RemoveScmResult executeRemoveCommand(ScmProviderRepository repository, ScmFileSet fileSet, String message)
             throws ScmException {
 
         if (fileSet.getFileList().isEmpty()) {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/status/JGitStatusCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/status/JGitStatusCommand.java
index baf6dadcb..56bda8cf8 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/status/JGitStatusCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/status/JGitStatusCommand.java
@@ -39,7 +39,7 @@
  * @author Dominik Bartholdi (imod)
  * @since 1.9
  */
-public class JGitStatusCommand extends AbstractStatusCommand implements GitCommand {
+public class JGitStatusCommand extends AbstractStatusCommand implements GitCommand<StatusScmResult> {
     /**
      * {@inheritDoc}
      */
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/tag/JGitTagCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/tag/JGitTagCommand.java
index 075ed4b32..bb369b5d2 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/tag/JGitTagCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/tag/JGitTagCommand.java
@@ -27,7 +27,6 @@
 import org.apache.maven.scm.ScmFile;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmFileStatus;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmTagParameters;
 import org.apache.maven.scm.command.tag.AbstractTagCommand;
 import org.apache.maven.scm.command.tag.TagScmResult;
@@ -53,7 +52,8 @@
  * @author Dominik Bartholdi (imod)
  * @since 1.9
  */
-public class JGitTagCommand extends AbstractTagCommand implements GitCommand, CustomizableSshSessionFactoryCommand {
+public class JGitTagCommand extends AbstractTagCommand
+        implements GitCommand<TagScmResult>, CustomizableSshSessionFactoryCommand {
 
     private BiFunction<GitScmProviderRepository, Logger, ScmProviderAwareSshdSessionFactory> sshSessionFactorySupplier;
 
@@ -68,7 +68,7 @@ public void setSshSessionFactorySupplier(
         this.sshSessionFactorySupplier = sshSessionFactorySupplier;
     }
 
-    public ScmResult executeTagCommand(ScmProviderRepository repo, ScmFileSet fileSet, String tag, String message)
+    public TagScmResult executeTagCommand(ScmProviderRepository repo, ScmFileSet fileSet, String tag, String message)
             throws ScmException {
         return executeTagCommand(repo, fileSet, tag, new ScmTagParameters(message));
     }
@@ -76,7 +76,7 @@ public ScmResult executeTagCommand(ScmProviderRepository repo, ScmFileSet fileSe
     /**
      * {@inheritDoc}
      */
-    public ScmResult executeTagCommand(
+    public TagScmResult executeTagCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, String tag, ScmTagParameters scmTagParameters)
             throws ScmException {
         if (tag == null || tag.trim().isEmpty()) {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/untag/JGitUntagCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/untag/JGitUntagCommand.java
index 6fea4bff3..27c1737ff 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/untag/JGitUntagCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/untag/JGitUntagCommand.java
@@ -24,7 +24,6 @@
 
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmUntagParameters;
 import org.apache.maven.scm.command.untag.AbstractUntagCommand;
 import org.apache.maven.scm.command.untag.UntagScmResult;
@@ -44,7 +43,8 @@
 import org.slf4j.Logger;
 
 /** {@inheritDoc} */
-public class JGitUntagCommand extends AbstractUntagCommand implements GitCommand, CustomizableSshSessionFactoryCommand {
+public class JGitUntagCommand extends AbstractUntagCommand
+        implements GitCommand<UntagScmResult>, CustomizableSshSessionFactoryCommand {
 
     private BiFunction<GitScmProviderRepository, Logger, ScmProviderAwareSshdSessionFactory> sshSessionFactorySupplier;
 
@@ -60,7 +60,7 @@ public void setSshSessionFactorySupplier(
     }
 
     @Override
-    protected ScmResult executeUntagCommand(
+    protected UntagScmResult executeUntagCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, ScmUntagParameters scmUntagParameters)
             throws ScmException {
         String tagName = scmUntagParameters.getTag();
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/test/java/org/apache/maven/scm/provider/git/jgit/JGitTestScmProvider.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/test/java/org/apache/maven/scm/provider/git/jgit/JGitTestScmProvider.java
index 5d387f3b7..a824b2578 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/test/java/org/apache/maven/scm/provider/git/jgit/JGitTestScmProvider.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/test/java/org/apache/maven/scm/provider/git/jgit/JGitTestScmProvider.java
@@ -25,6 +25,12 @@
 
 import java.util.function.Consumer;
 
+import org.apache.maven.scm.command.branch.BranchScmResult;
+import org.apache.maven.scm.command.checkin.CheckInScmResult;
+import org.apache.maven.scm.command.checkout.CheckOutScmResult;
+import org.apache.maven.scm.command.remoteinfo.RemoteInfoScmResult;
+import org.apache.maven.scm.command.tag.TagScmResult;
+import org.apache.maven.scm.command.untag.UntagScmResult;
 import org.apache.maven.scm.provider.ScmProvider;
 import org.apache.maven.scm.provider.git.command.GitCommand;
 import org.apache.maven.scm.provider.git.jgit.command.CustomizableSshSessionFactoryCommand;
@@ -81,7 +87,7 @@ public void registerBranchCommandCallback(Consumer<? super JGitBranchCommand> gi
     }
 
     @Override
-    protected GitCommand getCheckInCommand() {
+    protected GitCommand<CheckInScmResult> getCheckInCommand() {
         JGitCheckInCommand command = (JGitCheckInCommand) super.getCheckInCommand();
         if (checkInCommandCallback != null) {
             checkInCommandCallback.accept(command);
@@ -90,7 +96,7 @@ protected GitCommand getCheckInCommand() {
     }
 
     @Override
-    protected GitCommand getCheckOutCommand() {
+    protected GitCommand<CheckOutScmResult> getCheckOutCommand() {
         JGitCheckOutCommand command = (JGitCheckOutCommand) super.getCheckOutCommand();
         if (checkOutCommandCallback != null) {
             checkOutCommandCallback.accept(command);
@@ -99,7 +105,7 @@ protected GitCommand getCheckOutCommand() {
     }
 
     @Override
-    protected GitCommand getRemoteInfoCommand() {
+    protected GitCommand<RemoteInfoScmResult> getRemoteInfoCommand() {
         JGitRemoteInfoCommand command = (JGitRemoteInfoCommand) super.getRemoteInfoCommand();
         if (remoteInfoCommandCallback != null) {
             remoteInfoCommandCallback.accept(command);
@@ -108,7 +114,7 @@ protected GitCommand getRemoteInfoCommand() {
     }
 
     @Override
-    protected GitCommand getBranchCommand() {
+    protected GitCommand<BranchScmResult> getBranchCommand() {
         JGitBranchCommand command = (JGitBranchCommand) super.getBranchCommand();
         if (branchCommandCallback != null) {
             branchCommandCallback.accept(command);
@@ -117,7 +123,7 @@ protected GitCommand getBranchCommand() {
     }
 
     @Override
-    protected GitCommand getTagCommand() {
+    protected GitCommand<TagScmResult> getTagCommand() {
         JGitTagCommand command = (JGitTagCommand) super.getTagCommand();
         if (tagCommandCallback != null) {
             tagCommandCallback.accept(command);
@@ -126,7 +132,7 @@ protected GitCommand getTagCommand() {
     }
 
     @Override
-    protected GitCommand getUntagCommand() {
+    protected GitCommand<UntagScmResult> getUntagCommand() {
         JGitUntagCommand command = (JGitUntagCommand) super.getUntagCommand();
         if (untagCommandCallback != null) {
             untagCommandCallback.accept(command);
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java
index 79e561140..2d2a6e8bb 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java
@@ -247,107 +247,107 @@ else if (scmSpecificUrl.startsWith("svn+")) {
         return result;
     }
 
-    protected abstract SvnCommand getAddCommand();
+    protected abstract SvnCommand<AddScmResult> getAddCommand();
 
     /**
      * {@inheritDoc}
      */
     public AddScmResult add(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (AddScmResult) executeCommand(getAddCommand(), repository, fileSet, parameters);
+        return executeCommand(getAddCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getBranchCommand();
+    protected abstract SvnCommand<BranchScmResult> getBranchCommand();
 
     /**
      * {@inheritDoc}
      */
     protected BranchScmResult branch(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (BranchScmResult) executeCommand(getBranchCommand(), repository, fileSet, parameters);
+        return executeCommand(getBranchCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getChangeLogCommand();
+    protected abstract SvnCommand<ChangeLogScmResult> getChangeLogCommand();
 
     /**
      * {@inheritDoc}
      */
     public ChangeLogScmResult changelog(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
-        return (ChangeLogScmResult) executeCommand(getChangeLogCommand(), repository, fileSet, parameters);
+        return executeCommand(getChangeLogCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getCheckInCommand();
+    protected abstract SvnCommand<CheckInScmResult> getCheckInCommand();
 
     /**
      * {@inheritDoc}
      */
     public CheckInScmResult checkin(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (CheckInScmResult) executeCommand(getCheckInCommand(), repository, fileSet, parameters);
+        return executeCommand(getCheckInCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getCheckOutCommand();
+    protected abstract SvnCommand<CheckOutScmResult> getCheckOutCommand();
 
     /**
      * {@inheritDoc}
      */
     public CheckOutScmResult checkout(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
-        return (CheckOutScmResult) executeCommand(getCheckOutCommand(), repository, fileSet, parameters);
+        return executeCommand(getCheckOutCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getDiffCommand();
+    protected abstract SvnCommand<DiffScmResult> getDiffCommand();
 
     /**
      * {@inheritDoc}
      */
     public DiffScmResult diff(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (DiffScmResult) executeCommand(getDiffCommand(), repository, fileSet, parameters);
+        return executeCommand(getDiffCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getExportCommand();
+    protected abstract SvnCommand<ExportScmResult> getExportCommand();
 
     /**
      * {@inheritDoc}
      */
     protected ExportScmResult export(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (ExportScmResult) executeCommand(getExportCommand(), repository, fileSet, parameters);
+        return executeCommand(getExportCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getRemoveCommand();
+    protected abstract SvnCommand<RemoveScmResult> getRemoveCommand();
 
     /**
      * {@inheritDoc}
      */
     public RemoveScmResult remove(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (RemoveScmResult) executeCommand(getRemoveCommand(), repository, fileSet, parameters);
+        return executeCommand(getRemoveCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getStatusCommand();
+    protected abstract SvnCommand<StatusScmResult> getStatusCommand();
 
     /**
      * {@inheritDoc}
      */
     public StatusScmResult status(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (StatusScmResult) executeCommand(getStatusCommand(), repository, fileSet, parameters);
+        return executeCommand(getStatusCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getTagCommand();
+    protected abstract SvnCommand<TagScmResult> getTagCommand();
 
     /**
      * {@inheritDoc}
      */
     public TagScmResult tag(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (TagScmResult) executeCommand(getTagCommand(), repository, fileSet, parameters);
+        return executeCommand(getTagCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getUntagCommand();
+    protected abstract SvnCommand<UntagScmResult> getUntagCommand();
 
     /**
      * {@inheritDoc}
@@ -355,45 +355,40 @@ public TagScmResult tag(ScmProviderRepository repository, ScmFileSet fileSet, Co
     @Override
     public UntagScmResult untag(ScmRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (UntagScmResult)
-                executeCommand(getUntagCommand(), repository.getProviderRepository(), fileSet, parameters);
+        return executeCommand(getUntagCommand(), repository.getProviderRepository(), fileSet, parameters);
     }
 
-    protected abstract SvnCommand getUpdateCommand();
+    protected abstract SvnCommand<UpdateScmResult> getUpdateCommand();
 
     /**
      * {@inheritDoc}
      */
     public UpdateScmResult update(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        return (UpdateScmResult) executeCommand(getUpdateCommand(), repository, fileSet, parameters);
+        return executeCommand(getUpdateCommand(), repository, fileSet, parameters);
     }
 
-    protected ScmResult executeCommand(
-            SvnCommand command, ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
+    protected <T extends ScmResult> T executeCommand(
+            SvnCommand<T> command, ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
         return command.execute(repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getListCommand();
+    protected abstract SvnCommand<ListScmResult> getListCommand();
 
     /**
      * {@inheritDoc}
      */
     public ListScmResult list(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        SvnCommand cmd = getListCommand();
-
-        return (ListScmResult) executeCommand(cmd, repository, fileSet, parameters);
+        return executeCommand(getListCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getInfoCommand();
+    protected abstract SvnCommand<InfoScmResult> getInfoCommand();
 
     public InfoScmResult info(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        SvnCommand cmd = getInfoCommand();
-
-        return (InfoScmResult) executeCommand(cmd, repository, fileSet, parameters);
+        return executeCommand(getInfoCommand(), repository, fileSet, parameters);
     }
 
     /**
@@ -401,24 +396,20 @@ public InfoScmResult info(ScmProviderRepository repository, ScmFileSet fileSet,
      */
     protected BlameScmResult blame(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        SvnCommand cmd = getBlameCommand();
-
-        return (BlameScmResult) executeCommand(cmd, repository, fileSet, parameters);
+        return executeCommand(getBlameCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getBlameCommand();
+    protected abstract SvnCommand<BlameScmResult> getBlameCommand();
 
     /**
      * {@inheritDoc}
      */
     public MkdirScmResult mkdir(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException {
-        SvnCommand cmd = getMkdirCommand();
-
-        return (MkdirScmResult) executeCommand(cmd, repository, fileSet, parameters);
+        return executeCommand(getMkdirCommand(), repository, fileSet, parameters);
     }
 
-    protected abstract SvnCommand getMkdirCommand();
+    protected abstract SvnCommand<MkdirScmResult> getMkdirCommand();
 
     /**
      * @param repository
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/command/SvnCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/command/SvnCommand.java
index ce0283556..eb7572647 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/command/SvnCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/command/SvnCommand.java
@@ -18,12 +18,14 @@
  */
 package org.apache.maven.scm.provider.svn.command;
 
+import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.Command;
 
 /**
+ * @param <T> the type of the result returned by this command
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
  *
  */
-public interface SvnCommand extends Command {
-    // no-op
+public interface SvnCommand<T extends ScmResult> extends Command<T> {
+    // just a marker wrapping interface for SVN commands
 }
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/add/SvnAddCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/add/SvnAddCommand.java
index a8660fc12..24ed96219 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/add/SvnAddCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/add/SvnAddCommand.java
@@ -24,7 +24,6 @@
 
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.add.AbstractAddCommand;
 import org.apache.maven.scm.command.add.AddScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -39,9 +38,9 @@
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  *
  */
-public class SvnAddCommand extends AbstractAddCommand implements SvnCommand {
+public class SvnAddCommand extends AbstractAddCommand implements SvnCommand<AddScmResult> {
     /** {@inheritDoc} */
-    protected ScmResult executeAddCommand(
+    protected AddScmResult executeAddCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, String message, boolean binary) throws ScmException {
         if (fileSet.getFileList().isEmpty()) {
             throw new ScmException("You must provide at least one file/directory to add");
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/blame/SvnBlameCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/blame/SvnBlameCommand.java
index ceef18619..a6eb52f52 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/blame/SvnBlameCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/blame/SvnBlameCommand.java
@@ -38,7 +38,7 @@
  * @author Olivier Lamy
  * @since 1.4
  */
-public class SvnBlameCommand extends AbstractBlameCommand implements SvnCommand {
+public class SvnBlameCommand extends AbstractBlameCommand implements SvnCommand<BlameScmResult> {
     /**
      * {@inheritDoc}
      */
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/branch/SvnBranchCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/branch/SvnBranchCommand.java
index a89363cce..080819aa6 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/branch/SvnBranchCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/branch/SvnBranchCommand.java
@@ -30,7 +30,6 @@
 import org.apache.maven.scm.ScmFile;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmFileStatus;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.branch.AbstractBranchCommand;
 import org.apache.maven.scm.command.branch.BranchScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -51,9 +50,9 @@
  *
  * TODO since this is just a copy, use that instead.
  */
-public class SvnBranchCommand extends AbstractBranchCommand implements SvnCommand {
+public class SvnBranchCommand extends AbstractBranchCommand implements SvnCommand<BranchScmResult> {
 
-    public ScmResult executeBranchCommand(
+    public BranchScmResult executeBranchCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, String branch, ScmBranchParameters scmBranchParameters)
             throws ScmException {
         if (branch == null || branch.trim().isEmpty()) {
@@ -128,8 +127,8 @@ public ScmResult executeBranchCommand(
     }
 
     /** {@inheritDoc} */
-    public ScmResult executeBranchCommand(ScmProviderRepository repo, ScmFileSet fileSet, String branch, String message)
-            throws ScmException {
+    public BranchScmResult executeBranchCommand(
+            ScmProviderRepository repo, ScmFileSet fileSet, String branch, String message) throws ScmException {
         ScmBranchParameters scmBranchParameters = new ScmBranchParameters(message);
         return executeBranchCommand(repo, fileSet, branch, scmBranchParameters);
     }
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogCommand.java
index bd08d0fbf..dbb8aaf82 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogCommand.java
@@ -30,7 +30,6 @@
 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.ScmTag;
 import org.apache.maven.scm.ScmVersion;
 import org.apache.maven.scm.command.changelog.AbstractChangeLogCommand;
@@ -52,12 +51,12 @@
  * @author Olivier Lamy
  *
  */
-public class SvnChangeLogCommand extends AbstractChangeLogCommand implements SvnCommand {
+public class SvnChangeLogCommand extends AbstractChangeLogCommand implements SvnCommand<ChangeLogScmResult> {
     private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss Z";
 
     @Override
-    public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters)
-            throws ScmException {
+    public ChangeLogScmResult executeCommand(
+            ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
         return executeChangeLogCommand(
                 repository,
                 fileSet,
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkin/SvnCheckInCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkin/SvnCheckInCommand.java
index 7f8ecdc45..f1dda4f59 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkin/SvnCheckInCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkin/SvnCheckInCommand.java
@@ -42,7 +42,7 @@
  * @author Olivier Lamy
  *
  */
-public class SvnCheckInCommand extends AbstractCheckInCommand implements SvnCommand {
+public class SvnCheckInCommand extends AbstractCheckInCommand implements SvnCommand<CheckInScmResult> {
     /** {@inheritDoc} */
     protected CheckInScmResult executeCheckInCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, String message, ScmVersion version) throws ScmException {
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkout/SvnCheckOutCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkout/SvnCheckOutCommand.java
index 6acd729ec..534d4cb3f 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkout/SvnCheckOutCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkout/SvnCheckOutCommand.java
@@ -45,7 +45,7 @@
  * @author Olivier Lamy
  *
  */
-public class SvnCheckOutCommand extends AbstractCheckOutCommand implements SvnCommand {
+public class SvnCheckOutCommand extends AbstractCheckOutCommand implements SvnCommand<CheckOutScmResult> {
     /**
      * {@inheritDoc}
      */
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/diff/SvnDiffCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/diff/SvnDiffCommand.java
index 0fe62e98b..c809c9b1c 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/diff/SvnDiffCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/diff/SvnDiffCommand.java
@@ -41,7 +41,7 @@
  * @author Olivier Lamy
  *
  */
-public class SvnDiffCommand extends AbstractDiffCommand implements SvnCommand {
+public class SvnDiffCommand extends AbstractDiffCommand implements SvnCommand<DiffScmResult> {
     /** {@inheritDoc} */
     protected DiffScmResult executeDiffCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, ScmVersion startVersion, ScmVersion endVersion)
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/export/SvnExeExportCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/export/SvnExeExportCommand.java
index d1fb2f164..bfc4e7185 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/export/SvnExeExportCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/export/SvnExeExportCommand.java
@@ -46,7 +46,7 @@
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  *
  */
-public class SvnExeExportCommand extends AbstractExportCommand implements SvnCommand {
+public class SvnExeExportCommand extends AbstractExportCommand implements SvnCommand<ExportScmResult> {
     /** {@inheritDoc} */
     protected ExportScmResult executeExportCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, ScmVersion version, String outputDirectory)
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/list/SvnListCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/list/SvnListCommand.java
index 4d07e7142..97da605f2 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/list/SvnListCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/list/SvnListCommand.java
@@ -43,7 +43,7 @@
  * @author <a href="mailto:carlos@apache.org">Carlos Sanchez</a>
  *
  */
-public class SvnListCommand extends AbstractListCommand implements SvnCommand {
+public class SvnListCommand extends AbstractListCommand implements SvnCommand<ListScmResult> {
     private static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"));
 
     /** {@inheritDoc} */
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/mkdir/SvnMkdirCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/mkdir/SvnMkdirCommand.java
index a9388ae28..2c29c1df6 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/mkdir/SvnMkdirCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/mkdir/SvnMkdirCommand.java
@@ -41,7 +41,7 @@
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  *
  */
-public class SvnMkdirCommand extends AbstractMkdirCommand implements SvnCommand {
+public class SvnMkdirCommand extends AbstractMkdirCommand implements SvnCommand<MkdirScmResult> {
     /**
      * {@inheritDoc}
      */
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/remoteinfo/SvnRemoteInfoCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/remoteinfo/SvnRemoteInfoCommand.java
index 744afe915..66ce13e2d 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/remoteinfo/SvnRemoteInfoCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/remoteinfo/SvnRemoteInfoCommand.java
@@ -40,7 +40,7 @@
  * @author Olivier Lamy
  * @since 1.6
  */
-public class SvnRemoteInfoCommand extends AbstractRemoteInfoCommand implements SvnCommand {
+public class SvnRemoteInfoCommand extends AbstractRemoteInfoCommand implements SvnCommand<RemoteInfoScmResult> {
     @Override
     public RemoteInfoScmResult executeRemoteInfoCommand(
             ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters) throws ScmException {
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/remove/SvnRemoveCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/remove/SvnRemoveCommand.java
index 369931fd6..e59d440d1 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/remove/SvnRemoveCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/remove/SvnRemoveCommand.java
@@ -24,7 +24,6 @@
 
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.remove.AbstractRemoveCommand;
 import org.apache.maven.scm.command.remove.RemoveScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -40,9 +39,9 @@
  * @author Olivier Lamy
  *
  */
-public class SvnRemoveCommand extends AbstractRemoveCommand implements SvnCommand {
+public class SvnRemoveCommand extends AbstractRemoveCommand implements SvnCommand<RemoveScmResult> {
     /** {@inheritDoc} */
-    protected ScmResult executeRemoveCommand(ScmProviderRepository repository, ScmFileSet fileSet, String message)
+    protected RemoveScmResult executeRemoveCommand(ScmProviderRepository repository, ScmFileSet fileSet, String message)
             throws ScmException {
         if (fileSet.getFileList().isEmpty()) {
             throw new ScmException("You must provide at least one file/directory to remove");
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/status/SvnStatusCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/status/SvnStatusCommand.java
index 2ca6b8b71..20089d546 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/status/SvnStatusCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/status/SvnStatusCommand.java
@@ -35,7 +35,7 @@
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  *
  */
-public class SvnStatusCommand extends AbstractStatusCommand implements SvnCommand {
+public class SvnStatusCommand extends AbstractStatusCommand implements SvnCommand<StatusScmResult> {
     /** {@inheritDoc} */
     protected StatusScmResult executeStatusCommand(ScmProviderRepository repo, ScmFileSet fileSet) throws ScmException {
         Commandline cl = createCommandLine((SvnScmProviderRepository) repo, fileSet);
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnTagCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnTagCommand.java
index b12234e61..77bfafe69 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnTagCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnTagCommand.java
@@ -29,7 +29,6 @@
 import org.apache.maven.scm.ScmFile;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmFileStatus;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmTag;
 import org.apache.maven.scm.ScmTagParameters;
 import org.apache.maven.scm.command.tag.AbstractTagCommand;
@@ -52,9 +51,9 @@
  *
  * TODO since this is just a copy, use that instead.
  */
-public class SvnTagCommand extends AbstractTagCommand implements SvnCommand {
+public class SvnTagCommand extends AbstractTagCommand implements SvnCommand<TagScmResult> {
 
-    public ScmResult executeTagCommand(ScmProviderRepository repo, ScmFileSet fileSet, String tag, String message)
+    public TagScmResult executeTagCommand(ScmProviderRepository repo, ScmFileSet fileSet, String tag, String message)
             throws ScmException {
         ScmTagParameters scmTagParameters = new ScmTagParameters(message);
         // force false to preserve backward comp
@@ -64,7 +63,7 @@ public ScmResult executeTagCommand(ScmProviderRepository repo, ScmFileSet fileSe
     }
 
     /** {@inheritDoc} */
-    public ScmResult executeTagCommand(
+    public TagScmResult executeTagCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, String tag, ScmTagParameters scmTagParameters)
             throws ScmException {
         // NPE free
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnUntagCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnUntagCommand.java
index a830ae7b3..e0d1d3306 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnUntagCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnUntagCommand.java
@@ -23,7 +23,6 @@
 
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
-import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmTag;
 import org.apache.maven.scm.ScmUntagParameters;
 import org.apache.maven.scm.command.untag.AbstractUntagCommand;
@@ -45,11 +44,11 @@
  *
  * @since 1.11.2
  */
-public class SvnUntagCommand extends AbstractUntagCommand implements SvnCommand {
+public class SvnUntagCommand extends AbstractUntagCommand implements SvnCommand<UntagScmResult> {
 
     /** {@inheritDoc} */
     @Override
-    public ScmResult executeUntagCommand(
+    public UntagScmResult executeUntagCommand(
             ScmProviderRepository repo, ScmFileSet fileSet, ScmUntagParameters scmUntagParameters) throws ScmException {
         String tag = scmUntagParameters.getTag();
         if (tag == null || tag.trim().isEmpty()) {
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/update/SvnUpdateCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/update/SvnUpdateCommand.java
index 75286bd99..3d66e2e31 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/update/SvnUpdateCommand.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/update/SvnUpdateCommand.java
@@ -47,7 +47,7 @@
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  *
  */
-public class SvnUpdateCommand extends AbstractUpdateCommand implements SvnCommand {
+public class SvnUpdateCommand extends AbstractUpdateCommand implements SvnCommand<UpdateScmResult> {
     /** {@inheritDoc} */
     protected UpdateScmResult executeUpdateCommand(ScmProviderRepository repo, ScmFileSet fileSet, ScmVersion version)
             throws ScmException {