diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 8b03379cab1c2b13824959e7baa334517dada810..b9bec989604aa0888ed46e2e1fee554a3f0eea06 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -293,6 +293,8 @@
     <string name="enable">Enable</string>
     <!-- Title of the button to postpone enabling a custom input style entry in the settings dialog [CHAR LIMIT=12] -->
     <string name="not_now">Not now</string>
+    <!-- Toast text to describe the same input style already exists [CHAR LIMIT=64]-->
+    <string name="custom_input_style_already_exists">"The same input style already exists: <xliff:g id="input_style_name">%s</xliff:g>"</string>
 
     <!-- Title of an option for usability study mode -->
     <string name="prefs_usability_study_mode">Usability study mode</string>
diff --git a/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java b/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
index a8115fb82a80d59a02f4ac71d011057728280e3c..779a38823f36112e57c1a78e17f41f5a1790e7d5 100644
--- a/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
+++ b/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
@@ -24,6 +24,7 @@ import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
+import android.content.res.Resources;
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -41,9 +42,11 @@ import android.view.inputmethod.InputMethodSubtype;
 import android.widget.ArrayAdapter;
 import android.widget.Spinner;
 import android.widget.SpinnerAdapter;
+import android.widget.Toast;
 
 import com.android.inputmethod.compat.CompatUtils;
 
+import java.util.ArrayList;
 import java.util.TreeSet;
 
 public class AdditionalSubtypeSettings extends PreferenceFragment {
@@ -60,7 +63,6 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
     private static final String KEY_IS_SUBTYPE_ENABLER_NOTIFICATION_DIALOG_OPEN =
             "is_subtype_enabler_notification_dialog_open";
     private static final String KEY_SUBTYPE_FOR_SUBTYPE_ENABLER = "subtype_for_subtype_enabler";
-
     static class SubtypeLocaleItem extends Pair<String, String>
             implements Comparable<SubtypeLocaleItem> {
         public SubtypeLocaleItem(String localeString, String displayName) {
@@ -139,6 +141,7 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
 
     private interface SubtypeDialogProxy {
         public void onRemovePressed(SubtypePreference subtypePref);
+        public void onSavePressed(SubtypePreference subtypePref);
         public void onAddPressed(SubtypePreference subtypePref);
         public SubtypeLocaleAdapter getSubtypeLocaleAdapter();
         public KeyboardLayoutSetAdapter getKeyboardLayoutSetAdapter();
@@ -150,6 +153,7 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
         private static final String KEY_NEW_SUBTYPE = KEY_PREFIX + "new";
 
         private InputMethodSubtype mSubtype;
+        private InputMethodSubtype mPreviousSubtype;
 
         private final SubtypeDialogProxy mProxy;
         private Spinner mSubtypeLocaleSpinner;
@@ -182,6 +186,7 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
         }
 
         public void setSubtype(InputMethodSubtype subtype) {
+            mPreviousSubtype = mSubtype;
             mSubtype = subtype;
             if (isIncomplete()) {
                 setTitle(null);
@@ -197,6 +202,14 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
             }
         }
 
+        public void revert() {
+            setSubtype(mPreviousSubtype);
+        }
+
+        public boolean hasBeenModified() {
+            return mSubtype != null && !mSubtype.equals(mPreviousSubtype);
+        }
+
         @Override
         protected View onCreateDialogView() {
             final View v = super.onCreateDialogView();
@@ -250,7 +263,7 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
             super.onClick(dialog, which);
             switch (which) {
             case DialogInterface.BUTTON_POSITIVE:
-                final boolean addPressed = isIncomplete();
+                final boolean isEditing = !isIncomplete();
                 final SubtypeLocaleItem locale =
                         (SubtypeLocaleItem) mSubtypeLocaleSpinner.getSelectedItem();
                 final KeyboardLayoutSetItem layout =
@@ -259,7 +272,9 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
                         locale.first, layout.first, ASCII_CAPABLE);
                 setSubtype(subtype);
                 notifyChanged();
-                if (addPressed) {
+                if (isEditing) {
+                    mProxy.onSavePressed(this);
+                } else {
                     mProxy.onAddPressed(this);
                 }
                 break;
@@ -414,18 +429,45 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
         public void onRemovePressed(SubtypePreference subtypePref) {
             mIsAddingNewSubtype = false;
             final PreferenceGroup group = getPreferenceScreen();
-            if (group != null) {
-                group.removePreference(subtypePref);
+            group.removePreference(subtypePref);
+            ImfUtils.setAdditionalInputMethodSubtypes(getActivity(), getSubtypes());
+        }
+
+        @Override
+        public void onSavePressed(SubtypePreference subtypePref) {
+            final InputMethodSubtype subtype = subtypePref.getSubtype();
+            if (!subtypePref.hasBeenModified()) {
+                return;
             }
+            if (findDuplicatedSubtype(subtype) == null) {
+                ImfUtils.setAdditionalInputMethodSubtypes(getActivity(), getSubtypes());
+                return;
+            }
+
+            // Saved subtype is duplicated.
+            final PreferenceGroup group = getPreferenceScreen();
+            group.removePreference(subtypePref);
+            subtypePref.revert();
+            group.addPreference(subtypePref);
+            showSubtypeAlreadyExistsToast(subtype);
         }
 
         @Override
         public void onAddPressed(SubtypePreference subtypePref) {
             mIsAddingNewSubtype = false;
-            setAdditionalInputMethodSubtypes(getPrefSubtypes());
-            mSubtypePreferenceKeyForSubtypeEnabler = subtypePref.getKey();
-            mSubtypeEnablerNotificationDialog = createDialog(subtypePref);
-            mSubtypeEnablerNotificationDialog.show();
+            final InputMethodSubtype subtype = subtypePref.getSubtype();
+            if (findDuplicatedSubtype(subtype) == null) {
+                ImfUtils.setAdditionalInputMethodSubtypes(getActivity(), getSubtypes());
+                mSubtypePreferenceKeyForSubtypeEnabler = subtypePref.getKey();
+                mSubtypeEnablerNotificationDialog = createDialog(subtypePref);
+                mSubtypeEnablerNotificationDialog.show();
+                return;
+            }
+
+            // Newly added subtype is duplicated.
+            final PreferenceGroup group = getPreferenceScreen();
+            group.removePreference(subtypePref);
+            showSubtypeAlreadyExistsToast(subtype);
         }
 
         @Override
@@ -439,6 +481,21 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
         }
     };
 
+    private void showSubtypeAlreadyExistsToast(InputMethodSubtype subtype) {
+        final Context context = getActivity();
+        final Resources res = context.getResources();
+        final String message = res.getString(R.string.custom_input_style_already_exists,
+                SubtypeLocale.getSubtypeDisplayName(subtype, res));
+        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
+    }
+
+    private InputMethodSubtype findDuplicatedSubtype(InputMethodSubtype subtype) {
+        final String localeString = subtype.getLocale();
+        final String keyboardLayoutSetName = SubtypeLocale.getKeyboardLayoutSetName(subtype);
+        return ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                getActivity(), localeString, keyboardLayoutSetName);
+    }
+
     private AlertDialog createDialog(SubtypePreference subtypePref) {
         final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
         builder.setTitle(R.string.custom_input_styles_title)
@@ -474,9 +531,9 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
         }
     }
 
-    private String getPrefSubtypes() {
+    private InputMethodSubtype[] getSubtypes() {
         final PreferenceGroup group = getPreferenceScreen();
-        final StringBuilder sb = new StringBuilder();
+        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
         final int count = group.getPreferenceCount();
         for (int i = 0; i < count; i++) {
             final Preference pref = group.getPreference(i);
@@ -484,13 +541,20 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
                 final SubtypePreference subtypePref = (SubtypePreference)pref;
                 // We should not save newly adding subtype to preference because it is incomplete.
                 if (subtypePref.isIncomplete()) continue;
-                final InputMethodSubtype subtype = subtypePref.getSubtype();
-                if (sb.length() > 0) {
-                    sb.append(AdditionalSubtype.PREF_SUBTYPE_SEPARATOR);
-                }
-                sb.append(AdditionalSubtype.getPrefSubtype(subtype));
+                subtypes.add(subtypePref.getSubtype());
             }
         }
+        return subtypes.toArray(new InputMethodSubtype[subtypes.size()]);
+    }
+
+    private String getPrefSubtypes(InputMethodSubtype[] subtypes) {
+        final StringBuilder sb = new StringBuilder();
+        for (final InputMethodSubtype subtype : subtypes) {
+            if (sb.length() > 0) {
+                sb.append(AdditionalSubtype.PREF_SUBTYPE_SEPARATOR);
+            }
+            sb.append(AdditionalSubtype.getPrefSubtype(subtype));
+        }
         return sb.toString();
     }
 
@@ -498,7 +562,8 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
     public void onPause() {
         super.onPause();
         final String oldSubtypes = SettingsValues.getPrefAdditionalSubtypes(mPrefs, getResources());
-        final String prefSubtypes = getPrefSubtypes();
+        final InputMethodSubtype[] subtypes = getSubtypes();
+        final String prefSubtypes = getPrefSubtypes(subtypes);
         if (prefSubtypes.equals(oldSubtypes)) {
             return;
         }
@@ -509,12 +574,6 @@ public class AdditionalSubtypeSettings extends PreferenceFragment {
         } finally {
             editor.apply();
         }
-        setAdditionalInputMethodSubtypes(prefSubtypes);
-    }
-
-    private void setAdditionalInputMethodSubtypes(final String prefSubtypes) {
-        final InputMethodSubtype[] subtypes =
-                AdditionalSubtype.createAdditionalSubtypesArray(prefSubtypes);
         ImfUtils.setAdditionalInputMethodSubtypes(getActivity(), subtypes);
     }
 
diff --git a/java/src/com/android/inputmethod/latin/ImfUtils.java b/java/src/com/android/inputmethod/latin/ImfUtils.java
index 36f6d8ba0f1775fef92650cb8e1be9bea8e53aa2..b882a4860623961a13475b313ffe390fe10dedd3 100644
--- a/java/src/com/android/inputmethod/latin/ImfUtils.java
+++ b/java/src/com/android/inputmethod/latin/ImfUtils.java
@@ -167,8 +167,7 @@ public class ImfUtils {
                 return subtype;
             }
         }
-        throw new RuntimeException("Can't find subtype for locale " + localeString
-                + " and keyboard layout " + keyboardLayoutSetName);
+        return null;
     }
 
     public static void setAdditionalInputMethodSubtypes(Context context,
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
index f2d971ca46280b6afe6b4936cd206515b9854915..664de67743786971bc471755e1cf5fc307277944 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -101,6 +101,9 @@ public class SubtypeSwitcher {
         mCurrentSubtype = mImm.getCurrentInputMethodSubtype();
         mNoLanguageSubtype = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
                 service, SubtypeLocale.NO_LANGUAGE, SubtypeLocale.QWERTY);
+        if (mNoLanguageSubtype == null) {
+            throw new RuntimeException("Can't find no lanugage with QWERTY subtype");
+        }
 
         final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
         mIsNetworkConnected = (info != null && info.isConnected());