You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2018/02/10 16:02:52 UTC

[maven-release] 04/21: Switch to ReleaseDescriptorBuilder

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

rfscholte pushed a commit to branch MRELEASE-998
in repository https://gitbox.apache.org/repos/asf/maven-release.git

commit 61c7a0aa7d93c88cd80284bd65bc63ff2c6210da
Author: rfscholte <rf...@apache.org>
AuthorDate: Wed Jan 24 21:49:21 2018 +0100

    Switch to ReleaseDescriptorBuilder
---
 .../release/config/ReleaseDescriptorBuilder.java   |   6 +
 .../maven/shared/release/config/ReleaseUtils.java  |   8 +-
 .../shared/release/phase/MapVersionsPhase.java     |  18 +-
 .../release/phase/RewritePomsForBranchPhase.java   |   4 +-
 .../release/phase/RewritePomsForReleasePhase.java  |   4 +-
 .../maven/shared/release/util/ReleaseUtil.java     |   9 +-
 .../src/main/mdo/release-descriptor.mdo            |  36 -
 .../shared/release/DefaultReleaseManagerTest.java  | 109 +--
 .../PropertiesReleaseDescriptorStoreTest.java      |  32 +-
 .../shared/release/config/ReleaseUtilsTest.java    |  34 +-
 ...tractEditModeRewritingReleasePhaseTestCase.java |  44 +-
 .../AbstractRewritingReleasePhaseTestCase.java     | 258 +++---
 .../release/phase/AbstractScmCommitPhaseTest.java  |  24 +-
 .../phase/BranchInputVariablesPhaseTest.java       | 120 +--
 .../phase/CheckDependencySnapshotsPhaseTest.java   | 274 +++---
 .../shared/release/phase/CheckPomPhaseTest.java    |  56 +-
 .../release/phase/CheckoutProjectFromScmTest.java  |  60 +-
 .../shared/release/phase/EndReleasePhaseTest.java  |   8 +-
 .../phase/GenerateReleasePomsPhaseTest.java        |  80 +-
 .../release/phase/InputVariablesPhaseTest.java     | 162 ++--
 .../phase/MapDevelopmentVersionPhaseIT.java        |  12 +-
 .../shared/release/phase/MapVersionsPhaseTest.java | 938 ++++++++++-----------
 .../release/phase/RemoveReleasePomsPhaseTest.java  |  53 +-
 .../release/phase/RestoreBackupPomsPhaseTest.java  |  15 +-
 .../phase/RewritePomsForBranchPhaseTest.java       | 193 +++--
 .../phase/RewritePomsForDevelopmentPhaseTest.java  | 206 +++--
 .../phase/RewritePomsForReleasePhaseTest.java      | 194 +++--
 .../release/phase/RunCompleteGoalsPhaseTest.java   |  42 +-
 .../release/phase/RunPerformGoalsPhaseTest.java    |  80 +-
 .../release/phase/RunPrepareGoalsPhaseTest.java    |  42 +-
 .../shared/release/phase/ScmBranchPhaseTest.java   | 102 +--
 .../phase/ScmCheckModificationsPhaseTest.java      | 126 +--
 .../phase/ScmCommitDevelopmentPhaseTest.java       |  38 +-
 .../phase/ScmCommitPreparationPhaseTest.java       | 110 +--
 .../shared/release/phase/ScmTagPhaseTest.java      | 102 +--
 .../scm/DefaultScmRepositoryConfiguratorTest.java  |  70 +-
 .../maven/plugins/release/CleanReleaseMojo.java    |   6 +-
 .../plugins/release/PerformReleaseMojoTest.java    | 100 +--
 .../plugins/release/PrepareReleaseMojoTest.java    |  18 +-
 .../plugins/release/StageReleaseMojoTest.java      |  16 +-
 40 files changed, 1880 insertions(+), 1929 deletions(-)

diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java
index 35ed9d9..8b1ed6f 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java
@@ -359,4 +359,10 @@ public class ReleaseDescriptorBuilder
     {
         return releaseDescriptor;
     }
+
+    public void mapReleaseVersion( String string, String string2 )
+    {
+        // TODO Auto-generated method stub
+        
+    }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
index 90f1227..bd7da30 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
@@ -189,12 +189,12 @@ public class ReleaseUtils
             String property = (String) i.next();
             if ( property.startsWith( "project.rel." ) )
             {
-                releaseDescriptor.mapReleaseVersion( property.substring( "project.rel.".length() ),
+                releaseDescriptor.addReleaseVersion( property.substring( "project.rel.".length() ),
                                                      properties.getProperty( property ) );
             }
             else if ( property.startsWith( "project.dev." ) )
             {
-                releaseDescriptor.mapDevelopmentVersion( property.substring( "project.dev.".length() ),
+                releaseDescriptor.addDevelopmentVersion( property.substring( "project.dev.".length() ),
                                                          properties.getProperty( property ) );
             }
             else if ( property.startsWith( "project.scm." ) )
@@ -208,7 +208,7 @@ public class ReleaseUtils
                     {
                         if ( properties.getProperty( "project.scm." + key + ".empty" ) != null )
                         {
-                            releaseDescriptor.mapOriginalScmInfo( key, null );
+                            releaseDescriptor.addOriginalScmInfo( key, null );
                         }
                         else
                         {
@@ -220,7 +220,7 @@ public class ReleaseUtils
                             scm.setTag( properties.getProperty( "project.scm." + key + ".tag" ) );
                             scm.setId( properties.getProperty( "project.scm." + key + ".id" ) );
 
-                            releaseDescriptor.mapOriginalScmInfo( key, scm );
+                            releaseDescriptor.addOriginalScmInfo( key, scm );
                         }
                     }
                 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapVersionsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapVersionsPhase.java
index eedf50a..cde5bf0 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapVersionsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapVersionsPhase.java
@@ -121,16 +121,16 @@ public class MapVersionsPhase
             {
                 if ( releaseDescriptor.isBranchCreation() && convertToBranch )
                 {
-                    releaseDescriptor.mapReleaseVersion( projectId, nextVersion );
+                    releaseDescriptor.addReleaseVersion( projectId, nextVersion );
                 }
                 else
                 {
-                    releaseDescriptor.mapDevelopmentVersion( projectId, nextVersion );
+                    releaseDescriptor.addDevelopmentVersion( projectId, nextVersion );
                 }
             }
             else
             {
-                releaseDescriptor.mapReleaseVersion( projectId, nextVersion );
+                releaseDescriptor.addReleaseVersion( projectId, nextVersion );
             }
 
             for ( MavenProject subProject : reactorProjects )
@@ -152,16 +152,16 @@ public class MapVersionsPhase
 
                     if ( releaseDescriptor.isBranchCreation() && convertToBranch )
                     {
-                        releaseDescriptor.mapReleaseVersion( subProjectId, v );
+                        releaseDescriptor.addReleaseVersion( subProjectId, v );
                     }
                     else
                     {
-                        releaseDescriptor.mapDevelopmentVersion( subProjectId, v );
+                        releaseDescriptor.addDevelopmentVersion( subProjectId, v );
                     }
                 }
                 else
                 {
-                    releaseDescriptor.mapReleaseVersion( subProjectId, nextVersion );
+                    releaseDescriptor.addReleaseVersion( subProjectId, nextVersion );
                 }
             }
         }
@@ -177,16 +177,16 @@ public class MapVersionsPhase
                 {
                     if ( releaseDescriptor.isBranchCreation() && convertToBranch )
                     {
-                        releaseDescriptor.mapReleaseVersion( projectId, nextVersion );
+                        releaseDescriptor.addReleaseVersion( projectId, nextVersion );
                     }
                     else
                     {
-                        releaseDescriptor.mapDevelopmentVersion( projectId, nextVersion );
+                        releaseDescriptor.addDevelopmentVersion( projectId, nextVersion );
                     }
                 }
                 else
                 {
-                    releaseDescriptor.mapReleaseVersion( projectId, nextVersion );
+                    releaseDescriptor.addReleaseVersion( projectId, nextVersion );
                 }
             }
         }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java
index 4d5dd0d..8d64599 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java
@@ -66,7 +66,7 @@ public class RewritePomsForBranchPhase
             if ( scmRoot != null )
             {
                 Scm scm = buildScm( project );
-                releaseDescriptor.mapOriginalScmInfo( projectId, scm );
+                releaseDescriptor.addOriginalScmInfo( projectId, scm );
 
                 try
                 {
@@ -79,7 +79,7 @@ public class RewritePomsForBranchPhase
             }
             else
             {
-                releaseDescriptor.mapOriginalScmInfo( projectId, null );
+                releaseDescriptor.addOriginalScmInfo( projectId, null );
 
                 MavenProject parent = project.getParent();
                 if ( parent != null )
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java
index 138ed5c..bbc64f0 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java
@@ -64,7 +64,7 @@ public class RewritePomsForReleasePhase
             if ( scmRoot != null )
             {
                 Scm scm = buildScm( project );
-                releaseDescriptor.mapOriginalScmInfo( projectId, scm );
+                releaseDescriptor.addOriginalScmInfo( projectId, scm );
 
                 try
                 {
@@ -77,7 +77,7 @@ public class RewritePomsForReleasePhase
             }
             else
             {
-                releaseDescriptor.mapOriginalScmInfo( projectId, null );
+                releaseDescriptor.addOriginalScmInfo( projectId, null );
 
                 MavenProject parent = project.getParent();
                 if ( parent != null )
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java
index ea76dba..4ca2b75 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java
@@ -34,6 +34,7 @@ import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.codehaus.plexus.interpolation.InterpolationException;
 import org.codehaus.plexus.interpolation.MapBasedValueSource;
 import org.codehaus.plexus.interpolation.ObjectBasedValueSource;
@@ -188,10 +189,10 @@ public class ReleaseUtil
         String url = releaseDescriptor.getScmSourceUrl();
         url = realignScmUrl( parentLevels, url );
 
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setWorkingDirectory( basedir );
-        descriptor.setScmSourceUrl( url );
-        return descriptor;
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( basedir );
+        builder.setScmSourceUrl( url );
+        return builder.build();
     }
 
     public static String getCommonBasedir( List<MavenProject> reactorProjects )
diff --git a/maven-release-manager/src/main/mdo/release-descriptor.mdo b/maven-release-manager/src/main/mdo/release-descriptor.mdo
index cccada0..3c36c6a 100644
--- a/maven-release-manager/src/main/mdo/release-descriptor.mdo
+++ b/maven-release-manager/src/main/mdo/release-descriptor.mdo
@@ -686,22 +686,6 @@
     }
 
     /**
-     * Map a given project to a specified version from when it is released.
-     *
-     * @param projectId   the project's group and artifact ID
-     * @param nextVersion the version to map to
-     */
-    public void mapReleaseVersion( String projectId, String nextVersion )
-    {
-        if ( releaseVersions == null )
-        {
-            releaseVersions = new java.util.HashMap<>();
-        }
-
-        releaseVersions.put( projectId, nextVersion );
-    }
-
-    /**
      * Map a given project to a specified version from when it is incremented and placed back into development.
      *
      * @param projectId   the project's group and artifact ID
@@ -718,26 +702,6 @@
     }
 
     /**
-     * Map a given project to a specified set of SCM information.
-     *
-     * @param projectId the project's group and artifact ID
-     * @param scm       the original SCM information to store
-     */
-    public void mapOriginalScmInfo( String projectId, org.apache.maven.model.Scm scm )
-    {
-        if ( originalScmInfo == null )
-        {
-            originalScmInfo = new java.util.HashMap<>();
-        }
-        else
-        {
-            assert !originalScmInfo.containsKey( projectId );
-        }
-
-        originalScmInfo.put( projectId, scm );
-    }
-
-    /**
      * A map of projects to original versions before any transformation.
      */
     private java.util.Map originalVersions;
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java
index d68f9f6..61502d0 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java
@@ -45,6 +45,7 @@ import org.apache.maven.scm.provider.ScmProvider;
 import org.apache.maven.scm.provider.ScmProviderStub;
 import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.config.ReleaseDescriptorStore;
 import org.apache.maven.shared.release.config.ReleaseDescriptorStoreException;
 import org.apache.maven.shared.release.config.ReleaseDescriptorStoreStub;
@@ -316,9 +317,9 @@ public class DefaultReleaseManagerTest
         ReleaseManager releaseManager = lookup( ReleaseManager.class, "bad-phase-configured" );
 
         ReleasePrepareRequest prepareRequest = new ReleasePrepareRequest();
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setReleaseStrategyId( "foo" );
-        prepareRequest.setReleaseDescriptor( releaseDescriptor );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setReleaseStrategyId( "foo" );
+        prepareRequest.setReleaseDescriptor( builder.build() );
         prepareRequest.setReleaseEnvironment( new DefaultReleaseEnvironment() );
         
         try
@@ -336,19 +337,19 @@ public class DefaultReleaseManagerTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
 
         DefaultReleaseManager releaseManager = (DefaultReleaseManager) lookup( ReleaseManager.class, "test" );
 
         ReleaseDescriptorStore configStoreMock = mock( ReleaseDescriptorStore.class );
-        when( configStoreMock.read( releaseDescriptor ) ).thenThrow( new ReleaseDescriptorStoreException( "message", new IOException( "ioExceptionMsg" ) ) );
+        when( configStoreMock.read( builder.build() ) ).thenThrow( new ReleaseDescriptorStoreException( "message", new IOException( "ioExceptionMsg" ) ) );
 
         releaseManager.setConfigStore( configStoreMock );
         
         ReleasePrepareRequest prepareRequest = new ReleasePrepareRequest();
-        prepareRequest.setReleaseDescriptor( releaseDescriptor );
+        prepareRequest.setReleaseDescriptor( builder.build() );
         prepareRequest.setReleaseEnvironment( new DefaultReleaseEnvironment() );
 
         // execute
@@ -364,7 +365,7 @@ public class DefaultReleaseManagerTest
         }
 
         // verify
-        verify( configStoreMock ).read( releaseDescriptor );
+        verify( configStoreMock ).read( builder.build() );
         verifyNoMoreInteractions( configStoreMock );
     }
 
@@ -372,19 +373,19 @@ public class DefaultReleaseManagerTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
 
         DefaultReleaseManager releaseManager = (DefaultReleaseManager) lookup( ReleaseManager.class, "test" );
 
         ReleaseDescriptorStore configStoreMock = mock( ReleaseDescriptorStore.class );
-        doThrow( new ReleaseDescriptorStoreException( "message", new IOException( "ioExceptionMsg" ) ) ).when( configStoreMock ).write( releaseDescriptor );
+        doThrow( new ReleaseDescriptorStoreException( "message", new IOException( "ioExceptionMsg" ) ) ).when( configStoreMock ).write( builder.build() );
 
         releaseManager.setConfigStore( configStoreMock );
         
         ReleasePrepareRequest prepareRequest = new ReleasePrepareRequest();
-        prepareRequest.setReleaseDescriptor( releaseDescriptor );
+        prepareRequest.setReleaseDescriptor( builder.build() );
         prepareRequest.setReleaseEnvironment( new DefaultReleaseEnvironment() );
         prepareRequest.setDryRun( false );
         prepareRequest.setResume( false );
@@ -402,7 +403,7 @@ public class DefaultReleaseManagerTest
         }
 
         // verify
-        verify( configStoreMock ).write( releaseDescriptor ) ;
+        verify( configStoreMock ).write( builder.build() ) ;
         verifyNoMoreInteractions( configStoreMock );
     }
 
@@ -410,9 +411,9 @@ public class DefaultReleaseManagerTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
 
         DefaultReleaseManager releaseManager = (DefaultReleaseManager) lookup( ReleaseManager.class, "test" );
 
@@ -421,7 +422,7 @@ public class DefaultReleaseManagerTest
         releaseManager.setConfigStore( configStoreMock );
 
         ReleaseCleanRequest cleanRequest = new ReleaseCleanRequest();
-        cleanRequest.setReleaseDescriptor( releaseDescriptor );
+        cleanRequest.setReleaseDescriptor( builder.build() );
         
         // execute
         releaseManager.clean( cleanRequest );
@@ -439,7 +440,7 @@ public class DefaultReleaseManagerTest
         phase = (ReleasePhaseStub) lookup( ReleasePhase.class, "branch1" );
         assertTrue( "branch1 not cleaned", phase.isCleaned() );
 
-        verify( configStoreMock ).delete( releaseDescriptor );
+        verify( configStoreMock ).delete( builder.build() );
         verifyNoMoreInteractions( configStoreMock );
     }
 
@@ -457,13 +458,13 @@ public class DefaultReleaseManagerTest
     {
         ReleaseManager releaseManager = lookup( ReleaseManager.class, "test" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
         File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
         
         ReleasePerformRequest performRequest = new ReleasePerformRequest();
-        performRequest.setReleaseDescriptor( releaseDescriptor );
+        performRequest.setReleaseDescriptor( builder.build() );
         performRequest.setReleaseEnvironment( new DefaultReleaseEnvironment() );
         performRequest.setReactorProjects( createReactorProjects() );
 
@@ -476,25 +477,25 @@ public class DefaultReleaseManagerTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
 
         DefaultReleaseManager releaseManager = (DefaultReleaseManager) lookup( ReleaseManager.class, "test" );
 
         ReleaseDescriptorStore configStoreMock = mock( ReleaseDescriptorStore.class );
-        when( configStoreMock.read( releaseDescriptor ) ).thenThrow( new ReleaseDescriptorStoreException( "message", new IOException( "ioExceptionMsg" ) ) );
+        when( configStoreMock.read( builder.build() ) ).thenThrow( new ReleaseDescriptorStoreException( "message", new IOException( "ioExceptionMsg" ) ) );
 
         releaseManager.setConfigStore( configStoreMock );
         
         ReleasePerformRequest performRequest = new ReleasePerformRequest();
-        performRequest.setReleaseDescriptor( releaseDescriptor );
+        performRequest.setReleaseDescriptor( builder.build() );
         performRequest.setReleaseEnvironment( new DefaultReleaseEnvironment() );
 
         // execute
         try
         {
-            releaseDescriptor.setUseReleaseProfile( false );
+            builder.setUseReleaseProfile( false );
 
             releaseManager.perform( performRequest );
             fail( "Should have failed to read configuration" );
@@ -506,30 +507,30 @@ public class DefaultReleaseManagerTest
         }
 
         // verify
-        verify( configStoreMock ).read( releaseDescriptor );
+        verify( configStoreMock ).read( builder.build() );
         verifyNoMoreInteractions( configStoreMock );
     }
 
     public void testReleasePerformWithIncompletePrepare()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
 
         DefaultReleaseManager releaseManager = (DefaultReleaseManager) lookup( ReleaseManager.class, "test" );
 
         ReleaseDescriptorStoreStub configStore = new ReleaseDescriptorStoreStub();
-        releaseDescriptor.setCompletedPhase( "scm-tag" );
+        builder.setCompletedPhase( "scm-tag" );
         releaseManager.setConfigStore( configStore );
 
         ReleasePerformRequest performRequest = new ReleasePerformRequest();
-        performRequest.setReleaseDescriptor( releaseDescriptor );
+        performRequest.setReleaseDescriptor( builder.build() );
         performRequest.setReleaseEnvironment( new DefaultReleaseEnvironment() );
 
         try
         {
-            releaseDescriptor.setUseReleaseProfile( false );
+            builder.setUseReleaseProfile( false );
 
             releaseManager.perform( performRequest );
             fail( "Should have failed to perform" );
@@ -553,10 +554,10 @@ public class DefaultReleaseManagerTest
         ReleaseManagerListener managerListener = mock( ReleaseManagerListener.class );
         performRequest.setReleaseManagerListener( managerListener );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
-        performRequest.setReleaseDescriptor( releaseDescriptor );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setWorkingDirectory( getTestFile( "target/working-directory" ).getAbsolutePath() );
+        performRequest.setReleaseDescriptor( builder.build() );
 
         ReleaseManager releaseManager = lookup( ReleaseManager.class, "test" );
 
@@ -581,18 +582,18 @@ public class DefaultReleaseManagerTest
     public void testNoScmUrlPerform()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
 
         ReleaseManager releaseManager = lookup( ReleaseManager.class, "test" );
 
         ReleasePerformRequest performRequest = new ReleasePerformRequest();
-        performRequest.setReleaseDescriptor( releaseDescriptor );
+        performRequest.setReleaseDescriptor( builder.build() );
         performRequest.setReleaseEnvironment( new DefaultReleaseEnvironment() );
         
         try
         {
-            releaseDescriptor.setUseReleaseProfile( false );
+            builder.setUseReleaseProfile( false );
 
             releaseManager.perform( performRequest );
 
@@ -610,10 +611,10 @@ public class DefaultReleaseManagerTest
         // prepare
         ReleaseManager releaseManager = lookup( ReleaseManager.class, "test" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
         File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
         when( scmProviderMock.checkOut( any( ScmRepository.class ),
@@ -626,7 +627,7 @@ public class DefaultReleaseManagerTest
         stub.setScmProvider( scmProviderMock );
 
         ReleasePerformRequest performRequest = new ReleasePerformRequest();
-        performRequest.setReleaseDescriptor( releaseDescriptor );
+        performRequest.setReleaseDescriptor( builder.build() );
         performRequest.setReleaseEnvironment( new DefaultReleaseEnvironment() );
         performRequest.setReactorProjects( createReactorProjects() );
 
@@ -653,19 +654,19 @@ public class DefaultReleaseManagerTest
     {
         ReleaseManager releaseManager = lookup( ReleaseManager.class, "test" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
         File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
 
         ScmManager scmManager = (ScmManager) lookup( ScmManager.class );
         ScmProviderStub providerStub =
-            (ScmProviderStub) scmManager.getProviderByUrl( releaseDescriptor.getScmSourceUrl() );
+            (ScmProviderStub) scmManager.getProviderByUrl( "scm-url" );
 
         providerStub.setCheckOutScmResult( new CheckOutScmResult( "", "", "", false ) );
         
         ReleasePerformRequest performRequest = new ReleasePerformRequest();
-        performRequest.setReleaseDescriptor( releaseDescriptor );
+        performRequest.setReleaseDescriptor( builder.build() );
         performRequest.setReleaseEnvironment( new DefaultReleaseEnvironment() );
         performRequest.setReactorProjects( createReactorProjects() );
 
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java
index 0b93bbf..19e2f7f 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java
@@ -185,8 +185,8 @@ public class PropertiesReleaseDescriptorStoreTest
         config.setCompletedPhase( "completed-phase-write" );
         config.setScmSourceUrl( "url-write" );
 
-        config.mapReleaseVersion( "group.id:artifact.id", "1.1" );
-        config.mapDevelopmentVersion( "group.id:artifact.id", "1.2-SNAPSHOT" );
+        config.addReleaseVersion( "group.id:artifact.id", "1.1" );
+        config.addDevelopmentVersion( "group.id:artifact.id", "1.2-SNAPSHOT" );
 
         IdentifiedScm scm = new IdentifiedScm();
         scm.setId( "id" );
@@ -194,7 +194,7 @@ public class PropertiesReleaseDescriptorStoreTest
         scm.setDeveloperConnection( "devConnection" );
         scm.setTag( "tag" );
         scm.setUrl( "url" );
-        config.mapOriginalScmInfo( "group.id:artifact.id", scm );
+        config.addOriginalScmInfo( "group.id:artifact.id", scm );
 
         store.write( config, file );
 
@@ -214,10 +214,10 @@ public class PropertiesReleaseDescriptorStoreTest
         config.setCompletedPhase( "completed-phase-write" );
         config.setScmSourceUrl( "url-write" );
 
-        config.mapReleaseVersion( "group.id:artifact.id", "1.1" );
-        config.mapDevelopmentVersion( "group.id:artifact.id", "1.2-SNAPSHOT" );
+        config.addReleaseVersion( "group.id:artifact.id", "1.1" );
+        config.addDevelopmentVersion( "group.id:artifact.id", "1.2-SNAPSHOT" );
 
-        config.mapOriginalScmInfo( "group.id:artifact.id", null );
+        config.addOriginalScmInfo( "group.id:artifact.id", null );
 
         store.write( config, file );
 
@@ -298,8 +298,8 @@ public class PropertiesReleaseDescriptorStoreTest
         config.setCompletionGoals( "completion-goals-write" );
         config.setPomFileName( "pom-file-name-write" );
 
-        config.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        config.mapDevelopmentVersion( "groupId:artifactId", "1.1-SNAPSHOT" );
+        config.addReleaseVersion( "groupId:artifactId", "1.0" );
+        config.addDevelopmentVersion( "groupId:artifactId", "1.1-SNAPSHOT" );
 
         IdentifiedScm scm = new IdentifiedScm();
         scm.setId( "id-write" );
@@ -307,12 +307,12 @@ public class PropertiesReleaseDescriptorStoreTest
         scm.setDeveloperConnection( "developerConnection-write" );
         scm.setUrl( "url-write" );
         scm.setTag( "tag-write" );
-        config.mapOriginalScmInfo( "groupId:artifactId", scm );
+        config.addOriginalScmInfo( "groupId:artifactId", scm );
 
         scm = new IdentifiedScm();
         scm.setConnection( "connection-write" );
         // omit optional elements
-        config.mapOriginalScmInfo( "groupId:subproject1", scm );
+        config.addOriginalScmInfo( "groupId:subproject1", scm );
 
         return config;
     }
@@ -416,24 +416,24 @@ public class PropertiesReleaseDescriptorStoreTest
         expected.setScmUseEditMode( false );
         expected.setInteractive( true );
         expected.setAddSchema( false );
-        expected.mapReleaseVersion( "groupId:artifactId1", "2.0" );
-        expected.mapReleaseVersion( "groupId:artifactId2", "3.0" );
-        expected.mapDevelopmentVersion( "groupId:artifactId1", "2.1-SNAPSHOT" );
-        expected.mapDevelopmentVersion( "groupId:artifactId2", "3.0.1-SNAPSHOT" );
+        expected.addReleaseVersion( "groupId:artifactId1", "2.0" );
+        expected.addReleaseVersion( "groupId:artifactId2", "3.0" );
+        expected.addDevelopmentVersion( "groupId:artifactId1", "2.1-SNAPSHOT" );
+        expected.addDevelopmentVersion( "groupId:artifactId2", "3.0.1-SNAPSHOT" );
         IdentifiedScm scm = new IdentifiedScm();
         scm.setId( "id" );
         scm.setConnection( "connection" );
         scm.setDeveloperConnection( "developerConnection" );
         scm.setUrl( "url" );
         scm.setTag( "tag" );
-        expected.mapOriginalScmInfo( "groupId:artifactId1", scm );
+        expected.addOriginalScmInfo( "groupId:artifactId1", scm );
         scm = new IdentifiedScm();
         scm.setId( null );
         scm.setConnection( "connection2" );
         scm.setUrl( "url2" );
         scm.setTag( null );
         scm.setDeveloperConnection( null );
-        expected.mapOriginalScmInfo( "groupId:artifactId2", scm );
+        expected.addOriginalScmInfo( "groupId:artifactId2", scm );
         expected.mapResolvedSnapshotDependencies( "external:artifactId", "1.0", "1.1-SNAPSHOT" );
 
         return expected;
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java
index 0da8d21..02758b4 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java
@@ -191,56 +191,56 @@ public class ReleaseUtilsTest
         // sanity check the test was resetting correctly
         assertEquals( "Check original comparison", config, origConfig );
 
-        config.mapDevelopmentVersion( "groupId:artifactId", "1.0-SNAPSHOT" );
+        config.addDevelopmentVersion( "groupId:artifactId", "1.0-SNAPSHOT" );
         assertFalse( "Check original comparison", config.equals( origConfig ) );
         config = copyReleaseDescriptor( origConfig );
 
-        config.mapReleaseVersion( "groupId:artifactId", "1.0" );
+        config.addReleaseVersion( "groupId:artifactId", "1.0" );
         assertFalse( "Check original comparison", config.equals( origConfig ) );
         config = copyReleaseDescriptor( origConfig );
 
-        config.mapOriginalScmInfo( "groupId:artifactId", new Scm() );
+        config.addOriginalScmInfo( "groupId:artifactId", new Scm() );
         assertFalse( "Check original comparison", config.equals( origConfig ) );
         config = copyReleaseDescriptor( origConfig );
 
-        config.mapOriginalScmInfo( "groupId:artifactId", new Scm() );
-        origConfig.mapOriginalScmInfo( "foo", new Scm() );
+        config.addOriginalScmInfo( "groupId:artifactId", new Scm() );
+        origConfig.addOriginalScmInfo( "foo", new Scm() );
         assertFalse( "Check original comparison", config.equals( origConfig ) );
         origConfig = createReleaseDescriptor();
         config = copyReleaseDescriptor( origConfig );
 
-        config.mapOriginalScmInfo( "groupId:artifactId", new Scm() );
-        origConfig.mapOriginalScmInfo( "groupId:artifactId", new Scm() );
+        config.addOriginalScmInfo( "groupId:artifactId", new Scm() );
+        origConfig.addOriginalScmInfo( "groupId:artifactId", new Scm() );
         assertEquals( "Check original comparison", config, origConfig );
         origConfig = createReleaseDescriptor();
         config = copyReleaseDescriptor( origConfig );
 
-        config.mapOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
-        origConfig.mapOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
+        config.addOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
+        origConfig.addOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
         assertEquals( "Check original comparison", config, origConfig );
         origConfig = createReleaseDescriptor();
         config = copyReleaseDescriptor( origConfig );
 
-        config.mapOriginalScmInfo( "groupId:artifactId", getScm( "-", "dev", "url", "tag" ) );
-        origConfig.mapOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
+        config.addOriginalScmInfo( "groupId:artifactId", getScm( "-", "dev", "url", "tag" ) );
+        origConfig.addOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
         assertFalse( "Check original comparison", config.equals( origConfig ) );
         origConfig = createReleaseDescriptor();
         config = copyReleaseDescriptor( origConfig );
 
-        config.mapOriginalScmInfo( "groupId:artifactId", getScm( "conn", "-", "url", "tag" ) );
-        origConfig.mapOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
+        config.addOriginalScmInfo( "groupId:artifactId", getScm( "conn", "-", "url", "tag" ) );
+        origConfig.addOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
         assertFalse( "Check original comparison", config.equals( origConfig ) );
         origConfig = createReleaseDescriptor();
         config = copyReleaseDescriptor( origConfig );
 
-        config.mapOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "-", "tag" ) );
-        origConfig.mapOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
+        config.addOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "-", "tag" ) );
+        origConfig.addOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
         assertFalse( "Check original comparison", config.equals( origConfig ) );
         origConfig = createReleaseDescriptor();
         config = copyReleaseDescriptor( origConfig );
 
-        config.mapOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "-" ) );
-        origConfig.mapOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
+        config.addOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "-" ) );
+        origConfig.addOriginalScmInfo( "groupId:artifactId", getScm( "conn", "dev", "url", "tag" ) );
         assertFalse( "Check original comparison", config.equals( origConfig ) );
     }
 
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractEditModeRewritingReleasePhaseTestCase.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractEditModeRewritingReleasePhaseTestCase.java
index 9d510cc..74bcda4 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractEditModeRewritingReleasePhaseTestCase.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractEditModeRewritingReleasePhaseTestCase.java
@@ -41,7 +41,7 @@ import org.apache.maven.scm.provider.ScmProviderStub;
 import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.scm.DefaultScmRepositoryConfigurator;
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
@@ -66,11 +66,11 @@ public abstract class AbstractEditModeRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.setScmUseEditMode( true );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.setScmUseEditMode( true );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -80,21 +80,21 @@ public abstract class AbstractEditModeRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.setScmUseEditMode( true );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.setScmUseEditMode( true );
+        mapNextVersion( builder, "groupId:artifactId" );
 
         ScmManagerStub scmManager = new ScmManagerStub();
         DefaultScmRepositoryConfigurator configurator =
             (DefaultScmRepositoryConfigurator) lookup( ScmRepositoryConfigurator.class, "default" );
         configurator.setScmManager( scmManager );
 
-        ScmProviderStub providerStub = (ScmProviderStub) scmManager.getProviderByUrl( config.getScmSourceUrl() );
+        ScmProviderStub providerStub = (ScmProviderStub) scmManager.getProviderByUrl( builder.build().getScmSourceUrl() );
         providerStub.setEditScmResult( new EditScmResult( "", "", "", false ) );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -110,9 +110,9 @@ public abstract class AbstractEditModeRewritingReleasePhaseTestCase
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.setScmUseEditMode( true );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.setScmUseEditMode( true );
+        mapNextVersion( builder, "groupId:artifactId" );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
         when( scmProviderMock.edit( isA( ScmRepository.class ),
@@ -127,7 +127,7 @@ public abstract class AbstractEditModeRewritingReleasePhaseTestCase
         // execute
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -145,9 +145,9 @@ public abstract class AbstractEditModeRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-plugin-deps" );
-        ReleaseDescriptor config = createDefaultConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDefaultConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -157,11 +157,11 @@ public abstract class AbstractEditModeRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-plugin-deps" );
-        ReleaseDescriptor config = createUnmappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createUnmappedConfiguration( reactorProjects );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -176,9 +176,9 @@ public abstract class AbstractEditModeRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-profile" );
-        ReleaseDescriptor config = createDefaultConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDefaultConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -188,11 +188,11 @@ public abstract class AbstractEditModeRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-profile" );
-        ReleaseDescriptor config = createUnmappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createUnmappedConfiguration( reactorProjects );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
index 903cf93..eeca5e2 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
@@ -40,7 +40,7 @@ import org.apache.maven.scm.provider.ScmProvider;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.scm.DefaultScmRepositoryConfigurator;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
@@ -81,7 +81,7 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         super.setUp();
-        phase = (ReleasePhase) lookup( ReleasePhase.class, getRoleHint() );
+        phase = lookup( ReleasePhase.class, getRoleHint() );
 
         if( phase instanceof AbstractRewritePomsPhase)
         {
@@ -96,10 +96,10 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -109,10 +109,10 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-entities" );
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -122,10 +122,10 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-namespace" );
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -135,10 +135,10 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-encoding" );
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -148,9 +148,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-parent" );
-        ReleaseDescriptor config = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
+        ReleaseDescriptorBuilder builder = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -161,17 +161,17 @@ public abstract class AbstractRewritingReleasePhaseTestCase
     {
 
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-parent" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
         // Process the child first
         reactorProjects = new ArrayList<>( reactorProjects );
         Collections.reverse( reactorProjects );
 
-        mapAlternateNextVersion( config, "groupId:subproject1" );
+        mapAlternateNextVersion( builder, "groupId:subproject1" );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -187,27 +187,27 @@ public abstract class AbstractRewritingReleasePhaseTestCase
     {
 
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-released-parent" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        mapAlternateNextVersion( config, "groupId:subproject1" );
-        config.mapReleaseVersion( "groupId:artifactId", "1" );
-        config.mapDevelopmentVersion( "groupId:artifactId", "1" );
+        mapAlternateNextVersion( builder, "groupId:subproject1" );
+        builder.addReleaseVersion( "groupId:artifactId", "1" );
+        builder.addDevelopmentVersion( "groupId:artifactId", "1" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
 
-    protected abstract void mapAlternateNextVersion( ReleaseDescriptor config, String projectId );
+    protected abstract void mapAlternateNextVersion( ReleaseDescriptorBuilder config, String projectId );
 
     @Test
     public void testRewritePomWithInheritedVersion()
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-inherited-version" );
-        ReleaseDescriptor config = createConfigurationForWithParentNextVersion( reactorProjects );
+        ReleaseDescriptorBuilder builder = createConfigurationForWithParentNextVersion( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -217,15 +217,15 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-inherited-version" );
-        ReleaseDescriptor config = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
+        ReleaseDescriptorBuilder builder = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         MavenProject project = getProjectsAsMap( reactorProjects ).get( "groupId:subproject1" );
         comparePomFiles( project, "-version-changed" );
     }
 
-    protected abstract ReleaseDescriptor createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects )
+    protected abstract ReleaseDescriptorBuilder createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects )
         throws Exception;
 
     @Test
@@ -233,10 +233,10 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-dependencies" );
-        ReleaseDescriptor config = createDefaultConfiguration( reactorProjects );
-        mapNextVersion( config, "groupId:subsubproject" );
+        ReleaseDescriptorBuilder builder = createDefaultConfiguration( reactorProjects );
+        mapNextVersion( builder, "groupId:subsubproject" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -246,11 +246,11 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-dependencies" );
-        ReleaseDescriptor config = createUnmappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createUnmappedConfiguration( reactorProjects );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -265,9 +265,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-differing-snapshot-dependencies" );
-        ReleaseDescriptor config = createDifferingVersionConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDifferingVersionConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -277,9 +277,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-managed-snapshot-dependency" );
-        ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createMappedConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -289,11 +289,11 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-managed-snapshot-dependency" );
-        ReleaseDescriptor config = createUnmappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createUnmappedConfiguration( reactorProjects );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -308,9 +308,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-plugins" );
-        ReleaseDescriptor config = createDefaultConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDefaultConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -320,11 +320,11 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-plugins" );
-        ReleaseDescriptor config = createUnmappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createUnmappedConfiguration( reactorProjects );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -339,9 +339,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-differing-snapshot-plugins" );
-        ReleaseDescriptor config = createDifferingVersionConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDifferingVersionConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -351,9 +351,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-managed-snapshot-plugin" );
-        ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createMappedConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -363,11 +363,11 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-managed-snapshot-plugin" );
-        ReleaseDescriptor config = createUnmappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createUnmappedConfiguration( reactorProjects );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -382,9 +382,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-report-plugins" );
-        ReleaseDescriptor config = createDefaultConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDefaultConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -394,11 +394,11 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-report-plugins" );
-        ReleaseDescriptor config = createUnmappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createUnmappedConfiguration( reactorProjects );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -413,9 +413,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-differing-snapshot-report-plugins" );
-        ReleaseDescriptor config = createDifferingVersionConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDifferingVersionConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -426,9 +426,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-extension" );
-        ReleaseDescriptor config = createDefaultConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDefaultConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -439,11 +439,11 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-snapshot-extension" );
-        ReleaseDescriptor config = createUnmappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createUnmappedConfiguration( reactorProjects );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -459,9 +459,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "internal-differing-snapshot-extension" );
-        ReleaseDescriptor config = createDifferingVersionConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDifferingVersionConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -472,9 +472,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-without-extension-version" );
-        ReleaseDescriptor config = createDefaultConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDefaultConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -490,11 +490,11 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         {
             String path = "basic-pom";
             List<MavenProject> reactorProjects = prepareReactorProjects( path, copyFiles );
-            ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-            mapNextVersion( config, "groupId:artifactId" );
-            config.setAddSchema( true );
+            ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+            mapNextVersion( builder, "groupId:artifactId" );
+            builder.setAddSchema( true );
 
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             comparePomFiles( reactorProjects, "-with-schema" );
 
@@ -510,9 +510,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.setScmUseEditMode( true );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.setScmUseEditMode( true );
+        mapNextVersion( builder, "groupId:artifactId" );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
 
@@ -523,7 +523,7 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         scmManager.setScmProvider( scmProviderMock );
 
         // execute
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verifyNoMoreInteractions( scmProviderMock );
@@ -534,11 +534,11 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -554,12 +554,12 @@ public abstract class AbstractRewritingReleasePhaseTestCase
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.setScmUseEditMode( true );
-        config.setScmSourceUrl( "scm:svn:fail" );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.setScmUseEditMode( true );
+        builder.setScmSourceUrl( "scm:svn:fail" );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        ScmManager scmManager = (ScmManager) lookup( ScmManager.class );
+        ScmManager scmManager = lookup( ScmManager.class );
         if ( scmManager instanceof ScmManagerStub )
         {
             ((ScmManagerStub) scmManager ).setException( new ScmRepositoryException( "..." ) );
@@ -567,7 +567,7 @@ public abstract class AbstractRewritingReleasePhaseTestCase
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -583,10 +583,10 @@ public abstract class AbstractRewritingReleasePhaseTestCase
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.setScmUseEditMode( true );
-        config.setScmSourceUrl( "scm:fail:path" );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.setScmUseEditMode( true );
+        builder.setScmSourceUrl( "scm:fail:path" );
+        mapNextVersion( builder, "groupId:artifactId" );
 
         ScmManager scmManager = (ScmManager) lookup( ScmManager.class );
         if ( scmManager instanceof ScmManagerStub )
@@ -597,7 +597,7 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         // execute
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have thrown an exception" );
         }
@@ -613,10 +613,10 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "whitespace-around-values" );
-        ReleaseDescriptor config = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
-        mapNextVersion( config, "groupId:subproject2" );
+        ReleaseDescriptorBuilder builder = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
+        mapNextVersion( builder, "groupId:subproject2" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -626,10 +626,10 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "comments-around-values" );
-        ReleaseDescriptor config = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
-        mapNextVersion( config, "groupId:subproject2" );
+        ReleaseDescriptorBuilder builder = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
+        mapNextVersion( builder, "groupId:subproject2" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -639,10 +639,10 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "cdata-around-values" );
-        ReleaseDescriptor config = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
-        mapNextVersion( config, "groupId:subproject2" );
+        ReleaseDescriptorBuilder builder = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
+        mapNextVersion( builder, "groupId:subproject2" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -652,25 +652,19 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         // This occurs when it is release:perform run standalone. Just check there are no errors.
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
-        config.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
-
         phase.clean( Collections.<MavenProject>emptyList() );
-
-        assertTrue( true );
     }
 
-    protected ReleaseDescriptor createUnmappedConfiguration( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createUnmappedConfiguration( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        unmapNextVersion( config, "groupId:subproject1" );
-        mapNextVersion( config, "groupId:subproject2" );
-        mapNextVersion( config, "groupId:subproject3" );
-        mapNextVersion( config, "groupId:artifactId" );
-        return config;
+        unmapNextVersion( builder, "groupId:subproject1" );
+        mapNextVersion( builder, "groupId:subproject2" );
+        mapNextVersion( builder, "groupId:subproject3" );
+        mapNextVersion( builder, "groupId:artifactId" );
+        return builder;
     }
 
     protected List<MavenProject> createReactorProjects( String path )
@@ -679,31 +673,31 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         return prepareReactorProjects( path, true );
     }
 
-    protected ReleaseDescriptor createDefaultConfiguration( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createDefaultConfiguration( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createMappedConfiguration( reactorProjects );
 
-        mapNextVersion( config, "groupId:subproject4" );
-        return config;
+        mapNextVersion( builder, "groupId:subproject4" );
+        return builder;
     }
 
-    protected ReleaseDescriptor createMappedConfiguration( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createMappedConfiguration( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createDifferingVersionConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDifferingVersionConfiguration( reactorProjects );
 
-        mapNextVersion( config, "groupId:subproject3" );
-        return config;
+        mapNextVersion( builder, "groupId:subproject3" );
+        return builder;
     }
 
-    private ReleaseDescriptor createDifferingVersionConfiguration( List<MavenProject> reactorProjects )
+    private ReleaseDescriptorBuilder createDifferingVersionConfiguration( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createConfigurationForWithParentNextVersion( reactorProjects );
+        ReleaseDescriptorBuilder builder = createConfigurationForWithParentNextVersion( reactorProjects );
 
-        mapNextVersion( config, "groupId:subproject2" );
-        return config;
+        mapNextVersion( builder, "groupId:subproject2" );
+        return builder;
     }
 
     protected List<MavenProject> createReactorProjectsFromBasicPom()
@@ -712,14 +706,14 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         return createReactorProjects( "basic-pom" );
     }
 
-    protected abstract ReleaseDescriptor createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects )
+    protected abstract ReleaseDescriptorBuilder createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects )
         throws Exception;
 
-    protected abstract void unmapNextVersion( ReleaseDescriptor config, String projectId );
+    protected abstract void unmapNextVersion( ReleaseDescriptorBuilder config, String projectId );
 
-    protected abstract void mapNextVersion( ReleaseDescriptor config, String projectId );
+    protected abstract void mapNextVersion( ReleaseDescriptorBuilder config, String projectId );
 
-    protected ReleaseDescriptor createDescriptorFromBasicPom( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createDescriptorFromBasicPom( List<MavenProject> reactorProjects )
         throws Exception
     {
         return createDescriptorFromProjects( reactorProjects );
@@ -733,9 +727,9 @@ public abstract class AbstractRewritingReleasePhaseTestCase
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-namespace" );
-        ReleaseDescriptor config = createDefaultConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDefaultConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -748,21 +742,21 @@ public abstract class AbstractRewritingReleasePhaseTestCase
     {
     }
 
-    protected ReleaseDescriptor createDescriptorFromProjects( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createDescriptorFromProjects( List<MavenProject> reactorProjects )
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
         if ( rootProject.getScm() == null )
         {
-            descriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo/trunk" );
+            builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo/trunk" );
         }
         else
         {
-            descriptor.setScmSourceUrl( rootProject.getScm().getConnection() );
+            builder.setScmSourceUrl( rootProject.getScm().getConnection() );
         }
 
-        descriptor.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
+        builder.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
 
-        return descriptor;
+        return builder;
     }
 }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhaseTest.java
index 087ea96..a08a295 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhaseTest.java
@@ -27,7 +27,7 @@ import java.util.List;
 
 import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.junit.Test;
 
 public class AbstractScmCommitPhaseTest
@@ -37,7 +37,7 @@ public class AbstractScmCommitPhaseTest
         throws Exception
     {
         List<File> files =
-            AbstractScmCommitPhase.createPomFiles(  new ReleaseDescriptor(),
+            AbstractScmCommitPhase.createPomFiles(  new ReleaseDescriptorBuilder().build(),
                                                    createProject( "artifactId", "1.0-SNAPSHOT", new File( "pom.xml" ) ) );
         assertEquals( "Number of created files", files.size(), 1 );
         assertTrue( files.contains( new File( "pom.xml" ) ) );
@@ -48,10 +48,10 @@ public class AbstractScmCommitPhaseTest
     public void testCreatePomFilesSuppressCommitBeforeTag()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setSuppressCommitBeforeTagOrBranch( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setSuppressCommitBeforeTagOrBranch( true );
         List<File> files =
-            AbstractScmCommitPhase.createPomFiles(  releaseDescriptor,
+            AbstractScmCommitPhase.createPomFiles(  builder.build(),
                                                    createProject( "artifactId", "1.0-SNAPSHOT", new File( "pom.xml" ) ) );
         assertEquals( "Number of created files", files.size(), 1 );
         assertTrue( files.contains( new File( "pom.xml" ) ) );
@@ -61,10 +61,10 @@ public class AbstractScmCommitPhaseTest
     public void testCreatePomFilesWithReleasePom()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setGenerateReleasePoms( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setGenerateReleasePoms( true );
         List<File> files =
-            AbstractScmCommitPhase.createPomFiles( releaseDescriptor,
+            AbstractScmCommitPhase.createPomFiles( builder.build(),
                                                    createProject( "artifactId", "1.0-SNAPSHOT", new File( "pom.xml" ) ) );
         assertEquals( "Number of created files", files.size(), 2 );
         assertTrue( files.contains( new File( "pom.xml" ) ) );
@@ -75,11 +75,11 @@ public class AbstractScmCommitPhaseTest
     public void testCreatePomFilesWithReleasePomAndSuppressCommitBeforeTag()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setGenerateReleasePoms( true );
-        releaseDescriptor.setSuppressCommitBeforeTagOrBranch( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setGenerateReleasePoms( true );
+        builder.setSuppressCommitBeforeTagOrBranch( true );
         List<File> files =
-            AbstractScmCommitPhase.createPomFiles( releaseDescriptor,
+            AbstractScmCommitPhase.createPomFiles( builder.build(),
                                                    createProject( "artifactId", "1.0-SNAPSHOT", new File( "pom.xml" ) ) );
         assertEquals( "Number of created files", files.size(), 1 );
         assertTrue( files.contains( new File( "pom.xml" ) ) );
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java
index d0e69f8..5b78ede 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java
@@ -36,7 +36,7 @@ import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
@@ -71,26 +71,26 @@ public class BranchInputVariablesPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "tag-value", builder.build().getScmReleaseLabel() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "simulated-tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "simulated-tag-value", builder.build().getScmReleaseLabel() );
 
         verify( mockPrompter, times( 2 ) ).prompt( isA( String.class ) );
         verifyNoMoreInteractions( mockPrompter );
@@ -102,11 +102,11 @@ public class BranchInputVariablesPhaseTest
     {
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -115,11 +115,11 @@ public class BranchInputVariablesPhaseTest
             assertNull( "check no cause", e.getCause() );
         }
 
-        releaseDescriptor = new ReleaseDescriptor();
+        builder = new ReleaseDescriptorBuilder();
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -139,26 +139,26 @@ public class BranchInputVariablesPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setScmReleaseLabel( "tag-value" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.setScmReleaseLabel( "tag-value" );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "tag-value", builder.build().getScmReleaseLabel() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.setScmReleaseLabel( "simulated-tag-value" );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "simulated-tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "simulated-tag-value", builder.build().getScmReleaseLabel() );
 
         // never use prompter
         verifyNoMoreInteractions( mockPrompter );
@@ -174,24 +174,24 @@ public class BranchInputVariablesPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmReleaseLabel( "tag-value" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmReleaseLabel( "tag-value" );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "tag-value", builder.build().getScmReleaseLabel() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setScmReleaseLabel( "simulated-tag-value" );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "simulated-tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "simulated-tag-value", builder.build().getScmReleaseLabel() );
 
         // never use prompter
         verifyNoMoreInteractions( mockPrompter );
@@ -209,14 +209,14 @@ public class BranchInputVariablesPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -226,14 +226,14 @@ public class BranchInputVariablesPhaseTest
         }
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -264,16 +264,16 @@ public class BranchInputVariablesPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setScmReleaseLabel( null );
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.setScmReleaseLabel( null );
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -283,16 +283,16 @@ public class BranchInputVariablesPhaseTest
         }
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setScmReleaseLabel( null );
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.setScmReleaseLabel( null );
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -308,17 +308,17 @@ public class BranchInputVariablesPhaseTest
     @Test
     public void testNamingPolicy() throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setProjectNamingPolicyId( "stub" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setInteractive( false );
+        builder.setProjectNamingPolicyId( "stub" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        assertEquals( "STUB", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "STUB", builder.build().getScmReleaseLabel() );
     }
 
     private static MavenProject createProject( String artifactId, String version )
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java
index 1bf0cbd..16779b2 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java
@@ -38,7 +38,7 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.config.DependencyVersions;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
@@ -68,19 +68,19 @@ public class CheckDependencySnapshotsPhaseTest
     {
         super.setUp();
 
-        phase = (ReleasePhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
+        phase = lookup( ReleasePhase.class, "check-dependency-snapshots" );
     }
 
     @Test
     public void testNoSnapshotDependencies()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "no-snapshot-dependencies" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -93,16 +93,16 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "no-snapshot-range-dependencies" );
 
         phase.setPrompter( createMockPrompter( YES, DEFAULT_CHOICE, new VersionPair( "1.1", "1.2-SNAPSHOT" ) ) );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         phase.setPrompter( createMockPrompter( YES, DEFAULT_CHOICE, new VersionPair( "1.1", "1.2-SNAPSHOT" ) ) );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -112,12 +112,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotDependenciesInProjectOnly()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "internal-snapshot-dependencies" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -127,13 +127,13 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotReleasePluginNonInteractive()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "snapshot-release-plugin" );
-        releaseDescriptor.setInteractive( false );
+        builder.setInteractive( false );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -144,7 +144,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -161,14 +161,14 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "snapshot-release-plugin" );
 
         phase.setPrompter( createMockPrompterWithSnapshotReleasePlugin( NO, NO ) );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -181,7 +181,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -198,12 +198,12 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "snapshot-release-plugin" );
 
         phase.setPrompter( createYesMockPrompter() );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( true );
     }
@@ -215,12 +215,12 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "snapshot-release-plugin" );
 
         phase.setPrompter( createYesMockPrompter() );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( true );
     }
@@ -232,14 +232,14 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "snapshot-release-plugin" );
 
         phase.setPrompter( createMockPrompterWithSnapshotReleasePlugin( "donkey", NO ) );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -252,7 +252,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -269,7 +269,7 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "snapshot-release-plugin" );
 
         Prompter mockPrompter = mock( Prompter.class );
@@ -279,7 +279,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -294,7 +294,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -311,14 +311,14 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "internal-differing-snapshot-dependencies" );
 
         phase.setPrompter( createNoMockPrompter() );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -331,7 +331,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -345,12 +345,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotManagedDependenciesInProjectOnly()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "internal-managed-snapshot-dependency" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -360,13 +360,13 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotUnusedInternalManagedDependency()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects =
             createDescriptorFromProjects( "unused-internal-managed-snapshot-dependency" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -376,13 +376,13 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotUnusedExternalManagedDependency()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects =
             createDescriptorFromProjects( "unused-external-managed-snapshot-dependency" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -392,14 +392,14 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotExternalManagedDependency()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-managed-snapshot-dependency" );
 
-        releaseDescriptor.setInteractive( false );
+        builder.setInteractive( false );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -410,7 +410,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -424,14 +424,14 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotDependenciesOutsideProjectOnlyNonInteractive()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-snapshot-dependencies" );
 
-        releaseDescriptor.setInteractive( false );
+        builder.setInteractive( false );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -442,7 +442,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -456,14 +456,14 @@ public class CheckDependencySnapshotsPhaseTest
     public void testRangeSnapshotDependenciesOutsideProjectOnlyNonInteractive()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-range-snapshot-dependencies" );
 
-        releaseDescriptor.setInteractive( false );
+        builder.setInteractive( false );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -474,7 +474,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -491,26 +491,26 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-snapshot-dependencies" );
 
         phase.setPrompter( createMockPrompter( YES, DEFAULT_CHOICE, new VersionPair( "1.0", "1.1-SNAPSHOT" ),
                                                new VersionPair( "1.0", "1.0" ) ) );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
  
         // validate
-        DependencyVersions versionsMap = releaseDescriptor.getResolvedSnapshotDependencies().get( "external:artifactId" );
+        DependencyVersions versionsMap = builder.build().getResolvedSnapshotDependencies().get( "external:artifactId" );
 
         assertNotNull( versionsMap );
         assertEquals( "1.1-SNAPSHOT", versionsMap.getDevelopment() );
         assertEquals( "1.0", versionsMap.getRelease() );
 
-        releaseDescriptor = new ReleaseDescriptor();
+        builder = new ReleaseDescriptorBuilder();
 
         phase.setPrompter( createMockPrompter( YES, DEFAULT_CHOICE, new VersionPair( "1.0", "1.1-SNAPSHOT" ) ) );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
     }
 
     @Test
@@ -520,16 +520,16 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-snapshot-dependencies" );
 
         phase.setPrompter( createMockPrompter( YES, DEFAULT_CHOICE, new VersionPair( "0.9", "1.0-SNAPSHOT" ),
                                                new VersionPair( "1.0", "1.0-SNAPSHOT" ) ) );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // validate
-        DependencyVersions versionsMap = releaseDescriptor.getResolvedSnapshotDependencies().get( "external:artifactId" );
+        DependencyVersions versionsMap = builder.build().getResolvedSnapshotDependencies().get( "external:artifactId" );
 
         assertNotNull( versionsMap );
         assertEquals( "1.0-SNAPSHOT", versionsMap.getDevelopment() );
@@ -543,15 +543,15 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-snapshot-dependencies" );
 
         phase.setPrompter( createMockPrompter( YES, DEFAULT_CHOICE, new VersionPair( "1.0", "1.0" ) ) );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // validate
-        DependencyVersions versionsMap = releaseDescriptor.getResolvedSnapshotDependencies().get( "external:artifactId" );
+        DependencyVersions versionsMap = builder.build().getResolvedSnapshotDependencies().get( "external:artifactId" );
 
         assertNotNull( versionsMap );
         assertEquals( "1.0", versionsMap.getDevelopment() );
@@ -565,15 +565,15 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-snapshot-dependencies" );
 
         phase.setPrompter( createMockPrompter( YES, "0", new VersionPair( "1.0", "1.0" ) ) );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // validate
-        DependencyVersions versionsMap = releaseDescriptor.getResolvedSnapshotDependencies().get( "external:artifactId" );
+        DependencyVersions versionsMap = builder.build().getResolvedSnapshotDependencies().get( "external:artifactId" );
 
         assertNotNull( versionsMap );
         assertEquals( "1.0", versionsMap.getDevelopment() );
@@ -587,7 +587,7 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-snapshot-all" );
 
         Prompter mockPrompter =
@@ -596,10 +596,10 @@ public class CheckDependencySnapshotsPhaseTest
                                                new VersionPair( "1.2", "1.2" ), new VersionPair( "1.3", "1.3" ) ) );
         phase.setPrompter( mockPrompter );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // validate
-        DependencyVersions versionsMap = releaseDescriptor.getResolvedSnapshotDependencies().get( "external:artifactId" );
+        DependencyVersions versionsMap = builder.build().getResolvedSnapshotDependencies().get( "external:artifactId" );
 
         assertNotNull( versionsMap );
         assertEquals( "1.0", versionsMap.getDevelopment() );
@@ -614,7 +614,7 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects =
             createDescriptorFromProjects( "multimodule-external-snapshot-dependencies" );
 
@@ -624,9 +624,9 @@ public class CheckDependencySnapshotsPhaseTest
             createMockPrompter( "yes", "1", Arrays.asList( pair, pair ), Arrays.asList( defaultPair, defaultPair ) );
         phase.setPrompter( mockPrompter );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        Map<String, DependencyVersions> resolvedDependencies = releaseDescriptor.getResolvedSnapshotDependencies();
+        Map<String, DependencyVersions> resolvedDependencies = builder.build().getResolvedSnapshotDependencies();
 
         assertNotNull( resolvedDependencies );
         assertEquals( 2, resolvedDependencies.size() );
@@ -634,13 +634,13 @@ public class CheckDependencySnapshotsPhaseTest
         assertTrue( resolvedDependencies.containsKey( "external:artifactId" ) );
         assertTrue( resolvedDependencies.containsKey( "external:artifactId2" ) );
 
-        DependencyVersions versionsMap = releaseDescriptor.getResolvedSnapshotDependencies().get( "external:artifactId" );
+        DependencyVersions versionsMap = builder.build().getResolvedSnapshotDependencies().get( "external:artifactId" );
 
         assertNotNull( versionsMap );
         assertEquals( "1.1-SNAPSHOT", versionsMap.getDevelopment() );
         assertEquals( "1.0", versionsMap.getRelease() );
 
-        versionsMap = releaseDescriptor.getResolvedSnapshotDependencies().get( "external:artifactId2" );
+        versionsMap = builder.build().getResolvedSnapshotDependencies().get( "external:artifactId2" );
 
         assertNotNull( versionsMap );
         assertEquals( "1.1-SNAPSHOT", versionsMap.getDevelopment() );
@@ -654,7 +654,7 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects =
             createDescriptorFromProjects( "internal-and-external-snapshot-dependencies" );
 
@@ -662,7 +662,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -675,7 +675,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -689,12 +689,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testNoSnapshotReportPlugins()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "no-snapshot-report-plugins" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -704,12 +704,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotReportPluginsInProjectOnly()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "internal-snapshot-report-plugins" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -722,14 +722,14 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-snapshot-report-plugins" );
 
         phase.setPrompter( createNoMockPrompter() );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -742,7 +742,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -759,7 +759,7 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects =
             createDescriptorFromProjects( "internal-and-external-snapshot-report-plugins" );
 
@@ -767,7 +767,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -780,7 +780,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -794,12 +794,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testNoSnapshotPlugins()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "no-snapshot-plugins" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -809,12 +809,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotPluginsInProjectOnly()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "internal-snapshot-plugins" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -824,12 +824,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotManagedPluginInProjectOnly()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "internal-managed-snapshot-plugin" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -839,12 +839,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotUnusedInternalManagedPlugin()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "unused-internal-managed-snapshot-plugin" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -854,12 +854,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotUnusedExternalManagedPlugin()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "unused-external-managed-snapshot-plugin" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -872,14 +872,14 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-managed-snapshot-plugin" );
 
         phase.setPrompter( createNoMockPrompter() );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -892,7 +892,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -909,14 +909,14 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-snapshot-plugins" );
 
         phase.setPrompter( createNoMockPrompter() );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -929,7 +929,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -946,14 +946,14 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "internal-and-external-snapshot-plugins" );
 
         phase.setPrompter( createNoMockPrompter() );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -966,7 +966,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -983,14 +983,14 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-snapshot-parent/child" );
 
         phase.setPrompter( createNoMockPrompter() );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -1003,7 +1003,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -1020,17 +1020,17 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-snapshot-parent/child" );
 
         Prompter mockPrompter = createMockPrompter( YES, DEFAULT_CHOICE, new VersionPair( "1.0-test", "1.0-test" ),
                                                     new VersionPair( "1.0", "1.0-test" ) );
         phase.setPrompter( mockPrompter );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // validate
-        DependencyVersions versionsMap = releaseDescriptor.getResolvedSnapshotDependencies().get( "groupId:parent-external" );
+        DependencyVersions versionsMap = builder.build().getResolvedSnapshotDependencies().get( "groupId:parent-external" );
 
         assertNotNull( versionsMap );
         assertEquals( "1.0-test", versionsMap.getDevelopment() );
@@ -1041,12 +1041,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testReleaseExternalParent()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-parent/child" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -1059,14 +1059,14 @@ public class CheckDependencySnapshotsPhaseTest
         CheckDependencySnapshotsPhase phase =
             (CheckDependencySnapshotsPhase) lookup( ReleasePhase.class, "check-dependency-snapshots" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-snapshot-extension" );
 
         phase.setPrompter( createNoMockPrompter() );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -1079,7 +1079,7 @@ public class CheckDependencySnapshotsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -1093,12 +1093,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testSnapshotInternalExtension()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "internal-snapshot-extension" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -1108,12 +1108,12 @@ public class CheckDependencySnapshotsPhaseTest
     public void testReleaseExternalExtension()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects = createDescriptorFromProjects( "external-extension" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -1123,16 +1123,16 @@ public class CheckDependencySnapshotsPhaseTest
     public void testAllowTimestampedSnapshots()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();;
         List<MavenProject> reactorProjects =
             createDescriptorFromProjects( "external-timestamped-snapshot-dependencies" );
 
-        releaseDescriptor.setInteractive( false );
+        builder.setInteractive( false );
 
         // confirm POM fails without allowTimestampedSnapshots
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Should have failed execution" );
         }
@@ -1142,11 +1142,11 @@ public class CheckDependencySnapshotsPhaseTest
         }
 
         // check whether flag allows
-        releaseDescriptor.setAllowTimestampedSnapshots( true );
+        builder.setAllowTimestampedSnapshots( true );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // successful execution is verification enough
         assertTrue( true );
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckPomPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckPomPhaseTest.java
index 3e3eac4..fb9c3a1 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckPomPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckPomPhaseTest.java
@@ -23,7 +23,7 @@ import org.apache.maven.model.Model;
 import org.apache.maven.model.Scm;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.ReleaseFailureException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.codehaus.plexus.PlexusTestCase;
@@ -52,12 +52,12 @@ public class CheckPomPhaseTest
     public void testCorrectlyConfigured()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0-SNAPSHOT" ) ) );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0-SNAPSHOT" ) ) );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0-SNAPSHOT" ) ) );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0-SNAPSHOT" ) ) );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -66,65 +66,65 @@ public class CheckPomPhaseTest
     public void testGetUrlFromProjectConnection()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         MavenProject project = createProject( "1.0-SNAPSHOT" );
         Scm scm = new Scm();
         scm.setConnection( "scm:svn:file://localhost/tmp/repo" );
         project.setScm( scm );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
 
-        assertEquals( "Check URL", "scm:svn:file://localhost/tmp/repo", releaseDescriptor.getScmSourceUrl() );
+        assertEquals( "Check URL", "scm:svn:file://localhost/tmp/repo", builder.build().getScmSourceUrl() );
     }
 
     public void testGetUrlFromProjectConnectionSimulate()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         MavenProject project = createProject( "1.0-SNAPSHOT" );
         Scm scm = new Scm();
         scm.setConnection( "scm:svn:file://localhost/tmp/repo" );
         project.setScm( scm );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
 
-        assertEquals( "Check URL", "scm:svn:file://localhost/tmp/repo", releaseDescriptor.getScmSourceUrl() );
+        assertEquals( "Check URL", "scm:svn:file://localhost/tmp/repo", builder.build().getScmSourceUrl() );
     }
 
     public void testGetUrlFromProjectDevConnection()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         MavenProject project = createProject( "1.0-SNAPSHOT" );
         Scm scm = new Scm();
         scm.setConnection( "scm:svn:file://localhost/tmp/repo" );
         scm.setDeveloperConnection( "scm:svn:https://localhost/tmp/repo" );
         project.setScm( scm );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
 
-        assertEquals( "Check URL", "scm:svn:https://localhost/tmp/repo", releaseDescriptor.getScmSourceUrl() );
+        assertEquals( "Check URL", "scm:svn:https://localhost/tmp/repo", builder.build().getScmSourceUrl() );
     }
 
     public void testGetUrlFromProjectDevConnectionSimulate()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         MavenProject project = createProject( "1.0-SNAPSHOT" );
         Scm scm = new Scm();
         scm.setConnection( "scm:svn:file://localhost/tmp/repo" );
         scm.setDeveloperConnection( "scm:svn:https://localhost/tmp/repo" );
         project.setScm( scm );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
 
-        assertEquals( "Check URL", "scm:svn:https://localhost/tmp/repo", releaseDescriptor.getScmSourceUrl() );
+        assertEquals( "Check URL", "scm:svn:https://localhost/tmp/repo", builder.build().getScmSourceUrl() );
     }
 
     public void testGetInvalidUrl()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         MavenProject project = createProject( "1.0-SNAPSHOT" );
         Scm scm = new Scm();
         scm.setConnection( "scm:cvs:" );
@@ -132,7 +132,7 @@ public class CheckPomPhaseTest
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
 
             fail( "Should have thrown an exception" );
         }
@@ -145,7 +145,7 @@ public class CheckPomPhaseTest
     public void testGetInvalidProvider()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         MavenProject project = createProject( "1.0-SNAPSHOT" );
         Scm scm = new Scm();
         scm.setConnection( "scm:foo:" );
@@ -153,7 +153,7 @@ public class CheckPomPhaseTest
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( project ) );
 
             fail( "Should have thrown an exception" );
         }
@@ -166,11 +166,11 @@ public class CheckPomPhaseTest
     public void testMissingUrl()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0-SNAPSHOT" ) ) );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0-SNAPSHOT" ) ) );
 
             fail( "Should have failed to execute" );
         }
@@ -181,7 +181,7 @@ public class CheckPomPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0-SNAPSHOT" ) ) );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0-SNAPSHOT" ) ) );
 
             fail( "Should have failed to simulate" );
         }
@@ -194,12 +194,12 @@ public class CheckPomPhaseTest
     public void testReleasingNonSnapshot()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0" ) ) );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0" ) ) );
 
             fail( "Should have failed to execute" );
         }
@@ -210,7 +210,7 @@ public class CheckPomPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0" ) ) );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), Collections.singletonList( createProject( "1.0" ) ) );
 
             fail( "Should have failed to simulate" );
         }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScmTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScmTest.java
index 8f714aa..a920943 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScmTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScmTest.java
@@ -45,7 +45,7 @@ import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
 import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 import org.apache.maven.shared.release.ReleaseExecutionException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.stubs.ScmManagerStub;
@@ -73,13 +73,13 @@ public class CheckoutProjectFromScmTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         File checkoutDirectory = getTestFile( "target/checkout-test/standard" );
-        descriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        descriptor.setScmReleaseLabel( "release-label" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setScmReleaseLabel( "release-label" );
         String sourceUrl = "file://localhost/tmp/scm-repo/trunk";
         String scmUrl = "scm:svn:" + sourceUrl;
-        descriptor.setScmSourceUrl( scmUrl );
+        builder.setScmSourceUrl( scmUrl );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
         SvnScmProviderRepository scmProviderRepository = new SvnScmProviderRepository( sourceUrl );
@@ -98,10 +98,10 @@ public class CheckoutProjectFromScmTest
         List<MavenProject> reactorProjects = createReactorProjects( dir, dir, null );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // prepare
-        assertEquals( "", descriptor.getScmRelativePathProjectDirectory() );
+        assertEquals( "", builder.build().getScmRelativePathProjectDirectory() );
 
         verify( scmProviderMock ).checkOut( eq( repository ),
                                             argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
@@ -115,13 +115,13 @@ public class CheckoutProjectFromScmTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         File checkoutDirectory = getTestFile( "target/checkout-test/multimodule-with-deep-subprojects" );
-        descriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        descriptor.setScmReleaseLabel( "release-label" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setScmReleaseLabel( "release-label" );
         String sourceUrl = "file://localhost/tmp/scm-repo/trunk";
         String scmUrl = "scm:svn:" + sourceUrl;
-        descriptor.setScmSourceUrl( scmUrl );
+        builder.setScmSourceUrl( scmUrl );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
         SvnScmProviderRepository scmProviderRepository = new SvnScmProviderRepository( sourceUrl );
@@ -141,10 +141,10 @@ public class CheckoutProjectFromScmTest
             createReactorProjects( dir, dir, null );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "", descriptor.getScmRelativePathProjectDirectory() );
+        assertEquals( "", builder.build().getScmRelativePathProjectDirectory() );
 
         verify( scmProviderMock ).checkOut( eq( repository ),
                                             argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
@@ -158,13 +158,13 @@ public class CheckoutProjectFromScmTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         File checkoutDirectory = getTestFile( "target/checkout-test/flat-multi-module" );
-        descriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        descriptor.setScmReleaseLabel( "release-label" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setScmReleaseLabel( "release-label" );
         String sourceUrl = "file://localhost/tmp/scm-repo/trunk/root-project";
         String scmUrl = "scm:svn:" + sourceUrl;
-        descriptor.setScmSourceUrl( scmUrl );
+        builder.setScmSourceUrl( scmUrl );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
         SvnScmProviderRepository scmProviderRepository = new SvnScmProviderRepository( sourceUrl );
@@ -183,11 +183,11 @@ public class CheckoutProjectFromScmTest
             createReactorProjects( "rewrite-for-release/pom-with-parent-flat", "root-project" );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "not found root-project but " + descriptor.getScmRelativePathProjectDirectory(), "root-project",
-                      descriptor.getScmRelativePathProjectDirectory() );
+        assertEquals( "not found root-project but " + builder.build().getScmRelativePathProjectDirectory(), "root-project",
+                      builder.build().getScmRelativePathProjectDirectory() );
 
         verify( scmProviderMock ).checkOut( eq( repository ),
                                             argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
@@ -201,9 +201,9 @@ public class CheckoutProjectFromScmTest
                     throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
 
         ScmManagerStub scmManagerStub = (ScmManagerStub) lookup( ScmManager.class );
         scmManagerStub.setException( new NoSuchScmProviderException( "..." )  );
@@ -214,9 +214,9 @@ public class CheckoutProjectFromScmTest
         // execute
         try
         {
-            releaseDescriptor.setUseReleaseProfile( false );
+            builder.setUseReleaseProfile( false );
 
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "commit should have failed" );
         }
@@ -231,9 +231,9 @@ public class CheckoutProjectFromScmTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
 
         ScmManagerStub scmManagerStub = (ScmManagerStub) lookup( ScmManager.class );
         scmManagerStub.setException( new ScmRepositoryException( "..." )  );
@@ -244,9 +244,9 @@ public class CheckoutProjectFromScmTest
         // execute
         try
         {
-            releaseDescriptor.setUseReleaseProfile( false );
+            builder.setUseReleaseProfile( false );
 
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "commit should have failed" );
         }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/EndReleasePhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/EndReleasePhaseTest.java
index 1c17c64..c0c259e 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/EndReleasePhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/EndReleasePhaseTest.java
@@ -25,7 +25,7 @@ import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.ReleaseResult;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.junit.Test;
 
@@ -45,14 +45,14 @@ public class EndReleasePhaseTest
     {
         super.setUp();
 
-        phase = (ReleasePhase) lookup( ReleasePhase.class, "end-release" );
+        phase = lookup( ReleasePhase.class, "end-release" );
     }
 
     @Test
     public void testExecute()
         throws ReleaseExecutionException, ReleaseFailureException
     {
-        ReleaseResult result = phase.execute( new ReleaseDescriptor(), new DefaultReleaseEnvironment(), null );
+        ReleaseResult result = phase.execute( new ReleaseDescriptorBuilder().build(), new DefaultReleaseEnvironment(), null );
 
         assertEquals( ReleaseResult.SUCCESS, result.getResultCode() );
     }
@@ -61,7 +61,7 @@ public class EndReleasePhaseTest
     public void testSimulate()
         throws ReleaseExecutionException, ReleaseFailureException
     {
-        ReleaseResult result = phase.simulate( new ReleaseDescriptor(), new DefaultReleaseEnvironment(), null );
+        ReleaseResult result = phase.simulate( new ReleaseDescriptorBuilder().build(), new DefaultReleaseEnvironment(), null );
 
         assertEquals( ReleaseResult.SUCCESS, result.getResultCode() );
     }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhaseTest.java
index d261323..bea2c94 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhaseTest.java
@@ -45,7 +45,7 @@ import org.apache.maven.scm.manager.ScmManager;
 import org.apache.maven.scm.manager.ScmManagerStub;
 import org.apache.maven.scm.provider.ScmProvider;
 import org.apache.maven.scm.repository.ScmRepository;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.util.ReleaseUtil;
 import org.junit.Test;
@@ -100,9 +100,9 @@ public class GenerateReleasePomsPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "external-range-dependency" );
-        ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createMappedConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         comparePomFiles( reactorProjects );
     }
@@ -113,13 +113,13 @@ public class GenerateReleasePomsPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setGenerateReleasePoms( true );
-        config.setSuppressCommitBeforeTagOrBranch( true );
-        config.setRemoteTagging( false );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setGenerateReleasePoms( true );
+        builder.setSuppressCommitBeforeTagOrBranch( true );
+        builder.setRemoteTagging( false );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         verify( scmProviderMock ).add( isA( ScmRepository.class ), isA( ScmFileSet.class ) );
 
@@ -131,13 +131,13 @@ public class GenerateReleasePomsPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setGenerateReleasePoms( true );
-        config.setSuppressCommitBeforeTagOrBranch( true );
-        config.setRemoteTagging( true );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setGenerateReleasePoms( true );
+        builder.setSuppressCommitBeforeTagOrBranch( true );
+        builder.setRemoteTagging( true );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         verify( scmProviderMock ).add( isA( ScmRepository.class ), isA( ScmFileSet.class ) );
 
@@ -150,10 +150,10 @@ public class GenerateReleasePomsPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-finalname" );
-        ReleaseDescriptor config = createConfigurationForWithParentNextVersion( reactorProjects );
-        config.setGenerateReleasePoms( true );
+        ReleaseDescriptorBuilder builder = createConfigurationForWithParentNextVersion( reactorProjects );
+        builder.setGenerateReleasePoms( true );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -164,12 +164,12 @@ public class GenerateReleasePomsPhaseTest
      * util.List)
      */
     @Override
-    protected ReleaseDescriptor createDescriptorFromProjects( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createDescriptorFromProjects( List<MavenProject> reactorProjects )
     {
-        ReleaseDescriptor descriptor = super.createDescriptorFromProjects( reactorProjects );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setGenerateReleasePoms( true );
-        return descriptor;
+        ReleaseDescriptorBuilder builder = super.createDescriptorFromProjects( reactorProjects );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setGenerateReleasePoms( true );
+        return builder;
     }
 
     /*
@@ -230,14 +230,10 @@ public class GenerateReleasePomsPhaseTest
         verifyNoMoreInteractions( scmProviderMock );
     }
 
-    /*
-     * @see org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#mapNextVersion(org.apache.maven.
-     * shared.release.config.ReleaseDescriptor, java.lang.String)
-     */
     @Override
-    protected void mapNextVersion( ReleaseDescriptor config, String projectId )
+    protected void mapNextVersion( ReleaseDescriptorBuilder config, String projectId )
     {
-        config.mapReleaseVersion( projectId, NEXT_VERSION );
+        config.addReleaseVersion( projectId, NEXT_VERSION );
     }
 
     /*
@@ -246,9 +242,9 @@ public class GenerateReleasePomsPhaseTest
      * maven.shared.release.config.ReleaseDescriptor, java.lang.String)
      */
     @Override
-    protected void mapAlternateNextVersion( ReleaseDescriptor config, String projectId )
+    protected void mapAlternateNextVersion( ReleaseDescriptorBuilder config, String projectId )
     {
-        config.mapReleaseVersion( projectId, ALTERNATIVE_NEXT_VERSION );
+        config.addReleaseVersion( projectId, ALTERNATIVE_NEXT_VERSION );
     }
 
     /*
@@ -257,7 +253,7 @@ public class GenerateReleasePomsPhaseTest
      * shared.release.config.ReleaseDescriptor, java.lang.String)
      */
     @Override
-    protected void unmapNextVersion( ReleaseDescriptor config, String projectId )
+    protected void unmapNextVersion( ReleaseDescriptorBuilder config, String projectId )
     {
         // nothing to do
     }
@@ -267,15 +263,15 @@ public class GenerateReleasePomsPhaseTest
      * createConfigurationForPomWithParentAlternateNextVersion(java.util.List)
      */
     @Override
-    protected ReleaseDescriptor createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
 
-        return config;
+        return builder;
     }
 
     /*
@@ -283,15 +279,15 @@ public class GenerateReleasePomsPhaseTest
      * createConfigurationForWithParentNextVersion(java.util.List)
      */
     @Override
-    protected ReleaseDescriptor createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", NEXT_VERSION );
 
-        return config;
+        return builder;
     }
 
     /*
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java
index 8342fbd..1e37c55 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java
@@ -18,8 +18,10 @@ package org.apache.maven.shared.release.phase;
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Matchers.isA;
 import static org.mockito.Mockito.mock;
@@ -35,7 +37,7 @@ import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
@@ -71,26 +73,26 @@ public class InputVariablesPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "tag-value", builder.build().getScmReleaseLabel() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "simulated-tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "simulated-tag-value", builder.build().getScmReleaseLabel() );
 
         verify( mockPrompter, times( 2 ) ).prompt( isA( String.class ), eq( "artifactId-1.0" ) );
         verifyNoMoreInteractions( mockPrompter );
@@ -102,11 +104,11 @@ public class InputVariablesPhaseTest
     {
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -115,11 +117,11 @@ public class InputVariablesPhaseTest
             assertNull( "check no cause", e.getCause() );
         }
 
-        releaseDescriptor = new ReleaseDescriptor();
+        builder = new ReleaseDescriptorBuilder();
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -139,28 +141,28 @@ public class InputVariablesPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "artifactId-1.0", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "artifactId-1.0", builder.build().getScmReleaseLabel() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "artifactId-1.0", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "artifactId-1.0", builder.build().getScmReleaseLabel() );
 
         // never use prompter
         verifyNoMoreInteractions( mockPrompter );
@@ -176,26 +178,26 @@ public class InputVariablesPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setScmReleaseLabel( "tag-value" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.setScmReleaseLabel( "tag-value" );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "tag-value", builder.build().getScmReleaseLabel() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.setScmReleaseLabel( "simulated-tag-value" );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "simulated-tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "simulated-tag-value", builder.build().getScmReleaseLabel() );
 
         // never use prompter
         verifyNoMoreInteractions( mockPrompter );
@@ -211,24 +213,24 @@ public class InputVariablesPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmReleaseLabel( "tag-value" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmReleaseLabel( "tag-value" );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "tag-value", builder.build().getScmReleaseLabel() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setScmReleaseLabel( "simulated-tag-value" );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "simulated-tag-value", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "simulated-tag-value", builder.build().getScmReleaseLabel() );
 
         // never use prompter
         verifyNoMoreInteractions( mockPrompter );
@@ -246,14 +248,14 @@ public class InputVariablesPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -263,14 +265,14 @@ public class InputVariablesPhaseTest
         }
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -295,28 +297,28 @@ public class InputVariablesPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseConfiguration = new ReleaseDescriptor();
-        releaseConfiguration.setInteractive( false );
-        releaseConfiguration.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseConfiguration.setScmSourceUrl( "scm:cvs:pserver:anoncvs@localhost:/tmp/scm-repo:module" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:cvs:pserver:anoncvs@localhost:/tmp/scm-repo:module" );
 
         // execute
-        phase.execute( releaseConfiguration, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "artifactId-1_0", releaseConfiguration.getScmReleaseLabel() );
+        assertEquals( "Check tag", "artifactId-1_0", builder.build().getScmReleaseLabel() );
 
         // prepare
-        releaseConfiguration = new ReleaseDescriptor();
-        releaseConfiguration.setInteractive( false );
-        releaseConfiguration.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseConfiguration.setScmSourceUrl( "scm:cvs:pserver:anoncvs@localhost:/tmp/scm-repo:module" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:cvs:pserver:anoncvs@localhost:/tmp/scm-repo:module" );
 
         // execute
-        phase.simulate( releaseConfiguration, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "artifactId-1_0", releaseConfiguration.getScmReleaseLabel() );
+        assertEquals( "Check tag", "artifactId-1_0", builder.build().getScmReleaseLabel() );
 
         // never use prompter
         verifyNoMoreInteractions( mockPrompter );
@@ -332,29 +334,29 @@ public class InputVariablesPhaseTest
         phase.setPrompter( mockPrompter );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "artifactId-1.0", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "artifactId-1.0", builder.build().getScmReleaseLabel() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
-        releaseDescriptor.setScmTagNameFormat( "simulated-@{artifactId}-@{version}" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.addReleaseVersion( "groupId:artifactId", "1.0" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        builder.setScmTagNameFormat( "simulated-@{artifactId}-@{version}" );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertEquals( "Check tag", "simulated-artifactId-1.0", releaseDescriptor.getScmReleaseLabel() );
+        assertEquals( "Check tag", "simulated-artifactId-1.0", builder.build().getScmReleaseLabel() );
 
         // never use prompter
         verifyNoMoreInteractions( mockPrompter );
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapDevelopmentVersionPhaseIT.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapDevelopmentVersionPhaseIT.java
index 9f03a92..9920544 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapDevelopmentVersionPhaseIT.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapDevelopmentVersionPhaseIT.java
@@ -24,7 +24,7 @@ import java.util.List;
 
 import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.codehaus.plexus.PlexusTestCase;
 
@@ -52,13 +52,13 @@ public class MapDevelopmentVersionPhaseIT
 
     public void testNoUpdateWorkingCopyVersions() throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setUpdateWorkingCopyVersions( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.setUpdateWorkingCopyVersions( false );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
-        mapVersionsPhase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        mapVersionsPhase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        assertEquals( "1.0", releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+        assertEquals( "1.0", builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapVersionsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapVersionsPhaseTest.java
index 8feb4aa..96642c1 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapVersionsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapVersionsPhaseTest.java
@@ -40,7 +40,7 @@ import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.policy.PolicyException;
 import org.apache.maven.shared.release.versions.VersionParseException;
@@ -103,14 +103,14 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
 
         verify( mockPrompter ).prompt( startsWith( "What is the release version for \"" + project.getName() + "\"?" ),
                                        eq( "1.0" ) );
@@ -130,14 +130,14 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         verify( mockPrompter ).prompt( startsWith( "What is the release version for \"" + project.getName() + "\"?" ),
                                        eq( "1.0" ) );
     }
@@ -157,24 +157,24 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.0.0" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
+        builder = new ReleaseDescriptorBuilder();
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.0.0" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         verify( mockPrompter,
                 times( 2 ) ).prompt( startsWith( "What is the release version for \"" + project.getName() + "\"?" ),
                                      eq( "1.0" ) );
@@ -197,24 +197,24 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
+        builder = new ReleaseDescriptorBuilder();
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
 
         verify( mockPrompter,
                 times( 2 ) ).prompt( startsWith( "What is the release version for \"" + project.getName() + "\"?" ),
@@ -233,28 +233,28 @@ public class MapVersionsPhaseTest
 
         MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.addReleaseVersion( "groupId:artifactId", "2.0" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.addReleaseVersion( "groupId:artifactId", "2.0" );
 
         phase.setPrompter( mockPrompter );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.addReleaseVersion( "groupId:artifactId", "2.0" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.addReleaseVersion( "groupId:artifactId", "2.0" );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
     }
 
     @Test
@@ -266,15 +266,15 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.0" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
     }
 
     @Test
@@ -286,15 +286,15 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.0" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
     }
 
     @Test
@@ -311,24 +311,24 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
+        builder = new ReleaseDescriptorBuilder();
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
 
         verify( mockPrompter, times( 2 ) ).prompt( startsWith( "What is the new development version for \""
             + project.getName() + "\"?" ), eq( "1.1-SNAPSHOT" ) );
@@ -349,26 +349,26 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setUpdateWorkingCopyVersions( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setUpdateWorkingCopyVersions( false );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.0" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setUpdateWorkingCopyVersions( false );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setUpdateWorkingCopyVersions( false );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.0" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -382,26 +382,26 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     /**
@@ -417,28 +417,28 @@ public class MapVersionsPhaseTest
 
         phase.setPrompter( mockPrompter );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.addDevelopmentVersion( "groupId:artifactId", "2-SNAPSHOT" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.addDevelopmentVersion( "groupId:artifactId", "2-SNAPSHOT" );
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.addDevelopmentVersion( "groupId:artifactId", "2-SNAPSHOT" );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
+        builder.addDevelopmentVersion( "groupId:artifactId", "2-SNAPSHOT" );
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -454,12 +454,12 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -469,12 +469,12 @@ public class MapVersionsPhaseTest
         }
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
+        builder = new ReleaseDescriptorBuilder();
 
         // execute
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -501,24 +501,24 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
         // execute
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
 
         // prepare
-        releaseDescriptor = new ReleaseDescriptor();
+        builder = new ReleaseDescriptorBuilder();
 
         // execute
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
 
         verify( mockPrompter, times( 2 ) ).prompt( startsWith( "What is the new development version for \""
             + project.getName() + "\"?" ), eq( "1.1-SNAPSHOT" ) );
@@ -532,12 +532,12 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "foo" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -546,12 +546,12 @@ public class MapVersionsPhaseTest
             assertEquals( "check cause", VersionParseException.class, e.getCause().getClass() );
         }
 
-        releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
+        builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected an exception" );
         }
@@ -570,17 +570,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.1.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -592,17 +592,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.1.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -614,18 +614,18 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.1.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -637,18 +637,18 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.1.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -660,17 +660,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -682,17 +682,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -704,16 +704,16 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.1.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -725,16 +725,16 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.1.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -746,17 +746,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.1.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -768,17 +768,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setDefaultDevelopmentVersion( "1.1.1-SNAPSHOT" );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.1.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -790,16 +790,16 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -811,16 +811,16 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -832,17 +832,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -854,17 +854,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -876,17 +876,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -898,17 +898,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -920,18 +920,18 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -943,18 +943,18 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -966,18 +966,18 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -989,18 +989,18 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1012,18 +1012,18 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1035,18 +1035,18 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1058,18 +1058,18 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1081,18 +1081,18 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1104,19 +1104,19 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1128,19 +1128,19 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1152,13 +1152,13 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         /*
@@ -1167,9 +1167,9 @@ public class MapVersionsPhaseTest
          * '1.2' instead of '1.3-SNAPSHOT' until further investigation.
          */
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1181,13 +1181,13 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         /*
@@ -1196,9 +1196,9 @@ public class MapVersionsPhaseTest
          * '1.2' instead of '1.3-SNAPSHOT' until further investigation.
          */
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1210,22 +1210,22 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setUpdateBranchVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
+        builder.setUpdateBranchVersions( true );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         // updateBranchVersions is set to true, so suggest the next snapshot version
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
         // org.apache.maven.release:maven-release-manager:[2.4,) > 1.3-SNAPSHOT
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1237,22 +1237,22 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setUpdateBranchVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setInteractive( false );
+        builder.setUpdateBranchVersions( true );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         // updateBranchVersions is set to true, so suggest the next snapshot version
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
         // org.apache.maven.release:maven-release-manager:[2.4,) > 1.3-SNAPSHOT
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.3-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1264,20 +1264,20 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setDefaultReleaseVersion( "2.1-SNAPSHOT" );
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setUpdateBranchVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setDefaultReleaseVersion( "2.1-SNAPSHOT" );
+        builder.setInteractive( false );
+        builder.setUpdateBranchVersions( true );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "2.1-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1289,20 +1289,20 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setDefaultReleaseVersion( "2.1-SNAPSHOT" );
-        releaseDescriptor.setInteractive( false );
-        releaseDescriptor.setUpdateBranchVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setDefaultReleaseVersion( "2.1-SNAPSHOT" );
+        builder.setInteractive( false );
+        builder.setUpdateBranchVersions( true );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "2.1-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1314,19 +1314,19 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setDefaultReleaseVersion( "2.1-SNAPSHOT" );
-        releaseDescriptor.setUpdateBranchVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setDefaultReleaseVersion( "2.1-SNAPSHOT" );
+        builder.setUpdateBranchVersions( true );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "2.1-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1338,19 +1338,19 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setDefaultReleaseVersion( "2.1-SNAPSHOT" );
-        releaseDescriptor.setUpdateBranchVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setDefaultReleaseVersion( "2.1-SNAPSHOT" );
+        builder.setUpdateBranchVersions( true );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "2.1-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1362,9 +1362,9 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateBranchVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateBranchVersions( true );
 
         // updateBranchVersions is set to true, so suggest the next snapshot version
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
@@ -1374,7 +1374,7 @@ public class MapVersionsPhaseTest
         phase.setPrompter( mockPrompter );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
@@ -1391,9 +1391,9 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateBranchVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateBranchVersions( true );
 
         // updateBranchVersions is set to true, so suggest the next snapshot version
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
@@ -1403,7 +1403,7 @@ public class MapVersionsPhaseTest
         phase.setPrompter( mockPrompter );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
@@ -1420,10 +1420,10 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateBranchVersions( true );
-        releaseDescriptor.setUpdateVersionsToSnapshot( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateBranchVersions( true );
+        builder.setUpdateVersionsToSnapshot( true );
 
         // updateBranchVersions is set to true, so suggest the next snapshot version
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT (yes, one step back!)
@@ -1433,16 +1433,16 @@ public class MapVersionsPhaseTest
         phase.setPrompter( mockPrompter );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT (yes, one step back!)
         // org.apache.maven.release:maven-release-manager:[2.4,) > 1.3-SNAPSHOT
         verify( mockPrompter ).prompt( startsWith( "What is the branch version for" ), eq( "1.3-SNAPSHOT" ) );
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "2.1-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1454,10 +1454,10 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateBranchVersions( true );
-        releaseDescriptor.setUpdateVersionsToSnapshot( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateBranchVersions( true );
+        builder.setUpdateVersionsToSnapshot( true );
 
         // updateBranchVersions is set to true, so suggest the next snapshot version
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT (yes, one step back!)
@@ -1467,16 +1467,16 @@ public class MapVersionsPhaseTest
         phase.setPrompter( mockPrompter );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT (yes, one step back!)
         // org.apache.maven.release:maven-release-manager:[2.4,) > 1.3-SNAPSHOT
         verify( mockPrompter ).prompt( startsWith( "What is the branch version for" ), eq( "1.3-SNAPSHOT" ) );
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "2.1-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1488,10 +1488,10 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateBranchVersions( true );
-        releaseDescriptor.setUpdateVersionsToSnapshot( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateBranchVersions( true );
+        builder.setUpdateVersionsToSnapshot( true );
 
         // updateBranchVersions is set to true, so suggest the next snapshot version
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
@@ -1501,7 +1501,7 @@ public class MapVersionsPhaseTest
         phase.setPrompter( mockPrompter );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
@@ -1518,10 +1518,10 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateBranchVersions( true );
-        releaseDescriptor.setUpdateVersionsToSnapshot( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateBranchVersions( true );
+        builder.setUpdateVersionsToSnapshot( true );
 
         // updateBranchVersions is set to true, so suggest the next snapshot version
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
@@ -1531,7 +1531,7 @@ public class MapVersionsPhaseTest
         phase.setPrompter( mockPrompter );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
@@ -1548,11 +1548,11 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         /*
@@ -1561,9 +1561,9 @@ public class MapVersionsPhaseTest
          * '1.2' instead of '1.3-SNAPSHOT' until further investigation.
          */
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1575,11 +1575,11 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         /*
@@ -1588,9 +1588,9 @@ public class MapVersionsPhaseTest
          * '1.2' instead of '1.3-SNAPSHOT' until further investigation.
          */
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1602,17 +1602,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateWorkingCopyVersions( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateWorkingCopyVersions( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -1624,17 +1624,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateWorkingCopyVersions( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateWorkingCopyVersions( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -1646,17 +1646,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
         // org.apache.maven.release:maven-release-manager:(,2.4) > true
         // org.apache.maven.release:maven-release-manager:[2.4,) > false
-        releaseDescriptor.setInteractive( false );
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        builder.setInteractive( false );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -1668,19 +1668,19 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
         // org.apache.maven.release:maven-release-manager:(,2.4) > true
         // org.apache.maven.release:maven-release-manager:[2.4,) > false
-        releaseDescriptor.setInteractive( false );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -1692,17 +1692,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1714,17 +1714,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2-SNAPSHOT" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1736,17 +1736,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateWorkingCopyVersions( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateWorkingCopyVersions( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.2-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -1758,17 +1758,17 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateWorkingCopyVersions( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateWorkingCopyVersions( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "1.2-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
     }
 
     @Test
@@ -1780,21 +1780,21 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateBranchVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateBranchVersions( true );
         // org.apache.maven.release:maven-release-manager:(,2.4) > true
         // org.apache.maven.release:maven-release-manager:[2.4,) > false
-        releaseDescriptor.setInteractive( false );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1806,21 +1806,21 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateBranchVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateBranchVersions( true );
         // org.apache.maven.release:maven-release-manager:(,2.4) > true
         // org.apache.maven.release:maven-release-manager:[2.4,) > false
-        releaseDescriptor.setInteractive( false );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "1.2" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
         assertNull( "Check development versions",
-                    releaseDescriptor.getDevelopmentVersions().get( "groupId:artifactId" ) );
+                    builder.build().getDevelopmentVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1832,16 +1832,16 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateWorkingCopyVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateWorkingCopyVersions( true );
 
         when( mockPrompter.prompt( startsWith( "What is the new working copy version for" ),
                                    eq( "1.3-SNAPSHOT" ) ) ).thenReturn( "2.0-SNAPSHOT" );
         phase.setPrompter( mockPrompter );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( mockPrompter ).prompt( startsWith( "What is the new working copy version for" ), eq( "1.3-SNAPSHOT" ) );
@@ -1856,16 +1856,16 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setBranchCreation( true );
-        releaseDescriptor.setUpdateWorkingCopyVersions( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setBranchCreation( true );
+        builder.setUpdateWorkingCopyVersions( true );
 
         when( mockPrompter.prompt( startsWith( "What is the new working copy version for" ),
                                    eq( "1.3-SNAPSHOT" ) ) ).thenReturn( "2.0-SNAPSHOT" );
         phase.setPrompter( mockPrompter );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( mockPrompter ).prompt( startsWith( "What is the new working copy version for" ), eq( "1.3-SNAPSHOT" ) );
@@ -1882,19 +1882,19 @@ public class MapVersionsPhaseTest
         Collections.addAll( reactorProjects, createProject( "artifactId", "1.2-SNAPSHOT" ),
                             createProject( "module1", "2.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         Map<String, String> developmentVersions = new HashMap<>();
         developmentVersions.put( "groupId:artifactId", "1.3-SNAPSHOT" );
         developmentVersions.put( "groupId:module1", "2.0" );
-        assertEquals( "Check development versions", developmentVersions, releaseDescriptor.getDevelopmentVersions() );
-        assertEquals( "Check release versions", 0, releaseDescriptor.getReleaseVersions().size() );
+        assertEquals( "Check development versions", developmentVersions, builder.build().getDevelopmentVersions() );
+        assertEquals( "Check release versions", 0, builder.build().getReleaseVersions().size() );
     }
 
     @Test
@@ -1908,19 +1908,19 @@ public class MapVersionsPhaseTest
         Collections.addAll( reactorProjects, createProject( "artifactId", "1.2-SNAPSHOT" ),
                             createProject( "module1", "2.0" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         Map<String, String> developmentVersions = new HashMap<>();
         developmentVersions.put( "groupId:artifactId", "1.3-SNAPSHOT" );
         developmentVersions.put( "groupId:module1", "2.0" );
-        assertEquals( "Check development versions", developmentVersions, releaseDescriptor.getDevelopmentVersions() );
-        assertEquals( "Check release versions", 0, releaseDescriptor.getReleaseVersions().size() );
+        assertEquals( "Check development versions", developmentVersions, builder.build().getDevelopmentVersions() );
+        assertEquals( "Check release versions", 0, builder.build().getReleaseVersions().size() );
     }
 
     @Test
@@ -1933,18 +1933,18 @@ public class MapVersionsPhaseTest
         List<MavenProject> reactorProjects =
             Collections.singletonList( createProject( "artifactId", "1.2.1-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setDefaultReleaseVersion( "3.0" );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setDefaultReleaseVersion( "3.0" );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "3.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1957,18 +1957,18 @@ public class MapVersionsPhaseTest
         List<MavenProject> reactorProjects =
             Collections.singletonList( createProject( "artifactId", "1.2.1-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setDefaultReleaseVersion( "3.0" );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setDefaultReleaseVersion( "3.0" );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "3.1-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -1981,18 +1981,18 @@ public class MapVersionsPhaseTest
         List<MavenProject> reactorProjects =
             Collections.singletonList( createProject( "artifactId", "1.2.1-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setDefaultDevelopmentVersion( "3.0-SNAPSHOT" );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setDefaultDevelopmentVersion( "3.0-SNAPSHOT" );
+        builder.setInteractive( false );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "3.0-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     @Test
@@ -2005,18 +2005,18 @@ public class MapVersionsPhaseTest
         List<MavenProject> reactorProjects =
             Collections.singletonList( createProject( "artifactId", "1.2.1-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setAutoVersionSubmodules( true );
-        releaseDescriptor.setDefaultDevelopmentVersion( "3.0-SNAPSHOT" );
-        releaseDescriptor.setInteractive( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setAutoVersionSubmodules( true );
+        builder.setDefaultDevelopmentVersion( "3.0-SNAPSHOT" );
+        builder.setInteractive( false );
 
         // test
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions", Collections.singletonMap( "groupId:artifactId", "3.0-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
-        assertNull( "Check release versions", releaseDescriptor.getReleaseVersions().get( "groupId:artifactId" ) );
+                      builder.build().getDevelopmentVersions() );
+        assertNull( "Check release versions", builder.build().getReleaseVersions().get( "groupId:artifactId" ) );
     }
 
     // MRELEASE-511
@@ -2031,20 +2031,20 @@ public class MapVersionsPhaseTest
         List<MavenProject> reactorProjects =
             Collections.singletonList( createProject( "artifactId", "MYB_200909-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setDefaultReleaseVersion( "PPX" );
-        releaseDescriptor.setDefaultDevelopmentVersion( "MYB_200909-SNAPSHOT" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setDefaultReleaseVersion( "PPX" );
+        builder.setDefaultDevelopmentVersion( "MYB_200909-SNAPSHOT" );
 
         // test
-        mapReleasephase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
-        mapDevelopmentphase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        mapReleasephase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
+        mapDevelopmentphase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         assertEquals( "Check development versions",
                       Collections.singletonMap( "groupId:artifactId", "MYB_200909-SNAPSHOT" ),
-                      releaseDescriptor.getDevelopmentVersions() );
+                      builder.build().getDevelopmentVersions() );
         assertEquals( "Check release versions", Collections.singletonMap( "groupId:artifactId", "PPX" ),
-                      releaseDescriptor.getReleaseVersions() );
+                      builder.build().getReleaseVersions() );
     }
 
     // MRELEASE-269
@@ -2057,7 +2057,7 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "bar", "1.11-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
         when( mockPrompter.prompt( startsWith( "What is the new development version for " ),
                                    eq( "1.12-SNAPSHOT" ) ) ).thenReturn( "2.0" ) // wrong, expected SNAPSHOT
@@ -2065,7 +2065,7 @@ public class MapVersionsPhaseTest
         phase.setPrompter( mockPrompter );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( mockPrompter, times( 2 ) ).prompt( startsWith( "What is the new development version for " ),
@@ -2082,15 +2082,15 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "bar", "1.11-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setDefaultDevelopmentVersion( "" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setDefaultDevelopmentVersion( "" );
 
         when( mockPrompter.prompt( startsWith( "What is the new development version for " ),
                                    eq( "1.12-SNAPSHOT" ) ) ).thenReturn( "2.0-SNAPSHOT" );
         phase.setPrompter( mockPrompter );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( mockPrompter ).prompt( startsWith( "What is the new development version for " ),
@@ -2106,15 +2106,15 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "bar", "1.11-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setDefaultReleaseVersion( "" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setDefaultReleaseVersion( "" );
 
         when( mockPrompter.prompt( startsWith( "What is the release version for " ),
                                    eq( "1.11" ) ) ).thenReturn( "2.0" );
         phase.setPrompter( mockPrompter );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( mockPrompter ).prompt( startsWith( "What is the release version for " ), eq( "1.11" ) );
@@ -2136,11 +2136,11 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0-SNAPSHOT" ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setProjectVersionPolicyId( "UNKNOWN" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setProjectVersionPolicyId( "UNKNOWN" );
 
         // test
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
     }
 
     private static MavenProject createProject( String artifactId, String version )
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RemoveReleasePomsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RemoveReleasePomsPhaseTest.java
index 54caabe..90fd9c4 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RemoveReleasePomsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RemoveReleasePomsPhaseTest.java
@@ -46,7 +46,7 @@ import org.apache.maven.scm.manager.ScmManagerStub;
 import org.apache.maven.scm.provider.ScmProvider;
 import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.shared.release.ReleaseResult;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.util.ReleaseUtil;
 import org.codehaus.plexus.util.IOUtil;
@@ -66,7 +66,7 @@ public class RemoveReleasePomsPhaseTest
     {
         super.setUp();
 
-        phase = (ReleasePhase) lookup( ReleasePhase.class, "remove-release-poms" );
+        phase = lookup( ReleasePhase.class, "remove-release-poms" );
     }
 
     @Test
@@ -74,12 +74,13 @@ public class RemoveReleasePomsPhaseTest
         throws Exception
     {
         // prepare
+        File workingDirectory = getTestFile( "target/test/checkout" );
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
-        ReleaseDescriptor config = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder( workingDirectory );
         MavenProject project = ReleaseUtil.getRootProject( reactorProjects );
 
         File releasePom = ReleaseUtil.getReleasePom( project );
-        ScmFileSet fileSet = new ScmFileSet( new File( config.getWorkingDirectory() ), releasePom );
+        ScmFileSet fileSet = new ScmFileSet( workingDirectory, releasePom );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
         when( scmProviderMock.remove( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -91,7 +92,7 @@ public class RemoveReleasePomsPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).remove( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -104,8 +105,9 @@ public class RemoveReleasePomsPhaseTest
         throws Exception
     {
         // prepare
+        File workingDirectory = getTestFile( "target/test/checkout" );
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-modules" );
-        ReleaseDescriptor config = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         List<File> releasePoms = new ArrayList<>();
         for ( Iterator<MavenProject> iterator = reactorProjects.iterator(); iterator.hasNext(); )
@@ -115,7 +117,7 @@ public class RemoveReleasePomsPhaseTest
             releasePoms.add( releasePom );
         }
 
-        ScmFileSet fileSet = new ScmFileSet( new File( config.getWorkingDirectory() ), releasePoms );
+        ScmFileSet fileSet = new ScmFileSet( workingDirectory, releasePoms );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
         when( scmProviderMock.remove( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -127,7 +129,7 @@ public class RemoveReleasePomsPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).remove( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -141,7 +143,7 @@ public class RemoveReleasePomsPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
-        ReleaseDescriptor config = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
 
@@ -149,7 +151,7 @@ public class RemoveReleasePomsPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // never invoke scmProviderMock
         verifyNoMoreInteractions( scmProviderMock );
@@ -161,9 +163,9 @@ public class RemoveReleasePomsPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
-        ReleaseDescriptor config = createReleaseDescriptor();
-        config.setSuppressCommitBeforeTagOrBranch( true );
-        config.setGenerateReleasePoms( true );
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
+        builder.setSuppressCommitBeforeTagOrBranch( true );
+        builder.setGenerateReleasePoms( true );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
 
@@ -171,7 +173,7 @@ public class RemoveReleasePomsPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        ReleaseResult result = phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        ReleaseResult result = phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         BufferedReader reader = null;
         try
@@ -197,9 +199,9 @@ public class RemoveReleasePomsPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
-        ReleaseDescriptor config = createReleaseDescriptor();
-        config.setSuppressCommitBeforeTagOrBranch( true );
-        config.setGenerateReleasePoms( true );
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
+        builder.setSuppressCommitBeforeTagOrBranch( true );
+        builder.setGenerateReleasePoms( true );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
 
@@ -207,7 +209,7 @@ public class RemoveReleasePomsPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        ReleaseResult result = phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        ReleaseResult result = phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         BufferedReader reader = null;
         try
@@ -236,11 +238,16 @@ public class RemoveReleasePomsPhaseTest
         return createReactorProjects( dir, dir, null );
     }
 
-    private ReleaseDescriptor createReleaseDescriptor()
+    private ReleaseDescriptorBuilder createReleaseDescriptorBuilder()
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setGenerateReleasePoms( true );
-        descriptor.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
-        return descriptor;
+        return createReleaseDescriptorBuilder( getTestFile( "target/test/checkout" ) );
+    }
+    
+    private ReleaseDescriptorBuilder createReleaseDescriptorBuilder( File workingDirectory )
+    {
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setGenerateReleasePoms( true );
+        builder.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+        return builder;
     }
 }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RestoreBackupPomsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RestoreBackupPomsPhaseTest.java
index e6ae373..a7c6110 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RestoreBackupPomsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RestoreBackupPomsPhaseTest.java
@@ -22,11 +22,10 @@ package org.apache.maven.shared.release.phase;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
-import java.util.Iterator;
 import java.util.List;
 
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.util.ReleaseUtil;
 import org.codehaus.plexus.util.FileUtils;
@@ -44,7 +43,7 @@ public class RestoreBackupPomsPhaseTest
     ReleasePhase getReleasePhase()
         throws Exception
     {
-        return (ReleasePhase) lookup( ReleasePhase.class, "restore-backup-poms" );
+        return lookup( ReleasePhase.class, "restore-backup-poms" );
     }
 
     @Test
@@ -84,9 +83,9 @@ public class RestoreBackupPomsPhaseTest
     {
         List<MavenProject> projects = getReactorProjects( getTestPath( path ) );
 
-        ReleaseDescriptor desc = new ReleaseDescriptor();
-        desc.setScmSourceUrl( "scm:svn:http://myhost/myrepo" );
-        phase.execute( desc, new DefaultReleaseEnvironment(), projects );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm:svn:http://myhost/myrepo" );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), projects );
 
         testProjectIsRestored( projects );
     }
@@ -94,10 +93,8 @@ public class RestoreBackupPomsPhaseTest
     private void testProjectIsRestored( List<MavenProject> reactorProjects )
         throws Exception
     {
-        for ( Iterator<MavenProject> projects = reactorProjects.iterator(); projects.hasNext(); )
+        for ( MavenProject project : reactorProjects )
         {
-            MavenProject project = projects.next();
-
             File pomFile = project.getFile();
 
             File expectedFile = new File( pomFile.getParentFile(), expectedPomFilename );
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhaseTest.java
index b9da089..d62b8e3 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhaseTest.java
@@ -25,12 +25,11 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.util.ReleaseUtil;
 import org.junit.Test;
@@ -78,12 +77,12 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
 
         String expected = readTestProjectFile( "basic-pom/pom.xml" );
 
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         String actual = readTestProjectFile( "basic-pom/pom.xml" );
         assertEquals( "Check the original POM untouched", expected, actual );
@@ -98,12 +97,12 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-dashes-in-comment" );
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
 
         String expected = readTestProjectFile( "basic-pom-with-dashes-in-comment/pom.xml" );
 
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         String actual = readTestProjectFile( "basic-pom-with-dashes-in-comment/pom.xml" );
         assertEquals( "Check the original POM is untouched", expected, actual );
@@ -118,14 +117,14 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
 
         File testFile = getTestFile( "target/test-classes/projects/rewrite-for-branch/basic-pom/pom.xml.branch" );
         testFile.delete();
         assertFalse( testFile.exists() );
 
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( testFile.exists() );
 
@@ -139,8 +138,8 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
 
         File testFile = getTestFile( "target/test-classes/projects/rewrite-for-branch/basic-pom/pom.xml.branch" );
         testFile.delete();
@@ -157,50 +156,50 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-overridden-scm" );
-        ReleaseDescriptor config = createConfigurationForWithParentNextVersion( reactorProjects );
-        config.mapReleaseVersion( "groupId:subsubproject", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createConfigurationForWithParentNextVersion( reactorProjects );
+        builder.addReleaseVersion( "groupId:subsubproject", NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
 
     @Override
-    protected void mapAlternateNextVersion( ReleaseDescriptor config, String projectId )
+    protected void mapAlternateNextVersion( ReleaseDescriptorBuilder config, String projectId )
     {
-        config.mapReleaseVersion( projectId, ALTERNATIVE_NEXT_VERSION );
+        config.addReleaseVersion( projectId, ALTERNATIVE_NEXT_VERSION );
     }
 
     @Override
-    protected void mapNextVersion( ReleaseDescriptor config, String projectId )
+    protected void mapNextVersion( ReleaseDescriptorBuilder config, String projectId )
     {
-        config.mapReleaseVersion( projectId, NEXT_VERSION );
+        config.addReleaseVersion( projectId, NEXT_VERSION );
     }
 
     @Override
-    protected ReleaseDescriptor createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
-        return config;
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        return builder;
     }
 
     @Override
-    protected ReleaseDescriptor createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", NEXT_VERSION );
-        return config;
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", NEXT_VERSION );
+        return builder;
     }
 
     @Override
-    protected void unmapNextVersion( ReleaseDescriptor config, String projectId )
+    protected void unmapNextVersion( ReleaseDescriptorBuilder config, String projectId )
     {
         // nothing to do
     }
@@ -211,10 +210,10 @@ public class RewritePomsForBranchPhaseTest
     {
 
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-cvs" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -225,10 +224,10 @@ public class RewritePomsForBranchPhaseTest
     {
 
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-scm-expression" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -239,11 +238,11 @@ public class RewritePomsForBranchPhaseTest
     {
 
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-tag-base" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.setScmBranchBase( "file://localhost/tmp/scm-repo/branches" );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.setScmBranchBase( "file://localhost/tmp/scm-repo/branches" );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -253,11 +252,11 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-tag-base-and-varying-scm-urls" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.setScmBranchBase( "file://localhost/tmp/scm-repo/allprojects/branches" );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.setScmBranchBase( "file://localhost/tmp/scm-repo/allprojects/branches" );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -267,10 +266,10 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-cvs-from-tag" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -280,10 +279,10 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-empty-scm" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -293,9 +292,9 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "interpolated-versions" );
-        ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createMappedConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -305,19 +304,17 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "interpolated-versions" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject2", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject3", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject2", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject3", NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        for ( Iterator<MavenProject> i = reactorProjects.iterator(); i.hasNext(); )
+        for ( MavenProject project : reactorProjects )
         {
-            MavenProject project = i.next();
-
             // skip subproject1 - we don't need to worry about its version mapping change, it has no deps of any kind
             if ( !"groupId".equals( project.getGroupId() ) || !"subproject1".equals( project.getArtifactId() ) )
             {
@@ -331,10 +328,10 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-inherited-scm" );
-        ReleaseDescriptor config = createConfigurationForWithParentNextVersion( reactorProjects );
-        config.mapReleaseVersion( "groupId:subsubproject", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createConfigurationForWithParentNextVersion( reactorProjects );
+        builder.addReleaseVersion( "groupId:subsubproject", NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -345,12 +342,12 @@ public class RewritePomsForBranchPhaseTest
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-parent-and-properties" );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -362,12 +359,12 @@ public class RewritePomsForBranchPhaseTest
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-property-dependency-coordinate" );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1-3.4", ALTERNATIVE_NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1-3.4", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -379,11 +376,11 @@ public class RewritePomsForBranchPhaseTest
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-scm-of-parent-ending-with-a-slash" );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -394,12 +391,12 @@ public class RewritePomsForBranchPhaseTest
     {
         List<MavenProject> reactorProjects = createReactorProjects( "multimodule-with-deep-subprojects" );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -410,9 +407,9 @@ public class RewritePomsForBranchPhaseTest
     {
         List<MavenProject> reactorProjects =
             createReactorProjects( "rewrite-for-branch/pom-with-parent-flat", "root-project" );
-        ReleaseDescriptor config = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
+        ReleaseDescriptorBuilder builder = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -423,23 +420,23 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "cdata-section" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
         AbstractRewritePomsPhase phase = (AbstractRewritePomsPhase) this.phase;
         phase.setLs( "\r\n" );
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // compare POMS without line ending normalization
         assertTrue( comparePomFiles( reactorProjects, false ) );
     }
 
     @Override
-    protected ReleaseDescriptor createDescriptorFromProjects( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createDescriptorFromProjects( List<MavenProject> reactorProjects )
     {
-        ReleaseDescriptor descriptor = super.createDescriptorFromProjects( reactorProjects );
-        descriptor.setScmReleaseLabel( "release-label" );
-        return descriptor;
+        ReleaseDescriptorBuilder builder = super.createDescriptorFromProjects( reactorProjects );
+        builder.setScmReleaseLabel( "release-label" );
+        return builder;
     }
 
     // MRELEASE-454
@@ -448,9 +445,9 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "imported-dependency-management-in-reactor" );
-        ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createMappedConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -460,10 +457,10 @@ public class RewritePomsForBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "modules-with-different-versions" );
-        ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
-        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createMappedConfiguration( reactorProjects );
+        builder.addReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhaseTest.java
index af94c55..f95a5e3 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhaseTest.java
@@ -26,7 +26,6 @@ import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -34,7 +33,7 @@ import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.model.Scm;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.ReleaseExecutionException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.util.ReleaseUtil;
 import org.junit.Test;
@@ -71,13 +70,13 @@ public class RewritePomsForDevelopmentPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsWhenSimulated( "basic-pom" );
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
 
         String expected = readTestProjectFile( "basic-pom/pom.xml" );
 
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         String actual = readTestProjectFile( "basic-pom/pom.xml" );
         assertEquals( "Check the original POM untouched", expected, actual );
@@ -100,15 +99,15 @@ public class RewritePomsForDevelopmentPhaseTest
         List<MavenProject> reactorProjects =
             new LinkedList<>( createReactorProjects( "basic-pom-ejb-client-dep/project" ) );
         reactorProjects.addAll( createReactorProjects( "basic-pom-ejb-client-dep/ejb" ) );
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
-        config.addDevelopmentVersion( ArtifactUtils.versionlessKey( "groupId", "artifactId1" ), NEXT_VERSION );
-        config.addReleaseVersion( ArtifactUtils.versionlessKey( "groupId", "artifactId1" ), RELEASE_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addDevelopmentVersion( ArtifactUtils.versionlessKey( "groupId", "artifactId1" ), NEXT_VERSION );
+        builder.addReleaseVersion( ArtifactUtils.versionlessKey( "groupId", "artifactId1" ), RELEASE_VERSION );
 
         String expected = readTestProjectFile( "basic-pom-ejb-client-dep/project/pom.xml" );
 
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         String actual = readTestProjectFile( "basic-pom-ejb-client-dep/project/pom.xml" );
         assertEquals( "Check the original POM untouched", expected, actual );
@@ -123,15 +122,15 @@ public class RewritePomsForDevelopmentPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsWhenSimulated( "basic-pom" );
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
 
         File testFile = getTestFile( "target/test-classes/projects/rewrite-for-development/basic-pom/pom.xml.next" );
         testFile.delete();
         assertFalse( testFile.exists() );
 
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( testFile.exists() );
 
@@ -145,9 +144,6 @@ public class RewritePomsForDevelopmentPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
 
         File testFile = getTestFile( "target/test-classes/projects/rewrite-for-development/basic-pom/pom.xml.next" );
         testFile.delete();
@@ -164,13 +160,13 @@ public class RewritePomsForDevelopmentPhaseTest
     {
         List<MavenProject> reactorProjects = prepareReactorProjects( "basic-pom", true );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        mapNextVersion( config, "groupId:artifactId" );
+        mapNextVersion( builder, "groupId:artifactId" );
 
         try
         {
-            phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Expected failure" );
         }
@@ -202,73 +198,73 @@ public class RewritePomsForDevelopmentPhaseTest
     }
 
     @Override
-    protected ReleaseDescriptor createDescriptorFromBasicPom( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createDescriptorFromBasicPom( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = super.createDescriptorFromBasicPom( reactorProjects );
+        ReleaseDescriptorBuilder builder = super.createDescriptorFromBasicPom( reactorProjects );
 
-        mapScm( config );
+        mapScm( builder );
 
-        return config;
+        return builder;
     }
 
-    private void mapScm( ReleaseDescriptor config )
+    private void mapScm( ReleaseDescriptorBuilder builder )
     {
         Scm scm = new Scm();
         scm.setConnection( "scm:svn:file://localhost/tmp/scm-repo/trunk" );
         scm.setDeveloperConnection( "scm:svn:file://localhost/tmp/scm-repo/trunk" );
         scm.setUrl( "file://localhost/tmp/scm-repo/trunk" );
-        config.mapOriginalScmInfo( "groupId:artifactId", scm );
+        builder.addOriginalScmInfo( "groupId:artifactId", scm );
     }
 
     @Override
-    protected void mapAlternateNextVersion( ReleaseDescriptor config, String projectId )
+    protected void mapAlternateNextVersion( ReleaseDescriptorBuilder config, String projectId )
     {
-        config.mapReleaseVersion( projectId, ALTERNATIVE_RELEASE_VERSION );
-        config.mapDevelopmentVersion( projectId, ALTERNATIVE_NEXT_VERSION );
+        config.addReleaseVersion( projectId, ALTERNATIVE_RELEASE_VERSION );
+        config.addDevelopmentVersion( projectId, ALTERNATIVE_NEXT_VERSION );
     }
 
     @Override
-    protected void mapNextVersion( ReleaseDescriptor config, String projectId )
+    protected void mapNextVersion( ReleaseDescriptorBuilder config, String projectId )
     {
-        config.mapReleaseVersion( projectId, RELEASE_VERSION );
-        config.mapDevelopmentVersion( projectId, NEXT_VERSION );
+        config.addReleaseVersion( projectId, RELEASE_VERSION );
+        config.addDevelopmentVersion( projectId, NEXT_VERSION );
     }
 
     @Override
-    protected void unmapNextVersion( ReleaseDescriptor config, String projectId )
+    protected void unmapNextVersion( ReleaseDescriptorBuilder builder, String projectId )
     {
-        config.mapReleaseVersion( projectId, RELEASE_VERSION );
+        builder.addReleaseVersion( projectId, RELEASE_VERSION );
     }
 
     @Override
-    protected ReleaseDescriptor createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        config.mapReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
-        mapScm( config );
+        builder.addReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        mapScm( builder );
 
-        return config;
+        return builder;
     }
 
     @Override
-    protected ReleaseDescriptor createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        config.mapReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:subproject1", NEXT_VERSION );
-        mapScm( config );
+        builder.addReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:subproject1", NEXT_VERSION );
+        mapScm( builder );
 
-        return config;
+        return builder;
     }
 
     @Test
@@ -277,16 +273,16 @@ public class RewritePomsForDevelopmentPhaseTest
     {
 
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-cvs" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
         Scm scm = new Scm();
         scm.setConnection( "${scm.base}:pserver:anoncvs@localhost:/tmp/scm-repo:module" );
         scm.setDeveloperConnection( "${scm.base}:ext:${username}@localhost:/tmp/scm-repo:module" );
         scm.setUrl( "${baseUrl}/module" );
-        config.mapOriginalScmInfo( "groupId:artifactId", scm );
+        builder.addOriginalScmInfo( "groupId:artifactId", scm );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -297,17 +293,17 @@ public class RewritePomsForDevelopmentPhaseTest
     {
 
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-cvs-from-tag" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
         Scm scm = new Scm();
         scm.setConnection( "scm:cvs:pserver:anoncvs@localhost:/tmp/scm-repo:module" );
         scm.setDeveloperConnection( "scm:cvs:ext:${username}@localhost:/tmp/scm-repo:module" );
         scm.setUrl( "http://localhost/viewcvs.cgi/module" );
         scm.setTag( "original-label" );
-        config.mapOriginalScmInfo( "groupId:artifactId", scm );
+        builder.addOriginalScmInfo( "groupId:artifactId", scm );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -318,24 +314,24 @@ public class RewritePomsForDevelopmentPhaseTest
     {
 
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-inherited-scm" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-
-        config.mapReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:subproject1", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subsubproject", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:subsubproject", NEXT_VERSION );
-        config.mapOriginalScmInfo( "groupId:artifactId", null );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+
+        builder.addReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:subproject1", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subsubproject", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:subsubproject", NEXT_VERSION );
+        builder.addOriginalScmInfo( "groupId:artifactId", null );
         Scm scm = new Scm();
         scm.setConnection( "scm:svn:file://localhost/tmp/scm-repo/trunk/subproject1" );
         scm.setDeveloperConnection( "scm:svn:file://localhost/tmp/scm-repo/trunk/subproject1" );
         // MRELEASE-107
         scm.setUrl( "http://localhost/viewvc/mypath/trunk/subproject1" );
-        config.mapOriginalScmInfo( "groupId:subproject1", scm );
-        config.mapOriginalScmInfo( "groupId:subsubproject", null );
+        builder.addOriginalScmInfo( "groupId:subproject1", scm );
+        builder.addOriginalScmInfo( "groupId:subsubproject", null );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -368,17 +364,17 @@ public class RewritePomsForDevelopmentPhaseTest
     {
         List<MavenProject> reactorProjects = createReactorProjects( path );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject2", ALTERNATIVE_RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
 
-        mapScm( config );
+        mapScm( builder );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -390,22 +386,20 @@ public class RewritePomsForDevelopmentPhaseTest
         // use the original ones since simulation didn't modify them
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-parent-and-properties-sim" );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject2", ALTERNATIVE_RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
 
-        mapScm( config );
+        mapScm( builder );
 
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
-        for ( Iterator<MavenProject> i = reactorProjects.iterator(); i.hasNext(); )
+        for ( MavenProject project : reactorProjects )
         {
-            MavenProject project = i.next();
-
             File pomFile = project.getFile();
             File actualFile = new File( pomFile.getParentFile(), pomFile.getName() + ".next" );
             File expectedFile = new File( actualFile.getParentFile(), "expected-pom.xml" );
@@ -421,17 +415,17 @@ public class RewritePomsForDevelopmentPhaseTest
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-property-dependency-coordinate" );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1-3.4", ALTERNATIVE_RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:subproject1-3.4", ALTERNATIVE_NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_RELEASE_VERSION );
-        config.mapDevelopmentVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1-3.4", ALTERNATIVE_RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:subproject1-3.4", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject2", ALTERNATIVE_RELEASE_VERSION );
+        builder.addDevelopmentVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
 
-        mapScm( config );
+        mapScm( builder );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -442,11 +436,11 @@ public class RewritePomsForDevelopmentPhaseTest
     {
         List<MavenProject> reactorProjects =
             createReactorProjects( "internal-snapshot-dependencies-without-dependencies-version-update" );
-        ReleaseDescriptor config = createDefaultConfiguration( reactorProjects );
-        config.setUpdateDependencies( false );
-        mapNextVersion( config, "groupId:subsubproject" );
+        ReleaseDescriptorBuilder builder = createDefaultConfiguration( reactorProjects );
+        builder.setUpdateDependencies( false );
+        mapNextVersion( builder, "groupId:subsubproject" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java
index a89ef57..5e965f0 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java
@@ -30,7 +30,7 @@ import java.util.List;
 import java.util.Objects;
 
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.util.ReleaseUtil;
 import org.junit.Test;
@@ -78,12 +78,12 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
 
         String expected = readTestProjectFile( "basic-pom/pom.xml" );
 
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         String actual = readTestProjectFile( "basic-pom/pom.xml" );
         assertEquals( "Check the original POM untouched", expected, actual );
@@ -98,12 +98,12 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-dashes-in-comment" );
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
 
         String expected = readTestProjectFile( "basic-pom-with-dashes-in-comment/pom.xml" );
 
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         String actual = readTestProjectFile( "basic-pom-with-dashes-in-comment/pom.xml" );
         assertEquals( "Check the original POM is untouched", expected, actual );
@@ -118,14 +118,14 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
 
         File testFile = getTestFile( "target/test-classes/projects/rewrite-for-release/basic-pom/pom.xml.tag" );
         testFile.delete();
         assertFalse( testFile.exists() );
 
-        phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( testFile.exists() );
 
@@ -139,8 +139,6 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjectsFromBasicPom();
-        ReleaseDescriptor config = createDescriptorFromBasicPom( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
 
         File testFile = getTestFile( "target/test-classes/projects/rewrite-for-release/basic-pom/pom.xml.tag" );
         testFile.delete();
@@ -157,50 +155,50 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-overridden-scm" );
-        ReleaseDescriptor config = createConfigurationForWithParentNextVersion( reactorProjects );
-        config.mapReleaseVersion( "groupId:subsubproject", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createConfigurationForWithParentNextVersion( reactorProjects );
+        builder.addReleaseVersion( "groupId:subsubproject", NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
 
     @Override
-    protected void mapAlternateNextVersion( ReleaseDescriptor config, String projectId )
+    protected void mapAlternateNextVersion( ReleaseDescriptorBuilder config, String projectId )
     {
-        config.mapReleaseVersion( projectId, ALTERNATIVE_NEXT_VERSION );
+        config.addReleaseVersion( projectId, ALTERNATIVE_NEXT_VERSION );
     }
 
     @Override
-    protected void mapNextVersion( ReleaseDescriptor config, String projectId )
+    protected void mapNextVersion( ReleaseDescriptorBuilder config, String projectId )
     {
-        config.mapReleaseVersion( projectId, NEXT_VERSION );
+        config.addReleaseVersion( projectId, NEXT_VERSION );
     }
 
     @Override
-    protected ReleaseDescriptor createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
-        return config;
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        return builder;
     }
 
     @Override
-    protected ReleaseDescriptor createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects )
         throws Exception
     {
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", NEXT_VERSION );
-        return config;
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", NEXT_VERSION );
+        return builder;
     }
 
     @Override
-    protected void unmapNextVersion( ReleaseDescriptor config, String projectId )
+    protected void unmapNextVersion( ReleaseDescriptorBuilder config, String projectId )
     {
         // nothing to do
     }
@@ -211,10 +209,10 @@ public class RewritePomsForReleasePhaseTest
     {
 
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-cvs" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -225,10 +223,10 @@ public class RewritePomsForReleasePhaseTest
     {
 
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-scm-expression" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -239,11 +237,11 @@ public class RewritePomsForReleasePhaseTest
     {
 
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-tag-base" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.setScmTagBase( "file://localhost/tmp/scm-repo/releases" );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.setScmTagBase( "file://localhost/tmp/scm-repo/releases" );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -253,11 +251,11 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-tag-base-and-varying-scm-urls" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.setScmTagBase( "file://localhost/tmp/scm-repo/allprojects/releases" );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.setScmTagBase( "file://localhost/tmp/scm-repo/allprojects/releases" );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -267,10 +265,10 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-cvs-from-tag" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -280,10 +278,10 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-with-empty-scm" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -293,9 +291,9 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "interpolated-versions" );
-        ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createMappedConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -305,14 +303,14 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "interpolated-versions" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
 
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject2", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject3", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject2", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject3", NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         for ( Iterator<MavenProject> i = reactorProjects.iterator(); i.hasNext(); )
         {
@@ -331,10 +329,10 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom-inherited-scm" );
-        ReleaseDescriptor config = createConfigurationForWithParentNextVersion( reactorProjects );
-        config.mapReleaseVersion( "groupId:subsubproject", NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createConfigurationForWithParentNextVersion( reactorProjects );
+        builder.addReleaseVersion( "groupId:subsubproject", NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -345,12 +343,12 @@ public class RewritePomsForReleasePhaseTest
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-parent-and-properties" );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -362,12 +360,12 @@ public class RewritePomsForReleasePhaseTest
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-property-dependency-coordinate" );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1-3.4", ALTERNATIVE_NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1-3.4", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -379,11 +377,11 @@ public class RewritePomsForReleasePhaseTest
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-scm-of-parent-ending-with-a-slash" );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -394,12 +392,12 @@ public class RewritePomsForReleasePhaseTest
     {
         List<MavenProject> reactorProjects = createReactorProjects( "multimodule-with-deep-subprojects" );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
-        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        builder.addReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -410,9 +408,9 @@ public class RewritePomsForReleasePhaseTest
     {
         List<MavenProject> reactorProjects =
             createReactorProjects( "rewrite-for-release/pom-with-parent-flat", "root-project" );
-        ReleaseDescriptor config = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
+        ReleaseDescriptorBuilder builder = createConfigurationForPomWithParentAlternateNextVersion( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -423,23 +421,23 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "cdata-section" );
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        mapNextVersion( config, "groupId:artifactId" );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        mapNextVersion( builder, "groupId:artifactId" );
 
         RewritePomsForReleasePhase phase = (RewritePomsForReleasePhase) this.phase;
         phase.setLs( "\r\n" );
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // compare POMS without line ending normalization
         assertTrue( comparePomFiles( reactorProjects, false ) );
     }
 
     @Override
-    protected ReleaseDescriptor createDescriptorFromProjects( List<MavenProject> reactorProjects )
+    protected ReleaseDescriptorBuilder createDescriptorFromProjects( List<MavenProject> reactorProjects )
     {
-        ReleaseDescriptor descriptor = super.createDescriptorFromProjects( reactorProjects );
-        descriptor.setScmReleaseLabel( "release-label" );
-        return descriptor;
+        ReleaseDescriptorBuilder builder = super.createDescriptorFromProjects( reactorProjects );
+        builder.setScmReleaseLabel( "release-label" );
+        return builder;
     }
 
     @Test
@@ -448,11 +446,11 @@ public class RewritePomsForReleasePhaseTest
     {
         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-externally-released-parent" );
 
-        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
-        config.mapResolvedSnapshotDependencies( "external:parent-artifactId", "1", "2-SNAPSHOT" );
-        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects );
+        builder.build().mapResolvedSnapshotDependencies( "external:parent-artifactId", "1", "2-SNAPSHOT" );
+        builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -463,9 +461,9 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "imported-dependency-management-in-reactor" );
-        ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
+        ReleaseDescriptorBuilder builder = createMappedConfiguration( reactorProjects );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
@@ -475,10 +473,10 @@ public class RewritePomsForReleasePhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects( "modules-with-different-versions" );
-        ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
-        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+        ReleaseDescriptorBuilder builder = createMappedConfiguration( reactorProjects );
+        builder.addReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
 
-        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertTrue( comparePomFiles( reactorProjects ) );
     }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.java
index efe68a3..f45e270 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.java
@@ -37,7 +37,7 @@ import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.ReleaseResult;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.exec.MavenExecutor;
@@ -80,16 +80,16 @@ public class RunCompleteGoalsPhaseTest
         // prepare
         File testFile = getTestFile( "target/working-directory" );
 
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setCompletionGoals( "clean integration-test" );
-        config.setWorkingDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setCompletionGoals( "clean integration-test" );
+        builder.setWorkingDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
         mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
+        phase.execute( builder.build(), releaseEnvironment, (List<MavenProject>) null );
 
         // verify
         verify( mock ).executeGoals( eq( testFile ), eq( "clean integration-test" ), isA( ReleaseEnvironment.class ),
@@ -105,16 +105,16 @@ public class RunCompleteGoalsPhaseTest
         // prepare
         File testFile = getTestFile( "target/working-directory" );
 
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setCompletionGoals( "clean integration-test" );
-        config.setWorkingDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setCompletionGoals( "clean integration-test" );
+        builder.setWorkingDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
         mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.simulate( config, releaseEnvironment, null );
+        phase.simulate( builder.build(), releaseEnvironment, null );
 
         // verify
         verify( mock ).executeGoals( eq( testFile ), eq( "clean integration-test" ), isA( ReleaseEnvironment.class ),
@@ -130,9 +130,9 @@ public class RunCompleteGoalsPhaseTest
         // prepare
         File testFile = getTestFile( "target/working-directory" );
 
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setCompletionGoals( "clean integration-test" );
-        config.setWorkingDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setCompletionGoals( "clean integration-test" );
+        builder.setWorkingDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
         doThrow( new MavenExecutorException( "...",
@@ -149,7 +149,7 @@ public class RunCompleteGoalsPhaseTest
         // execute
         try
         {
-            phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
+            phase.execute( builder.build(), releaseEnvironment, (List<MavenProject>) null );
 
             fail( "Should have thrown an exception" );
         }
@@ -172,9 +172,9 @@ public class RunCompleteGoalsPhaseTest
         // prepare
         File testFile = getTestFile( "target/working-directory" );
 
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setCompletionGoals( "clean integration-test" );
-        config.setWorkingDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setCompletionGoals( "clean integration-test" );
+        builder.setWorkingDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
         doThrow( new MavenExecutorException( "...",
@@ -191,7 +191,7 @@ public class RunCompleteGoalsPhaseTest
         // execute
         try
         {
-            phase.simulate( config, releaseEnvironment, null );
+            phase.simulate( builder.build(), releaseEnvironment, null );
 
             fail( "Should have thrown an exception" );
         }
@@ -214,16 +214,16 @@ public class RunCompleteGoalsPhaseTest
         // prepare
         File testFile = getTestFile( "target/working-directory" );
 
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setCompletionGoals( "" );
-        config.setWorkingDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setCompletionGoals( "" );
+        builder.setWorkingDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
         mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
+        phase.execute( builder.build(), releaseEnvironment, (List<MavenProject>) null );
 
         // verify
         // never invoke mock
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.java
index 631bcbb..173810c 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.java
@@ -48,7 +48,7 @@ import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseResult;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.exec.MavenExecutor;
@@ -90,9 +90,9 @@ public class RunPerformGoalsPhaseTest
         // prepare
         File testFile = getTestFile( "target/checkout-directory" );
 
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setPerformGoals( "goal1 goal2" );
-        config.setCheckoutDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setPerformGoals( "goal1 goal2" );
+        builder.setCheckoutDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
@@ -111,7 +111,7 @@ public class RunPerformGoalsPhaseTest
         // execute
         try
         {
-            phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
+            phase.execute( builder.build(), releaseEnvironment, (List<MavenProject>) null );
 
             fail( "Should have thrown an exception" );
         }
@@ -136,16 +136,16 @@ public class RunPerformGoalsPhaseTest
     {
         //prepare
         File testFile = getTestFile( "target/checkout-directory" );
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setPerformGoals( "goal1 goal2" );
-        config.setPomFileName( "pom1.xml" );
-        config.setCheckoutDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setPerformGoals( "goal1 goal2" );
+        builder.setPomFileName( "pom1.xml" );
+        builder.setCheckoutDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
         mavenExecutorWrapper.setMavenExecutor( mock );
 
-        phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
+        phase.execute( builder.build(), releaseEnvironment, (List<MavenProject>) null );
 
         verify( mock ).executeGoals( eq( testFile ),
                                      eq( "goal1 goal2" ),
@@ -162,12 +162,12 @@ public class RunPerformGoalsPhaseTest
                     throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setAdditionalArguments( "-Dmaven.test.skip=true" );
-        releaseDescriptor.setPerformGoals( "goal1 goal2" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setAdditionalArguments( "-Dmaven.test.skip=true" );
+        builder.setPerformGoals( "goal1 goal2" );
         File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
         mavenExecutorWrapper.setMavenExecutor( mock );
@@ -182,10 +182,10 @@ public class RunPerformGoalsPhaseTest
         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.class );
         stub.setScmProvider( scmProviderMock );
 
-        releaseDescriptor.setUseReleaseProfile( false );
+        builder.setUseReleaseProfile( false );
 
         // execute
-        phase.execute( releaseDescriptor, releaseEnvironment, createReactorProjects() );
+        phase.execute( builder.build(), releaseEnvironment, createReactorProjects() );
 
         // verify
         verify( mock ).executeGoals( eq( checkoutDirectory ),
@@ -206,11 +206,11 @@ public class RunPerformGoalsPhaseTest
                     throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setPerformGoals( "goal1 goal2" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setPerformGoals( "goal1 goal2" );
         File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
         mavenExecutorWrapper.setMavenExecutor( mock );
@@ -226,7 +226,7 @@ public class RunPerformGoalsPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.execute( releaseDescriptor, releaseEnvironment, createReactorProjects() );
+        phase.execute( builder.build(), releaseEnvironment, createReactorProjects() );
 
         // verify
         verify( mock ).executeGoals( eq( checkoutDirectory ),
@@ -247,11 +247,11 @@ public class RunPerformGoalsPhaseTest
                     throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setPerformGoals( "goal1 goal2" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setPerformGoals( "goal1 goal2" );
         File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
         mavenExecutorWrapper.setMavenExecutor( mock );
@@ -266,10 +266,10 @@ public class RunPerformGoalsPhaseTest
         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.class );
         stub.setScmProvider( scmProviderMock );
 
-        releaseDescriptor.setUseReleaseProfile( false );
+        builder.setUseReleaseProfile( false );
 
         // execute
-        phase.execute( releaseDescriptor, releaseEnvironment, createReactorProjects() );
+        phase.execute( builder.build(), releaseEnvironment, createReactorProjects() );
 
         // verify
         verify( mock ).executeGoals( eq( checkoutDirectory ),
@@ -290,12 +290,12 @@ public class RunPerformGoalsPhaseTest
                     throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setAdditionalArguments( "-Dmaven.test.skip=true" );
-        releaseDescriptor.setPerformGoals( "goal1 goal2" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setAdditionalArguments( "-Dmaven.test.skip=true" );
+        builder.setPerformGoals( "goal1 goal2" );
         File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
         mavenExecutorWrapper.setMavenExecutor( mock );
@@ -311,7 +311,7 @@ public class RunPerformGoalsPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.execute( releaseDescriptor, releaseEnvironment, createReactorProjects() );
+        phase.execute( builder.build(), releaseEnvironment, createReactorProjects() );
 
         // verify
         verify( mock ).executeGoals( eq( checkoutDirectory ),
@@ -332,11 +332,11 @@ public class RunPerformGoalsPhaseTest
                     throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setPerformGoals( "goal1 goal2" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setPerformGoals( "goal1 goal2" );
         File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
         mavenExecutorWrapper.setMavenExecutor( mock );
@@ -351,10 +351,10 @@ public class RunPerformGoalsPhaseTest
         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.class );
         stub.setScmProvider( scmProviderMock );
 
-        releaseDescriptor.setCompletedPhase( "end-release" );
+        builder.setCompletedPhase( "end-release" );
 
         // execute
-        phase.execute( releaseDescriptor, releaseEnvironment, createReactorProjects() );
+        phase.execute( builder.build(), releaseEnvironment, createReactorProjects() );
 
         // verify
         verify( mock ).executeGoals( eq( checkoutDirectory ),
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.java
index a63d307..7556bdf 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.java
@@ -37,7 +37,7 @@ import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.ReleaseResult;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.exec.MavenExecutor;
@@ -80,16 +80,16 @@ public class RunPrepareGoalsPhaseTest
         // prepare
         File testFile = getTestFile( "target/working-directory" );
 
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setPreparationGoals( "clean integration-test" );
-        config.setWorkingDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setPreparationGoals( "clean integration-test" );
+        builder.setWorkingDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
         mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
+        phase.execute( builder.build(), releaseEnvironment, (List<MavenProject>) null );
 
         // verify
         verify( mock ).executeGoals( eq( testFile ), eq( "clean integration-test" ), isA( ReleaseEnvironment.class ),
@@ -105,16 +105,16 @@ public class RunPrepareGoalsPhaseTest
         // prepare
         File testFile = getTestFile( "target/working-directory" );
 
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setPreparationGoals( "clean integration-test" );
-        config.setWorkingDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setPreparationGoals( "clean integration-test" );
+        builder.setWorkingDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
         mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.simulate( config, releaseEnvironment, null );
+        phase.simulate( builder.build(), releaseEnvironment, null );
 
         // verify
         verify( mock ).executeGoals( eq( testFile ), eq( "clean integration-test" ), isA( ReleaseEnvironment.class ),
@@ -130,9 +130,9 @@ public class RunPrepareGoalsPhaseTest
         // prepare
         File testFile = getTestFile( "target/working-directory" );
 
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setPreparationGoals( "clean integration-test" );
-        config.setWorkingDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setPreparationGoals( "clean integration-test" );
+        builder.setWorkingDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
         doThrow( new MavenExecutorException( "...",
@@ -149,7 +149,7 @@ public class RunPrepareGoalsPhaseTest
         // execute
         try
         {
-            phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
+            phase.execute( builder.build(), releaseEnvironment, (List<MavenProject>) null );
 
             fail( "Should have thrown an exception" );
         }
@@ -172,9 +172,9 @@ public class RunPrepareGoalsPhaseTest
         // prepare
         File testFile = getTestFile( "target/working-directory" );
 
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setPreparationGoals( "clean integration-test" );
-        config.setWorkingDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setPreparationGoals( "clean integration-test" );
+        builder.setWorkingDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
         doThrow( new MavenExecutorException( "...",
@@ -191,7 +191,7 @@ public class RunPrepareGoalsPhaseTest
         // execute
         try
         {
-            phase.simulate( config, releaseEnvironment, null );
+            phase.simulate( builder.build(), releaseEnvironment, null );
 
             fail( "Should have thrown an exception" );
         }
@@ -215,16 +215,16 @@ public class RunPrepareGoalsPhaseTest
         // prepare
         File testFile = getTestFile( "target/working-directory" );
 
-        ReleaseDescriptor config = new ReleaseDescriptor();
-        config.setPreparationGoals( "" );
-        config.setWorkingDirectory( testFile.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setPreparationGoals( "" );
+        builder.setWorkingDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
         mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
+        phase.execute( builder.build(), releaseEnvironment, (List<MavenProject>) null );
 
         // verify
         // no invocations of mock
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmBranchPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmBranchPhaseTest.java
index 748c2a6..3fd3e5a 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmBranchPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmBranchPhaseTest.java
@@ -52,7 +52,7 @@ import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
@@ -74,7 +74,7 @@ public class ScmBranchPhaseTest
     {
         super.setUp();
 
-        phase = (ReleasePhase) lookup( ReleasePhase.class, "scm-branch" );
+        phase = lookup( ReleasePhase.class, "scm-branch" );
     }
 
     public static String getPath( File file )
@@ -88,13 +88,13 @@ public class ScmBranchPhaseTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
-        descriptor.setScmSourceUrl( "scm-url" );
+        builder.setScmSourceUrl( "scm-url" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setScmCommentPrefix( "[my prefix] " );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmCommentPrefix( "[my prefix] " );
 
         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile() );
 
@@ -108,7 +108,7 @@ public class ScmBranchPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).branch( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -127,13 +127,13 @@ public class ScmBranchPhaseTest
             createReactorProjects( dir, dir, null );
         String sourceUrl = "http://svn.example.com/repos/project/trunk/";
         String scmUrl = "scm:svn:" + sourceUrl;
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setScmSourceUrl( scmUrl );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( scmUrl );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setScmCommentPrefix( "[my prefix] " );
-        descriptor.setScmBranchBase( "http://svn.example.com/repos/project/branches/" );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmCommentPrefix( "[my prefix] " );
+        builder.setScmBranchBase( "http://svn.example.com/repos/project/branches/" );
 
         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile() );
 
@@ -152,7 +152,7 @@ public class ScmBranchPhaseTest
         stub.addScmRepositoryForUrl( scmUrl, repository );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).branch( eq( repository ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -169,11 +169,11 @@ public class ScmBranchPhaseTest
         List<MavenProject> reactorProjects =
             createReactorProjects( "rewrite-for-release/pom-with-parent-flat", "root-project" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setScmSourceUrl( rootProject.getScm().getConnection() );
-        descriptor.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setScmCommentPrefix( "[my prefix] " );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( rootProject.getScm().getConnection() );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmCommentPrefix( "[my prefix] " );
 
         // one directory up from root project
         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile().getParentFile() );
@@ -193,7 +193,7 @@ public class ScmBranchPhaseTest
         stub.addScmRepositoryForUrl( "scm:svn:" + scmUrl, repository );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).branch( eq( repository ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -207,14 +207,14 @@ public class ScmBranchPhaseTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         String dir = "scm-commit/multiple-poms";
         List<MavenProject> reactorProjects = createReactorProjects( dir, dir, null );
-        descriptor.setScmSourceUrl( "scm-url" );
+        builder.setScmSourceUrl( "scm-url" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setScmCommentPrefix( "[my prefix] " );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmCommentPrefix( "[my prefix] " );
 
         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile() );
 
@@ -229,7 +229,7 @@ public class ScmBranchPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // exeucte
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).branch( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -242,12 +242,12 @@ public class ScmBranchPhaseTest
     public void testBranchNoReleaseLabel()
         throws Exception
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
 
         try
         {
-            phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
             fail( "Should have thrown an exception" );
         }
         catch ( ReleaseFailureException e )
@@ -260,12 +260,12 @@ public class ScmBranchPhaseTest
     public void testSimulateBranch()
         throws Exception
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
-        descriptor.setScmSourceUrl( "scm-url" );
+        builder.setScmSourceUrl( "scm-url" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
-        descriptor.setScmReleaseLabel( "release-label" );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setScmReleaseLabel( "release-label" );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
 
@@ -273,7 +273,7 @@ public class ScmBranchPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.simulate( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         // no scmProvider invocation
@@ -284,12 +284,12 @@ public class ScmBranchPhaseTest
     public void testSimulateBranchNoReleaseLabel()
         throws Exception
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
 
         try
         {
-            phase.simulate( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
             fail( "Should have thrown an exception" );
         }
         catch ( ReleaseFailureException e )
@@ -304,7 +304,7 @@ public class ScmBranchPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmManagerStub scmManagerStub = (ScmManagerStub) lookup( ScmManager.class );
         scmManagerStub.setException( new NoSuchScmProviderException( "..." )  );
@@ -312,7 +312,7 @@ public class ScmBranchPhaseTest
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Status check should have failed" );
         }
@@ -329,7 +329,7 @@ public class ScmBranchPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmManagerStub scmManagerStub = (ScmManagerStub) lookup( ScmManager.class );
         scmManagerStub.setException( new ScmRepositoryException( "..." )  );
@@ -337,7 +337,7 @@ public class ScmBranchPhaseTest
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Status check should have failed" );
         }
@@ -355,7 +355,7 @@ public class ScmBranchPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
         when( scmProviderMock.branch( isA( ScmRepository.class ), isA( ScmFileSet.class ), isA( String.class ),
@@ -367,7 +367,7 @@ public class ScmBranchPhaseTest
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Status check should have failed" );
         }
@@ -387,17 +387,17 @@ public class ScmBranchPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmManager scmManager = (ScmManager) lookup( ScmManager.class );
         ScmProviderStub providerStub =
-            (ScmProviderStub) scmManager.getProviderByUrl( releaseDescriptor.getScmSourceUrl() );
+            (ScmProviderStub) scmManager.getProviderByUrl( "scm-url" );
 
         providerStub.setBranchScmResult( new BranchScmResult( "", "", "", false ) );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Commit should have failed" );
         }
@@ -414,13 +414,13 @@ public class ScmBranchPhaseTest
         return createReactorProjects( dir, dir, null );
     }
 
-    private static ReleaseDescriptor createReleaseDescriptor()
+    private static ReleaseDescriptorBuilder createReleaseDescriptorBuilder()
         throws IOException
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setScmSourceUrl( "scm-url" );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setWorkingDirectory( getPath( getTestFile( "target/test/checkout" ) ) );
-        return descriptor;
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setWorkingDirectory( getPath( getTestFile( "target/test/checkout" ) ) );
+        return builder;
     }
 }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhaseTest.java
index e6fad03..e49de45 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhaseTest.java
@@ -51,7 +51,7 @@ import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.ReleaseResult;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
@@ -82,9 +82,9 @@ public class ScmCheckModificationsPhaseTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
 
         ScmManagerStub scmManagerStub = (ScmManagerStub) lookup( ScmManager.class );
         scmManagerStub.setException( new NoSuchScmProviderException( "..." )  );
@@ -92,7 +92,7 @@ public class ScmCheckModificationsPhaseTest
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -103,7 +103,7 @@ public class ScmCheckModificationsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -119,9 +119,9 @@ public class ScmCheckModificationsPhaseTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
 
         ScmManagerStub scmManagerStub = (ScmManagerStub) lookup( ScmManager.class );
         scmManagerStub.setException( new ScmRepositoryException( "..." )  );
@@ -129,7 +129,7 @@ public class ScmCheckModificationsPhaseTest
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -140,7 +140,7 @@ public class ScmCheckModificationsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -155,9 +155,9 @@ public class ScmCheckModificationsPhaseTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
         when( scmProviderMock.status( isA( ScmRepository.class ),
@@ -169,7 +169,7 @@ public class ScmCheckModificationsPhaseTest
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -180,7 +180,7 @@ public class ScmCheckModificationsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -198,17 +198,17 @@ public class ScmCheckModificationsPhaseTest
     public void testScmResultFailure()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
-        ScmManager scmManager = (ScmManager) lookup( ScmManager.class );
+        ScmManager scmManager = lookup( ScmManager.class );
         ScmProviderStub providerStub =
-            (ScmProviderStub) scmManager.getProviderByUrl( releaseDescriptor.getScmSourceUrl() );
+            (ScmProviderStub) scmManager.getProviderByUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         providerStub.setStatusScmResult( new StatusScmResult( "", "", "", false ) );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -219,7 +219,7 @@ public class ScmCheckModificationsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -233,13 +233,13 @@ public class ScmCheckModificationsPhaseTest
     public void testNoModifications()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
-        setChangedFiles( releaseDescriptor, Collections.<String>emptyList() );
+        setChangedFiles( builder, Collections.<String>emptyList() );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), null );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -249,14 +249,14 @@ public class ScmCheckModificationsPhaseTest
     public void testModificationsToExcludedFilesOnly()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
-        setChangedFiles( releaseDescriptor,
+        setChangedFiles( builder,
                          Arrays.asList( "release.properties", "pom.xml.backup", "pom.xml.tag", "pom.xml.next" ) );
 
-        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), null );
 
-        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null );
 
         // successful execution is verification enough
         assertTrue( true );
@@ -267,32 +267,32 @@ public class ScmCheckModificationsPhaseTest
     public void testModificationsToCustomExcludedFilesOnly()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
-        releaseDescriptor.setCheckModificationExcludes( Collections.singletonList( "**/keep.me" ) );
+        builder.setCheckModificationExcludes( Collections.singletonList( "**/keep.me" ) );
 
-        setChangedFiles( releaseDescriptor,
+        setChangedFiles( builder,
                          Arrays.asList( "release.properties", "pom.xml.backup", "pom.xml.tag", "pom.xml.next",
                                         "keep.me", "src/app/keep.me", "config\\keep.me" ) );
 
         assertEquals( ReleaseResult.SUCCESS,
-                      phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null ).getResultCode() );
+                      phase.execute( builder.build(), new DefaultReleaseEnvironment(), null ).getResultCode() );
 
         assertEquals( ReleaseResult.SUCCESS,
-                      phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null ).getResultCode() );
+                      phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null ).getResultCode() );
     }
 
     @Test
     public void testModificationsToPoms()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
-        setChangedFiles( releaseDescriptor, Arrays.asList( "pom.xml", "module/pom.xml" ) );
+        setChangedFiles( builder, Arrays.asList( "pom.xml", "module/pom.xml" ) );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -303,7 +303,7 @@ public class ScmCheckModificationsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -317,13 +317,13 @@ public class ScmCheckModificationsPhaseTest
     public void testModificationsToIncludedFilesOnly()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
-        setChangedFiles( releaseDescriptor, Collections.singletonList( "something.txt" ) );
+        setChangedFiles( builder, Collections.singletonList( "something.txt" ) );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -334,7 +334,7 @@ public class ScmCheckModificationsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -348,14 +348,14 @@ public class ScmCheckModificationsPhaseTest
     public void testModificationsToIncludedAndExcludedFiles()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
-        setChangedFiles( releaseDescriptor, Arrays.asList( "release.properties", "pom.xml.backup", "pom.xml.tag",
+        setChangedFiles( builder, Arrays.asList( "release.properties", "pom.xml.backup", "pom.xml.tag",
                                                            "pom.xml.release", "something.txt" ) );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -366,7 +366,7 @@ public class ScmCheckModificationsPhaseTest
 
         try
         {
-            phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null );
 
             fail( "Status check should have failed" );
         }
@@ -380,16 +380,16 @@ public class ScmCheckModificationsPhaseTest
     public void testModificationsToAdditionalExcludedFiles()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
-        releaseDescriptor.setCheckModificationExcludes( Collections.singletonList( "something.*" ) );
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
+        builder.setCheckModificationExcludes( Collections.singletonList( "something.*" ) );
 
-        setChangedFiles( releaseDescriptor, Collections.singletonList( "something.txt" ) );
+        setChangedFiles( builder, Collections.singletonList( "something.txt" ) );
 
         assertEquals( ReleaseResult.SUCCESS,
-                      phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null ).getResultCode() );
+                      phase.execute( builder.build(), new DefaultReleaseEnvironment(), null ).getResultCode() );
 
         assertEquals( ReleaseResult.SUCCESS,
-                      phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null ).getResultCode() );
+                      phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null ).getResultCode() );
     }
 
     // MRELEASE-775
@@ -397,25 +397,25 @@ public class ScmCheckModificationsPhaseTest
     public void testMultipleExclusionPatternMatch()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
-        releaseDescriptor.setCheckModificationExcludes( Collections.singletonList( "release.properties" ) );
+        builder.setCheckModificationExcludes( Collections.singletonList( "release.properties" ) );
 
-        setChangedFiles( releaseDescriptor, Arrays.asList( "release.properties" ) );
+        setChangedFiles( builder, Arrays.asList( "release.properties" ) );
 
         assertEquals( ReleaseResult.SUCCESS,
-                      phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null ).getResultCode() );
+                      phase.execute( builder.build(), new DefaultReleaseEnvironment(), null ).getResultCode() );
 
         assertEquals( ReleaseResult.SUCCESS,
-                      phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null ).getResultCode() );
+                      phase.simulate( builder.build(), new DefaultReleaseEnvironment(), null ).getResultCode() );
     }
 
-    private void setChangedFiles( ReleaseDescriptor releaseDescriptor, List<String> changedFiles )
+    private void setChangedFiles( ReleaseDescriptorBuilder builder, List<String> changedFiles )
         throws Exception
     {
         ScmManager scmManager = (ScmManager) lookup( ScmManager.class );
         ScmProviderStub providerStub =
-            (ScmProviderStub) scmManager.getProviderByUrl( releaseDescriptor.getScmSourceUrl() );
+            (ScmProviderStub) scmManager.getProviderByUrl( "scm:svn:file://localhost/tmp/scm-repo" );
 
         providerStub.setStatusScmResult( new StatusScmResult( "", createScmFiles( changedFiles ) ) );
     }
@@ -431,11 +431,11 @@ public class ScmCheckModificationsPhaseTest
         return files;
     }
 
-    private static ReleaseDescriptor createReleaseDescriptor()
+    private static ReleaseDescriptorBuilder createReleaseDescriptorBuilder()
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
-        releaseDescriptor.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
-        return releaseDescriptor;
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
+        builder.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
+        return builder;
     }
 }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.java
index fc67417..2e2b6e4 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.java
@@ -42,7 +42,7 @@ import org.apache.maven.scm.manager.ScmManager;
 import org.apache.maven.scm.manager.ScmManagerStub;
 import org.apache.maven.scm.provider.ScmProvider;
 import org.apache.maven.scm.repository.ScmRepository;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.util.ReleaseUtil;
 import org.junit.Test;
@@ -64,7 +64,7 @@ public class ScmCommitDevelopmentPhaseTest
 
     private MavenProject rootProject;
 
-    private ReleaseDescriptor descriptor;
+    private ReleaseDescriptorBuilder builder;
 
     private ScmProvider scmProviderMock;
 
@@ -78,7 +78,7 @@ public class ScmCommitDevelopmentPhaseTest
 
         reactorProjects = createReactorProjects();
         rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor = createReleaseDescriptor( rootProject );
+        builder = createReleaseDescriptorBuilder( rootProject );
     }
 
     @Test
@@ -91,16 +91,16 @@ public class ScmCommitDevelopmentPhaseTest
     public void testNoCommitOrRollbackRequired()
         throws Exception
     {
-        ReleaseDescriptor descriptor = createReleaseDescriptor( rootProject );
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder( rootProject );
         List<MavenProject> reactorProjects = createReactorProjects();
 
-        descriptor.setRemoteTagging( false );
-        descriptor.setSuppressCommitBeforeTagOrBranch( true );
-        descriptor.setUpdateWorkingCopyVersions( false );
+        builder.setRemoteTagging( false );
+        builder.setSuppressCommitBeforeTagOrBranch( true );
+        builder.setUpdateWorkingCopyVersions( false );
 
         prepareNoCheckin();
 
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         verifyNoCheckin();
     }
@@ -109,11 +109,11 @@ public class ScmCommitDevelopmentPhaseTest
     public void testCommitsNextVersions()
         throws Exception
     {
-        descriptor.setUpdateWorkingCopyVersions( true );
+        builder.setUpdateWorkingCopyVersions( true );
 
         prepareCheckin( COMMIT_MESSAGE );
 
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         verifyCheckin( COMMIT_MESSAGE );
     }
@@ -122,13 +122,13 @@ public class ScmCommitDevelopmentPhaseTest
     public void testCommitsRollbackPrepare()
         throws Exception
     {
-        descriptor.setUpdateWorkingCopyVersions( false );
+        builder.setUpdateWorkingCopyVersions( false );
 
-        String message = ROLLBACK_PREFIX + descriptor.getScmReleaseLabel();
+        String message = ROLLBACK_PREFIX + "release-label";
 
         prepareCheckin( message );
 
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         verifyCheckin( message );
     }
@@ -176,12 +176,12 @@ public class ScmCommitDevelopmentPhaseTest
         return createReactorProjects( dir, dir, null );
     }
 
-    private static ReleaseDescriptor createReleaseDescriptor( MavenProject rootProject )
+    private static ReleaseDescriptorBuilder createReleaseDescriptorBuilder( MavenProject rootProject )
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setScmSourceUrl( "scm-url" );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
-        return descriptor;
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
+        return builder;
     }
 }
\ No newline at end of file
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java
index c1d562e..d89e572 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java
@@ -53,7 +53,7 @@ import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
@@ -99,11 +99,11 @@ public class ScmCommitPreparationPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setScmSourceUrl( "scm-url" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
-        descriptor.setScmReleaseLabel( "release-label" );
+        builder.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
+        builder.setScmReleaseLabel( "release-label" );
 
         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile(), rootProject.getFile() );
 
@@ -119,7 +119,7 @@ public class ScmCommitPreparationPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).checkIn( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -132,13 +132,13 @@ public class ScmCommitPreparationPhaseTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         String dir = "scm-commit/multiple-poms";
         List<MavenProject> reactorProjects = createReactorProjects( dir, dir, null );
-        descriptor.setScmSourceUrl( "scm-url" );
+        builder.setScmSourceUrl( "scm-url" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
-        descriptor.setScmReleaseLabel( "release-label" );
+        builder.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
+        builder.setScmReleaseLabel( "release-label" );
 
         List<File> poms = new ArrayList<>();
         for ( Iterator<MavenProject> i = reactorProjects.iterator(); i.hasNext(); )
@@ -159,7 +159,7 @@ public class ScmCommitPreparationPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).checkIn( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -174,12 +174,12 @@ public class ScmCommitPreparationPhaseTest
         // prepare
         phase = (ReleasePhase) lookup( ReleasePhase.class, "scm-commit-development" );
 
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
-        descriptor.setScmSourceUrl( "scm-url" );
+        builder.setScmSourceUrl( "scm-url" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
-        descriptor.setScmReleaseLabel( "release-label" );
+        builder.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
+        builder.setScmReleaseLabel( "release-label" );
 
         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile(), rootProject.getFile() );
 
@@ -194,7 +194,7 @@ public class ScmCommitPreparationPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).checkIn( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -207,12 +207,12 @@ public class ScmCommitPreparationPhaseTest
     public void testCommitNoReleaseLabel()
         throws Exception
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
 
         try
         {
-            phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
             fail( "Should have thrown an exception" );
         }
         catch ( ReleaseFailureException e )
@@ -227,12 +227,12 @@ public class ScmCommitPreparationPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setScmSourceUrl( "scm-url" );
-        descriptor.setGenerateReleasePoms( true );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setGenerateReleasePoms( true );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
-        descriptor.setScmReleaseLabel( "release-label" );
+        builder.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
+        builder.setScmReleaseLabel( "release-label" );
 
         List<File> files = new ArrayList<>();
         files.add( rootProject.getFile() );
@@ -251,7 +251,7 @@ public class ScmCommitPreparationPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).checkIn( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -263,19 +263,19 @@ public class ScmCommitPreparationPhaseTest
     public void testSimulateCommit()
         throws Exception
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
-        descriptor.setScmSourceUrl( "scm-url" );
+        builder.setScmSourceUrl( "scm-url" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
-        descriptor.setScmReleaseLabel( "release-label" );
+        builder.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
+        builder.setScmReleaseLabel( "release-label" );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
 
         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.class );
         stub.setScmProvider( scmProviderMock );
 
-        phase.simulate( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // never invoke scmProviderMock
         verifyNoMoreInteractions( scmProviderMock );
@@ -285,12 +285,12 @@ public class ScmCommitPreparationPhaseTest
     public void testSimulateCommitNoReleaseLabel()
         throws Exception
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
 
         try
         {
-            phase.simulate( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
             fail( "Should have thrown an exception" );
         }
         catch ( ReleaseFailureException e )
@@ -305,14 +305,14 @@ public class ScmCommitPreparationPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmManagerStub scmManagerStub = (ScmManagerStub) lookup( ScmManager.class );
         scmManagerStub.setException( new NoSuchScmProviderException( "..." )  );
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Status check should have failed" );
         }
@@ -329,7 +329,7 @@ public class ScmCommitPreparationPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmManagerStub scmManagerStub = (ScmManagerStub) lookup( ScmManager.class );
         scmManagerStub.setException( new ScmRepositoryException( "..." )  );
@@ -337,7 +337,7 @@ public class ScmCommitPreparationPhaseTest
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Status check should have failed" );
         }
@@ -354,7 +354,7 @@ public class ScmCommitPreparationPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
         when( scmProviderMock.checkIn( isA( ScmRepository.class ), isA( ScmFileSet.class ), isNull( ScmVersion.class ),
@@ -366,7 +366,7 @@ public class ScmCommitPreparationPhaseTest
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Status check should have failed" );
         }
@@ -386,17 +386,17 @@ public class ScmCommitPreparationPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmManager scmManager = (ScmManager) lookup( ScmManager.class );
         ScmProviderStub providerStub =
-            (ScmProviderStub) scmManager.getProviderByUrl( releaseDescriptor.getScmSourceUrl() );
+            (ScmProviderStub) scmManager.getProviderByUrl( "scm-url" );
 
         providerStub.setCheckInScmResult( new CheckInScmResult( "", "", "", false ) );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Commit should have failed" );
         }
@@ -410,11 +410,11 @@ public class ScmCommitPreparationPhaseTest
     public void testSuppressCommitWithRemoteTaggingFails()
         throws Exception
     {
-        ReleaseDescriptor descriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
 
-        descriptor.setRemoteTagging( true );
-        descriptor.setSuppressCommitBeforeTagOrBranch( true );
+        builder.setRemoteTagging( true );
+        builder.setSuppressCommitBeforeTagOrBranch( true );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
 
@@ -423,7 +423,7 @@ public class ScmCommitPreparationPhaseTest
 
         try
         {
-            phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Commit should have failed with ReleaseFailureException" );
         }
@@ -440,19 +440,19 @@ public class ScmCommitPreparationPhaseTest
     public void testSuppressCommitAfterBranch()
         throws Exception
     {
-        ReleaseDescriptor descriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
 
-        descriptor.setBranchCreation( true );
-        descriptor.setRemoteTagging( false );
-        descriptor.setSuppressCommitBeforeTagOrBranch( true );
+        builder.setBranchCreation( true );
+        builder.setRemoteTagging( false );
+        builder.setSuppressCommitBeforeTagOrBranch( true );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
 
         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.class );
         stub.setScmProvider( scmProviderMock );
 
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // never invoke scmProviderMock
         verifyNoMoreInteractions( scmProviderMock );
@@ -465,12 +465,12 @@ public class ScmCommitPreparationPhaseTest
         return createReactorProjects( dir, dir, null );
     }
 
-    private static ReleaseDescriptor createReleaseDescriptor()
+    private static ReleaseDescriptorBuilder createReleaseDescriptorBuilder()
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setScmSourceUrl( "scm-url" );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
-        return descriptor;
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
+        return builder;
     }
 }
\ No newline at end of file
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmTagPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmTagPhaseTest.java
index 8f31526..18eba18 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmTagPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmTagPhaseTest.java
@@ -52,7 +52,7 @@ import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
@@ -88,13 +88,13 @@ public class ScmTagPhaseTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
-        descriptor.setScmSourceUrl( "scm-url" );
+        builder.setScmSourceUrl( "scm-url" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setScmCommentPrefix( "[my prefix] " );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmCommentPrefix( "[my prefix] " );
 
         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile() );
 
@@ -108,7 +108,7 @@ public class ScmTagPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).tag( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -126,13 +126,13 @@ public class ScmTagPhaseTest
             createReactorProjects( "scm-commit/multimodule-with-deep-subprojects", "" );
         String sourceUrl = "http://svn.example.com/repos/project/trunk/";
         String scmUrl = "scm:svn:" + sourceUrl;
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setScmSourceUrl( scmUrl );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( scmUrl );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setScmCommentPrefix( "[my prefix] " );
-        descriptor.setScmTagBase( "http://svn.example.com/repos/project/releases/" );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmCommentPrefix( "[my prefix] " );
+        builder.setScmTagBase( "http://svn.example.com/repos/project/releases/" );
 
         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile() );
 
@@ -151,7 +151,7 @@ public class ScmTagPhaseTest
         stub.addScmRepositoryForUrl( scmUrl, repository );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).tag( eq( repository ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -168,11 +168,11 @@ public class ScmTagPhaseTest
         List<MavenProject> reactorProjects =
             createReactorProjects( "rewrite-for-release/pom-with-parent-flat", "root-project" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setScmSourceUrl( rootProject.getScm().getConnection() );
-        descriptor.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setScmCommentPrefix( "[my prefix] " );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( rootProject.getScm().getConnection() );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmCommentPrefix( "[my prefix] " );
 
         // one directory up from root project
         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile().getParentFile() );
@@ -192,7 +192,7 @@ public class ScmTagPhaseTest
         stub.addScmRepositoryForUrl( "scm:svn:" + scmUrl, repository );
 
         // execute
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).tag( eq( repository ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -206,14 +206,14 @@ public class ScmTagPhaseTest
         throws Exception
     {
         // prepare
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         String dir = "scm-commit/multiple-poms";
         List<MavenProject> reactorProjects = createReactorProjects( dir, dir, null );
-        descriptor.setScmSourceUrl( "scm-url" );
+        builder.setScmSourceUrl( "scm-url" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setScmCommentPrefix( "[my prefix] " );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmCommentPrefix( "[my prefix] " );
 
         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile() );
 
@@ -228,7 +228,7 @@ public class ScmTagPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // exeucte
-        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         verify( scmProviderMock ).tag( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ),
@@ -241,12 +241,12 @@ public class ScmTagPhaseTest
     public void testTagNoReleaseLabel()
         throws Exception
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
 
         try
         {
-            phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
             fail( "Should have thrown an exception" );
         }
         catch ( ReleaseFailureException e )
@@ -259,12 +259,12 @@ public class ScmTagPhaseTest
     public void testSimulateTag()
         throws Exception
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
-        descriptor.setScmSourceUrl( "scm-url" );
+        builder.setScmSourceUrl( "scm-url" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
-        descriptor.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
-        descriptor.setScmReleaseLabel( "release-label" );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setScmReleaseLabel( "release-label" );
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
 
@@ -272,7 +272,7 @@ public class ScmTagPhaseTest
         stub.setScmProvider( scmProviderMock );
 
         // execute
-        phase.simulate( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+        phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
         // verify
         // no scmProvider invocation
@@ -283,12 +283,12 @@ public class ScmTagPhaseTest
     public void testSimulateTagNoReleaseLabel()
         throws Exception
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         List<MavenProject> reactorProjects = createReactorProjects();
 
         try
         {
-            phase.simulate( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.simulate( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
             fail( "Should have thrown an exception" );
         }
         catch ( ReleaseFailureException e )
@@ -303,7 +303,7 @@ public class ScmTagPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmManagerStub scmManagerStub = (ScmManagerStub) lookup( ScmManager.class );
         scmManagerStub.setException( new NoSuchScmProviderException( "..." )  );
@@ -311,7 +311,7 @@ public class ScmTagPhaseTest
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Status check should have failed" );
         }
@@ -328,7 +328,7 @@ public class ScmTagPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmManagerStub scmManagerStub = (ScmManagerStub) lookup( ScmManager.class );
         scmManagerStub.setException( new ScmRepositoryException( "..." )  );
@@ -336,7 +336,7 @@ public class ScmTagPhaseTest
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Status check should have failed" );
         }
@@ -353,7 +353,7 @@ public class ScmTagPhaseTest
     {
         // prepare
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
         ScmProvider scmProviderMock = mock( ScmProvider.class );
         when( scmProviderMock.tag( isA( ScmRepository.class ), isA( ScmFileSet.class ), isA( String.class ),
@@ -365,7 +365,7 @@ public class ScmTagPhaseTest
         // execute
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Status check should have failed" );
         }
@@ -385,17 +385,17 @@ public class ScmTagPhaseTest
         throws Exception
     {
         List<MavenProject> reactorProjects = createReactorProjects();
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
-        ScmManager scmManager = (ScmManager) lookup( ScmManager.class );
+        ScmManager scmManager = lookup( ScmManager.class );
         ScmProviderStub providerStub =
-            (ScmProviderStub) scmManager.getProviderByUrl( releaseDescriptor.getScmSourceUrl() );
+            (ScmProviderStub) scmManager.getProviderByUrl( "scm-url" );
 
         providerStub.setTagScmResult( new TagScmResult( "", "", "", false ) );
 
         try
         {
-            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+            phase.execute( builder.build(), new DefaultReleaseEnvironment(), reactorProjects );
 
             fail( "Commit should have failed" );
         }
@@ -411,13 +411,13 @@ public class ScmTagPhaseTest
         return createReactorProjects( "scm-commit/single-pom", "" );
     }
 
-    private static ReleaseDescriptor createReleaseDescriptor()
+    private static ReleaseDescriptorBuilder createReleaseDescriptorBuilder()
         throws IOException
     {
-        ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        descriptor.setScmSourceUrl( "scm-url" );
-        descriptor.setScmReleaseLabel( "release-label" );
-        descriptor.setWorkingDirectory( getPath( getTestFile( "target/test/checkout" ) ) );
-        return descriptor;
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setWorkingDirectory( getPath( getTestFile( "target/test/checkout" ) ) );
+        return builder;
     }
 }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfiguratorTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfiguratorTest.java
index e57c23d..7cc118b 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfiguratorTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfiguratorTest.java
@@ -27,7 +27,7 @@ import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 import org.apache.maven.settings.Server;
 import org.apache.maven.settings.Settings;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.codehaus.plexus.PlexusTestCase;
 
 /**
@@ -54,9 +54,9 @@ public class DefaultScmRepositoryConfiguratorTest
     public void testGetConfiguredRepository()
         throws ScmRepositoryException, NoSuchScmProviderException
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
-        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, null );
+        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( builder.build(), null );
 
         assertEquals( "check provider", "cvs", repository.getProvider() );
         assertEquals( "check username", "anoncvs", repository.getProviderRepository().getUser() );
@@ -66,9 +66,9 @@ public class DefaultScmRepositoryConfiguratorTest
     public void testGetConfiguredRepositoryWithUsernameAndPassword()
         throws ScmRepositoryException, NoSuchScmProviderException
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor( "username", "password" );
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder( "username", "password" );
 
-        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, null );
+        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( builder.build(), null );
 
         assertEquals( "check username", "username", repository.getProviderRepository().getUser() );
         assertEquals( "check password", "password", repository.getProviderRepository().getPassword() );
@@ -77,11 +77,11 @@ public class DefaultScmRepositoryConfiguratorTest
     public void testGetConfiguredRepositoryWithTagBase()
         throws ScmRepositoryException, NoSuchScmProviderException
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm:svn:http://localhost/home/svn/module/trunk" );
-        releaseDescriptor.setScmTagBase( "http://localhost/home/svn/module/tags" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm:svn:http://localhost/home/svn/module/trunk" );
+        builder.setScmTagBase( "http://localhost/home/svn/module/tags" );
 
-        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, null );
+        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( builder.build(), null );
 
         SvnScmProviderRepository providerRepository = (SvnScmProviderRepository) repository.getProviderRepository();
         assertEquals( "check tag base", "http://localhost/home/svn/module/tags", providerRepository.getTagBase() );
@@ -99,10 +99,10 @@ public class DefaultScmRepositoryConfiguratorTest
         server.setPassphrase( "settings-passphrase" );
         settings.addServer( server );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm:cvs:pserver:anoncvs@localhost:/home/cvs:module" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm:cvs:pserver:anoncvs@localhost:/home/cvs:module" );
 
-        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, settings );
+        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( builder.build(), settings );
 
         ScmProviderRepositoryWithHost providerRepository =
             (ScmProviderRepositoryWithHost) repository.getProviderRepository();
@@ -125,10 +125,10 @@ public class DefaultScmRepositoryConfiguratorTest
         server.setPassphrase( "{7zK9P8hNVeUHbTsjiA/vnOs0zUXbND+9MBNPvdvl+x4=}" );
         settings.addServer( server );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm:svn:svn://localhost/repo" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm:svn:svn://localhost/repo" );
 
-        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, settings );
+        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( builder.build(), settings );
 
         ScmProviderRepositoryWithHost providerRepository =
             (ScmProviderRepositoryWithHost) repository.getProviderRepository();
@@ -141,12 +141,12 @@ public class DefaultScmRepositoryConfiguratorTest
     public void testGetConfiguredRepositoryInvalidScmUrl()
         throws Exception
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm-url" );
 
         try
         {
-            scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, null );
+            scmRepositoryConfigurator.getConfiguredRepository( builder.build(), null );
 
             fail( "Expected failure to get a repository with an invalid SCM URL" );
         }
@@ -159,12 +159,12 @@ public class DefaultScmRepositoryConfiguratorTest
     public void testGetConfiguredRepositoryInvalidScmProvider()
         throws ScmRepositoryException
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm:url:" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm:url:" );
 
         try
         {
-            scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, null );
+            scmRepositoryConfigurator.getConfiguredRepository( builder.build(), null );
 
             fail( "Expected failure to get a repository with an invalid SCM URL" );
         }
@@ -177,12 +177,12 @@ public class DefaultScmRepositoryConfiguratorTest
     public void testGetConfiguredRepositoryInvalidScmUrlParameters()
         throws NoSuchScmProviderException
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm:cvs:" );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm:cvs:" );
 
         try
         {
-            scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, null );
+            scmRepositoryConfigurator.getConfiguredRepository( builder.build(), null );
 
             fail( "Expected failure to get a repository with an invalid SCM URL" );
         }
@@ -195,26 +195,26 @@ public class DefaultScmRepositoryConfiguratorTest
     public void testGetRepositoryProvider()
         throws ScmRepositoryException, NoSuchScmProviderException
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
 
-        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, null );
+        ScmRepository repository = scmRepositoryConfigurator.getConfiguredRepository( builder.build(), null );
 
         ScmProvider provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
         assertEquals( "Check SCM provider", "cvs", provider.getScmType() );
     }
 
-    private static ReleaseDescriptor createReleaseDescriptor()
+    private static ReleaseDescriptorBuilder createReleaseDescriptorBuilder()
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm:cvs:pserver:anoncvs@localhost:/home/cvs:module" );
-        return releaseDescriptor;
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmSourceUrl( "scm:cvs:pserver:anoncvs@localhost:/home/cvs:module" );
+        return builder;
     }
 
-    private static ReleaseDescriptor createReleaseDescriptor( String username, String password )
+    private static ReleaseDescriptorBuilder createReleaseDescriptorBuilder( String username, String password )
     {
-        ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
-        releaseDescriptor.setScmUsername( username );
-        releaseDescriptor.setScmPassword( password );
-        return releaseDescriptor;
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
+        builder.setScmUsername( username );
+        builder.setScmPassword( password );
+        return builder;
     }
 }
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/CleanReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/CleanReleaseMojo.java
index 186785b..1d9f7cf 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/CleanReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/CleanReleaseMojo.java
@@ -24,7 +24,7 @@ import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.shared.release.ReleaseCleanRequest;
 import org.apache.maven.shared.release.ReleaseFailureException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 
 /**
  * Clean up after a release preparation. This is done automatically after a successful <tt>release:perform</tt>,
@@ -44,11 +44,11 @@ public class CleanReleaseMojo
     public void execute()
         throws MojoExecutionException, MojoFailureException
     {
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        ReleaseDescriptorBuilder releaseDescriptor = new ReleaseDescriptorBuilder();
         releaseDescriptor.setWorkingDirectory( getBasedir().getAbsolutePath() );
 
         ReleaseCleanRequest cleanRequest = new ReleaseCleanRequest();
-        cleanRequest.setReleaseDescriptor( releaseDescriptor );
+        cleanRequest.setReleaseDescriptor( releaseDescriptor.build() );
         cleanRequest.setReactorProjects( getReactorProjects() );
         
         try
diff --git a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PerformReleaseMojoTest.java b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PerformReleaseMojoTest.java
index 09b5a52..5aa34f7 100644
--- a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PerformReleaseMojoTest.java
+++ b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PerformReleaseMojoTest.java
@@ -40,7 +40,7 @@ import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.ReleaseManager;
 import org.apache.maven.shared.release.ReleasePerformRequest;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.mockito.ArgumentCaptor;
 
 /**
@@ -58,11 +58,11 @@ public class PerformReleaseMojoTest
     {
         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform.xml" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( workingDirectory.getAbsolutePath() );
         File checkoutDirectory = getTestFile( "target/checkout" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        releaseDescriptor.setPerformGoals( "deploy site-deploy" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setPerformGoals( "deploy site-deploy" );
 
         ReleaseManager mock = mock( ReleaseManager.class );
         mojo.setReleaseManager( mock );
@@ -73,7 +73,7 @@ public class PerformReleaseMojoTest
         // verify
         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
         verify( mock ).perform( argument.capture() );
-        assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
+        assertEquals( builder.build(), argument.getValue().getReleaseDescriptor() );
         assertNotNull( argument.getValue().getReleaseEnvironment()  );
         assertNull( argument.getValue().getReactorProjects() );
         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
@@ -85,12 +85,12 @@ public class PerformReleaseMojoTest
     {
         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform-with-flat-structure.xml" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( workingDirectory.getAbsolutePath() );
         File checkoutDirectory = getTestFile( "target/checkout" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        releaseDescriptor.setPerformGoals( "deploy" );
-        releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/target/svnroot/flat-multi-module/trunk/root-project" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setPerformGoals( "deploy" );
+        builder.setScmSourceUrl( "scm:svn:file://localhost/target/svnroot/flat-multi-module/trunk/root-project" );
 
         ReleaseManager mock = mock( ReleaseManager.class );
         mojo.setReleaseManager( mock );
@@ -101,7 +101,7 @@ public class PerformReleaseMojoTest
         // verify
         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
         verify( mock ).perform( argument.capture() );
-        assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
+        assertEquals( builder.build(), argument.getValue().getReleaseDescriptor() );
         assertNotNull( argument.getValue().getReleaseEnvironment()  );
         assertNull( argument.getValue().getReactorProjects() );
         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
@@ -120,11 +120,11 @@ public class PerformReleaseMojoTest
         MavenProject project = (MavenProject) getVariableValueFromObject( mojo, "project" );
         setVariableValueToObject( mojo, "session", newMavenSession( project ) );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( workingDirectory.getAbsolutePath() );
         File checkoutDirectory = getTestFile( "target/checkout" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        releaseDescriptor.setPerformGoals( "deploy" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setPerformGoals( "deploy" );
 
         ReleaseManager mock = mock( ReleaseManager.class );
         mojo.setReleaseManager( mock );
@@ -135,7 +135,7 @@ public class PerformReleaseMojoTest
         // verify
         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
         verify( mock ).perform( argument.capture() );
-        assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
+        assertEquals( builder.build(), argument.getValue().getReleaseDescriptor() );
         assertNotNull( argument.getValue().getReleaseEnvironment()  );
         assertNull( argument.getValue().getReactorProjects() );
         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
@@ -163,11 +163,11 @@ public class PerformReleaseMojoTest
     {
         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform.xml" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( workingDirectory.getAbsolutePath() );
         File checkoutDirectory = getTestFile( "target/checkout" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        releaseDescriptor.setPerformGoals( "deploy site-deploy" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setPerformGoals( "deploy site-deploy" );
 
         ReleaseManager mock = mock( ReleaseManager.class );
         doThrow( new ReleaseExecutionException( "..." ) ).when( mock ).perform( isA( ReleasePerformRequest.class ) );
@@ -188,7 +188,7 @@ public class PerformReleaseMojoTest
         // verify
         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
         verify( mock ).perform( argument.capture() );
-        assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
+        assertEquals( builder.build(), argument.getValue().getReleaseDescriptor() );
         assertNotNull( argument.getValue().getReleaseEnvironment()  );
         assertNull( argument.getValue().getReactorProjects() );
         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
@@ -201,11 +201,11 @@ public class PerformReleaseMojoTest
     {
         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform.xml" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( workingDirectory.getAbsolutePath() );
         File checkoutDirectory = getTestFile( "target/checkout" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        releaseDescriptor.setPerformGoals( "deploy site-deploy" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setPerformGoals( "deploy site-deploy" );
 
         ReleaseManager mock = mock( ReleaseManager.class );
         ReleaseFailureException cause = new ReleaseFailureException( "..." );
@@ -228,7 +228,7 @@ public class PerformReleaseMojoTest
         // verify
         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
         verify( mock ).perform( argument.capture() );
-        assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
+        assertEquals( builder.build(), argument.getValue().getReleaseDescriptor() );
         assertNotNull( argument.getValue().getReleaseEnvironment()  );
         assertNull( argument.getValue().getReactorProjects() );
         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
@@ -241,12 +241,12 @@ public class PerformReleaseMojoTest
     {
         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform-with-scm.xml" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( workingDirectory.getAbsolutePath() );
         File checkoutDirectory = getTestFile( "target/checkout" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        releaseDescriptor.setPerformGoals( "deploy site-deploy" );
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setPerformGoals( "deploy site-deploy" );
+        builder.setScmSourceUrl( "scm-url" );
 
         ReleaseManager mock = mock( ReleaseManager.class );
         mojo.setReleaseManager( mock );
@@ -257,7 +257,7 @@ public class PerformReleaseMojoTest
         // verify
         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
         verify( mock ).perform( argument.capture() );
-        assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
+        assertEquals( builder.build(), argument.getValue().getReleaseDescriptor() );
         assertNotNull( argument.getValue().getReleaseEnvironment()  );
         assertNull( argument.getValue().getReactorProjects() );
         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
@@ -270,12 +270,12 @@ public class PerformReleaseMojoTest
     {
         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform.xml" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( workingDirectory.getAbsolutePath() );
         File checkoutDirectory = getTestFile( "target/checkout" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        releaseDescriptor.setPerformGoals( "deploy site-deploy" );
-        releaseDescriptor.setAdditionalArguments( "-P prof1,2prof" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setPerformGoals( "deploy site-deploy" );
+        builder.setAdditionalArguments( "-P prof1,2prof" );
 
         MavenSession session = (MavenSession) getVariableValueFromObject( mojo, "session");
         Profile profile1 = new Profile();
@@ -295,7 +295,7 @@ public class PerformReleaseMojoTest
         // verify
         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
         verify( mock ).perform( argument.capture() );
-        assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
+        assertEquals( builder.build(), argument.getValue().getReleaseDescriptor() );
         assertNotNull( argument.getValue().getReleaseEnvironment()  );
         assertNull( argument.getValue().getReactorProjects() );
         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
@@ -308,12 +308,12 @@ public class PerformReleaseMojoTest
     {
         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform-with-args.xml" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( workingDirectory.getAbsolutePath() );
         File checkoutDirectory = getTestFile( "target/checkout" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        releaseDescriptor.setPerformGoals( "deploy site-deploy" );
-        releaseDescriptor.setAdditionalArguments( "-Dmaven.test.skip=true -P prof1,2prof" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setPerformGoals( "deploy site-deploy" );
+        builder.setAdditionalArguments( "-Dmaven.test.skip=true -P prof1,2prof" );
 
         MavenSession session = (MavenSession) getVariableValueFromObject( mojo, "session");
         Profile profile1 = new Profile();
@@ -333,7 +333,7 @@ public class PerformReleaseMojoTest
         // verify
         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
         verify( mock ).perform( argument.capture() );
-        assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
+        assertEquals( builder.build(), argument.getValue().getReleaseDescriptor() );
         assertNotNull( argument.getValue().getReleaseEnvironment()  );
         assertNull( argument.getValue().getReactorProjects() );
         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
@@ -346,11 +346,11 @@ public class PerformReleaseMojoTest
     {
 	    PerformReleaseMojo mojo = getMojoWithProjectSite( "perform-with-multiline-goals.xml" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( workingDirectory.getAbsolutePath() );
         File checkoutDirectory = getTestFile( "target/checkout" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        releaseDescriptor.setPerformGoals( "deploy site-deploy" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setPerformGoals( "deploy site-deploy" );
 
         ReleaseManager mock = mock( ReleaseManager.class );
         mojo.setReleaseManager( mock );
@@ -361,7 +361,7 @@ public class PerformReleaseMojoTest
         // verify
         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
         verify( mock ).perform( argument.capture() );
-        assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
+        assertEquals( builder.build(), argument.getValue().getReleaseDescriptor() );
         assertNotNull( argument.getValue().getReleaseEnvironment()  );
         assertNull( argument.getValue().getReactorProjects() );
         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
diff --git a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java
index deca8a5..0ee8604 100644
--- a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java
+++ b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java
@@ -42,7 +42,7 @@ import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.ReleaseManager;
 import org.apache.maven.shared.release.ReleasePrepareRequest;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.mockito.ArgumentCaptor;
 
@@ -74,9 +74,9 @@ public class PrepareReleaseMojoTest
           };
         };
         
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( testFile.getParentFile().getAbsolutePath() );
-        releaseDescriptor.setUpdateDependencies( false );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( testFile.getParentFile().getAbsolutePath() );
+        builder.setUpdateDependencies( false );
         
         ReleaseManager mock = mock( ReleaseManager.class );
         mojo.setReleaseManager( mock );
@@ -89,7 +89,7 @@ public class PrepareReleaseMojoTest
         // verify
         verify( mock ).prepare( prepareRequest.capture() );
         
-        assertThat( prepareRequest.getValue().getReleaseDescriptor(), is( releaseDescriptor ) );
+        assertThat( prepareRequest.getValue().getReleaseDescriptor(), is( builder.build() ) );
         assertThat( prepareRequest.getValue().getReleaseEnvironment(), is(instanceOf( ReleaseEnvironment.class ) ) );
         assertThat( prepareRequest.getValue().getReactorProjects(), is( nullValue() ) );
         assertThat( prepareRequest.getValue().getResume(), is( true ) );
@@ -109,10 +109,7 @@ public class PrepareReleaseMojoTest
               return new Properties();
           };
         };
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( testFile.getParentFile().getAbsolutePath() );
-        releaseDescriptor.setUpdateDependencies( false );
-        
+
         ReleaseManager mock = mock( ReleaseManager.class );
         doThrow( new ReleaseExecutionException( "..." ) ).when( mock ).prepare( isA( ReleasePrepareRequest.class ) );
         mojo.setReleaseManager( mock );
@@ -147,9 +144,6 @@ public class PrepareReleaseMojoTest
               return new Properties();
           };
         };
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( testFile.getParentFile().getAbsolutePath() );
-        releaseDescriptor.setUpdateDependencies( false );
         
         ReleaseManager mock = mock( ReleaseManager.class );
         ReleaseFailureException cause = new ReleaseFailureException( "..." );
diff --git a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
index 092d77e..e4a4feb 100644
--- a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
+++ b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
@@ -31,7 +31,7 @@ import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.ReleaseManager;
 import org.apache.maven.shared.release.ReleasePerformRequest;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.mockito.ArgumentCaptor;
 
 /**
@@ -49,15 +49,15 @@ public class StageReleaseMojoTest
     {
         StageReleaseMojo mojo = getMojoWithProjectSite( "stage.xml" );
 
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setWorkingDirectory( workingDirectory.getAbsolutePath() );
         File checkoutDirectory = getTestFile( "target/checkout" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-        releaseDescriptor.setPerformGoals( "deploy site:stage-deploy" );
-        releaseDescriptor.setAdditionalArguments( "-DaltDeploymentRepository=\"staging\"" );
+        builder.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+        builder.setPerformGoals( "deploy site:stage-deploy" );
+        builder.setAdditionalArguments( "-DaltDeploymentRepository=\"staging\"" );
 
         ReleasePerformRequest performRequest = new ReleasePerformRequest();
-        performRequest.setReleaseDescriptor( releaseDescriptor );
+        performRequest.setReleaseDescriptor( builder.build() );
         performRequest.setReleaseEnvironment( mojo.getReleaseEnvironment() );
         performRequest.setReactorProjects( mojo.getReactorProjects() );
         performRequest.setDryRun( false );
@@ -70,7 +70,7 @@ public class StageReleaseMojoTest
         // verify
         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
         verify( mock ).perform( argument.capture() );
-        assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
+        assertEquals( builder.build(), argument.getValue().getReleaseDescriptor() );
         assertNotNull( argument.getValue().getReleaseEnvironment() );
         assertNull( argument.getValue().getReactorProjects() );
         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );

-- 
To stop receiving notification emails like this one, please contact
rfscholte@apache.org.