Index: contrib/analyzers/common/src/test/org/apache/lucene/analysis/reverse/TestReverseStringFilter.java
===================================================================
--- contrib/analyzers/common/src/test/org/apache/lucene/analysis/reverse/TestReverseStringFilter.java	(revision 804461)
+++ contrib/analyzers/common/src/test/org/apache/lucene/analysis/reverse/TestReverseStringFilter.java	(working copy)
@@ -42,6 +42,24 @@
     assertEquals("yad", text.term());
     assertFalse(filter.incrementToken());
   }
+  
+  public void testFilterWithMark() throws Exception {
+    TokenStream stream = new WhitespaceTokenizer(
+            new StringReader("Do have a nice day"));     // 1-4 length string
+        ReverseStringFilter filter = new ReverseStringFilter(stream, true);
+        TermAttribute text = (TermAttribute) filter.getAttribute(TermAttribute.class);
+        assertTrue(filter.incrementToken());
+        assertEquals("\u0001oD", text.term());
+        assertTrue(filter.incrementToken());
+        assertEquals("\u0001evah", text.term());
+        assertTrue(filter.incrementToken());
+        assertEquals("\u0001a", text.term());
+        assertTrue(filter.incrementToken());
+        assertEquals("\u0001ecin", text.term());
+        assertTrue(filter.incrementToken());
+        assertEquals("\u0001yad", text.term());
+        assertFalse(filter.incrementToken());
+  }
 
   public void testReverseString() throws Exception {
     assertEquals( "A", ReverseStringFilter.reverse( "A" ) );
@@ -53,5 +71,5 @@
     char[] buffer = { 'A', 'B', 'C', 'D', 'E', 'F' };
     ReverseStringFilter.reverse( buffer, 2, 3 );
     assertEquals( "ABEDCF", new String( buffer ) );
-  }
+  }  
 }
Index: contrib/analyzers/common/src/java/org/apache/lucene/analysis/reverse/ReverseStringFilter.java
===================================================================
--- contrib/analyzers/common/src/java/org/apache/lucene/analysis/reverse/ReverseStringFilter.java	(revision 804461)
+++ contrib/analyzers/common/src/java/org/apache/lucene/analysis/reverse/ReverseStringFilter.java	(working copy)
@@ -24,22 +24,41 @@
 import java.io.IOException;
 
 /**
- * Reverse token string e.g. "country" => "yrtnuoc".
+ * Reverse token string e.g. "country" => "yrtnuoc". If
+ * <code>withMark</code> is true, then tokens will be
+ * also prepended by a special marker (Unicode char. 0001),
+ * e.g. "country" => "\u0001yrtnuoc". This is useful when
+ * implementing efficient leading wildcards search.
  *
  * @version $Id$
  */
 public final class ReverseStringFilter extends TokenFilter {
 
   private TermAttribute termAtt;
+  private boolean withMark = false;
+  
+  public ReverseStringFilter(TokenStream in) {
+    this(in, false);
+  }
 
-  public ReverseStringFilter(TokenStream in) {
+  public ReverseStringFilter(TokenStream in, boolean withMark) {
     super(in);
+    this.withMark = withMark;
     termAtt = (TermAttribute) addAttribute(TermAttribute.class);
   }
 
   public boolean incrementToken() throws IOException {
     if (input.incrementToken()) {
-      reverse( termAtt.termBuffer(), termAtt.termLength() );
+      int len = termAtt.termLength();
+      if (withMark) {
+        len++;
+        termAtt.resizeTermBuffer(len);
+        termAtt.termBuffer()[len - 1] = '\u0001';
+      }
+      reverse( termAtt.termBuffer(), len );
+      if (withMark) {
+        termAtt.setTermLength(len);
+      }
       return true;
     } else {
       return false;
