diff --git a/java/src/org/futo/inputmethod/keyboard/Key.java b/java/src/org/futo/inputmethod/keyboard/Key.java
index 70291b9b00a6a32e85f0eb802a835c332eed2117..bb84e5d81ffe6b4aceab7314e68ff9b7d54cf8dc 100644
--- a/java/src/org/futo/inputmethod/keyboard/Key.java
+++ b/java/src/org/futo/inputmethod/keyboard/Key.java
@@ -465,11 +465,18 @@ public class Key implements Comparable<Key> {
 
     @Nonnull
     public static Key removeRedundantMoreKeys(@Nonnull final Key key,
-            @Nonnull final MoreKeySpec.LettersOnBaseLayout lettersOnBaseLayout) {
+            @Nonnull final MoreKeySpec.LettersOnBaseLayout lettersOnBaseLayout, boolean onlyDuplicateKeys) {
         final MoreKeySpec[] moreKeys = key.getMoreKeys();
-        final MoreKeySpec[] filteredMoreKeys = MoreKeySpec.removeRedundantMoreKeys(
-                moreKeys, lettersOnBaseLayout);
-        return (filteredMoreKeys == moreKeys) ? key : new Key(key, filteredMoreKeys);
+
+        MoreKeySpec[] clearedMoreKeys = moreKeys;
+
+        clearedMoreKeys = MoreKeySpec.removeDuplicateMoreKeys(moreKeys);
+
+        if(!onlyDuplicateKeys) {
+            clearedMoreKeys = MoreKeySpec.removeRedundantMoreKeys(
+                    moreKeys, lettersOnBaseLayout);
+        }
+        return (clearedMoreKeys == moreKeys) ? key : new Key(key, clearedMoreKeys);
     }
 
     private static boolean needsToUpcase(final int labelFlags, final int keyboardElementId) {
diff --git a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardParams.java b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardParams.java
index 87de4c760ca4d4694cb9b8875d3c8a7ffc9363ce..093eef34b0f98a37bc829889bc60183554c022b1 100644
--- a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardParams.java
+++ b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardParams.java
@@ -139,9 +139,6 @@ public class KeyboardParams {
     }
 
     public void removeRedundantMoreKeys() {
-        if (mAllowRedundantMoreKeys) {
-            return;
-        }
         final MoreKeySpec.LettersOnBaseLayout lettersOnBaseLayout =
                 new MoreKeySpec.LettersOnBaseLayout();
         for (final Key key : mSortedKeys) {
@@ -150,7 +147,7 @@ public class KeyboardParams {
         final ArrayList<Key> allKeys = new ArrayList<>(mSortedKeys);
         mSortedKeys.clear();
         for (final Key key : allKeys) {
-            final Key filteredKey = Key.removeRedundantMoreKeys(key, lettersOnBaseLayout);
+            final Key filteredKey = Key.removeRedundantMoreKeys(key, lettersOnBaseLayout, mAllowRedundantMoreKeys);
             mSortedKeys.add(mUniqueKeysCache.getUniqueKey(filteredKey));
         }
     }
diff --git a/java/src/org/futo/inputmethod/keyboard/internal/MoreKeySpec.java b/java/src/org/futo/inputmethod/keyboard/internal/MoreKeySpec.java
index 0352e821c3e3e3f1227a23b3012a5891d29d9fab..7e2bfe67667f5b5574c75a36e8616de1410f0533 100644
--- a/java/src/org/futo/inputmethod/keyboard/internal/MoreKeySpec.java
+++ b/java/src/org/futo/inputmethod/keyboard/internal/MoreKeySpec.java
@@ -169,6 +169,29 @@ public final class MoreKeySpec {
         return filteredMoreKeys.toArray(new MoreKeySpec[size]);
     }
 
+
+    @Nullable
+    public static MoreKeySpec[] removeDuplicateMoreKeys(@Nullable final MoreKeySpec[] moreKeys) {
+        if (moreKeys == null) {
+            return null;
+        }
+
+        final ArrayList<MoreKeySpec> filteredMoreKeys = new ArrayList<>();
+        for (final MoreKeySpec moreKey : moreKeys) {
+            if (!filteredMoreKeys.contains(moreKey)) {
+                filteredMoreKeys.add(moreKey);
+            }
+        }
+
+        final int size = filteredMoreKeys.size();
+        if (size == moreKeys.length) {
+            return moreKeys;
+        }
+
+        return filteredMoreKeys.toArray(new MoreKeySpec[size]);
+    }
+
+
     // Constants for parsing.
     private static final char COMMA = Constants.CODE_COMMA;
     private static final char BACKSLASH = Constants.CODE_BACKSLASH;