diff --git a/java/src/com/android/inputmethod/keyboard/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
index 282c8e8fa5122b3d73c70042246e3de62cc6433d..03d9defa0ae312538bcf7611cbfc129571f42407 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -16,8 +16,6 @@
 
 package com.android.inputmethod.keyboard;
 
-import com.android.inputmethod.latin.Constants;
-
 /**
  * This class handles key detection.
  */
@@ -41,13 +39,15 @@ public class KeyDetector {
      * @param keyHysteresisDistanceForSlidingModifier the same parameter for sliding input that
      * starts from a modifier key such as shift and symbols key.
      */
-    public KeyDetector(float keyHysteresisDistance, float keyHysteresisDistanceForSlidingModifier) {
+    public KeyDetector(final float keyHysteresisDistance,
+            final float keyHysteresisDistanceForSlidingModifier) {
         mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance);
         mKeyHysteresisDistanceForSlidingModifierSquared = (int)(
                 keyHysteresisDistanceForSlidingModifier * keyHysteresisDistanceForSlidingModifier);
     }
 
-    public void setKeyboard(Keyboard keyboard, float correctionX, float correctionY) {
+    public void setKeyboard(final Keyboard keyboard, final float correctionX,
+            final float correctionY) {
         if (keyboard == null) {
             throw new NullPointerException();
         }
@@ -56,24 +56,21 @@ public class KeyDetector {
         mKeyboard = keyboard;
     }
 
-    public int getKeyHysteresisDistanceSquared(boolean isSlidingFromModifier) {
+    public int getKeyHysteresisDistanceSquared(final boolean isSlidingFromModifier) {
         return isSlidingFromModifier
                 ? mKeyHysteresisDistanceForSlidingModifierSquared : mKeyHysteresisDistanceSquared;
     }
 
-    public int getTouchX(int x) {
+    public int getTouchX(final int x) {
         return x + mCorrectionX;
     }
 
     // TODO: Remove vertical correction.
-    public int getTouchY(int y) {
+    public int getTouchY(final int y) {
         return y + mCorrectionY;
     }
 
     public Keyboard getKeyboard() {
-        if (mKeyboard == null) {
-            throw new IllegalStateException("keyboard isn't set");
-        }
         return mKeyboard;
     }
 
@@ -88,7 +85,7 @@ public class KeyDetector {
      * @param y The y-coordinate of a touch point
      * @return the key that the touch point hits.
      */
-    public Key detectHitKey(int x, int y) {
+    public Key detectHitKey(final int x, final int y) {
         final int touchX = getTouchX(x);
         final int touchY = getTouchY(y);
 
@@ -113,20 +110,4 @@ public class KeyDetector {
         }
         return primaryKey;
     }
-
-    public static String printableCode(Key key) {
-        return key != null ? Constants.printableCode(key.getCode()) : "none";
-    }
-
-    public static String printableCodes(int[] codes) {
-        final StringBuilder sb = new StringBuilder();
-        boolean addDelimiter = false;
-        for (final int code : codes) {
-            if (code == Constants.NOT_A_CODE) break;
-            if (addDelimiter) sb.append(", ");
-            sb.append(Constants.printableCode(code));
-            addDelimiter = true;
-        }
-        return "[" + sb + "]";
-    }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java b/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java
index 4a80279ca483cd958353e46de09e68ec54002e74..abff202b78756c8b0a9cf30d0ff20421bb7f47b6 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java
@@ -33,13 +33,17 @@ public final class MoreKeysDetector extends KeyDetector {
     }
 
     @Override
-    public Key detectHitKey(int x, int y) {
+    public Key detectHitKey(final int x, final int y) {
+        final Keyboard keyboard = getKeyboard();
+        if (keyboard == null) {
+            return null;
+        }
         final int touchX = getTouchX(x);
         final int touchY = getTouchY(y);
 
         Key nearestKey = null;
         int nearestDist = (y < 0) ? mSlideAllowanceSquareTop : mSlideAllowanceSquare;
-        for (final Key key : getKeyboard().getKeys()) {
+        for (final Key key : keyboard.getKeys()) {
             final int dist = key.squaredDistanceToEdge(touchX, touchY);
             if (dist < nearestDist) {
                 nearestKey = key;
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index befc4e6fa2493b00779216504a79119c03035a6c..59cf64d4b09b873e7f152da2518c61d887301565 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -257,12 +257,15 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
     }
 
     public static void setKeyDetector(final KeyDetector keyDetector) {
+        final Keyboard keyboard = keyDetector.getKeyboard();
+        if (keyboard == null) {
+            return;
+        }
         final int trackersSize = sTrackers.size();
         for (int i = 0; i < trackersSize; ++i) {
             final PointerTracker tracker = sTrackers.get(i);
             tracker.setKeyDetectorInner(keyDetector);
         }
-        final Keyboard keyboard = keyDetector.getKeyboard();
         sGestureEnabler.setPasswordMode(keyboard.mId.passwordInput());
     }
 
@@ -301,7 +304,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
         final boolean ignoreModifierKey = mIsInDraggingFinger && key.isModifier();
         if (DEBUG_LISTENER) {
             Log.d(TAG, String.format("[%d] onPress    : %s%s%s%s", mPointerId,
-                    KeyDetector.printableCode(key),
+                    (key == null ? "none" : Constants.printableCode(key.getCode())),
                     ignoreModifierKey ? " ignoreModifier" : "",
                     key.isEnabled() ? "" : " disabled",
                     repeatCount > 0 ? " repeatCount=" + repeatCount : ""));
@@ -402,11 +405,14 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
 
     private void setKeyDetectorInner(final KeyDetector keyDetector) {
         final Keyboard keyboard = keyDetector.getKeyboard();
+        if (keyboard == null) {
+            return;
+        }
         if (keyDetector == mKeyDetector && keyboard == mKeyboard) {
             return;
         }
         mKeyDetector = keyDetector;
-        mKeyboard = keyDetector.getKeyboard();
+        mKeyboard = keyboard;
         // Mark that keyboard layout has been changed.
         mKeyboardLayoutHasBeenChanged = true;
         final int keyWidth = mKeyboard.mMostCommonKeyWidth;
@@ -1235,7 +1241,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
     private void printTouchEvent(final String title, final int x, final int y,
             final long eventTime) {
         final Key key = mKeyDetector.detectHitKey(x, y);
-        final String code = KeyDetector.printableCode(key);
+        final String code = (key == null ? "none" : Constants.printableCode(key.getCode()));
         Log.d(TAG, String.format("[%d]%s%s %4d %4d %5d %s", mPointerId,
                 (mIsTrackingForActionDisabled ? "-" : " "), title, x, y, eventTime, code));
     }
diff --git a/java/src/com/android/inputmethod/latin/Constants.java b/java/src/com/android/inputmethod/latin/Constants.java
index d6ac71fe225cfd7905d9fa2dacf38edb4099ce75..d1ff714fcbb32c267448bc3ce18430b1d7f43f9a 100644
--- a/java/src/com/android/inputmethod/latin/Constants.java
+++ b/java/src/com/android/inputmethod/latin/Constants.java
@@ -252,6 +252,18 @@ public final class Constants {
         }
     }
 
+    public static String printableCodes(final int[] codes) {
+        final StringBuilder sb = new StringBuilder();
+        boolean addDelimiter = false;
+        for (final int code : codes) {
+            if (code == NOT_A_CODE) break;
+            if (addDelimiter) sb.append(", ");
+            sb.append(printableCode(code));
+            addDelimiter = true;
+        }
+        return "[" + sb + "]";
+    }
+
     public static final int MAX_INT_BIT_COUNT = 32;
 
     /**