diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
index 8408577788ae1a59a1cd23ae6852c3f6f54f6fe0..ecc821a4ba6d0df40aa9944656cfc9d439bfdb1f 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard;
 
+import android.text.TextUtils;
 import android.view.inputmethod.EditorInfo;
 
 import com.android.inputmethod.compat.EditorInfoCompatUtils;
@@ -177,6 +178,14 @@ public class KeyboardId {
         );
     }
 
+    public static boolean equivalentEditorInfoForKeyboard(EditorInfo a, EditorInfo b) {
+        if (a == null && b == null) return true;
+        if (a == null || b == null) return false;
+        return a.inputType == b.inputType
+                && a.imeOptions == b.imeOptions
+                && TextUtils.equals(a.privateImeOptions, b.privateImeOptions);
+    }
+
     public static String modeName(int mode) {
         switch (mode) {
         case MODE_TEXT: return "text";
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index e8d11b0f4ac155280749ee9154ab389bc426740c..50d963c07fb4116655ce6393f0f3c92047eac997 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -125,23 +125,9 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
             mIsValid = true;
         }
 
-        public void restore(boolean forceRestore) {
-            if (!mIsValid) {
-                if (forceRestore) {
-                    setAlphabetKeyboard();
-                }
-                return;
-            }
-            mIsValid = false;
-
-            if (mIsAlphabetMode) {
+        public void restore() {
+            if (!mIsValid || mIsAlphabetMode) {
                 setAlphabetKeyboard();
-                if (mIsShiftLocked) {
-                    setShiftLocked(true);
-                }
-                if (mIsShifted) {
-                    setShifted(MANUAL_SHIFT);
-                }
             } else {
                 if (mIsShifted) {
                     setSymbolsShiftedKeyboard();
@@ -149,6 +135,16 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
                     setSymbolsKeyboard();
                 }
             }
+
+            if (!mIsValid) return;
+            mIsValid = false;
+
+            if (mIsAlphabetMode) {
+                setShiftLocked(mIsShiftLocked);
+                if (!mIsShiftLocked) {
+                    setShifted(mIsShifted ? MANUAL_SHIFT : UNSHIFT);
+                }
+            }
         }
     }
 
@@ -204,7 +200,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
             mSymbolsShiftedKeyboardId = getKeyboardId(editorInfo, true, true, settingsValues);
             mState.onLoadKeyboard();
             mLayoutSwitchBackSymbols = mResources.getString(R.string.layout_switch_back_symbols);
-            mSavedKeyboardState.restore(mCurrentId == null);
+            mSavedKeyboardState.restore();
         } catch (RuntimeException e) {
             Log.w(TAG, "loading keyboard failed: " + mMainKeyboardId, e);
             LatinImeLogger.logOnException(mMainKeyboardId.toString(), e);
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 5f446a5c4b61a4110e66954f88f9d2a61503f4c5..c2656b8915e07d6187ea9cecb9f0d42e0c5e093f 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -62,6 +62,7 @@ import com.android.inputmethod.deprecated.VoiceProxy;
 import com.android.inputmethod.keyboard.Key;
 import com.android.inputmethod.keyboard.Keyboard;
 import com.android.inputmethod.keyboard.KeyboardActionListener;
+import com.android.inputmethod.keyboard.KeyboardId;
 import com.android.inputmethod.keyboard.KeyboardSwitcher;
 import com.android.inputmethod.keyboard.KeyboardView;
 import com.android.inputmethod.keyboard.LatinKeyboard;
@@ -442,7 +443,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
         }
 
         public void onStartInputView(EditorInfo editorInfo, boolean restarting) {
-            if (hasMessages(MSG_PENDING_IMS_CALLBACK) && editorInfo == mAppliedEditorInfo) {
+            if (hasMessages(MSG_PENDING_IMS_CALLBACK)
+                    && KeyboardId.equivalentEditorInfoForKeyboard(editorInfo, mAppliedEditorInfo)) {
                 // Typically this is the second onStartInputView after orientation changed.
                 resetPendingImsCallback();
             } else {