diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index b8eb9ec..fcf97b9 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -111,8 +111,6 @@
     // Drawing
     /** True if the entire keyboard needs to be dimmed. */
     private boolean mNeedsToDimEntireKeyboard;
-    /** Whether the keyboard bitmap buffer needs to be redrawn before it's blitted. **/
-    private boolean mBufferNeedsUpdate;
     /** True if all keys should be drawn */
     private boolean mInvalidateAllKeys;
     /** The keys that should be drawn */
@@ -459,8 +457,9 @@
             onDrawKeyboard(canvas);
             return;
         }
-        if (mBufferNeedsUpdate || mOffscreenBuffer == null) {
-            mBufferNeedsUpdate = false;
+
+        final boolean bufferNeedsUpdates = mInvalidateAllKeys || !mInvalidatedKeys.isEmpty();
+        if (bufferNeedsUpdates || mOffscreenBuffer == null) {
             if (maybeAllocateOffscreenBuffer()) {
                 mInvalidateAllKeys = true;
                 // TODO: Stop using the offscreen canvas even when in software rendering
@@ -524,13 +523,12 @@
         }
         if (!isHardwareAccelerated) {
             canvas.clipRegion(mClipRegion, Region.Op.REPLACE);
-        }
-
-        // Draw keyboard background.
-        canvas.drawColor(Color.BLACK, PorterDuff.Mode.CLEAR);
-        final Drawable background = getBackground();
-        if (background != null) {
-            background.draw(canvas);
+            // Draw keyboard background.
+            canvas.drawColor(Color.BLACK, PorterDuff.Mode.CLEAR);
+            final Drawable background = getBackground();
+            if (background != null) {
+                background.draw(canvas);
+            }
         }
 
         // TODO: Confirm if it's really required to draw all keys when hardware acceleration is on.
@@ -1048,7 +1046,6 @@
     public void invalidateAllKeys() {
         mInvalidatedKeys.clear();
         mInvalidateAllKeys = true;
-        mBufferNeedsUpdate = true;
         invalidate();
     }
 
@@ -1066,9 +1063,7 @@
         mInvalidatedKeys.add(key);
         final int x = key.mX + getPaddingLeft();
         final int y = key.mY + getPaddingTop();
-        mWorkingRect.set(x, y, x + key.mWidth, y + key.mHeight);
-        mBufferNeedsUpdate = true;
-        invalidate(mWorkingRect);
+        invalidate(x, y, x + key.mWidth, y + key.mHeight);
     }
 
     public void closing() {
diff --git a/java/src/com/android/inputmethod/latin/DicTraverseSession.java b/java/src/com/android/inputmethod/latin/DicTraverseSession.java
index ae68e69..437876e 100644
--- a/java/src/com/android/inputmethod/latin/DicTraverseSession.java
+++ b/java/src/com/android/inputmethod/latin/DicTraverseSession.java
@@ -22,20 +22,30 @@
     static {
         JniUtils.loadNativeLibrary();
     }
+    private native long setDicTraverseSessionNative(String locale);
+    private native void initDicTraverseSessionNative(
+            long nativeDicTraverseSession, int[] previousWord, int previwousWordLength);
+    private native void releaseDicTraverseSessionNative(long nativeDicTraverseSession);
 
     private long mNativeDicTraverseSession;
 
     public DicTraverseSession(Locale locale) {
         mNativeDicTraverseSession = createNativeDicTraverseSession(
                 locale != null ? locale.toString() : "");
+        initSession();
     }
 
     public long getSession() {
         return mNativeDicTraverseSession;
     }
 
-    private native long setDicTraverseSessionNative(String locale);
-    private native void releaseDicTraverseSessionNative(long nativeDicTraverseSession);
+    public void initSession() {
+        initSession(null, 0);
+    }
+
+    public void initSession(int[] previousWord, int previousWordLength) {
+        initDicTraverseSessionNative(mNativeDicTraverseSession, previousWord, previousWordLength);
+    }
 
     private final long createNativeDicTraverseSession(String locale) {
         return setDicTraverseSessionNative(locale);
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 894b69b..e0dbb8e 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -722,6 +722,7 @@
         mHandler.cancelUpdateSuggestionStrip();
         mHandler.cancelDoubleSpacesTimer();
 
+        mainKeyboardView.setMainDictionaryAvailability(mIsMainDictionaryAvailable);
         mainKeyboardView.setKeyPreviewPopupEnabled(mCurrentSettings.mKeyPreviewPopupOn,
                 mCurrentSettings.mKeyPreviewPopupDismissDelay);
         mainKeyboardView.setGestureHandlingEnabledByUser(mCurrentSettings.mGestureInputEnabled);
diff --git a/native/jni/com_android_inputmethod_latin_DicTraverseSession.cpp b/native/jni/com_android_inputmethod_latin_DicTraverseSession.cpp
index e796537..0f5c396 100644
--- a/native/jni/com_android_inputmethod_latin_DicTraverseSession.cpp
+++ b/native/jni/com_android_inputmethod_latin_DicTraverseSession.cpp
@@ -23,6 +23,8 @@
 namespace latinime {
 void *(*DicTraverseWrapper::sDicTraverseSessionFactoryMethod)() = 0;
 void (*DicTraverseWrapper::sDicTraverseSessionReleaseMethod)(void *) = 0;
+void (*DicTraverseWrapper::sDicTraverseSessionInitMethod)(
+        JNIEnv *, void *, const jintArray, const jint) = 0;
 
 static jlong latinime_setDicTraverseSession(JNIEnv *env, jobject object,
         jstring localejStr) {
@@ -30,15 +32,21 @@
     return reinterpret_cast<jlong>(traverseSession);
 }
 
+static void latinime_initDicTraverseSession(JNIEnv *env, jlong traverseSession,
+        jintArray previousWord, jint previousWordLength) {
+    void *ts = reinterpret_cast<void*>(traverseSession);
+    DicTraverseWrapper::initDicTraverseSession(env, ts, previousWord, previousWordLength);
+}
+
 static void latinime_DicTraverseSession_release(
         JNIEnv *env, jobject object, jlong traverseSession) {
-    void *pi = reinterpret_cast<void*>(traverseSession);
-    if (!pi) return;
-    DicTraverseWrapper::releaseDicTraverseSession(pi);
+    void *ts = reinterpret_cast<void*>(traverseSession);
+    DicTraverseWrapper::releaseDicTraverseSession(ts);
 }
 
 static JNINativeMethod sMethods[] = {
     {"setDicTraverseSessionNative", "(Ljava/lang/String;)J", (void*)latinime_setDicTraverseSession},
+    {"initDicTraverseSessionNative", "(J[II)V", (void*)latinime_initDicTraverseSession},
     {"releaseDicTraverseSessionNative", "(J)V", (void*)latinime_DicTraverseSession_release}
 };
 
diff --git a/native/jni/com_android_inputmethod_latin_DicTraverseSession.h b/native/jni/com_android_inputmethod_latin_DicTraverseSession.h
index a84fe78..a76815d 100644
--- a/native/jni/com_android_inputmethod_latin_DicTraverseSession.h
+++ b/native/jni/com_android_inputmethod_latin_DicTraverseSession.h
@@ -31,6 +31,12 @@
         }
         return 0;
     }
+    static void initDicTraverseSession(JNIEnv *env, void *traverseSession,
+            const jintArray prevWord, const jint prevWordLength) {
+        if (sDicTraverseSessionInitMethod) {
+            sDicTraverseSessionInitMethod(env, traverseSession, prevWord, prevWordLength);
+        }
+    }
     static void releaseDicTraverseSession(void *traverseSession) {
         if (sDicTraverseSessionReleaseMethod) {
             sDicTraverseSessionReleaseMethod(traverseSession);
@@ -39,6 +45,7 @@
  private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(DicTraverseWrapper);
     static void *(*sDicTraverseSessionFactoryMethod)();
+    static void (*sDicTraverseSessionInitMethod)(JNIEnv *, void *, const jintArray, const jint);
     static void (*sDicTraverseSessionReleaseMethod)(void *);
 };
 int register_DicTraverseSession(JNIEnv *env);
