diff --git a/src/it/report-aggregated-changes-generation/module1/pom.xml b/src/it/report-aggregated-changes-generation/module1/pom.xml
index 78fc2d5..382201d 100644
--- a/src/it/report-aggregated-changes-generation/module1/pom.xml
+++ b/src/it/report-aggregated-changes-generation/module1/pom.xml
@@ -19,15 +19,15 @@
 -->
 
 <project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-changes-plugin-test</artifactId>
     <version>99.0</version>
   </parent>
-    <artifactId>maven-changes-plugin-test1</artifactId>
+  <artifactId>maven-changes-plugin-test1</artifactId>
   <version>99.0</version>
   <name>Module1</name>
   <packaging>jar</packaging>
diff --git a/src/it/report-aggregated-changes-generation/module2/pom.xml b/src/it/report-aggregated-changes-generation/module2/pom.xml
index 68751be..ff0feae 100644
--- a/src/it/report-aggregated-changes-generation/module2/pom.xml
+++ b/src/it/report-aggregated-changes-generation/module2/pom.xml
@@ -19,15 +19,15 @@
 -->
 
 <project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-changes-plugin-test</artifactId>
     <version>99.0</version>
   </parent>
-    <artifactId>maven-changes-plugin-test2</artifactId>
+  <artifactId>maven-changes-plugin-test2</artifactId>
   <version>99.0</version>
   <name>Module2</name>
   <packaging>jar</packaging>
diff --git a/src/it/report-aggregated-changes-generation/module3/pom.xml b/src/it/report-aggregated-changes-generation/module3/pom.xml
index 66f9bac..43f358d 100644
--- a/src/it/report-aggregated-changes-generation/module3/pom.xml
+++ b/src/it/report-aggregated-changes-generation/module3/pom.xml
@@ -19,15 +19,15 @@
 -->
 
 <project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-changes-plugin-test</artifactId>
     <version>99.0</version>
   </parent>
-    <artifactId>maven-changes-plugin-test3</artifactId>
+  <artifactId>maven-changes-plugin-test3</artifactId>
   <version>99.0</version>
   <name>Module3</name>
   <packaging>jar</packaging>
diff --git a/src/main/java/org/apache/maven/plugin/announcement/AnnouncementMailMojo.java b/src/main/java/org/apache/maven/plugin/announcement/AnnouncementMailMojo.java
index ef457ff..8a7f226 100644
--- a/src/main/java/org/apache/maven/plugin/announcement/AnnouncementMailMojo.java
+++ b/src/main/java/org/apache/maven/plugin/announcement/AnnouncementMailMojo.java
@@ -265,27 +265,30 @@
             mailMsg.setContentType( this.mailContentType );
             mailMsg.setFrom( fromAddress, fromName );
 
-            for (Object o1 : getToAddresses()) {
+            for ( Object o1 : getToAddresses() )
+            {
                 email = o1.toString();
-                getLog().info("Sending mail to " + email + "...");
-                mailMsg.addTo(email, "");
+                getLog().info( "Sending mail to " + email + "..." );
+                mailMsg.addTo( email, "" );
             }
 
             if ( getCcAddresses() != null )
             {
-                for (Object o : getCcAddresses()) {
+                for ( Object o : getCcAddresses() )
+                {
                     email = o.toString();
-                    getLog().info("Sending cc mail to " + email + "...");
-                    mailMsg.addCc(email, "");
+                    getLog().info( "Sending cc mail to " + email + "..." );
+                    mailMsg.addCc( email, "" );
                 }
             }
 
             if ( getBccAddresses() != null )
             {
-                for (Object o : getBccAddresses()) {
+                for ( Object o : getBccAddresses() )
+                {
                     email = o.toString();
-                    getLog().info("Sending bcc mail to " + email + "...");
-                    mailMsg.addBcc(email, "");
+                    getLog().info( "Sending bcc mail to " + email + "..." );
+                    mailMsg.addBcc( email, "" );
                 }
             }
 
@@ -368,11 +371,13 @@
         }
         else
         {
-            for (Object aFrom : from) {
+            for ( Object aFrom : from )
+            {
                 Developer developer = (Developer) aFrom;
 
-                if (fromDeveloperId.equals(developer.getId())) {
-                    return new MailSender(developer.getName(), developer.getEmail());
+                if ( fromDeveloperId.equals( developer.getId() ) )
+                {
+                    return new MailSender( developer.getName(), developer.getEmail() );
                 }
             }
             throw new MojoExecutionException(
diff --git a/src/main/java/org/apache/maven/plugin/announcement/AnnouncementMojo.java b/src/main/java/org/apache/maven/plugin/announcement/AnnouncementMojo.java
index c28765c..7ecd876 100644
--- a/src/main/java/org/apache/maven/plugin/announcement/AnnouncementMojo.java
+++ b/src/main/java/org/apache/maven/plugin/announcement/AnnouncementMojo.java
@@ -395,18 +395,18 @@
 
     /**
      * The scheme of your github api domain. Only use if using github enterprise.
-     * 
+     *
      * @since 2.9
      */
-    @Parameter( defaultValue = "http", property = "changes.githubAPIScheme")
+    @Parameter( defaultValue = "http", property = "changes.githubAPIScheme" )
     private String githubAPIScheme;
 
     /**
      * The port of your github api domain. Only use if using github enterprise.
-     * 
+     *
      * @since 2.9
      */
-    @Parameter( defaultValue = "80", property = "changes.githubAPIPort")
+    @Parameter( defaultValue = "80", property = "changes.githubAPIPort" )
     private int githubAPIPort;
 
     private ReleaseUtils releaseUtils = new ReleaseUtils( getLog() );
@@ -454,7 +454,7 @@
                     issueManagementSystems.add( CHANGES_XML );
                 }
             }
-            
+
             // Fetch releases from the configured issue management systems
             List<Release> releases = null;
             if ( issueManagementSystems.contains( CHANGES_XML ) )
@@ -504,7 +504,8 @@
 
             if ( issueManagementSystems.contains( GIT_HUB ) )
             {
-                if ( ProjectUtils.validateIfIssueManagementComplete( project, GIT_HUB, "GitHub announcement", getLog() ) )
+                if ( ProjectUtils.validateIfIssueManagementComplete( project, GIT_HUB, "GitHub announcement",
+                                                                     getLog() ) )
                 {
                     List<Release> gitHubReleases = getGitHubReleases();
                     releases = releaseUtils.mergeReleases( releases, gitHubReleases );
@@ -513,7 +514,7 @@
                 else
                 {
                     throw new MojoExecutionException(
-                                                      "Something is wrong with the Issue Management section. See previous error messages." );
+                        "Something is wrong with the Issue Management section. See previous error messages." );
                 }
             }
 
@@ -550,8 +551,9 @@
     {
         String version = ( versionPrefix == null ? "" : versionPrefix ) + getVersion();
 
-        getLog().debug( "Generating announcement for version [" + version + "]. Found these releases: "
-                        + ReleaseUtils.toString( releases ) );
+        getLog().debug(
+            "Generating announcement for version [" + version + "]. Found these releases: " + ReleaseUtils.toString(
+                releases ) );
 
         doGenerate( releases, releaseUtils.getLatestRelease( releases, version ) );
     }
@@ -603,7 +605,6 @@
                 context.put( "announceParameters", announceParameters );
             }
 
-
             processTemplate( context, getOutputDirectory(), template, announcementFile );
         }
         catch ( ResourceNotFoundException rnfe )
@@ -619,9 +620,9 @@
     /**
      * Create the velocity template
      *
-     * @param context velocity context that has the parameter values
-     * @param outputDirectory directory where the file will be generated
-     * @param template velocity template which will the context be merged
+     * @param context          velocity context that has the parameter values
+     * @param outputDirectory  directory where the file will be generated
+     * @param template         velocity template which will the context be merged
      * @param announcementFile The file name of the generated announcement
      * @throws ResourceNotFoundException, VelocityException, IOException
      */
@@ -651,9 +652,8 @@
 
             if ( StringUtils.isEmpty( templateEncoding ) )
             {
-                templateEncoding =  ReaderFactory.FILE_ENCODING;
-                getLog().warn(
-                               "File encoding has not been set, using platform encoding " + templateEncoding
+                templateEncoding = ReaderFactory.FILE_ENCODING;
+                getLog().warn( "File encoding has not been set, using platform encoding " + templateEncoding
                                    + ", i.e. build is platform dependent!" );
             }
 
@@ -731,7 +731,7 @@
                 int originalNumberOfIssues = issueList.size();
                 issueList = IssueUtils.filterIssuesWithVersionPrefix( issueList, versionPrefix );
                 getLog().debug( "Filtered out " + issueList.size() + " issues of " + originalNumberOfIssues
-                    + " that matched the versionPrefix '" + versionPrefix + "'." );
+                                    + " that matched the versionPrefix '" + versionPrefix + "'." );
             }
 
             return getReleases( issueList, new JIRAIssueManagmentSystem() );
@@ -745,7 +745,7 @@
     private List<Release> getReleases( List<Issue> issues, IssueManagementSystem ims )
         throws MojoExecutionException
     {
-        if ( issueTypes != null ) 
+        if ( issueTypes != null )
         {
             ims.applyConfiguration( issueTypes );
         }
@@ -851,16 +851,16 @@
     {
         this.introduction = introduction;
     }
-    
+
     public void setIssueTypes( Map<String, String> issueTypes )
     {
-		this.issueTypes = issueTypes;
-	}
+        this.issueTypes = issueTypes;
+    }
 
     public Map<String, String> getIssueTypes()
     {
-		return issueTypes;
-	}
+        return issueTypes;
+    }
 
     public File getOutputDirectory()
     {
diff --git a/src/main/java/org/apache/maven/plugin/announcement/mailsender/ProjectJavamailMailSender.java b/src/main/java/org/apache/maven/plugin/announcement/mailsender/ProjectJavamailMailSender.java
index 78e3cc9..c0a8c6b 100644
--- a/src/main/java/org/apache/maven/plugin/announcement/mailsender/ProjectJavamailMailSender.java
+++ b/src/main/java/org/apache/maven/plugin/announcement/mailsender/ProjectJavamailMailSender.java
@@ -105,12 +105,13 @@
         }
         if ( userProperties != null )
         {
-            for (Object o : userProperties.keySet()) {
+            for ( Object o : userProperties.keySet() )
+            {
                 String key = (String) o;
 
-                String value = userProperties.getProperty(key);
+                String value = userProperties.getProperty( key );
 
-                props.put(key, value);
+                props.put( key, value );
             }
         }
     }
@@ -151,9 +152,10 @@
             {
                 InternetAddress[] addressTo = new InternetAddress[mail.getToAddresses().size()];
                 int count = 0;
-                for (Object o : mail.getToAddresses()) {
-                    String address = ((MailMessage.Address) o).getRfc2822Address();
-                    addressTo[count++] = new InternetAddress(address);
+                for ( Object o : mail.getToAddresses() )
+                {
+                    String address = ( (MailMessage.Address) o ).getRfc2822Address();
+                    addressTo[count++] = new InternetAddress( address );
                 }
                 msg.setRecipients( Message.RecipientType.TO, addressTo );
             }
@@ -162,9 +164,10 @@
             {
                 InternetAddress[] addressCc = new InternetAddress[mail.getCcAddresses().size()];
                 int count = 0;
-                for (Object o : mail.getCcAddresses()) {
-                    String address = ((MailMessage.Address) o).getRfc2822Address();
-                    addressCc[count++] = new InternetAddress(address);
+                for ( Object o : mail.getCcAddresses() )
+                {
+                    String address = ( (MailMessage.Address) o ).getRfc2822Address();
+                    addressCc[count++] = new InternetAddress( address );
                 }
                 msg.setRecipients( Message.RecipientType.CC, addressCc );
             }
@@ -173,9 +176,10 @@
             {
                 InternetAddress[] addressBcc = new InternetAddress[mail.getBccAddresses().size()];
                 int count = 0;
-                for (Object o : mail.getBccAddresses()) {
-                    String address = ((MailMessage.Address) o).getRfc2822Address();
-                    addressBcc[count++] = new InternetAddress(address);
+                for ( Object o : mail.getBccAddresses() )
+                {
+                    String address = ( (MailMessage.Address) o ).getRfc2822Address();
+                    addressBcc[count++] = new InternetAddress( address );
                 }
                 msg.setRecipients( Message.RecipientType.BCC, addressBcc );
             }
diff --git a/src/main/java/org/apache/maven/plugin/changes/AbstractChangesMojo.java b/src/main/java/org/apache/maven/plugin/changes/AbstractChangesMojo.java
index bc738d7..405e2c0 100644
--- a/src/main/java/org/apache/maven/plugin/changes/AbstractChangesMojo.java
+++ b/src/main/java/org/apache/maven/plugin/changes/AbstractChangesMojo.java
@@ -69,7 +69,7 @@
     {
         getLog().debug( "Root Folder:" + mavenSession.getExecutionRootDirectory() );
         getLog().debug( "Current Folder:" + basedir );
-        boolean result = mavenSession.getExecutionRootDirectory().equalsIgnoreCase(basedir);
+        boolean result = mavenSession.getExecutionRootDirectory().equalsIgnoreCase( basedir );
         if ( result )
         {
             getLog().debug( "This is the execution root." );
diff --git a/src/main/java/org/apache/maven/plugin/changes/ChangesCheckMojo.java b/src/main/java/org/apache/maven/plugin/changes/ChangesCheckMojo.java
index d02e4d1..0c5b45b 100644
--- a/src/main/java/org/apache/maven/plugin/changes/ChangesCheckMojo.java
+++ b/src/main/java/org/apache/maven/plugin/changes/ChangesCheckMojo.java
@@ -113,7 +113,7 @@
     /**
      * Use the pattern to try to parse a Date from the given string.
      *
-     * @param string A date as text
+     * @param string  A date as text
      * @param pattern A pattern that can be used by {@link SimpleDateFormat}
      * @return <code>true</code> if the string can be parsed as a date using the pattern, otherwise <code>false</code>
      */
diff --git a/src/main/java/org/apache/maven/plugin/changes/ChangesMojo.java b/src/main/java/org/apache/maven/plugin/changes/ChangesMojo.java
index 2404fe0..2e3a2f9 100644
--- a/src/main/java/org/apache/maven/plugin/changes/ChangesMojo.java
+++ b/src/main/java/org/apache/maven/plugin/changes/ChangesMojo.java
@@ -208,13 +208,13 @@
 
     /**
      * The type of the feed to generate.
-     *
+     * <p/>
      * <p>
      * Supported values are:
      * <code>"rss_0.9", "rss_0.91N" (RSS 0.91 Netscape), "rss_0.91U" (RSS 0.91 Userland),
      * "rss_0.92", "rss_0.93", "rss_0.94", "rss_1.0", "rss_2.0", "atom_0.3", "atom_1.0"</code>.
      * </p>
-     *
+     * <p/>
      * <p>If not specified, no feed is generated.</p>
      *
      * @since 2.9
@@ -245,13 +245,15 @@
         throws MavenReportException
     {
         Date now = new Date();
-        SimpleDateFormat simpleDateFormat =
-                new SimpleDateFormat(publishDateFormat, new Locale(publishDateLocale));
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat( publishDateFormat, new Locale( publishDateLocale ) );
         Properties additionalProperties = new Properties();
-        additionalProperties.put("publishDate", simpleDateFormat.format(now));
+        additionalProperties.put( "publishDate", simpleDateFormat.format( now ) );
 
-        ChangesXML changesXml = getChangesFromFile( xmlPath, project, additionalProperties);
-        if ( changesXml == null ) return;
+        ChangesXML changesXml = getChangesFromFile( xmlPath, project, additionalProperties );
+        if ( changesXml == null )
+        {
+            return;
+        }
 
         if ( aggregated )
         {
@@ -265,12 +267,15 @@
             final String relativePath = absolutePath.substring( basePath.length() );
 
             List releaseList = changesXml.getReleaseList();
-            for (Object o : project.getCollectedProjects()) {
+            for ( Object o : project.getCollectedProjects() )
+            {
                 final MavenProject childProject = (MavenProject) o;
-                final File changesFile = new File(childProject.getBasedir(), relativePath);
-                final ChangesXML childXml = getChangesFromFile(changesFile, childProject, additionalProperties);
-                if (childXml != null) {
-                    releaseList = releaseUtils.mergeReleases(releaseList, childProject.getName(), childXml.getReleaseList());
+                final File changesFile = new File( childProject.getBasedir(), relativePath );
+                final ChangesXML childXml = getChangesFromFile( changesFile, childProject, additionalProperties );
+                if ( childXml != null )
+                {
+                    releaseList =
+                        releaseUtils.mergeReleases( releaseList, childProject.getName(), childXml.getReleaseList() );
                 }
             }
             changesXml.setReleaseList( releaseList );
@@ -281,7 +286,7 @@
         report.setAuthor( changesXml.getAuthor() );
         report.setTitle( changesXml.getTitle() );
 
-        report.setEscapeHTML ( escapeHTML );
+        report.setEscapeHTML( escapeHTML );
 
         // Create a case insensitive version of issueLinkTemplatePerSystem
         // We need something case insensitive to maintain backward compatibility
@@ -321,7 +326,7 @@
 
         report.setSystem( system );
 
-        report.setTeamlist ( teamlist );
+        report.setTeamlist( teamlist );
 
         report.setUrl( url );
 
@@ -370,8 +375,8 @@
      * Parses specified changes.xml file. It also makes filtering if needed. If specified file doesn't exist
      * it will log warning and return <code>null</code>.
      *
-     * @param changesXml changes xml file to parse
-     * @param project maven project to parse changes for
+     * @param changesXml           changes xml file to parse
+     * @param project              maven project to parse changes for
      * @param additionalProperties additional properties used for filtering
      * @return parsed <code>ChangesXML</code> instance or null if file doesn't exist
      * @throws MavenReportException if any errors occurs while parsing
@@ -397,11 +402,12 @@
                 // so we get encoding from the file itself
                 xmlStreamReader = new XmlStreamReader( changesXml );
                 String encoding = xmlStreamReader.getEncoding();
-                File resultFile = new File( filteredOutputDirectory, project.getGroupId() + "." + project.getArtifactId() + "-changes.xml" );
+                File resultFile = new File( filteredOutputDirectory,
+                                            project.getGroupId() + "." + project.getArtifactId() + "-changes.xml" );
 
                 final MavenFileFilterRequest mavenFileFilterRequest =
-                        new MavenFileFilterRequest( changesXml, resultFile, true, project, Collections.EMPTY_LIST, false,
-                                encoding, session, additionalProperties );
+                    new MavenFileFilterRequest( changesXml, resultFile, true, project, Collections.EMPTY_LIST, false,
+                                                encoding, session, additionalProperties );
                 mavenFileFilter.copyFile( mavenFileFilterRequest );
                 changesXml = resultFile;
             }
@@ -429,7 +435,7 @@
      * Add the issue link template for the given issue management system,
      * but only if it has not already been configured.
      *
-     * @param system The issue management system
+     * @param system            The issue management system
      * @param issueLinkTemplate The issue link template to use
      * @since 2.4
      */
@@ -449,19 +455,16 @@
         throws MavenReportException
     {
         final String pluginResourcesBase = "org/apache/maven/plugin/changes";
-        String resourceNames[] = {
-            "images/add.gif",
-            "images/fix.gif",
-            "images/icon_help_sml.gif",
-            "images/remove.gif",
-            "images/rss.png",
-            "images/update.gif" };
+        String resourceNames[] =
+            { "images/add.gif", "images/fix.gif", "images/icon_help_sml.gif", "images/remove.gif", "images/rss.png",
+                "images/update.gif" };
         try
         {
             getLog().debug( "Copying static resources." );
-            for (String resourceName : resourceNames) {
-                URL url = this.getClass().getClassLoader().getResource(pluginResourcesBase + "/" + resourceName);
-                FileUtils.copyURLToFile(url, new File(getReportOutputDirectory(), resourceName));
+            for ( String resourceName : resourceNames )
+            {
+                URL url = this.getClass().getClassLoader().getResource( pluginResourcesBase + "/" + resourceName );
+                FileUtils.copyURLToFile( url, new File( getReportOutputDirectory(), resourceName ) );
             }
         }
         catch ( IOException e )
@@ -490,9 +493,10 @@
             }
             else
             {
-                for (Object o : issueLinkTemplatePerSystem.entrySet()) {
+                for ( Object o : issueLinkTemplatePerSystem.entrySet() )
+                {
                     Map.Entry entry = (Map.Entry) o;
-                    getLog().debug("issueLinkTemplatePerSystem[" + entry.getKey() + "] = " + entry.getValue());
+                    getLog().debug( "issueLinkTemplatePerSystem[" + entry.getKey() + "] = " + entry.getValue() );
                 }
             }
         }
diff --git a/src/main/java/org/apache/maven/plugin/changes/ChangesReportGenerator.java b/src/main/java/org/apache/maven/plugin/changes/ChangesReportGenerator.java
index 78a53ce..7bdfb04 100644
--- a/src/main/java/org/apache/maven/plugin/changes/ChangesReportGenerator.java
+++ b/src/main/java/org/apache/maven/plugin/changes/ChangesReportGenerator.java
@@ -42,7 +42,8 @@
  *
  * @version $Id$
  */
-public class ChangesReportGenerator extends AbstractIssuesReportGenerator
+public class ChangesReportGenerator
+    extends AbstractIssuesReportGenerator
 {
 
     /**
@@ -205,7 +206,7 @@
         }
 
         // If the %URL% token is used then the issue management system URL must be set.
-        if (issueLink.contains(URL_TOKEN) && StringUtils.isBlank( getUrl() ) )
+        if ( issueLink.contains( URL_TOKEN ) && StringUtils.isBlank( getUrl() ) )
         {
             return false;
         }
@@ -225,9 +226,9 @@
     {
         sinkBeginReport( sink, bundle );
 
-        constructReleaseHistory(sink, bundle, releaseList);
+        constructReleaseHistory( sink, bundle, releaseList );
 
-        constructReleases(sink, bundle, releaseList);
+        constructReleases( sink, bundle, releaseList );
 
         sinkEndReport( sink );
     }
@@ -235,7 +236,7 @@
     /**
      * Constructs table row for specified action with all calculated content (e.g. issue link).
      *
-     * @param sink Sink
+     * @param sink   Sink
      * @param bundle Resource bundle
      * @param action Action to generate content for
      */
@@ -243,7 +244,7 @@
     {
         sink.tableRow();
 
-        sinkShowTypeIcon(sink, action.getType());
+        sinkShowTypeIcon( sink, action.getType() );
 
         sink.tableCell();
 
@@ -311,7 +312,7 @@
     /**
      * Construct a text or link that mention the people that helped with an action.
      *
-     * @param sink The sink
+     * @param sink   The sink
      * @param action The action that was done
      * @param bundle A resource bundle for i18n
      * @param dueTos Other people that helped with an action
@@ -320,17 +321,18 @@
     {
 
         // Create a Map with key : dueTo name, value : dueTo email
-        Map<String,String> namesEmailMap = new LinkedHashMap<String,String>();
+        Map<String, String> namesEmailMap = new LinkedHashMap<String, String>();
 
         // Only add the dueTo specified as attributes, if it has either a dueTo or a dueToEmail
         if ( StringUtils.isNotEmpty( action.getDueTo() ) || StringUtils.isNotEmpty( action.getDueToEmail() ) )
         {
-            namesEmailMap.put(action.getDueTo(), action.getDueToEmail());
+            namesEmailMap.put( action.getDueTo(), action.getDueToEmail() );
         }
 
-        for (Object dueTo1 : dueTos) {
+        for ( Object dueTo1 : dueTos )
+        {
             DueTo dueTo = (DueTo) dueTo1;
-            namesEmailMap.put(dueTo.getName(), dueTo.getEmail());
+            namesEmailMap.put( dueTo.getName(), dueTo.getEmail() );
         }
 
         if ( namesEmailMap.isEmpty() )
@@ -360,16 +362,16 @@
             }
         }
 
-        sink.text(".");
+        sink.text( "." );
     }
 
     /**
      * Construct links to the issues that were solved by an action.
      *
-     * @param issue The issue specified by attributes
+     * @param issue  The issue specified by attributes
      * @param system The issue management system
-     * @param sink The sink
-     * @param fixes The List of issues specified as fixes elements
+     * @param sink   The sink
+     * @param fixes  The List of issues specified as fixes elements
      */
     private void constructIssueLink( String issue, String system, Sink sink, List fixes )
     {
@@ -412,14 +414,14 @@
      * were solved by an action.
      *
      * @param issue The issue specified by attributes
-     * @param sink The sink
+     * @param sink  The sink
      * @param fixes The List of issues specified as fixes elements
      */
     private void constructIssueText( String issue, Sink sink, List fixes )
     {
         if ( StringUtils.isNotEmpty( issue ) )
         {
-            sink.text(issue);
+            sink.text( issue );
 
             if ( !fixes.isEmpty() )
             {
@@ -434,7 +436,7 @@
             String currentIssueId = fixedIssue.getIssue();
             if ( StringUtils.isNotEmpty( currentIssueId ) )
             {
-                sink.text(currentIssueId);
+                sink.text( currentIssueId );
             }
 
             if ( iterator.hasNext() )
@@ -463,16 +465,17 @@
 
         sink.tableRow_();
 
-        for (Object aReleaseList : releaseList) {
+        for ( Object aReleaseList : releaseList )
+        {
             Release release = (Release) aReleaseList;
 
             sink.tableRow();
 
-            sinkCellLink(sink, release.getVersion(), "#" + HtmlTools.encodeId(release.getVersion()));
+            sinkCellLink( sink, release.getVersion(), "#" + HtmlTools.encodeId( release.getVersion() ) );
 
-            sinkCell(sink, release.getDateRelease());
+            sinkCell( sink, release.getDateRelease() );
 
-            sinkCell(sink, release.getDescription());
+            sinkCell( sink, release.getDescription() );
 
             sink.tableRow_();
         }
@@ -497,23 +500,24 @@
     /**
      * Constructs document sections for each of specified releases.
      *
-     * @param sink Sink
-     * @param bundle Resource bundle
+     * @param sink        Sink
+     * @param bundle      Resource bundle
      * @param releaseList Releases to create content for
      */
     private void constructReleases( Sink sink, ResourceBundle bundle, List releaseList )
     {
-        for (Object aReleaseList : releaseList) {
+        for ( Object aReleaseList : releaseList )
+        {
             Release release = (Release) aReleaseList;
-            constructRelease(sink, bundle, release);
+            constructRelease( sink, bundle, release );
         }
     }
 
     /**
      * Constructs document section for specified release.
      *
-     * @param sink Sink
-     * @param bundle Resource bundle
+     * @param sink    Sink
+     * @param bundle  Resource bundle
      * @param release Release to create document section for
      */
     private void constructRelease( Sink sink, ResourceBundle bundle, Release release )
@@ -522,13 +526,14 @@
 
         final String date = ( release.getDateRelease() == null ) ? "" : " - " + release.getDateRelease();
 
-        sinkSectionTitle2Anchor(sink, bundle.getString("report.changes.label.release") + " "
-                + release.getVersion() + date, release.getVersion());
+        sinkSectionTitle2Anchor( sink,
+                                 bundle.getString( "report.changes.label.release" ) + " " + release.getVersion() + date,
+                                 release.getVersion() );
 
         if ( isReleaseEmpty( release ) )
         {
             sink.paragraph();
-            sink.text( bundle.getString("report.changes.text.no.changes") );
+            sink.text( bundle.getString( "report.changes.text.no.changes" ) );
             sink.paragraph_();
         }
         else
@@ -538,20 +543,22 @@
             sink.tableRow();
             sinkHeader( sink, bundle.getString( "report.issues.label.type" ) );
             sinkHeader( sink, bundle.getString( "report.issues.label.summary" ) );
-            sinkHeader(sink, bundle.getString("report.issues.label.assignee"));
+            sinkHeader( sink, bundle.getString( "report.issues.label.assignee" ) );
             if ( this.isAddActionDate() )
             {
                 sinkHeader( sink, bundle.getString( "report.issues.label.updated" ) );
             }
             sink.tableRow_();
 
-            for (Action action : release.getActions()) {
-                constructAction(sink, bundle, action);
+            for ( Action action : release.getActions() )
+            {
+                constructAction( sink, bundle, action );
             }
 
-            for (Object o : release.getComponents()) {
+            for ( Object o : release.getComponents() )
+            {
                 Component component = (Component) o;
-                constructComponent(sink, bundle, component);
+                constructComponent( sink, bundle, component );
             }
 
             sink.table_();
@@ -564,8 +571,8 @@
      * Constructs table rows for specified release component. It will create header row for
      * component name and action rows for all component issues.
      *
-     * @param sink Sink
-     * @param bundle Resource bundle
+     * @param sink      Sink
+     * @param bundle    Resource bundle
      * @param component Release component to generate content for.
      */
     private void constructComponent( Sink sink, ResourceBundle bundle, Component component )
@@ -578,7 +585,7 @@
             sink.tableHeaderCell_();
 
             sink.tableHeaderCell();
-            sink.text(component.getName());
+            sink.text( component.getName() );
             sink.tableHeaderCell_();
 
             sink.tableHeaderCell();
@@ -592,8 +599,9 @@
 
             sink.tableRow_();
 
-            for (Action action : component.getActions()) {
-                constructAction(sink, bundle, action);
+            for ( Action action : component.getActions() )
+            {
+                constructAction( sink, bundle, action );
             }
         }
     }
@@ -604,15 +612,18 @@
      * @param release Release to check
      * @return <code>true</code> if release doesn't contain any issues, <code>false</code> otherwise
      */
-    private boolean isReleaseEmpty( Release release ) {
+    private boolean isReleaseEmpty( Release release )
+    {
         if ( !release.getActions().isEmpty() )
         {
             return false;
         }
 
-        for (Object o : release.getComponents()) {
+        for ( Object o : release.getComponents() )
+        {
             Component component = (Component) o;
-            if (!component.getActions().isEmpty()) {
+            if ( !component.getActions().isEmpty() )
+            {
                 return false;
             }
         }
@@ -623,7 +634,7 @@
     /**
      * Replace tokens in the issue link template with the real values.
      *
-     * @param issue The issue identifier
+     * @param issue  The issue identifier
      * @param system The issue management system
      * @return An interpolated issue link
      */
@@ -632,7 +643,7 @@
         String parseLink;
         String issueLink = (String) this.issueLinksPerSystem.get( system );
         parseLink = issueLink.replaceFirst( ISSUE_TOKEN, issue );
-        if (parseLink.contains(URL_TOKEN))
+        if ( parseLink.contains( URL_TOKEN ) )
         {
             String url = this.url.substring( 0, this.url.lastIndexOf( "/" ) );
             parseLink = parseLink.replaceFirst( URL_TOKEN, url );
diff --git a/src/main/java/org/apache/maven/plugin/changes/IssueAdapter.java b/src/main/java/org/apache/maven/plugin/changes/IssueAdapter.java
index c8042ec..1601e91 100644
--- a/src/main/java/org/apache/maven/plugin/changes/IssueAdapter.java
+++ b/src/main/java/org/apache/maven/plugin/changes/IssueAdapter.java
@@ -32,7 +32,7 @@
 /**
  * An adapter that can adapt data models from other issue management system to the data models used in the changes.xml
  * file.
- * 
+ *
  * @author Dennis Lundberg
  * @version $Id$
  * @since 2.4
@@ -40,6 +40,7 @@
 public class IssueAdapter
 {
     private static final String UNKNOWN_ISSUE_TYPE = "";
+
     private IssueManagementSystem ims;
 
     /**
@@ -59,7 +60,7 @@
 
     /**
      * Adapt a <code>List</code> of <code>Issue</code>s to a <code>List</code> of <code>Release</code>s.
-     * 
+     *
      * @param issues The issues
      * @return A list of releases
      */
@@ -104,7 +105,7 @@
 
     /**
      * Create an <code>Action</code> from an issue.
-     * 
+     *
      * @param issue The issue to extract the information from
      * @return An <code>Action</code>
      */
diff --git a/src/main/java/org/apache/maven/plugin/changes/ReleaseUtils.java b/src/main/java/org/apache/maven/plugin/changes/ReleaseUtils.java
index 7b1aa77..087806d 100644
--- a/src/main/java/org/apache/maven/plugin/changes/ReleaseUtils.java
+++ b/src/main/java/org/apache/maven/plugin/changes/ReleaseUtils.java
@@ -51,10 +51,11 @@
      * Get the latest release by matching the supplied releases
      * with the version from the pom.
      *
-     * @param releases list of releases
+     * @param releases   list of releases
      * @param pomVersion Version of the artifact
      * @return A <code>Release</code> that matches the next release of the current project
-     * @throws org.apache.maven.plugin.MojoExecutionException If a release can't be found
+     * @throws org.apache.maven.plugin.MojoExecutionException
+     *          If a release can't be found
      */
     public Release getLatestRelease( List<Release> releases, String pomVersion )
         throws MojoExecutionException
@@ -70,8 +71,8 @@
 
         if ( release == null )
         {
-            throw new MojoExecutionException( "Couldn't find the release '" + pomVersion
-                + "' among the supplied releases: " + toString( releases ) );
+            throw new MojoExecutionException(
+                "Couldn't find the release '" + pomVersion + "' among the supplied releases: " + toString( releases ) );
         }
 
         return release;
@@ -86,7 +87,7 @@
      * Get a release with the specified version from the list of releases.
      *
      * @param releases A list of releases
-     * @param version The version we want
+     * @param version  The version we want
      * @return A Release, or null if no release with the specified version can be found
      */
     protected Release getRelease( List<Release> releases, String version )
@@ -95,8 +96,8 @@
         {
             if ( getLog().isDebugEnabled() )
             {
-                getLog().debug( "The release: " + release.getVersion()
-                    + " has " + release.getActions().size() + " actions." );
+                getLog().debug(
+                    "The release: " + release.getVersion() + " has " + release.getActions().size() + " actions." );
             }
 
             if ( release.getVersion() != null && release.getVersion().equals( version ) )
@@ -115,12 +116,13 @@
     protected void logRelease( Release release )
     {
         Action action;
-        for (Action action1 : release.getActions()) {
+        for ( Action action1 : release.getActions() )
+        {
             action = action1;
-            getLog().debug("o " + action.getType());
-            getLog().debug("issue : " + action.getIssue());
-            getLog().debug("action : " + action.getAction());
-            getLog().debug("dueTo : " + action.getDueTo());
+            getLog().debug( "o " + action.getType() );
+            getLog().debug( "issue : " + action.getIssue() );
+            getLog().debug( "action : " + action.getAction() );
+            getLog().debug( "dueTo : " + action.getDueTo() );
         }
     }
 
@@ -129,7 +131,7 @@
      * tracker. If a release is found in both issue trackers, i.e. they have
      * the same version, their issues are merged into one release.
      *
-     * @param firstReleases Releases from the first issue tracker
+     * @param firstReleases  Releases from the first issue tracker
      * @param secondReleases Releases from the second issue tracker
      * @return A list containing the merged releases
      */
@@ -186,14 +188,16 @@
      * @return A type List of Release objects
      * @todo When Modello can generate typed collections this method is no longer needed
      */
-    public List<Release> convertReleaseList( List changesReleases ) {
+    public List<Release> convertReleaseList( List changesReleases )
+    {
         List<Release> releases = new ArrayList<Release>();
 
         // Loop through the List of releases from changes.xml and casting each
         // release to a Release
-        for (Object changesRelease : changesReleases) {
+        for ( Object changesRelease : changesReleases )
+        {
             Release release = (Release) changesRelease;
-            releases.add(release);
+            releases.add( release );
         }
         return releases;
     }
@@ -204,12 +208,13 @@
      * their issues are merged into one (parent) release with component marker
      * for component issues.
      *
-     * @param releases Releases from the parent component
-     * @param componentName child component name (retrieved from project name)
+     * @param releases          Releases from the parent component
+     * @param componentName     child component name (retrieved from project name)
      * @param componentReleases Releases from the child component
      * @return A list containing the merged releases
      */
-    public List mergeReleases( final List releases, final String componentName, final List componentReleases ) {
+    public List mergeReleases( final List releases, final String componentName, final List componentReleases )
+    {
         if ( releases == null && componentReleases == null )
         {
             return Collections.EMPTY_LIST;
@@ -223,43 +228,47 @@
 
         if ( releases != null )
         {
-            for (Object release1 : releases) {
+            for ( Object release1 : releases )
+            {
                 final Release release = (Release) release1;
-                final Release componentRelease = getRelease(componentReleases, release.getVersion());
-                if (componentRelease != null) {
-                    release.addComponent(componentName, componentRelease);
+                final Release componentRelease = getRelease( componentReleases, release.getVersion() );
+                if ( componentRelease != null )
+                {
+                    release.addComponent( componentName, componentRelease );
                 }
-                mergedReleases.add(release);
+                mergedReleases.add( release );
             }
         }
 
-        for (Object componentRelease1 : componentReleases) {
+        for ( Object componentRelease1 : componentReleases )
+        {
             final Release release = (Release) componentRelease1;
-            final Release mergedRelease = getRelease(mergedReleases, release.getVersion());
-            if (mergedRelease == null) {
+            final Release mergedRelease = getRelease( mergedReleases, release.getVersion() );
+            if ( mergedRelease == null )
+            {
                 final Release componentRelease = new Release();
-                componentRelease.setVersion(release.getVersion());
-                componentRelease.setDateRelease(release.getDateRelease());
-                componentRelease.addComponent(componentName, release);
-                mergedReleases.add(componentRelease);
+                componentRelease.setVersion( release.getVersion() );
+                componentRelease.setDateRelease( release.getDateRelease() );
+                componentRelease.addComponent( componentName, release );
+                mergedReleases.add( componentRelease );
             }
         }
 
         return mergedReleases;
     }
 
-    private static String toString(Release release) {
-        return release.getClass().getSimpleName()
-                + "[version='" + release.getVersion() + "'"
-                + ", date='" + release.getDateRelease() + "'"
-                + ", description='" + release.getDescription() + "'"
-                + ", actionsSize=" + release.getActions().size()
-                + "]";
+    private static String toString( Release release )
+    {
+        return release.getClass().getSimpleName() + "[version='" + release.getVersion() + "'" + ", date='"
+            + release.getDateRelease() + "'" + ", description='" + release.getDescription() + "'" + ", actionsSize="
+            + release.getActions().size() + "]";
     }
 
-    public static String toString( List<Release> releases ) {
+    public static String toString( List<Release> releases )
+    {
         List<String> releaseStrings = new ArrayList<String>( releases.size() );
-        for ( Release release : releases ) {
+        for ( Release release : releases )
+        {
             releaseStrings.add( toString( release ) );
         }
         return releaseStrings.toString();
diff --git a/src/main/java/org/apache/maven/plugin/github/GitHubMojo.java b/src/main/java/org/apache/maven/plugin/github/GitHubMojo.java
index 4a0b604..ed2716c 100644
--- a/src/main/java/org/apache/maven/plugin/github/GitHubMojo.java
+++ b/src/main/java/org/apache/maven/plugin/github/GitHubMojo.java
@@ -43,7 +43,7 @@
  * @author Bryan Baugher
  * @since 2.8
  */
-@Mojo (name = "github-report", threadSafe = true)
+@Mojo( name = "github-report", threadSafe = true )
 public class GitHubMojo
     extends AbstractChangesReport
 {
@@ -55,15 +55,15 @@
 
     static
     {
-        GITHUB_COLUMNS.put( "Assignee", IssuesReportHelper.COLUMN_ASSIGNEE);
-        GITHUB_COLUMNS.put( "Created", IssuesReportHelper.COLUMN_CREATED);
-        GITHUB_COLUMNS.put( "Fix Version", IssuesReportHelper.COLUMN_FIX_VERSION);
-        GITHUB_COLUMNS.put( "Id", IssuesReportHelper.COLUMN_ID);
-        GITHUB_COLUMNS.put( "Reporter", IssuesReportHelper.COLUMN_REPORTER);
-        GITHUB_COLUMNS.put( "Status", IssuesReportHelper.COLUMN_STATUS);
-        GITHUB_COLUMNS.put( "Summary", IssuesReportHelper.COLUMN_SUMMARY);
-        GITHUB_COLUMNS.put( "Type", IssuesReportHelper.COLUMN_TYPE);
-        GITHUB_COLUMNS.put( "Updated", IssuesReportHelper.COLUMN_UPDATED);
+        GITHUB_COLUMNS.put( "Assignee", IssuesReportHelper.COLUMN_ASSIGNEE );
+        GITHUB_COLUMNS.put( "Created", IssuesReportHelper.COLUMN_CREATED );
+        GITHUB_COLUMNS.put( "Fix Version", IssuesReportHelper.COLUMN_FIX_VERSION );
+        GITHUB_COLUMNS.put( "Id", IssuesReportHelper.COLUMN_ID );
+        GITHUB_COLUMNS.put( "Reporter", IssuesReportHelper.COLUMN_REPORTER );
+        GITHUB_COLUMNS.put( "Status", IssuesReportHelper.COLUMN_STATUS );
+        GITHUB_COLUMNS.put( "Summary", IssuesReportHelper.COLUMN_SUMMARY );
+        GITHUB_COLUMNS.put( "Type", IssuesReportHelper.COLUMN_TYPE );
+        GITHUB_COLUMNS.put( "Updated", IssuesReportHelper.COLUMN_UPDATED );
     }
 
     /**
@@ -77,31 +77,31 @@
      * <code>Updated</code>.
      * </p>
      */
-    @Parameter (defaultValue = "Id,Type,Summary,Assignee,Reporter,Status,Created,Updated,Fix Version")
+    @Parameter( defaultValue = "Id,Type,Summary,Assignee,Reporter,Status,Created,Updated,Fix Version" )
     private String columnNames;
 
     /**
      * The scheme of your github api domain. Only use if using github enterprise.
      */
-    @Parameter (defaultValue = "http")
+    @Parameter( defaultValue = "http" )
     private String githubAPIScheme;
 
     /**
      * The port of your github api domain. Only use if using github enterprise.
      */
-    @Parameter (defaultValue = "80")
+    @Parameter( defaultValue = "80" )
     private int githubAPIPort;
 
     /**
      * Boolean which says if we should include open issues in the report.
      */
-    @Parameter (defaultValue = "true")
+    @Parameter( defaultValue = "true" )
     private boolean includeOpenIssues;
 
     /**
      * Boolean which says if we should include only issues with milestones.
      */
-    @Parameter (defaultValue = "true")
+    @Parameter( defaultValue = "true" )
     private boolean onlyMilestoneIssues;
 
     /**
@@ -109,7 +109,7 @@
      * The current version being used is <code>${project.version}</code> minus
      * any "-SNAPSHOT" suffix.
      */
-    @Parameter (defaultValue = "false")
+    @Parameter( defaultValue = "false" )
     private boolean onlyCurrentVersion;
 
     public String getOutputName()
diff --git a/src/main/java/org/apache/maven/plugin/issues/IssueUtils.java b/src/main/java/org/apache/maven/plugin/issues/IssueUtils.java
index 1df73c8..1ddfbcd 100644
--- a/src/main/java/org/apache/maven/plugin/issues/IssueUtils.java
+++ b/src/main/java/org/apache/maven/plugin/issues/IssueUtils.java
@@ -51,14 +51,18 @@
         boolean isFound = false;
         Issue issue;
 
-        for (Issue issue1 : issues) {
+        for ( Issue issue1 : issues )
+        {
             issue = issue1;
 
-            if (issue.getFixVersions() != null) {
-                for (String fixVersion : issue.getFixVersions()) {
-                    if (prefix == null || fixVersion.startsWith(prefix)) {
+            if ( issue.getFixVersions() != null )
+            {
+                for ( String fixVersion : issue.getFixVersions() )
+                {
+                    if ( prefix == null || fixVersion.startsWith( prefix ) )
+                    {
                         isFound = true;
-                        filteredIssues.add(issue);
+                        filteredIssues.add( issue );
                         break;
                     }
                 }
@@ -68,7 +72,8 @@
         if ( !isFound )
         {
             throw new MojoExecutionException(
-                "Couldn't find any issues with a Fix Version prefix of '" + prefix + "' among the supplied issues: "  + toString( issues ) );
+                "Couldn't find any issues with a Fix Version prefix of '" + prefix + "' among the supplied issues: "
+                    + toString( issues ) );
         }
         return filteredIssues;
     }
@@ -79,7 +84,7 @@
      * If the supplied version is a SNAPSHOT, then that part of the version
      * will be removed prior to the matching.
      *
-     * @param issues A list of issues
+     * @param issues  A list of issues
      * @param version The version that issues should be returned for
      * @return A <code>List</code> of issues for the supplied version
      * @throws org.apache.maven.plugin.MojoExecutionException
@@ -99,26 +104,31 @@
             releaseVersion = version.substring( 0, version.length() - SNAPSHOT_SUFFIX.length() );
         }
 
-        for (Issue issue1 : issues) {
+        for ( Issue issue1 : issues )
+        {
             issue = issue1;
 
-            if (issue.getFixVersions() != null && issue.getFixVersions().contains(releaseVersion)) {
+            if ( issue.getFixVersions() != null && issue.getFixVersions().contains( releaseVersion ) )
+            {
                 isFound = true;
-                issuesForVersion.add(issue);
+                issuesForVersion.add( issue );
             }
         }
 
         if ( !isFound )
         {
             throw new MojoExecutionException(
-                "Couldn't find any issues for the version '" + releaseVersion + "' among the supplied issues: " + toString( issues ) );
+                "Couldn't find any issues for the version '" + releaseVersion + "' among the supplied issues: "
+                    + toString( issues ) );
         }
         return issuesForVersion;
     }
 
-    public static String toString( List<Issue> issues ) {
+    public static String toString( List<Issue> issues )
+    {
         List<String> issueStrings = new ArrayList<String>( issues.size() );
-        for ( Issue issue : issues ) {
+        for ( Issue issue : issues )
+        {
             issueStrings.add( issue.toString() );
         }
         return issueStrings.toString();
diff --git a/src/main/java/org/apache/maven/plugin/issues/IssuesReportGenerator.java b/src/main/java/org/apache/maven/plugin/issues/IssuesReportGenerator.java
index 4ed7ccd..fae6c4f 100644
--- a/src/main/java/org/apache/maven/plugin/issues/IssuesReportGenerator.java
+++ b/src/main/java/org/apache/maven/plugin/issues/IssuesReportGenerator.java
@@ -34,7 +34,8 @@
  * @version $Id$
  * @since 2.4
  */
-public class IssuesReportGenerator extends AbstractIssuesReportGenerator
+public class IssuesReportGenerator
+    extends AbstractIssuesReportGenerator
 {
     /**
      * Fallback value that is used if date field are not available.
@@ -93,62 +94,64 @@
 
         sink.tableRow();
 
-        for (int column : columns) {
-            switch (column) {
+        for ( int column : columns )
+        {
+            switch ( column )
+            {
                 case IssuesReportHelper.COLUMN_ASSIGNEE:
-                    sinkHeader(sink, bundle.getString("report.issues.label.assignee"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.assignee" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_COMPONENT:
-                    sinkHeader(sink, bundle.getString("report.issues.label.component"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.component" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_CREATED:
-                    sinkHeader(sink, bundle.getString("report.issues.label.created"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.created" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_FIX_VERSION:
-                    sinkHeader(sink, bundle.getString("report.issues.label.fixVersion"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.fixVersion" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_ID:
-                    sinkHeader(sink, bundle.getString("report.issues.label.id"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.id" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_KEY:
-                    sinkHeader(sink, bundle.getString("report.issues.label.key"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.key" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_PRIORITY:
-                    sinkHeader(sink, bundle.getString("report.issues.label.priority"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.priority" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_REPORTER:
-                    sinkHeader(sink, bundle.getString("report.issues.label.reporter"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.reporter" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_RESOLUTION:
-                    sinkHeader(sink, bundle.getString("report.issues.label.resolution"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.resolution" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_STATUS:
-                    sinkHeader(sink, bundle.getString("report.issues.label.status"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.status" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_SUMMARY:
-                    sinkHeader(sink, bundle.getString("report.issues.label.summary"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.summary" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_TYPE:
-                    sinkHeader(sink, bundle.getString("report.issues.label.type"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.type" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_UPDATED:
-                    sinkHeader(sink, bundle.getString("report.issues.label.updated"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.updated" ) );
                     break;
 
                 case IssuesReportHelper.COLUMN_VERSION:
-                    sinkHeader(sink, bundle.getString("report.issues.label.version"));
+                    sinkHeader( sink, bundle.getString( "report.issues.label.version" ) );
                     break;
 
                 default:
@@ -167,86 +170,91 @@
             return;
         }
 
-        for (Object anIssueList : issueList) {
+        for ( Object anIssueList : issueList )
+        {
             // Use a DateFormat based on the Locale
-            DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
+            DateFormat df = DateFormat.getDateInstance( DateFormat.SHORT, locale );
 
             Issue issue = (Issue) anIssueList;
 
             sink.tableRow();
 
-            for (int column : columns) {
-                switch (column) {
+            for ( int column : columns )
+            {
+                switch ( column )
+                {
                     case IssuesReportHelper.COLUMN_ASSIGNEE:
-                        sinkCell(sink, issue.getAssignee());
+                        sinkCell( sink, issue.getAssignee() );
                         break;
 
                     case IssuesReportHelper.COLUMN_COMPONENT:
-                        sinkCell(sink, IssuesReportHelper.printValues(issue.getComponents()));
+                        sinkCell( sink, IssuesReportHelper.printValues( issue.getComponents() ) );
                         break;
 
                     case IssuesReportHelper.COLUMN_CREATED:
                         String created = NOT_AVAILABLE;
-                        if (issue.getCreated() != null) {
-                            created = df.format(issue.getCreated());
+                        if ( issue.getCreated() != null )
+                        {
+                            created = df.format( issue.getCreated() );
                         }
-                        sinkCell(sink, created);
+                        sinkCell( sink, created );
                         break;
 
                     case IssuesReportHelper.COLUMN_FIX_VERSION:
-                        sinkCell(sink, IssuesReportHelper.printValues(issue.getFixVersions()));
+                        sinkCell( sink, IssuesReportHelper.printValues( issue.getFixVersions() ) );
                         break;
 
                     case IssuesReportHelper.COLUMN_ID:
                         sink.tableCell();
-                        sink.link(issue.getLink());
-                        sink.text(issue.getId());
+                        sink.link( issue.getLink() );
+                        sink.text( issue.getId() );
                         sink.link_();
                         sink.tableCell_();
                         break;
 
                     case IssuesReportHelper.COLUMN_KEY:
                         sink.tableCell();
-                        sink.link(issue.getLink());
-                        sink.text(issue.getKey());
+                        sink.link( issue.getLink() );
+                        sink.text( issue.getKey() );
                         sink.link_();
                         sink.tableCell_();
                         break;
 
                     case IssuesReportHelper.COLUMN_PRIORITY:
-                        sinkCell(sink, issue.getPriority());
+                        sinkCell( sink, issue.getPriority() );
                         break;
 
                     case IssuesReportHelper.COLUMN_REPORTER:
-                        sinkCell(sink, issue.getReporter());
+                        sinkCell( sink, issue.getReporter() );
                         break;
 
                     case IssuesReportHelper.COLUMN_RESOLUTION:
-                        sinkCell(sink, issue.getResolution());
+                        sinkCell( sink, issue.getResolution() );
                         break;
 
                     case IssuesReportHelper.COLUMN_STATUS:
-                        sinkCell(sink, issue.getStatus());
+                        sinkCell( sink, issue.getStatus() );
                         break;
 
                     case IssuesReportHelper.COLUMN_SUMMARY:
-                        sinkCell(sink, issue.getSummary());
+                        sinkCell( sink, issue.getSummary() );
                         break;
 
                     case IssuesReportHelper.COLUMN_TYPE:
-                        sinkCell(sink, issue.getType());
+                        sinkCell( sink, issue.getType() );
                         break;
 
                     case IssuesReportHelper.COLUMN_UPDATED:
                         String updated = NOT_AVAILABLE;
-                        if (issue.getUpdated() != null) {
-                            updated = df.format(issue.getUpdated());
+                        if ( issue.getUpdated() != null )
+                        {
+                            updated = df.format( issue.getUpdated() );
                         }
-                        sinkCell(sink, updated);
+                        sinkCell( sink, updated );
                         break;
 
                     case IssuesReportHelper.COLUMN_VERSION:
-                        sinkCell(sink, issue.getVersion());
+                        sinkCell( sink, issue.getVersion() );
                         break;
 
                     default:
diff --git a/src/main/java/org/apache/maven/plugin/issues/IssuesReportHelper.java b/src/main/java/org/apache/maven/plugin/issues/IssuesReportHelper.java
index df68617..382e129 100644
--- a/src/main/java/org/apache/maven/plugin/issues/IssuesReportHelper.java
+++ b/src/main/java/org/apache/maven/plugin/issues/IssuesReportHelper.java
@@ -68,10 +68,10 @@
      * Get a list of id:s for the columns that are to be included in the report.
      *
      * @param columnNames The names of the columns
-     * @param allColumns A mapping from column name to column id
+     * @param allColumns  A mapping from column name to column id
      * @return A List of column id:s
      */
-    public static List<Integer> getColumnIds( String columnNames, Map<String,Integer> allColumns )
+    public static List<Integer> getColumnIds( String columnNames, Map<String, Integer> allColumns )
     {
         return getColumnIds( columnNames, allColumns, null, null );
     }
@@ -82,14 +82,14 @@
      * If deprecated column names are used they generate a warning, indicating
      * the replacement column name.
      *
-     * @param columnNames The names of the columns
-     * @param allColumns A mapping from column name to column id
+     * @param columnNames       The names of the columns
+     * @param allColumns        A mapping from column name to column id
      * @param deprecatedColumns A mapping from deprecated column name to column id
-     * @param log A log
+     * @param log               A log
      * @return A List of column id:s
      */
-    public static List<Integer> getColumnIds( String columnNames, Map<String,Integer> allColumns,
-                                              Map<String,Integer> deprecatedColumns, Log log )
+    public static List<Integer> getColumnIds( String columnNames, Map<String, Integer> allColumns,
+                                              Map<String, Integer> deprecatedColumns, Log log )
     {
         DualHashBidiMap bidiColumns = null;
         List<Integer> columnIds = new ArrayList<Integer>();
@@ -101,16 +101,22 @@
         }
 
         // Loop through the names of the columns, to validate each of them and add their id to the list
-        for (String aColumnNamesArray : columnNamesArray) {
+        for ( String aColumnNamesArray : columnNamesArray )
+        {
             String columnName = aColumnNamesArray.trim();
-            if (allColumns.containsKey(columnName)) {
-                columnIds.add(allColumns.get(columnName));
-            } else if (deprecatedColumns != null && deprecatedColumns.containsKey(columnName)) {
-                Integer columnId = deprecatedColumns.get(columnName);
-                columnIds.add(columnId);
-                if (log != null) {
-                    log.warn("The columnName '" + columnName + "' has been deprecated." + " Please use "
-                            + "the columnName '" + bidiColumns.getKey(columnId) + "' instead.");
+            if ( allColumns.containsKey( columnName ) )
+            {
+                columnIds.add( allColumns.get( columnName ) );
+            }
+            else if ( deprecatedColumns != null && deprecatedColumns.containsKey( columnName ) )
+            {
+                Integer columnId = deprecatedColumns.get( columnName );
+                columnIds.add( columnId );
+                if ( log != null )
+                {
+                    log.warn(
+                        "The columnName '" + columnName + "' has been deprecated." + " Please use " + "the columnName '"
+                            + bidiColumns.getKey( columnId ) + "' instead." );
                 }
             }
         }
@@ -153,7 +159,7 @@
         int[] intArray = new int[list.size()];
         for ( int j = 0; j < intArray.length; j++ )
         {
-            intArray[j] = list.get(j);
+            intArray[j] = list.get( j );
         }
         return intArray;
     }
diff --git a/src/main/java/org/apache/maven/plugin/jira/ClassicJiraDownloader.java b/src/main/java/org/apache/maven/plugin/jira/ClassicJiraDownloader.java
index 6b15147..71b2f1b 100644
--- a/src/main/java/org/apache/maven/plugin/jira/ClassicJiraDownloader.java
+++ b/src/main/java/org/apache/maven/plugin/jira/ClassicJiraDownloader.java
@@ -150,23 +150,14 @@
         else
         {
             // create the URL for getting the proper issues from JIRA
-            String jqlQuery = new JqlQueryBuilder( log )
-                .project( jiraProject )
-                .fixVersion( getFixFor() )
-                .fixVersionIds( fixVersionIds )
-                .statusIds( statusIds )
-                .priorityIds( priorityIds )
-                .resolutionIds( resolutionIds )
-                .components( component )
-                .typeIds( typeIds )
-                .sortColumnNames( sortColumnNames )
-                .build();
+            String jqlQuery = new JqlQueryBuilder( log ).project( jiraProject ).fixVersion( getFixFor() ).fixVersionIds(
+                fixVersionIds ).statusIds( statusIds ).priorityIds( priorityIds ).resolutionIds(
+                resolutionIds ).components( component ).typeIds( typeIds ).sortColumnNames( sortColumnNames ).build();
 
-            String url = new UrlBuilder( jiraUrl, "sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml" )
-                .addParameter( "tempMax", nbEntriesMax )
-                .addParameter( "reset", "true" )
-                .addParameter( "jqlQuery", jqlQuery )
-                .build();
+            String url =
+                new UrlBuilder( jiraUrl, "sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml" ).addParameter(
+                    "tempMax", nbEntriesMax ).addParameter( "reset", "true" ).addParameter( "jqlQuery",
+                                                                                            jqlQuery ).build();
 
             return url;
         }
@@ -200,16 +191,10 @@
                 fullURL += "&fixfor=" + getFixFor();
             }
 
-            String createdFilter = new ParameterQueryBuilder( log )
-                .fixVersionIds( fixVersionIds )
-                .statusIds( statusIds )
-                .priorityIds( priorityIds )
-                .resolutionIds( resolutionIds )
-                .components( component )
-                .typeIds( typeIds )
-                .sortColumnNames( sortColumnNames )
-                .filter( filter )
-                .build();
+            String createdFilter =
+                new ParameterQueryBuilder( log ).fixVersionIds( fixVersionIds ).statusIds( statusIds ).priorityIds(
+                    priorityIds ).resolutionIds( resolutionIds ).components( component ).typeIds(
+                    typeIds ).sortColumnNames( sortColumnNames ).filter( filter ).build();
 
             if ( createdFilter.charAt( 0 ) != '&' )
             {
@@ -248,8 +233,8 @@
      * jiraPassword being set. You can check this by calling
      * isJiraAuthenticationConfigured().
      *
-     * @param client    the HttpClient
-     * @param jiraUrl   the JIRA installation
+     * @param client  the HttpClient
+     * @param jiraUrl the JIRA installation
      * @return <code>true</code> if the authentication was successful, otherwise <code>false</code>
      */
     private boolean doJiraAuthentication( HttpClient client, final String jiraUrl )
@@ -318,13 +303,13 @@
     {
         final String loginFailureResponse = "your username and password are incorrect";
 
-        return !loginGet.getResponseBodyAsString().contains(loginFailureResponse);
+        return !loginGet.getResponseBodyAsString().contains( loginFailureResponse );
     }
 
     /**
      * Setup proxy access if we have to.
      *
-     * @param client  the HttpClient
+     * @param client the HttpClient
      */
     private void determineProxy( String jiraUrl, HttpClient client )
     {
@@ -343,8 +328,7 @@
                 getLog().debug( "Using proxy user: " + proxyUser );
 
                 client.getState().setProxyCredentials(
-                    new AuthScope( null, AuthScope.ANY_PORT, null,
-                                   AuthScope.ANY_SCHEME ),
+                    new AuthScope( null, AuthScope.ANY_PORT, null, AuthScope.ANY_SCHEME ),
                     new UsernamePasswordCredentials( proxyUser, proxyPass ) );
             }
         }
@@ -353,8 +337,8 @@
     /**
      * Downloads the given link using the configured HttpClient, possibly following redirects.
      *
-     * @param cl     the HttpClient
-     * @param link   the URL to JIRA
+     * @param cl   the HttpClient
+     * @param link the URL to JIRA
      */
     private void download( final HttpClient cl, final String link )
     {
diff --git a/src/main/java/org/apache/maven/plugin/jira/JiraHelper.java b/src/main/java/org/apache/maven/plugin/jira/JiraHelper.java
index feea928..785c791 100644
--- a/src/main/java/org/apache/maven/plugin/jira/JiraHelper.java
+++ b/src/main/java/org/apache/maven/plugin/jira/JiraHelper.java
@@ -47,7 +47,7 @@
      * @param issueManagementUrl The URL to the issue management system
      * @return A <code>Map</code> containing the URL and project id
      */
-    static Map<String,String> getJiraUrlAndProjectId( String issueManagementUrl )
+    static Map<String, String> getJiraUrlAndProjectId( String issueManagementUrl )
     {
         String url = issueManagementUrl;
 
@@ -87,7 +87,7 @@
             }
         }
 
-        HashMap<String,String> urlMap = new HashMap<String,String>( 4 );
+        HashMap<String, String> urlMap = new HashMap<String, String>( 4 );
 
         urlMap.put( "url", jiraUrl );
 
@@ -99,9 +99,9 @@
     /**
      * Try to get a JIRA pid from the issue management URL.
      *
-     * @param log     Used to tell the user what happened
+     * @param log                Used to tell the user what happened
      * @param issueManagementUrl The URL to the issue management system
-     * @param client  The client used to connect to JIRA
+     * @param client             The client used to connect to JIRA
      * @return The JIRA id for the project, or null if it can't be found
      */
     public static String getPidFromJira( Log log, String issueManagementUrl, HttpClient client )
diff --git a/src/main/java/org/apache/maven/plugin/jira/JiraMojo.java b/src/main/java/org/apache/maven/plugin/jira/JiraMojo.java
index 1e44902..5844abd 100644
--- a/src/main/java/org/apache/maven/plugin/jira/JiraMojo.java
+++ b/src/main/java/org/apache/maven/plugin/jira/JiraMojo.java
@@ -52,24 +52,24 @@
     /**
      * Valid JIRA columns.
      */
-    private static final Map<String,Integer> JIRA_COLUMNS = new HashMap<String,Integer>( 16 );
+    private static final Map<String, Integer> JIRA_COLUMNS = new HashMap<String, Integer>( 16 );
 
     static
     {
-        JIRA_COLUMNS.put( "Assignee", IssuesReportHelper.COLUMN_ASSIGNEE);
-        JIRA_COLUMNS.put( "Component", IssuesReportHelper.COLUMN_COMPONENT);
-        JIRA_COLUMNS.put( "Created", IssuesReportHelper.COLUMN_CREATED);
-        JIRA_COLUMNS.put( "Fix Version", IssuesReportHelper.COLUMN_FIX_VERSION);
-        JIRA_COLUMNS.put( "Id", IssuesReportHelper.COLUMN_ID);
-        JIRA_COLUMNS.put( "Key", IssuesReportHelper.COLUMN_KEY);
-        JIRA_COLUMNS.put( "Priority", IssuesReportHelper.COLUMN_PRIORITY);
-        JIRA_COLUMNS.put( "Reporter", IssuesReportHelper.COLUMN_REPORTER);
-        JIRA_COLUMNS.put( "Resolution", IssuesReportHelper.COLUMN_RESOLUTION);
-        JIRA_COLUMNS.put( "Status", IssuesReportHelper.COLUMN_STATUS);
-        JIRA_COLUMNS.put( "Summary", IssuesReportHelper.COLUMN_SUMMARY);
-        JIRA_COLUMNS.put( "Type", IssuesReportHelper.COLUMN_TYPE);
-        JIRA_COLUMNS.put( "Updated", IssuesReportHelper.COLUMN_UPDATED);
-        JIRA_COLUMNS.put( "Version", IssuesReportHelper.COLUMN_VERSION);
+        JIRA_COLUMNS.put( "Assignee", IssuesReportHelper.COLUMN_ASSIGNEE );
+        JIRA_COLUMNS.put( "Component", IssuesReportHelper.COLUMN_COMPONENT );
+        JIRA_COLUMNS.put( "Created", IssuesReportHelper.COLUMN_CREATED );
+        JIRA_COLUMNS.put( "Fix Version", IssuesReportHelper.COLUMN_FIX_VERSION );
+        JIRA_COLUMNS.put( "Id", IssuesReportHelper.COLUMN_ID );
+        JIRA_COLUMNS.put( "Key", IssuesReportHelper.COLUMN_KEY );
+        JIRA_COLUMNS.put( "Priority", IssuesReportHelper.COLUMN_PRIORITY );
+        JIRA_COLUMNS.put( "Reporter", IssuesReportHelper.COLUMN_REPORTER );
+        JIRA_COLUMNS.put( "Resolution", IssuesReportHelper.COLUMN_RESOLUTION );
+        JIRA_COLUMNS.put( "Status", IssuesReportHelper.COLUMN_STATUS );
+        JIRA_COLUMNS.put( "Summary", IssuesReportHelper.COLUMN_SUMMARY );
+        JIRA_COLUMNS.put( "Type", IssuesReportHelper.COLUMN_TYPE );
+        JIRA_COLUMNS.put( "Updated", IssuesReportHelper.COLUMN_UPDATED );
+        JIRA_COLUMNS.put( "Version", IssuesReportHelper.COLUMN_VERSION );
     }
 
     /**
@@ -90,7 +90,7 @@
     private String columnNames;
 
     /**
-     * Use the JIRA query language instead of the JIRA query based on HTTP parameters. 
+     * Use the JIRA query language instead of the JIRA query based on HTTP parameters.
      * From JIRA 5.1 and up only JQL is supported. JIRA 4.4 supports both JQL and URL parameter based queries.
      * From 5.1.1 this is obsolete, since REST queries only use JQL.
      *
@@ -106,9 +106,9 @@
      *
      * @since 2.9
      */
-    @Parameter( defaultValue = "false")
+    @Parameter( defaultValue = "false" )
     private boolean forceRss;
-    
+
     /**
      * Sets the component(s) that you want to limit your report to include.
      * Multiple values can be separated by commas (such as 10011,10012).
@@ -211,7 +211,7 @@
 
     /**
      * If set to <code>true</code>, then the JIRA report will not be generated.
-     * 
+     *
      * @since 2.8
      */
     @Parameter( property = "changes.jira.skip", defaultValue = "false" )
@@ -311,10 +311,10 @@
      */
     @Parameter( defaultValue = "" )
     private String webUser;
-    
+
     /*
-     * Used for tests.
-     */
+    * Used for tests.
+    */
     private AbstractJiraDownloader mockDownloader;
 
     /* --------------------------------------------------------------------- */
@@ -330,7 +330,7 @@
         {
             return false;
         }
-        if ( mockDownloader != null ) 
+        if ( mockDownloader != null )
         {
             return true;
         }
@@ -373,7 +373,7 @@
                 int originalNumberOfIssues = issueList.size();
                 issueList = IssueUtils.filterIssuesWithVersionPrefix( issueList, versionPrefix );
                 getLog().debug( "Filtered out " + issueList.size() + " issues of " + originalNumberOfIssues
-                    + " that matched the versionPrefix '" + versionPrefix + "'." );
+                                    + " that matched the versionPrefix '" + versionPrefix + "'." );
             }
 
             if ( onlyCurrentVersion )
@@ -464,9 +464,9 @@
         issueDownloader.setSettings( settings );
 
         issueDownloader.setUseJql( useJql );
-        
+
         issueDownloader.setOnlyCurrentVersion( onlyCurrentVersion );
-        
+
         issueDownloader.setVersionPrefix( versionPrefix );
     }
 
diff --git a/src/main/java/org/apache/maven/plugin/jira/JqlQueryBuilder.java b/src/main/java/org/apache/maven/plugin/jira/JqlQueryBuilder.java
index 42faa44..9f556d3 100644
--- a/src/main/java/org/apache/maven/plugin/jira/JqlQueryBuilder.java
+++ b/src/main/java/org/apache/maven/plugin/jira/JqlQueryBuilder.java
@@ -38,6 +38,7 @@
     implements JiraQueryBuilder
 {
     private String filter = "";
+
     private boolean urlEncode = true;
 
     /**
@@ -134,6 +135,7 @@
 
     /**
      * Add a sequence of version IDs already in a list.
+     *
      * @param fixVersionIds the version ids.
      * @return
      */
@@ -245,7 +247,7 @@
                 query.append( " AND " );
             }
 
-            query.append(key).append(" in (");
+            query.append( key ).append( " in (" );
 
             String[] valuesArr = values.split( "," );
 
@@ -275,7 +277,7 @@
                 trimAndQuoteValue( values.get( i ) );
                 query.append( ", " );
             }
-            trimAndQuoteValue( values.get ( values.size() - 1 ) );
+            trimAndQuoteValue( values.get( values.size() - 1 ) );
             query.append( ")" );
         }
     }
diff --git a/src/main/java/org/apache/maven/plugin/jira/ParameterQueryBuilder.java b/src/main/java/org/apache/maven/plugin/jira/ParameterQueryBuilder.java
index 736e96e..7b44642 100644
--- a/src/main/java/org/apache/maven/plugin/jira/ParameterQueryBuilder.java
+++ b/src/main/java/org/apache/maven/plugin/jira/ParameterQueryBuilder.java
@@ -28,7 +28,7 @@
 
 /**
  * JIRA 3.x way of constructing a search query based on URL parameters.
- * 
+ *
  * @author ton.swieb@finalist.com
  * @version $Id$
  * @since 2.8
@@ -37,18 +37,33 @@
     implements JiraQueryBuilder
 {
     private String filter = "";
-    /** Log for debug output. */
+
+    /**
+     * Log for debug output.
+     */
     private Log log;
+
     private StringBuilder query = new StringBuilder();
 
-    /** Mapping containing all allowed JIRA priority values. */
-    private final Map<String,String> priorityMap = new HashMap<String,String>( 8 );
-    /** Mapping containing all allowed JIRA resolution values. */
-    private final Map<String,String> resolutionMap = new HashMap<String,String>( 8 );
-    /** Mapping containing all allowed JIRA status values. */
-    private final Map<String,String> statusMap = new HashMap<String,String>( 8 );
-    /** Mapping containing all allowed JIRA type values. */
-    private final Map<String,String> typeMap = new HashMap<String,String>( 8 );
+    /**
+     * Mapping containing all allowed JIRA priority values.
+     */
+    private final Map<String, String> priorityMap = new HashMap<String, String>( 8 );
+
+    /**
+     * Mapping containing all allowed JIRA resolution values.
+     */
+    private final Map<String, String> resolutionMap = new HashMap<String, String>( 8 );
+
+    /**
+     * Mapping containing all allowed JIRA status values.
+     */
+    private final Map<String, String> statusMap = new HashMap<String, String>( 8 );
+
+    /**
+     * Mapping containing all allowed JIRA type values.
+     */
+    private final Map<String, String> typeMap = new HashMap<String, String>( 8 );
 
     public ParameterQueryBuilder( Log log )
     {
@@ -152,9 +167,11 @@
         {
             String[] fixVersions = fixVersionIds.split( "," );
 
-            for (String fixVersion : fixVersions) {
-                if (fixVersion.length() > 0) {
-                    query.append("&fixfor=").append(fixVersion.trim());
+            for ( String fixVersion : fixVersions )
+            {
+                if ( fixVersion.length() > 0 )
+                {
+                    query.append( "&fixfor=" ).append( fixVersion.trim() );
                 }
             }
         }
@@ -318,16 +335,15 @@
                 else
                 {
                     // Error in the configuration
-                    getLog().error(
-                        "maven-changes-plugin: The configured value '" + lowerColumnName
-                            + "' for sortColumnNames is not correct." );
+                    getLog().error( "maven-changes-plugin: The configured value '" + lowerColumnName
+                                        + "' for sortColumnNames is not correct." );
                 }
             }
             if ( validSortColumnNames == 0 )
             {
                 // Error in the configuration
-                getLog().error(
-                    "maven-changes-plugin: None of the configured sortColumnNames '" + sortColumnNames + "' are correct." );
+                getLog().error( "maven-changes-plugin: None of the configured sortColumnNames '" + sortColumnNames
+                                    + "' are correct." );
             }
         }
         return this;
diff --git a/src/main/java/org/apache/maven/plugin/jira/UrlBuilder.java b/src/main/java/org/apache/maven/plugin/jira/UrlBuilder.java
index df06544..a1681dd 100644
--- a/src/main/java/org/apache/maven/plugin/jira/UrlBuilder.java
+++ b/src/main/java/org/apache/maven/plugin/jira/UrlBuilder.java
@@ -29,6 +29,7 @@
 public class UrlBuilder
 {
     private static final String AMPERSAND = "&";
+
     private static final String QUESTION_MARK = "?";
 
     private StringBuilder query = new StringBuilder();
@@ -50,7 +51,7 @@
             {
                 query.append( QUESTION_MARK );
             }
-            query.append(key).append("=").append(value);
+            query.append( key ).append( "=" ).append( value );
         }
         return this;
     }
diff --git a/src/main/java/org/apache/maven/plugin/resource/loader/ProjectResourceLoader.java b/src/main/java/org/apache/maven/plugin/resource/loader/ProjectResourceLoader.java
index 4078c53..4edc3bc 100644
--- a/src/main/java/org/apache/maven/plugin/resource/loader/ProjectResourceLoader.java
+++ b/src/main/java/org/apache/maven/plugin/resource/loader/ProjectResourceLoader.java
@@ -36,7 +36,7 @@
 
 /**
  * Resource Loader for external projects.
- * 
+ *
  * @version $Id$
  */
 public class ProjectResourceLoader
@@ -52,7 +52,7 @@
      * so that we can properly check the modification
      * times of the files.
      */
-    private Hashtable<String,String> templatePaths = new Hashtable<String,String>();
+    private Hashtable<String, String> templatePaths = new Hashtable<String, String>();
 
     public void init( ExtendedProperties configuration )
     {
@@ -60,17 +60,19 @@
 
         String separator = System.getProperty( "file.separator" );
 
-        String path = System.getProperty( "user.dir" ) + separator + "src" + separator + "main" + separator
-            + "resources" + separator;
+        String path =
+            System.getProperty( "user.dir" ) + separator + "src" + separator + "main" + separator + "resources"
+                + separator;
 
         rsvc.getLog().info( "path :" + path );
-        
+
         paths = new ArrayList<String>();
 
         paths.add( path );
-        
-        for (String path1 : paths) {
-            rsvc.getLog().info("ProjectResourceLoader : adding path '" + path1 + "'");
+
+        for ( String path1 : paths )
+        {
+            rsvc.getLog().info( "ProjectResourceLoader : adding path '" + path1 + "'" );
         }
         rsvc.getLog().info( "ProjectResourceLoader : initialization complete." );
     }
@@ -82,7 +84,7 @@
      * @param templateName name of template to get
      * @return InputStream containing the template
      * @throws ResourceNotFoundException if template not found
-     *         in the file template path.
+     *                                   in the file template path.
      */
     public synchronized InputStream getResourceStream( String templateName )
         throws ResourceNotFoundException
@@ -103,8 +105,9 @@
         String template = StringUtils.normalizePath( templateName );
         if ( template == null || template.length() == 0 )
         {
-            String msg = "Project Resource loader error : argument " + template
-                + " contains .. and may be trying to access " + "content outside of template root.  Rejected.";
+            String msg =
+                "Project Resource loader error : argument " + template + " contains .. and may be trying to access "
+                    + "content outside of template root.  Rejected.";
 
             rsvc.getLog().error( "ProjectResourceLoader : " + msg );
 
@@ -118,7 +121,7 @@
         {
             template = template.substring( 1 );
         }
-        
+
         // MCHANGES-118 adding the basedir path
         paths.add( (String) rsvc.getApplicationAttribute( "baseDirectory" ) );
 
@@ -151,17 +154,16 @@
 
     /**
      * Try to find a template given a normalized path.
-     * 
+     *
      * @param path a normalized path
      * @return InputStream input stream that will be parsed
-     *
      */
     private InputStream findTemplate( String path, String template )
     {
         try
         {
             File file = new File( path, template );
-            
+
             if ( file.canRead() )
             {
                 return new BufferedInputStream( new FileInputStream( file.getAbsolutePath() ) );
diff --git a/src/main/java/org/apache/maven/plugin/trac/TracDownloader.java b/src/main/java/org/apache/maven/plugin/trac/TracDownloader.java
index 131e610..1abb4ff 100644
--- a/src/main/java/org/apache/maven/plugin/trac/TracDownloader.java
+++ b/src/main/java/org/apache/maven/plugin/trac/TracDownloader.java
@@ -47,13 +47,24 @@
  */
 public class TracDownloader
 {
-    /** The Maven project. */
+    /**
+     * The Maven project.
+     */
     private MavenProject project;
-    /** The Trac query for searching for tickets. */
+
+    /**
+     * The Trac query for searching for tickets.
+     */
     private String query;
-    /** The password for authentication into a private Trac installation. */
+
+    /**
+     * The password for authentication into a private Trac installation.
+     */
     private String tracPassword;
-    /** The username for authentication into a private Trac installation. */
+
+    /**
+     * The username for authentication into a private Trac installation.
+     */
     private String tracUser;
 
     private Issue createIssue( Object[] ticketObj )
@@ -93,7 +104,8 @@
         return issue;
     }
 
-    public List<Issue> getIssueList() throws MalformedURLException, XmlRpcException
+    public List<Issue> getIssueList()
+        throws MalformedURLException, XmlRpcException
     {
         // Create and configure an XML-RPC client
         XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
@@ -123,18 +135,19 @@
             qstr = query;
         }
 
-        Object[] params = new Object[] {qstr};
+        Object[] params = new Object[]{ qstr };
         Object[] queryResult;
         ArrayList<Issue> issueList = new ArrayList<Issue>();
         try
         {
             queryResult = (Object[]) client.execute( "ticket.query", params );
 
-            for (Object aQueryResult : queryResult) {
-                params = new Object[]{aQueryResult};
+            for ( Object aQueryResult : queryResult )
+            {
+                params = new Object[]{ aQueryResult };
                 Object[] ticketGetResult;
-                ticketGetResult = (Object[]) client.execute("ticket.get", params);
-                issueList.add(createIssue(ticketGetResult));
+                ticketGetResult = (Object[]) client.execute( "ticket.get", params );
+                issueList.add( createIssue( ticketGetResult ) );
             }
         }
         catch ( XmlRpcException e )
diff --git a/src/main/java/org/apache/maven/plugin/trac/TracMojo.java b/src/main/java/org/apache/maven/plugin/trac/TracMojo.java
index df8803d..35453a3 100644
--- a/src/main/java/org/apache/maven/plugin/trac/TracMojo.java
+++ b/src/main/java/org/apache/maven/plugin/trac/TracMojo.java
@@ -50,40 +50,40 @@
     /**
      * Deprecated Trac columns.
      */
-    private static Map<String,Integer> DEPRECATED_TRAC_COLUMNS = new HashMap<String,Integer>();
+    private static Map<String, Integer> DEPRECATED_TRAC_COLUMNS = new HashMap<String, Integer>();
 
     /**
      * Valid Trac columns.
      */
-    private static Map<String,Integer> TRAC_COLUMNS = new HashMap<String,Integer>();
+    private static Map<String, Integer> TRAC_COLUMNS = new HashMap<String, Integer>();
 
     static
     {
-        DEPRECATED_TRAC_COLUMNS.put( "changed", IssuesReportHelper.COLUMN_UPDATED);
-        DEPRECATED_TRAC_COLUMNS.put( "component", IssuesReportHelper.COLUMN_COMPONENT);
-        DEPRECATED_TRAC_COLUMNS.put( "created", IssuesReportHelper.COLUMN_CREATED);
-        DEPRECATED_TRAC_COLUMNS.put( "id", IssuesReportHelper.COLUMN_ID);
-        DEPRECATED_TRAC_COLUMNS.put( "milestone", IssuesReportHelper.COLUMN_FIX_VERSION);
-        DEPRECATED_TRAC_COLUMNS.put( "owner", IssuesReportHelper.COLUMN_ASSIGNEE);
-        DEPRECATED_TRAC_COLUMNS.put( "priority", IssuesReportHelper.COLUMN_PRIORITY);
-        DEPRECATED_TRAC_COLUMNS.put( "reporter", IssuesReportHelper.COLUMN_REPORTER);
-        DEPRECATED_TRAC_COLUMNS.put( "resolution", IssuesReportHelper.COLUMN_RESOLUTION);
-        DEPRECATED_TRAC_COLUMNS.put( "status", IssuesReportHelper.COLUMN_STATUS);
-        DEPRECATED_TRAC_COLUMNS.put( "summary", IssuesReportHelper.COLUMN_SUMMARY);
-        DEPRECATED_TRAC_COLUMNS.put( "type", IssuesReportHelper.COLUMN_TYPE);
+        DEPRECATED_TRAC_COLUMNS.put( "changed", IssuesReportHelper.COLUMN_UPDATED );
+        DEPRECATED_TRAC_COLUMNS.put( "component", IssuesReportHelper.COLUMN_COMPONENT );
+        DEPRECATED_TRAC_COLUMNS.put( "created", IssuesReportHelper.COLUMN_CREATED );
+        DEPRECATED_TRAC_COLUMNS.put( "id", IssuesReportHelper.COLUMN_ID );
+        DEPRECATED_TRAC_COLUMNS.put( "milestone", IssuesReportHelper.COLUMN_FIX_VERSION );
+        DEPRECATED_TRAC_COLUMNS.put( "owner", IssuesReportHelper.COLUMN_ASSIGNEE );
+        DEPRECATED_TRAC_COLUMNS.put( "priority", IssuesReportHelper.COLUMN_PRIORITY );
+        DEPRECATED_TRAC_COLUMNS.put( "reporter", IssuesReportHelper.COLUMN_REPORTER );
+        DEPRECATED_TRAC_COLUMNS.put( "resolution", IssuesReportHelper.COLUMN_RESOLUTION );
+        DEPRECATED_TRAC_COLUMNS.put( "status", IssuesReportHelper.COLUMN_STATUS );
+        DEPRECATED_TRAC_COLUMNS.put( "summary", IssuesReportHelper.COLUMN_SUMMARY );
+        DEPRECATED_TRAC_COLUMNS.put( "type", IssuesReportHelper.COLUMN_TYPE );
 
-        TRAC_COLUMNS.put( "Assignee", IssuesReportHelper.COLUMN_ASSIGNEE);
-        TRAC_COLUMNS.put( "Component", IssuesReportHelper.COLUMN_COMPONENT);
-        TRAC_COLUMNS.put( "Created", IssuesReportHelper.COLUMN_CREATED);
-        TRAC_COLUMNS.put( "Fix Version", IssuesReportHelper.COLUMN_FIX_VERSION);
-        TRAC_COLUMNS.put( "Id", IssuesReportHelper.COLUMN_ID);
-        TRAC_COLUMNS.put( "Priority", IssuesReportHelper.COLUMN_PRIORITY);
-        TRAC_COLUMNS.put( "Reporter", IssuesReportHelper.COLUMN_REPORTER);
-        TRAC_COLUMNS.put( "Resolution", IssuesReportHelper.COLUMN_RESOLUTION);
-        TRAC_COLUMNS.put( "Status", IssuesReportHelper.COLUMN_STATUS);
-        TRAC_COLUMNS.put( "Summary", IssuesReportHelper.COLUMN_SUMMARY);
-        TRAC_COLUMNS.put( "Type", IssuesReportHelper.COLUMN_TYPE);
-        TRAC_COLUMNS.put( "Updated", IssuesReportHelper.COLUMN_UPDATED);
+        TRAC_COLUMNS.put( "Assignee", IssuesReportHelper.COLUMN_ASSIGNEE );
+        TRAC_COLUMNS.put( "Component", IssuesReportHelper.COLUMN_COMPONENT );
+        TRAC_COLUMNS.put( "Created", IssuesReportHelper.COLUMN_CREATED );
+        TRAC_COLUMNS.put( "Fix Version", IssuesReportHelper.COLUMN_FIX_VERSION );
+        TRAC_COLUMNS.put( "Id", IssuesReportHelper.COLUMN_ID );
+        TRAC_COLUMNS.put( "Priority", IssuesReportHelper.COLUMN_PRIORITY );
+        TRAC_COLUMNS.put( "Reporter", IssuesReportHelper.COLUMN_REPORTER );
+        TRAC_COLUMNS.put( "Resolution", IssuesReportHelper.COLUMN_RESOLUTION );
+        TRAC_COLUMNS.put( "Status", IssuesReportHelper.COLUMN_STATUS );
+        TRAC_COLUMNS.put( "Summary", IssuesReportHelper.COLUMN_SUMMARY );
+        TRAC_COLUMNS.put( "Type", IssuesReportHelper.COLUMN_TYPE );
+        TRAC_COLUMNS.put( "Updated", IssuesReportHelper.COLUMN_UPDATED );
     }
 
     /**
@@ -139,8 +139,8 @@
         throws MavenReportException
     {
         // Validate parameters
-        List<Integer> columnIds = IssuesReportHelper.getColumnIds( columnNames, TRAC_COLUMNS, DEPRECATED_TRAC_COLUMNS,
-                                                                   getLog() );
+        List<Integer> columnIds =
+            IssuesReportHelper.getColumnIds( columnNames, TRAC_COLUMNS, DEPRECATED_TRAC_COLUMNS, getLog() );
         if ( columnIds.size() == 0 )
         {
             // This can happen if the user has configured column names and they are all invalid
diff --git a/src/test/java/org/apache/maven/plugin/changes/ChangesXMLTest.java b/src/test/java/org/apache/maven/plugin/changes/ChangesXMLTest.java
index 7c20ed2..7512780 100644
--- a/src/test/java/org/apache/maven/plugin/changes/ChangesXMLTest.java
+++ b/src/test/java/org/apache/maven/plugin/changes/ChangesXMLTest.java
@@ -32,8 +32,8 @@
 
 /**
  * @author Olivier Lamy
- * @since 27 juil. 2008
  * @version $Id$
+ * @since 27 juil. 2008
  */
 public class ChangesXMLTest
     extends PlexusTestCase
@@ -146,16 +146,18 @@
 
         List releases = changesXML.getReleaseList();
         assertEquals( 2, releases.size() );
-        for (Object release1 : releases) {
+        for ( Object release1 : releases )
+        {
             Release release = (Release) release1;
-            if ("1.0".equals(release.getVersion())) {
-                Action action = release.getActions().get(0);
-                assertEquals(2, action.getFixedIssues().size());
-                assertEquals("JIRA-XXX", action.getFixedIssues().get(0).getIssue());
-                assertEquals("JIRA-YYY", action.getFixedIssues().get(1).getIssue());
-                assertEquals(2, action.getDueTos().size());
+            if ( "1.0".equals( release.getVersion() ) )
+            {
+                Action action = release.getActions().get( 0 );
+                assertEquals( 2, action.getFixedIssues().size() );
+                assertEquals( "JIRA-XXX", action.getFixedIssues().get( 0 ).getIssue() );
+                assertEquals( "JIRA-YYY", action.getFixedIssues().get( 1 ).getIssue() );
+                assertEquals( 2, action.getDueTos().size() );
             }
         }
     }
-    
+
 }
diff --git a/src/test/java/org/apache/maven/plugin/issues/IssueUtilsTestCase.java b/src/test/java/org/apache/maven/plugin/issues/IssueUtilsTestCase.java
index 544126b..431ae8c 100644
--- a/src/test/java/org/apache/maven/plugin/issues/IssueUtilsTestCase.java
+++ b/src/test/java/org/apache/maven/plugin/issues/IssueUtilsTestCase.java
@@ -71,7 +71,7 @@
         try
         {
             IssueUtils.filterIssuesWithVersionPrefix( issueList, "yourPrefix-" );
-            fail("No issues should be found.");
+            fail( "No issues should be found." );
         }
         catch ( MojoExecutionException e )
         {
