Index: contrib/aphone/src/test/org/apache/lucene/aphone/TestAphoneTokenFilter.java
===================================================================
--- contrib/aphone/src/test/org/apache/lucene/aphone/TestAphoneTokenFilter.java	(revision 0)
+++ contrib/aphone/src/test/org/apache/lucene/aphone/TestAphoneTokenFilter.java	(revision 0)
@@ -0,0 +1,46 @@
+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.io.IOException;
+import java.io.StringReader;
+
+import junit.framework.TestCase;
+
+import org.apache.lucene.analysis.Token;
+import org.apache.lucene.analysis.TokenStream;
+import org.apache.lucene.analysis.standard.StandardTokenizer;
+
+/**
+ *
+ * @Author Mathieu Lecarme
+ */
+public class TestAphoneTokenFilter extends TestCase{
+	public void testFrench() throws IOException{
+		String test = "Les phonétiques vont sauver le monde";
+		TokenStream stream = new AphoneTokenFilter ( new StandardTokenizer(new StringReader(test)), new AphoneFr());
+		Token tok;
+		for(;;){
+			tok = stream.next();
+			if(tok == null)
+				break;
+			System.out.println(tok.termText());
+		}
+	}
+}
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/AphoneDa.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneDa.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneDa.java	(revision 0)
@@ -0,0 +1,475 @@
+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 AphoneDa extends Aphone{
+  private StringBuffer phone;
+  private String word;
+  private boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    if(word == null)
+      return null;
+    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("AA") ) {
+      this.append("Å");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("ACTION") ) {
+      this.append("AKSJON");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AF") ) {
+      this.append("AV");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ASIE") ) {
+      this.append("ASJE");
+      this.word = this.word.substring(4);
+      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() >= 5 && word.substring(0, 5).equals("BEDST") ) {
+      this.append("BEST");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("BORD") ) {
+      this.append("BOR");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("BRYST") ) {
+      this.append("BRØST");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("BUREAU") ) {
+      this.append("BYRO");
+      this.word = this.word.substring(6);
+      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("CC") ) {
+      this.append("KS");
+      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, 2).equals("CH") ) {
+      this.append("TJ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CI") ) {
+      this.append("SI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CO") ) {
+      this.append("KO");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CY") ) {
+      this.append("SY");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("C") ) {
+      this.append("S");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("DIG")  && word.length() == 3) {
+      this.append("DAJ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("DIG") ) {
+      this.append("DI");
+      this.word = this.word.substring(3);
+      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("EAUX") ) {
+      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() >= 2 && word.substring(0, 2).equals("EJ")  && word.length() == 2) {
+      this.append("AJ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EU") ) {
+      this.append("ØV");
+      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() >= 1 && word.substring(0, 1).equals("È") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("FEDT") ) {
+      this.append("FET");
+      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("G") ) {
+      this.append("G");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("HJ") ) {
+      this.append("J");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("HÅRD") ) {
+      this.append("HÅR");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("HÅND") ) {
+      this.append("HÅN");
+      this.word = this.word.substring(4);
+      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, 3).equals("ION") ) {
+      this.append("JON");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("IND") ) {
+      this.append("IN");
+      this.word = this.word.substring(3);
+      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("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() >= 3 && word.substring(0, 3).equals("LIG") ) {
+      this.append("LI");
+      this.word = this.word.substring(3);
+      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() >= 4 && word.substring(0, 4).equals("MAND") ) {
+      this.append("MAN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("MIG")  && word.length() == 3) {
+      this.append("MAJ");
+      this.word = this.word.substring(3);
+      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() >= 3 && word.substring(0, 3).equals("OST") ) {
+      this.append("ÅST");
+      this.word = this.word.substring(3);
+      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("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("Q") ) {
+      this.append("KU");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("REGN") ) {
+      this.append("REJN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("RUG") ) {
+      this.append("RU");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("RYG") ) {
+      this.append("RØG");
+      this.word = this.word.substring(3);
+      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("SH") ) {
+      this.append("SJ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("SIG")  && word.length() == 3) {
+      this.append("SAJ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("SKIND") ) {
+      this.append("SKIN");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("S'S")  && word.length() == 3) {
+      this.append("S");
+      this.word = this.word.substring(3);
+      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() >= 4 && word.substring(0, 4).equals("TION") ) {
+      this.append("SJON");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("TZ") ) {
+      this.append("TS");
+      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("Y");
+      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("V");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("X'S") ) {
+      this.append("KS");
+      this.word = this.word.substring(3);
+      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, 3).equals("YKK") ) {
+      this.append("ØKK");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("YND") ) {
+      this.append("ØND");
+      this.word = this.word.substring(3);
+      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() >= 3 && word.substring(0, 3).equals("Z'S") ) {
+      this.append("S");
+      this.word = this.word.substring(3);
+      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() >= 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( word.length() >= 2 && word.substring(0, 2).equals("ØB") ) {
+      this.append("ØV");
+      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;
+    }
+    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;
+    }
+
+    this.word = this.word.substring(1);
+    return false;
+  }
+  /**
+   * Simple test
+   */
+  public static void main(String[] args) {
+    AphoneDa aphone = new AphoneDa();
+    for(int i = 0; i < args.length; i++) {
+      System.out.println(aphone.toPhone(args[i]));
+    }
+  }
+}
Index: contrib/aphone/src/java/org/apache/lucene/aphone/AphoneFo.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneFo.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneFo.java	(revision 0)
@@ -0,0 +1,435 @@
+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 AphoneFo extends Aphone{
+  private StringBuffer phone;
+  private String word;
+  private boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    if(word == null)
+      return null;
+    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("AA") ) {
+      this.append("Å");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("AFT") ) {
+      this.append("AT");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AH")  && word.length() == 2) {
+      this.append("A");
+      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("Á");
+      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("CC") ) {
+      this.append("KK");
+      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( this.starting && word.length() >= 3 && word.substring(0, 3).equals("CHR") ) {
+      this.append("KR");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CH") ) {
+      this.append("SJ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CI") ) {
+      this.append("SI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CO") ) {
+      this.append("KO");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CY") ) {
+      this.append("SY");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("C") ) {
+      this.append("C");
+      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() >= 3 && word.substring(0, 3).equals("ÐUR") ) {
+      this.append("VUR");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ð") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("EAUX") ) {
+      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() >= 3 && word.substring(0, 3).equals("EUS") ) {
+      this.append("ØVS");
+      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("F") ) {
+      this.append("F");
+      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( this.starting && word.length() >= 2 && word.substring(0, 2).equals("HJ") ) {
+      this.append("J");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("HÅRD") ) {
+      this.append("HÅR");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("HÅND") ) {
+      this.append("HÅN");
+      this.word = this.word.substring(4);
+      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() >= 2 && word.substring(0, 2).equals("IÐ")  && word.length() == 2) {
+      this.append("Í");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("IÐ")  && word.length() == 2) {
+      this.append("I");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("IND") ) {
+      this.append("IN");
+      this.word = this.word.substring(3);
+      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("Í");
+      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( this.starting && word.length() >= 2 && word.substring(0, 2).equals("KE") ) {
+      this.append("TJE");
+      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("LIG") ) {
+      this.append("LI");
+      this.word = this.word.substring(3);
+      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() >= 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() >= 3 && word.substring(0, 3).equals("OCH") ) {
+      this.append("OK");
+      this.word = this.word.substring(3);
+      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("Ó");
+      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("Q") ) {
+      this.append("KU");
+      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("SH") ) {
+      this.append("SJ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("SIÓN") ) {
+      this.append("SJÓN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("S'S")  && word.length() == 3) {
+      this.append("S");
+      this.word = this.word.substring(3);
+      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("TH")  && word.length() == 2) {
+      this.append("T");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("TIÓN") ) {
+      this.append("SJÓN");
+      this.word = this.word.substring(4);
+      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("Ú");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ü") ) {
+      this.append("Y");
+      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("V");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("X'S")  && word.length() == 3) {
+      this.append("KS");
+      this.word = this.word.substring(3);
+      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() >= 1 && word.substring(0, 1).equals("Y") ) {
+      this.append("I");
+      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( word.length() >= 3 && word.substring(0, 3).equals("Z'S")  && 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;
+    }
+    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("Æ");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ØRN") ) {
+      this.append("ØDN");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    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( 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) {
+    AphoneFo aphone = new AphoneFo();
+    for(int i = 0; i < args.length; i++) {
+      System.out.println(aphone.toPhone(args[i]));
+    }
+  }
+}
Index: contrib/aphone/src/java/org/apache/lucene/aphone/AphoneRu.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneRu.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneRu.java	(revision 0)
@@ -0,0 +1,595 @@
+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 AphoneRu extends Aphone{
+  private StringBuffer phone;
+  private String word;
+  private boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    if(word == null)
+      return null;
+    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, 1).equals("А")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("АЯ");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Б")  && "БП".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Б")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("БА");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("БЬ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("БЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("БЪ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("БЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Б") ) {
+      this.append("П");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("В")  && "ВФ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("В")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ВА");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ВЬ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ВЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ВЪ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ВЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("В") ) {
+      this.append("Ф");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Г")  && "ГК".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Г")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ГА");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ГЬ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ГЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ГЪ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ГЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Г") ) {
+      this.append("К");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Д")  && "ДТ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Д")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ДА");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ДЬ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ДЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ДЪ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ДЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ДЗ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ДЗА");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Д")  && "ЗС".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Ц");
+      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;
+    }
+    if( this.starting && word.length() >= 1 && word.substring(0, 1).equals("Е") ) {
+      this.append("Я");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Е")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ЯЯ");
+      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;
+    }
+    if( this.starting && word.length() >= 1 && word.substring(0, 1).equals("Ё") ) {
+      this.append("Я");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ё")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ЯЯ");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ж")  && "ЖШ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ж")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ЖА");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЖЬ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ЖЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЖЪ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ЖЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ж") ) {
+      this.append("Ш");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("З")  && "ЗС".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("З")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ЗА");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЗЬ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ЗЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЗЪ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ЗЯ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("З") ) {
+      this.append("С");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("И")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("АЯ");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЙЙ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Й")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Я");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("К")  && "ГК".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("К")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("КА");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЛЛ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Л")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ЛА");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ММ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("М")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("МА");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("НН") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Н")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("НА");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("О")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("АЯ");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("П")  && "БП".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("П")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ПА");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("РР") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Р")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("РА");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("С")  && "ЗС".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("С")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("СА");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Т")  && "ДТ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Т")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ТА");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ТЗ")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ТЗА");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Т")  && "ЗС".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Ц");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("У")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("АЯ");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ф")  && "ВФ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ф")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ФА");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ХХ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Х")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ХА");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЦЦ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ц")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ЦА");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЧЧ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ч")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ЧА");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ш")  && "ЖШ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ш")  && "АОЭЫУЯЁЕИЮ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ША");
+      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;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Щ") ) {
+      this.append("Ш");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ъ")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Я");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ы")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("АЯ");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ь")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Я");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Э")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      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() >= 1 && word.substring(0, 1).equals("Ю") ) {
+      this.append("Я");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ю")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ЯЯ");
+      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;
+    }
+    if( this.starting && word.length() >= 1 && word.substring(0, 1).equals("Я") ) {
+      this.append("Я");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Я")  && "ЕЁЮЯ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ЯЯ");
+      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) {
+    AphoneRu aphone = new AphoneRu();
+    for(int i = 0; i < args.length; i++) {
+      System.out.println(aphone.toPhone(args[i]));
+    }
+  }
+}
Index: contrib/aphone/src/java/org/apache/lucene/aphone/AphoneTokenFilter.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneTokenFilter.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneTokenFilter.java	(revision 0)
@@ -0,0 +1,45 @@
+package org.apache.lucene.aphone;
+
+import java.io.IOException;
+
+import org.apache.lucene.analysis.Token;
+import org.apache.lucene.analysis.TokenFilter;
+import org.apache.lucene.analysis.TokenStream;
+
+/**
+ * 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.
+ */
+
+
+public class AphoneTokenFilter extends TokenFilter {
+    private Aphone aphone;
+    protected AphoneTokenFilter(TokenStream input) {
+        super(input);
+        this.aphone = new AphoneEn();
+    }
+    public AphoneTokenFilter(TokenStream input, Aphone aphone){
+        super(input);
+        this.aphone = aphone;
+    }
+    public Token next() throws IOException {
+        Token t = input.next();
+        if (t == null)
+          return null;
+        //[FIXME] using #termBuffer for Lucene 2.4
+        t.setTermText(aphone.toPhone(t.termText()));
+        return t;
+    }
+}
\ 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,500 @@
+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 extends Aphone{
+  private StringBuffer phone;
+  private String word;
+  private boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    if(word == null)
+      return null;
+    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/AphoneBg.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneBg.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneBg.java	(revision 0)
@@ -0,0 +1,710 @@
+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 AphoneBg extends Aphone{
+  private StringBuffer phone;
+  private String word;
+  private boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    if(word == null)
+      return null;
+    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( 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( 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( 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( 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( word.length() >= 3 && word.substring(0, 3).equals("БСК") ) {
+      this.append("ПК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("БД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("П");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("БT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("П");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("БД")  && word.length() == 2) {
+      this.append("П");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("БT")  && word.length() == 2) {
+      this.append("П");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ВСК") ) {
+      this.append("ФК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ВД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ф");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ВT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ф");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ВД")  && word.length() == 2) {
+      this.append("Ф");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ВT")  && word.length() == 2) {
+      this.append("Ф");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ГСК") ) {
+      this.append("К");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ГД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("К");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ГT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("К");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ГД")  && word.length() == 2) {
+      this.append("К");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ГT")  && word.length() == 2) {
+      this.append("К");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ДСК") ) {
+      this.append("ТК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ДД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Т");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ДT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Т");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ДД")  && word.length() == 2) {
+      this.append("Т");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ДT")  && word.length() == 2) {
+      this.append("Т");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ЖСК") ) {
+      this.append("ШК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЖД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ш");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЖT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ш");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЖД")  && word.length() == 2) {
+      this.append("Ш");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЖT")  && word.length() == 2) {
+      this.append("Ш");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ЗСК") ) {
+      this.append("СК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЗД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("С");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЗT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("С");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЗД")  && word.length() == 2) {
+      this.append("С");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЗT")  && word.length() == 2) {
+      this.append("С");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("КСК") ) {
+      this.append("К");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("КД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("К");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("КT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("К");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("КД")  && word.length() == 2) {
+      this.append("К");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("КT")  && word.length() == 2) {
+      this.append("К");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ЛСК") ) {
+      this.append("ЛК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЛД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Л");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЛT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Л");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЛД")  && word.length() == 2) {
+      this.append("Л");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЛT")  && word.length() == 2) {
+      this.append("Л");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("МСК") ) {
+      this.append("МК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("МД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("М");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("МT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("М");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("МД")  && word.length() == 2) {
+      this.append("М");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("МT")  && word.length() == 2) {
+      this.append("М");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("НСК") ) {
+      this.append("НК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("НД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Н");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("НT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Н");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("НД")  && word.length() == 2) {
+      this.append("Н");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("НT")  && word.length() == 2) {
+      this.append("Н");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ПСК") ) {
+      this.append("ПК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ПД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("П");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ПT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("П");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ПД")  && word.length() == 2) {
+      this.append("П");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ПT")  && word.length() == 2) {
+      this.append("П");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("РСК") ) {
+      this.append("РК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("РД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Р");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("РT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Р");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("РД")  && word.length() == 2) {
+      this.append("Р");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("РT")  && word.length() == 2) {
+      this.append("Р");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ССК") ) {
+      this.append("СК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("СД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("С");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("СT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("С");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("СД")  && word.length() == 2) {
+      this.append("С");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("СT")  && word.length() == 2) {
+      this.append("С");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ТСК") ) {
+      this.append("ТК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ТД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Т");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ТT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Т");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ТД")  && word.length() == 2) {
+      this.append("Т");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ТT")  && word.length() == 2) {
+      this.append("Т");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ФСК") ) {
+      this.append("ФК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ФД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ф");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ФT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ф");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ФД")  && word.length() == 2) {
+      this.append("Ф");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ФT")  && word.length() == 2) {
+      this.append("Ф");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ХСК") ) {
+      this.append("ХК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ХД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Х");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ХT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Х");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ХД")  && word.length() == 2) {
+      this.append("Х");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ХT")  && word.length() == 2) {
+      this.append("Х");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ЦСК") ) {
+      this.append("ЦК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЦД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ц");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЦT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ц");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЦД")  && word.length() == 2) {
+      this.append("Ц");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЦT")  && word.length() == 2) {
+      this.append("Ц");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ЧСК") ) {
+      this.append("ЧК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЧД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ч");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ЧT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ч");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЧД")  && word.length() == 2) {
+      this.append("Ч");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ЧT")  && word.length() == 2) {
+      this.append("Ч");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ШСК") ) {
+      this.append("ШК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ШД")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ш");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ШT")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Ш");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ШД")  && word.length() == 2) {
+      this.append("Ш");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ШT")  && word.length() == 2) {
+      this.append("Ш");
+      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;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ЩСК") ) {
+      this.append("ШК");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Щ")  && "БВГДЖЗКЛМНПРСТГХЦЧШЩ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Ш");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Щ")  && word.length() == 1) {
+      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;
+    }
+
+    this.word = this.word.substring(1);
+    return false;
+  }
+  /**
+   * Simple test
+   */
+  public static void main(String[] args) {
+    AphoneBg aphone = new AphoneBg();
+    for(int i = 0; i < args.length; i++) {
+      System.out.println(aphone.toPhone(args[i]));
+    }
+  }
+}
Index: contrib/aphone/src/java/org/apache/lucene/aphone/AphoneDe.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneDe.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneDe.java	(revision 0)
@@ -0,0 +1,2405 @@
+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 AphoneDe extends Aphone{
+  private StringBuffer phone;
+  private String word;
+  private boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    if(word == null)
+      return null;
+    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("ÄER") ) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ÄU") ) {
+      this.append("EU");
+      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("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ÖER") ) {
+      this.append("Ö");
+      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;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("ÜBER") ) {
+      this.append("IPA");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ÜER") ) {
+      this.append("I");
+      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() >= 1 && word.substring(0, 1).equals("ß") ) {
+      this.append("Z");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("ABELLE")  && word.length() == 6) {
+      this.append("APL");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("ABELL")  && word.length() == 5) {
+      this.append("APL");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 7 && word.substring(0, 7).equals("ABIENNE")  && word.length() == 7) {
+      this.append("APIN");
+      this.word = this.word.substring(7);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ACEY")  && word.length() == 4) {
+      this.append("AZI");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("AEU") ) {
+      this.append("EU");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AE") ) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("AGNI") ) {
+      this.append("AKN");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("AGNIE") ) {
+      this.append("ANI");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("AGN")  && "AEOU".indexOf(word.charAt(3)) != -1  && word.length() == 4) {
+      this.append("ANI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("AIA") ) {
+      this.append("AIA");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("AIE")  && word.length() == 3) {
+      this.append("E");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 4).equals("AILL")  && "EOU".indexOf(word.charAt(4)) != -1 ) {
+      this.append("ALI");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("AINE")  && word.length() == 4) {
+      this.append("EN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("AIRE")  && word.length() == 4) {
+      this.append("ER");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("AIR") ) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("AISE")  && word.length() == 4) {
+      this.append("EZ");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 8 && word.substring(0, 8).equals("AISSANCE")  && word.length() == 8) {
+      this.append("EZANZ");
+      this.word = this.word.substring(8);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("AISSE")  && word.length() == 5) {
+      this.append("EZ");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("AIX")  && word.length() == 3) {
+      this.append("EX");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("AJ")  && "AÄEIOÖUÜ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("A");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("AKTIE") ) {
+      this.append("AXIE");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 3).equals("ALO")  && "IY".indexOf(word.charAt(3)) != -1 ) {
+      this.append("ALUI");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 7 && word.substring(0, 6).equals("AMATEU")  && "RS".indexOf(word.charAt(6)) != -1 ) {
+      this.append("ANATÖ");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 7 && word.substring(0, 7).equals("ANIELLE")  && word.length() == 7) {
+      this.append("ANIL");
+      this.word = this.word.substring(7);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("ANTI") ) {
+      this.append("ANTI");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("ANVER") ) {
+      this.append("ANFA");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ATIA")  && word.length() == 4) {
+      this.append("ATIA");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 4).equals("ATIA")  && "NS".indexOf(word.charAt(4)) != -1 ) {
+      this.append("ATI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("ATI")  && "AÄOÖUÜ".indexOf(word.charAt(3)) != -1 ) {
+      this.append("AZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("AUAU") ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("AUER") ) {
+      this.append("AUA");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("AUF") ) {
+      this.append("AUF");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("AULT")  && word.length() == 4) {
+      this.append("U");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("AUSSE")  && word.length() == 5) {
+      this.append("UZ");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 3).equals("AUS")  && "ST".indexOf(word.charAt(3)) != -1 ) {
+      this.append("AUZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("AUS") ) {
+      this.append("AUZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("AUTO") ) {
+      this.append("AUTU");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("AUX")  && "IY".indexOf(word.charAt(3)) != -1 ) {
+      this.append("AUX");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("AUX") ) {
+      this.append("U");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("AU") ) {
+      this.append("AU");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("AVIER")  && word.length() == 5) {
+      this.append("AFIE");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("AYER") ) {
+      this.append("EI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("AY")  && "AÄEIOÖUÜ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("A");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("A")  && "IJY".indexOf(word.charAt(1)) != -1 ) {
+      this.append("EI");
+      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( this.starting && word.length() >= 4 && word.substring(0, 3).equals("BEA")  && "BCMNRU".indexOf(word.charAt(3)) != -1 ) {
+      this.append("PEA");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 4).equals("BEAT")  && "AEIMORU".indexOf(word.charAt(4)) != -1 ) {
+      this.append("PEAT");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("BEIGE")  && word.length() == 5) {
+      this.append("PEZ");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("BE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("PE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("BETTE")  && word.length() == 5) {
+      this.append("PET");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("BIC")  && word.length() == 3) {
+      this.append("PIZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 4).equals("BOWL")  && "EI".indexOf(word.charAt(4)) != -1 ) {
+      this.append("PUL");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("BP")  && "AÄEIOÖRUÜY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("P");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("BUDGET") ) {
+      this.append("PIKE");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("BUFFET") ) {
+      this.append("PIFE");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("BYLLE")  && word.length() == 5) {
+      this.append("PILE");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("BYLL")  && word.length() == 4) {
+      this.append("PIL");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("BYTE") ) {
+      this.append("PEIT");
+      this.word = this.word.substring(4);
+      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() >= 2 && word.substring(0, 2).equals("CÄ") ) {
+      this.append("Z");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CÜ")  && word.length() == 2) {
+      this.append("ZI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 4).equals("CACH")  && "EI".indexOf(word.charAt(4)) != -1 ) {
+      this.append("KEZ");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("CAE") ) {
+      this.append("Z");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("CA")  && "IY".indexOf(word.charAt(2)) != -1  && word.length() == 3) {
+      this.append("ZEI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("CCH") ) {
+      this.append("Z");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("CCE") ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("CE")  && "EIJUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Z");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("CENT") ) {
+      this.append("ZENT");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 5).equals("CERST")  && "EI".indexOf(word.charAt(5)) != -1 ) {
+      this.append("KE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("CER")  && word.length() == 3) {
+      this.append("ZA");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CE") ) {
+      this.append("ZE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 4).equals("CHAO")  && "ST".indexOf(word.charAt(4)) != -1 ) {
+      this.append("KAU");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 7 && word.substring(0, 7).equals("CHAMPIO") ) {
+      this.append("ZENPI");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 4).equals("CHAR")  && "AI".indexOf(word.charAt(4)) != -1 ) {
+      this.append("KAR");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 4).equals("CHAU")  && "CDFSVWXZ".indexOf(word.charAt(4)) != -1 ) {
+      this.append("ZU");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("CHE")  && "CF".indexOf(word.charAt(3)) != -1 ) {
+      this.append("ZE");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("CHEM") ) {
+      this.append("KE");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("CHEQUE") ) {
+      this.append("ZEK");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("CHI")  && "CFGPVW".indexOf(word.charAt(3)) != -1 ) {
+      this.append("ZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("CH")  && "AEUY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Z");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("CHK") ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("CH")  && "LOR".indexOf(word.charAt(2)) != -1 ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("CHST") ) {
+      this.append("X");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("CH")  && "SßXZ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CH") ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("CIER")  && word.length() == 4) {
+      this.append("ZIE");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("CYB") ) {
+      this.append("ZEI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("CY") ) {
+      this.append("ZI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("C")  && "IJY".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Z");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("CKST") ) {
+      this.append("XT");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("CK")  && "SßXZ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("C")  && "CK".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 7 && word.substring(0, 7).equals("CLAUDET") ) {
+      this.append("KLU");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 8 && word.substring(0, 8).equals("CLAUDINE")  && word.length() == 8) {
+      this.append("KLUTIN");
+      this.word = this.word.substring(8);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("COLE")  && word.length() == 4) {
+      this.append("KUL");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("COUCH") ) {
+      this.append("KAUZ");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("CQUES")  && word.length() == 5) {
+      this.append("K");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("CQUE") ) {
+      this.append("K");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("CREAT") ) {
+      this.append("KREA");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("CST") ) {
+      this.append("XT");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("CS") ) {
+      this.append("Z");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("C")  && "SßX".indexOf(word.charAt(1)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("CT")  && "SßXZ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("CZ") ) {
+      this.append("Z");
+      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( this.starting && word.length() >= 3 && word.substring(0, 3).equals("D'H") ) {
+      this.append("T");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("D'S")  && word.length() == 3) {
+      this.append("Z");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 4).equals("DAVO")  && "NR".indexOf(word.charAt(4)) != -1  && word.length() == 5) {
+      this.append("TAFU");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("DD")  && "SZ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("DEPOT") ) {
+      this.append("TEPU");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("DESIGN") ) {
+      this.append("TIZEIN");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("DE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("TE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("DETTE")  && word.length() == 5) {
+      this.append("TET");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("DIC")  && word.length() == 3) {
+      this.append("TIZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("DJ")  && "AEIOU".indexOf(word.charAt(2)) != -1 ) {
+      this.append("I");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("DS")  && "CH".indexOf(word.charAt(2)) != -1 ) {
+      this.append("T");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("DST") ) {
+      this.append("ZT");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("DT") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("DUIS") ) {
+      this.append("TI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("DURCH") ) {
+      this.append("TURK");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("DZS")  && "CH".indexOf(word.charAt(3)) != -1 ) {
+      this.append("T");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("D")  && "SßZ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Z");
+      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() >= 5 && word.substring(0, 5).equals("EAULT")  && word.length() == 5) {
+      this.append("U");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("EAUX")  && word.length() == 4) {
+      this.append("U");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("EAU") ) {
+      this.append("U");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("EAV") ) {
+      this.append("IF");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EA")  && "AÄEIOÖÜY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("EA");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EA")  && word.length() == 2) {
+      this.append("EA");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EA") ) {
+      this.append("I");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("EBEN") ) {
+      this.append("EPN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EE") ) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("EIEI") ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("EIH") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("EILLE")  && word.length() == 5) {
+      this.append("EI");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EI") ) {
+      this.append("EI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EJ")  && word.length() == 2) {
+      this.append("EI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("EL") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EL")  && "DKL".indexOf(word.charAt(2)) != -1 ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EL")  && "MNT".indexOf(word.charAt(2)) != -1  && word.length() == 3) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("ELYNE")  && word.length() == 5) {
+      this.append("ELINE");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ELYN")  && word.length() == 4) {
+      this.append("ELIN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EL")  && "AÄEIOÖUÜY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("EL");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EL") ) {
+      this.append("L");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("EM") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EM")  && "DFKMPQT".indexOf(word.charAt(2)) != -1 ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EM")  && "AÄEIOÖUÜY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EM") ) {
+      this.append("N");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("EN") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EN")  && "CDGKQT".indexOf(word.charAt(2)) != -1 ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("ENZ")  && "AEIOUY".indexOf(word.charAt(3)) != -1 ) {
+      this.append("EN");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("EN")  && "AÄEINOÖUÜY".indexOf(word.charAt(2)) != -1 ) {
+      this.append("EN");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EN") ) {
+      this.append("N");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 3).equals("ERH")  && "AÄEIOÖUÜ".indexOf(word.charAt(3)) != -1 ) {
+      this.append("ER");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("ER") ) {
+      this.append("E");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ER")  && "AÄEIOÖUÜY".indexOf(word.charAt(2)) != -1 ) {
+      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("A");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ER") ) {
+      this.append("A");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("ETI")  && "AÄOÖÜU".indexOf(word.charAt(3)) != -1 ) {
+      this.append("EZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("EUEU") ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("EUILLE")  && word.length() == 6) {
+      this.append("Ö");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("EUR")  && word.length() == 3) {
+      this.append("ÖR");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("EUX") ) {
+      this.append("Ö");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("EUYS")  && word.length() == 4) {
+      this.append("EUZ");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EU") ) {
+      this.append("EU");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("EYER") ) {
+      this.append("EIA");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("EY") ) {
+      this.append("EI");
+      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( this.starting && word.length() >= 4 && word.substring(0, 4).equals("FANS")  && word.length() == 4) {
+      this.append("FE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("FAN")  && word.length() == 3) {
+      this.append("FE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("FAULT") ) {
+      this.append("FUL");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("FEE")  && "DL".indexOf(word.charAt(3)) != -1 ) {
+      this.append("FI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("FEHLER") ) {
+      this.append("FELA");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("FE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("FE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("FOND") ) {
+      this.append("FUN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("FRAIN")  && word.length() == 5) {
+      this.append("FRA");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 7 && word.substring(0, 6).equals("FRISEU")  && "RS".indexOf(word.charAt(6)) != -1 ) {
+      this.append("FRIZÖ");
+      this.word = this.word.substring(6);
+      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() >= 3 && word.substring(0, 3).equals("G'S")  && word.length() == 3) {
+      this.append("X");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("GAGS")  && word.length() == 4) {
+      this.append("KEX");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("GAG")  && word.length() == 3) {
+      this.append("KEK");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("GD") ) {
+      this.append("KT");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("GEGEN") ) {
+      this.append("KEKN");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("GE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("KE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("GETTE")  && word.length() == 5) {
+      this.append("KET");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("G")  && "CK".indexOf(word.charAt(1)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("GG") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("GI")  && "AO".indexOf(word.charAt(2)) != -1 ) {
+      this.append("I");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("GION")  && word.length() == 4) {
+      this.append("KIUN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("GIUS") ) {
+      this.append("IU");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("GMBH")  && word.length() == 4) {
+      this.append("GMPH");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("GNAC")  && word.length() == 4) {
+      this.append("NIAK");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("GNON")  && word.length() == 4) {
+      this.append("NIUN");
+      this.word = this.word.substring(4);
+      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( this.starting && word.length() >= 6 && word.substring(0, 6).equals("GONCAL") ) {
+      this.append("KUNZA");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("GS")  && "CH".indexOf(word.charAt(2)) != -1 ) {
+      this.append("K");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("GST") ) {
+      this.append("XT");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("G")  && "SßXZ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("GUCK") ) {
+      this.append("KU");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("GUI") ) {
+      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() >= 4 && word.substring(0, 4).equals("HEAD") ) {
+      this.append("E");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("HE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("HE")  && "LMN".indexOf(word.charAt(2)) != -1 ) {
+      this.append("E");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("HEUR")  && word.length() == 4) {
+      this.append("ÖR");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && 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("IEC")  && word.length() == 3) {
+      this.append("IZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("IEI") ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("IELL") ) {
+      this.append("IEL");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("IENNE")  && word.length() == 5) {
+      this.append("IN");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("IERRE")  && word.length() == 5) {
+      this.append("IER");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("IETTE")  && word.length() == 5) {
+      this.append("IT");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("IEU") ) {
+      this.append("IÖ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("IE") ) {
+      this.append("I");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("IGHT")  && word.length() == 4) {
+      this.append("EIT");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 4).equals("IGNI")  && "EO".indexOf(word.charAt(4)) != -1 ) {
+      this.append("INI");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("IGN")  && "AEOU".indexOf(word.charAt(3)) != -1  && word.length() == 4) {
+      this.append("INI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("IJ")  && "AOU".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("IJ")  && word.length() == 2) {
+      this.append("I");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("IJ") ) {
+      this.append("EI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("IKOLE")  && word.length() == 5) {
+      this.append("IKUL");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 5).equals("ILLAN")  && "STZ".indexOf(word.charAt(5)) != -1 ) {
+      this.append("ILIA");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 5).equals("ILLAR")  && "DT".indexOf(word.charAt(5)) != -1 ) {
+      this.append("ILIA");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("INVER") ) {
+      this.append("INFE");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("ITI")  && "AÄOÖUÜ".indexOf(word.charAt(3)) != -1 ) {
+      this.append("IZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("IVIER")  && word.length() == 5) {
+      this.append("IFIE");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("I") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("JAVIE") ) {
+      this.append("ZA");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("JEAN")  && word.length() == 4) {
+      this.append("IA");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("JEAN") ) {
+      this.append("IA");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("JER") ) {
+      this.append("IE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("JE")  && "LMNST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("IE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 3).equals("JOR")  && "GK".indexOf(word.charAt(3)) != -1  && word.length() == 4) {
+      this.append("IÖRK");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("J") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("KC")  && "ÄEIJ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("KE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("KE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("KH") ) {
+      this.append("K");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("KIC")  && word.length() == 3) {
+      this.append("KIZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 3).equals("KLE")  && "LMNRST".indexOf(word.charAt(3)) != -1 ) {
+      this.append("KLE");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("KOTELE") ) {
+      this.append("KUTL");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("KREAT") ) {
+      this.append("KREA");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("KST") ) {
+      this.append("XT");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("K")  && "SßXZ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("KTI")  && "AIOU".indexOf(word.charAt(3)) != -1 ) {
+      this.append("XI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("KT")  && "SßXZ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(3);
+      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() >= 5 && word.substring(0, 5).equals("LARVE") ) {
+      this.append("LARF");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("LEAND") ) {
+      this.append("LEAN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("LEL") ) {
+      this.append("LE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("LE")  && "MNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("LE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("LETTE")  && word.length() == 5) {
+      this.append("LET");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("LFGNAG") ) {
+      this.append("LFKAN");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("LIC")  && word.length() == 3) {
+      this.append("LIZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("LIVE")  && word.length() == 4) {
+      this.append("LEIF");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("LUI")  && "GS".indexOf(word.charAt(3)) != -1 ) {
+      this.append("LU");
+      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() >= 7 && word.substring(0, 6).equals("MASSEU")  && "RS".indexOf(word.charAt(6)) != -1 ) {
+      this.append("NAZÖ");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 7 && word.substring(0, 7).equals("MAURICE") ) {
+      this.append("NURIZ");
+      this.word = this.word.substring(7);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("MBH")  && word.length() == 3) {
+      this.append("MPH");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("MB")  && "SßZ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("N");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("MC") ) {
+      this.append("NK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("MEMOIR") ) {
+      this.append("NENUA");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("ME")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("NE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("MIGUEL") ) {
+      this.append("NIKL");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("MIKE")  && word.length() == 4) {
+      this.append("NEIK");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("MN") ) {
+      this.append("N");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("MPJUTE") ) {
+      this.append("NPUT");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("MP")  && "SßZ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("N");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("MP")  && "BDJLMNPQRTVW".indexOf(word.charAt(2)) != -1 ) {
+      this.append("NP");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("M") ) {
+      this.append("N");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("NACH") ) {
+      this.append("NAK");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("NADINE") ) {
+      this.append("NATIN");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("NAIV") ) {
+      this.append("NA");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("NAISE")  && word.length() == 5) {
+      this.append("NEZE");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("NCOISE")  && word.length() == 6) {
+      this.append("ZUA");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("NCOIS")  && word.length() == 5) {
+      this.append("ZUA");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("NEBEN") ) {
+      this.append("NEPN");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("NE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("NE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("NEN") ) {
+      this.append("NE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("NETTE")  && word.length() == 5) {
+      this.append("NET");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("NG")  && "BDFJLMNPQRTVW".indexOf(word.charAt(2)) != -1 ) {
+      this.append("NK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("NICHTS") ) {
+      this.append("NIX");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("NICHT") ) {
+      this.append("NIKT");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("NINE")  && word.length() == 4) {
+      this.append("NIN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("NON") ) {
+      this.append("NUN");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("NOT") ) {
+      this.append("NUT");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("NTI")  && "AIOU".indexOf(word.charAt(3)) != -1 ) {
+      this.append("NZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("NTIEL") ) {
+      this.append("NZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("NYLON") ) {
+      this.append("NEILUN");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ND")  && "SßZ".indexOf(word.charAt(2)) != -1  && word.length() == 3) {
+      this.append("NZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("NT")  && "SßZ".indexOf(word.charAt(2)) != -1  && word.length() == 3) {
+      this.append("NZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ND'S")  && word.length() == 4) {
+      this.append("NZ");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("NT'S")  && word.length() == 4) {
+      this.append("NZ");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("NSTS")  && word.length() == 4) {
+      this.append("NZ");
+      this.word = this.word.substring(4);
+      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() >= 4 && word.substring(0, 4).equals("OBER") ) {
+      this.append("UPA");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("OE") ) {
+      this.append("Ö");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("OGNIE") ) {
+      this.append("UNI");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("OGN")  && "AEOU".indexOf(word.charAt(3)) != -1  && word.length() == 4) {
+      this.append("UNI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("OIE")  && word.length() == 3) {
+      this.append("Ö");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("OIR")  && word.length() == 3) {
+      this.append("UAR");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("OIX") ) {
+      this.append("UA");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("OI") ) {
+      this.append("EU");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("OJ")  && "AÄEIOÖUÜ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("U");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("OKAY")  && word.length() == 4) {
+      this.append("UKE");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("OLYN")  && word.length() == 4) {
+      this.append("ULIN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("OTI")  && "AÄOÖUÜ".indexOf(word.charAt(3)) != -1 ) {
+      this.append("UZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("OUI") ) {
+      this.append("FI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("OUILLE")  && word.length() == 6) {
+      this.append("ULIE");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("OU")  && "DT".indexOf(word.charAt(2)) != -1 ) {
+      this.append("AU");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("OUSE")  && word.length() == 4) {
+      this.append("AUZ");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("OUT") ) {
+      this.append("AU");
+      this.word = this.word.substring(2);
+      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() >= 3 && word.substring(0, 3).equals("OWS")  && word.length() == 3) {
+      this.append("UZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("OY")  && "AÄEIOÖUÜ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("U");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("O")  && "JY".indexOf(word.charAt(1)) != -1 ) {
+      this.append("EU");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("O") ) {
+      this.append("U");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("PATIEN") ) {
+      this.append("PAZI");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("PENSIO") ) {
+      this.append("PANZI");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("PE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("PE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("PFER") ) {
+      this.append("FE");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("P")  && "FH".indexOf(word.charAt(1)) != -1 ) {
+      this.append("F");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("POLY") ) {
+      this.append("PULI");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 8 && word.substring(0, 8).equals("PORTRAIT") ) {
+      this.append("PURTRE");
+      this.word = this.word.substring(8);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("PP")  && "FH".indexOf(word.charAt(2)) != -1 ) {
+      this.append("P");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("PP") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("PRIX")  && word.length() == 4) {
+      this.append("PRI");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 1).equals("P")  && "SßZ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Z");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("PTI")  && "AÄOÖUÜ".indexOf(word.charAt(3)) != -1 ) {
+      this.append("PZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("PIC")  && word.length() == 3) {
+      this.append("PIK");
+      this.word = this.word.substring(3);
+      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() >= 4 && word.substring(0, 3).equals("QUE")  && "LMNRST".indexOf(word.charAt(3)) != -1 ) {
+      this.append("KFE");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("QUE")  && word.length() == 3) {
+      this.append("K");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("QUI")  && "NS".indexOf(word.charAt(3)) != -1  && word.length() == 4) {
+      this.append("KI");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("QU") ) {
+      this.append("KF");
+      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("RCH") ) {
+      this.append("RK");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 8 && word.substring(0, 8).equals("RECHERCH") ) {
+      this.append("REZAZ");
+      this.word = this.word.substring(8);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("RER")  && word.length() == 3) {
+      this.append("RA");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("RE")  && "MNR".indexOf(word.charAt(2)) != -1 ) {
+      this.append("RE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("RETTE")  && word.length() == 5) {
+      this.append("RET");
+      this.word = this.word.substring(5);
+      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( word.length() >= 4 && word.substring(0, 3).equals("RJA")  && "MN".indexOf(word.charAt(3)) != -1 ) {
+      this.append("RI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("RTI")  && "AÄOÖUÜ".indexOf(word.charAt(3)) != -1 ) {
+      this.append("RZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("RY")  && "KN".indexOf(word.charAt(2)) != -1  && word.length() == 3) {
+      this.append("RI");
+      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( this.starting && word.length() >= 4 && word.substring(0, 4).equals("SAFE")  && word.length() == 4) {
+      this.append("ZEIF");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("SAUCE") ) {
+      this.append("ZUZ");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("SCHSCH") ) {
+      this.append("");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 7 && word.substring(0, 7).equals("SCHTSCH") ) {
+      this.append("Z");
+      this.word = this.word.substring(7);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("SC")  && "HZ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Z");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SC") ) {
+      this.append("ZK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 8 && word.substring(0, 8).equals("SELBSTST") ) {
+      this.append("ZELP");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("SELBST") ) {
+      this.append("ZELPZT");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 7 && word.substring(0, 7).equals("SERVICE") ) {
+      this.append("ZÖRFIZ");
+      this.word = this.word.substring(7);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("SE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ZE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("SETTE")  && word.length() == 5) {
+      this.append("ZET");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("SHP") ) {
+      this.append("Z");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("SHST") ) {
+      this.append("ZT");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("SHTSH") ) {
+      this.append("Z");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("SHT") ) {
+      this.append("Z");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SH") ) {
+      this.append("Z");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("SIEGLI") ) {
+      this.append("ZIKL");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("SIGLI") ) {
+      this.append("ZIKL");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("SIGHT") ) {
+      this.append("ZEIT");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("SIGN") ) {
+      this.append("ZEIN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("SKI")  && "NPZ".indexOf(word.charAt(3)) != -1 ) {
+      this.append("ZKI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("SKI") ) {
+      this.append("ZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("SOUND") ) {
+      this.append("ZAUN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("STAATS") ) {
+      this.append("ZTAZ");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("STADT") ) {
+      this.append("ZTAT");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("START") ) {
+      this.append("ZTART");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 8 && word.substring(0, 8).equals("STAURANT") ) {
+      this.append("ZTURAN");
+      this.word = this.word.substring(8);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("STEAK") ) {
+      this.append("ZTE");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("STRAF") ) {
+      this.append("ZTRAF");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ST'S")  && word.length() == 4) {
+      this.append("Z");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("STST") ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("STS")  && "ACEHIOUÄÜÖ".indexOf(word.charAt(3)) != -1 ) {
+      this.append("ZT");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ST")  && "SZ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Z");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 4).equals("STYN")  && "AE".indexOf(word.charAt(4)) != -1  && word.length() == 5) {
+      this.append("ZTIN");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ST") ) {
+      this.append("ZT");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 3).equals("SZE")  && "NPT".indexOf(word.charAt(3)) != -1 ) {
+      this.append("ZE");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 3).equals("SZI")  && "ELN".indexOf(word.charAt(3)) != -1 ) {
+      this.append("ZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("SZCZ") ) {
+      this.append("Z");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("SZT") ) {
+      this.append("ZT");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("SZ") ) {
+      this.append("Z");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("S") ) {
+      this.append("Z");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("T'S")  && word.length() == 3) {
+      this.append("Z");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("TCH") ) {
+      this.append("Z");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("TEAT") ) {
+      this.append("TEA");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("TE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("TE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("TH") ) {
+      this.append("T");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("TIC")  && word.length() == 3) {
+      this.append("TIZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("TOAS") ) {
+      this.append("TU");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("TOILET") ) {
+      this.append("TULE");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("TOIN") ) {
+      this.append("TUA");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("TRAINI") ) {
+      this.append("TREN");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("TSCH") ) {
+      this.append("Z");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("TSH") ) {
+      this.append("Z");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("TST") ) {
+      this.append("ZT");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("T")  && "Sß".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Z");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("TT")  && "SZ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("");
+      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() >= 2 && word.substring(0, 2).equals("TZ") ) {
+      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() >= 5 && word.substring(0, 5).equals("UEBER") ) {
+      this.append("IPA");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("UE") ) {
+      this.append("I");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("UIE")  && word.length() == 3) {
+      this.append("I");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("UM") ) {
+      this.append("UN");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("UNTERE") ) {
+      this.append("UNTE");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("UNTER") ) {
+      this.append("UNTA");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("UNVER") ) {
+      this.append("UNFA");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("UN") ) {
+      this.append("UN");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("UTI")  && "AÄOÖUÜ".indexOf(word.charAt(3)) != -1 ) {
+      this.append("UZI");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("U") ) {
+      this.append("U");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("VACL") ) {
+      this.append("FAZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("VAC")  && word.length() == 3) {
+      this.append("FAZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("VEDD") ) {
+      this.append("FE");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("VEREIN") ) {
+      this.append("FAEIN");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("VERSEN") ) {
+      this.append("FAZN");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("VER") ) {
+      this.append("FA");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("VER") ) {
+      this.append("FA");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 3).equals("VET")  && "HT".indexOf(word.charAt(3)) != -1 ) {
+      this.append("FET");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("VETTE")  && word.length() == 5) {
+      this.append("FET");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("VIC")  && word.length() == 3) {
+      this.append("FIZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("VIEL") ) {
+      this.append("FIL");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("VIEW") ) {
+      this.append("FIU");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 3).equals("VOR") ) {
+      this.append("FUR");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("VY") ) {
+      this.append("FI");
+      this.word = this.word.substring(2);
+      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() >= 3 && word.substring(0, 2).equals("WE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("FE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("WIC")  && word.length() == 3) {
+      this.append("FIZ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("WIEDER") ) {
+      this.append("FITA");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 2 && word.substring(0, 2).equals("WY") ) {
+      this.append("FI");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("W") ) {
+      this.append("F");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("XE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("XE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 1 && word.substring(0, 1).equals("X") ) {
+      this.append("Z");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("X")  && "CSZ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("X");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 3).equals("XTS")  && "CH".indexOf(word.charAt(3)) != -1 ) {
+      this.append("XT");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("XT")  && "SZ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("Z");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("X") ) {
+      this.append("X");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("YE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("IE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("YE") ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 3).equals("YOR")  && "GK".indexOf(word.charAt(3)) != -1  && word.length() == 4) {
+      this.append("IÖRK");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Y")  && "AOU".indexOf(word.charAt(1)) != -1 ) {
+      this.append("I");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( this.starting && word.length() >= 4 && word.substring(0, 4).equals("YVES")  && word.length() == 4) {
+      this.append("IF");
+      this.word = this.word.substring(4);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("YVONNE")  && word.length() == 6) {
+      this.append("IFUN");
+      this.word = this.word.substring(6);
+      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() >= 3 && word.substring(0, 2).equals("ZC")  && "AOU".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ZK");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( this.starting && word.length() >= 3 && word.substring(0, 2).equals("ZE")  && "LMNRST".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ZE");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ZH") ) {
+      this.append("Z");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ZS")  && "CHT".indexOf(word.charAt(2)) != -1 ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ZS") ) {
+      this.append("Z");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 6 && word.substring(0, 6).equals("ZUERST") ) {
+      this.append("ZUERZT");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 6 && word.substring(0, 6).equals("ZURÜCK") ) {
+      this.append("ZURIK");
+      this.word = this.word.substring(6);
+      return true;
+    }
+    if( this.starting && word.length() >= 5 && word.substring(0, 5).equals("ZUVER") ) {
+      this.append("ZUFA");
+      this.word = this.word.substring(5);
+      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) {
+    AphoneDe aphone = new AphoneDe();
+    for(int i = 0; i < args.length; i++) {
+      System.out.println(aphone.toPhone(args[i]));
+    }
+  }
+}
Index: contrib/aphone/src/java/org/apache/lucene/aphone/AphoneIs.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneIs.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneIs.java	(revision 0)
@@ -0,0 +1,140 @@
+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 AphoneIs extends Aphone{
+  private StringBuffer phone;
+  private String word;
+  private boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    if(word == null)
+      return null;
+    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("S") ) {
+      this.append("Z");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("N")  && word.length() == 1) {
+      this.append("NN");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("NN")  && word.length() == 2) {
+      this.append("N");
+      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() >= 1 && word.substring(0, 1).equals("I") ) {
+      this.append("Y");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("L") ) {
+      this.append("LL");
+      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() >= 2 && word.substring(0, 2).equals("FL") ) {
+      this.append("BL");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("LL") ) {
+      this.append("DL");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("RN") ) {
+      this.append("RDN");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("NGD") ) {
+      this.append("GND");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 5 && word.substring(0, 5).equals("TÖLVA") ) {
+      this.append("TALVA");
+      this.word = this.word.substring(5);
+      return true;
+    }
+    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;
+    }
+
+    this.word = this.word.substring(1);
+    return false;
+  }
+  /**
+   * Simple test
+   */
+  public static void main(String[] args) {
+    AphoneIs aphone = new AphoneIs();
+    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,40 @@
+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 abstract class Aphone {
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public abstract String toPhone(String word);
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(char[] word) {
+    return toPhone(new String(word));
+  }
+}
Index: contrib/aphone/src/java/org/apache/lucene/aphone/AphoneEl.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneEl.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneEl.java	(revision 0)
@@ -0,0 +1,485 @@
+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 AphoneEl extends Aphone{
+  private StringBuffer phone;
+  private String word;
+  private boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    if(word == null)
+      return null;
+    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("ΒΒ") ) {
+      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( word.length() >= 2 && word.substring(0, 2).equals("ΓΓ") ) {
+      this.append("ΓΚ");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).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( word.length() >= 2 && word.substring(0, 2).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( word.length() >= 2 && word.substring(0, 2).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( word.length() >= 2 && word.substring(0, 2).equals("ΚΚ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ΚΣ") ) {
+      this.append("Ξ");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).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( word.length() >= 2 && word.substring(0, 2).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( word.length() >= 2 && word.substring(0, 2).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( word.length() >= 2 && word.substring(0, 2).equals("ΠΠ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ΠΣ") ) {
+      this.append("Ψ");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).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( word.length() >= 2 && word.substring(0, 2).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( word.length() >= 2 && word.substring(0, 2).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( word.length() >= 2 && word.substring(0, 2).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( word.length() >= 2 && word.substring(0, 2).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( word.length() >= 2 && word.substring(0, 2).equals("ΑΎ") ) {
+      this.append("ΑΥ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ΑΥΝΤ") ) {
+      this.append("ΑΒ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ΑΥΓΚ") ) {
+      this.append("ΑΒ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ΑΥΤΖ") ) {
+      this.append("ΑΒ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ΑΥ")  && "ΓΔΖΛΜΝΡ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ΑΒ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ΑΥΒ") ) {
+      this.append("ΑΒ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ΑΥ")  && "ΑΕΗΙΟΩΥΆΈΉΊΌΏΎ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ΑΒ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ΑΥΦ") ) {
+      this.append("ΑΦ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ΑΥΤΣ") ) {
+      this.append("ΑΦ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ΑΥ")  && "ΘΚΠΣΤΧ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ΑΦ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ΑΥΞ") ) {
+      this.append("ΑΦ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ΑΥΨ") ) {
+      this.append("ΑΦ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Α")  && "ΙΊ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Ε");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ΕΎ") ) {
+      this.append("Υ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ΕΥΝΤ") ) {
+      this.append("ΕΒ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ΕΥΓΚ") ) {
+      this.append("ΕΒ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ΕΥΤΖ") ) {
+      this.append("ΕΒ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ΕΥ")  && "ΓΔΖΛΜΝΡ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ΕΒ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ΕΥΒ") ) {
+      this.append("ΕΒ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ΕΥ")  && "ΑΕΗΙΟΩΥΆΈΉΊΌΏΎ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ΕΒ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ΕΥΦ") ) {
+      this.append("ΕΦ");
+      this.word = this.word.substring(3);
+      return true;
+    }
+    if( word.length() >= 4 && word.substring(0, 4).equals("ΕΥΤΣ") ) {
+      this.append("");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 2).equals("ΕΥ")  && "ΘΚΠΣΤΧ".indexOf(word.charAt(2)) != -1 ) {
+      this.append("ΕΦ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ΕΥΞ") ) {
+      this.append("ΕΦ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 3 && word.substring(0, 3).equals("ΕΥΨ") ) {
+      this.append("ΕΦ");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ε")  && "ΙΊ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Ι");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ο")  && "ΙΊ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("Ι");
+      this.word = this.word.substring(2);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 1).equals("Ο")  && "ΥΎ".indexOf(word.charAt(1)) != -1 ) {
+      this.append("ΟΥ");
+      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;
+    }
+    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( word.length() >= 2 && word.substring(0, 2).equals("ΥΙ") ) {
+      this.append("Ι");
+      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;
+    }
+    if( word.length() >= 1 && word.substring(0, 1).equals("Ι") ) {
+      this.append("Ι");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ΞΞ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ΞΣ") ) {
+      this.append("Ξ");
+      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;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ΨΨ") ) {
+      this.append("");
+      this.word = this.word.substring(1);
+      return true;
+    }
+    if( word.length() >= 2 && word.substring(0, 2).equals("ΨΣ") ) {
+      this.append("Ψ");
+      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;
+    }
+    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( 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( 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( 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( 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) {
+    AphoneEl aphone = new AphoneEl();
+    for(int i = 0; i < args.length; i++) {
+      System.out.println(aphone.toPhone(args[i]));
+    }
+  }
+}
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,595 @@
+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 extends Aphone{
+  private StringBuffer phone;
+  private String word;
+  private boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    if(word == null)
+      return null;
+    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/src/java/org/apache/lucene/aphone/AphoneBr.java
===================================================================
--- contrib/aphone/src/java/org/apache/lucene/aphone/AphoneBr.java	(revision 0)
+++ contrib/aphone/src/java/org/apache/lucene/aphone/AphoneBr.java	(revision 0)
@@ -0,0 +1,465 @@
+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 AphoneBr extends Aphone{
+  private StringBuffer phone;
+  private String word;
+  private boolean starting;
+
+  /**
+   * @param a word
+   * @return phonetic transcription
+   */
+  public String toPhone(String word) {
+    if(word == null)
+      return null;
+    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("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() >= 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() >= 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() >= 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() >= 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() >= 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) {
+    AphoneBr aphone = new AphoneBr();
+    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>
