diff --git a/java/src/org/futo/inputmethod/event/CombinerChain.java b/java/src/org/futo/inputmethod/event/CombinerChain.java
index 4770f0e5c78c3c1a026da5e1684b2b2f1b66847a..98dbccd773a91a1986d4b317095daf201690b641 100644
--- a/java/src/org/futo/inputmethod/event/CombinerChain.java
+++ b/java/src/org/futo/inputmethod/event/CombinerChain.java
@@ -20,8 +20,11 @@ import android.text.SpannableStringBuilder;
 import android.text.TextUtils;
 
 import org.futo.inputmethod.latin.common.Constants;
+import org.futo.inputmethod.v2keyboard.CombinerKind;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.ArrayList;
+import java.util.List;
 
 import javax.annotation.Nonnull;
 
@@ -62,6 +65,15 @@ public class CombinerChain {
         mStateFeedback = new SpannableStringBuilder();
     }
 
+    public CombinerChain(@NotNull List<@NotNull CombinerKind> combiners, final String initialText) {
+        mCombiners = new ArrayList<>();
+        for (final CombinerKind combiner : combiners) {
+            mCombiners.add(combiner.getFactory().invoke());
+        }
+        mCombinedText = new StringBuilder(initialText);
+        mStateFeedback = new SpannableStringBuilder();
+    }
+
     public void reset() {
         mCombinedText.setLength(0);
         mStateFeedback.clear();
diff --git a/java/src/org/futo/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/org/futo/inputmethod/keyboard/KeyboardSwitcher.java
index c793b8b0fba46868a97b32afce105ccd79d033e0..c6d223b99b325a0203fe7107034085a06c4bd1d7 100644
--- a/java/src/org/futo/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/org/futo/inputmethod/keyboard/KeyboardSwitcher.java
@@ -157,6 +157,7 @@ public final class KeyboardSwitcher implements SwitchActions {
             );
 
             mState.onLoadKeyboard(editorInfo, currentAutoCapsState, currentRecapitalizeState);
+            mLatinIMELegacy.setCombiners(mKeyboardLayoutSet.getMainLayout().getCombiners());
             mKeyboardTextsSet.setLocale(mRichImm.getCurrentSubtypeLocale(), mThemeContext);
         } catch (Exception e) {
             Log.e(TAG, "loading keyboard failed: ", e);
diff --git a/java/src/org/futo/inputmethod/latin/LatinIMELegacy.java b/java/src/org/futo/inputmethod/latin/LatinIMELegacy.java
index 75850d6615fa24ac1b58c0a5cce454dd3551105b..9ca8d82567134b9823a2f155f558671d84e470d4 100644
--- a/java/src/org/futo/inputmethod/latin/LatinIMELegacy.java
+++ b/java/src/org/futo/inputmethod/latin/LatinIMELegacy.java
@@ -96,10 +96,13 @@ import org.futo.inputmethod.latin.utils.StatsUtilsManager;
 import org.futo.inputmethod.latin.utils.SubtypeLocaleUtils;
 import org.futo.inputmethod.latin.utils.ViewLayoutUtils;
 import org.futo.inputmethod.latin.xlm.LanguageModelFacilitator;
+import org.futo.inputmethod.v2keyboard.CombinerKind;
+import org.jetbrains.annotations.NotNull;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
 
@@ -1965,4 +1968,8 @@ public class LatinIMELegacy implements KeyboardActionListener,
     public void onCodePointDeleted(String textBeforeCursor) {
         ((LatinIME)(mInputMethodService)).onEmojiDeleted(textBeforeCursor);
     }
+
+    public void setCombiners(@NotNull List<@NotNull CombinerKind> combiners) {
+        mInputLogic.mWordComposer.setCombiners(combiners);
+    }
 }
diff --git a/java/src/org/futo/inputmethod/latin/WordComposer.java b/java/src/org/futo/inputmethod/latin/WordComposer.java
index faf52f9743ea8df522f117393a3e648d8c4b3efa..8e61f5161d356c02f7b3d641addf172c0868c8a7 100644
--- a/java/src/org/futo/inputmethod/latin/WordComposer.java
+++ b/java/src/org/futo/inputmethod/latin/WordComposer.java
@@ -27,9 +27,12 @@ import org.futo.inputmethod.latin.common.InputPointers;
 import org.futo.inputmethod.latin.common.StringUtils;
 import org.futo.inputmethod.latin.define.DebugFlags;
 import org.futo.inputmethod.latin.define.DecoderSpecificConstants;
+import org.futo.inputmethod.v2keyboard.CombinerKind;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
 import java.util.Locale;
 
 import javax.annotation.Nonnull;
@@ -111,6 +114,11 @@ public final class WordComposer {
         }
     }
 
+    public void setCombiners(@NotNull List<@NotNull CombinerKind> combiners) {
+        mCombinerChain = new CombinerChain(combiners,
+                mCombinerChain.getComposingWordWithCombiningFeedback().toString());
+    }
+
     /**
      * Clear out the keys registered so far.
      */
diff --git a/java/src/org/futo/inputmethod/v2keyboard/CombinerKind.kt b/java/src/org/futo/inputmethod/v2keyboard/CombinerKind.kt
new file mode 100644
index 0000000000000000000000000000000000000000..a29499ffbb6aa4d4b1ae0d9b548955d256705de7
--- /dev/null
+++ b/java/src/org/futo/inputmethod/v2keyboard/CombinerKind.kt
@@ -0,0 +1,8 @@
+package org.futo.inputmethod.v2keyboard
+
+import org.futo.inputmethod.event.Combiner
+import org.futo.inputmethod.event.DeadKeyCombiner
+
+enum class CombinerKind(val factory: () -> Combiner) {
+    DeadKey({ DeadKeyCombiner() }),
+}
\ No newline at end of file
diff --git a/java/src/org/futo/inputmethod/v2keyboard/Keyboard.kt b/java/src/org/futo/inputmethod/v2keyboard/Keyboard.kt
index 60847596e8ada6c392422ed1a4100a7684a318c2..7651976e6e93557ace9122818d2c545795ed5cbb 100644
--- a/java/src/org/futo/inputmethod/v2keyboard/Keyboard.kt
+++ b/java/src/org/futo/inputmethod/v2keyboard/Keyboard.kt
@@ -256,8 +256,13 @@ data class Keyboard(
     /**
      * (optional) Alternative pages for this layout, use in conjunction with $alt0, $alt1, $alt2
      */
-    val altPages: List<List<Row>> = listOf()
+    val altPages: List<List<Row>> = listOf(),
 
+
+    /**
+     * (optional) Which combiners to use for this layout
+     */
+    val combiners: List<CombinerKind> = listOf(CombinerKind.DeadKey)
     // TODO: Custom long-press key settings configuration
     //val element: KeyboardElement = KeyboardElement.Alphabet,
     //val rowWidthMode: RowWidthMode = RowWidthMode.PadSides,