diff --git a/src/com/android/contacts/logging/Logger.java b/src/com/android/contacts/logging/Logger.java
deleted file mode 100644
index 466a222..0000000
--- a/src/com/android/contacts/logging/Logger.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2016 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.contacts.logging;
-
-import android.app.Activity;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.contacts.commonbind.analytics.AnalyticsUtil;
-import com.android.contactsbind.ClearcutLoggerHelper;
-
-/**
- * Logs analytics events.
- */
-public abstract class Logger {
-    public static final String TAG = "Logger";
-
-    public static Logger getInstance() {
-        return ClearcutLoggerHelper.getInstance();
-    }
-
-    /**
-     * Logs an event indicating that a screen was displayed.
-     *
-     * @param screenType integer identifier of the displayed screen
-     * @param activity Parent activity of the displayed screen.
-     */
-    public static void logScreenView(int screenType, Activity activity) {
-        final Logger logger = getInstance();
-        if (logger != null) {
-            logger.logScreenViewImpl(screenType);
-        }
-
-        final String screenName = ScreenEvent.getScreenName(screenType);
-        if (TextUtils.isEmpty(screenName)) {
-            Log.w(TAG, "Unknown screenType: " + screenType);
-        } else {
-            AnalyticsUtil.sendScreenView(screenName, activity, /* tag */ null);
-        }
-    }
-
-    public abstract void logScreenViewImpl(int screenType);
-}
diff --git a/src/com/android/contacts/logging/ScreenEvent.java b/src/com/android/contacts/logging/ScreenEvent.java
deleted file mode 100644
index 5b1b6bb..0000000
--- a/src/com/android/contacts/logging/ScreenEvent.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2016 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.contacts.logging;
-
-import android.text.TextUtils;
-
-import com.android.contacts.activities.PeopleActivity;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Stores constants identifying individual screens/dialogs/fragments in the application, and also
- * provides a mapping of integer id -> screen name mappings for analytics purposes.
- */
-public class ScreenEvent {
-    private static final Map<Integer, String> sScreenNameMap = new HashMap<>();
-
-    private static final String FRAGMENT_TAG_SEPARATOR = "#";
-
-    public static final int UNKNOWN = 0;
-
-    public static final int SEARCH = 1;
-
-    static {
-        sScreenNameMap.put(SEARCH, getScreenNameWithTag(
-                PeopleActivity.class.getSimpleName(), "Search"));
-    }
-
-    /**
-     * For a given screen type, returns the actual screen name that is used for logging/analytics
-     * purposes.
-     *
-     * @param screenType unique ID of a type of screen
-     *
-     * @return the tagged version of the screen name corresponding to the provided screenType,
-     *         or {@null} if the provided screenType is unknown.
-     */
-    public static String getScreenName(int screenType) {
-        return sScreenNameMap.get(screenType);
-    }
-
-    /**
-     * Build a tagged version of the provided screenName if the tag is non-empty.
-     *
-     * @param screenName Name of the screen.
-     * @param tag Optional tag describing the screen.
-     * @return the unchanged screenName if the tag is {@code null} or empty, the tagged version of
-     *         the screenName otherwise.
-     */
-    public static String getScreenNameWithTag(String screenName, String tag) {
-        if (TextUtils.isEmpty(tag)) {
-            return screenName;
-        }
-        return screenName + FRAGMENT_TAG_SEPARATOR + tag;
-    }
-}
diff --git a/src/com/android/contactsbind/ClearcutLoggerHelper.java b/src/com/android/contactsbind/ClearcutLoggerHelper.java
deleted file mode 100644
index 8c7d86b..0000000
--- a/src/com/android/contactsbind/ClearcutLoggerHelper.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2016 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.contactsbind;
-
-import com.android.contacts.logging.Logger;
-
-/**
- * No-op clearcut logger implementation.
- */
-public class ClearcutLoggerHelper extends Logger {
-
-    private static ClearcutLoggerHelper sInstance;
-
-    public static ClearcutLoggerHelper getInstance() {
-        if (sInstance == null) {
-            sInstance = new ClearcutLoggerHelper();
-        }
-        return sInstance;
-    }
-
-    private ClearcutLoggerHelper() {
-    }
-
-    @Override
-    public void logScreenViewImpl(int screenType) {
-    }
-}
