Index: contrib/aphone/src/test/org/apache/lucene/aphone/TestAphone.java
===================================================================
--- contrib/aphone/src/test/org/apache/lucene/aphone/TestAphone.java	(revision 0)
+++ contrib/aphone/src/test/org/apache/lucene/aphone/TestAphone.java	(revision 0)
@@ -0,0 +1,38 @@
+package org.apache.lucene.aphone;
+
+/**
+ * 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 junit.framework.TestCase;
+
+/**
+ *
+ * @Author Mathieu Lecarme
+ */
+public class TestAphone extends TestCase {
+
+  public void testFrench() {
+    AphoneFr fr = new AphoneFr();
+    assertEquals("LUSEME", fr.toPhone("Lucene"));
+  }
+
+  public void testEnglish() {
+    AphoneEn en = new AphoneEn();
+    assertEquals("LSN", en.toPhone("Lucene"));
+  }
+
+}
\ No newline at end of file
Index: contrib/aphone/src/java/org/apache/lucene/aphone/AphoneFr.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneFr.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneFr.java	(revision 0)
@@ -0,0 +1,498 @@
+package org.apache.lucene.aphone;
+
+/**
+ * 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.
+ */
+
+/**
+ * String to phone conversion
+ * @Author Mathieu Lecarme
+ */
+public class AphoneFr implements Aphone{
+  StringBuffer phone;
+  String word;
+  boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    this.phone = new StringBuffer();
+    this.word = word.toUpperCase();
+    this.starting = true;
+    while( this.word.length() > 0 ) {
+      this.eat();
+      this.starting = false;
+    }
+    return this.phone.toString();
+  }
+
+  private void append(String letter) {
+    if (letter.length() > 0) {
+      if (this.phone.length() > 0 && letter.charAt(0) == this.phone.charAt(this.phone.length() - 1)) {
+        if (letter.length() > 1)
+          this.phone.append(letter.substring(1));
+      } else
+      this.phone.append(letter);
+    }
+  }
+
+  private boolean eat() {
+    if( word.length() >= 3 && word.substring(0, 3).equals("AIX")  && word.length() == 3) {
+      this.append("E");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AI") ) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("AN")  && "AEUIO".indexOf(word.charAt(2)) != -1 ) {
+      this.append("AM");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AN") ) {
+      this.append("A");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("AMM") ) {
+      this.append("AM");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("AM")  && "AEUIO".indexOf(word.charAt(2)) != -1 ) {
+      this.append("AM");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AM") ) {
+      this.append("A");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("AUD")  && word.length() == 3) {
+      this.append("O");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("AUX")  && word.length() == 3) {
+      this.append("O");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AU") ) {
+      this.append("O");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("A") ) {
+      this.append("A");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Â") ) {
+      this.append("A");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("À") ) {
+      this.append("A");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("BB") ) {
+      this.append("P");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("B") ) {
+      this.append("P");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ç") ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("C")  && "EI".indexOf(word.charAt(1)) != -1 ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("CU")  && "EI".indexOf(word.charAt(2)) != -1 ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("CC")  && "EI".indexOf(word.charAt(2)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CC") ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CH") ) {
+      this.append("CH");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("C") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("DD") ) {
+      this.append("T");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("D") ) {
+      this.append("T");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 8 && word.substring(0, 8).equals("EMMENTAL") ) {
+      this.append("EMATAL");
+      this.word = this.word.substring(8);
+      return true;
+    }
+    if( word.length() >= 9 && word.substring(0, 9).equals("EMMENTHAL") ) {
+      this.append("EMATAL");
+      this.word = this.word.substring(9);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EM")  && "AEIOU".indexOf(word.charAt(2)) != -1 ) {
+      this.append("EM");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EM") ) {
+      this.append("A");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ET")  && word.length() == 2) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("EUX")  && word.length() == 3) {
+      this.append("E");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EU") ) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EN")  && "AEUIO".indexOf(word.charAt(2)) != -1 ) {
+      this.append("EM");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EN") ) {
+      this.append("A");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ER")  && word.length() == 2) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EO") ) {
+      this.append("O");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("EAUX")  && word.length() == 4) {
+      this.append("O");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("EAU") ) {
+      this.append("O");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("E") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("È") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("É") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ê") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("F") ) {
+      this.append("F");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("G")  && "EIY".indexOf(word.charAt(1)) != -1 ) {
+      this.append("J");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("GU")  && "EIY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("G");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("G") ) {
+      this.append("G");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("H") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("I") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Î") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("J") ) {
+      this.append("J");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("KS") ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("K") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("LL") ) {
+      this.append("L");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("L") ) {
+      this.append("L");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("MM") ) {
+      this.append("M");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("M") ) {
+      this.append("M");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("NN") ) {
+      this.append("M");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("N") ) {
+      this.append("M");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("OEU") ) {
+      this.append("E");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("OUX")  && word.length() == 3) {
+      this.append("U");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("OU") ) {
+      this.append("U");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("OÙ") ) {
+      this.append("U");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("O") ) {
+      this.append("O");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ô") ) {
+      this.append("O");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("PP") ) {
+      this.append("P");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("PH") ) {
+      this.append("F");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("P") ) {
+      this.append("P");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("QU") ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Q") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("RIX")  && word.length() == 3) {
+      this.append("RI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("RR") ) {
+      this.append("R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("R") ) {
+      this.append("R");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("S")  && word.length() == 1) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SS") ) {
+      this.append("S");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("S") ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("TT") ) {
+      this.append("T");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("T") ) {
+      this.append("T");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("U") ) {
+      this.append("U");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ù") ) {
+      this.append("U");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Û") ) {
+      this.append("U");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("V") ) {
+      this.append("V");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("W") ) {
+      this.append("W");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("X") ) {
+      this.append("X");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Y")  && "AEOU".indexOf(word.charAt(1)) != -1 ) {
+      this.append("IL");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Y") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ZZ") ) {
+      this.append("S");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Z") ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+
+    this.word = this.word.substring(1);
+    return false;
+  }
+  /**
+   * Simple test
+   */
+  public static void main(String[] args) {
+    AphoneFr aphone = new AphoneFr();
+    for(int i = 0; i < args.length; i++) {
+      System.out.println(aphone.toPhone(args[i]));
+    }
+  }
+}
Index: contrib/aphone/src/java/org/apache/lucene/aphone/AphoneWa.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneWa.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneWa.java	(revision 0)
@@ -0,0 +1,818 @@
+package org.apache.lucene.aphone;
+
+/**
+ * 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.
+ */
+
+/**
+ * String to phone conversion
+ * @Author Mathieu Lecarme
+ */
+public class AphoneWa{
+  StringBuffer phone;
+  String word;
+  boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    this.phone = new StringBuffer();
+    this.word = word.toUpperCase();
+    this.starting = true;
+    while( this.word.length() > 0 ) {
+      this.eat();
+      this.starting = false;
+    }
+    return this.phone.toString();
+  }
+
+  private void append(String letter) {
+    if (letter.length() > 0) {
+      if (this.phone.length() > 0 && letter.charAt(0) == this.phone.charAt(this.phone.length() - 1)) {
+        if (letter.length() > 1)
+          this.phone.append(letter.substring(1));
+      } else
+      this.phone.append(letter);
+    }
+  }
+
+  private boolean eat() {
+    if( word.length() >= 2 && word.substring(0, 2).equals("CH") ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CW") ) {
+      this.append("KW");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CE")  && word.length() == 2) {
+      this.append("S");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("CES")  && word.length() == 3) {
+      this.append("S");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("C")  && "EÉÈÊÎ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("CI")  && "AEOUÅÉ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("CY")  && "AEOUÅÉ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("C")  && word.length() == 1) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("C") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ç") ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("GNGN") ) {
+      this.append("NN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("GN.GN") ) {
+      this.append("NN");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("GN") ) {
+      this.append("NY");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("GUE")  && word.length() == 3) {
+      this.append("K");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("GUES")  && word.length() == 4) {
+      this.append("K");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("GU")  && "EIÉÈÊÎ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("G");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("G")  && "EIÉÈÊÎ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("J");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("G")  && word.length() == 1) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("G") ) {
+      this.append("G");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("DE")  && word.length() == 2) {
+      this.append("T");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("DES")  && word.length() == 3) {
+      this.append("T");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("DJN") ) {
+      this.append("NN");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("DJV") ) {
+      this.append("TXV");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("DJE")  && word.length() == 3) {
+      this.append("TX");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("DJES")  && word.length() == 4) {
+      this.append("TX");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("DJ")  && word.length() == 2) {
+      this.append("TX");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("DJ") ) {
+      this.append("DJ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("DM") ) {
+      this.append("NM");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("DN") ) {
+      this.append("NN");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("D")  && word.length() == 1) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("D") ) {
+      this.append("D");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("TCHF") ) {
+      this.append("TXV");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("TCH") ) {
+      this.append("TX");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("TE")  && word.length() == 2) {
+      this.append("T");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("TES")  && word.length() == 3) {
+      this.append("T");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("T")  && word.length() == 1) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("T") ) {
+      this.append("T");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AE") ) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AE") ) {
+      this.append("A");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AI") ) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("AS")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("AZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AU") ) {
+      this.append("A");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AU") ) {
+      this.append("O");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("A") ) {
+      this.append("A");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ÂS")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("AZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Â") ) {
+      this.append("A");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ÅS")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("AZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Å") ) {
+      this.append("A");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Å") ) {
+      this.append("O");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("À") ) {
+      this.append("A");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EA") ) {
+      this.append("YA");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EA") ) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ES")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("EZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EY") ) {
+      this.append("IY");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EY") ) {
+      this.append("EY");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("E")  && word.length() == 1) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ER")  && word.length() == 2) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ES")  && word.length() == 2) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("E") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ÉS")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("EZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ÉN") ) {
+      this.append("IN");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("É") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ÈS")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("EZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("È") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ÊS")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("EZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ÊY") ) {
+      this.append("EY");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ê") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ë") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("I")  && "AEOUÅÉ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Y");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("IS")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("IZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("I") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ÎS")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("IZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Î") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("OEN") ) {
+      this.append("ON");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("OEN") ) {
+      this.append("WIN");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("OE") ) {
+      this.append("EU");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("OE") ) {
+      this.append("WE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("OI") ) {
+      this.append("WE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("OI") ) {
+      this.append("WA");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("OI") ) {
+      this.append("O");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("OS")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("OZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("O")  && "UÛ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("O");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("O") ) {
+      this.append("O");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ÔS")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("OZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ô") ) {
+      this.append("O");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ö") ) {
+      this.append("O");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("US")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("UZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("U") ) {
+      this.append("U");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ÛS")  && "AEIOUYÂÅÉÈÊÎÔÛ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("UZ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Û") ) {
+      this.append("U");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ù") ) {
+      this.append("U");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("SCH") ) {
+      this.append("SK");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("SCH") ) {
+      this.append("X");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("SCH") ) {
+      this.append("H");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SE")  && word.length() == 2) {
+      this.append("S");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("SES")  && word.length() == 3) {
+      this.append("S");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SH") ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SH") ) {
+      this.append("S");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("S")  && "IY".indexOf(word.charAt(1)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("SSE")  && word.length() == 3) {
+      this.append("S");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("SSES")  && word.length() == 4) {
+      this.append("S");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SS") ) {
+      this.append("S");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("S")  && word.length() == 1) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("S") ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("QU")  && "EIÈÉÊÎ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("QU")  && "AOUÅ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("KW");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("QW") ) {
+      this.append("KW");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("BE")  && word.length() == 2) {
+      this.append("P");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("BES")  && word.length() == 3) {
+      this.append("P");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("B")  && word.length() == 1) {
+      this.append("P");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("B") ) {
+      this.append("B");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("FWAI") ) {
+      this.append("FE");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("F") ) {
+      this.append("F");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("H") ) {
+      this.append("H");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("H") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("JHE")  && word.length() == 3) {
+      this.append("X");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("JHE")  && word.length() == 3) {
+      this.append("H");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("JHES")  && word.length() == 4) {
+      this.append("X");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("JHES")  && word.length() == 4) {
+      this.append("H");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("JH")  && word.length() == 2) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("JH")  && word.length() == 2) {
+      this.append("H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("JH") ) {
+      this.append("J");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("JH") ) {
+      this.append("H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("JE")  && word.length() == 2) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("JES")  && word.length() == 3) {
+      this.append("X");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("J")  && word.length() == 1) {
+      this.append("X");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("J") ) {
+      this.append("J");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("K") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("L") ) {
+      this.append("L");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("MWAISS") ) {
+      this.append("MES");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("MWAIST") ) {
+      this.append("MEST");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("M") ) {
+      this.append("M");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("N") ) {
+      this.append("N");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("PH") ) {
+      this.append("F");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("P") ) {
+      this.append("P");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("R") ) {
+      this.append("R");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("VGN") ) {
+      this.append("MNY");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("VN") ) {
+      this.append("MN");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("VE")  && word.length() == 2) {
+      this.append("F");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("VES")  && word.length() == 3) {
+      this.append("F");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("V")  && word.length() == 1) {
+      this.append("F");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("V") ) {
+      this.append("V");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("W") ) {
+      this.append("W");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("XH") ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("XH") ) {
+      this.append("H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Y") ) {
+      this.append("Y");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ZE")  && word.length() == 2) {
+      this.append("S");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ZES")  && word.length() == 3) {
+      this.append("S");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Z")  && word.length() == 1) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Z") ) {
+      this.append("Z");
+      this.word = this.word.substring(1);
+      return true;
+    }
+
+    this.word = this.word.substring(1);
+    return false;
+  }
+  /**
+   * Simple test
+   */
+  public static void main(String[] args) {
+    AphoneWa aphone = new AphoneWa();
+    for(int i = 0; i < args.length; i++) {
+      System.out.println(aphone.toPhone(args[i]));
+    }
+  }
+}
Index: contrib/aphone/src/java/org/apache/lucene/aphone/AphoneSv.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneSv.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneSv.java	(revision 0)
@@ -0,0 +1,533 @@
+package org.apache.lucene.aphone;
+
+/**
+ * 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.
+ */
+
+/**
+ * String to phone conversion
+ * @Author Mathieu Lecarme
+ */
+public class AphoneSv{
+  StringBuffer phone;
+  String word;
+  boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    this.phone = new StringBuffer();
+    this.word = word.toUpperCase();
+    this.starting = true;
+    while( this.word.length() > 0 ) {
+      this.eat();
+      this.starting = false;
+    }
+    return this.phone.toString();
+  }
+
+  private void append(String letter) {
+    if (letter.length() > 0) {
+      if (this.phone.length() > 0 && letter.charAt(0) == this.phone.charAt(this.phone.length() - 1)) {
+        if (letter.length() > 1)
+          this.phone.append(letter.substring(1));
+      } else
+      this.phone.append(letter);
+    }
+  }
+
+  private boolean eat() {
+    if( word.length() >= 1 && word.substring(0, 1).equals("&") ) {
+      this.append("&");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("@") ) {
+      this.append("@");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 3).equals("ANG")  && "EIYÄÖ".indexOf(word.charAt(3)) != -1 ) {
+      this.append("ANI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("AGNO") ) {
+      this.append("AKNO");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("AG")  && "IE".indexOf(word.charAt(2)) != -1 ) {
+      this.append("AK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("A") ) {
+      this.append("A");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("BB") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("B") ) {
+      this.append("P");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("CCO") ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CC") ) {
+      this.append("KS");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CH") ) {
+      this.append("&");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CK") ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("C")  && "EIYÄÖ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("C") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("DJ")  && "UÄÖ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("I");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("DD") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("D") ) {
+      this.append("T");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EG")  && "IE".indexOf(word.charAt(2)) != -1 ) {
+      this.append("EK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("E") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("É") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("FF") ) {
+      this.append("F");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("F") ) {
+      this.append("F");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("G")  && "EIYÄÖ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("GG") ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("GN") ) {
+      this.append("@N");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("G") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 1).equals("H")  && "AOUÅEIYÄÖ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("H");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("H")  && "AUOÅEIYÄÖ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("HJ") ) {
+      this.append("I");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("H") ) {
+      this.append("H");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("IG")  && "IE".indexOf(word.charAt(2)) != -1 ) {
+      this.append("IK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("I") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("J") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 1).equals("K")  && "EIYÄÖ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("&");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("KJ") ) {
+      this.append("&");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("K") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("LJU") ) {
+      this.append("I");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("LL") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("L") ) {
+      this.append("L");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("MM") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("M") ) {
+      this.append("M");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("NG") ) {
+      this.append("@");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("NN") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("N") ) {
+      this.append("N");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("ORIGI") ) {
+      this.append("ORKI");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("OG")  && "IE".indexOf(word.charAt(2)) != -1 ) {
+      this.append("OK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("O") ) {
+      this.append("O");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 7 && word.substring(0, 7).equals("PROJEKT") ) {
+      this.append("PRO&EKT");
+      this.word = this.word.substring(7);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("PSALT") ) {
+      this.append("SALT");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("PSALM") ) {
+      this.append("SALM");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("PP") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("P") ) {
+      this.append("P");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Q") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("RGI")  && word.length() == 3) {
+      this.append("RGI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("RGA")  && word.length() == 3) {
+      this.append("RIA");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("RGE")  && word.length() == 3) {
+      this.append("RIE");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("RGS")  && word.length() == 3) {
+      this.append("RIS");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("RG")  && word.length() == 2) {
+      this.append("RI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("RD") ) {
+      this.append("T");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("RN") ) {
+      this.append("N");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("RT") ) {
+      this.append("T");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("RLD") ) {
+      this.append("T");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("RL") ) {
+      this.append("L");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("RS") ) {
+      this.append("&");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("RR") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("R") ) {
+      this.append("R");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SS") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("SCHIZ") ) {
+      this.append("SKITS");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("SCH") ) {
+      this.append("&");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("SKJ") ) {
+      this.append("&");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SJ") ) {
+      this.append("&");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("S") ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("TION") ) {
+      this.append("TION");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("TION") ) {
+      this.append("&ON");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("TT") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("T") ) {
+      this.append("T");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("UG")  && "IE".indexOf(word.charAt(2)) != -1 ) {
+      this.append("UK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("U") ) {
+      this.append("U");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("V") ) {
+      this.append("F");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("W") ) {
+      this.append("F");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("X") ) {
+      this.append("KS");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("YG")  && "IE".indexOf(word.charAt(2)) != -1 ) {
+      this.append("YK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Y") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ZZ") ) {
+      this.append("TS");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Z") ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("ÅTTIO") ) {
+      this.append("OTIO");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("ÅRTION") ) {
+      this.append("ORTION");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ÅG")  && "IE".indexOf(word.charAt(2)) != -1 ) {
+      this.append("OK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Å") ) {
+      this.append("O");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ÄG")  && "IE".indexOf(word.charAt(2)) != -1 ) {
+      this.append("EK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ä") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ÖG")  && "IE".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ÖK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ö") ) {
+      this.append("Ö");
+      this.word = this.word.substring(1);
+      return true;
+    }
+
+    this.word = this.word.substring(1);
+    return false;
+  }
+  /**
+   * Simple test
+   */
+  public static void main(String[] args) {
+    AphoneSv aphone = new AphoneSv();
+    for(int i = 0; i < args.length; i++) {
+      System.out.println(aphone.toPhone(args[i]));
+    }
+  }
+}
Index: contrib/aphone/src/java/org/apache/lucene/aphone/Aphone.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/Aphone.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/Aphone.java	(revision 0)
@@ -0,0 +1,28 @@
+package org.apache.lucene.aphone;
+
+/**
+ * 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.
+ */
+
+/**
+ * Convert a word to its phonem with the aspell notation.
+ * @Author Mathieu Lecarme
+ * @see {http://en.wikipedia.org/wiki/Phonem}
+ * @see {http://aspell.net/}
+ */
+public interface Aphone {
+  public String toPhone(String word);
+}
Index: contrib/aphone/src/java/org/apache/lucene/aphone/Homophone.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/Homophone.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/Homophone.java	(revision 0)
@@ -0,0 +1,104 @@
+package org.apache.lucene.aphone;
+
+/**
+ * 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 java.util.Map;
+import java.util.Map.Entry;
+import java.util.HashMap;
+import java.util.TreeMap;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.HashSet;
+import java.io.File;
+import java.io.FileNotFoundException;
+
+import org.apache.lucene.search.spell.Dictionary;
+import org.apache.lucene.search.spell.PlainTextDictionary;
+
+/**
+ * Homophone classification of a list of words
+ * @see {http://en.wikipedia.org/wiki/Homophone}
+ * @Author Mathieu Lecarme
+ */
+public class Homophone {
+  private Aphone aphone;
+  private Map dict = new TreeMap();
+  public void setAphone(Aphone a) {
+    aphone = a;
+  }
+
+  /**
+   * Initilisation with a specific language
+   */
+  public Homophone(Aphone aphone) {
+    setAphone(aphone);
+  }
+
+  /**
+   * Add a word for sorting
+   */
+  public void addWord(String word) {
+    String phonem = aphone.toPhone(word);
+    System.out.println(word + " -> " + phonem);
+    if(! dict.containsKey(phonem)) {
+      dict.put(phonem, new HashSet());
+    }
+    ((Set)dict.get(phonem)).add(word);
+  }
+
+  /**
+   * Add a full dictionary
+   */
+  public void read(Dictionary dico) {
+    Iterator iter = dico.getWordsIterator();
+    while(iter.hasNext())
+      addWord((String)iter.next());
+  }
+
+  /**
+   * Show what is inside
+   */
+  public void dump() {
+    Iterator iter = dict.entrySet().iterator();
+    while(iter.hasNext()) {
+      Entry line = (Entry)iter.next();
+      System.out.println(line.getKey());
+      System.out.print(line.getValue());
+      System.out.print("\n");
+    }
+  }
+
+  /**
+   * Simple test
+   */
+  public static void main(String[] args) {
+    Map languages = new HashMap();
+    languages.put("fr", new AphoneFr());
+    languages.put("en", new AphoneEn());
+    Homophone homophone = new Homophone((Aphone)languages.get(args[0]));
+    Dictionary d = null;
+    try {
+      d = new PlainTextDictionary(new File(args[1]));
+    } catch (FileNotFoundException e) {
+    }
+    if(d != null) {
+      homophone.read(d);
+      homophone.dump();
+    }
+  }
+}
Index: contrib/aphone/src/java/org/apache/lucene/aphone/AphoneEn.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneEn.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneEn.java	(revision 0)
@@ -0,0 +1,593 @@
+package org.apache.lucene.aphone;
+
+/**
+ * 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.
+ */
+
+/**
+ * String to phone conversion
+ * @Author Mathieu Lecarme
+ */
+public class AphoneEn implements Aphone{
+  StringBuffer phone;
+  String word;
+  boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    this.phone = new StringBuffer();
+    this.word = word.toUpperCase();
+    this.starting = true;
+    while( this.word.length() > 0 ) {
+      this.eat();
+      this.starting = false;
+    }
+    return this.phone.toString();
+  }
+
+  private void append(String letter) {
+    if (letter.length() > 0) {
+      if (this.phone.length() > 0 && letter.charAt(0) == this.phone.charAt(this.phone.length() - 1)) {
+        if (letter.length() > 1)
+          this.phone.append(letter.substring(1));
+      } else
+      this.phone.append(letter);
+    }
+  }
+
+  private boolean eat() {
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("AH")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("*H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("AR")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("*R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 1).equals("A")  && "HR".indexOf(word.charAt(1)) != -1 ) {
+      this.append("*");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 1 && word.substring(0, 1).equals("A") ) {
+      this.append("*");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("AH")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("AR")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("A")  && "HR".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("BB") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("B") ) {
+      this.append("B");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CQ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("CIA") ) {
+      this.append("X");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CH") ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("C")  && "EIY".indexOf(word.charAt(1)) != -1 ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CK") ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("COUGH") ) {
+      this.append("KF");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CC") ) {
+      this.append("C");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("C") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("DG")  && "EIY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("K");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("DD") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("D") ) {
+      this.append("T");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("É") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("EH")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("*H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("ER")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("*R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 1).equals("E")  && "HR".indexOf(word.charAt(1)) != -1 ) {
+      this.append("*");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("ENOUGH")  && word.length() == 6) {
+      this.append("*NF");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 1 && word.substring(0, 1).equals("E") ) {
+      this.append("*");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EH")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ER")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("E")  && "HR".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("FF") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("F") ) {
+      this.append("F");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("GN") ) {
+      this.append("N");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("GN")  && word.length() == 2) {
+      this.append("N");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("GNS")  && word.length() == 3) {
+      this.append("NS");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("GNED")  && word.length() == 4) {
+      this.append("N");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("GH")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("GH") ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("GG") ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("G") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("H") ) {
+      this.append("H");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("IH")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("*H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("IR")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("*R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 1).equals("I")  && "HR".indexOf(word.charAt(1)) != -1 ) {
+      this.append("*");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 1 && word.substring(0, 1).equals("I") ) {
+      this.append("*");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ING") ) {
+      this.append("N");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("IH")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("IR")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("I")  && "HR".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("J") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("KN") ) {
+      this.append("N");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("KK") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("K") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("LAUGH") ) {
+      this.append("LF");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("LL") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("L") ) {
+      this.append("L");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("MB")  && word.length() == 2) {
+      this.append("M");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("MM") ) {
+      this.append("M");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("M") ) {
+      this.append("M");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("NN") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("N") ) {
+      this.append("N");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("OH")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("*H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("OR")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("*R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 1).equals("O")  && "HR".indexOf(word.charAt(1)) != -1 ) {
+      this.append("*");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 1 && word.substring(0, 1).equals("O") ) {
+      this.append("*");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("OH")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("OR")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("O")  && "HR".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("PH") ) {
+      this.append("F");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("PN") ) {
+      this.append("N");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("PP") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("P") ) {
+      this.append("P");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Q") ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("RH") ) {
+      this.append("R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("ROUGH") ) {
+      this.append("RF");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("RR") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("R") ) {
+      this.append("R");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("SCH")  && "EOU".indexOf(word.charAt(3)) != -1 ) {
+      this.append("SK");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("SC")  && "IEY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("S");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SH") ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("SI")  && "AO".indexOf(word.charAt(2)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SS") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("S") ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("TI")  && "AO".indexOf(word.charAt(2)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("TH") ) {
+      this.append("@");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("TCH") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("TOUGH") ) {
+      this.append("TF");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("TT") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("T") ) {
+      this.append("T");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("UH")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("*H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("UR")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("*R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 1).equals("U")  && "HR".indexOf(word.charAt(1)) != -1 ) {
+      this.append("*");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 1 && word.substring(0, 1).equals("U") ) {
+      this.append("*");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("UH")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("H");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("UR")  && "AEIOUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("U")  && "HR".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 1 && word.substring(0, 1).equals("V") ) {
+      this.append("W");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("V") ) {
+      this.append("F");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("WR") ) {
+      this.append("R");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("WH") ) {
+      this.append("W");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("W")  && "AEIOU".indexOf(word.charAt(1)) != -1 ) {
+      this.append("W");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 1 && word.substring(0, 1).equals("X") ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("X") ) {
+      this.append("KS");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Y")  && "AEIOU".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Y");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ZZ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Z") ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+
+    this.word = this.word.substring(1);
+    return false;
+  }
+  /**
+   * Simple test
+   */
+  public static void main(String[] args) {
+    AphoneEn aphone = new AphoneEn();
+    for(int i = 0; i < args.length; i++) {
+      System.out.println(aphone.toPhone(args[i]));
+    }
+  }
+}
Index: contrib/aphone/pom.xml
===================================================================
Index: contrib/aphone/build.xml
===================================================================
--- contrib/aphone/build.xml	(revision 0)
+++ contrib/aphone/build.xml	(revision 0)
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+
+<!--
+    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.
+ -->
+
+<project name="aphone" default="default">
+
+  <description>
+    Aphone
+  </description>
+
+  <import file="../contrib-build.xml"/>
+  <property name="spellchecker.jar" 
+    location="${common.dir}/build/contrib/spellchecker/lucene-spellchecker-${version}.jar"/>
+  <available property="spellchecker.jar.present" 
+    type="file" file="${spellchecker.jar}"/>
+
+  <path id="classpath">
+   <pathelement path="${lucene.jar}"/>
+   <pathelement path="${spellchecker.jar}"/>
+   <pathelement path="${project.classpath}"/>
+  </path>
+
+  <target name="compile-core" depends="build-spellchecker, common.compile-core" />
+
+<target name="build-spellchecker" unless="spellchecker.jar.present">
+  <echo>XML Parser building dependency ${spellchecker.jar}</echo>
+  <ant antfile="../spellchecker/build.xml" target="default" inheritall="false"/>
+</target>
+
+  <target name="compile-test"
+    depends="build-lucene-tests,contrib-build.compile-test" />
+  <target name="dico" description="build a dictionary">
+    <fail unless="list">
+      Must specify 'list' property.
+    </fail>
+
+  <target name="compile" depends="compile-core">
+    <!-- convenience target to compile core -->
+  </target>
+
+    <java classname="org.apache.lucene.aphone.Homophone"
+      fork="true" maxmemory="140M">
+      <classpath>
+        <pathelement path="${common.dir}/build/contrib/aphone/classes/java"/>
+        <pathelement path="${common.dir}/build/contrib/spellchecker/lucene-spellchecker-${version}.jar"/>
+        <pathelement path="${project.classpath}"/>
+        <pathelement location="${build.dir}/classes"/>
+      </classpath>
+      <arg value="en" />
+      <arg file="${list}" />
+    </java>
+  </target>
+</project>
