diff --git a/tika-core/src/main/java/org/apache/tika/language/LanguageIdentifier.java b/tika-core/src/main/java/org/apache/tika/language/LanguageIdentifier.java
index c4cbe33..ec38aa5 100644
--- a/tika-core/src/main/java/org/apache/tika/language/LanguageIdentifier.java
+++ b/tika-core/src/main/java/org/apache/tika/language/LanguageIdentifier.java
@@ -38,7 +38,9 @@ import java.util.logging.Logger;
 public class LanguageIdentifier {
     private static final Logger LOGGER = Logger.getLogger(LanguageIdentifier.class.getSimpleName());
     
-    private static final double MAX_CERTAINTY_LEVEL = 0.022;
+    private static final double MAX_CERTAINTY_RATIO = 0.65;
+    
+    private static final double MAX_CERTAINTY_LEVEL = 0.1;
     
     /**
      * The available language profiles.
@@ -108,23 +110,28 @@ public class LanguageIdentifier {
     }
     
     private final String language;
-
     private final double distance;
-
+    private final double ratio;
+    
     public LanguageIdentifier(LanguageProfile profile) {
         String minLanguage = "unknown";
         double minDistance = Double.MAX_VALUE;
+        double nextMinDistance = Double.MAX_VALUE;
         for (Map.Entry<String, LanguageProfile> entry : PROFILES.entrySet()) {
             double distance = profile.distance(entry.getValue());
             
             if (distance < minDistance) {
+                nextMinDistance = minDistance;
                 minDistance = distance;
                 minLanguage = entry.getKey();
+            } else if (distance < nextMinDistance) {
+                nextMinDistance = distance;
             }
         }
 
         this.language = minLanguage;
         this.distance = minDistance;
+        this.ratio = minDistance/nextMinDistance;
     }
 
     public LanguageIdentifier(String content) {
@@ -136,12 +143,12 @@ public class LanguageIdentifier {
     }
 
     public boolean isReasonablyCertain() {
-        return distance < MAX_CERTAINTY_LEVEL;
+        return (ratio < MAX_CERTAINTY_RATIO) && (distance < MAX_CERTAINTY_LEVEL);
     }
 
     @Override
     public String toString() {
-        return language + " (" + distance + ")";
+        return language + " (" + distance + "/" + ratio + ")";
     }
 
 }
diff --git a/tika-core/src/main/java/org/apache/tika/language/LanguageProfile.java b/tika-core/src/main/java/org/apache/tika/language/LanguageProfile.java
index 705f4af..36a703f 100644
--- a/tika-core/src/main/java/org/apache/tika/language/LanguageProfile.java
+++ b/tika-core/src/main/java/org/apache/tika/language/LanguageProfile.java
@@ -17,9 +17,7 @@
 package org.apache.tika.language;
 
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * Language profile based on ngram counts.
@@ -136,38 +134,6 @@ public class LanguageProfile {
      * @param that the other language profile
      * @return distance between the profiles
      */
-    public double distanceOld(LanguageProfile that) {
-        if (length != that.length) {
-            throw new IllegalArgumentException(
-                    "Unable to calculage distance of language profiles"
-                    + " with different ngram lengths: "
-                    + that.length + " != " + length);
-        }
-
-        double sumOfSquares = 0.0;
-        double thisCount = Math.max(this.totalCount, 1.0);
-        double thatCount = Math.max(that.totalCount, 1.0);
-
-        Set<String> ngrams = new HashSet<String>();
-        ngrams.addAll(this.ngrams.keySet());
-        ngrams.addAll(that.ngrams.keySet());
-        for (String ngram : ngrams) {
-            double thisFrequency = this.getCount(ngram) / thisCount;
-            double thatFrequency = that.getCount(ngram) / thatCount;
-            double difference = thisFrequency - thatFrequency;
-            sumOfSquares += difference * difference;
-        }
-
-        return Math.sqrt(sumOfSquares);
-    }
-
-    /**
-     * Calculates the geometric distance between this and the given
-     * other language profile.
-     *
-     * @param that the other language profile
-     * @return distance between the profiles
-     */
     public double distance(LanguageProfile that) {
         if (length != that.length) {
             throw new IllegalArgumentException(
diff --git a/tika-core/src/test/java/org/apache/tika/language/LanguageIdentifierTest.java b/tika-core/src/test/java/org/apache/tika/language/LanguageIdentifierTest.java
index 8999833..81e188d 100644
--- a/tika-core/src/test/java/org/apache/tika/language/LanguageIdentifierTest.java
+++ b/tika-core/src/test/java/org/apache/tika/language/LanguageIdentifierTest.java
@@ -34,15 +34,14 @@ import org.apache.tika.io.IOUtils;
 public class LanguageIdentifierTest extends TestCase {
 
     private static final String[] languages = new String[] {
-        "da", "de", /* "el", */ "en", "es", "fi", "fr", "it", "nl", "pt", "sv"
+        "da", "de", "el", "en", "es", "fi", "fr", "it", "nl", "pt", "sv"
     };
 
     public void testLanguageDetection() throws IOException {
         for (String language : languages) {
             ProfilingWriter writer = new ProfilingWriter();
             writeTo(language, writer);
-            LanguageIdentifier identifier =
-                new LanguageIdentifier(writer.getProfile());
+            LanguageIdentifier identifier = new LanguageIdentifier(writer.getProfile());
             assertTrue(identifier.toString(), identifier.isReasonablyCertain());
             assertEquals(language, identifier.getLanguage());
         }
@@ -55,21 +54,42 @@ public class LanguageIdentifierTest extends TestCase {
                     ProfilingWriter writer = new ProfilingWriter();
                     writeTo(language, writer);
                     writeTo(other, writer);
-                    LanguageIdentifier identifier =
-                        new LanguageIdentifier(writer.getProfile());
+                    LanguageIdentifier identifier = new LanguageIdentifier(writer.getProfile());
                     assertFalse(identifier.toString() + " looks like " + other, identifier.isReasonablyCertain());
                 }
             }
         }
     }
 
+    public void testLongGermanPage() throws Exception {
+        ProfilingWriter writer = new ProfilingWriter();
+        writeFile("de-2.test", writer);
+        LanguageIdentifier identifier = new LanguageIdentifier(writer.getProfile());
+        assertTrue(identifier.toString(), identifier.isReasonablyCertain());
+        assertEquals("de", identifier.getLanguage());
+    }
+    
+    public void testChinesePage() throws Exception {
+        ProfilingWriter writer = new ProfilingWriter();
+        writeFile("cn.test", writer);
+        LanguageIdentifier identifier = new LanguageIdentifier(writer.getProfile());
+        assertFalse(identifier.toString() + " looks like cn", identifier.isReasonablyCertain());
+
+    }
     private void writeTo(String language, Writer writer) throws IOException {
-        InputStream stream =
-            LanguageIdentifierTest.class.getResourceAsStream(language + ".test");
+        writeFile(language + ".test", writer);
+    }
+
+    private void writeFile(String filename, Writer writer) throws IOException {
+        InputStream stream = null;
+        
         try {
+            stream = LanguageIdentifierTest.class.getResourceAsStream(filename);
             IOUtils.copy(new InputStreamReader(stream, "UTF-8"), writer);
         } finally {
-            stream.close();
+            if (stream != null) {
+                stream.close();
+            }
         }
     }
 
