diff --git a/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java b/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java
deleted file mode 100644
index abfd59c..0000000
--- a/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java
+++ /dev/null
@@ -1,289 +0,0 @@
-package org.apache.maven.shared.filtering;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.Reader;
-import java.util.*;
-
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.settings.Settings;
-import org.apache.maven.shared.utils.StringUtils;
-import org.apache.maven.shared.utils.io.FileUtils;
-import org.codehaus.plexus.interpolation.*;
-import org.codehaus.plexus.interpolation.multi.MultiDelimiterStringSearchInterpolator;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
-
-class BaseFilter extends AbstractLogEnabled implements DefaultFilterInfo {
-
-
-	/**
-	 * @see org.apache.maven.shared.filtering.MavenFileFilter#getDefaultFilterWrappers(org.apache.maven.project.MavenProject, java.util.List, boolean, org.apache.maven.execution.MavenSession)
-	 * @deprecated
-	 */
-	public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final MavenProject mavenProject,
-			List<String> filters,
-			final boolean escapedBackslashesInFilePath,
-			MavenSession mavenSession )
-			throws MavenFilteringException
-	{
-		return getDefaultFilterWrappers( mavenProject, filters, escapedBackslashesInFilePath, mavenSession, null );
-	}
-
-
-	public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final MavenProject mavenProject, List<String> filters,
-			final boolean escapedBackslashesInFilePath,
-			MavenSession mavenSession,
-			MavenResourcesExecution mavenResourcesExecution )
-			throws MavenFilteringException
-	{
-
-		MavenResourcesExecution mre =
-				mavenResourcesExecution == null ? new MavenResourcesExecution() : mavenResourcesExecution.copyOf();
-
-		mre.setMavenProject( mavenProject );
-		mre.setMavenSession( mavenSession );
-		mre.setFilters( filters );
-		mre.setEscapedBackslashesInFilePath( escapedBackslashesInFilePath );
-
-		return getDefaultFilterWrappers( mre );
-
-	}
-
-	public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final AbstractMavenFilteringRequest req )
-			throws MavenFilteringException
-	{
-		// backup values
-		boolean supportMultiLineFiltering = req.isSupportMultiLineFiltering();
-
-		// compensate for null parameter value.
-		final AbstractMavenFilteringRequest request = req == null ? new MavenFileFilterRequest() : req;
-
-		request.setSupportMultiLineFiltering( supportMultiLineFiltering );
-
-		// Here we build some properties which will be used to read some properties files
-		// to interpolate the expression ${ } in this properties file
-
-		// Take a copy of filterProperties to ensure that evaluated filterTokens are not propagated
-		// to subsequent filter files. Note: this replicates current behaviour and seems to make sense.
-
-		final Properties baseProps = new Properties();
-
-		// Project properties
-		if ( request.getMavenProject() != null )
-		{
-			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
-		if ( request.getMavenSession() != null )
-		{
-			// execution properties wins
-			baseProps.putAll( request.getMavenSession().getExecutionProperties() );
-		}
-
-		// now we build properties to use for resources interpolation
-
-		final Properties filterProperties = new Properties();
-
-		File basedir = request.getMavenProject() != null ? request.getMavenProject().getBasedir() : new File( "." );
-
-		loadProperties( filterProperties, basedir, request.getFileFilters(), baseProps );
-		if ( filterProperties.size() < 1 )
-		{
-			filterProperties.putAll( baseProps );
-		}
-
-		if ( request.getMavenProject() != null )
-		{
-			if ( request.isInjectProjectBuildFilters() )
-			{
-				@SuppressWarnings( "unchecked" )
-				List<String> buildFilters = new ArrayList<String>( request.getMavenProject().getBuild().getFilters() );
-
-				// JDK-8015656: (coll) unexpected NPE from removeAll
-				if ( request.getFileFilters() != null )
-				{
-					buildFilters.removeAll( request.getFileFilters() );
-				}
-
-				loadProperties( filterProperties, basedir, buildFilters, baseProps );
-			}
-
-			// Project properties
-			filterProperties.putAll( request.getMavenProject().getProperties() == null
-					? Collections.emptyMap()
-					: request.getMavenProject().getProperties() );
-		}
-		if ( request.getMavenSession() != null )
-		{
-			// execution properties wins
-			filterProperties.putAll( request.getMavenSession().getExecutionProperties() );
-		}
-
-		if ( request.getAdditionalProperties() != null )
-		{
-			// additional properties wins
-			filterProperties.putAll( request.getAdditionalProperties() );
-		}
-
-		List<FileUtils.FilterWrapper> defaultFilterWrappers = request == null
-				? new ArrayList<FileUtils.FilterWrapper>( 1 )
-				: new ArrayList<FileUtils.FilterWrapper>( request.getDelimiters().size() + 1 );
-
-		if ( getLogger().isDebugEnabled() )
-		{
-			getLogger().debug( "properties used " + filterProperties );
-		}
-
-		final ValueSource propertiesValueSource = new PropertiesBasedValueSource( filterProperties );
-
-		if ( request != null )
-		{
-			FileUtils.FilterWrapper wrapper =
-					new Wrapper( request.getDelimiters(), request.getMavenProject(), request.getMavenSession(),
-							propertiesValueSource, request.getProjectStartExpressions(), request.getEscapeString(),
-							request.isEscapeWindowsPaths(), request.isSupportMultiLineFiltering() );
-
-			defaultFilterWrappers.add( wrapper );
-		}
-
-		return defaultFilterWrappers;
-	}
-
-	/**
-	 * default visibility only for testing reason !
-	 */
-	void loadProperties( Properties filterProperties, File basedir, List<String> propertiesFilePaths, Properties baseProps )
-			throws MavenFilteringException
-	{
-		if ( propertiesFilePaths != null )
-		{
-			Properties workProperties = new Properties();
-			workProperties.putAll( baseProps );
-
-			for ( String filterFile : propertiesFilePaths )
-			{
-				if ( StringUtils.isEmpty(filterFile) )
-				{
-					// skip empty file name
-					continue;
-				}
-				try
-				{
-					File propFile = FileUtils.resolveFile( basedir, filterFile );
-					Properties properties = PropertyUtils.loadPropertyFile( propFile, workProperties );
-					filterProperties.putAll( properties );
-					workProperties.putAll( properties );
-				}
-				catch ( IOException e )
-				{
-					throw new MavenFilteringException( "Error loading property file '" + filterFile + "'", e );
-				}
-			}
-		}
-	}
-
-	private static final class Wrapper
-			extends FileUtils.FilterWrapper
-	{
-
-		private LinkedHashSet<String> delimiters;
-
-		private MavenProject project;
-
-		private ValueSource propertiesValueSource;
-
-		private List<String> projectStartExpressions;
-
-		private String escapeString;
-
-		private boolean escapeWindowsPaths;
-
-		private final MavenSession mavenSession;
-
-		private 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;
-			this.project = project;
-			this.mavenSession = mavenSession;
-			this.propertiesValueSource = propertiesValueSource;
-			this.projectStartExpressions = projectStartExpressions;
-			this.escapeString = escapeString;
-			this.escapeWindowsPaths = escapeWindowsPaths;
-			this.supportMultiLineFiltering = supportMultiLineFiltering;
-		}
-
-		public Reader getReader( Reader reader )
-		{
-			MultiDelimiterStringSearchInterpolator interpolator = new MultiDelimiterStringSearchInterpolator();
-			interpolator.setDelimiterSpecs( delimiters );
-
-			RecursionInterceptor ri = null;
-			if ( projectStartExpressions != null && !projectStartExpressions.isEmpty() )
-			{
-				ri = new PrefixAwareRecursionInterceptor( projectStartExpressions, true );
-			}
-			else
-			{
-				ri = new SimpleRecursionInterceptor();
-			}
-
-			interpolator.addValueSource( propertiesValueSource );
-
-			if ( project != null )
-			{
-				interpolator.addValueSource( new PrefixedObjectValueSource( projectStartExpressions, project, true ) );
-			}
-
-			if ( mavenSession != null )
-			{
-				interpolator.addValueSource( new PrefixedObjectValueSource( "session", mavenSession ) );
-
-				final Settings settings = mavenSession.getSettings();
-				if ( settings != null )
-				{
-					interpolator.addValueSource( new PrefixedObjectValueSource( "settings", settings ) );
-					interpolator.addValueSource(
-							new SingleResponseValueSource( "localRepository", settings.getLocalRepository() ) );
-				}
-			}
-
-			interpolator.setEscapeString( escapeString );
-
-			if ( escapeWindowsPaths )
-			{
-				interpolator.addPostProcessor( new InterpolationPostProcessor()
-				{
-					public Object execute( String expression, Object value )
-					{
-						if ( value instanceof String )
-						{
-							return FilteringUtils.escapeWindowsPath( (String) value );
-						}
-
-						return value;
-					}
-				} );
-			}
-
-			MultiDelimiterInterpolatorFilterReaderLineEnding filterReader =
-					new MultiDelimiterInterpolatorFilterReaderLineEnding( reader, interpolator, supportMultiLineFiltering );
-			filterReader.setRecursionInterceptor( ri );
-			filterReader.setDelimiterSpecs( delimiters );
-
-			filterReader.setInterpolateWithPrefixPattern( false );
-			filterReader.setEscapeString( escapeString );
-
-			return filterReader;
-		}
-
-	}
-}
diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java b/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java
deleted file mode 100644
index 6af1786..0000000
--- a/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.apache.maven.shared.filtering;
-
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.List;
-
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.utils.io.FileUtils;
-
-public interface DefaultFilterInfo {
-	/**
-	 * Will return the default FileUtils.FilterWrappers.
-	 * <p/>
-	 * <ul>
-	 * <li>interpolate with token ${} and values from sysProps, project.properties, filters and project filters.</li>
-	 * <li>interpolate with token @ @ and values from sysProps, project.properties, filters and project filters.</li>
-	 * <li>interpolate with token ${} and values from mavenProject interpolation.</li>
-	 * <li>interpolation with token @ @ and values from mavenProject interpolation</li>
-	 * </ul>
-	 * <b>This method is now deprecated and no escape mechanism will be used.</b>
-	 *
-	 * @param mavenProject
-	 * @param filters      {@link java.util.List} of properties file
-	 * @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)}
-	 */
-	List<FileUtils.FilterWrapper> getDefaultFilterWrappers(MavenProject mavenProject, List<String> filters,
-			boolean escapedBackslashesInFilePath,
-			MavenSession mavenSession)
-			throws MavenFilteringException;
-
-	/**
-	 * @param mavenProject
-	 * @param filters
-	 * @param escapedBackslashesInFilePath
-	 * @param mavenSession
-	 * @param mavenResourcesExecution
-	 * @return {@link java.util.List} of FileUtils.FilterWrapper
-	 * @throws org.apache.maven.shared.filtering.MavenFilteringException
-	 * @since 1.0-beta-2
-	 */
-	List<FileUtils.FilterWrapper> getDefaultFilterWrappers(MavenProject mavenProject, List<String> filters,
-			boolean escapedBackslashesInFilePath,
-			MavenSession mavenSession,
-			MavenResourcesExecution mavenResourcesExecution)
-			throws MavenFilteringException;
-
-	/**
-	 * @param request
-	 * @return {@link java.util.List} of FileUtils.FilterWrapper
-	 * @throws org.apache.maven.shared.filtering.MavenFilteringException
-	 * @since 1.0-beta-3
-	 */
-	List<FileUtils.FilterWrapper> getDefaultFilterWrappers(AbstractMavenFilteringRequest request)
-			throws MavenFilteringException;
-}
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 67b8833..f1de523 100644
--- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java
+++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java
@@ -53,7 +53,7 @@
  * role-hint="default"
  */
 public class DefaultMavenFileFilter
-    extends BaseFilter
+    extends AbstractLogEnabled
     implements MavenFileFilter
 {
 
@@ -130,4 +130,275 @@
         }
 
     }
+
+    /**
+     * @see org.apache.maven.shared.filtering.MavenFileFilter#getDefaultFilterWrappers(org.apache.maven.project.MavenProject, java.util.List, boolean, org.apache.maven.execution.MavenSession)
+     * @deprecated
+     */
+    public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final MavenProject mavenProject,
+                                                                   List<String> filters,
+                                                                   final boolean escapedBackslashesInFilePath,
+                                                                   MavenSession mavenSession )
+        throws MavenFilteringException
+    {
+        return getDefaultFilterWrappers( mavenProject, filters, escapedBackslashesInFilePath, mavenSession, null );
+    }
+
+
+    public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final MavenProject mavenProject, List<String> filters,
+                                                                   final boolean escapedBackslashesInFilePath,
+                                                                   MavenSession mavenSession,
+                                                                   MavenResourcesExecution mavenResourcesExecution )
+        throws MavenFilteringException
+    {
+
+        MavenResourcesExecution mre =
+            mavenResourcesExecution == null ? new MavenResourcesExecution() : mavenResourcesExecution.copyOf();
+
+        mre.setMavenProject( mavenProject );
+        mre.setMavenSession( mavenSession );
+        mre.setFilters( filters );
+        mre.setEscapedBackslashesInFilePath( escapedBackslashesInFilePath );
+
+        return getDefaultFilterWrappers( mre );
+
+    }
+
+    public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final AbstractMavenFilteringRequest req )
+        throws MavenFilteringException
+    {
+        // backup values
+        boolean supportMultiLineFiltering = req.isSupportMultiLineFiltering();
+
+        // compensate for null parameter value.
+        final AbstractMavenFilteringRequest request = req == null ? new MavenFileFilterRequest() : req;
+
+        request.setSupportMultiLineFiltering( supportMultiLineFiltering );
+
+        // Here we build some properties which will be used to read some properties files
+        // to interpolate the expression ${ } in this properties file
+
+        // Take a copy of filterProperties to ensure that evaluated filterTokens are not propagated
+        // to subsequent filter files. Note: this replicates current behaviour and seems to make sense.
+
+        final Properties baseProps = new Properties();
+
+        // Project properties
+        if ( request.getMavenProject() != null )
+        {
+            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
+        if ( request.getMavenSession() != null )
+        {
+            // execution properties wins
+            baseProps.putAll( request.getMavenSession().getExecutionProperties() );
+        }
+
+        // now we build properties to use for resources interpolation
+
+        final Properties filterProperties = new Properties();
+
+        File basedir = request.getMavenProject() != null ? request.getMavenProject().getBasedir() : new File( "." ); 
+
+        loadProperties( filterProperties, basedir, request.getFileFilters(), baseProps );
+        if ( filterProperties.size() < 1 )
+        {
+            filterProperties.putAll( baseProps );
+        }
+
+        if ( request.getMavenProject() != null )
+        {
+            if ( request.isInjectProjectBuildFilters() )
+            {
+                @SuppressWarnings( "unchecked" )
+                List<String> buildFilters = new ArrayList<String>( request.getMavenProject().getBuild().getFilters() );
+
+                // JDK-8015656: (coll) unexpected NPE from removeAll 
+                if ( request.getFileFilters() != null )
+                {
+                    buildFilters.removeAll( request.getFileFilters() );
+                }
+
+                loadProperties( filterProperties, basedir, buildFilters, baseProps );
+            }
+
+            // Project properties
+            filterProperties.putAll( request.getMavenProject().getProperties() == null
+                                         ? Collections.emptyMap()
+                                         : request.getMavenProject().getProperties() );
+        }
+        if ( request.getMavenSession() != null )
+        {
+            // execution properties wins
+            filterProperties.putAll( request.getMavenSession().getExecutionProperties() );
+        }
+
+        if ( request.getAdditionalProperties() != null )
+        {
+            // additional properties wins
+            filterProperties.putAll( request.getAdditionalProperties() );
+        }
+
+        List<FileUtils.FilterWrapper> defaultFilterWrappers = request == null
+            ? new ArrayList<FileUtils.FilterWrapper>( 1 )
+            : new ArrayList<FileUtils.FilterWrapper>( request.getDelimiters().size() + 1 );
+
+        if ( getLogger().isDebugEnabled() )
+        {
+            getLogger().debug( "properties used " + filterProperties );
+        }
+
+        final ValueSource propertiesValueSource = new PropertiesBasedValueSource( filterProperties );
+
+        if ( request != null )
+        {
+            FileUtils.FilterWrapper wrapper =
+                new Wrapper( request.getDelimiters(), request.getMavenProject(), request.getMavenSession(),
+                             propertiesValueSource, request.getProjectStartExpressions(), request.getEscapeString(),
+                             request.isEscapeWindowsPaths(), request.isSupportMultiLineFiltering() );
+
+            defaultFilterWrappers.add( wrapper );
+        }
+
+        return defaultFilterWrappers;
+    }
+
+    /**
+     * default visibility only for testing reason !
+     */
+    void loadProperties( Properties filterProperties, File basedir, List<String> propertiesFilePaths, Properties baseProps )
+        throws MavenFilteringException
+    {
+        if ( propertiesFilePaths != null )
+        {
+            Properties workProperties = new Properties();
+            workProperties.putAll( baseProps );
+
+            for ( String filterFile : propertiesFilePaths )
+            {
+                if ( StringUtils.isEmpty( filterFile ) )
+                {
+                    // skip empty file name
+                    continue;
+                }
+                try
+                {
+                    File propFile = FileUtils.resolveFile( basedir, filterFile );
+                    Properties properties = PropertyUtils.loadPropertyFile( propFile, workProperties );
+                    filterProperties.putAll( properties );
+                    workProperties.putAll( properties );
+                }
+                catch ( IOException e )
+                {
+                    throw new MavenFilteringException( "Error loading property file '" + filterFile + "'", e );
+                }
+            }
+        }
+    }
+
+    private static final class Wrapper
+        extends FileUtils.FilterWrapper
+    {
+
+        private LinkedHashSet<String> delimiters;
+
+        private MavenProject project;
+
+        private ValueSource propertiesValueSource;
+
+        private List<String> projectStartExpressions;
+
+        private String escapeString;
+
+        private boolean escapeWindowsPaths;
+
+        private final MavenSession mavenSession;
+
+        private 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;
+            this.project = project;
+            this.mavenSession = mavenSession;
+            this.propertiesValueSource = propertiesValueSource;
+            this.projectStartExpressions = projectStartExpressions;
+            this.escapeString = escapeString;
+            this.escapeWindowsPaths = escapeWindowsPaths;
+            this.supportMultiLineFiltering = supportMultiLineFiltering;
+        }
+
+        public Reader getReader( Reader reader )
+        {
+            MultiDelimiterStringSearchInterpolator interpolator = new MultiDelimiterStringSearchInterpolator();
+            interpolator.setDelimiterSpecs( delimiters );
+
+            RecursionInterceptor ri = null;
+            if ( projectStartExpressions != null && !projectStartExpressions.isEmpty() )
+            {
+                ri = new PrefixAwareRecursionInterceptor( projectStartExpressions, true );
+            }
+            else
+            {
+                ri = new SimpleRecursionInterceptor();
+            }
+
+            interpolator.addValueSource( propertiesValueSource );
+
+            if ( project != null )
+            {
+                interpolator.addValueSource( new PrefixedObjectValueSource( projectStartExpressions, project, true ) );
+            }
+
+            if ( mavenSession != null )
+            {
+                interpolator.addValueSource( new PrefixedObjectValueSource( "session", mavenSession ) );
+
+                final Settings settings = mavenSession.getSettings();
+                if ( settings != null )
+                {
+                    interpolator.addValueSource( new PrefixedObjectValueSource( "settings", settings ) );
+                    interpolator.addValueSource(
+                        new SingleResponseValueSource( "localRepository", settings.getLocalRepository() ) );
+                }
+            }
+
+            interpolator.setEscapeString( escapeString );
+
+            if ( escapeWindowsPaths )
+            {
+                interpolator.addPostProcessor( new InterpolationPostProcessor()
+                {
+                    public Object execute( String expression, Object value )
+                    {
+                        if ( value instanceof String )
+                        {
+                            return FilteringUtils.escapeWindowsPath( (String) value );
+                        }
+
+                        return value;
+                    }
+                } );
+            }
+
+            MultiDelimiterInterpolatorFilterReaderLineEnding filterReader =
+                new MultiDelimiterInterpolatorFilterReaderLineEnding( reader, interpolator, supportMultiLineFiltering );
+            filterReader.setRecursionInterceptor( ri );
+            filterReader.setDelimiterSpecs( delimiters );
+
+            filterReader.setInterpolateWithPrefixPattern( false );
+            filterReader.setEscapeString( escapeString );
+
+            return filterReader;
+        }
+
+    }
+
 }
diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenStreamFilter.java b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenStreamFilter.java
deleted file mode 100644
index 9b74368..0000000
--- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenStreamFilter.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package org.apache.maven.shared.filtering;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.*;
-import java.util.*;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.utils.io.FileUtils.FilterWrapper;
-import org.apache.maven.shared.utils.io.IOUtil;
-import org.sonatype.plexus.build.incremental.BuildContext;
-
-/**
- * @author Olivier Lamy
- *
- * @plexus.component role="org.apache.maven.shared.filtering.MavenFileFilter"
- * role-hint="default"
- */
-public class DefaultMavenStreamFilter
-    extends BaseFilter
-    implements MavenStreamFilter
-{
-
-    /**
-     * @plexus.requirement
-     */
-    private BuildContext buildContext;
-
-    public InputStream filter( InputStream from, boolean filtering, MavenProject mavenProject, List<String> filters,
-                          boolean escapedBackslashesInFilePath, String encoding, MavenSession mavenSession )
-        throws MavenFilteringException
-    {
-        MavenResourcesExecution mre = new MavenResourcesExecution();
-        mre.setMavenProject( mavenProject );
-        mre.setFileFilters( filters );
-        mre.setEscapeWindowsPaths( escapedBackslashesInFilePath );
-        mre.setMavenSession( mavenSession );
-        mre.setInjectProjectBuildFilters( true );
-
-        List<FilterWrapper> filterWrappers = getDefaultFilterWrappers( mre );
-        return filter(from, filtering, filterWrappers, encoding);
-    }
-
-
-    public InputStream filter( MavenStreamFilterRequest mavenFileFilterRequest )
-        throws MavenFilteringException
-    {
-        List<FilterWrapper> filterWrappers = getDefaultFilterWrappers( mavenFileFilterRequest );
-
-        return filter(mavenFileFilterRequest.getFrom(),
-                mavenFileFilterRequest.isFiltering(), filterWrappers, mavenFileFilterRequest.getEncoding());
-    }
-
-
-    public InputStream filter( InputStream from,boolean filtering, List<FilterWrapper> filterWrappers,
-                          String encoding )
-        throws MavenFilteringException
-    {
-        // overwrite forced to false to preserve backward comp
-        return filter( from, filtering, filterWrappers, encoding, false );
-    }
-
-
-    public InputStream filter( InputStream from, boolean filtering, List<FilterWrapper> filterWrappers,
-                          String encoding, boolean overwrite )
-        throws MavenFilteringException
-    {
-        try
-        {
-            if ( filtering )
-            {
-                FilterWrapper[] wrappers = filterWrappers.toArray(
-                    new FilterWrapper[filterWrappers.size()] );
-                return filterWrap(from, encoding, wrappers, false);
-            }
-            else
-            {
-                return filterWrap(from, encoding, new FilterWrapper[0], overwrite);
-            }
-
-        }
-        catch ( IOException e )
-        {
-            throw new MavenFilteringException( e.getMessage(), e );
-        }
-
-    }
-
-
-    public static InputStream filterWrap(@Nonnull InputStream from, @Nullable String encoding,
-            @Nullable FilterWrapper[] wrappers, boolean overwrite)
-            throws IOException
-    {
-        if ( wrappers != null && wrappers.length > 0 )
-        {
-            // buffer so it isn't reading a byte at a time!
-            Reader fileReader = null;
-            Writer fileWriter = null;
-            try
-            {
-                if ( encoding == null || encoding.length() < 1 )
-                {
-                    fileReader = new BufferedReader( new InputStreamReader(from) );
-                    fileWriter = new FileWriter( to );
-                }
-                else
-                {
-                    FileInputStream instream = new FileInputStream( from );
-
-                    FileOutputStream outstream = new FileOutputStream( to );
-
-                    fileReader = new BufferedReader( new InputStreamReader( instream, encoding ) );
-
-                    fileWriter = new OutputStreamWriter( outstream, encoding );
-                }
-
-                Reader reader = fileReader;
-                for ( FilterWrapper wrapper : wrappers )
-                {
-                    reader = wrapper.getReader( reader );
-                }
-
-                IOUtil.copy(reader, fileWriter);
-            }
-            finally
-            {
-                IOUtil.close( fileReader );
-                IOUtil.close( fileWriter );
-            }
-        }
-        else
-        {
-            if ( to.lastModified() < from.lastModified() || overwrite )
-            {
-                filterWrap(from, to);
-            }
-        }
-    }
-
-
-}
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 b383649..dbc7bdd 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java
@@ -30,7 +30,7 @@
  * @author Olivier Lamy
  *
  */
-public interface MavenFileFilter extends DefaultFilterInfo
+public interface MavenFileFilter
 {
 
     /**
@@ -81,4 +81,51 @@
     void copyFile( File from, final File to, boolean filtering, List<FileUtils.FilterWrapper> filterWrappers,
                    String encoding, boolean overwrite )
         throws MavenFilteringException;
+
+    /**
+     * Will return the default FileUtils.FilterWrappers.
+     * <p/>
+     * <ul>
+     * <li>interpolate with token ${} and values from sysProps, project.properties, filters and project filters.</li>
+     * <li>interpolate with token @ @ and values from sysProps, project.properties, filters and project filters.</li>
+     * <li>interpolate with token ${} and values from mavenProject interpolation.</li>
+     * <li>interpolation with token @ @ and values from mavenProject interpolation</li>
+     * </ul>
+     * <b>This method is now deprecated and no escape mechanism will be used.</b>
+     *
+     * @param mavenProject
+     * @param filters      {@link List} of properties file
+     * @return {@link List} of FileUtils.FilterWrapper
+     * @deprecated use {@link #getDefaultFilterWrappers(MavenProject, List, boolean, MavenSession, MavenResourcesExecution)}
+     */
+    List<FileUtils.FilterWrapper> getDefaultFilterWrappers( MavenProject mavenProject, List<String> filters,
+                                                            boolean escapedBackslashesInFilePath,
+                                                            MavenSession mavenSession )
+        throws MavenFilteringException;
+
+    /**
+     * @param mavenProject
+     * @param filters
+     * @param escapedBackslashesInFilePath
+     * @param mavenSession
+     * @param mavenResourcesExecution
+     * @return {@link List} of FileUtils.FilterWrapper
+     * @throws MavenFilteringException
+     * @since 1.0-beta-2
+     */
+    List<FileUtils.FilterWrapper> getDefaultFilterWrappers( MavenProject mavenProject, List<String> filters,
+                                                            boolean escapedBackslashesInFilePath,
+                                                            MavenSession mavenSession,
+                                                            MavenResourcesExecution mavenResourcesExecution )
+        throws MavenFilteringException;
+
+    /**
+     * @param request
+     * @return {@link List} of FileUtils.FilterWrapper
+     * @throws MavenFilteringException
+     * @since 1.0-beta-3
+     */
+    List<FileUtils.FilterWrapper> getDefaultFilterWrappers( AbstractMavenFilteringRequest request )
+        throws MavenFilteringException;
+
 }
diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenStreamFilter.java b/src/main/java/org/apache/maven/shared/filtering/MavenStreamFilter.java
deleted file mode 100644
index a79cc2d..0000000
--- a/src/main/java/org/apache/maven/shared/filtering/MavenStreamFilter.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.apache.maven.shared.filtering;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-import java.io.InputStream;
-import java.util.List;
-
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.utils.io.FileUtils;
-
-/**
- * @author Olivier Lamy
- * @author Kristian Rosenvold
- */
-public interface MavenStreamFilter extends DefaultFilterInfo
-{
-
-    /**
-     * Will copy a file with some filtering using defaultFilterWrappers.
-     *
-     * @param source         file to copy/filter
-     * @param filtering    enable or not filering
-     * @param mavenProject the mavenproject
-     * @param filters      {@link java.util.List} of String which are path to a Property file
-     * @return an input stream that applies the filter
-     * @throws org.apache.maven.shared.filtering.MavenFilteringException
-     * @see #getDefaultFilterWrappers(org.apache.maven.project.MavenProject, java.util.List, boolean, org.apache.maven.execution.MavenSession)
-     */
-    InputStream filter(InputStream source, boolean filtering, MavenProject mavenProject, List<String> filters,
-            boolean escapedBackslashesInFilePath, String encoding, MavenSession mavenSession)
-        throws MavenFilteringException;
-
-    /**
-     * @param mavenStreamFilterRequest The filter request
-     * @throws org.apache.maven.shared.filtering.MavenFilteringException
-     * @return an input stream that applies the filter
-     * @since 1.0-beta-3
-     */
-    InputStream filter(MavenStreamFilterRequest mavenStreamFilterRequest)
-        throws MavenFilteringException;
-
-    /**
-     * @param source The source stream to filter
-     * @param filtering
-     * @param filterWrappers {@link java.util.List} of FileUtils.FilterWrapper
-     * @return an input stream that applies the filter
-     * @throws org.apache.maven.shared.filtering.MavenFilteringException
-     */
-    InputStream filter(InputStream source, boolean filtering, List<FileUtils.FilterWrapper> filterWrappers,
-            String encoding)
-        throws MavenFilteringException;
-
-
-    /**
-     * @param source The source stream to filter
-     * @param filtering
-     * @param filterWrappers
-     * @param encoding
-     * @param overwrite
-     * @throws org.apache.maven.shared.filtering.MavenFilteringException
-     * @return an input stream that applies the filter
-     * @since 1.0-beta-2
-     */
-    InputStream filter(InputStream source, boolean filtering, List<FileUtils.FilterWrapper> filterWrappers,
-            String encoding, boolean overwrite)
-        throws MavenFilteringException;
-
-}
diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenStreamFilterRequest.java b/src/main/java/org/apache/maven/shared/filtering/MavenStreamFilterRequest.java
deleted file mode 100644
index 14727aa..0000000
--- a/src/main/java/org/apache/maven/shared/filtering/MavenStreamFilterRequest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.apache.maven.shared.filtering;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-import java.io.InputStream;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.project.MavenProject;
-
-/**
- * @author Olivier Lamy
- * @since 1.0-beta-3
- */
-public class MavenStreamFilterRequest
-    extends AbstractMavenFilteringRequest
-{
-
-    private InputStream from;
-
-    private boolean filtering;
-
-    public MavenStreamFilterRequest()
-    {
-        // nothing
-    }
-
-    public MavenStreamFilterRequest(InputStream from, boolean filtering, MavenProject mavenProject,
-            List<String> filters,
-            boolean escapedBackslashesInFilePath, String encoding, MavenSession mavenSession,
-            Properties additionalProperties)
-    {
-        super( mavenProject, filters, encoding, mavenSession );
-        this.from = from;
-        this.filtering = filtering;
-        setAdditionalProperties( additionalProperties );
-        setEscapeWindowsPaths( escapedBackslashesInFilePath );
-    }
-
-
-    public InputStream getFrom()
-    {
-        return from;
-    }
-
-    public void setFrom( InputStream from )
-    {
-        this.from = from;
-    }
-
-    public boolean isFiltering()
-    {
-        return filtering;
-    }
-
-    public void setFiltering( boolean filtering )
-    {
-        this.filtering = filtering;
-    }
-
-}
