diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
index e2c1254cecffe93311a45609d71abc5fc624eae3..b97be05436ef8a602abf8ed8e1a96e7add267ac6 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
@@ -246,4 +246,34 @@ public class BinaryDictIOUtils {
         buffer.position(wordPosition);
         buffer.put((byte)newFlags);
     }
+
+    private static void putSInt24(final FusionDictionaryBufferInterface buffer,
+            final int value) {
+        final int absValue = Math.abs(value);
+        buffer.put((byte)(((value < 0 ? 0x80 : 0) | (absValue >> 16)) & 0xFF));
+        buffer.put((byte)((absValue >> 8) & 0xFF));
+        buffer.put((byte)(absValue & 0xFF));
+    }
+
+    /**
+     * Update a parent address in a CharGroup that is addressed by groupOriginAddress.
+     *
+     * @param buffer the buffer to write.
+     * @param groupOriginAddress the address of the group.
+     * @param newParentAddress the absolute address of the parent.
+     * @param formatOptions file format options.
+     */
+    public static void updateParentAddress(final FusionDictionaryBufferInterface buffer,
+            final int groupOriginAddress, final int newParentAddress,
+            final FormatOptions formatOptions) {
+        final int originalPosition = buffer.position();
+        buffer.position(groupOriginAddress);
+        if (!formatOptions.mSupportsDynamicUpdate) {
+            throw new RuntimeException("this file format does not support parent addresses");
+        }
+        final int flags = buffer.readUnsignedByte();
+        final int parentOffset = newParentAddress - groupOriginAddress;
+        putSInt24(buffer, parentOffset);
+        buffer.position(originalPosition);
+    }
 }