diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index 8f6c12561efdd982ddf33ad26c15a884a5938714..61779d4b5452f8afada397725618ed507965edd7 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -41,7 +41,7 @@
     <integer name="config_keyboard_grid_width">32</integer>
     <integer name="config_keyboard_grid_height">16</integer>
     <integer name="config_double_space_period_timeout">1100</integer>
-    <!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. -->
+    <!-- This configuration is an index of  {@link KeyboardSwitcher#KEYBOARD_THEMES[]}. -->
     <string name="config_default_keyboard_theme_index" translatable="false">2</string>
     <integer name="config_max_more_keys_column">5</integer>
 
diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index ca9d7c388f11b47c8a0cef07ab074b8515ab8f81..af5ec061b2fbdf03c7ec4089fee735e14e6d2624 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -111,12 +111,24 @@
         <item>@string/layout_gingerbread</item>
         <item>@string/layout_klp</item>
     </string-array>
+    <!-- An element must be an index of {@link KeyboardSwitcher#KEYBOARD_THEMES[]}. -->
     <string-array name="keyboard_layout_modes_values">
         <item>0</item>
         <item>1</item>
         <item>2</item>
     </string-array>
 
+    <!-- For keyboard color scheme option dialog. -->
+    <string-array name="keyboard_color_schemes">
+        <item>@string/keyboard_color_scheme_white</item>
+        <item>@string/keyboard_color_scheme_blue</item>
+    </string-array>
+    <!-- An element must be an index of {@link KeyboardSwitcher#KEYBOARD_THEMES[]}. -->
+    <string-array name="keyboard_color_schemes_values">
+        <item>2</item>
+        <item>0</item>
+    </string-array>
+
     <!-- Subtype locale display name exceptions.
          For each exception, there should be related string resources for display name that may have
          explicit keyboard layout. The string resource name must be "subtype_<locale>" or
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index b159bb5ddd8a939865110cb41149a18863d2ef37..11b3ea3afb8569535050dd2d5c35f78f3b5993ce 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -452,6 +452,13 @@ mobile devices. [CHAR LIMIT=25] -->
     <!-- Description for Emoji keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_emoji">Emoji</string>
 
+    <!-- Title of the preference settings for switching keyboard color scheme [CHAR LIMIT=35] -->
+    <string name="keyboard_color_scheme">Color scheme</string>
+    <!-- The keyboard color scheme name, White [CHAR LIMIT=16] -->
+    <string name="keyboard_color_scheme_white">White</string>
+    <!-- The keyboard color scheme name, Blue [CHAR LIMIT=16] -->
+    <string name="keyboard_color_scheme_blue">Blue</string>
+
     <!-- Title of the preference settings for custom input styles (language and keyboard layout pairs) [CHAR LIMIT=35]-->
     <string name="custom_input_styles_title">Custom input styles</string>
     <!-- Title of the option menu to add a new style entry in the preference settings [CHAR LIMIT=16] -->
diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml
index 6c36b0e8914dc1608982b25f691874de6e9cecb3..d2b4475450da7525de854f37d50a35c7551ea6ac 100644
--- a/java/res/xml/prefs.xml
+++ b/java/res/xml/prefs.xml
@@ -158,6 +158,14 @@
                 android:summary="@string/sliding_key_input_preview_summary"
                 android:persistent="true"
                 android:defaultValue="true" />
+            <ListPreference
+                android:key="pref_keyboard_layout_20110916"
+                android:title="@string/keyboard_color_scheme"
+                android:summary="%s"
+                android:persistent="true"
+                android:entryValues="@array/keyboard_color_schemes_values"
+                android:entries="@array/keyboard_color_schemes"
+                android:defaultValue="@string/config_default_keyboard_theme_index" />
             <PreferenceScreen
                 android:fragment="com.android.inputmethod.latin.settings.AdditionalSubtypeSettings"
                 android:key="custom_input_styles"
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index f893636ada03666e050fa255bb7adbe6cfd1fca7..a6b293f2f328c46527bc88a8585489ae42854cd1 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -27,6 +27,7 @@ import android.view.View;
 import android.view.inputmethod.EditorInfo;
 
 import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy;
+import com.android.inputmethod.compat.InputMethodServiceCompatUtils;
 import com.android.inputmethod.keyboard.KeyboardLayoutSet.KeyboardLayoutSetException;
 import com.android.inputmethod.keyboard.internal.KeyboardState;
 import com.android.inputmethod.latin.InputView;
@@ -75,6 +76,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
     private EmojiPalettesView mEmojiPalettesView;
     private LatinIME mLatinIME;
     private Resources mResources;
+    private boolean mIsHardwareAcceleratedDrawingEnabled;
 
     private KeyboardState mState;
 
@@ -108,7 +110,16 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
         mPrefs = prefs;
         mSubtypeSwitcher = SubtypeSwitcher.getInstance();
         mState = new KeyboardState(this);
-        setContextThemeWrapper(latinIme, getKeyboardTheme(latinIme, prefs));
+        mIsHardwareAcceleratedDrawingEnabled =
+                InputMethodServiceCompatUtils.enableHardwareAcceleration(mLatinIME);
+    }
+
+    public void updateKeyboardTheme() {
+        final boolean themeUpdated = updateKeyboardThemeAndContextThemeWrapper(
+                mLatinIME, getKeyboardTheme(mLatinIME, mPrefs));
+        if (themeUpdated && mKeyboardView != null) {
+            mLatinIME.setInputView(onCreateInputView(mIsHardwareAcceleratedDrawingEnabled));
+        }
     }
 
     private static KeyboardTheme getKeyboardTheme(final Context context,
@@ -128,12 +139,15 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
         return KEYBOARD_THEMES[Integer.valueOf(defaultIndex)];
     }
 
-    private void setContextThemeWrapper(final Context context, final KeyboardTheme keyboardTheme) {
+    private boolean updateKeyboardThemeAndContextThemeWrapper(final Context context,
+            final KeyboardTheme keyboardTheme) {
         if (mThemeContext == null || mKeyboardTheme.mThemeId != keyboardTheme.mThemeId) {
             mKeyboardTheme = keyboardTheme;
             mThemeContext = new ContextThemeWrapper(context, keyboardTheme.mStyleId);
             KeyboardLayoutSet.clearKeyboardCache();
+            return true;
         }
+        return false;
     }
 
     public void loadKeyboard(final EditorInfo editorInfo, final SettingsValues settingsValues) {
@@ -365,7 +379,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
             mKeyboardView.closing();
         }
 
-        setContextThemeWrapper(mLatinIME, mKeyboardTheme);
+        updateKeyboardThemeAndContextThemeWrapper(mLatinIME, mKeyboardTheme);
         mCurrentInputView = (InputView)LayoutInflater.from(mThemeContext).inflate(
                 R.layout.input_view, null);
         mMainKeyboardFrame = mCurrentInputView.findViewById(R.id.main_keyboard_frame);
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 26b35bf0c58d20de532aa2995e58e4b133ac6163..326c53f0e821625aaea718deda672028d3078384 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -809,6 +809,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
         super.onStartInputView(editorInfo, restarting);
         mRichImm.clearSubtypeCaches();
         final KeyboardSwitcher switcher = mKeyboardSwitcher;
+        switcher.updateKeyboardTheme();
         final MainKeyboardView mainKeyboardView = switcher.getMainKeyboardView();
         // If we are starting input in a different text field from before, we'll have to reload
         // settings, so currentSettingsValues can't be final.
diff --git a/java/src/com/android/inputmethod/latin/settings/DebugSettings.java b/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
index 1b592b56521a09546254b8591a47c54a77e4f3f0..da1fb73feaacf95202b74b4703a9efa8f22649d8 100644
--- a/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
+++ b/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
@@ -113,9 +113,7 @@ public final class DebugSettings extends PreferenceFragment
                 mServiceNeedsRestart = true;
             }
         } else if (key.equals(PREF_FORCE_NON_DISTINCT_MULTITOUCH)
-                || key.equals(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT)) {
-            mServiceNeedsRestart = true;
-        } else if (key.equals(PREF_USE_ONLY_PERSONALIZATION_DICTIONARY_FOR_DEBUG)) {
+                || key.equals(PREF_USE_ONLY_PERSONALIZATION_DICTIONARY_FOR_DEBUG)) {
             mServiceNeedsRestart = true;
         }
     }