diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
index fa301b5a660e851450d4126d11d9182e48afb5f4..d0a4afd501b57e56ade9a1b167d3a3f287008ff2 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
@@ -235,7 +235,7 @@ final public class BinaryDictionaryGetter {
                     new BinaryDictInputOutput.ByteBufferWrapper(inStream.getChannel().map(
                             FileChannel.MapMode.READ_ONLY, 0, f.length()));
             final int magic = buffer.readInt();
-            if (magic != FormatSpec.VERSION_2_MAGIC_NUMBER) {
+            if (magic != FormatSpec.MAGIC_NUMBER) {
                 return false;
             }
             final int formatVersion = buffer.readInt();
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
index 1b187d85da751320bba24490d29fa84438bc4572..e2fa0231d49be488e0acad5f26b96c33141ba5aa 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
@@ -1210,49 +1210,38 @@ public final class BinaryDictInputOutput {
         ByteArrayOutputStream headerBuffer = new ByteArrayOutputStream(256);
 
         // The magic number in big-endian order.
-        if (version >= FormatSpec.FIRST_VERSION_WITH_HEADER_SIZE) {
-            // Magic number for version 2+.
-            headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_2_MAGIC_NUMBER >> 24)));
-            headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_2_MAGIC_NUMBER >> 16)));
-            headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_2_MAGIC_NUMBER >> 8)));
-            headerBuffer.write((byte) (0xFF & FormatSpec.VERSION_2_MAGIC_NUMBER));
-            // Dictionary version.
-            headerBuffer.write((byte) (0xFF & (version >> 8)));
-            headerBuffer.write((byte) (0xFF & version));
-        } else {
-            // Magic number for version 1.
-            headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_1_MAGIC_NUMBER >> 8)));
-            headerBuffer.write((byte) (0xFF & FormatSpec.VERSION_1_MAGIC_NUMBER));
-            // Dictionary version.
-            headerBuffer.write((byte) (0xFF & version));
-        }
+        // Magic number for all versions.
+        headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 24)));
+        headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 16)));
+        headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 8)));
+        headerBuffer.write((byte) (0xFF & FormatSpec.MAGIC_NUMBER));
+        // Dictionary version.
+        headerBuffer.write((byte) (0xFF & (version >> 8)));
+        headerBuffer.write((byte) (0xFF & version));
+
         // Options flags
         final int options = makeOptionsValue(dict, formatOptions);
         headerBuffer.write((byte) (0xFF & (options >> 8)));
         headerBuffer.write((byte) (0xFF & options));
-        if (version >= FormatSpec.FIRST_VERSION_WITH_HEADER_SIZE) {
-            final int headerSizeOffset = headerBuffer.size();
-            // Placeholder to be written later with header size.
-            for (int i = 0; i < 4; ++i) {
-                headerBuffer.write(0);
-            }
-            // Write out the options.
-            for (final String key : dict.mOptions.mAttributes.keySet()) {
-                final String value = dict.mOptions.mAttributes.get(key);
-                CharEncoding.writeString(headerBuffer, key);
-                CharEncoding.writeString(headerBuffer, value);
-            }
-            final int size = headerBuffer.size();
-            final byte[] bytes = headerBuffer.toByteArray();
-            // Write out the header size.
-            bytes[headerSizeOffset] = (byte) (0xFF & (size >> 24));
-            bytes[headerSizeOffset + 1] = (byte) (0xFF & (size >> 16));
-            bytes[headerSizeOffset + 2] = (byte) (0xFF & (size >> 8));
-            bytes[headerSizeOffset + 3] = (byte) (0xFF & (size >> 0));
-            destination.write(bytes);
-        } else {
-            headerBuffer.writeTo(destination);
-        }
+        final int headerSizeOffset = headerBuffer.size();
+        // Placeholder to be written later with header size.
+        for (int i = 0; i < 4; ++i) {
+            headerBuffer.write(0);
+        }
+        // Write out the options.
+        for (final String key : dict.mOptions.mAttributes.keySet()) {
+            final String value = dict.mOptions.mAttributes.get(key);
+            CharEncoding.writeString(headerBuffer, key);
+            CharEncoding.writeString(headerBuffer, value);
+        }
+        final int size = headerBuffer.size();
+        final byte[] bytes = headerBuffer.toByteArray();
+        // Write out the header size.
+        bytes[headerSizeOffset] = (byte) (0xFF & (size >> 24));
+        bytes[headerSizeOffset + 1] = (byte) (0xFF & (size >> 16));
+        bytes[headerSizeOffset + 2] = (byte) (0xFF & (size >> 8));
+        bytes[headerSizeOffset + 3] = (byte) (0xFF & (size >> 0));
+        destination.write(bytes);
 
         headerBuffer.close();
 
@@ -1658,10 +1647,8 @@ public final class BinaryDictInputOutput {
      */
     private static int getFormatVersion(final FusionDictionaryBufferInterface buffer)
             throws IOException {
-        final int magic_v1 = buffer.readUnsignedShort();
-        if (FormatSpec.VERSION_1_MAGIC_NUMBER == magic_v1) return buffer.readUnsignedByte();
-        final int magic_v2 = (magic_v1 << 16) + buffer.readUnsignedShort();
-        if (FormatSpec.VERSION_2_MAGIC_NUMBER == magic_v2) return buffer.readUnsignedShort();
+        final int magic = buffer.readInt();
+        if (FormatSpec.MAGIC_NUMBER == magic) return buffer.readUnsignedShort();
         return FormatSpec.NOT_A_VERSION_NUMBER;
     }
 
@@ -1695,13 +1682,9 @@ public final class BinaryDictInputOutput {
 
         final HashMap<String, String> attributes = new HashMap<String, String>();
         final int headerSize;
-        if (version < FormatSpec.FIRST_VERSION_WITH_HEADER_SIZE) {
-            headerSize = buffer.position();
-        } else {
-            headerSize = buffer.readInt();
-            populateOptions(buffer, headerSize, attributes);
-            buffer.position(headerSize);
-        }
+        headerSize = buffer.readInt();
+        populateOptions(buffer, headerSize, attributes);
+        buffer.position(headerSize);
 
         if (headerSize < 0) {
             throw new UnsupportedFormatException("header size can't be negative.");
diff --git a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java
index 46266aa504060171a4a16d37098c9168a2f2b0ac..2bb5d8b6e0f597ca80a612f791a2a604a5278cce 100644
--- a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java
+++ b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java
@@ -25,6 +25,40 @@ import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions
  */
 public final class FormatSpec {
 
+    /*
+     * File header layout is as follows:
+     *
+     * v |
+     * e | MAGIC_NUMBER + version of the file format, 2 bytes.
+     * r |
+     * sion
+     *
+     * o |
+     * p | not used                                4 bits
+     * t | has bigrams ?                           1 bit, 1 = yes, 0 = no : CONTAINS_BIGRAMS_FLAG
+     * i | FRENCH_LIGATURE_PROCESSING_FLAG
+     * o | supports dynamic updates ?              1 bit, 1 = yes, 0 = no : SUPPORTS_DYNAMIC_UPDATE
+     * n | GERMAN_UMLAUT_PROCESSING_FLAG
+     * f |
+     * lags
+     *
+     * h |
+     * e | size of the file header, 4bytes
+     * a |   including the size of the magic number, the option flags and the header size
+     * d |
+     * ersize
+     *
+     *   | attributes list
+     *
+     * attributes list is:
+     * <key>   = | string of characters at the char format described below, with the terminator used
+     *           | to signal the end of the string.
+     * <value> = | string of characters at the char format described below, with the terminator used
+     *           | to signal the end of the string.
+     * if the size of already read < headersize, goto key.
+     *
+     */
+
     /*
      * Array of Node(FusionDictionary.Node) layout is as follows:
      *
@@ -151,12 +185,10 @@ public final class FormatSpec {
      * if (FLAG_ATTRIBUTE_HAS_NEXT goto flags
      */
 
-    static final int VERSION_1_MAGIC_NUMBER = 0x78B1;
-    public static final int VERSION_2_MAGIC_NUMBER = 0x9BC13AFE;
-    static final int MINIMUM_SUPPORTED_VERSION = 1;
+    public static final int MAGIC_NUMBER = 0x9BC13AFE;
+    static final int MINIMUM_SUPPORTED_VERSION = 2;
     static final int MAXIMUM_SUPPORTED_VERSION = 3;
     static final int NOT_A_VERSION_NUMBER = -1;
-    static final int FIRST_VERSION_WITH_HEADER_SIZE = 2;
     static final int FIRST_VERSION_WITH_DYNAMIC_UPDATE = 3;
 
     // These options need to be the same numeric values as the one in the native reading code.