diff --git a/java/res/values/config-common.xml b/java/res/values/config-common.xml
index 58f3e98..063fbfb 100644
--- a/java/res/values/config-common.xml
+++ b/java/res/values/config-common.xml
@@ -48,7 +48,7 @@
     <integer name="config_max_longpress_timeout">700</integer>
     <integer name="config_min_longpress_timeout">100</integer>
     <integer name="config_longpress_timeout_step">10</integer>
-    <integer name="config_accessibility_long_press_key_timeout">1500</integer>
+    <integer name="config_accessibility_long_press_key_timeout">3000</integer>
     <integer name="config_max_more_keys_column">5</integer>
     <integer name="config_more_keys_keyboard_fadein_anim_time">0</integer>
     <integer name="config_more_keys_keyboard_fadeout_anim_time">100</integer>
diff --git a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java
index 18673a3..cb13483 100644
--- a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java
+++ b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java
@@ -49,7 +49,9 @@
  */
 final class KeyboardAccessibilityNodeProvider extends AccessibilityNodeProviderCompat {
     private static final String TAG = KeyboardAccessibilityNodeProvider.class.getSimpleName();
-    private static final int UNDEFINED = Integer.MIN_VALUE;
+
+    // From {@link android.view.accessibility.AccessibilityNodeInfo#UNDEFINED_ITEM_ID}.
+    private static final int UNDEFINED = Integer.MAX_VALUE;
 
     private final KeyCodeDescriptionMapper mKeyCodeDescriptionMapper;
     private final AccessibilityUtils mAccessibilityUtils;
@@ -167,22 +169,10 @@
         }
         if (virtualViewId == View.NO_ID) {
             // We are requested to create an AccessibilityNodeInfo describing
-            // this View, i.e. the root of the virtual sub-tree.
+            // this View. Returning an empty info is sufficient for a keyboard.
             final AccessibilityNodeInfoCompat rootInfo =
                     AccessibilityNodeInfoCompat.obtain(mKeyboardView);
             ViewCompat.onInitializeAccessibilityNodeInfo(mKeyboardView, rootInfo);
-
-            // Add the virtual children of the root View.
-            final List<Key> sortedKeys = mKeyboard.getSortedKeys();
-            final int size = sortedKeys.size();
-            for (int index = 0; index < size; index++) {
-                final Key key = sortedKeys.get(index);
-                if (key.isSpacer()) {
-                    continue;
-                }
-                // Use an index of the sorted keys list as a virtual view id.
-                rootInfo.addChild(mKeyboardView, index);
-            }
             return rootInfo;
         }
 
diff --git a/java/src/com/android/inputmethod/accessibility/MoreKeysKeyboardAccessibilityDelegate.java b/java/src/com/android/inputmethod/accessibility/MoreKeysKeyboardAccessibilityDelegate.java
index 3a56c5d..6fe8bc3 100644
--- a/java/src/com/android/inputmethod/accessibility/MoreKeysKeyboardAccessibilityDelegate.java
+++ b/java/src/com/android/inputmethod/accessibility/MoreKeysKeyboardAccessibilityDelegate.java
@@ -23,7 +23,7 @@
 import com.android.inputmethod.keyboard.Key;
 import com.android.inputmethod.keyboard.KeyDetector;
 import com.android.inputmethod.keyboard.MoreKeysKeyboardView;
-import com.android.inputmethod.latin.Constants;
+import com.android.inputmethod.keyboard.PointerTracker;
 
 /**
  * This class represents a delegate that can be registered in {@link MoreKeysKeyboardView} to
@@ -103,12 +103,15 @@
             // Invoke {@link MoreKeysKeyboardView#onUpEvent(int,int,int,long)} as if this hover
             // exit event selects a key.
             mKeyboardView.onUpEvent(x, y, pointerId, eventTime);
-            mKeyboardView.dismissMoreKeysPanel();
+            // TODO: Should fix this reference. This is a hack to clear the state of
+            // {@link PointerTracker}.
+            PointerTracker.dismissAllMoreKeysPanels();
             return;
         }
         // Close the more keys keyboard.
-        mKeyboardView.onMoveEvent(
-                Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, pointerId, eventTime);
+        // TODO: Should fix this reference. This is a hack to clear the state of
+        // {@link PointerTracker}.
+        PointerTracker.dismissAllMoreKeysPanels();
         sendWindowStateChanged(mCloseAnnounceResId);
     }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
index 0f575d3..68a1139 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
@@ -35,7 +35,7 @@
 public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel {
     private final int[] mCoordinates = CoordinateUtils.newInstance();
 
-    protected KeyDetector mKeyDetector;
+    protected final KeyDetector mKeyDetector;
     private Controller mController = EMPTY_CONTROLLER;
     protected KeyboardActionListener mListener;
     private int mOriginX;
@@ -72,13 +72,10 @@
     @Override
     public void setKeyboard(final Keyboard keyboard) {
         super.setKeyboard(keyboard);
+        mKeyDetector.setKeyboard(
+                keyboard, -getPaddingLeft(), -getPaddingTop() + getVerticalCorrection());
         if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) {
-            // With accessibility mode on, any hover event outside {@link MoreKeysKeyboardView} is
-            // discarded at {@link InputView#dispatchHoverEvent(MotionEvent)}. Because only a hover
-            // event that is on this view is dispatched by the platform, we should use a
-            // {@link KeyDetector} that has no sliding allowance and no hysteresis.
             if (mAccessibilityDelegate == null) {
-                mKeyDetector = new KeyDetector();
                 mAccessibilityDelegate = new MoreKeysKeyboardAccessibilityDelegate(
                         this, mKeyDetector);
                 mAccessibilityDelegate.setOpenAnnounce(R.string.spoken_open_more_keys_keyboard);
@@ -86,12 +83,8 @@
             }
             mAccessibilityDelegate.setKeyboard(keyboard);
         } else {
-            mKeyDetector = new MoreKeysDetector(getResources().getDimension(
-                    R.dimen.config_more_keys_keyboard_slide_allowance));
             mAccessibilityDelegate = null;
         }
-        mKeyDetector.setKeyboard(
-                keyboard, -getPaddingLeft(), -getPaddingTop() + getVerticalCorrection());
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 8b671a9..b0774c4 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -70,7 +70,7 @@
 import com.android.inputmethod.latin.define.ProductionFlag;
 import com.android.inputmethod.latin.inputlogic.InputLogic;
 import com.android.inputmethod.latin.personalization.DictionaryDecayBroadcastReciever;
-import com.android.inputmethod.latin.personalization.PersonalizationDictionarySessionRegistrar;
+import com.android.inputmethod.latin.personalization.PersonalizationDictionaryUpdater;
 import com.android.inputmethod.latin.personalization.PersonalizationHelper;
 import com.android.inputmethod.latin.settings.Settings;
 import com.android.inputmethod.latin.settings.SettingsActivity;
@@ -122,6 +122,9 @@
     private final Settings mSettings;
     private final DictionaryFacilitator mDictionaryFacilitator =
             new DictionaryFacilitator(new DistracterFilterCheckingExactMatches(this /* context */));
+    // TODO: Move from LatinIME.
+    private final PersonalizationDictionaryUpdater mPersonalizationDictionaryUpdater =
+            new PersonalizationDictionaryUpdater(this /* context */, mDictionaryFacilitator);
     private final InputLogic mInputLogic = new InputLogic(this /* LatinIME */,
             this /* SuggestionStripViewAccessor */, mDictionaryFacilitator);
     // We expect to have only one decoder in almost all cases, hence the default capacity of 1.
@@ -540,34 +543,26 @@
         }
         mDictionaryFacilitator.updateEnabledSubtypes(mRichImm.getMyEnabledInputMethodSubtypeList(
                 true /* allowsImplicitlySelectedSubtypes */));
-        refreshPersonalizationDictionarySession();
+        refreshPersonalizationDictionarySession(currentSettingsValues);
         StatsUtils.onLoadSettings(currentSettingsValues);
     }
 
-    private void refreshPersonalizationDictionarySession() {
+    private void refreshPersonalizationDictionarySession(
+            final SettingsValues currentSettingsValues) {
+        mPersonalizationDictionaryUpdater.onLoadSettings(
+                currentSettingsValues.mUsePersonalizedDicts,
+                mSubtypeSwitcher.isSystemLocaleSameAsLocaleOfAllEnabledSubtypesOfEnabledImes());
         final boolean shouldKeepUserHistoryDictionaries;
-        final boolean shouldKeepPersonalizationDictionaries;
         if (mSettings.getCurrent().mUsePersonalizedDicts) {
             shouldKeepUserHistoryDictionaries = true;
-            // TODO: Eliminate this restriction
-            shouldKeepPersonalizationDictionaries =
-                    mSubtypeSwitcher.isSystemLocaleSameAsLocaleOfAllEnabledSubtypesOfEnabledImes();
         } else {
             shouldKeepUserHistoryDictionaries = false;
-            shouldKeepPersonalizationDictionaries = false;
         }
         if (!shouldKeepUserHistoryDictionaries) {
             // Remove user history dictionaries.
             PersonalizationHelper.removeAllUserHistoryDictionaries(this);
             mDictionaryFacilitator.clearUserHistoryDictionary();
         }
-        if (!shouldKeepPersonalizationDictionaries) {
-            // Remove personalization dictionaries.
-            PersonalizationHelper.removeAllPersonalizationDictionaries(this);
-            PersonalizationDictionarySessionRegistrar.resetAll(this);
-        } else {
-            PersonalizationDictionarySessionRegistrar.init(this, mDictionaryFacilitator);
-        }
     }
 
     // Note that this method is called from a non-UI thread.
@@ -627,11 +622,11 @@
     @Override
     public void onDestroy() {
         mDictionaryFacilitator.closeDictionaries();
+        mPersonalizationDictionaryUpdater.onDestroy();
         mSettings.onDestroy();
         unregisterReceiver(mConnectivityAndRingerModeChangeReceiver);
         unregisterReceiver(mDictionaryPackInstallReceiver);
         unregisterReceiver(mDictionaryDumpBroadcastReceiver);
-        PersonalizationDictionarySessionRegistrar.close(this);
         StatsUtils.onDestroy();
         super.onDestroy();
     }
@@ -660,8 +655,10 @@
                 mInputLogic.mConnection.endBatchEdit();
             }
         }
-        PersonalizationDictionarySessionRegistrar.onConfigurationChanged(this, conf,
-                mDictionaryFacilitator);
+        // TODO: Remove this test.
+        if (!conf.locale.equals(mPersonalizationDictionaryUpdater.getLocale())) {
+            refreshPersonalizationDictionarySession(settingsValues);
+        }
         super.onConfigurationChanged(conf);
     }
 
diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionarySessionRegistrar.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionarySessionRegistrar.java
deleted file mode 100644
index 4506440..0000000
--- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionarySessionRegistrar.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2013 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.inputmethod.latin.personalization;
-
-import android.content.Context;
-import android.content.res.Configuration;
-
-import com.android.inputmethod.latin.DictionaryFacilitator;
-
-public class PersonalizationDictionarySessionRegistrar {
-    public static void init(final Context context,
-            final DictionaryFacilitator dictionaryFacilitator) {
-    }
-
-    public static void onConfigurationChanged(final Context context, final Configuration conf,
-            final DictionaryFacilitator dictionaryFacilitator) {
-    }
-
-    public static void onUpdateData(final Context context, final String type) {
-    }
-
-    public static void onRemoveData(final Context context, final String type) {
-    }
-
-    public static void resetAll(final Context context) {
-    }
-
-    public static void close(final Context context) {
-    }
-}
diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdater.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdater.java
new file mode 100644
index 0000000..07bcf98
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdater.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2014 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.inputmethod.latin.personalization;
+
+import java.util.Locale;
+
+import android.content.Context;
+
+import com.android.inputmethod.latin.DictionaryFacilitator;
+
+public class PersonalizationDictionaryUpdater {
+    public PersonalizationDictionaryUpdater(final Context context,
+            final DictionaryFacilitator dictionaryFacilitator) {
+        // Clear and never update the personalization dictionary.
+        PersonalizationHelper.removeAllPersonalizationDictionaries(context);
+        dictionaryFacilitator.clearPersonalizationDictionary();
+    }
+
+    public Locale getLocale() {
+        return null;
+    }
+
+    public void onLoadSettings(final boolean usePersonalizedDicts,
+            final boolean isSystemLocaleSameAsLocaleOfAllEnabledSubtypesOfEnabledImes) {
+    }
+
+    public void onDestroy() {
+    }
+}
