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 99593d9..6237559 100644
--- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java
+++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java
@@ -40,7 +40,7 @@
 import org.sonatype.plexus.build.incremental.BuildContext;
 
 /**
- * @author <a href="mailto:olamy@apache.org">olamy</a>
+ * @author Olivier Lamy
  * @version $Id$
  * 
  * @plexus.component role="org.apache.maven.shared.filtering.MavenResourcesFiltering"
diff --git a/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java b/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java
index 92d4e3d..241a12d 100644
--- a/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java
+++ b/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java
@@ -23,7 +23,7 @@
 import org.codehaus.plexus.util.StringUtils;
 
 /**
- * @author <a href="mailto:olamy@apache.org">olamy</a>
+ * @author Olivier Lamy
  * @author Dennis Lundberg
  * @version $Id$
  */
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 f4d77b8..90e7ed8 100644
--- a/src/main/java/org/apache/maven/shared/filtering/InterpolatorFilterReaderLineEnding.java
+++ b/src/main/java/org/apache/maven/shared/filtering/InterpolatorFilterReaderLineEnding.java
@@ -19,15 +19,16 @@
  * under the License.
  */
 
-import java.io.FilterReader;
-import java.io.IOException;
-import java.io.Reader;
-
 import org.codehaus.plexus.interpolation.InterpolationException;
 import org.codehaus.plexus.interpolation.Interpolator;
 import org.codehaus.plexus.interpolation.RecursionInterceptor;
 import org.codehaus.plexus.interpolation.SimpleRecursionInterceptor;
 
+import java.io.BufferedReader;
+import java.io.FilterReader;
+import java.io.IOException;
+import java.io.Reader;
+
 /**
  * A FilterReader implementation, that works with Interpolator interface instead of it's own interpolation
  * implementation. This implementation is heavily based on org.codehaus.plexus.util.InterpolationFilterReader.
@@ -41,83 +42,101 @@
     extends FilterReader
 {
 
-    /** Interpolator used to interpolate */
+    /**
+     * Interpolator used to interpolate
+     */
     private Interpolator interpolator;
 
     private RecursionInterceptor recursionInterceptor;
 
-    /** replacement text from a token */
+    /**
+     * replacement text from a token
+     */
     private String replaceData = null;
 
-    /** Index into replacement data */
-    private int replaceIndex = -1;
+    /**
+     * Index into replacement data
+     */
+    private int replaceIndex = 0;
 
-    /** Index into previous data */
-    private int previousIndex = -1;
-
-    /** Default begin token. */
+    /**
+     * Default begin token.
+     */
     public static final String DEFAULT_BEGIN_TOKEN = "${";
 
-    /** Default end token. */
+    /**
+     * Default end token.
+     */
     public static final String DEFAULT_END_TOKEN = "}";
-    
+
     private String beginToken;
-    
-    private String orginalBeginToken;
-    
+
     private String endToken;
-    
-    /** true by default to preserve backward comp */
+
+    /**
+     * true by default to preserve backward comp
+     */
     private boolean interpolateWithPrefixPattern = true;
 
     private String escapeString;
-    
+
     private boolean useEscape = false;
-    
-    /** if true escapeString will be preserved \{foo} -> \{foo} */
-    private boolean preserveEscapeString = false;
-    
-    private boolean supportMultiLineFiltering;
-        
+
     /**
-     * @param in reader to use
-     * @param interpolator interpolator instance to use
-     * @param beginToken start token to use
-     * @param endToken end token to use
+     * if true escapeString will be preserved \{foo} -> \{foo}
+     */
+    private boolean preserveEscapeString = false;
+
+    private boolean supportMultiLineFiltering;
+
+    /**
+     * must always be bigger than escape string plus delimiters, but doesn't need to be exact
+     */
+    private int markLength = 16;
+
+    private boolean eof = false;
+
+    /**
+     * @param in                        reader to use
+     * @param interpolator              interpolator instance to use
+     * @param beginToken                start token to use
+     * @param endToken                  end token to use
      * @param supportMultiLineFiltering If multi line filtering is allowed
      */
     public InterpolatorFilterReaderLineEnding( Reader in, Interpolator interpolator, String beginToken, String endToken,
                                                boolean supportMultiLineFiltering )
     {
         this( in, interpolator, beginToken, endToken, new SimpleRecursionInterceptor(), supportMultiLineFiltering );
-    }    
-    
+    }
+
     /**
-     * @param in reader to use
-     * @param interpolator interpolator instance to use
-     * @param beginToken start token to use
-     * @param endToken end token to use
-     * @param ri The {@link RecursionInterceptor} to use to prevent recursive expressions.
+     * @param in                        reader to use
+     * @param interpolator              interpolator instance to use
+     * @param beginToken                start token to use
+     * @param endToken                  end token to use
+     * @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,
                                                 boolean supportMultiLineFiltering )
     {
-        super( in );
+        // wrap our own buffer, so we can use mark/reset safely.
+        super( new BufferedReader( in ) );
 
         this.interpolator = interpolator;
-        
+
         this.beginToken = beginToken;
-        
+
         this.endToken = endToken;
-        
+
         recursionInterceptor = ri;
-        
-        this.orginalBeginToken = this.beginToken;
-        
+
         this.supportMultiLineFiltering = supportMultiLineFiltering;
-    }    
+
+        calculateMarkLength();
+
+    }
 
     /**
      * Skips characters. This method will block until some characters are available, an I/O error occurs, or the end of
@@ -125,8 +144,8 @@
      *
      * @param n The number of characters to skip
      * @return the number of characters actually skipped
-     * @exception IllegalArgumentException If <code>n</code> is negative.
-     * @exception IOException If an I/O error occurs
+     * @throws IllegalArgumentException If <code>n</code> is negative.
+     * @throws IOException              If an I/O error occurs
      */
     public long skip( long n )
         throws IOException
@@ -151,10 +170,10 @@
      * occurs, or the end of the stream is reached.
      *
      * @param cbuf Destination buffer to write characters to. Must not be <code>null</code>.
-     * @param off Offset at which to start storing characters.
-     * @param len Maximum number of characters to read.
+     * @param off  Offset at which to start storing characters.
+     * @param len  Maximum number of characters to read.
      * @return the number of characters read, or -1 if the end of the stream has been reached
-     * @exception IOException If an I/O error occurs
+     * @throws IOException If an I/O error occurs
      */
     public int read( char cbuf[], int off, int len )
         throws IOException
@@ -182,157 +201,162 @@
      * Returns the next character in the filtered stream, replacing tokens from the original stream.
      *
      * @return the next character in the resulting stream, or -1 if the end of the resulting stream has been reached
-     * @exception IOException if the underlying stream throws an IOException during reading
+     * @throws IOException if the underlying stream throws an IOException during reading
      */
     public int read()
         throws IOException
     {
-        if ( replaceIndex != -1 && replaceIndex < replaceData.length() )
+        if ( replaceIndex > 0 )
         {
-            int ch = replaceData.charAt( replaceIndex++ );
-            if ( replaceIndex >= replaceData.length() )
-            {
-                replaceIndex = -1;
-            }
+            return replaceData.charAt( replaceData.length() - ( replaceIndex-- ) );
+        }
+        if ( eof )
+        {
+            return -1;
+        }
+
+        in.mark( markLength );
+
+        int ch = in.read();
+        if ( ( ch == -1 ) || ( ch == '\n' && !supportMultiLineFiltering ) )
+        {
             return ch;
         }
 
-        int ch = -1;
-        if ( previousIndex != -1 && previousIndex < this.endToken.length() )
+        boolean inEscape = ( useEscape && ch == escapeString.charAt( 0 ) );
+
+        StringBuffer key = new StringBuffer();
+
+        // have we found an escape string?
+        if ( inEscape )
         {
-            ch = this.endToken.charAt( previousIndex++ );
+            for ( int i = 0; i < escapeString.length(); i++ )
+            {
+                key.append( (char) ch );
+
+                if ( ch != escapeString.charAt( i ) || ch == -1 || ( ch == '\n' && !supportMultiLineFiltering ) )
+                {
+                    // mismatch, EOF or EOL, no escape string here
+                    in.reset();
+                    inEscape = false;
+                    key.setLength( 0 );
+                    break;
+                }
+
+                ch = in.read();
+
+            }
+
         }
-        else
+
+        // have we found a delimiter?
+        boolean foundToken = false;
+        for ( int i = 0; i < beginToken.length(); i++ )
         {
+            if ( ch != beginToken.charAt( i ) || ch == -1 || ( ch == '\n' && !supportMultiLineFiltering ) )
+            {
+                // mismatch, EOF or EOL, no match
+                break;
+            }
+
+            if ( i == beginToken.length() - 1 )
+            {
+
+                foundToken = true;
+
+            }
+
             ch = in.read();
+
         }
-        
-        if ( ch == '\n' && !supportMultiLineFiltering )
+
+        in.reset();
+        in.skip( key.length() );
+        ch = in.read();
+
+        // escape means no luck, prevent parsing of the escaped character, and return
+        if ( inEscape )
         {
-            previousIndex = -1;
-            return ch;
-        }        
-        
-        if ( ch == this.beginToken.charAt( 0 ) || ( useEscape && ch == this.orginalBeginToken.charAt( 0 ) ) )
-        {
-            StringBuffer key = new StringBuffer( );
+
+            if ( beginToken != null )
+            {
+                if ( !preserveEscapeString )
+                {
+                    key.setLength( 0 );
+                }
+            }
 
             key.append( (char) ch );
 
-            int beginTokenMatchPos = 1;
+            replaceData = key.toString();
+            replaceIndex = key.length();
 
-            do
+            return read();
+
+        }
+
+        // no match means no luck, reset and return
+        if ( !foundToken )
+        {
+
+            in.reset();
+            return in.read();
+
+        }
+
+        // we're committed, find the end token, EOL or EOF
+
+        key.append( beginToken );
+        in.reset();
+        in.skip( beginToken.length() );
+        ch = in.read();
+
+        int end = endToken.length();
+        do
+        {
+            if ( ch == -1 )
             {
-                if ( previousIndex != -1 && previousIndex < this.endToken.length() )
-                {
-                    ch = this.endToken.charAt( previousIndex++ );
-                }
-                else
-                {
-                    ch = in.read();
-                }
-                if ( ch != -1 && ( ch != '\n' && !supportMultiLineFiltering ) )
-                {
-                    key.append( (char) ch );
-                    if ( ( beginTokenMatchPos < this.beginToken.length() )
-                        && ( ch != this.beginToken.charAt( beginTokenMatchPos++ ) )
-                        && ( useEscape && this.orginalBeginToken.length() > ( beginTokenMatchPos - 1 )
-                        && ch != this.orginalBeginToken.charAt( beginTokenMatchPos - 1 ) ) )
-                    {
-                        ch = -1; // not really EOF but to trigger code below
-                        break;
-                    }
-                }
-                else
+                break;
+            }
+            else if ( ch == '\n' && !supportMultiLineFiltering )
+            {
+                // EOL
+                key.append( (char) ch );
+                break;
+            }
+
+            key.append( (char) ch );
+
+            if ( ch == this.endToken.charAt( end - 1 ) )
+            {
+                end--;
+                if ( end == 0 )
                 {
                     break;
                 }
-                // MSHARED-81 olamy : we must take care of token with length 1, escaping and same char : \@foo@
-                // here ch == endToken == beginToken -> not going to next char : bad :-)
-                if ( useEscape
-                    && this.orginalBeginToken == this.endToken && key.toString().startsWith( this.beginToken ) )
-                {
-                    ch = in.read();
-                    key.append( (char) ch );
-                }
             }
-            while ( ch != this.endToken.charAt( 0 ) );
-
-            // now test endToken
-            if ( ch != -1 && this.endToken.length() > 1 )
+            else
             {
-                int endTokenMatchPos = 1;
-
-                do
-                {
-                    if ( previousIndex != -1 && previousIndex < this.endToken.length() )
-                    {
-                        ch = this.endToken.charAt( previousIndex++ );
-                    }
-                    else
-                    {
-                        ch = in.read();
-                    }
-
-                    if ( ch != -1 )
-                    {
-                        key.append( (char) ch );
-
-                        if ( ch != this.endToken.charAt( endTokenMatchPos++ ) )
-                        {
-                            ch = -1; // not really EOF but to trigger code below
-                            break;
-                        }
-
-                    }
-                    else
-                    {
-                        break;
-                    }
-                }
-                while ( endTokenMatchPos < this.endToken.length() );
+                end = endToken.length();
             }
 
-            // There is nothing left to read so we have the situation where the begin/end token
-            // are in fact the same and as there is nothing left to read we have got ourselves
-            // end of a token boundary so let it pass through.
-            if ( ch == -1 || ( ch == '\n' && !supportMultiLineFiltering ) )
-            {
-                replaceData = key.toString();
-                replaceIndex = 1;
-                return replaceData.charAt( 0 );
-            }
+            ch = in.read();
+        }
+        while ( true );
 
-            String value = null;
+        // found endtoken? interpolate our key resolved above
+        String value = null;
+        if ( end == 0 )
+        {
             try
             {
-                boolean escapeFound = false;
-                if ( useEscape )
+                if ( interpolateWithPrefixPattern )
                 {
-                    if ( key.toString().startsWith( escapeString + orginalBeginToken ) )
-                    {
-                        String keyStr = key.toString();
-                        if ( !preserveEscapeString )
-                        {
-                            value = keyStr.substring( escapeString.length(), keyStr.length() );
-                        }
-                        else
-                        {
-                            value = keyStr;
-                        }
-                        escapeFound = true;
-                    }
+                    value = interpolator.interpolate( key.toString(), "", recursionInterceptor );
                 }
-                if ( !escapeFound )
+                else
                 {
-                    if ( interpolateWithPrefixPattern )
-                    {
-                        value = interpolator.interpolate( key.toString(), "", recursionInterceptor );
-                    }
-                    else
-                    {
-                        value = interpolator.interpolate( key.toString(), recursionInterceptor );
-                    }
+                    value = interpolator.interpolate( key.toString(), recursionInterceptor );
                 }
             }
             catch ( InterpolationException e )
@@ -342,26 +366,26 @@
 
                 throw error;
             }
-
-            if ( value != null )
-            {
-                if ( value.length() != 0 )
-                {
-                    replaceData = value;
-                    replaceIndex = 0;
-                }
-                return read();
-            }
-            else
-            {
-                previousIndex = 0;
-                replaceData = key.substring( 0, key.length() - this.endToken.length() );
-                replaceIndex = 0;
-                return this.beginToken.charAt( 0 );
-            }
         }
 
-        return ch;
+        // write away the value if present, otherwise the key unmodified
+        if ( value != null )
+        {
+            replaceData = value;
+            replaceIndex = value.length();
+        }
+        else
+        {
+            replaceData = key.toString();
+            replaceIndex = key.length();
+        }
+
+        if ( ch == -1 )
+        {
+            eof = true;
+        }
+        return read();
+
     }
 
     public boolean isInterpolateWithPrefixPattern()
@@ -373,6 +397,7 @@
     {
         this.interpolateWithPrefixPattern = interpolateWithPrefixPattern;
     }
+
     public String getEscapeString()
     {
         return escapeString;
@@ -384,9 +409,8 @@
         if ( escapeString != null && escapeString.length() >= 1 )
         {
             this.escapeString = escapeString;
-            this.orginalBeginToken = beginToken;
-            this.beginToken = escapeString + beginToken;
             this.useEscape = escapeString != null && escapeString.length() >= 1;
+            calculateMarkLength();
         }
     }
 
@@ -410,4 +434,26 @@
         this.recursionInterceptor = recursionInterceptor;
         return this;
     }
+
+    private void calculateMarkLength()
+    {
+        markLength = 16;
+
+        if ( escapeString != null )
+        {
+            markLength += escapeString.length();
+        }
+
+        if ( beginToken != null )
+        {
+            markLength += beginToken.length();
+        }
+
+        if ( endToken != null )
+        {
+            markLength += endToken.length();
+        }
+
+    }
+
 }
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 fd2c9ad..fdbfc86 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java
@@ -27,7 +27,7 @@
 import java.util.List;
 
 /**
- * @author <a href="mailto:olamy@apache.org">olamy</a>
+ * @author Olivier Lamy
  * @version $Id$
  */
 public interface MavenFileFilter
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 212fdec..2d26712 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenFileFilterRequest.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenFileFilterRequest.java
@@ -27,7 +27,7 @@
 import org.apache.maven.project.MavenProject;
 
 /**
- * @author <a href="mailto:olamy@apache">olamy</a>
+ * @author Olivier Lamy
  * @since 1.0-beta-3
  */
 public class MavenFileFilterRequest
diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenFilteringException.java b/src/main/java/org/apache/maven/shared/filtering/MavenFilteringException.java
index 45f7f54..5e61769 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenFilteringException.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenFilteringException.java
@@ -20,7 +20,7 @@
  */
 
 /**
- * @author <a href="mailto:olamy@apache.org">olamy</a>
+ * @author Olivier Lamy
  * @version $Id$
  */
 public class MavenFilteringException
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 eb966af..5ad3453 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java
@@ -36,7 +36,7 @@
 /**
  * A bean to configure a resources filtering execution.
  *
- * @author <a href="mailto:olamy@apache.org">olamy</a>
+ * @author Olivier Lamy
  * @version $Id$
  */
 public class MavenResourcesExecution
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 bb5f59f..97685b8 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MavenResourcesFiltering.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MavenResourcesFiltering.java
@@ -26,7 +26,7 @@
 import org.apache.maven.project.MavenProject;
 
 /**
- * @author <a href="mailto:olamy@apache.org">olamy</a>
+ * @author Olivier Lamy
  * @version $Id$
  */
 public interface MavenResourcesFiltering
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 0cd8676..ce06a4f 100644
--- a/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java
+++ b/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java
@@ -19,6 +19,13 @@
  * under the License.
  */
 
+import org.codehaus.plexus.interpolation.InterpolationException;
+import org.codehaus.plexus.interpolation.Interpolator;
+import org.codehaus.plexus.interpolation.RecursionInterceptor;
+import org.codehaus.plexus.interpolation.SimpleRecursionInterceptor;
+import org.codehaus.plexus.interpolation.multi.DelimiterSpecification;
+
+import java.io.BufferedReader;
 import java.io.FilterReader;
 import java.io.IOException;
 import java.io.Reader;
@@ -26,12 +33,6 @@
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 
-import org.codehaus.plexus.interpolation.InterpolationException;
-import org.codehaus.plexus.interpolation.Interpolator;
-import org.codehaus.plexus.interpolation.RecursionInterceptor;
-import org.codehaus.plexus.interpolation.SimpleRecursionInterceptor;
-import org.codehaus.plexus.interpolation.multi.DelimiterSpecification;
-
 /**
  * A FilterReader implementation, that works with Interpolator interface instead of it's own interpolation
  * implementation. This implementation is heavily based on org.codehaus.plexus.util.InterpolationFilterReader.
@@ -45,55 +46,67 @@
     extends FilterReader
 {
 
-    /** Interpolator used to interpolate */
+    /**
+     * Interpolator used to interpolate
+     */
     private Interpolator interpolator;
 
     private RecursionInterceptor recursionInterceptor;
 
-    /** replacement text from a token */
+    /**
+     * replacement text from a token
+     */
     private String replaceData = null;
 
-    /** Index into replacement data */
-    private int replaceIndex = -1;
+    /**
+     * Index into replacement data
+     */
+    private int replaceIndex = 0;
 
-    /** Index into previous data */
-    private int previousIndex = -1;
-
-    /** Default begin token. */
+    /**
+     * Default begin token.
+     */
     public static final String DEFAULT_BEGIN_TOKEN = "${";
 
-    /** Default end token. */
+    /**
+     * Default end token.
+     */
     public static final String DEFAULT_END_TOKEN = "}";
-    
-    /** true by default to preserve backward comp */
+
+    /**
+     * true by default to preserve backward comp
+     */
     private boolean interpolateWithPrefixPattern = true;
 
     private String escapeString;
-    
+
     private boolean useEscape = false;
-    
-    /** if true escapeString will be preserved \{foo} -> \{foo} */
+
+    /**
+     * if true escapeString will be preserved \{foo} -> \{foo}
+     */
     private boolean preserveEscapeString = false;
-    
+
     private LinkedHashSet delimiters = new LinkedHashSet();
-    
-    private DelimiterSpecification currentSpec;
 
     private String beginToken;
 
-    private String originalBeginToken;
-
     private String endToken;
-    
+
     private boolean supportMultiLineFiltering;
-    
-    private int preserveChar = -1;
-    
+
+    /**
+     * must always be bigger than escape string plus delimiters, but doesn't need to be exact
+     */
+    private int markLength = 16;
+
+    private boolean eof = false;
+
     /**
      * This constructor uses default begin token ${ and default end token }.
      *
-     * @param in reader to use
-     * @param interpolator interpolator instance to use
+     * @param in                        reader to use
+     * @param interpolator              interpolator instance to use
      * @param supportMultiLineFiltering If multi line filtering is allowed
      */
     public MultiDelimiterInterpolatorFilterReaderLineEnding( Reader in, Interpolator interpolator,
@@ -101,37 +114,41 @@
     {
         this( in, interpolator, new SimpleRecursionInterceptor(), supportMultiLineFiltering );
     }
-    
+
     /**
-     * @param in reader to use
-     * @param interpolator interpolator instance to use
-     * @param ri The {@link RecursionInterceptor} to use to prevent recursive expressions.
+     * @param in                        reader to use
+     * @param interpolator              interpolator instance to use
+     * @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,
                                                              RecursionInterceptor ri,
                                                              boolean supportMultiLineFiltering )
     {
-        super( in );
+        // wrap our own buffer, so we can use mark/reset safely.
+        super( new BufferedReader( in ) );
 
         this.interpolator = interpolator;
-        
+
         // always cache answers, since we'll be sending in pure expressions, not mixed text.
         this.interpolator.setCacheAnswers( true );
-        
-        recursionInterceptor = ri;
-        
-        delimiters.add( DelimiterSpecification.DEFAULT_SPEC );
-        
-        this.supportMultiLineFiltering = supportMultiLineFiltering;
-    }    
 
-    
+        recursionInterceptor = ri;
+
+        delimiters.add( DelimiterSpecification.DEFAULT_SPEC );
+
+        this.supportMultiLineFiltering = supportMultiLineFiltering;
+
+        calculateMarkLength();
+
+    }
+
+
     public boolean removeDelimiterSpec( String delimiterSpec )
     {
         return delimiters.remove( DelimiterSpecification.parse( delimiterSpec ) );
     }
-    
+
     public MultiDelimiterInterpolatorFilterReaderLineEnding setDelimiterSpecs( HashSet specs )
     {
         delimiters.clear();
@@ -139,19 +156,20 @@
         {
             String spec = (String) it.next();
             delimiters.add( DelimiterSpecification.parse( spec ) );
+            markLength += spec.length() * 2;
         }
-        
+
         return this;
     }
-    
+
     /**
      * Skips characters. This method will block until some characters are available, an I/O error occurs, or the end of
      * the stream is reached.
      *
      * @param n The number of characters to skip
      * @return the number of characters actually skipped
-     * @exception IllegalArgumentException If <code>n</code> is negative.
-     * @exception IOException If an I/O error occurs
+     * @throws IllegalArgumentException If <code>n</code> is negative.
+     * @throws IOException              If an I/O error occurs
      */
     public long skip( long n )
         throws IOException
@@ -176,10 +194,10 @@
      * occurs, or the end of the stream is reached.
      *
      * @param cbuf Destination buffer to write characters to. Must not be <code>null</code>.
-     * @param off Offset at which to start storing characters.
-     * @param len Maximum number of characters to read.
+     * @param off  Offset at which to start storing characters.
+     * @param len  Maximum number of characters to read.
      * @return the number of characters read, or -1 if the end of the stream has been reached
-     * @exception IOException If an I/O error occurs
+     * @throws IOException If an I/O error occurs
      */
     public int read( char cbuf[], int off, int len )
         throws IOException
@@ -207,205 +225,183 @@
      * Returns the next character in the filtered stream, replacing tokens from the original stream.
      *
      * @return the next character in the resulting stream, or -1 if the end of the resulting stream has been reached
-     * @exception IOException if the underlying stream throws an IOException during reading
+     * @throws IOException if the underlying stream throws an IOException during reading
      */
     public int read()
         throws IOException
     {
-        if ( replaceIndex != -1 && replaceIndex < replaceData.length() )
+        if ( replaceIndex > 0 )
         {
-            int ch = replaceData.charAt( replaceIndex++ );
-            if ( replaceIndex >= replaceData.length() )
-            {
-                replaceIndex = -1;
-            }
-            return ch;
+            return replaceData.charAt( replaceData.length() - ( replaceIndex-- ) );
         }
-        if ( preserveChar >= 0 )
+        if ( eof )
         {
-            int copy = preserveChar;
-            preserveChar = -1;
-            replaceIndex = -1;
-            return copy;
+            return -1;
         }
 
-        int ch = -1;
-        if ( previousIndex != -1 && previousIndex < this.endToken.length() )
+        in.mark( markLength );
+
+        int ch = in.read();
+        if ( ( ch == -1 ) || ( ch == '\n' && !supportMultiLineFiltering ) )
         {
-            ch = this.endToken.charAt( previousIndex++ );
-        }
-        else
-        {
-            ch = in.read();
-        }
-        if ( ch == '\n' && !supportMultiLineFiltering )
-        {
-            previousIndex = -1;
             return ch;
         }
-        boolean inEscape = false;
-        
-        if ( ( inEscape = ( useEscape && ch == escapeString.charAt( 0 ) ) ) || reselectDelimiterSpec( ch ) )
+
+        boolean inEscape = ( useEscape && ch == escapeString.charAt( 0 ) );
+
+        StringBuffer key = new StringBuffer();
+
+        // have we found an escape string?
+        if ( inEscape )
         {
-            StringBuffer key = new StringBuffer( );
+            for ( int i = 0; i < escapeString.length(); i++ )
+            {
+                key.append( (char) ch );
+
+                if ( ch != escapeString.charAt( i ) || ch == -1 || ( ch == '\n' && !supportMultiLineFiltering ) )
+                {
+                    // mismatch, EOF or EOL, no escape string here
+                    in.reset();
+                    inEscape = false;
+                    key.setLength( 0 );
+                    break;
+                }
+
+                ch = in.read();
+
+            }
+
+        }
+
+        // have we found a delimiter?
+        int max = 0;
+        for ( Iterator it = delimiters.iterator(); it.hasNext(); )
+        {
+            DelimiterSpecification spec = (DelimiterSpecification) it.next();
+            String begin = spec.getBegin();
+
+            // longest match wins
+            if ( begin.length() < max )
+            {
+                continue;
+            }
+
+            for ( int i = 0; i < begin.length(); i++ )
+            {
+                if ( ch != begin.charAt( i ) || ch == -1 || ( ch == '\n' && !supportMultiLineFiltering ) )
+                {
+                    // mismatch, EOF or EOL, no match
+                    break;
+                }
+
+                if ( i == begin.length() - 1 )
+                {
+
+                    beginToken = spec.getBegin();
+                    endToken = spec.getEnd();
+
+                }
+
+                ch = in.read();
+
+            }
+
+            in.reset();
+            in.skip( key.length() );
+            ch = in.read();
+
+        }
+
+        // escape means no luck, prevent parsing of the escaped character, and return
+        if ( inEscape )
+        {
+
+            if ( beginToken != null )
+            {
+                if ( !preserveEscapeString )
+                {
+                    key.setLength( 0 );
+                }
+            }
+
+            beginToken = null;
+            endToken = null;
 
             key.append( (char) ch );
-            
-            // this will happen when we're using an escape string, and ONLY then.
-            boolean atEnd = false;
 
-            if ( inEscape )
+            replaceData = key.toString();
+            replaceIndex = key.length();
+
+            return read();
+
+        }
+
+        // no match means no luck, reset and return
+        if ( beginToken == null || beginToken.length() == 0 || endToken == null || endToken.length() == 0 )
+        {
+
+            in.reset();
+            return in.read();
+
+        }
+
+        // we're committed, find the end token, EOL or EOF
+
+        key.append( beginToken );
+        in.reset();
+        in.skip( beginToken.length() );
+        ch = in.read();
+
+        int end = endToken.length();
+        do
+        {
+            if ( ch == -1 )
             {
-                for ( int i = 0; i < escapeString.length() - 1; i++ )
-                {
-                    ch = in.read();
-                    if ( ch == -1 || ( ch == '\n' && !supportMultiLineFiltering ) )
-                    {
-                        atEnd = true;
-                        break;
-                    }
-                    
-                    key.append( (char) ch );
-                }
-                
-                if ( !atEnd )
-                {
-                    ch = in.read();
-                    if ( !reselectDelimiterSpec( ch ) )
-                    {
-                        // here we are after the escape but didn't found the a startToken
-                        // but we have read this means it will be removed
-                        // so we preserve it
-                        replaceData = key.toString();
-                        replaceIndex = 1;
-                        preserveChar = ch;
-                        return replaceData.charAt( 0 );
-                    }
-                    else
-                    {
-                        key.append( (char) ch );
-                    }
-                }
+                break;
+            }
+            else if ( ch == '\n' && !supportMultiLineFiltering )
+            {
+                // EOL
+                key.append( (char) ch );
+                break;
             }
 
-            int beginTokenMatchPos = 1;
-            do
+            key.append( (char) ch );
+
+            if ( ch == this.endToken.charAt( end - 1 ) )
             {
-                if ( atEnd )
-                {
-                    // didn't finish reading the escape string.
-                    break;
-                }
-                
-                if ( previousIndex != -1 && previousIndex < this.endToken.length() )
-                {
-                    ch = this.endToken.charAt( previousIndex++ );
-                }
-                else
-                {
-                    ch = in.read();
-                }
-                if ( ch == '\n' && !supportMultiLineFiltering )
-                {
-                    // EOL 
-                    key.append( (char) ch );
-                    break;
-                }                
-                if ( ch != -1 )
-                {
-                    key.append( (char) ch );
-                    if ( ( beginTokenMatchPos < this.originalBeginToken.length() )
-                        && ( ch != this.originalBeginToken.charAt( beginTokenMatchPos ) ) )
-                    {
-                        ch = -1; // not really EOF but to trigger code below
-                        break;
-                    }
-                }
-                else
+                end--;
+                if ( end == 0 )
                 {
                     break;
                 }
-                
-                beginTokenMatchPos++;
             }
-            while ( ch != this.endToken.charAt( 0 ) );
-
-            // now test endToken
-            if ( ch != -1 && ( ch != '\n' && !supportMultiLineFiltering ) && this.endToken.length() > 1 )
+            else
             {
-                int endTokenMatchPos = 1;
-
-                do
-                {
-                    if ( previousIndex != -1 && previousIndex < this.endToken.length() )
-                    {
-                        ch = this.endToken.charAt( previousIndex++ );
-                    }
-                    else
-                    {
-                        ch = in.read();
-                    }
-
-                    if ( ch != -1 )
-                    {
-                        key.append( (char) ch );
-
-                        if ( ch != this.endToken.charAt( endTokenMatchPos++ )
-                            || ( ch != '\n' && !supportMultiLineFiltering ) )
-                        {
-                            ch = -1; // not really EOF but to trigger code below
-                            break;
-                        }
-
-                    }
-                    else
-                    {
-                        break;
-                    }
-                }
-                while ( endTokenMatchPos < this.endToken.length() );
+                end = endToken.length();
             }
 
-            // There is nothing left to read so we have the situation where the begin/end token
-            // are in fact the same and as there is nothing left to read we have got ourselves
-            // end of a token boundary so let it pass through.
-            if ( ch == -1 || ( ch == '\n' && !supportMultiLineFiltering ) )
-            {
-                replaceData = key.toString();
-                replaceIndex = 1;
-                return replaceData.charAt( 0 );
-            }
+            ch = in.read();
+        }
+        while ( true );
 
-            String value = null;
+        // reset back to no tokens
+        beginToken = null;
+        endToken = null;
+
+        // found endtoken? interpolate our key resolved above
+        String value = null;
+        if ( end == 0 )
+        {
             try
             {
-                boolean escapeFound = false;
-                if ( useEscape )
+                if ( interpolateWithPrefixPattern )
                 {
-                    if ( key.toString().startsWith( beginToken ) )
-                    {
-                        String keyStr = key.toString();
-                        if ( !preserveEscapeString )
-                        {
-                            value = keyStr.substring( escapeString.length(), keyStr.length() );
-                        }
-                        else
-                        {
-                            value = keyStr;
-                        }
-                        escapeFound = true;
-                    }
+                    value = interpolator.interpolate( key.toString(), "", recursionInterceptor );
                 }
-                if ( !escapeFound )
+                else
                 {
-                    if ( interpolateWithPrefixPattern )
-                    {
-                        value = interpolator.interpolate( key.toString(), "", recursionInterceptor );
-                    }
-                    else
-                    {
-                        value = interpolator.interpolate( key.toString(), recursionInterceptor );
-                    }
+                    value = interpolator.interpolate( key.toString(), recursionInterceptor );
                 }
             }
             catch ( InterpolationException e )
@@ -415,45 +411,26 @@
 
                 throw error;
             }
-
-            if ( value != null )
-            {
-                if ( value.length() != 0 )
-                {
-                    replaceData = value;
-                    replaceIndex = 0;
-                }
-                return read();
-            }
-            else
-            {
-                previousIndex = 0;
-                replaceData = key.substring( 0, key.length() - this.endToken.length() );
-                replaceIndex = 0;
-                return this.beginToken.charAt( 0 );
-            }
         }
 
-        return ch;
-    }
-
-    private boolean reselectDelimiterSpec( int ch )
-    {
-        for ( Iterator it = delimiters.iterator(); it.hasNext(); )
+        // write away the value if present, otherwise the key unmodified
+        if ( value != null )
         {
-            DelimiterSpecification spec = (DelimiterSpecification) it.next();
-            if ( ch == spec.getBegin().charAt( 0 ) )
-            {
-                currentSpec = spec;
-                originalBeginToken = currentSpec.getBegin();
-                beginToken = useEscape ? escapeString + originalBeginToken : originalBeginToken;
-                endToken = currentSpec.getEnd();
-                
-                return true;
-            }
+            replaceData = value;
+            replaceIndex = value.length();
         }
-        
-        return false;
+        else
+        {
+            replaceData = key.toString();
+            replaceIndex = key.length();
+        }
+
+        if ( ch == -1 )
+        {
+            eof = true;
+        }
+        return read();
+
     }
 
     public boolean isInterpolateWithPrefixPattern()
@@ -465,6 +442,7 @@
     {
         this.interpolateWithPrefixPattern = interpolateWithPrefixPattern;
     }
+
     public String getEscapeString()
     {
         return escapeString;
@@ -477,6 +455,7 @@
         {
             this.escapeString = escapeString;
             this.useEscape = escapeString != null && escapeString.length() >= 1;
+            calculateMarkLength();
         }
     }
 
@@ -495,9 +474,31 @@
         return recursionInterceptor;
     }
 
-    public MultiDelimiterInterpolatorFilterReaderLineEnding setRecursionInterceptor( RecursionInterceptor recursionInterceptor )
+    public MultiDelimiterInterpolatorFilterReaderLineEnding setRecursionInterceptor(
+        RecursionInterceptor recursionInterceptor )
     {
         this.recursionInterceptor = recursionInterceptor;
         return this;
     }
+
+    private void calculateMarkLength()
+    {
+        markLength = 16;
+
+        if ( escapeString != null )
+        {
+
+            markLength += escapeString.length();
+
+        }
+        for ( Iterator it = delimiters.iterator(); it.hasNext(); )
+        {
+
+            DelimiterSpecification spec = (DelimiterSpecification) it.next();
+            markLength += spec.getBegin().length();
+            markLength += spec.getEnd().length();
+
+        }
+    }
+
 }
diff --git a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java
index 1dce4c9..4d26036 100644
--- a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java
+++ b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java
@@ -19,15 +19,6 @@
  * under the License.
  */
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Properties;
-
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Resource;
 import org.apache.maven.settings.Settings;
@@ -37,10 +28,19 @@
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.IOUtil;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+
 /**
- * @author <a href="mailto:olamy@apache.org">olamy</a>
- * @since 1.0-beta-1
+ * @author Olivier Lamy
  * @version $Id$
+ * @since 1.0-beta-1
  */
 public class DefaultMavenResourcesFilteringTest
     extends PlexusTestCase
@@ -72,7 +72,8 @@
         projectProperties.put( "foo", "bar" );
         projectProperties.put( "java.version", "zloug" );
         mavenProject.setProperties( projectProperties );
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering";
         File initialImageFile = new File( unitFilesDir, "happy_duke.gif" );
@@ -84,7 +85,8 @@
         resource.setFiltering( true );
 
         List filtersFile = new ArrayList();
-        filtersFile.add( getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
+        filtersFile.add(
+            getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
 
         List nonFilteredFileExtensions = Collections.singletonList( "gif" );
 
@@ -100,7 +102,8 @@
         File baseDir = new File( "c:\\foo\\bar" );
         StubMavenProject mavenProject = new StubMavenProject( baseDir );
 
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         String unitFilesDir = getBasedir() + "/src/test/units-files/session-filtering";
 
@@ -111,16 +114,16 @@
         resource.setFiltering( true );
 
         List filtersFile = new ArrayList();
-        
+
         Settings settings = new Settings();
-        settings.setLocalRepository( System.getProperty( "localRepository", System.getProperty( "maven.repo.local",
-                                                                                                "/path/to/local/repo" ) ) );
-        
+        settings.setLocalRepository(
+            System.getProperty( "localRepository", System.getProperty( "maven.repo.local", "/path/to/local/repo" ) ) );
+
         MavenSession session = new StubMavenSession( settings );
-        
+
         mavenResourcesFiltering.filterResources( resources, outputDirectory, mavenProject, "UTF-8", filtersFile,
                                                  Collections.EMPTY_LIST, session );
-        
+
         Properties result = new Properties();
         FileInputStream in = null;
         try
@@ -132,7 +135,7 @@
         {
             IOUtil.close( in );
         }
-        
+
         assertEquals( settings.getLocalRepository(), result.getProperty( "session.settings.local.repo" ) );
         assertEquals( settings.getLocalRepository(), result.getProperty( "settings.local.repo" ) );
         assertEquals( settings.getLocalRepository(), result.getProperty( "local.repo" ) );
@@ -151,7 +154,8 @@
         projectProperties.put( "foo", "bar" );
         projectProperties.put( "java.version", "zloug" );
         mavenProject.setProperties( projectProperties );
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering";
         File initialImageFile = new File( unitFilesDir, "happy_duke.gif" );
@@ -163,13 +167,13 @@
         resource.setFiltering( true );
 
         List filtersFile = new ArrayList();
-        filtersFile.add( getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
+        filtersFile.add(
+            getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
 
         List nonFilteredFileExtensions = Collections.singletonList( "gif" );
-        MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( resources, outputDirectory, mavenProject,
-                                                                                       "UTF-8", filtersFile,
-                                                                                       nonFilteredFileExtensions,
-                                                                                       new StubMavenSession() );
+        MavenResourcesExecution mavenResourcesExecution =
+            new MavenResourcesExecution( resources, outputDirectory, mavenProject, "UTF-8", filtersFile,
+                                         nonFilteredFileExtensions, new StubMavenSession() );
         mavenResourcesExecution.setEscapeString( "\\" );
         mavenResourcesFiltering.filterResources( mavenResourcesExecution );
         assertFiltering( baseDir, initialImageFile, true, false );
@@ -188,7 +192,8 @@
         projectProperties.put( "foo", "bar" );
         projectProperties.put( "java.version", "zloug" );
         mavenProject.setProperties( projectProperties );
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering";
         File initialImageFile = new File( unitFilesDir, "happy_duke.gif" );
@@ -200,23 +205,24 @@
         resource.setFiltering( true );
 
         List filtersFile = new ArrayList();
-        filtersFile.add( getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
+        filtersFile.add(
+            getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
 
         List nonFilteredFileExtensions = Collections.singletonList( "gif" );
         Properties additionalProperties = new Properties();
         additionalProperties.put( "greatDate", "1973-06-14" );
         additionalProperties.put( "pom.version", "99.00" );
-        MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( resources, outputDirectory, mavenProject,
-                                                                                       "UTF-8", filtersFile,
-                                                                                       nonFilteredFileExtensions,
-                                                                                       new StubMavenSession() );
+        MavenResourcesExecution mavenResourcesExecution =
+            new MavenResourcesExecution( resources, outputDirectory, mavenProject, "UTF-8", filtersFile,
+                                         nonFilteredFileExtensions, new StubMavenSession() );
         mavenResourcesExecution.setAdditionalProperties( additionalProperties );
         mavenResourcesExecution.setEscapeString( "\\" );
         mavenResourcesFiltering.filterResources( mavenResourcesExecution );
         assertFiltering( baseDir, initialImageFile, true, true );
     }
 
-    private void assertFiltering( File baseDir, File initialImageFile, boolean escapeTest, boolean additionnalProperties )
+    private void assertFiltering( File baseDir, File initialImageFile, boolean escapeTest,
+                                  boolean additionnalProperties )
         throws Exception
     {
         assertEquals( 7, outputDirectory.listFiles().length );
@@ -300,7 +306,8 @@
         projectProperties.put( "foo", "bar" );
         projectProperties.put( "java.version", "zloug" );
         mavenProject.setProperties( projectProperties );
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering";
         File initialImageFile = new File( unitFilesDir, "happy_duke.gif" );
@@ -312,20 +319,23 @@
         resource.setFiltering( true );
 
         List filtersFile = new ArrayList();
-        filtersFile.add( getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
+        filtersFile.add(
+            getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
 
         List nonFilteredFileExtensions = Collections.singletonList( "gif" );
 
-        MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( resources, outputDirectory, mavenProject,
-                                                                                       "UTF-8", null, nonFilteredFileExtensions,
-                                                                                       new StubMavenSession() );
+        MavenResourcesExecution mavenResourcesExecution =
+            new MavenResourcesExecution( resources, outputDirectory, mavenProject, "UTF-8", null,
+                                         nonFilteredFileExtensions, new StubMavenSession() );
 
-        ValueSource vs = new PrefixedObjectValueSource( mavenResourcesExecution.getProjectStartExpressions(), mavenProject, true );
+        ValueSource vs =
+            new PrefixedObjectValueSource( mavenResourcesExecution.getProjectStartExpressions(), mavenProject, true );
 
         mavenResourcesExecution.addFilerWrapperWithEscaping( vs, "@", "@", null );
 
         mavenResourcesFiltering.filterResources( mavenResourcesExecution );
-        Properties result = PropertyUtils.loadPropertyFile( new File( outputDirectory, "maven-resources-filtering.txt" ), null );
+        Properties result =
+            PropertyUtils.loadPropertyFile( new File( outputDirectory, "maven-resources-filtering.txt" ), null );
         assertFalse( result.isEmpty() );
         assertEquals( mavenProject.getName(), result.get( "pomName" ) );
         assertFiltering( baseDir, initialImageFile, false, false );
@@ -338,7 +348,8 @@
         mavenProject.setVersion( "1.0" );
         mavenProject.setGroupId( "org.apache" );
 
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering";
         File initialImageFile = new File( unitFilesDir, "happy_duke.gif" );
@@ -349,11 +360,12 @@
 
         resource.setDirectory( unitFilesDir );
         resource.setFiltering( false );
-        mavenResourcesFiltering.filterResources( resources, outputDirectory, mavenProject, "UTF-8", null, Collections.EMPTY_LIST,
-                                                 new StubMavenSession() );
+        mavenResourcesFiltering.filterResources( resources, outputDirectory, mavenProject, "UTF-8", null,
+                                                 Collections.EMPTY_LIST, new StubMavenSession() );
 
         assertEquals( 7, outputDirectory.listFiles().length );
-        Properties result = PropertyUtils.loadPropertyFile( new File( outputDirectory, "empty-maven-resources-filtering.txt" ), null );
+        Properties result =
+            PropertyUtils.loadPropertyFile( new File( outputDirectory, "empty-maven-resources-filtering.txt" ), null );
         assertTrue( result.isEmpty() );
 
         result = PropertyUtils.loadPropertyFile( new File( outputDirectory, "maven-resources-filtering.txt" ), null );
@@ -414,7 +426,8 @@
         mavenProject.setGroupId( "org.apache" );
         mavenProject.setName( "test project" );
 
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering";
 
@@ -426,11 +439,12 @@
         resource.addInclude( "includ*" );
 
         List filtersFile = new ArrayList();
-        filtersFile.add( getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
+        filtersFile.add(
+            getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
 
-        MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( resources, outputDirectory, mavenProject,
-                                                                                       "UTF-8", filtersFile, Collections.EMPTY_LIST,
-                                                                                       new StubMavenSession() );
+        MavenResourcesExecution mavenResourcesExecution =
+            new MavenResourcesExecution( resources, outputDirectory, mavenProject, "UTF-8", filtersFile,
+                                         Collections.EMPTY_LIST, new StubMavenSession() );
         mavenResourcesFiltering.filterResources( mavenResourcesExecution );
 
         File[] files = outputDirectory.listFiles();
@@ -448,7 +462,8 @@
         mavenProject.setGroupId( "org.apache" );
         mavenProject.setName( "test project" );
 
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering";
 
@@ -461,11 +476,12 @@
         resource.addInclude( "**/includ*" );
 
         List filtersFile = new ArrayList();
-        filtersFile.add( getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
+        filtersFile.add(
+            getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
 
-        MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( resources, outputDirectory, mavenProject,
-                                                                                       "UTF-8", filtersFile, Collections.EMPTY_LIST,
-                                                                                       new StubMavenSession() );
+        MavenResourcesExecution mavenResourcesExecution =
+            new MavenResourcesExecution( resources, outputDirectory, mavenProject, "UTF-8", filtersFile,
+                                         Collections.EMPTY_LIST, new StubMavenSession() );
         mavenResourcesFiltering.filterResources( mavenResourcesExecution );
 
         File[] files = outputDirectory.listFiles();
@@ -487,7 +503,8 @@
         mavenProject.setGroupId( "org.apache" );
         mavenProject.setName( "test project" );
 
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering";
 
@@ -500,11 +517,12 @@
         resource.addExclude( "**/excludedir/**" );
 
         List filtersFile = new ArrayList();
-        filtersFile.add( getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
+        filtersFile.add(
+            getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
 
-        MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( resources, outputDirectory, mavenProject,
-                                                                                       "UTF-8", filtersFile, Collections.EMPTY_LIST,
-                                                                                       new StubMavenSession() );
+        MavenResourcesExecution mavenResourcesExecution =
+            new MavenResourcesExecution( resources, outputDirectory, mavenProject, "UTF-8", filtersFile,
+                                         Collections.EMPTY_LIST, new StubMavenSession() );
         mavenResourcesFiltering.filterResources( mavenResourcesExecution );
 
         File[] files = outputDirectory.listFiles();
@@ -531,7 +549,8 @@
         mavenProject.setGroupId( "org.apache" );
         mavenProject.setName( "test project" );
 
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering";
 
@@ -555,11 +574,12 @@
             FileUtils.cleanDirectory( targetPathFile );
         }
         List filtersFile = new ArrayList();
-        filtersFile.add( getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
+        filtersFile.add(
+            getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
 
-        MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( resources, outputDirectory, mavenProject,
-                                                                                       "UTF-8", filtersFile, Collections.EMPTY_LIST,
-                                                                                       new StubMavenSession() );
+        MavenResourcesExecution mavenResourcesExecution =
+            new MavenResourcesExecution( resources, outputDirectory, mavenProject, "UTF-8", filtersFile,
+                                         Collections.EMPTY_LIST, new StubMavenSession() );
         mavenResourcesFiltering.filterResources( mavenResourcesExecution );
 
         File[] files = targetPathFile.listFiles();
@@ -576,7 +596,8 @@
         mavenProject.setGroupId( "org.apache" );
         mavenProject.setName( "test project" );
 
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering";
 
@@ -588,11 +609,12 @@
         resource.addInclude( "includ*" );
         resource.setTargetPath( "testTargetPath" );
         List filtersFile = new ArrayList();
-        filtersFile.add( getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
+        filtersFile.add(
+            getBasedir() + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" );
 
-        MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( resources, outputDirectory, mavenProject,
-                                                                                       "UTF-8", filtersFile, Collections.EMPTY_LIST,
-                                                                                       new StubMavenSession() );
+        MavenResourcesExecution mavenResourcesExecution =
+            new MavenResourcesExecution( resources, outputDirectory, mavenProject, "UTF-8", filtersFile,
+                                         Collections.EMPTY_LIST, new StubMavenSession() );
         mavenResourcesFiltering.filterResources( mavenResourcesExecution );
 
         File targetPathFile = new File( outputDirectory, "testTargetPath" );
@@ -611,19 +633,20 @@
         mavenProject.setGroupId( "org.apache" );
         mavenProject.setName( "test project" );
 
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         List resources = new ArrayList();
         resources.add( new Resource()
         {
             {
                 setDirectory( getBasedir() + "/src/test/units-files/includeEmptyDirs" );
-                setExcludes( Arrays.asList( new String[] { "**/.gitignore" } ) );
+                setExcludes( Arrays.asList( new String[]{ "**/.gitignore" } ) );
             }
         } );
-        MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( resources, outputDirectory, mavenProject,
-                                                                                       "UTF-8", Collections.EMPTY_LIST,
-                                                                                       Collections.EMPTY_LIST, new StubMavenSession() );
+        MavenResourcesExecution mavenResourcesExecution =
+            new MavenResourcesExecution( resources, outputDirectory, mavenProject, "UTF-8", Collections.EMPTY_LIST,
+                                         Collections.EMPTY_LIST, new StubMavenSession() );
         mavenResourcesExecution.setIncludeEmptyDirs( true );
         mavenResourcesFiltering.filterResources( mavenResourcesExecution );
 
@@ -674,7 +697,8 @@
         mavenProject.addProperty( "foo", "this is foo" );
         mavenProject.addProperty( "bar", "this is bar" );
 
-        MavenResourcesFiltering mavenResourcesFiltering = (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
 
         List resources = new ArrayList();
         resources.add( new Resource()
@@ -692,9 +716,9 @@
             }
         } );
         File output = new File( outputDirectory, "MSHARED-81" );
-        MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( resources, output, mavenProject, "UTF-8",
-                                                                                       Collections.EMPTY_LIST, Collections.EMPTY_LIST,
-                                                                                       new StubMavenSession() );
+        MavenResourcesExecution mavenResourcesExecution =
+            new MavenResourcesExecution( resources, output, mavenProject, "UTF-8", Collections.EMPTY_LIST,
+                                         Collections.EMPTY_LIST, new StubMavenSession() );
         mavenResourcesExecution.setIncludeEmptyDirs( true );
         mavenResourcesExecution.setEscapeString( "\\" );
 
@@ -702,20 +726,85 @@
 
         Properties filteredResult = PropertyUtils.loadPropertyFile( new File( output, "filtered.properties" ), null );
 
-        Properties expectedFilteredResult = PropertyUtils.loadPropertyFile( new File( getBasedir()
-            + "/src/test/units-files/MSHARED-81", "expected-filtered.properties" ), null );
+        Properties expectedFilteredResult = PropertyUtils.loadPropertyFile(
+            new File( getBasedir() + "/src/test/units-files/MSHARED-81", "expected-filtered.properties" ), null );
 
-        System.out.println( "Expected:\n" );
+        System.out.println( "\nExpected:\n" );
         expectedFilteredResult.list( System.out );
         System.out.println( "\n\n\nGot:\n" );
         filteredResult.list( System.out );
 
         assertEquals( expectedFilteredResult, filteredResult );
 
-        Properties nonFilteredResult = PropertyUtils.loadPropertyFile( new File( output, "unfiltered.properties" ), null );
+        Properties nonFilteredResult =
+            PropertyUtils.loadPropertyFile( new File( output, "unfiltered.properties" ), null );
 
-        Properties expectedNonFilteredResult = PropertyUtils.loadPropertyFile( new File( getBasedir()
-            + "/src/test/units-files/MSHARED-81/resources", "unfiltered.properties" ), null );
+        Properties expectedNonFilteredResult = PropertyUtils.loadPropertyFile(
+            new File( getBasedir() + "/src/test/units-files/MSHARED-81/resources", "unfiltered.properties" ), null );
+
+        assertTrue( nonFilteredResult.equals( expectedNonFilteredResult ) );
+    }
+
+    /**
+     * unit test for edge cases : http://jira.codehaus.org/browse/MSHARED-228
+     */
+    public void testEdgeCases()
+        throws Exception
+    {
+        StubMavenProject mavenProject = new StubMavenProject( new File( "/foo/bar" ) );
+
+        mavenProject.setVersion( "1.0" );
+
+        mavenProject.addProperty( "escaped", "this is escaped" );
+        mavenProject.addProperty( "escaped.at", "this is escaped.at" );
+        mavenProject.addProperty( "foo", "this is foo" );
+        mavenProject.addProperty( "bar", "this is bar" );
+        mavenProject.addProperty( "domain", "this.is.domain.com" );
+
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+
+        List resources = new ArrayList();
+        resources.add( new Resource()
+        {
+            {
+                setDirectory( getBasedir() + "/src/test/units-files/edge-cases/resources" );
+                setFiltering( false );
+            }
+        } );
+        resources.add( new Resource()
+        {
+            {
+                setDirectory( getBasedir() + "/src/test/units-files/edge-cases/filtered" );
+                setFiltering( true );
+            }
+        } );
+        File output = new File( outputDirectory, "edge-cases" );
+        MavenResourcesExecution mavenResourcesExecution =
+            new MavenResourcesExecution( resources, output, mavenProject, "UTF-8", Collections.EMPTY_LIST,
+                                         Collections.EMPTY_LIST, new StubMavenSession() );
+        mavenResourcesExecution.setIncludeEmptyDirs( true );
+        mavenResourcesExecution.setEscapeString( "\\" );
+
+        mavenResourcesFiltering.filterResources( mavenResourcesExecution );
+
+        Properties filteredResult = PropertyUtils.loadPropertyFile( new File( output, "filtered.properties" ), null );
+
+        Properties expectedFilteredResult = PropertyUtils.loadPropertyFile(
+            new File( getBasedir() + "/src/test/units-files/edge-cases", "expected-filtered.properties" ), null );
+
+        System.out.println( "\nExpected:\n" );
+        expectedFilteredResult.list( System.out );
+        System.out.println( "\n\n\nGot:\n" );
+        filteredResult.list( System.out );
+
+        assertEquals( expectedFilteredResult, filteredResult );
+
+        Properties nonFilteredResult =
+            PropertyUtils.loadPropertyFile( new File( output, "unfiltered.properties" ), null );
+
+        Properties expectedNonFilteredResult = PropertyUtils.loadPropertyFile(
+            new File( getBasedir() + "/src/test/units-files/edge-cases/resources", "unfiltered.properties" ), null );
 
         assertTrue( nonFilteredResult.equals( expectedNonFilteredResult ) );
     }
diff --git a/src/test/units-files/edge-cases/expected-filtered.properties b/src/test/units-files/edge-cases/expected-filtered.properties
new file mode 100644
index 0000000..edec588
--- /dev/null
+++ b/src/test/units-files/edge-cases/expected-filtered.properties
@@ -0,0 +1,25 @@
+#/*
+# * 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.
+# */
+edge.escape.token.hanging=user@this.is.domain.com with extra stuff
+edge.escape.token.start=$1.0$1.0
+edge.escape.property=${wrapped:1.0}
+edge.escape.token.twice=${1.0${1.0
+edge.escape.not.a.property=${wrapped:${not.a.property}}
+edge.escape.hanging=\\
+edge.token.hanging=${
diff --git a/src/test/units-files/edge-cases/filtered/filtered.properties b/src/test/units-files/edge-cases/filtered/filtered.properties
new file mode 100644
index 0000000..85a0d54
--- /dev/null
+++ b/src/test/units-files/edge-cases/filtered/filtered.properties
@@ -0,0 +1,25 @@
+#/*
+# * 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.
+# */
+edge.escape.property=\${wrapped:${version}}
+edge.escape.not.a.property=\${wrapped:${not.a.property}}
+edge.escape.token.start=\$${version}\$${version}
+edge.escape.token.twice=\${${version}\${${version}
+edge.escape.token.hanging=user\@@domain@ with extra stuff
+edge.escape.hanging=\\
+edge.token.hanging=${
diff --git a/src/test/units-files/edge-cases/resources/unfiltered.properties b/src/test/units-files/edge-cases/resources/unfiltered.properties
new file mode 100644
index 0000000..85a0d54
--- /dev/null
+++ b/src/test/units-files/edge-cases/resources/unfiltered.properties
@@ -0,0 +1,25 @@
+#/*
+# * 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.
+# */
+edge.escape.property=\${wrapped:${version}}
+edge.escape.not.a.property=\${wrapped:${not.a.property}}
+edge.escape.token.start=\$${version}\$${version}
+edge.escape.token.twice=\${${version}\${${version}
+edge.escape.token.hanging=user\@@domain@ with extra stuff
+edge.escape.hanging=\\
+edge.token.hanging=${
diff --git a/src/test/units-files/escape-remove-char/content.xml b/src/test/units-files/escape-remove-char/content.xml
index 3721d78..8478130 100644
--- a/src/test/units-files/escape-remove-char/content.xml
+++ b/src/test/units-files/escape-remove-char/content.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<root>
-    <!-- This is a comment ... until filtering ... -->
-   <broken-tag>Why are my !\${\}\! static.content broken if the escapeString occure ?!?</broken-tag>
-   <broken-tag>Content with replacement: ${replaceThis} !</broken-tag>
-   <broken-tag>Content with escaped replacement: Do not !${replaceThis} !</broken-tag>
-</root>
+<?xml version="1.0" encoding="UTF-8"?>
+<root>
+    <!-- This is a comment ... until filtering ... -->
+   <broken-tag>Why is my !\${\}\! static.content broken if the escapeString occurs ?!?</broken-tag>
+   <broken-tag>Content with replacement: ${replaceThis} !</broken-tag>
+   <broken-tag>Content with escaped replacement: Do not !${replaceThis} !</broken-tag>
+</root>
