diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
index 58ec1e83fb1af49450238762056a2541021e586d..467f6a053337259cacddf39762c80f22df4eeccc 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
@@ -1467,8 +1467,8 @@ public final class BinaryDictInputOutput {
                     if (null == last) continue;
                     builder.append(new String(last.mCharacters, 0, last.mCharacters.length));
                     buffer.position(last.mChildrenAddress + headerSize);
-                    groupOffset = last.mChildrenAddress + 1;
-                    i = buffer.readUnsignedByte();
+                    i = readCharGroupCount(buffer);
+                    groupOffset = last.mChildrenAddress + getGroupCountSize(i);
                     last = null;
                     continue;
                 }
@@ -1477,8 +1477,8 @@ public final class BinaryDictInputOutput {
             if (0 == i && hasChildrenAddress(last.mChildrenAddress)) {
                 builder.append(new String(last.mCharacters, 0, last.mCharacters.length));
                 buffer.position(last.mChildrenAddress + headerSize);
-                groupOffset = last.mChildrenAddress + 1;
-                i = buffer.readUnsignedByte();
+                i = readCharGroupCount(buffer);
+                groupOffset = last.mChildrenAddress + getGroupCountSize(i);
                 last = null;
                 continue;
             }
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
index bd8729203abebaa8e939f9d2b56032ed2986224f..89913fa0a986b9444d8adc25ca2d8a383f1bfd53 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
@@ -137,7 +137,10 @@ public class BinaryDictIOTests extends AndroidTestCase {
             if (r < 0) continue;
             // Don't insert 0~20, but insert any other code point.
             // Code points are in the range 0~0x10FFFF.
-            builder.appendCodePoint((int)(20 + r % (0x10FFFF - 20)));
+            final int candidateCodePoint = (int)(20 + r % (0x10FFFF - 20));
+            // Code points between 0xD800 and 0xDFFF are not valid.
+            if (candidateCodePoint >= 0xD800 && candidateCodePoint <= 0xDFFF) continue;
+            builder.appendCodePoint(candidadeCodePoint);
             --count;
         }
         return builder.toString();