diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 90d8793..c158511 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -4,9 +4,6 @@
         coreApp="true"
         android:sharedUserId="android.uid.system">
 
-    <uses-sdk
-        android:minSdkVersion="21" />
-
     <original-package android:name="com.android.settings" />
 
     <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
@@ -638,7 +635,7 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.inputmethod.KeyboardLayoutPickerFragment" />
+                android:value="com.android.settings.inputmethod.KeyboardLayoutPickerFragment2" />
         </activity>
 
         <!-- Keep compatibility with old shortcuts. -->
diff --git a/res/layout/preference_settings_icon_widget.xml b/res/layout/preference_settings_icon_widget.xml
new file mode 100644
index 0000000..7160ca7
--- /dev/null
+++ b/res/layout/preference_settings_icon_widget.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2016 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:src="@drawable/ic_settings_24dp"
+    android:tint="@color/material_grey_600"
+    android:contentDescription="@null"/>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8a1a76a..89c05ad 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3557,6 +3557,10 @@
     <string name="show_ime_summary">Keep it on screen while physical keyboard is active</string>
     <!-- Title for the button to trigger the 'keyboard shortcuts helper' dialog. [CHAR LIMIT=35] -->
     <string name="keyboard_shortcuts_helper">Keyboard shortcuts helper</string>
+    <!--
+        Format string for a physical device in the form: InputMethodSubtype - InputMethodEditor.
+        e.g. English (US) - X Keyboard -->
+    <string name="physical_device_title"><xliff:g id="input_method_subtype" example="English (US)">%1$s</xliff:g> - <xliff:g id="input_method_editor" example="X Keyboard">%2$s</xliff:g></string>
 
     <!-- On Language & input settings screen, heading. Inside the "Language & input settings" screen, this is the header for settings that relate to mouse and trackpad devices. [CHAR LIMIT=40] -->
     <string name="pointer_settings_category">Mouse/trackpad</string>
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index a375cb1..da9f2fd 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -79,6 +79,7 @@
 import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
 import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.inputmethod.KeyboardLayoutPickerFragment;
+import com.android.settings.inputmethod.KeyboardLayoutPickerFragment2;
 import com.android.settings.inputmethod.SpellCheckersSettings;
 import com.android.settings.inputmethod.UserDictionaryList;
 import com.android.settings.localepicker.LocaleListEditor;
@@ -292,6 +293,7 @@
             TrustedCredentialsSettings.class.getName(),
             PaymentSettings.class.getName(),
             KeyboardLayoutPickerFragment.class.getName(),
+            KeyboardLayoutPickerFragment2.class.getName(),
             ZenModeSettings.class.getName(),
             SoundSettings.class.getName(),
             ConfigureNotificationSettings.class.getName(),
diff --git a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
index 2e4242a..a8a7086 100644
--- a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
@@ -20,6 +20,9 @@
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.res.Configuration;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.support.v7.preference.PreferenceScreen;
 import android.view.inputmethod.InputMethodInfo;
@@ -38,6 +41,8 @@
 public final class AvailableVirtualKeyboardFragment extends SettingsPreferenceFragment
         implements InputMethodPreference.OnSavePreferenceListener {
 
+    private static final Drawable NO_ICON = new ColorDrawable(Color.TRANSPARENT);
+
     private final ArrayList<InputMethodPreference> mInputMethodPreferenceList = new ArrayList<>();
     private InputMethodSettingValuesWrapper mInputMethodSettingValues;
     private InputMethodManager mImm;
@@ -93,8 +98,15 @@
             final InputMethodInfo imi = imis.get(i);
             final boolean isAllowedByOrganization = permittedList == null
                     || permittedList.contains(imi.getPackageName());
+            Drawable icon;
+            try {
+                icon = getActivity().getPackageManager().getApplicationIcon(imi.getPackageName());
+            } catch (Exception e) {
+                icon = NO_ICON;
+            }
             final InputMethodPreference pref = new InputMethodPreference(
                     context, imi, true, isAllowedByOrganization, this);
+            pref.setIcon(icon);
             mInputMethodPreferenceList.add(pref);
         }
         final Collator collator = Collator.getInstance();
diff --git a/src/com/android/settings/inputmethod/InputMethodPreference.java b/src/com/android/settings/inputmethod/InputMethodPreference.java
index e38f181..c807e8a 100755
--- a/src/com/android/settings/inputmethod/InputMethodPreference.java
+++ b/src/com/android/settings/inputmethod/InputMethodPreference.java
@@ -54,6 +54,7 @@
         OnPreferenceChangeListener {
     private static final String TAG = InputMethodPreference.class.getSimpleName();
     private static final String EMPTY_TEXT = "";
+    private static final int SETTINGS_ICON_LAYOUT = R.layout.preference_settings_icon_widget;
 
     interface OnSavePreferenceListener {
         /**
@@ -97,8 +98,8 @@
         mIsAllowedByOrganization = isAllowedByOrganization;
         mOnSaveListener = onSaveListener;
         if (!isImeEnabler) {
-            // Hide switch widget.
-            setWidgetLayoutResource(0 /* widgetLayoutResId */);
+            // Replace switch widget with settings icon.
+            setWidgetLayoutResource(SETTINGS_ICON_LAYOUT);
         }
         // Disable on/off switch texts.
         setSwitchTextOn(EMPTY_TEXT);
@@ -134,7 +135,7 @@
     private boolean isImeEnabler() {
         // If this {@link SwitchPreference} doesn't have a widget layout, we explicitly hide the
         // switch widget at constructor.
-        return getWidgetLayoutResource() != 0;
+        return getWidgetLayoutResource() != SETTINGS_ICON_LAYOUT;
     }
 
     @Override
diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java b/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java
index 68ceeef..ad7a2b1 100644
--- a/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java
+++ b/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java
@@ -301,7 +301,7 @@
         }
     }
 
-    static final class KeyboardLayoutLoader extends AsyncTaskLoader<Keyboards> {
+    private static final class KeyboardLayoutLoader extends AsyncTaskLoader<Keyboards> {
         private final InputDeviceIdentifier mInputDeviceIdentifier;
 
         public KeyboardLayoutLoader(Context context, InputDeviceIdentifier inputDeviceIdentifier) {
diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java
new file mode 100644
index 0000000..28c82e2
--- /dev/null
+++ b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.inputmethod;
+
+import android.app.Activity;
+import android.hardware.input.InputDeviceIdentifier;
+import android.hardware.input.InputManager;
+import android.hardware.input.InputManager.InputDeviceListener;
+import android.hardware.input.KeyboardLayout;
+import android.os.Bundle;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.view.InputDevice;
+
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.util.Preconditions;
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class KeyboardLayoutPickerFragment2 extends SettingsPreferenceFragment
+        implements InputDeviceListener {
+
+    private InputDeviceIdentifier mInputDeviceIdentifier;
+    private int mInputDeviceId = -1;
+    private InputManager mIm;
+    private InputMethodInfo mImi;
+    private InputMethodSubtype mSubtype;
+    private KeyboardLayout[] mKeyboardLayouts;
+    private Map<Preference, KeyboardLayout> mPreferenceMap = new HashMap<>();
+
+    // TODO: Make these constants public API for b/25752827
+
+    /**
+     * Intent extra: The input device descriptor of the keyboard whose keyboard
+     * layout is to be changed.
+     */
+    public static final String EXTRA_INPUT_DEVICE_IDENTIFIER = "input_device_identifier";
+
+    /**
+     * Intent extra: The associated {@link InputMethodInfo}.
+     */
+    public static final String EXTRA_INPUT_METHOD_INFO = "input_method_info";
+
+    /**
+     * Intent extra: The associated {@link InputMethodSubtype}.
+     */
+    public static final String EXTRA_INPUT_METHOD_SUBTYPE = "input_method_subtype";
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.INPUTMETHOD_KEYBOARD;
+    }
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Activity activity = Preconditions.checkNotNull(getActivity());
+
+        mInputDeviceIdentifier = activity.getIntent().getParcelableExtra(
+                EXTRA_INPUT_DEVICE_IDENTIFIER);
+        mImi = activity.getIntent().getParcelableExtra(EXTRA_INPUT_METHOD_INFO);
+        mSubtype = activity.getIntent().getParcelableExtra(EXTRA_INPUT_METHOD_SUBTYPE);
+
+        if (mInputDeviceIdentifier == null || mImi == null || mSubtype == null) {
+            activity.finish();
+        }
+
+        mIm = activity.getSystemService(InputManager.class);
+        mKeyboardLayouts = mIm.getKeyboardLayoutsForInputDevice(mInputDeviceIdentifier);
+        Arrays.sort(mKeyboardLayouts);
+        setPreferenceScreen(createPreferenceHierarchy());
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        mIm.registerInputDeviceListener(this, null);
+
+        InputDevice inputDevice =
+                mIm.getInputDeviceByDescriptor(mInputDeviceIdentifier.getDescriptor());
+        if (inputDevice == null) {
+            getActivity().finish();
+            return;
+        }
+        mInputDeviceId = inputDevice.getId();
+    }
+
+    @Override
+    public void onPause() {
+        mIm.unregisterInputDeviceListener(this);
+        mInputDeviceId = -1;
+
+        super.onPause();
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(Preference preference) {
+        KeyboardLayout layout = mPreferenceMap.get(preference);
+        if (layout != null) {
+            mIm.setKeyboardLayoutForInputDevice(mInputDeviceIdentifier, mImi, mSubtype,
+                    layout.getDescriptor());
+            getActivity().finish();
+            return true;
+        }
+        return super.onPreferenceTreeClick(preference);
+    }
+
+    @Override
+    public void onInputDeviceAdded(int deviceId) {}
+
+    @Override
+    public void onInputDeviceChanged(int deviceId) {}
+
+    @Override
+    public void onInputDeviceRemoved(int deviceId) {
+        if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) {
+            getActivity().finish();
+        }
+    }
+
+    private PreferenceScreen createPreferenceHierarchy() {
+        PreferenceScreen root = getPreferenceManager().createPreferenceScreen(getActivity());
+
+        for (KeyboardLayout layout : mKeyboardLayouts) {
+            Preference pref = new Preference(getPrefContext());
+            pref.setTitle(layout.getLabel());
+            root.addPreference(pref);
+            mPreferenceMap.put(pref, layout);
+        }
+
+        root.setTitle(PhysicalKeyboardFragment.getDisplayName(getContext(), mImi, mSubtype));
+        return root;
+    }
+}
diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
index 8f7d99e..74d474c 100644
--- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
@@ -18,6 +18,8 @@
 
 import android.app.Activity;
 import android.app.LoaderManager;
+import android.content.AsyncTaskLoader;
+import android.content.Context;
 import android.content.Intent;
 import android.content.Loader;
 import android.database.ContentObserver;
@@ -34,6 +36,8 @@
 import android.util.Pair;
 import android.view.InputDevice;
 import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
 import android.widget.Toast;
 
 import com.android.internal.inputmethod.InputMethodUtils;
@@ -44,22 +48,25 @@
 import com.android.settings.SettingsPreferenceFragment;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
-        implements LoaderManager.LoaderCallbacks<KeyboardLayoutDialogFragment.Keyboards>,
+        implements LoaderManager.LoaderCallbacks<PhysicalKeyboardFragment.Keyboards>,
         InputManager.InputDeviceListener {
 
     private static final int USER_SYSTEM = 0;
     private static final String KEYBOARD_ASSISTANCE_CATEGORY = "keyboard_assistance_category";
     private static final String SHOW_VIRTUAL_KEYBOARD_SWITCH = "show_virtual_keyboard_switch";
     private static final String KEYBOARD_SHORTCUTS_HELPER = "keyboard_shortcuts_helper";
+    private static final String IM_SUBTYPE_MODE_KEYBOARD = "keyboard";
 
-    private final ArrayList<PreferenceCategory> mHardKeyboardPreferenceList = new ArrayList<>();
     private final HashMap<Integer, Pair<InputDeviceIdentifier, PreferenceCategory>> mLoaderReference
             = new HashMap<>();
+    private final Map<InputMethodInfo, List<InputMethodSubtype>> mImiSubtypes = new HashMap<>();
     private InputManager mIm;
+    private InputMethodManager mImm;
     private PreferenceCategory mKeyboardAssistanceCategory;
     private SwitchPreference mShowVirtualKeyboardSwitch;
     private InputMethodUtils.InputMethodSettings mSettings;
@@ -69,6 +76,7 @@
         Activity activity = Preconditions.checkNotNull(getActivity());
         addPreferencesFromResource(R.xml.physical_keyboard_settings);
         mIm = Preconditions.checkNotNull(activity.getSystemService(InputManager.class));
+        mImm = Preconditions.checkNotNull(activity.getSystemService(InputMethodManager.class));
         mSettings = new InputMethodUtils.InputMethodSettings(
                 activity.getResources(),
                 getContentResolver(),
@@ -110,29 +118,32 @@
     }
 
     @Override
-    public Loader<KeyboardLayoutDialogFragment.Keyboards> onCreateLoader(int id, Bundle args) {
-        InputDeviceIdentifier deviceId = mLoaderReference.get(id).first;
-        return new KeyboardLayoutDialogFragment.KeyboardLayoutLoader(
-                getActivity().getBaseContext(), deviceId);
+    public Loader<Keyboards> onCreateLoader(int id, Bundle args) {
+        final InputDeviceIdentifier deviceId = mLoaderReference.get(id).first;
+        return new KeyboardLayoutLoader(
+                getActivity().getBaseContext(), mIm, mImiSubtypes, deviceId);
     }
 
     @Override
-    public void onLoadFinished(
-            final Loader<KeyboardLayoutDialogFragment.Keyboards> loader,
-            KeyboardLayoutDialogFragment.Keyboards data) {
+    public void onLoadFinished(Loader<Keyboards> loader, Keyboards data) {
         // TODO: Investigate why this is being called twice.
         final InputDeviceIdentifier deviceId = mLoaderReference.get(loader.getId()).first;
         final PreferenceCategory category = mLoaderReference.get(loader.getId()).second;
         category.removeAll();
-        for (KeyboardLayout layout : data.keyboardLayouts) {
-            if (layout != null) {
-                Preference pref = new Preference(getPrefContext(), null);
-                pref.setTitle(layout.getLabel());
-                pref.setSummary(layout.getCollection());
+        for (Keyboards.KeyboardInfo info : data.mInfos) {
+            Preference pref = new Preference(getPrefContext(), null);
+            final InputMethodInfo imi = info.mImi;
+            final InputMethodSubtype imSubtype = info.mImSubtype;
+            if (imi != null && imSubtype != null) {
+                pref.setTitle(getDisplayName(getContext(), imi, imSubtype));
+                KeyboardLayout layout = info.mLayout;
+                if (layout != null) {
+                    pref.setSummary(layout.getLabel());
+                }
                 pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                     @Override
                     public boolean onPreferenceClick(Preference preference) {
-                        showKeyboardLayoutScreen(deviceId);
+                        showKeyboardLayoutScreen(deviceId, imi, imSubtype);
                         return true;
                     }
                 });
@@ -142,7 +153,7 @@
     }
 
     @Override
-    public void onLoaderReset(Loader<KeyboardLayoutDialogFragment.Keyboards> loader) {}
+    public void onLoaderReset(Loader<Keyboards> loader) {}
 
     @Override
     public void onInputDeviceAdded(int deviceId) {
@@ -166,38 +177,21 @@
 
     private void updateHardKeyboards() {
         clearHardKeyboardsData();
+        loadInputMethodInfoSubtypes();
         final int[] devices = InputDevice.getDeviceIds();
         for (int deviceIndex = 0; deviceIndex < devices.length; deviceIndex++) {
             InputDevice device = InputDevice.getDevice(devices[deviceIndex]);
             if (device != null
                     && !device.isVirtual()
                     && device.isFullKeyboard()) {
-                final InputDeviceIdentifier deviceId = device.getIdentifier();
-                final String keyboardLayoutDescriptor =
-                        mIm.getCurrentKeyboardLayoutForInputDevice(deviceId);
-                final KeyboardLayout keyboardLayout = keyboardLayoutDescriptor != null ?
-                        mIm.getKeyboardLayout(keyboardLayoutDescriptor) : null;
-
                 final PreferenceCategory category = new PreferenceCategory(getPrefContext(), null);
                 category.setTitle(device.getName());
-                if (keyboardLayout != null) {
-                    category.setSummary(keyboardLayout.toString());
-                } else {
-                    category.setSummary(R.string.keyboard_layout_default_label);
-                }
-                mLoaderReference.put(deviceIndex, new Pair(deviceId, category));
-                mHardKeyboardPreferenceList.add(category);
+                category.setOrder(0);
+                mLoaderReference.put(deviceIndex, new Pair(device.getIdentifier(), category));
+                getPreferenceScreen().addPreference(category);
             }
         }
-
-        Collections.sort(mHardKeyboardPreferenceList);
-        final int count = mHardKeyboardPreferenceList.size();
-        for (int i = 0; i < count; i++) {
-            final PreferenceCategory category = mHardKeyboardPreferenceList.get(i);
-            category.setOrder(i);
-            getPreferenceScreen().addPreference(category);
-        }
-        mKeyboardAssistanceCategory.setOrder(count);
+        mKeyboardAssistanceCategory.setOrder(1);
         getPreferenceScreen().addPreference(mKeyboardAssistanceCategory);
 
         for (int deviceIndex : mLoaderReference.keySet()) {
@@ -206,11 +200,16 @@
         updateShowVirtualKeyboardSwitch();
     }
 
-    private void showKeyboardLayoutScreen(InputDeviceIdentifier inputDeviceIdentifier) {
+    private void showKeyboardLayoutScreen(
+            InputDeviceIdentifier inputDeviceIdentifier,
+            InputMethodInfo imi,
+            InputMethodSubtype imSubtype) {
         final Intent intent = new Intent(Intent.ACTION_MAIN);
         intent.setClass(getActivity(), Settings.KeyboardLayoutPickerActivity.class);
-        intent.putExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER,
+        intent.putExtra(KeyboardLayoutPickerFragment2.EXTRA_INPUT_DEVICE_IDENTIFIER,
                 inputDeviceIdentifier);
+        intent.putExtra(KeyboardLayoutPickerFragment2.EXTRA_INPUT_METHOD_INFO, imi);
+        intent.putExtra(KeyboardLayoutPickerFragment2.EXTRA_INPUT_METHOD_SUBTYPE, imSubtype);
         startActivity(intent);
     }
 
@@ -220,7 +219,21 @@
             getLoaderManager().destroyLoader(index);
         }
         mLoaderReference.clear();
-        mHardKeyboardPreferenceList.clear();
+    }
+
+    private void loadInputMethodInfoSubtypes() {
+        mImiSubtypes.clear();
+        final List<InputMethodInfo> imis = mImm.getEnabledInputMethodList();
+        for (InputMethodInfo imi : imis) {
+            final List<InputMethodSubtype> subtypes = new ArrayList<>();
+            for (InputMethodSubtype subtype : mImm.getEnabledInputMethodSubtypeList(
+                    imi, true /* allowsImplicitlySelectedSubtypes */)) {
+                if (IM_SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode())) {
+                    subtypes.add(subtype);
+                }
+            }
+            mImiSubtypes.put(imi, subtypes);
+        }
     }
 
     private void registerShowVirtualKeyboardSettingsObserver() {
@@ -261,4 +274,77 @@
             updateShowVirtualKeyboardSwitch();
         }
     };
+
+    static String getDisplayName(
+            Context context, InputMethodInfo imi, InputMethodSubtype imSubtype) {
+        CharSequence imSubtypeName =  imSubtype.getDisplayName(
+                context, imi.getPackageName(),
+                imi.getServiceInfo().applicationInfo);
+        CharSequence imeName = imi.loadLabel(context.getPackageManager());
+        return String.format(
+                context.getString(R.string.physical_device_title), imSubtypeName, imeName);
+    }
+
+    private static final class KeyboardLayoutLoader extends AsyncTaskLoader<Keyboards> {
+
+        private final Map<InputMethodInfo, List<InputMethodSubtype>> mImiSubtypes;
+        private final InputDeviceIdentifier mInputDeviceIdentifier;
+        private final InputManager mIm;
+
+        public KeyboardLayoutLoader(
+                Context context,
+                InputManager im,
+                Map<InputMethodInfo, List<InputMethodSubtype>> imiSubtypes,
+                InputDeviceIdentifier inputDeviceIdentifier) {
+            super(context);
+            mIm = Preconditions.checkNotNull(im);
+            mInputDeviceIdentifier = Preconditions.checkNotNull(inputDeviceIdentifier);
+            mImiSubtypes = new HashMap<>(imiSubtypes);
+        }
+
+        @Override
+        public Keyboards loadInBackground() {
+            final Keyboards keyboards = new Keyboards();
+            for (InputMethodInfo imi : mImiSubtypes.keySet()) {
+                for (InputMethodSubtype subtype : mImiSubtypes.get(imi)) {
+                    final KeyboardLayout layout = mIm.getKeyboardLayoutForInputDevice(
+                            mInputDeviceIdentifier, imi, subtype);
+                    keyboards.mInfos.add(new Keyboards.KeyboardInfo(imi, subtype, layout));
+                }
+            }
+            return keyboards;
+        }
+
+        @Override
+        protected void onStartLoading() {
+            super.onStartLoading();
+            forceLoad();
+        }
+
+        @Override
+        protected void onStopLoading() {
+            super.onStopLoading();
+            cancelLoad();
+        }
+    }
+
+    public static final class Keyboards {
+
+        public final ArrayList<KeyboardInfo> mInfos = new ArrayList<>();
+
+        public static final class KeyboardInfo {
+
+            public final InputMethodInfo mImi;
+            public final InputMethodSubtype mImSubtype;
+            public final KeyboardLayout mLayout;
+
+            public KeyboardInfo(
+                    InputMethodInfo imi, InputMethodSubtype imSubtype, KeyboardLayout layout) {
+                mImi = imi;
+                mImSubtype = imSubtype;
+                mLayout = layout;
+            }
+        }
+    }
+
 }
diff --git a/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java
index 541c686..b6ca9f2 100644
--- a/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java
@@ -19,6 +19,9 @@
 import android.app.Activity;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.support.v7.preference.Preference;
 import android.view.inputmethod.InputMethodInfo;
@@ -38,6 +41,7 @@
 public final class VirtualKeyboardFragment extends SettingsPreferenceFragment {
 
     private static final String ADD_VIRTUAL_KEYBOARD_SCREEN = "add_virtual_keyboard_screen";
+    private static final Drawable NO_ICON = new ColorDrawable(Color.TRANSPARENT);
 
     private final ArrayList<InputMethodPreference> mInputMethodPreferenceList = new ArrayList<>();
     private InputMethodManager mImm;
@@ -78,12 +82,21 @@
             final InputMethodInfo imi = imis.get(i);
             final boolean isAllowedByOrganization = permittedList == null
                     || permittedList.contains(imi.getPackageName());
+            Drawable icon;
+            try {
+                // TODO: Consider other ways to retrieve an icon to show here.
+                icon = getActivity().getPackageManager().getApplicationIcon(imi.getPackageName());
+            } catch (Exception e) {
+                // TODO: Consider handling the error differently perhaps by showing default icons.
+                icon = NO_ICON;
+            }
             final InputMethodPreference pref = new InputMethodPreference(
                     context,
                     imi,
                     false,  /* isImeEnabler */
                     isAllowedByOrganization,
                     null  /* this can be null since isImeEnabler is false */);
+            pref.setIcon(icon);
             mInputMethodPreferenceList.add(pref);
         }
         final Collator collator = Collator.getInstance();
@@ -101,6 +114,7 @@
             InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference(pref);
             pref.updatePreferenceViews();
         }
+        mAddVirtualKeyboardScreen.setIcon(R.drawable.ic_add);
         mAddVirtualKeyboardScreen.setOrder(N);
         getPreferenceScreen().addPreference(mAddVirtualKeyboardScreen);
     }
