diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index bd3b0e11481293a13d4b1c1c80052efb9b9b4ae0..0be4cf3a78e9f913e0c2a6d37ac8728559ccb478 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -197,6 +197,20 @@ public class Keyboard {
         return null;
     }
 
+    public boolean hasKey(Key aKey) {
+        if (mKeyCache.containsKey(aKey)) {
+            return true;
+        }
+
+        for (final Key key : mKeys) {
+            if (key == aKey) {
+                mKeyCache.put(key.mCode, key);
+                return true;
+            }
+        }
+        return false;
+    }
+
     public static boolean isLetterCode(int code) {
         return code >= MINIMUM_LETTER_CODE;
     }
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index c0d5b677223cd9841b32e9003c050b606a7137f3..cc0a1fb10b019c6101f35c45da6fabe2c6343a48 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -487,6 +487,9 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
         } else {
             // Draw invalidated keys.
             for (final Key key : mInvalidatedKeys) {
+                if (!mKeyboard.hasKey(key)) {
+                    continue;
+                }
                 final int x = key.mX + getPaddingLeft();
                 final int y = key.mY + getPaddingTop();
                 mInvalidatedKeysRect.set(x, y, x + key.mWidth, y + key.mHeight);