diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 4d60976..95fdcc1 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1433,6 +1433,7 @@
         // TODO: Merge space state with TextEntryState
         TextEntryState.backspace();
         if (null != mWordSavedForAutoCorrectCancellation) {
+            Utils.Stats.onAutoCorrectionCancellation();
             cancelAutoCorrect(ic);
             mWordSavedForAutoCorrectCancellation = null;
             ic.endBatchEdit();
@@ -1576,7 +1577,13 @@
         }
 
         switcher.updateShiftState();
-        TextEntryState.typedCharacter((char) code, mSettingsValues.isWordSeparator(code), x, y);
+        if (mSettingsValues.isWordSeparator(code)) {
+            TextEntryState.typedCharacter((char) code, true, x, y);
+            Utils.Stats.onSeparator((char)code, x, y);
+        } else {
+            TextEntryState.typedCharacter((char) code, false, x, y);
+            Utils.Stats.onNonSeparator((char)code, x, y);
+        }
         if (null != ic) ic.endBatchEdit();
     }
 
@@ -1659,6 +1666,7 @@
         }
 
         TextEntryState.typedCharacter((char) primaryCode, true, x, y);
+        Utils.Stats.onSeparator((char)primaryCode, x, y);
 
         if (pickedDefault) {
             CharSequence typedWord = mWordComposer.getTypedWord();
@@ -1870,7 +1878,10 @@
             updateSuggestions();
         }
         if (mBestWord != null && mBestWord.length() > 0) {
-            TextEntryState.acceptedDefault(mWordComposer.getTypedWord(), mBestWord, separatorCode);
+            Utils.Stats.onAutoCorrection(mWordComposer.getTypedWord(), mBestWord.toString(),
+                    separatorCode);
+            TextEntryState.acceptedDefault(mWordComposer.getTypedWord(), mBestWord,
+                    separatorCode);
             mExpectingUpdateSelection = true;
             commitBestWord(mBestWord);
             if (!mBestWord.equals(mWordComposer.getTypedWord())) {
@@ -1979,6 +1990,8 @@
         // TextEntryState.State.PICKED_SUGGESTION state.
         TextEntryState.typedCharacter((char) Keyboard.CODE_SPACE, true,
                 WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
+        Utils.Stats.onSeparator((char)Keyboard.CODE_SPACE, WordComposer.NOT_A_COORDINATE,
+                WordComposer.NOT_A_COORDINATE);
         if (!showingAddToDictionaryHint) {
             // If we're not showing the "Touch again to save", then show corrections again.
             // In case the cursor position doesn't change, make sure we show the suggestions again.
@@ -2199,6 +2212,8 @@
         ic.commitText(separator, 1);
         TextEntryState.typedCharacter(separator.charAt(0), true,
                 WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
+        Utils.Stats.onSeparator(separator.charAt(0), WordComposer.NOT_A_COORDINATE,
+                WordComposer.NOT_A_COORDINATE);
         mHandler.cancelUpdateBigramPredictions();
         mHandler.postUpdateSuggestions();
     }
diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java
index 6b44fc5..ebaecf7 100644
--- a/java/src/com/android/inputmethod/latin/TextEntryState.java
+++ b/java/src/com/android/inputmethod/latin/TextEntryState.java
@@ -17,7 +17,6 @@
 package com.android.inputmethod.latin;
 
 import com.android.inputmethod.keyboard.Keyboard;
-import com.android.inputmethod.latin.Utils.RingCharBuffer;
 
 import android.text.TextUtils;
 import android.util.Log;
@@ -48,8 +47,6 @@
             int separatorCode) {
         if (TextUtils.isEmpty(typedWord)) return;
         setState(ACCEPTED_DEFAULT);
-        LatinImeLogger.logOnAutoCorrection(
-                typedWord.toString(), actualWord.toString(), separatorCode);
         if (DEBUG)
             displayState("acceptedDefault", "typedWord", typedWord, "actualWord", actualWord);
     }
@@ -131,19 +128,12 @@
             }
             break;
         }
-        RingCharBuffer.getInstance().push(c, x, y);
-        if (isSeparator) {
-            LatinImeLogger.logOnInputSeparator();
-        } else {
-            LatinImeLogger.logOnInputChar();
-        }
         if (DEBUG) displayState("typedCharacter", "char", c, "isSeparator", isSeparator);
     }
     
     public static void backspace() {
         if (sState == ACCEPTED_DEFAULT) {
             setState(UNDO_COMMIT);
-            LatinImeLogger.logOnAutoCorrectionCancelled();
         } else if (sState == UNDO_COMMIT) {
             setState(IN_WORD);
         }
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
index 75bc10c..de29e8f 100644
--- a/java/src/com/android/inputmethod/latin/Utils.java
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -843,4 +843,28 @@
         return !suggestions.mTypedWordValid && suggestions.mHasAutoCorrectionCandidate
                 && !suggestions.shouldBlockAutoCorrection();
     }
+
+    public static class Stats {
+        public static void onNonSeparator(final char code, final int x,
+                final int y) {
+            RingCharBuffer.getInstance().push(code, x, y);
+            LatinImeLogger.logOnInputChar();
+        }
+
+        public static void onSeparator(final char code, final int x,
+                final int y) {
+            RingCharBuffer.getInstance().push(code, x, y);
+            LatinImeLogger.logOnInputSeparator();
+        }
+
+        public static void onAutoCorrection(final String typedWord, final String correctedWord,
+                final int separatorCode) {
+            if (TextUtils.isEmpty(typedWord)) return;
+            LatinImeLogger.logOnAutoCorrection(typedWord, correctedWord, separatorCode);
+        }
+
+        public static void onAutoCorrectionCancellation() {
+            LatinImeLogger.logOnAutoCorrectionCancelled();
+        }
+    }
 }
