diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
index 0f55a2d..c42b70e 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
@@ -36,8 +36,10 @@
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.ArtifactUtils;
+import org.apache.maven.model.Build;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.ModelBase;
+import org.apache.maven.model.Profile;
 import org.apache.maven.model.Scm;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.ScmException;
@@ -334,12 +336,27 @@
         roots.add( rootElement );
         roots.addAll( getChildren( rootElement, "profiles", "profile" ) );
 
-        if ( modelTarget.getBuild() != null )
+        Build buildTarget = modelTarget.getBuild();
+        if ( buildTarget != null )
         {
             // profile.build.extensions doesn't exist, so only rewrite project.build.extensions  
-            rewriteArtifactVersions( toMavenCoordinates( modelTarget.getBuild().getExtensions() ), mappedVersions,
+            rewriteArtifactVersions( toMavenCoordinates( buildTarget.getExtensions() ), mappedVersions,
                                      resolvedSnapshotDependencies, originalVersions, model, properties, result,
                                      releaseDescriptor );
+            
+            rewriteArtifactVersions( toMavenCoordinates( buildTarget.getPlugins() ), mappedVersions,
+                                     resolvedSnapshotDependencies, originalVersions, model, properties, result,
+                                     releaseDescriptor );
+        }
+        
+        for ( Profile profile : modelTarget.getProfiles() )
+        {
+            if ( profile.getBuild() != null )
+            {
+                rewriteArtifactVersions( toMavenCoordinates( profile.getBuild().getPlugins() ), mappedVersions,
+                                         resolvedSnapshotDependencies, originalVersions, model, properties, result,
+                                         releaseDescriptor );
+            }
         }
         
         List<ModelBase> modelBases = new ArrayList<ModelBase>();
@@ -357,14 +374,12 @@
                                          mappedVersions, resolvedSnapshotDependencies, originalVersions, model,
                                          properties, result, releaseDescriptor );
             }
+            
         }
 
         for ( Element root : roots )
         {
-            
-
             List<Element> pluginElements = new ArrayList<Element>();
-            pluginElements.addAll( getChildren( root, "build", "plugins", "plugin" ) );
             pluginElements.addAll( getChildren( root, "build", "pluginManagement", "plugins", "plugin" ) );
             
             List<MavenCoordinate> pluginCoordinates = new ArrayList<MavenCoordinate>( pluginElements.size() );
@@ -373,6 +388,8 @@
                 pluginCoordinates.add( new JDomMavenCoordinate( pluginElement ) );
             }
 
+            pluginElements.addAll( getChildren( root, "build", "plugins", "plugin" ) );
+
             rewriteArtifactVersions( pluginCoordinates, mappedVersions, resolvedSnapshotDependencies, originalVersions,
                                     model, properties, result, releaseDescriptor );
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomBuild.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomBuild.java
index 6153fb7..b35a969 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomBuild.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomBuild.java
@@ -274,7 +274,25 @@
     @Override
     public List<Plugin> getPlugins()
     {
-        throw new UnsupportedOperationException();
+        Element pluginsElm = build.getChild( "plugins", build.getNamespace() );
+        if ( pluginsElm == null )
+        {
+            return Collections.emptyList();
+        }
+        else
+        {
+            List<Element> pluginElms =
+                pluginsElm.getChildren( "plugin", build.getNamespace() );
+
+            List<Plugin> plugins = new ArrayList<Plugin>( pluginElms.size() );
+
+            for ( Element pluginElm : pluginElms )
+            {
+                plugins.add( new JDomPlugin( pluginElm ) );
+            }
+
+            return plugins;
+        }
     }
 
     @Override
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModel.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModel.java
index ba3f963..951d7f5 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModel.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModel.java
@@ -96,7 +96,6 @@
         return project.getChild( "parent", project.getNamespace() );
     }
     
-    
     @Override
     public List<Profile> getProfiles()
     {
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomPlugin.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomPlugin.java
new file mode 100644
index 0000000..f79fed7
--- /dev/null
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomPlugin.java
@@ -0,0 +1,193 @@
+package org.apache.maven.shared.release.transform.jdom;
+
+/*
+ * 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.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.PluginExecution;
+import org.apache.maven.shared.release.transform.MavenCoordinate;
+import org.jdom.Element;
+
+/**
+ * JDom implementation of poms PLUGIN element
+ * 
+ * @author Robert Scholte
+ * @since 3.0
+ */
+public class JDomPlugin extends Plugin implements MavenCoordinate
+{
+    private Element plugin;
+    private final MavenCoordinate coordinate;
+
+    public JDomPlugin( Element plugin )
+    {
+        this.plugin = plugin;
+        this.coordinate = new JDomMavenCoordinate( plugin );
+    }
+
+    @Override
+    public void addDependency( Dependency dependency )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void addExecution( PluginExecution pluginExecution )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getArtifactId()
+    {
+        return coordinate.getArtifactId();
+    }
+
+    @Override
+    public List<Dependency> getDependencies()
+    {
+        Element dependenciesElm = plugin.getChild( "dependencies", plugin.getNamespace() );
+        if ( dependenciesElm == null )
+        {
+            return Collections.emptyList();
+        }
+        else
+        {
+            List<Element> dependencyElms =
+                dependenciesElm.getChildren( "dependency", plugin.getNamespace() );
+
+            List<Dependency> dependencies = new ArrayList<Dependency>( dependencyElms.size() );
+
+            for ( Element dependencyElm : dependencyElms )
+            {
+                dependencies.add( new JDomDependency( dependencyElm ) );
+            }
+
+            return dependencies;
+        }
+    }
+
+    @Override
+    public List<PluginExecution> getExecutions()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Object getGoals()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getGroupId()
+    {
+        return coordinate.getGroupId();
+    }
+
+    @Override
+    public String getVersion()
+    {
+        return coordinate.getVersion();
+    }
+
+    @Override
+    public boolean isExtensions()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void removeDependency( Dependency dependency )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void removeExecution( PluginExecution pluginExecution )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setArtifactId( String artifactId )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setDependencies( List<Dependency> dependencies )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setExecutions( List<PluginExecution> executions )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setExtensions( boolean extensions )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setGoals( Object goals )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setGroupId( String groupId )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setVersion( String version )
+    {
+        coordinate.setVersion( version );
+    }
+
+    @Override
+    public void flushExecutionMap()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Map getExecutionsAsMap()
+    {
+        throw new UnsupportedOperationException();
+    }
+    
+    @Override
+    public String getName()
+    {
+        return "plugin";
+    }
+}
