diff --git a/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java b/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java
new file mode 100644
index 0000000..50a3de4
--- /dev/null
+++ b/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java
@@ -0,0 +1,166 @@
+package org.apache.maven.shared.filtering;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.maven.model.Resource;
+import org.codehaus.plexus.PlexusTestCase;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.IOUtil;
+import org.sonatype.plexus.build.incremental.ThreadBuildContext;
+import org.sonatype.plexus.build.incremental.test.TestIncrementalBuildContext;
+
+public class IncrementalResourceFilteringTest
+    extends PlexusTestCase
+{
+
+    File outputDirectory = new File( getBasedir(), "target/IncrementalResourceFilteringTest" );
+
+    String unitDirectory = getBasedir() + "/src/test/units-files/incremental";
+
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+        if ( outputDirectory.exists() )
+        {
+            FileUtils.forceDelete( outputDirectory );
+        }
+        outputDirectory.mkdirs();
+    }
+
+    public void testSimpleIncrementalFiltering()
+        throws Exception
+    {
+        // run full build first
+        filter( "time" );
+
+        assertTime( "time", "file01.txt" );
+        assertTime( "time", "file02.txt" );
+
+        // only one file is expected to change
+        HashSet changedFiles = new HashSet();
+        changedFiles.add( "file01.txt" );
+
+        TestIncrementalBuildContext ctx = new TestIncrementalBuildContext( new File(unitDirectory), changedFiles, new HashMap() );
+        ThreadBuildContext.setThreadBuildContext( ctx );
+
+        filter( "notime" );
+        assertTime( "notime", "file01.txt" );
+        assertTime( "time", "file02.txt" ); // this one is unchanged
+
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file01.txt") ) );
+
+        // one file is expected to be deleted
+        HashSet deletedFiles = new HashSet();
+        deletedFiles.add( "file01.txt" );
+
+        ctx = new TestIncrementalBuildContext( new File(unitDirectory), new HashSet(), changedFiles, new HashMap() );
+        ThreadBuildContext.setThreadBuildContext( ctx );
+
+        filter( "moretime" );
+        assertFalse( new File( outputDirectory, "file01.txt" ).exists() );
+        assertTime( "time", "file02.txt" ); // this one is unchanged
+
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file01.txt") ) );
+
+    }
+
+    public void testFilterChange()
+        throws Exception
+    {
+        // run full build first
+        filter( "time" );
+
+        // all files are reprocessed after content of filters changes 
+        HashSet changedFiles = new HashSet();
+        changedFiles.add( "filters.txt" );
+        TestIncrementalBuildContext ctx = new TestIncrementalBuildContext( new File(unitDirectory),  changedFiles, new HashMap() );
+        ThreadBuildContext.setThreadBuildContext( ctx );
+
+        filter( "notime" );
+        assertTime( "notime", "file01.txt" );
+        assertTime( "notime", "file02.txt" );
+
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file01.txt") ) );
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file02.txt") ) );
+        
+    }
+
+    public void testFilterDeleted()
+        throws Exception
+    {
+        // run full build first
+        filter( "time" );
+
+        // all files are reprocessed after content of filters changes 
+        HashSet deletedFiles = new HashSet();
+        deletedFiles.add( "filters.txt" );
+        TestIncrementalBuildContext ctx = new TestIncrementalBuildContext( new File(unitDirectory), new HashSet(), deletedFiles, new HashMap() );
+        ThreadBuildContext.setThreadBuildContext( ctx );
+
+        filter( "notime" );
+        assertTime( "notime", "file01.txt" );
+        assertTime( "notime", "file02.txt" );
+
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file01.txt") ) );
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file02.txt") ) );
+    }
+
+    private void assertTime( String time, String relpath )
+        throws IOException
+    {
+        Properties properties = new Properties();
+
+        InputStream is = new FileInputStream( new File( outputDirectory, relpath ) );
+        try
+        {
+            properties.load( is );
+        }
+        finally
+        {
+            IOUtil.close( is );
+        }
+
+        assertEquals( time, properties.getProperty( "time" ) );
+    }
+
+    private void filter( String time )
+        throws Exception, MavenFilteringException
+    {
+        File baseDir = new File( "c:\\foo\\bar" );
+        StubMavenProject mavenProject = new StubMavenProject( baseDir );
+        mavenProject.setVersion( "1.0" );
+        mavenProject.setGroupId( "org.apache" );
+        mavenProject.setName( "test project" );
+
+        Properties projectProperties = new Properties();
+        projectProperties.put( "time", time );
+        projectProperties.put( "java.version", "zloug" );
+        mavenProject.setProperties( projectProperties );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+
+        String unitFilesDir = unitDirectory + "/files";
+
+        Resource resource = new Resource();
+        List resources = new ArrayList();
+        resources.add( resource );
+        resource.setDirectory( unitFilesDir );
+        resource.setFiltering( true );
+
+        List filtersFile = new ArrayList();
+        filtersFile.add( unitDirectory + "/filters.txt" );
+
+        mavenResourcesFiltering.filterResources( resources, outputDirectory, mavenProject, "UTF-8", filtersFile,
+                                                 new ArrayList(), new StubMavenSession() );
+    }
+
+}
diff --git a/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml b/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml
new file mode 100644
index 0000000..d946539
--- /dev/null
+++ b/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml
@@ -0,0 +1,9 @@
+<component-set>
+  <components>
+    <component>
+      <role>org.sonatype.plexus.build.incremental.BuildContext</role>
+      <role-hint>default</role-hint>
+      <implementation>org.sonatype.plexus.build.incremental.ThreadBuildContext</implementation>
+    </component>
+  </components>
+</component-set>
diff --git a/src/test/units-files/incremental/files/file01.txt b/src/test/units-files/incremental/files/file01.txt
new file mode 100644
index 0000000..26f8e41
--- /dev/null
+++ b/src/test/units-files/incremental/files/file01.txt
@@ -0,0 +1,2 @@
+time=${time}
+foo=${foo}
diff --git a/src/test/units-files/incremental/files/file02.txt b/src/test/units-files/incremental/files/file02.txt
new file mode 100644
index 0000000..26f8e41
--- /dev/null
+++ b/src/test/units-files/incremental/files/file02.txt
@@ -0,0 +1,2 @@
+time=${time}
+foo=${foo}
diff --git a/src/test/units-files/incremental/filters.txt b/src/test/units-files/incremental/filters.txt
new file mode 100644
index 0000000..b2dea0b
--- /dev/null
+++ b/src/test/units-files/incremental/filters.txt
@@ -0,0 +1 @@
+foo=bar\ No newline at end of file
