diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index af1575f0699f06500268ea6a4b92976a085aa9fe..00b6f0a43d1f7177d5eca4074603dc1fdb258597 100644
--- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -296,7 +296,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
         final SoftReference<LatinKeyboard> ref = mKeyboardCache.get(id);
         LatinKeyboard keyboard = (ref == null) ? null : ref.get();
         if (keyboard == null) {
-            final Resources res = mInputMethodService.getResources();
             final Locale savedLocale =  mSubtypeSwitcher.changeSystemLocale(
                     mSubtypeSwitcher.getInputLocale());
 
@@ -668,11 +667,12 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
         return mInputView;
     }
 
-    public void loadKeyboardView() {
-        loadKeyboardViewInternal(mLayoutId, true);
+    public LatinKeyboardView onCreateInputView() {
+        createInputViewInternal(mLayoutId, true);
+        return mInputView;
     }
 
-    private void loadKeyboardViewInternal(int newLayout, boolean forceReset) {
+    private void createInputViewInternal(int newLayout, boolean forceReset) {
         if (mLayoutId != newLayout || mInputView == null || forceReset) {
             if (mInputView != null) {
                 mInputView.closing();
@@ -701,24 +701,31 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
             mInputView.setOnKeyboardActionListener(mInputMethodService);
             mLayoutId = newLayout;
         }
-        // TODO: Not to post if this function was called from loadKeyboardView
+    }
+
+    private void postSetInputView() {
         mInputMethodService.mHandler.post(new Runnable() {
+            @Override
             public void run() {
                 if (mInputView != null) {
                     mInputMethodService.setInputView(mInputView);
                 }
                 mInputMethodService.updateInputViewShown();
-            }});
+            }
+        });
     }
 
+    @Override
     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
         if (PREF_KEYBOARD_LAYOUT.equals(key)) {
             final int layoutId = Integer.valueOf(
                     sharedPreferences.getString(key, DEFAULT_LAYOUT_ID));
-            loadKeyboardViewInternal(layoutId, false);
+            createInputViewInternal(layoutId, false);
+            postSetInputView();
         } else if (LatinIMESettings.PREF_SETTINGS_KEY.equals(key)) {
             mHasSettingsKey = getSettingsKeyMode(sharedPreferences, mInputMethodService);
-            loadKeyboardViewInternal(mLayoutId, true);
+            createInputViewInternal(mLayoutId, true);
+            postSetInputView();
         }
     }
 
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 4ef19e83141df42b56931455b7687e886c296db9..36c77efaf4abc3aff620b80d150d315ad992a21b 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -464,7 +464,8 @@ public class LatinIME extends InputMethodService
     @Override
     public void onConfigurationChanged(Configuration conf) {
         mSubtypeSwitcher.onConfigurationChanged(conf);
-        onKeyboardLanguageChanged();
+        if (mSubtypeSwitcher.isKeyboardMode())
+            onKeyboardLanguageChanged();
         updateAutoTextEnabled();
 
         // If orientation changed while predicting, commit the change
@@ -489,8 +490,7 @@ public class LatinIME extends InputMethodService
 
     @Override
     public View onCreateInputView() {
-        mKeyboardSwitcher.loadKeyboardView();
-        return mKeyboardSwitcher.getInputView();
+        return mKeyboardSwitcher.onCreateInputView();
     }
 
     @Override
@@ -524,7 +524,7 @@ public class LatinIME extends InputMethodService
             return;
         }
 
-        SubtypeSwitcher.getInstance().updateParametersOnStartInputView();
+        mSubtypeSwitcher.updateParametersOnStartInputView();
 
         if (mRefreshKeyboardRequired) {
             mRefreshKeyboardRequired = false;
@@ -614,9 +614,12 @@ public class LatinIME extends InputMethodService
         mJustAddedAutoSpace = false;
 
         loadSettings(attribute);
-        switcher.loadKeyboard(mode, attribute.imeOptions, mVoiceConnector.isVoiceButtonEnabled(),
-                mVoiceConnector.isVoiceButtonOnPrimary());
-        switcher.updateShiftState();
+        if (mSubtypeSwitcher.isKeyboardMode()) {
+            switcher.loadKeyboard(mode, attribute.imeOptions,
+                    mVoiceConnector.isVoiceButtonEnabled(),
+                    mVoiceConnector.isVoiceButtonOnPrimary());
+            switcher.updateShiftState();
+        }
 
         setCandidatesViewShownInternal(isCandidateStripVisible(),
                 false /* needsInputViewShown */ );
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
index 0e739e2f55c8a95b19ff64ec16a1f34fe07cd9d8..103443e6dbcda34f5a92b75ccbf37678c5c7d6be 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -39,7 +39,7 @@ public class SubtypeSwitcher {
     // We may or may not draw the current language on space bar regardless of this flag.
     public static final boolean USE_SPACEBAR_LANGUAGE_SWITCHER = false;
     private static final boolean DBG = false;
-    private static final String TAG = "InputMethodSubtypeSwitcher";
+    private static final String TAG = "SubtypeSwitcher";
 
     private static final char LOCALE_SEPARATER = '_';
     private static final String KEYBOARD_MODE = "keyboard";
@@ -153,9 +153,9 @@ public class SubtypeSwitcher {
         final String newLocale;
         final String newMode;
         if (newSubtype == null) {
-            // Normally, newSubtype shouldn't be null. But just in case if newSubtype was null,
+            // Normally, newSubtype shouldn't be null. But just in case newSubtype was null,
             // fallback to the default locale and mode.
-            Log.e(TAG, "Couldn't get the current subtype.");
+            Log.w(TAG, "Couldn't get the current subtype.");
             newLocale = "en_US";
             newMode =KEYBOARD_MODE;
         } else {
@@ -345,14 +345,11 @@ public class SubtypeSwitcher {
 
     public boolean setVoiceInput(VoiceInput vi) {
         if (mVoiceInput == null && vi != null) {
-            // TODO: Remove requirements to construct KeyboardSwitcher
-            // when IME was enabled with Voice mode
             mVoiceInput = vi;
             if (isVoiceMode()) {
                 if (DBG) {
                     Log.d(TAG, "Set and call voice input.");
                 }
-                mService.onKeyboardLanguageChanged();
                 mService.onKey(LatinKeyboardView.KEYCODE_VOICE, null, 0, 0);
                 return true;
             }