diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
index 3f6c374..7194cce 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -52,6 +52,7 @@
 import com.android.inputmethod.latin.SubtypeUtils;
 import com.android.inputmethod.latin.Utils;
 import com.android.inputmethod.latin.Utils.UsabilityStudyLogUtils;
+import com.android.inputmethod.latin.define.ProductionFlag;
 
 import java.util.Locale;
 import java.util.WeakHashMap;
@@ -694,15 +695,17 @@
                         + size + "," + pressure);
             }
         }
-        if (ResearchLogger.sIsLogging) {
-            // TODO: remove redundant calculations of size and pressure by
-            // removing UsabilityStudyLog code once the ResearchLogger is mature enough
-            final float size = me.getSize(index);
-            final float pressure = me.getPressure(index);
-            if (action != MotionEvent.ACTION_MOVE) {
-                // Skip ACTION_MOVE events as they are logged below
-                ResearchLogger.getInstance().logMotionEvent(action, eventTime, id, x,
-                        y, size, pressure);
+        if (ProductionFlag.IS_EXPERIMENTAL) {
+            if (ResearchLogger.sIsLogging) {
+                // TODO: remove redundant calculations of size and pressure by
+                // removing UsabilityStudyLog code once the ResearchLogger is mature enough
+                final float size = me.getSize(index);
+                final float pressure = me.getPressure(index);
+                if (action != MotionEvent.ACTION_MOVE) {
+                    // Skip ACTION_MOVE events as they are logged below
+                    ResearchLogger.getInstance().logMotionEvent(action, eventTime, id, x, y,
+                            size, pressure);
+                }
             }
         }
 
@@ -770,12 +773,14 @@
                             + pointerId + "," + px + "," + py + ","
                             + pointerSize + "," + pointerPressure);
                 }
-                if (ResearchLogger.sIsLogging) {
-                    // TODO: earlier comment about redundant calculations applies here too
-                    final float pointerSize = me.getSize(i);
-                    final float pointerPressure = me.getPressure(i);
-                    ResearchLogger.getInstance().logMotionEvent(action, eventTime, pointerId,
-                            px, py, pointerSize, pointerPressure);
+                if (ProductionFlag.IS_EXPERIMENTAL) {
+                    if (ResearchLogger.sIsLogging) {
+                        // TODO: earlier comment about redundant calculations applies here too
+                        final float pointerSize = me.getSize(i);
+                        final float pointerPressure = me.getPressure(i);
+                        ResearchLogger.getInstance().logMotionEvent(action, eventTime, pointerId,
+                                px, py, pointerSize, pointerPressure);
+                    }
                 }
             }
         } else {
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 7272006..0669ee6 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -69,6 +69,7 @@
 import com.android.inputmethod.keyboard.KeyboardView;
 import com.android.inputmethod.keyboard.LatinKeyboardView;
 import com.android.inputmethod.latin.Utils.UsabilityStudyLogUtils;
+import com.android.inputmethod.latin.define.ProductionFlag;
 import com.android.inputmethod.latin.suggestions.SuggestionsView;
 
 import java.io.FileDescriptor;
@@ -439,7 +440,9 @@
         final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
         mPrefs = prefs;
         LatinImeLogger.init(this, prefs);
-        ResearchLogger.init(this, prefs);
+        if (ProductionFlag.IS_EXPERIMENTAL) {
+            ResearchLogger.init(this, prefs);
+        }
         LanguageSwitcherProxy.init(this, prefs);
         InputMethodManagerCompatWrapper.init(this);
         SubtypeSwitcher.init(this);
@@ -1264,8 +1267,10 @@
         }
         mLastKeyTime = when;
 
-        if (ResearchLogger.sIsLogging) {
-            ResearchLogger.getInstance().logKeyEvent(primaryCode, x, y);
+        if (ProductionFlag.IS_EXPERIMENTAL) {
+            if (ResearchLogger.sIsLogging) {
+                ResearchLogger.getInstance().logKeyEvent(primaryCode, x, y);
+            }
         }
 
         final KeyboardSwitcher switcher = mKeyboardSwitcher;
diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java
index 079f3b5..732efad 100644
--- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java
+++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java
@@ -80,8 +80,4 @@
 
     public static void onPrintAllUsabilityStudyLogs() {
     }
-
-    public static boolean isResearcherPackage(Context context) {
-        return false;
-    }
 }
diff --git a/java/src/com/android/inputmethod/latin/ResearchLogger.java b/java/src/com/android/inputmethod/latin/ResearchLogger.java
index 3b110bd..0694ffe 100644
--- a/java/src/com/android/inputmethod/latin/ResearchLogger.java
+++ b/java/src/com/android/inputmethod/latin/ResearchLogger.java
@@ -41,7 +41,7 @@
  * This class logs operations on the IME keyboard, including what the user has typed.
  * Data is stored locally in a file in app-specific storage.
  *
- * This functionality is off by default.
+ * This functionality is off by default. See {@link ProductionFlag.IS_EXPERIMENTAL}.
  */
 public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChangeListener {
     private static final String TAG = ResearchLogger.class.getSimpleName();
diff --git a/java/src/com/android/inputmethod/latin/Settings.java b/java/src/com/android/inputmethod/latin/Settings.java
index 72391f3..1102648 100644
--- a/java/src/com/android/inputmethod/latin/Settings.java
+++ b/java/src/com/android/inputmethod/latin/Settings.java
@@ -46,6 +46,7 @@
 import com.android.inputmethod.compat.InputMethodServiceCompatWrapper;
 import com.android.inputmethod.compat.VibratorCompatWrapper;
 import com.android.inputmethod.deprecated.VoiceProxy;
+import com.android.inputmethod.latin.define.ProductionFlag;
 import com.android.inputmethodcommon.InputMethodSettingsActivity;
 
 import java.util.Locale;
@@ -238,17 +239,16 @@
             textCorrectionGroup.removePreference(dictionaryLink);
         }
 
-        final boolean isResearcherPackage = LatinImeLogger.isResearcherPackage(this);
         final boolean showUsabilityStudyModeOption =
                 res.getBoolean(R.bool.config_enable_usability_study_mode_option)
-                        || isResearcherPackage || ENABLE_EXPERIMENTAL_SETTINGS;
+                        || ProductionFlag.IS_EXPERIMENTAL || ENABLE_EXPERIMENTAL_SETTINGS;
         final Preference usabilityStudyPref = findPreference(PREF_USABILITY_STUDY_MODE);
         if (!showUsabilityStudyModeOption) {
             if (usabilityStudyPref != null) {
                 miscSettings.removePreference(usabilityStudyPref);
             }
         }
-        if (isResearcherPackage) {
+        if (ProductionFlag.IS_EXPERIMENTAL) {
             if (usabilityStudyPref instanceof CheckBoxPreference) {
                 CheckBoxPreference checkbox = (CheckBoxPreference)usabilityStudyPref;
                 checkbox.setChecked(prefs.getBoolean(PREF_USABILITY_STUDY_MODE, true));
diff --git a/tests/src/com/android/inputmethod/latin/ResearchLoggerTests.java b/tests/src/com/android/inputmethod/latin/ResearchLoggerTests.java
deleted file mode 100644
index 6ccc4f2..0000000
--- a/tests/src/com/android/inputmethod/latin/ResearchLoggerTests.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.inputmethodservice.InputMethodService;
-import android.os.Handler;
-import android.util.Log;
-import android.view.MotionEvent;
-
-import com.android.inputmethod.latin.ResearchLogger.LogFileManager;
-
-import java.io.FileNotFoundException;
-
-public class ResearchLoggerTests extends InputTestsBase {
-
-    private static final String TAG = ResearchLoggerTests.class.getSimpleName();
-    private static final int TEST_INT = 0x12345678;
-    private static final long TEST_LONG = 0x1234567812345678L;
-
-    private static ResearchLogger sLogger;
-    private MockLogFileManager mMockLogFileManager;
-
-    @Override
-    protected void setUp() {
-        super.setUp();
-        sLogger = ResearchLogger.getInstance();
-        mMockLogFileManager = new MockLogFileManager();
-        sLogger.setLogFileManager(mMockLogFileManager);
-        ResearchLogger.sIsLogging = true;
-    }
-
-    public static class MockLogFileManager extends LogFileManager {
-        private final StringBuilder mContents = new StringBuilder();
-
-        @Override
-        public void init(InputMethodService ims) {
-        }
-
-        @Override
-        public synchronized void createLogFile() {
-            mContents.setLength(0);
-        }
-
-        @Override
-        public synchronized void createLogFile(String dir, String filename)
-                throws FileNotFoundException {
-            mContents.setLength(0);
-        }
-
-        @Override
-        public synchronized boolean append(String s) {
-            mContents.append(s);
-            return true;
-        }
-
-        @Override
-        public synchronized void reset() {
-            mContents.setLength(0);
-        }
-
-        @Override
-        public synchronized void close() {
-            mContents.setLength(0);
-        }
-
-        private String getAppendedString() {
-            return mContents.toString();
-        }
-    }
-
-    private void waitOnResearchLogger() {
-        // post another Runnable that notify()'s the test that it may proceed.
-        // assumes that the MessageQueue is processed in-order
-        Handler handler = sLogger.mLoggingHandler;
-        handler.post(new Runnable() {
-            @Override
-            public void run() {
-                synchronized (ResearchLoggerTests.this) {
-                    ResearchLoggerTests.this.notify();
-                }
-            }
-        });
-        synchronized (this) {
-            try {
-                wait();
-            } catch (InterruptedException e) {
-                Log.i(TAG, "interrupted when waiting for handler to finish.", e);
-            }
-        }
-    }
-
-    /*********************** Tests *********************/
-    public void testLogStartsEmpty() {
-        waitOnResearchLogger();
-        String result = mMockLogFileManager.getAppendedString();
-        assertEquals(result, "");
-    }
-
-    public void testMotionEvent() {
-        // verify that input values appear somewhere in output
-        sLogger.logMotionEvent(MotionEvent.ACTION_CANCEL,
-                TEST_LONG, TEST_INT, 1111, 3333, 5555, 7777);
-        waitOnResearchLogger();
-        String output = mMockLogFileManager.getAppendedString();
-        assertTrue(output.matches("(?sui).*\\bcancel\\b.*"));
-        assertFalse(output.matches("(?sui).*\\bdown\\b.*"));
-        assertTrue(output.matches("(?s).*\\b" + TEST_LONG + "\\b.*"));
-        assertTrue(output.matches("(?s).*\\b" + TEST_INT + "\\b.*"));
-        assertTrue(output.matches("(?s).*\\b1111\\b.*"));
-        assertTrue(output.matches("(?s).*\\b3333\\b.*"));
-        assertTrue(output.matches("(?s).*\\b5555\\b.*"));
-        assertTrue(output.matches("(?s).*\\b7777\\b.*"));
-    }
-
-    public void testKeyEvent() {
-        type("abc");
-        waitOnResearchLogger();
-        String output = mMockLogFileManager.getAppendedString();
-        assertTrue(output.matches("(?s).*\\ba\\b.*"));
-        assertTrue(output.matches("(?s).*\\bb\\b.*"));
-        assertTrue(output.matches("(?s).*\\bc\\b.*"));
-    }
-
-    public void testCorrection() {
-        sLogger.logCorrection("aaaa", "thos", "this", 1);
-        waitOnResearchLogger();
-        String output = mMockLogFileManager.getAppendedString();
-        assertTrue(output.matches("(?sui).*\\baaaa\\b.*"));
-        assertTrue(output.matches("(?sui).*\\bthos\\b.*"));
-        assertTrue(output.matches("(?sui).*\\bthis\\b.*"));
-    }
-
-    public void testStateChange() {
-        sLogger.logStateChange("aaaa", "bbbb");
-        waitOnResearchLogger();
-        String output = mMockLogFileManager.getAppendedString();
-        assertTrue(output.matches("(?sui).*\\baaaa\\b.*"));
-        assertTrue(output.matches("(?sui).*\\bbbbb\\b.*"));
-    }
-
-    // TODO: add integration tests that start at point of event generation.
-}
