Index: src/java/org/apache/lucene/analysis/snowball/SnowballFilter.java
===================================================================
--- src/java/org/apache/lucene/analysis/snowball/SnowballFilter.java	(revision 896894)
+++ src/java/org/apache/lucene/analysis/snowball/SnowballFilter.java	(working copy)
@@ -74,13 +74,16 @@
   @Override
   public final boolean incrementToken() throws IOException {
     if (input.incrementToken()) {
-      String originalTerm = termAtt.term();
-      stemmer.setCurrent(originalTerm);
+      char termBuffer[] = termAtt.termBuffer();
+      final int length = termAtt.termLength();
+      stemmer.setCurrent(termBuffer, 0, length);
       stemmer.stem();
-      String finalTerm = stemmer.getCurrent();
-      // Don't bother updating, if it is unchanged.
-      if (!originalTerm.equals(finalTerm))
-        termAtt.setTermBuffer(finalTerm);
+      final StringBuilder finalTerm = stemmer.getCurrentBuffer();
+      final int newLength = finalTerm.length();
+      if (newLength > termBuffer.length)
+        termBuffer = termAtt.resizeTermBuffer(newLength);
+      finalTerm.getChars(0, newLength, termBuffer, 0);
+      termAtt.setTermLength(newLength);
       return true;
     } else {
       return false;
Index: src/java/org/tartarus/snowball/SnowballProgram.java
===================================================================
--- src/java/org/tartarus/snowball/SnowballProgram.java	(revision 896898)
+++ src/java/org/tartarus/snowball/SnowballProgram.java	(working copy)
@@ -77,7 +77,27 @@
         current = new StringBuilder();
         return result;
     }
+    
+    /**
+     * Set the current string.
+     */
+    public void setCurrent(char text[], int offset, int length) {
+      current.setLength(0);
+      current.append(text, offset, length);
+      cursor = 0;
+      limit = current.length();
+      limit_backward = 0;
+      bra = cursor;
+      ket = limit;
+    }
 
+    /**
+     * Get the current buffer containing the stem
+     */
+    public StringBuilder getCurrentBuffer() {
+      return current;
+    }
+    
     // current string
     protected StringBuilder current;
 
