diff --git a/src/main/java/org/apache/maven/shared/filtering/AbstractMavenFilteringRequest.java b/src/main/java/org/apache/maven/shared/filtering/AbstractMavenFilteringRequest.java
index b22b038..3bd179a 100644
--- a/src/main/java/org/apache/maven/shared/filtering/AbstractMavenFilteringRequest.java
+++ b/src/main/java/org/apache/maven/shared/filtering/AbstractMavenFilteringRequest.java
@@ -42,17 +42,15 @@
     private MavenSession mavenSession;
 
     /**
-     * List of Strings considered as expressions which contains values in the project/pom:
-     * pom project
-     * Default value will be pom and project.
+     * List of Strings considered as expressions which contains values in the project/pom: pom project Default value
+     * will be pom and project.
      *
      * @since 1.0-beta-2
      */
     private List<String> projectStartExpressions = new ArrayList<String>();
 
     /**
-     * String which will escape interpolation mechanism:
-     * foo \${foo.bar} -> foo ${foo.bar}
+     * String which will escape interpolation mechanism: foo \${foo.bar} -> foo ${foo.bar}
      *
      * @since 1.0-beta-2
      */
@@ -69,9 +67,8 @@
     private boolean injectProjectBuildFilters = false;
 
     /**
-     * Set of expression delimiter specifications to use during filtering. Delimiter specifications are
-     * given in the form 'BEGIN*END' or, for symmetrical delimiters, simply 'TOKEN'. The default
-     * values are '${*}' and '@'.
+     * Set of expression delimiter specifications to use during filtering. Delimiter specifications are given in the
+     * form 'BEGIN*END' or, for symmetrical delimiters, simply 'TOKEN'. The default values are '${*}' and '@'.
      * 
      * @since 1.0-beta-3
      */
@@ -94,6 +91,7 @@
 
     /**
      * Create instance with given parameters
+     * 
      * @param mavenProject The instance of MavenProject.
      * @param filters The list of filters.
      * @param mavenSession The MavenSession.
@@ -126,6 +124,7 @@
 
     /**
      * Set the MavenProject.
+     * 
      * @param mavenProject The MavenProject to be set.
      */
     public void setMavenProject( MavenProject mavenProject )
@@ -135,6 +134,7 @@
 
     /**
      * The list of filters.
+     * 
      * @return The list of currently set filters.
      */
     public List<String> getFilters()
@@ -144,6 +144,7 @@
 
     /**
      * Set the filters.
+     * 
      * @param filters Set the list of filters
      */
     public void setFilters( List<String> filters )
@@ -152,8 +153,9 @@
     }
 
     /**
-     * Alias for {@link #getFilters()}. 
-     * @return  The list of filters.
+     * Alias for {@link #getFilters()}.
+     * 
+     * @return The list of filters.
      */
     public List<String> getFileFilters()
     {
@@ -162,11 +164,12 @@
 
     /**
      * Alias for {@link #setFilters(List)}
-     * @param filters The list of filters to be set.
+     * 
+     * @param paramfilters The list of filters to be set.
      */
-    public void setFileFilters( List<String> filters )
+    public void setFileFilters( List<String> paramfilters )
     {
-        setFilters( filters );
+        setFilters( paramfilters );
     }
 
     /**
@@ -189,7 +192,8 @@
 
     /**
      * Alias for {@link #isEscapeWindowsPaths()}
-     * @return The current value of {@link #isEscapeWindowsPaths()} 
+     * 
+     * @return The current value of {@link #isEscapeWindowsPaths()}
      */
     public boolean isEscapedBackslashesInFilePath()
     {
@@ -198,6 +202,7 @@
 
     /**
      * Alias for {@link #setEscapeWindowsPaths(boolean)}
+     * 
      * @param escape activate or deactivate escaping.
      */
     public void setEscapedBackslashesInFilePath( boolean escape )
@@ -205,7 +210,6 @@
         setEscapeWindowsPaths( escape );
     }
 
-
     /**
      * @return Current value of mavenSession
      */
@@ -286,7 +290,7 @@
     }
 
     /**
-     * @param projectStartExpressions  The start expressions
+     * @param projectStartExpressions The start expressions
      * @since 1.0-beta-2
      */
     public void setProjectStartExpressions( List<String> projectStartExpressions )
@@ -306,8 +310,8 @@
     }
 
     /**
-     * Set the delimiter specifications to use during filtering. Specifications should be of the form:
-     * 'BEGIN*END' for asymmetrical delimiters, or 'TOKEN' for symmetrical delimiters. See
+     * Set the delimiter specifications to use during filtering. Specifications should be of the form: 'BEGIN*END' for
+     * asymmetrical delimiters, or 'TOKEN' for symmetrical delimiters. See
      * {@link AbstractMavenFilteringRequest#delimiters} for more information and default values.
      * 
      * @param delimiters If <code>null</code>, reset delimiters to '${*}' only. Otherwise, use the provided value.
diff --git a/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java b/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java
index 12396f0..40ad1a2 100644
--- a/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java
+++ b/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java
@@ -53,7 +53,7 @@
 
     /**
      * @see org.apache.maven.shared.filtering.MavenFileFilter#getDefaultFilterWrappers(org.apache.maven.project.MavenProject,
-     * java.util.List, boolean, org.apache.maven.execution.MavenSession)
+     *      java.util.List, boolean, org.apache.maven.execution.MavenSession)
      * @deprecated
      */
     @Nonnull
@@ -61,7 +61,7 @@
                                                                    List<String> filters,
                                                                    final boolean escapedBackslashesInFilePath,
                                                                    MavenSession mavenSession )
-        throws MavenFilteringException
+                                                                       throws MavenFilteringException
     {
         return getDefaultFilterWrappers( mavenProject, filters, escapedBackslashesInFilePath, mavenSession, null );
     }
@@ -72,7 +72,7 @@
                                                                    final boolean escapedBackslashesInFilePath,
                                                                    MavenSession mavenSession,
                                                                    MavenResourcesExecution mavenResourcesExecution )
-        throws MavenFilteringException
+                                                                       throws MavenFilteringException
     {
 
         MavenResourcesExecution mre =
@@ -110,9 +110,8 @@
         // Project properties
         if ( request.getMavenProject() != null )
         {
-            baseProps.putAll( request.getMavenProject().getProperties() == null
-                                  ? Collections.emptyMap()
-                                  : request.getMavenProject().getProperties() );
+            baseProps.putAll( request.getMavenProject().getProperties() == null ? Collections.emptyMap()
+                            : request.getMavenProject().getProperties() );
         }
         // TODO this is NPE free but do we consider this as normal
         // or do we have to throw an MavenFilteringException with mavenSession cannot be null
@@ -150,9 +149,8 @@
             }
 
             // Project properties
-            filterProperties.putAll( request.getMavenProject().getProperties() == null
-                                         ? Collections.emptyMap()
-                                         : request.getMavenProject().getProperties() );
+            filterProperties.putAll( request.getMavenProject().getProperties() == null ? Collections.emptyMap()
+                            : request.getMavenProject().getProperties() );
         }
         if ( request.getMavenSession() != null )
         {
@@ -166,9 +164,9 @@
             filterProperties.putAll( request.getAdditionalProperties() );
         }
 
-        List<FileUtils.FilterWrapper> defaultFilterWrappers = request == null
-            ? new ArrayList<FileUtils.FilterWrapper>( 1 )
-            : new ArrayList<FileUtils.FilterWrapper>( request.getDelimiters().size() + 1 );
+        List<FileUtils.FilterWrapper> defaultFilterWrappers =
+            request == null ? new ArrayList<FileUtils.FilterWrapper>( 1 )
+                            : new ArrayList<FileUtils.FilterWrapper>( request.getDelimiters().size() + 1 );
 
         if ( getLogger().isDebugEnabled() )
         {
@@ -195,7 +193,7 @@
      */
     void loadProperties( Properties filterProperties, File basedir, List<String> propertiesFilePaths,
                          Properties baseProps )
-        throws MavenFilteringException
+                             throws MavenFilteringException
     {
         if ( propertiesFilePaths != null )
         {
@@ -244,15 +242,9 @@
 
         private boolean supportMultiLineFiltering;
 
-        Wrapper(
-                 LinkedHashSet<String> delimiters,
-                 MavenProject project,
-                 MavenSession mavenSession,
-                 ValueSource propertiesValueSource,
-                 List<String> projectStartExpressions,
-                 String escapeString,
-                 boolean escapeWindowsPaths,
-                 boolean supportMultiLineFiltering )
+        Wrapper( LinkedHashSet<String> delimiters, MavenProject project, MavenSession mavenSession,
+                 ValueSource propertiesValueSource, List<String> projectStartExpressions, String escapeString,
+                 boolean escapeWindowsPaths, boolean supportMultiLineFiltering )
         {
             super();
             this.delimiters = delimiters;
@@ -267,10 +259,8 @@
 
         public Reader getReader( Reader reader )
         {
-            Interpolator interpolator =
-                createInterpolator( delimiters, projectStartExpressions,
-                                    propertiesValueSource, project, mavenSession,
-                                    escapeString, escapeWindowsPaths );
+            Interpolator interpolator = createInterpolator( delimiters, projectStartExpressions, propertiesValueSource,
+                                                            project, mavenSession, escapeString, escapeWindowsPaths );
 
             MultiDelimiterInterpolatorFilterReaderLineEnding filterReader =
                 new MultiDelimiterInterpolatorFilterReaderLineEnding( reader, interpolator, supportMultiLineFiltering );
@@ -320,8 +310,8 @@
             if ( settings != null )
             {
                 interpolator.addValueSource( new PrefixedObjectValueSource( "settings", settings ) );
-                interpolator.addValueSource(
-                    new SingleResponseValueSource( "localRepository", settings.getLocalRepository() ) );
+                interpolator.addValueSource( new SingleResponseValueSource( "localRepository",
+                                                                            settings.getLocalRepository() ) );
             }
         }
 
diff --git a/src/main/java/org/apache/maven/shared/filtering/BoundedReader.java b/src/main/java/org/apache/maven/shared/filtering/BoundedReader.java
index 28b47cb..62dc37b 100644
--- a/src/main/java/org/apache/maven/shared/filtering/BoundedReader.java
+++ b/src/main/java/org/apache/maven/shared/filtering/BoundedReader.java
@@ -23,11 +23,9 @@
 import java.io.Reader;
 
 /**
- * A reader that imposes a limit to the number of bytes that can be read from
- * an underlying reader, simulating eof when this limit is reached.
- * This stream can typically be used to constrain a client with regard to a readAheadLimit
- * of an underlying stream, to avoid overrunning this limit and hence
- * lose the opportunity do to reset.
+ * A reader that imposes a limit to the number of bytes that can be read from an underlying reader, simulating eof when
+ * this limit is reached. This stream can typically be used to constrain a client with regard to a readAheadLimit of an
+ * underlying stream, to avoid overrunning this limit and hence lose the opportunity do to reset.
  */
 public class BoundedReader
     extends Reader
@@ -39,6 +37,11 @@
 
     int readAheadLimit;
 
+    /**
+     * @param target {@link Reader}
+     * @param readAheadLimit read ahead limit.
+     * @throws IOException in case of a failure.
+     */
     public BoundedReader( Reader target, int readAheadLimit )
         throws IOException
     {
diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java b/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java
index 46465ca..17143b8 100644
--- a/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java
+++ b/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java
@@ -48,7 +48,7 @@
      * @param filters {@link java.util.List} of properties file
      * @param escapedBackslashesInFilePath true to escape backslashes in file path.
      * @param mavenSession The maven session which will be used.
-     * @throws MavenFilteringException
+     * @throws MavenFilteringException in case of failure.
      * @return {@link java.util.List} of FileUtils.FilterWrapper
      * @deprecated use
      *             {@link #getDefaultFilterWrappers(org.apache.maven.project.MavenProject, java.util.List, boolean, org.apache.maven.execution.MavenSession, org.apache.maven.shared.filtering.MavenResourcesExecution)}
@@ -58,7 +58,7 @@
     List<FileUtils.FilterWrapper> getDefaultFilterWrappers( MavenProject mavenProject, List<String> filters,
                                                             boolean escapedBackslashesInFilePath,
                                                             MavenSession mavenSession )
-        throws MavenFilteringException;
+                                                                throws MavenFilteringException;
 
     /**
      * @param mavenProject The maven project
@@ -66,7 +66,7 @@
      * @param escapedBackslashesInFilePath escape backslashes ?
      * @param mavenSession The maven session
      * @param mavenResourcesExecution The filtering configuration
-     * @throws MavenFilteringException
+     * @throws MavenFilteringException in case of failure.
      * @return {@link java.util.List} of FileUtils.FilterWrapper
      * @since 1.0-beta-2
      */
@@ -75,11 +75,11 @@
                                                             boolean escapedBackslashesInFilePath,
                                                             MavenSession mavenSession,
                                                             MavenResourcesExecution mavenResourcesExecution )
-        throws MavenFilteringException;
+                                                                throws MavenFilteringException;
 
     /**
      * @param request The filtering request
-     * @throws org.apache.maven.shared.filtering.MavenFilteringException
+     * @throws org.apache.maven.shared.filtering.MavenFilteringException in case of failure.
      * @return {@link java.util.List} of FileUtils.FilterWrapper
      * @since 1.0-beta-3
      */
diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java
index e742a6e..ed21831 100644
--- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java
+++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java
@@ -47,8 +47,7 @@
 
 /**
  * @author Olivier Lamy
- * @plexus.component role="org.apache.maven.shared.filtering.MavenFileFilter"
- *                   role-hint="default"
+ * @plexus.component role="org.apache.maven.shared.filtering.MavenFileFilter" role-hint="default"
  */
 public class DefaultMavenFileFilter
     extends BaseFilter
@@ -65,9 +64,10 @@
      */
     private BuildContext buildContext;
 
+    /** {@inheritDoc} */
     public void copyFile( File from, File to, boolean filtering, MavenProject mavenProject, List<String> filters,
                           boolean escapedBackslashesInFilePath, String encoding, MavenSession mavenSession )
-        throws MavenFilteringException
+                              throws MavenFilteringException
     {
         MavenResourcesExecution mre = new MavenResourcesExecution();
         mre.setMavenProject( mavenProject );
@@ -93,7 +93,7 @@
     /** {@inheritDoc} */
     public void copyFile( File from, File to, boolean filtering, List<FileUtils.FilterWrapper> filterWrappers,
                           String encoding )
-        throws MavenFilteringException
+                              throws MavenFilteringException
     {
         // overwrite forced to false to preserve backward comp
         copyFile( from, to, filtering, filterWrappers, encoding, false );
@@ -102,7 +102,7 @@
     /** {@inheritDoc} */
     public void copyFile( File from, File to, boolean filtering, List<FileUtils.FilterWrapper> filterWrappers,
                           String encoding, boolean overwrite )
-        throws MavenFilteringException
+                              throws MavenFilteringException
     {
         try
         {
@@ -134,7 +134,7 @@
 
     private void filterFile( @Nonnull File from, @Nonnull File to, @Nullable String encoding,
                              @Nullable List<FilterWrapper> wrappers )
-        throws IOException, MavenFilteringException
+                                 throws IOException, MavenFilteringException
     {
         if ( wrappers != null && wrappers.size() > 0 )
         {
diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilter.java b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilter.java
index bbd548f..6e608c6 100644
--- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilter.java
+++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilter.java
@@ -31,8 +31,7 @@
 
 /**
  * @author Kristian Rosenvold
- * @plexus.component role="org.apache.maven.shared.filtering.MavenReaderFilter"
- *                   role-hint="default"
+ * @plexus.component role="org.apache.maven.shared.filtering.MavenReaderFilter" role-hint="default"
  */
 public class DefaultMavenReaderFilter
     extends BaseFilter
@@ -42,7 +41,7 @@
     @Nonnull
     public Reader filter( @Nonnull Reader from, boolean filtering, MavenProject mavenProject, List<String> filters,
                           boolean escapedBackslashesInFilePath, MavenSession mavenSession )
-        throws MavenFilteringException
+                              throws MavenFilteringException
     {
         MavenResourcesExecution mre = new MavenResourcesExecution();
         mre.setMavenProject( mavenProject );
diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java
index db20ecb..b694caf 100644
--- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java
+++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java
@@ -45,8 +45,7 @@
 
 /**
  * @author Olivier Lamy
- * @plexus.component role="org.apache.maven.shared.filtering.MavenResourcesFiltering"
- *                   role-hint="default"
+ * @plexus.component role="org.apache.maven.shared.filtering.MavenResourcesFiltering" role-hint="default"
  */
 public class DefaultMavenResourcesFiltering
     extends AbstractLogEnabled
@@ -89,7 +88,7 @@
     public void filterResources( List<Resource> resources, File outputDirectory, MavenProject mavenProject,
                                  String encoding, List<String> fileFilters, List<String> nonFilteredFileExtensions,
                                  MavenSession mavenSession )
-        throws MavenFilteringException
+                                     throws MavenFilteringException
     {
         MavenResourcesExecution mavenResourcesExecution =
             new MavenResourcesExecution( resources, outputDirectory, mavenProject, encoding, fileFilters,
@@ -104,7 +103,7 @@
     public void filterResources( List<Resource> resources, File outputDirectory, String encoding,
                                  List<FileUtils.FilterWrapper> filterWrappers, File resourcesBaseDirectory,
                                  List<String> nonFilteredFileExtensions )
-        throws MavenFilteringException
+                                     throws MavenFilteringException
     {
         MavenResourcesExecution mavenResourcesExecution =
             new MavenResourcesExecution( resources, outputDirectory, encoding, filterWrappers, resourcesBaseDirectory,
@@ -125,7 +124,7 @@
         if ( getLogger().isDebugEnabled() )
         {
             getLogger().debug( "file " + fileName + " has a" + ( filteredFileExtension ? " " : " non " )
-                                   + "filtered file extension" );
+                + "filtered file extension" );
         }
         return filteredFileExtension;
     }
@@ -174,12 +173,12 @@
         if ( mavenResourcesExecution.getEncoding() == null || mavenResourcesExecution.getEncoding().length() < 1 )
         {
             getLogger().warn( "Using platform encoding (" + ReaderFactory.FILE_ENCODING
-                                  + " actually) to copy filtered resources, i.e. build is platform dependent!" );
+                + " actually) to copy filtered resources, i.e. build is platform dependent!" );
         }
         else
         {
             getLogger().info( "Using '" + mavenResourcesExecution.getEncoding()
-                                  + "' encoding to copy filtered resources." );
+                + "' encoding to copy filtered resources." );
         }
 
         for ( Resource resource : mavenResourcesExecution.getResources() )
@@ -192,18 +191,13 @@
                     new StringBuilder( "resource with targetPath " ).append( resource.getTargetPath() ).append( ls );
                 debugMessage.append( "directory " ).append( resource.getDirectory() ).append( ls );
 
-                //@formatter:off
-                debugMessage.append( "excludes " )
-                    .append( 
-                            resource.getExcludes() == null ? " empty " : resource.getExcludes().toString() 
-                           )
-                    .append( ls );
-                debugMessage.append( "includes " )
-                    .append( 
-                             resource.getIncludes() == null ? " empty " : resource.getIncludes().toString()
-                    );
-                
-                //@formatter:on
+                // @formatter:off
+                debugMessage.append( "excludes " ).append( resource.getExcludes() == null ? " empty "
+                                : resource.getExcludes().toString() ).append( ls );
+                debugMessage.append( "includes " ).append( resource.getIncludes() == null ? " empty "
+                                : resource.getIncludes().toString() );
+
+                // @formatter:on
                 getLogger().debug( debugMessage.toString() );
             }
 
@@ -232,9 +226,8 @@
                 throw new MavenFilteringException( "Cannot create resource output directory: " + outputDirectory );
             }
 
-            boolean ignoreDelta =
-                !outputExists || buildContext.hasDelta( mavenResourcesExecution.getFileFilters() )
-                    || buildContext.hasDelta( getRelativeOutputDirectory( mavenResourcesExecution ) );
+            boolean ignoreDelta = !outputExists || buildContext.hasDelta( mavenResourcesExecution.getFileFilters() )
+                || buildContext.hasDelta( getRelativeOutputDirectory( mavenResourcesExecution ) );
             getLogger().debug( "ignoreDelta " + ignoreDelta );
             Scanner scanner = buildContext.newScanner( resourceDirectory, ignoreDelta );
 
@@ -260,7 +253,7 @@
             List<String> includedFiles = Arrays.asList( scanner.getIncludedFiles() );
 
             getLogger().info( "Copying " + includedFiles.size() + " resource" + ( includedFiles.size() > 1 ? "s" : "" )
-                                  + ( targetPath == null ? "" : " to " + targetPath ) );
+                + ( targetPath == null ? "" : " to " + targetPath ) );
 
             for ( String name : includedFiles )
             {
@@ -303,7 +296,7 @@
 
     private File getDestinationFile( File outputDirectory, String targetPath, String name,
                                      MavenResourcesExecution mavenResourcesExecution )
-        throws MavenFilteringException
+                                         throws MavenFilteringException
     {
         String destination = name;
 
diff --git a/src/main/java/org/apache/maven/shared/filtering/InterpolatorFilterReaderLineEnding.java b/src/main/java/org/apache/maven/shared/filtering/InterpolatorFilterReaderLineEnding.java
index cd73b2f..5014a25 100644
--- a/src/main/java/org/apache/maven/shared/filtering/InterpolatorFilterReaderLineEnding.java
+++ b/src/main/java/org/apache/maven/shared/filtering/InterpolatorFilterReaderLineEnding.java
@@ -102,11 +102,7 @@
      * @param endToken end token to use
      * @param supportMultiLineFiltering If multi line filtering is allowed
      */
-    public InterpolatorFilterReaderLineEnding(
-                                               Reader in,
-                                               Interpolator interpolator,
-                                               String beginToken,
-                                               String endToken,
+    public InterpolatorFilterReaderLineEnding( Reader in, Interpolator interpolator, String beginToken, String endToken,
                                                boolean supportMultiLineFiltering )
     {
         this( in, interpolator, beginToken, endToken, new SimpleRecursionInterceptor(), supportMultiLineFiltering );
@@ -120,12 +116,8 @@
      * @param ri The {@link RecursionInterceptor} to use to prevent recursive expressions.
      * @param supportMultiLineFiltering If multi line filtering is allowed
      */
-    private InterpolatorFilterReaderLineEnding(
-                                                Reader in,
-                                                Interpolator interpolator,
-                                                String beginToken,
-                                                String endToken,
-                                                RecursionInterceptor ri,
+    private InterpolatorFilterReaderLineEnding( Reader in, Interpolator interpolator, String beginToken,
+                                                String endToken, RecursionInterceptor ri,
                                                 boolean supportMultiLineFiltering )
     {
         // wrap our own buffer, so we can use mark/reset safely.
@@ -441,16 +433,26 @@
         return preserveEscapeString;
     }
 
+    /**
+     * @param preserveEscapeString {@link #preserveEscapeString}
+     */
     public void setPreserveEscapeString( boolean preserveEscapeString )
     {
         this.preserveEscapeString = preserveEscapeString;
     }
 
+    /**
+     * @return {@link #recursionInterceptor}
+     */
     public RecursionInterceptor getRecursionInterceptor()
     {
         return recursionInterceptor;
     }
 
+    /**
+     * @param theRecursionInterceptor {@link RecursionInterceptor}
+     * @return {@link InterpolatorFilterReaderLineEnding}
+     */
     public InterpolatorFilterReaderLineEnding setRecursionInterceptor( RecursionInterceptor theRecursionInterceptor )
     {
         this.recursionInterceptor = theRecursionInterceptor;
diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java b/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java
index eb58811..8aaf6de 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java
@@ -39,20 +39,21 @@
      * @param from file to copy/filter
      * @param to destination file
      * @param filtering enable or not filtering
-     * @param mavenProject the mavenproject
-     * @param mavenSession The maven session.
+     * @param mavenProject {@link MavenProject}
+     * @param mavenSession {@link MavenSession}
+     * @param escapedBackslashesInFilePath escape backslashes in file path.
      * @param filters {@link List} of String which are path to a Property file
      * @param encoding The encoding which is used during the filtering process.
-     * @throws MavenFilteringException
+     * @throws MavenFilteringException in case of failure.
      * @see #getDefaultFilterWrappers(MavenProject, List, boolean, MavenSession)
      */
     void copyFile( File from, final File to, boolean filtering, MavenProject mavenProject, List<String> filters,
                    boolean escapedBackslashesInFilePath, String encoding, MavenSession mavenSession )
-        throws MavenFilteringException;
+                       throws MavenFilteringException;
 
     /**
      * @param mavenFileFilterRequest the request
-     * @throws MavenFilteringException
+     * @throws MavenFilteringException in case of failure.
      * @since 1.0-beta-3
      */
     void copyFile( MavenFileFilterRequest mavenFileFilterRequest )
@@ -68,7 +69,7 @@
      */
     void copyFile( File from, final File to, boolean filtering, List<FileUtils.FilterWrapper> filterWrappers,
                    String encoding )
-        throws MavenFilteringException;
+                       throws MavenFilteringException;
 
     /**
      * @param from The source file
@@ -82,5 +83,5 @@
      */
     void copyFile( File from, final File to, boolean filtering, List<FileUtils.FilterWrapper> filterWrappers,
                    String encoding, boolean overwrite )
-        throws MavenFilteringException;
+                       throws MavenFilteringException;
 }
diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenFileFilterRequest.java b/src/main/java/org/apache/maven/shared/filtering/MavenFileFilterRequest.java
index 3415d6c..15015e3 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenFileFilterRequest.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenFileFilterRequest.java
@@ -61,16 +61,9 @@
      * @param mavenSession The Maven Session.
      * @param additionalProperties Supplemental properties.
      */
-    public MavenFileFilterRequest(
-                                   File from,
-                                   File to,
-                                   boolean filtering,
-                                   MavenProject mavenProject,
-                                   List<String> filters,
-                                   boolean escapedBackslashesInFilePath,
-                                   String encoding,
-                                   MavenSession mavenSession,
-                                   Properties additionalProperties )
+    public MavenFileFilterRequest( File from, File to, boolean filtering, MavenProject mavenProject,
+                                   List<String> filters, boolean escapedBackslashesInFilePath, String encoding,
+                                   MavenSession mavenSession, Properties additionalProperties )
     {
         super( mavenProject, filters, mavenSession );
         this.encoding = encoding;
@@ -83,6 +76,7 @@
 
     /**
      * Return the encoding.
+     * 
      * @return Current encoding.
      */
     public String getEncoding()
@@ -92,6 +86,7 @@
 
     /**
      * Set the value for encoding.
+     * 
      * @param encoding Give the new value for encoding.
      */
     public void setEncoding( String encoding )
@@ -99,7 +94,6 @@
         this.encoding = encoding;
     }
 
-
     /**
      * @return to filter from.
      */
diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java b/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java
index 56c8e46..5259a4f 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java
@@ -42,23 +42,25 @@
      *
      * @param from the source reader
      * @param filtering enable or not filering
-     * @param mavenProject the mavenproject
+     * @param mavenProject {@link MavenProject}
+     * @param mavenSession {@link MavenSession}
      * @param filters {@link java.util.List} of String which are path to a Property file
+     * @param escapedBackslashesInFilePath escape backslashes in file path.
      * @return an input stream that applies the filter
-     * @throws org.apache.maven.shared.filtering.MavenFilteringException
+     * @throws org.apache.maven.shared.filtering.MavenFilteringException in case of failure.
      * @see #getDefaultFilterWrappers(org.apache.maven.project.MavenProject, java.util.List, boolean,
      *      org.apache.maven.execution.MavenSession)
      */
     @Nonnull
     Reader filter( @Nonnull Reader from, boolean filtering, @Nullable MavenProject mavenProject, List<String> filters,
                    boolean escapedBackslashesInFilePath, MavenSession mavenSession )
-        throws MavenFilteringException;
+                       throws MavenFilteringException;
 
     /**
      * Provides a new reader that applies filtering using defaultFilterWrappers.
      *
      * @param mavenFileFilterRequest The filter request
-     * @throws org.apache.maven.shared.filtering.MavenFilteringException
+     * @throws org.apache.maven.shared.filtering.MavenFilteringException in case of failure.
      * @return an input stream that applies the filter
      * @since 1.0-beta-3
      */
diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilterRequest.java b/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilterRequest.java
index 4bd1e3a..b03471d 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilterRequest.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilterRequest.java
@@ -58,14 +58,8 @@
      * @param additionalProperties supplemental properties.
      * @deprecated use version without encoding
      */
-    public MavenReaderFilterRequest(
-                                     Reader from,
-                                     boolean filtering,
-                                     MavenProject mavenProject,
-                                     List<String> filters,
-                                     boolean escapedBackslashesInFilePath,
-                                     String encoding,
-                                     MavenSession mavenSession,
+    public MavenReaderFilterRequest( Reader from, boolean filtering, MavenProject mavenProject, List<String> filters,
+                                     boolean escapedBackslashesInFilePath, String encoding, MavenSession mavenSession,
                                      Properties additionalProperties )
     {
         super( mavenProject, filters, mavenSession );
@@ -76,13 +70,13 @@
     }
 
     /**
-     * @param from                         To read from
-     * @param filtering                    filter yes/no
-     * @param mavenProject                 The Maven Project.
-     * @param filters                      The list of filters which will be used.
+     * @param from To read from
+     * @param filtering filter yes/no
+     * @param mavenProject The Maven Project.
+     * @param filters The list of filters which will be used.
      * @param escapedBackslashesInFilePath escape backslashes in file paths.
-     * @param mavenSession                 The Maven Session.
-     * @param additionalProperties         supplemental properties.
+     * @param mavenSession The Maven Session.
+     * @param additionalProperties supplemental properties.
      */
     public MavenReaderFilterRequest( Reader from, boolean filtering, MavenProject mavenProject, List<String> filters,
                                      boolean escapedBackslashesInFilePath, MavenSession mavenSession,
@@ -95,7 +89,6 @@
         setEscapeWindowsPaths( escapedBackslashesInFilePath );
     }
 
-
     /**
      * @return where we read from.
      */
diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java b/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java
index 73bd9b7..0532134 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java
@@ -59,7 +59,6 @@
 
     private String encoding;
 
-
     /**
      * Overwrite existing files even if the destination files are newer. <code>false</code> by default.
      *
@@ -100,13 +99,8 @@
      * @param nonFilteredFileExtensions The extensions which should not being filtered.
      * @param mavenSession The maven session.
      */
-    public MavenResourcesExecution(
-                                    List<Resource> resources,
-                                    File outputDirectory,
-                                    MavenProject mavenProject,
-                                    String encoding,
-                                    List<String> fileFilters,
-                                    List<String> nonFilteredFileExtensions,
+    public MavenResourcesExecution( List<Resource> resources, File outputDirectory, MavenProject mavenProject,
+                                    String encoding, List<String> fileFilters, List<String> nonFilteredFileExtensions,
                                     MavenSession mavenSession )
     {
         super( mavenProject, fileFilters, mavenSession );
@@ -126,12 +120,8 @@
      * @param resourcesBaseDirectory The resources base directory.
      * @param nonFilteredFileExtensions The list of extensions which should not being filtered.
      */
-    public MavenResourcesExecution(
-                                    List<Resource> resources,
-                                    File outputDirectory,
-                                    String encoding,
-                                    List<FileUtils.FilterWrapper> filterWrappers,
-                                    File resourcesBaseDirectory,
+    public MavenResourcesExecution( List<Resource> resources, File outputDirectory, String encoding,
+                                    List<FileUtils.FilterWrapper> filterWrappers, File resourcesBaseDirectory,
                                     List<String> nonFilteredFileExtensions )
     {
         this();
@@ -146,6 +136,7 @@
 
     /**
      * Return the encoding.
+     * 
      * @return Current encoding.
      */
     public String getEncoding()
@@ -155,6 +146,7 @@
 
     /**
      * Set the value for encoding.
+     * 
      * @param encoding Give the new value for encoding.
      */
     public void setEncoding( String encoding )
@@ -318,12 +310,11 @@
      * @param startExp start token like <code>${</code>
      * @param endExp endToken <code>}</code>
      * @param escapeString The escape string.
-     * @param supportMultiLineFiltering do we support or use filtering on multi lines with start and endtoken on multi
-     *            lines
+     * @param multiLineFiltering do we support or use filtering on multi lines with start and endtoken on multi lines
      * @since 1.0
      */
     public void addFilerWrapperWithEscaping( final ValueSource valueSource, final String startExp, final String endExp,
-                                             final String escapeString, final boolean supportMultiLineFiltering )
+                                             final String escapeString, final boolean multiLineFiltering )
     {
         addFilterWrapper( new FileUtils.FilterWrapper()
         {
@@ -334,7 +325,7 @@
                 propertiesInterpolator.setEscapeString( escapeString );
                 InterpolatorFilterReaderLineEnding interpolatorFilterReader =
                     new InterpolatorFilterReaderLineEnding( reader, propertiesInterpolator, startExp, endExp,
-                                                            supportMultiLineFiltering );
+                                                            multiLineFiltering );
                 interpolatorFilterReader.setInterpolateWithPrefixPattern( false );
                 return interpolatorFilterReader;
             }
@@ -358,7 +349,7 @@
     }
 
     /**
-     * @return use default filter wrapper 
+     * @return use default filter wrapper
      */
     public boolean isUseDefaultFilterWrappers()
     {
@@ -366,7 +357,7 @@
     }
 
     /**
-     * @param useDefaultFilterWrappers
+     * @param useDefaultFilterWrappers {@link #useDefaultFilterWrappers}
      */
     public void setUseDefaultFilterWrappers( boolean useDefaultFilterWrappers )
     {
@@ -376,6 +367,7 @@
     /**
      * Overwrite existing files even if the destination files are newer.
      *
+     * @return {@link #overwrite}
      * @since 1.0-beta-2
      */
     public boolean isOverwrite()
@@ -397,6 +389,7 @@
     /**
      * Copy any empty directories included in the Resources.
      *
+     * @return {@link #includeEmptyDirs}
      * @since 1.0-beta-2
      */
     public boolean isIncludeEmptyDirs()
@@ -476,17 +469,13 @@
         }
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.maven.shared.filtering.AbstractMavenFilteringRequest#isSupportMultiLineFiltering()
-     */
+    /** {@inheritDoc} */
     public boolean isSupportMultiLineFiltering()
     {
         return supportMultiLineFiltering;
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.maven.shared.filtering.AbstractMavenFilteringRequest#setSupportMultiLineFiltering(boolean)
-     */
+    /** {@inheritDoc} */
     public void setSupportMultiLineFiltering( boolean supportMultiLineFiltering )
     {
         this.supportMultiLineFiltering = supportMultiLineFiltering;
diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenResourcesFiltering.java b/src/main/java/org/apache/maven/shared/filtering/MavenResourcesFiltering.java
index b0e9a44..ec147e5 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenResourcesFiltering.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenResourcesFiltering.java
@@ -41,12 +41,12 @@
      * @param fileFilters {@link List} of String which are path to a Property file
      * @param nonFilteredFileExtensions {@link List} of String for non filtered file extensions
      * @param mavenSession Can include executionProperties that will be used for filtering
-     * @throws MavenFilteringException
+     * @throws MavenFilteringException in case of failure.
      * @deprecated use {@link #filterResources(MavenResourcesExecution)}
      */
     void filterResources( List<Resource> resources, File outputDirectory, MavenProject mavenProject, String encoding,
                           List<String> fileFilters, List<String> nonFilteredFileExtensions, MavenSession mavenSession )
-        throws MavenFilteringException;
+                              throws MavenFilteringException;
 
     /**
      * @param resources {@link List} of {@link org.apache.maven.model.Resource}
@@ -55,13 +55,13 @@
      * @param filterWrappers {@link List} of FileUtils.FilterWrapper
      * @param resourcesBaseDirectory baseDirectory of resources
      * @param nonFilteredFileExtensions {@link List} of String for non filtered file extensions
-     * @throws MavenFilteringException
+     * @throws MavenFilteringException in case of failure.
      * @deprecated use {@link #filterResources(MavenResourcesExecution)}
      */
     void filterResources( List<Resource> resources, File outputDirectory, String encoding,
                           List<FileUtils.FilterWrapper> filterWrappers, File resourcesBaseDirectory,
                           List<String> nonFilteredFileExtensions )
-        throws MavenFilteringException;
+                              throws MavenFilteringException;
 
     /**
      * return the List of the non filtered extensions (jpg,jpeg,gif,bmp,png)
@@ -73,14 +73,14 @@
     /**
      * @param fileName the file name
      * @param userNonFilteredFileExtensions an extra list of file extensions
-     * @return true if filtering can be applied to the file (means extensions.lowerCase is in the
-     *         default List or in the user defined extension List)
+     * @return true if filtering can be applied to the file (means extensions.lowerCase is in the default List or in the
+     *         user defined extension List)
      */
     boolean filteredFileExtension( String fileName, List<String> userNonFilteredFileExtensions );
 
     /**
      * @param mavenResourcesExecution {@link MavenResourcesExecution}
-     * @throws MavenFilteringException
+     * @throws MavenFilteringException in case of failure.
      */
     void filterResources( MavenResourcesExecution mavenResourcesExecution )
         throws MavenFilteringException;
diff --git a/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java b/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java
index c086ac8..3512036 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java
@@ -109,9 +109,7 @@
      * @param interpolator interpolator instance to use
      * @param supportMultiLineFiltering If multi line filtering is allowed
      */
-    public MultiDelimiterInterpolatorFilterReaderLineEnding(
-                                                             Reader in,
-                                                             Interpolator interpolator,
+    public MultiDelimiterInterpolatorFilterReaderLineEnding( Reader in, Interpolator interpolator,
                                                              boolean supportMultiLineFiltering )
     {
         this( in, interpolator, new SimpleRecursionInterceptor(), supportMultiLineFiltering );
@@ -123,9 +121,7 @@
      * @param ri The {@link RecursionInterceptor} to use to prevent recursive expressions.
      * @param supportMultiLineFiltering If multi line filtering is allowed
      */
-    public MultiDelimiterInterpolatorFilterReaderLineEnding(
-                                                             Reader in,
-                                                             Interpolator interpolator,
+    public MultiDelimiterInterpolatorFilterReaderLineEnding( Reader in, Interpolator interpolator,
                                                              RecursionInterceptor ri,
                                                              boolean supportMultiLineFiltering )
     {
@@ -147,11 +143,19 @@
 
     }
 
+    /**
+     * @param delimiterSpec delimiter spec.
+     * @return true/false.
+     */
     public boolean removeDelimiterSpec( String delimiterSpec )
     {
         return delimiters.remove( DelimiterSpecification.parse( delimiterSpec ) );
     }
 
+    /**
+     * @param specs set of specs.
+     * @return {@link MultiDelimiterInterpolatorFilterReaderLineEnding}
+     */
     public MultiDelimiterInterpolatorFilterReaderLineEnding setDelimiterSpecs( Set<String> specs )
     {
         delimiters.clear();
@@ -174,7 +178,7 @@
      * @return the number of characters actually skipped
      */
     public long skip( long n )
-        throws IOException
+        throws IOException, IllegalArgumentException
     {
         if ( n < 0L )
         {
@@ -488,7 +492,7 @@
     }
 
     /**
-     * @param preserveEscapeString preserve escape string {@code true} or {@code false}. 
+     * @param preserveEscapeString preserve escape string {@code true} or {@code false}.
      */
     public void setPreserveEscapeString( boolean preserveEscapeString )
     {
@@ -496,7 +500,7 @@
     }
 
     /**
-     * @return {@link RecursionInterceptor} 
+     * @return {@link RecursionInterceptor}
      */
     public RecursionInterceptor getRecursionInterceptor()
     {
@@ -507,8 +511,7 @@
      * @param givenRecursionInterceptor {@link RecursionInterceptor}
      * @return this
      */
-    public MultiDelimiterInterpolatorFilterReaderLineEnding setRecursionInterceptor(
-                                                                    RecursionInterceptor givenRecursionInterceptor )
+    public MultiDelimiterInterpolatorFilterReaderLineEnding setRecursionInterceptor( RecursionInterceptor givenRecursionInterceptor )
     {
         this.recursionInterceptor = givenRecursionInterceptor;
         return this;
