diff --git a/maven-deploy-plugin/src/it/deploy-at-end-extension/module1/pom.xml b/maven-deploy-plugin/src/it/deploy-at-end-extension/module1/pom.xml
new file mode 100644
index 0000000000..3c1ac98e23
--- /dev/null
+++ b/maven-deploy-plugin/src/it/deploy-at-end-extension/module1/pom.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+  4.0.0
+
+  
+    org.apache.maven.its.deploy.dae.extension
+    dae
+    1.0
+  
+  module1
+
+  
+    
+      
+        org.apache.maven.wagon
+        wagon-ftp
+        2.10
+      
+    
+    
+      
+        org.apache.maven.plugins
+        maven-enforcer-plugin
+        1.2
+        
+          
+            enforce
+            
+              enforce
+            
+            
+              
+                
+              
+            
+          
+        
+      
+    
+  
+
+
diff --git a/maven-deploy-plugin/src/it/deploy-at-end-extension/pom.xml b/maven-deploy-plugin/src/it/deploy-at-end-extension/pom.xml
new file mode 100644
index 0000000000..fb861b5864
--- /dev/null
+++ b/maven-deploy-plugin/src/it/deploy-at-end-extension/pom.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+  4.0.0
+
+  org.apache.maven.its.deploy.dae.extension
+  dae
+  1.0
+  pom
+
+  
+    Tests deployment at end when modules have different extensions.
+  
+
+  
+    true
+  
+
+  
+    
+      it
+      file:///${basedir}/target/repo
+      false
+    
+  
+
+  
+    
+      
+        org.apache.maven.plugins
+        maven-compiler-plugin
+        2.0.2
+      
+      
+        org.apache.maven.plugins
+        maven-deploy-plugin
+        @project.version@
+        
+          true
+        
+      
+      
+        org.apache.maven.plugins
+        maven-install-plugin
+        2.2
+      
+      
+        org.apache.maven.plugins
+        maven-jar-plugin
+        2.1
+      
+      
+        org.apache.maven.plugins
+        maven-resources-plugin
+        2.2
+      
+      
+        org.apache.maven.plugins
+        maven-source-plugin
+        2.0.4
+        
+          
+            attach-sources
+            
+              jar
+            
+          
+        
+      
+      
+        org.apache.maven.plugins
+        maven-surefire-plugin
+        2.3.1
+      
+    
+  
+
+  
+    module1
+  
+
diff --git a/maven-deploy-plugin/src/it/deploy-at-end-extension/verify.groovy b/maven-deploy-plugin/src/it/deploy-at-end-extension/verify.groovy
new file mode 100644
index 0000000000..3e3220f118
--- /dev/null
+++ b/maven-deploy-plugin/src/it/deploy-at-end-extension/verify.groovy
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+assert new File( basedir, "target/repo/org/apache/maven/its/deploy/dae/extension/dae/1.0/dae-1.0.pom" ).exists()
+assert new File( basedir, "module1/target/repo/org/apache/maven/its/deploy/dae/extension/module1/1.0/module1-1.0.pom" ).exists()
+
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.exists()
+assert buildLog.text.contains( "[INFO] Deploying org.apache.maven.its.deploy.dae.extension:dae:1.0 at end" )
+
diff --git a/maven-deploy-plugin/src/it/deploy-at-end-override-skip/module1/pom.xml b/maven-deploy-plugin/src/it/deploy-at-end-override-skip/module1/pom.xml
new file mode 100644
index 0000000000..409fb86e28
--- /dev/null
+++ b/maven-deploy-plugin/src/it/deploy-at-end-override-skip/module1/pom.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+  4.0.0
+
+  
+    org.apache.maven.its.deploy.dae.overide-skip
+    dae
+    1.0
+  
+  module1
+
+  
+    
+      
+        org.apache.maven.wagon
+        wagon-ftp
+        2.10
+      
+    
+    
+      
+        org.apache.maven.plugins
+        maven-deploy-plugin
+        
+          false
+        
+      
+      
+        org.apache.maven.plugins
+        maven-enforcer-plugin
+        1.2
+        
+          
+            enforce
+            
+              enforce
+            
+            
+              
+                
+              
+            
+          
+        
+      
+    
+  
+
+
diff --git a/maven-deploy-plugin/src/it/deploy-at-end-override-skip/pom.xml b/maven-deploy-plugin/src/it/deploy-at-end-override-skip/pom.xml
new file mode 100644
index 0000000000..385b27d421
--- /dev/null
+++ b/maven-deploy-plugin/src/it/deploy-at-end-override-skip/pom.xml
@@ -0,0 +1,101 @@
+
+
+
+
+
+  4.0.0
+
+  org.apache.maven.its.deploy.dae.overide-skip
+  dae
+  1.0
+  pom
+
+  
+    Tests deployment at end when module overrides parent skip.
+  
+
+  
+    true
+  
+
+  
+    
+      it
+      file:///${basedir}/target/repo
+      false
+    
+  
+
+  
+    
+      
+        org.apache.maven.plugins
+        maven-compiler-plugin
+        2.0.2
+      
+      
+        org.apache.maven.plugins
+        maven-deploy-plugin
+        @project.version@
+        
+          true
+          true
+        
+      
+      
+        org.apache.maven.plugins
+        maven-install-plugin
+        2.2
+      
+      
+        org.apache.maven.plugins
+        maven-jar-plugin
+        2.1
+      
+      
+        org.apache.maven.plugins
+        maven-resources-plugin
+        2.2
+      
+      
+        org.apache.maven.plugins
+        maven-source-plugin
+        2.0.4
+        
+          
+            attach-sources
+            
+              jar
+            
+          
+        
+      
+      
+        org.apache.maven.plugins
+        maven-surefire-plugin
+        2.3.1
+      
+    
+  
+
+  
+    module1
+  
+
diff --git a/maven-deploy-plugin/src/it/deploy-at-end-override-skip/verify.groovy b/maven-deploy-plugin/src/it/deploy-at-end-override-skip/verify.groovy
new file mode 100644
index 0000000000..3dd737d6fc
--- /dev/null
+++ b/maven-deploy-plugin/src/it/deploy-at-end-override-skip/verify.groovy
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+assert !new File( basedir, "target/repo/org/apache/maven/its/deploy/dae/overide-skip/dae/1.0/dae-1.0.pom" ).exists()
+assert new File( basedir, "module1/target/repo/org/apache/maven/its/deploy/dae/overide-skip/module1/1.0/module1-1.0.pom" ).exists()
+
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.exists()
+assert !buildLog.text.contains( "[INFO] Deploying org.apache.maven.its.deploy.dae.overide-skip:module1:1.0 at end" )
+assert !buildLog.text.contains( "[INFO] Deploying org.apache.maven.its.deploy.dae.overide-skip:dae:1.0 at end" )
+
diff --git a/maven-deploy-plugin/src/it/deploy-at-end-override/module1/pom.xml b/maven-deploy-plugin/src/it/deploy-at-end-override/module1/pom.xml
new file mode 100644
index 0000000000..1911c97f30
--- /dev/null
+++ b/maven-deploy-plugin/src/it/deploy-at-end-override/module1/pom.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+  4.0.0
+
+  
+    org.apache.maven.its.deploy.dae.overide
+    dae
+    1.0
+  
+  module1
+
+  
+    
+      
+        org.apache.maven.wagon
+        wagon-ftp
+        2.10
+      
+    
+    
+      
+        org.apache.maven.plugins
+        maven-deploy-plugin
+        
+          true
+        
+      
+      
+        org.apache.maven.plugins
+        maven-enforcer-plugin
+        1.2
+        
+          
+            enforce
+            
+              enforce
+            
+            
+              
+                
+              
+            
+          
+        
+      
+    
+  
+
+
diff --git a/maven-deploy-plugin/src/it/deploy-at-end-override/module2/pom.xml b/maven-deploy-plugin/src/it/deploy-at-end-override/module2/pom.xml
new file mode 100644
index 0000000000..2174b3acf4
--- /dev/null
+++ b/maven-deploy-plugin/src/it/deploy-at-end-override/module2/pom.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+  4.0.0
+
+  
+    org.apache.maven.its.deploy.dae.overide
+    dae
+    1.0
+  
+  module2
+
+  
+    
+      
+        org.apache.maven.wagon
+        wagon-ftp
+        2.10
+      
+    
+    
+      
+        org.apache.maven.plugins
+        maven-deploy-plugin
+        
+          true
+        
+      
+      
+        org.apache.maven.plugins
+        maven-enforcer-plugin
+        1.2
+        
+          
+            enforce
+            
+              enforce
+            
+            
+              
+                
+              
+            
+          
+        
+      
+    
+  
+
+
diff --git a/maven-deploy-plugin/src/it/deploy-at-end-override/pom.xml b/maven-deploy-plugin/src/it/deploy-at-end-override/pom.xml
new file mode 100644
index 0000000000..6581abd13a
--- /dev/null
+++ b/maven-deploy-plugin/src/it/deploy-at-end-override/pom.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+  4.0.0
+
+  org.apache.maven.its.deploy.dae.overide
+  dae
+  1.0
+  pom
+
+  
+    Tests deployment at end when module overrides parent deployAtEnd.
+  
+
+  
+    true
+  
+
+  
+    
+      it
+      file:///${basedir}/target/repo
+      false
+    
+  
+
+  
+    
+      
+        org.apache.maven.plugins
+        maven-compiler-plugin
+        2.0.2
+      
+      
+        org.apache.maven.plugins
+        maven-deploy-plugin
+        @project.version@
+      
+      
+        org.apache.maven.plugins
+        maven-install-plugin
+        2.2
+      
+      
+        org.apache.maven.plugins
+        maven-jar-plugin
+        2.1
+      
+      
+        org.apache.maven.plugins
+        maven-resources-plugin
+        2.2
+      
+      
+        org.apache.maven.plugins
+        maven-source-plugin
+        2.0.4
+        
+          
+            attach-sources
+            
+              jar
+            
+          
+        
+      
+      
+        org.apache.maven.plugins
+        maven-surefire-plugin
+        2.3.1
+      
+    
+  
+
+  
+    module1
+    module2
+  
+
diff --git a/maven-deploy-plugin/src/it/deploy-at-end-override/verify.groovy b/maven-deploy-plugin/src/it/deploy-at-end-override/verify.groovy
new file mode 100644
index 0000000000..77296acc55
--- /dev/null
+++ b/maven-deploy-plugin/src/it/deploy-at-end-override/verify.groovy
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+assert new File( basedir, "target/repo/org/apache/maven/its/deploy/dae/overide/dae/1.0/dae-1.0.pom" ).exists()
+assert new File( basedir, "module1/target/repo/org/apache/maven/its/deploy/dae/overide/module1/1.0/module1-1.0.pom" ).exists()
+assert new File( basedir, "module2/target/repo/org/apache/maven/its/deploy/dae/overide/module2/1.0/module2-1.0.pom" ).exists()
+
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.exists()
+assert buildLog.text.contains( "[INFO] Deploying org.apache.maven.its.deploy.dae.overide:module1:1.0 at end" )
+assert !buildLog.text.contains( "[INFO] Deploying org.apache.maven.its.deploy.dae.overide:module2:1.0 at end" )
+assert !buildLog.text.contains( "[INFO] Deploying org.apache.maven.its.deploy.dae.overide:dae:1.0 at end" )
+
diff --git a/maven-deploy-plugin/src/main/java/org/apache/maven/plugins/deploy/AbstractDeployMojo.java b/maven-deploy-plugin/src/main/java/org/apache/maven/plugins/deploy/AbstractDeployMojo.java
index 77e811f835..7d91a7415c 100644
--- a/maven-deploy-plugin/src/main/java/org/apache/maven/plugins/deploy/AbstractDeployMojo.java
+++ b/maven-deploy-plugin/src/main/java/org/apache/maven/plugins/deploy/AbstractDeployMojo.java
@@ -29,7 +29,7 @@
 import org.apache.maven.plugins.annotations.Parameter;
 
 /**
- * @version $Id$
+ * @version $Id: AbstractDeployMojo.java 1791602 2017-04-16 11:20:59Z khmarbaise $
  */
 public abstract class AbstractDeployMojo
     extends AbstractMojo
diff --git a/maven-deploy-plugin/src/main/java/org/apache/maven/plugins/deploy/CastHelper.java b/maven-deploy-plugin/src/main/java/org/apache/maven/plugins/deploy/CastHelper.java
new file mode 100644
index 0000000000..bea0473d90
--- /dev/null
+++ b/maven-deploy-plugin/src/main/java/org/apache/maven/plugins/deploy/CastHelper.java
@@ -0,0 +1,109 @@
+package org.apache.maven.plugins.deploy;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import org.apache.maven.plugin.MojoFailureException;
+
+/**
+ * Cast or copy instance across ClassLoaders
+ * 
+ * @version $Id:  $
+ */
+class CastHelper
+{
+    private static final String GET = "get";
+    private static final int GET_LEN = GET.length();
+
+    private static final String IS = "is";
+    private static final int IS_LEN = IS.length();
+
+    /**
+     * Cast an instance, or copy if the instance is in a different ClassLoader
+     * @param dstType The class of the returned instance
+     * @param src The source instance.
+     * @return The original instance if it was of the proper type; otherwise a copy in the correct ClassLoader
+     * @throws MojoFailureException
+     */
+    static  T castToSameClassLoader( Class dstType, Object src ) throws MojoFailureException
+    {
+        try
+        {
+            return dstType.cast( src );
+        }
+        catch ( ClassCastException cce )
+        {
+            // copy contents to a across ClassLoaders.
+            try
+            {
+                return copyAttributes( dstType.newInstance(), src );
+            }
+            catch ( Exception e )
+            {
+                throw new MojoFailureException( e.getMessage(), e );
+            }
+        }
+    }
+
+    /**
+     * Simplistic copy of fields from src instance to dst instance.  All fields must match.
+     */
+    private static  T copyAttributes( T dst, Object src )
+        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException
+    {
+        for ( Method getter : src.getClass().getMethods() )
+        {
+            if ( getter.getParameterTypes().length != 0 )
+            {
+                continue;
+            }
+            String capitalName = extractAttributeNameFromGetter( getter.getName() );
+            if ( capitalName == null )
+            {
+                continue;
+            }
+            try
+            {
+                Method setter = dst.getClass().getMethod( "set" + capitalName, getter.getReturnType() );
+                Object attribute = getter.invoke( src );
+                setter.invoke( dst, attribute );
+            }
+            catch ( NoSuchMethodException ignore )
+            {
+                continue;
+            }
+        }
+        return dst;
+    }
+
+    private static String extractAttributeNameFromGetter( String name )
+    {
+        if ( name.startsWith( GET ) )
+        {
+            return name.substring( GET_LEN );
+        }
+        if ( name.startsWith( IS ) )
+        {
+            return name.substring( IS_LEN );
+        }
+        return null;
+    }
+}
diff --git a/maven-deploy-plugin/src/main/java/org/apache/maven/plugins/deploy/DeployMojo.java b/maven-deploy-plugin/src/main/java/org/apache/maven/plugins/deploy/DeployMojo.java
index 812b22d97a..878663446c 100644
--- a/maven-deploy-plugin/src/main/java/org/apache/maven/plugins/deploy/DeployMojo.java
+++ b/maven-deploy-plugin/src/main/java/org/apache/maven/plugins/deploy/DeployMojo.java
@@ -20,12 +20,10 @@
  */
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.Properties;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -54,15 +52,6 @@ public class DeployMojo
 
     private static final Pattern ALT_REPO_SYNTAX_PATTERN = Pattern.compile( "(.+)::(.+)" );
 
-    /**
-     * When building with multiple threads, reaching the last project doesn't have to mean that all projects are ready
-     * to be deployed
-     */
-    private static final AtomicInteger READYPROJECTSCOUNTER = new AtomicInteger();
-
-    private static final List DEPLOYREQUESTS =
-        Collections.synchronizedList( new ArrayList() );
-
     /**
      */
     @Parameter( defaultValue = "${project}", readonly = true, required = true )
@@ -131,10 +120,10 @@ public class DeployMojo
     public void execute()
         throws MojoExecutionException, MojoFailureException
     {
-        boolean addedDeployRequest = false;
         if ( skip )
         {
             getLog().info( "Skipping artifact deployment" );
+            queueDeployment( null );
         }
         else
         {
@@ -152,42 +141,93 @@ public void execute()
             // @formatter:on
             // CHECKSTYLE_ON: LineLength
 
-            ArtifactRepository repo = getDeploymentRepository( pdr );
-
             if ( !deployAtEnd )
             {
-                deployProject( getSession().getProjectBuildingRequest(), pdr, repo );
+                queueDeployment( null );
+                deployProject( pdr );
             }
             else
             {
-                DEPLOYREQUESTS.add( pdr );
-                addedDeployRequest = true;
+                queueDeployment( pdr );
             }
         }
+        deployQueuedRequests();
+    }
+
+    /**
+     * Queue a deployment request.  In a reactor, some deployments may be delayed or skipped while others are not
+     * @param pdr The deployment request.  Null indicates that the deployment was not delayed
+     * @throws MojoExecutionException
+     * @throws MojoFailureException
+     */
+    private void queueDeployment( ProjectDeployerRequest pdr )
+        throws MojoExecutionException, MojoFailureException
+    {
+        List deployRequests = getDeployRequests();
 
-        boolean projectsReady = READYPROJECTSCOUNTER.incrementAndGet() == reactorProjects.size();
-        if ( projectsReady )
+        // build may be parallel, protect against multiple threads accessing
+        synchronized ( deployRequests )
         {
-            synchronized ( DEPLOYREQUESTS )
+
+            deployRequests.add( pdr );
+            if ( pdr != null && deployRequests.size() != reactorProjects.size() )
             {
-                while ( !DEPLOYREQUESTS.isEmpty() )
-                {
-                    ArtifactRepository repo = getDeploymentRepository( DEPLOYREQUESTS.get( 0 ) );
+                getLog().info( "Deploying " + project.getGroupId() + ":" + project.getArtifactId() + ":"
+                  + project.getVersion() + " at end" );
+            }
+        }
+    }
 
-                    deployProject( getSession().getProjectBuildingRequest(), DEPLOYREQUESTS.remove( 0 ), repo );
+    public void deployQueuedRequests() throws MojoExecutionException, MojoFailureException
+    {
+        List deployRequests = getDeployRequests();
+        // build may be parallel, protect against multiple threads accessing
+        synchronized ( deployRequests )
+        {
+            if ( deployRequests.size() != reactorProjects.size() )
+            {
+                return;
+            }
+            for ( Object dr : deployRequests )
+            {
+                if ( dr != null )
+                {
+                    /*
+                     * Cast the instance to a ProjectDeployerRequest.  This specialized casting would
+                     * not be necessary if ProjectDeployerRequest were in core.
+                     */
+                    deployProject( CastHelper.castToSameClassLoader( ProjectDeployerRequest.class, dr ) );
                 }
             }
         }
-        else if ( addedDeployRequest )
+    }
+
+    private List getDeployRequests()
+    {
+        Properties projectProperties = getSession().getUserProperties();
+
+        // Plugin instances may be in different Classworlds if they are loaded in different modules
+        // containing different extensions.  The plugin cannot rely on static variables, only injected
+        // or session shared variables
+        synchronized ( projectProperties )
         {
-            getLog().info( "Deploying " + project.getGroupId() + ":" + project.getArtifactId() + ":"
-                + project.getVersion() + " at end" );
+            String propertyKey = getClass().getCanonicalName();
+            List reqs = (List) projectProperties.get( propertyKey );
+            if ( reqs == null )
+            {
+                reqs = new ArrayList( reactorProjects.size() );
+                projectProperties.put( propertyKey, reqs );
+            }
+            return reqs;
         }
     }
 
-    private void deployProject( ProjectBuildingRequest pbr, ProjectDeployerRequest pir, ArtifactRepository repo )
+    private void deployProject( ProjectDeployerRequest pir )
         throws MojoFailureException, MojoExecutionException
     {
+        ArtifactRepository repo = getDeploymentRepository( pir );
+        ProjectBuildingRequest pbr = getSession().getProjectBuildingRequest();
+
         try
         {
             projectDeployer.deploy( pbr, pir, repo );
@@ -200,7 +240,6 @@ private void deployProject( ProjectBuildingRequest pbr, ProjectDeployerRequest p
     }
 
     ArtifactRepository getDeploymentRepository( ProjectDeployerRequest pdr )
-
         throws MojoExecutionException, MojoFailureException
     {
         MavenProject project = pdr.getProject();
@@ -259,5 +298,4 @@ else if ( !ArtifactUtils.isSnapshot( project.getVersion() ) && altReleaseDeploym
 
         return repo;
     }
-
 }
diff --git a/maven-deploy-plugin/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoTest.java b/maven-deploy-plugin/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoTest.java
index 6c7064bbb2..2601350e5c 100644
--- a/maven-deploy-plugin/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoTest.java
+++ b/maven-deploy-plugin/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoTest.java
@@ -26,6 +26,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import java.util.Properties;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Model;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
@@ -69,6 +70,19 @@ public void setUp()
         }
     }
 
+    private void initializeMocksForMojo() {
+        assertNotNull( mojo );
+
+        MockitoAnnotations.initMocks( this );
+
+        ProjectBuildingRequest buildingRequest = mock ( ProjectBuildingRequest.class );
+        when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
+        when( session.getUserProperties() ).thenReturn( new Properties() );
+        MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
+        repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( LOCAL_REPO ) );
+        when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
+    }
+
     public void testDeployTestEnvironment()
         throws Exception
     {
@@ -86,16 +100,8 @@ public void testBasicDeployFile()
 
         mojo = (DeployFileMojo) lookupMojo( "deploy-file", testPom );
 
-        MockitoAnnotations.initMocks( this );
-        
-        assertNotNull( mojo );
-        
-        ProjectBuildingRequest buildingRequest = mock ( ProjectBuildingRequest.class );
-        when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
-        MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
-        repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( LOCAL_REPO ) );
-        when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
-        
+        initializeMocksForMojo();
+
         String groupId = (String) getVariableValueFromObject( mojo, "groupId" );
 
         String artifactId = (String) getVariableValueFromObject( mojo, "artifactId" );
@@ -187,15 +193,7 @@ public void testDeployIfClassifierIsSet()
 
         mojo = (DeployFileMojo) lookupMojo( "deploy-file", testPom );
 
-        MockitoAnnotations.initMocks( this );
-        
-        assertNotNull( mojo );
-        
-        ProjectBuildingRequest buildingRequest = mock ( ProjectBuildingRequest.class );
-        when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
-        MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
-        repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( LOCAL_REPO ) );
-        when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
+        initializeMocksForMojo();
 
         String classifier = ( String ) getVariableValueFromObject( mojo, "classifier" );
 
@@ -235,10 +233,8 @@ public void testDeployIfArtifactIsNotJar()
 
         mojo = (DeployFileMojo) lookupMojo( "deploy-file", testPom );
 
-        MockitoAnnotations.initMocks( this );
-        
-        assertNotNull( mojo );
-        
+        initializeMocksForMojo();
+
         ProjectBuildingRequest buildingRequest = mock ( ProjectBuildingRequest.class );
         when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
         MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
diff --git a/maven-deploy-plugin/src/test/java/org/apache/maven/plugins/deploy/DeployMojoTest.java b/maven-deploy-plugin/src/test/java/org/apache/maven/plugins/deploy/DeployMojoTest.java
index 4db5b2def7..9847e3cf92 100644
--- a/maven-deploy-plugin/src/test/java/org/apache/maven/plugins/deploy/DeployMojoTest.java
+++ b/maven-deploy-plugin/src/test/java/org/apache/maven/plugins/deploy/DeployMojoTest.java
@@ -92,8 +92,6 @@ public void setUp()
         {
             FileUtils.deleteDirectory( remoteRepo );
         }
-        
-        
     }
 
     public void tearDown()
@@ -106,7 +104,20 @@ public void tearDown()
             //FileUtils.deleteDirectory( remoteRepo );
         }
     }
-    
+
+    private void initializeMocksForMojo() {
+        assertNotNull( mojo );
+
+        MockitoAnnotations.initMocks( this );
+
+        ProjectBuildingRequest buildingRequest = mock ( ProjectBuildingRequest.class );
+        when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
+        when( session.getUserProperties() ).thenReturn( new Properties() );
+        MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
+        repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( LOCAL_REPO ) );
+        when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
+    }
+
     public void testDeployTestEnvironment()
         throws Exception
     {
@@ -124,17 +135,9 @@ public void testBasicDeploy()
         File testPom = new File( getBasedir(), "target/test-classes/unit/basic-deploy-test/plugin-config.xml" );
 
         mojo = ( DeployMojo ) lookupMojo( "deploy", testPom );
-        
-        MockitoAnnotations.initMocks( this );
-        
-        assertNotNull( mojo );
-        
-        ProjectBuildingRequest buildingRequest = mock ( ProjectBuildingRequest.class );
-        when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
-        MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
-        repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( LOCAL_REPO ) );
-        when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
-        
+
+        initializeMocksForMojo();
+
         File file = new File( getBasedir(),
                               "target/test-classes/unit/basic-deploy-test/target/" +
                               "deploy-test-file-1.0-SNAPSHOT.jar" );
@@ -239,9 +242,9 @@ public void testSkippingDeploy()
     {
         File testPom = new File( getBasedir(), "target/test-classes/unit/basic-deploy-test/plugin-config.xml" );
 
-        DeployMojo mojo = (DeployMojo) lookupMojo( "deploy", testPom );
+        mojo = (DeployMojo) lookupMojo( "deploy", testPom );
 
-        assertNotNull( mojo );
+        initializeMocksForMojo();
 
         File file = new File( getBasedir(), "target/test-classes/unit/basic-deploy-test/target/"
             + "deploy-test-file-1.0-SNAPSHOT.jar" );
@@ -295,17 +298,9 @@ public void testBasicDeployWithPackagingAsPom()
                         "target/test-classes/unit/basic-deploy-pom/plugin-config.xml" );
         
         mojo = ( DeployMojo ) lookupMojo( "deploy", testPom );
-        
-        MockitoAnnotations.initMocks( this );
-        
-        assertNotNull( mojo );
-        
-        ProjectBuildingRequest buildingRequest = mock ( ProjectBuildingRequest.class );
-        when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
-        MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
-        repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( LOCAL_REPO ) );
-        when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
-        
+
+        initializeMocksForMojo();
+
         File pomFile = new File( getBasedir(),
                               "target/test-classes/unit/basic-deploy-pom/target/" +
                               "deploy-test-file-1.0-SNAPSHOT.pom" );
@@ -366,17 +361,9 @@ public void testUpdateReleaseParamSetToTrue()
         File testPom = new File( getBasedir(),
                                  "target/test-classes/unit/basic-deploy-pom/plugin-config.xml" );
         mojo = ( DeployMojo ) lookupMojo( "deploy", testPom );
-        
-        MockitoAnnotations.initMocks( this );
-        
-        assertNotNull( mojo );
-        
-        ProjectBuildingRequest buildingRequest = mock ( ProjectBuildingRequest.class );
-        when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
-        MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
-        repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( LOCAL_REPO ) );
-        when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
-        
+
+        initializeMocksForMojo();
+
         boolean updateReleaseInfo = (Boolean) getVariableValueFromObject(mojo, "updateReleaseInfo");
         
         assertTrue( updateReleaseInfo );
@@ -404,17 +391,10 @@ public void testDeployIfArtifactFileIsNull()
         File testPom = new File( getBasedir(),
                                  "target/test-classes/unit/basic-deploy-test/plugin-config.xml" );
         
-        DeployMojo mojo = ( DeployMojo ) lookupMojo( "deploy", testPom );
+        mojo = ( DeployMojo ) lookupMojo( "deploy", testPom );
 
-        MockitoAnnotations.initMocks( this );
+        initializeMocksForMojo();
 
-        ProjectBuildingRequest buildingRequest = mock ( ProjectBuildingRequest.class );
-        when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
-        
-        setVariableValueToObject( mojo, "session", session );
-        
-        assertNotNull( mojo );
-        
         MavenProject project = (MavenProject) getVariableValueFromObject( mojo, "project" );
 
         setVariableValueToObject( mojo, "reactorProjects", Collections.singletonList( project ) );
@@ -445,16 +425,8 @@ public void testDeployWithAttachedArtifacts()
                                  "plugin-config.xml" );
 
         mojo = ( DeployMojo ) lookupMojo( "deploy", testPom );
-        
-        MockitoAnnotations.initMocks( this );
-        
-        assertNotNull( mojo );
-        
-        ProjectBuildingRequest buildingRequest = mock ( ProjectBuildingRequest.class );
-        when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
-        MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
-        repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( LOCAL_REPO ) );
-        when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
+
+        initializeMocksForMojo();
 
         MavenProject project = (MavenProject) getVariableValueFromObject( mojo, "project" );
 
@@ -522,7 +494,7 @@ public void testDeployWithAttachedArtifacts()
 
         assertEquals( 0, getSizeOfExpectedFiles( fileList, expectedFiles ) );               
     }
-    
+
     @Ignore( "SCP is not part of Maven3 distribution. Aether handles transport extensions." )
     public void _testBasicDeployWithScpAsProtocol()
         throws Exception