Index: src/test/org/apache/lucene/util/TestStringHelper.java
===================================================================
--- src/test/org/apache/lucene/util/TestStringHelper.java	(revision 1043418)
+++ src/test/org/apache/lucene/util/TestStringHelper.java	(working copy)
@@ -1,40 +0,0 @@
-package org.apache.lucene.util;
-
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.apache.lucene.util.LuceneTestCase;
-
-public class TestStringHelper extends LuceneTestCase {
-
-
-  public void testStringDifference() {
-    String test1 = "test";
-    String test2 = "testing";
-    
-    int result = StringHelper.stringDifference(test1, test2);
-    assertTrue(result == 4);
-    
-    test2 = "foo";
-    result = StringHelper.stringDifference(test1, test2);
-    assertTrue(result == 0);
-    
-    test2 = "test";
-    result = StringHelper.stringDifference(test1, test2);
-    assertTrue(result == 4);
-  }
-}
Index: src/java/org/apache/lucene/util/StringHelper.java
===================================================================
--- src/java/org/apache/lucene/util/StringHelper.java	(revision 1043277)
+++ src/java/org/apache/lucene/util/StringHelper.java	(working copy)
@@ -51,30 +51,7 @@
         return i;
     return len;
   }
-
-  /**
-   * Compares two strings, character by character, and returns the
-   * first position where the two strings differ from one another.
-   *
-   * @param s1 The first string to compare
-   * @param s2 The second string to compare
-   * @return The first position where the two strings differ.
-   * 
-   * @deprecated This method cannot handle supplementary characters.
-   */
-  @Deprecated
-  public static final int stringDifference(String s1, String s2) {
-    int len1 = s1.length();
-    int len2 = s2.length();
-    int len = len1 < len2 ? len1 : len2;
-    for (int i = 0; i < len; i++) {
-      if (s1.charAt(i) != s2.charAt(i)) {
-	      return i;
-      }
-    }
-    return len;
-  }
-
+  
   private StringHelper() {
   }
 }
Index: backwards/src/test/org/apache/lucene/util/TestStringHelper.java
===================================================================
--- backwards/src/test/org/apache/lucene/util/TestStringHelper.java	(revision 1043418)
+++ backwards/src/test/org/apache/lucene/util/TestStringHelper.java	(working copy)
@@ -1,40 +0,0 @@
-package org.apache.lucene.util;
-
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.apache.lucene.util.LuceneTestCase;
-
-public class TestStringHelper extends LuceneTestCase {
-
-
-  public void testStringDifference() {
-    String test1 = "test";
-    String test2 = "testing";
-    
-    int result = StringHelper.stringDifference(test1, test2);
-    assertTrue(result == 4);
-    
-    test2 = "foo";
-    result = StringHelper.stringDifference(test1, test2);
-    assertTrue(result == 0);
-    
-    test2 = "test";
-    result = StringHelper.stringDifference(test1, test2);
-    assertTrue(result == 4);
-  }
-}
