diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 8c8a824d844ad49d5ad5697d0f813371469675cb..118bb19424e7f0e9d09d9dac2a67e9dd5548ec3e 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1301,13 +1301,13 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
     }
 
     private void sendKeyCodePoint(final int code) {
+        if (ProductionFlag.IS_EXPERIMENTAL) {
+            ResearchLogger.latinIME_sendKeyCodePoint(code);
+        }
         // TODO: Remove this special handling of digit letters.
         // For backward compatibility. See {@link InputMethodService#sendKeyChar(char)}.
         if (code >= '0' && code <= '9') {
             sendDownUpKeyEventForBackwardCompatibility(code - '0' + KeyEvent.KEYCODE_0);
-            if (ProductionFlag.IS_EXPERIMENTAL) {
-                ResearchLogger.latinIME_sendKeyCodePoint(code);
-            }
             return;
         }
 
@@ -1327,6 +1327,9 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
     // Implementation of {@link KeyboardActionListener}.
     @Override
     public void onCodeInput(final int primaryCode, final int x, final int y) {
+        if (ProductionFlag.IS_EXPERIMENTAL) {
+            ResearchLogger.latinIME_onCodeInput(primaryCode, x, y);
+        }
         final long when = SystemClock.uptimeMillis();
         if (primaryCode != Constants.CODE_DELETE || when > mLastKeyTime + QUICK_PRESS) {
             mDeleteCount = 0;
@@ -1420,9 +1423,6 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
             mEnteredText = null;
         }
         mConnection.endBatchEdit();
-        if (ProductionFlag.IS_EXPERIMENTAL) {
-            ResearchLogger.latinIME_onCodeInput(primaryCode, x, y);
-        }
     }
 
     // Called from PointerTracker through the KeyboardActionListener interface
@@ -2324,6 +2324,9 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
     public void promotePhantomSpace() {
         if (mSettings.getCurrent().shouldInsertSpacesAutomatically()) {
             sendKeyCodePoint(Constants.CODE_SPACE);
+            if (ProductionFlag.IS_EXPERIMENTAL) {
+                ResearchLogger.latinIME_promotePhantomSpace();
+            }
         }
     }
 
diff --git a/java/src/com/android/inputmethod/research/ResearchLogger.java b/java/src/com/android/inputmethod/research/ResearchLogger.java
index 5c44af1f2e8e3c0975c718c2b67461d489ee4e50..edf3976dd0172af8d5bdbb0821c04a4cde9b3bd1 100644
--- a/java/src/com/android/inputmethod/research/ResearchLogger.java
+++ b/java/src/com/android/inputmethod/research/ResearchLogger.java
@@ -1175,9 +1175,8 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
     /**
      * Log a call to LatinIME.sendKeyCodePoint().
      *
-     * SystemResponse: The IME is simulating a hardware keypress.  This happens for numbers; other
-     * input typically goes through RichInputConnection.setComposingText() and
-     * RichInputConnection.commitText().
+     * SystemResponse: The IME is inserting text into the TextView for numbers, fixed strings, or
+     * some other unusual mechanism.
      */
     private static final LogStatement LOGSTATEMENT_LATINIME_SENDKEYCODEPOINT =
             new LogStatement("LatinIMESendKeyCodePoint", true, false, "code");
@@ -1190,6 +1189,24 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
         }
     }
 
+    /**
+     * Log a call to LatinIME.promotePhantomSpace().
+     *
+     * SystemResponse: The IME is inserting a real space in place of a phantom space.
+     */
+    private static final LogStatement LOGSTATEMENT_LATINIME_PROMOTEPHANTOMSPACE =
+            new LogStatement("LatinIMEPromotPhantomSpace", false, false);
+    public static void latinIME_promotePhantomSpace() {
+        final ResearchLogger researchLogger = getInstance();
+        final LogUnit logUnit;
+        if (researchLogger.mMainLogBuffer == null) {
+            logUnit = researchLogger.mCurrentLogUnit;
+        } else {
+            logUnit = researchLogger.mMainLogBuffer.peekLastLogUnit();
+        }
+        researchLogger.enqueueEvent(logUnit, LOGSTATEMENT_LATINIME_PROMOTEPHANTOMSPACE);
+    }
+
     /**
      * Log a call to LatinIME.swapSwapperAndSpace().
      *