diff --git a/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java b/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java
deleted file mode 100644
index 135fbc6..0000000
--- a/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2010 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.list;
-
-import com.android.contacts.R;
-import com.android.contacts.util.PhoneCapabilityTester;
-import com.android.contacts.widget.ContextMenuAdapter;
-
-import android.content.Context;
-import android.net.Uri;
-import android.util.Log;
-import android.view.ContextMenu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.widget.AdapterView;
-
-/**
- * A contextual menu adapter for the basic contact list.
- *
- * TODO Not used any more.  Remove it.
- */
-public class ContactBrowseListContextMenuAdapter implements ContextMenuAdapter {
-
-    private static final int MENU_ITEM_VIEW_CONTACT = 1;
-    private static final int MENU_ITEM_CALL = 2;
-    private static final int MENU_ITEM_SEND_SMS = 3;
-    private static final int MENU_ITEM_EDIT = 4;
-    private static final int MENU_ITEM_DELETE = 5;
-    private static final int MENU_ITEM_TOGGLE_STAR = 6;
-
-    private static final String TAG = "LightContactBrowserContextMenuAdapter";
-
-    private final ContactBrowseListFragment mContactListFragment;
-
-    public ContactBrowseListContextMenuAdapter(ContactBrowseListFragment fragment) {
-        this.mContactListFragment = fragment;
-    }
-
-    @Override
-    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
-        AdapterView.AdapterContextMenuInfo info;
-        try {
-             info = (AdapterView.AdapterContextMenuInfo) menuInfo;
-        } catch (ClassCastException e) {
-            Log.wtf(TAG, "Bad menuInfo", e);
-            return;
-        }
-
-        ContactListAdapter adapter = mContactListFragment.getAdapter();
-        int headerViewsCount = mContactListFragment.getListView().getHeaderViewsCount();
-        int position = info.position - headerViewsCount;
-
-        // Setup the menu header
-        menu.setHeaderTitle(adapter.getContactDisplayName(position));
-
-        // View contact details
-        menu.add(0, MENU_ITEM_VIEW_CONTACT, 0, R.string.menu_viewContact);
-
-        if (adapter.getHasPhoneNumber(position)) {
-            final Context context = mContactListFragment.getContext();
-            boolean hasPhoneApp = PhoneCapabilityTester.isPhone(context);
-            boolean hasSmsApp = PhoneCapabilityTester.isSmsIntentRegistered(context);
-            // Calling contact
-            if (hasPhoneApp) menu.add(0, MENU_ITEM_CALL, 0, R.string.menu_call);
-            // Send SMS item
-            if (hasSmsApp) menu.add(0, MENU_ITEM_SEND_SMS, 0, R.string.menu_sendSMS);
-        }
-
-        // Star toggling
-        if (!adapter.isContactStarred(position)) {
-            menu.add(0, MENU_ITEM_TOGGLE_STAR, 0, R.string.menu_addStar);
-        } else {
-            menu.add(0, MENU_ITEM_TOGGLE_STAR, 0, R.string.menu_removeStar);
-        }
-
-        // Contact editing
-        menu.add(0, MENU_ITEM_EDIT, 0, R.string.menu_editContact);
-        menu.add(0, MENU_ITEM_DELETE, 0, R.string.menu_deleteContact);
-    }
-
-    @Override
-    public boolean onContextItemSelected(MenuItem item) {
-        AdapterView.AdapterContextMenuInfo info;
-        try {
-             info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
-        } catch (ClassCastException e) {
-            Log.wtf(TAG, "Bad menuInfo", e);
-            return false;
-        }
-
-        ContactListAdapter adapter = mContactListFragment.getAdapter();
-        int headerViewsCount = mContactListFragment.getListView().getHeaderViewsCount();
-        int position = info.position - headerViewsCount;
-
-        final Uri contactUri = adapter.getContactUri(position);
-        switch (item.getItemId()) {
-            case MENU_ITEM_VIEW_CONTACT: {
-                mContactListFragment.viewContact(contactUri);
-                return true;
-            }
-
-            case MENU_ITEM_TOGGLE_STAR: {
-                if (adapter.isContactStarred(position)) {
-                    mContactListFragment.removeFromFavorites(contactUri);
-                } else {
-                    mContactListFragment.addToFavorites(contactUri);
-                }
-                return true;
-            }
-
-            case MENU_ITEM_CALL: {
-                mContactListFragment.callContact(contactUri);
-                return true;
-            }
-
-            case MENU_ITEM_SEND_SMS: {
-                mContactListFragment.smsContact(contactUri);
-                return true;
-            }
-
-            case MENU_ITEM_EDIT: {
-                mContactListFragment.editContact(contactUri);
-                return true;
-            }
-
-            case MENU_ITEM_DELETE: {
-                mContactListFragment.deleteContact(contactUri);
-                return true;
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/src/com/android/contacts/list/ContactListAdapter.java b/src/com/android/contacts/list/ContactListAdapter.java
index 6eb9423..bc988e4 100644
--- a/src/com/android/contacts/list/ContactListAdapter.java
+++ b/src/com/android/contacts/list/ContactListAdapter.java
@@ -42,64 +42,48 @@
         Contacts._ID,                           // 0
         Contacts.DISPLAY_NAME_PRIMARY,          // 1
         Contacts.DISPLAY_NAME_ALTERNATIVE,      // 2
-        Contacts.SORT_KEY_PRIMARY,              // 3
-        Contacts.STARRED,                       // 4
-        Contacts.CONTACT_PRESENCE,              // 5
-        Contacts.CONTACT_STATUS,                // 6
-        Contacts.PHOTO_ID,                      // 7
-        Contacts.PHOTO_THUMBNAIL_URI,           // 8
-        Contacts.LOOKUP_KEY,                    // 9
-        Contacts.PHONETIC_NAME,                 // 10
-        Contacts.HAS_PHONE_NUMBER,              // 11
-        Contacts.IS_USER_PROFILE,               // 12
+        Contacts.CONTACT_PRESENCE,              // 3
+        Contacts.CONTACT_STATUS,                // 4
+        Contacts.PHOTO_ID,                      // 5
+        Contacts.PHOTO_THUMBNAIL_URI,           // 6
+        Contacts.LOOKUP_KEY,                    // 7
+        Contacts.IS_USER_PROFILE,               // 8
     };
 
     protected static final String[] PROJECTION_DATA = new String[] {
         Data.CONTACT_ID,                        // 0
         Data.DISPLAY_NAME_PRIMARY,              // 1
         Data.DISPLAY_NAME_ALTERNATIVE,          // 2
-        Data.SORT_KEY_PRIMARY,                  // 3
-        Data.STARRED,                           // 4
-        Data.CONTACT_PRESENCE,                  // 5
-        Data.CONTACT_STATUS,                    // 6
-        Data.PHOTO_ID,                          // 7
-        Data.PHOTO_THUMBNAIL_URI,               // 8
-        Data.LOOKUP_KEY,                        // 9
-        Data.PHONETIC_NAME,                     // 10
-        Data.HAS_PHONE_NUMBER,                  // 11
+        Data.CONTACT_PRESENCE,                  // 3
+        Data.CONTACT_STATUS,                    // 4
+        Data.PHOTO_ID,                          // 5
+        Data.PHOTO_THUMBNAIL_URI,               // 6
+        Data.LOOKUP_KEY,                        // 7
     };
 
     protected static final String[] FILTER_PROJECTION = new String[] {
         Contacts._ID,                           // 0
         Contacts.DISPLAY_NAME_PRIMARY,          // 1
         Contacts.DISPLAY_NAME_ALTERNATIVE,      // 2
-        Contacts.SORT_KEY_PRIMARY,              // 3
-        Contacts.STARRED,                       // 4
-        Contacts.CONTACT_PRESENCE,              // 5
-        Contacts.CONTACT_STATUS,                // 6
-        Contacts.PHOTO_ID,                      // 7
-        Contacts.PHOTO_THUMBNAIL_URI,           // 8
-        Contacts.LOOKUP_KEY,                    // 9
-        Contacts.PHONETIC_NAME,                 // 10
-        Contacts.HAS_PHONE_NUMBER,              // 11
-        Contacts.IS_USER_PROFILE,               // 12
-        SearchSnippetColumns.SNIPPET,           // 13
+        Contacts.CONTACT_PRESENCE,              // 3
+        Contacts.CONTACT_STATUS,                // 4
+        Contacts.PHOTO_ID,                      // 5
+        Contacts.PHOTO_THUMBNAIL_URI,           // 6
+        Contacts.LOOKUP_KEY,                    // 7
+        Contacts.IS_USER_PROFILE,               // 8
+        SearchSnippetColumns.SNIPPET,           // 9
     };
 
     protected static final int CONTACT_ID_COLUMN_INDEX = 0;
     protected static final int CONTACT_DISPLAY_NAME_PRIMARY_COLUMN_INDEX = 1;
     protected static final int CONTACT_DISPLAY_NAME_ALTERNATIVE_COLUMN_INDEX = 2;
-    protected static final int CONTACT_SORT_KEY_PRIMARY_COLUMN_INDEX = 3;
-    protected static final int CONTACT_STARRED_COLUMN_INDEX = 4;
-    protected static final int CONTACT_PRESENCE_STATUS_COLUMN_INDEX = 5;
-    protected static final int CONTACT_CONTACT_STATUS_COLUMN_INDEX = 6;
-    protected static final int CONTACT_PHOTO_ID_COLUMN_INDEX = 7;
-    protected static final int CONTACT_PHOTO_URI_COLUMN_INDEX = 8;
-    protected static final int CONTACT_LOOKUP_KEY_COLUMN_INDEX = 9;
-    protected static final int CONTACT_PHONETIC_NAME_COLUMN_INDEX = 10;
-    protected static final int CONTACT_HAS_PHONE_COLUMN_INDEX = 11;
-    protected static final int CONTACT_IS_USER_PROFILE = 12;
-    protected static final int CONTACT_SNIPPET_COLUMN_INDEX = 13;
+    protected static final int CONTACT_PRESENCE_STATUS_COLUMN_INDEX = 3;
+    protected static final int CONTACT_CONTACT_STATUS_COLUMN_INDEX = 4;
+    protected static final int CONTACT_PHOTO_ID_COLUMN_INDEX = 5;
+    protected static final int CONTACT_PHOTO_URI_COLUMN_INDEX = 6;
+    protected static final int CONTACT_LOOKUP_KEY_COLUMN_INDEX = 7;
+    protected static final int CONTACT_IS_USER_PROFILE = 8;
+    protected static final int CONTACT_SNIPPET_COLUMN_INDEX = 9;
 
     private CharSequence mUnknownNameText;
     private int mDisplayNameColumnIndex;
@@ -144,14 +128,6 @@
                 .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build();
     }
 
-    public boolean getHasPhoneNumber(int position) {
-        return ((Cursor)getItem(position)).getInt(CONTACT_HAS_PHONE_COLUMN_INDEX) != 0;
-    }
-
-    public boolean isContactStarred(int position) {
-        return ((Cursor)getItem(position)).getInt(CONTACT_STARRED_COLUMN_INDEX) != 0;
-    }
-
     @Override
     public String getContactDisplayName(int position) {
         return ((Cursor)getItem(position)).getString(mDisplayNameColumnIndex);
@@ -266,7 +242,7 @@
     protected void bindName(final ContactListItemView view, Cursor cursor) {
         view.showDisplayName(cursor, mDisplayNameColumnIndex, mAlternativeDisplayNameColumnIndex,
                 false, getContactNameDisplayOrder());
-        view.showPhoneticName(cursor, CONTACT_PHONETIC_NAME_COLUMN_INDEX);
+        // Note: we don't show phonetic any more (See issue 5265330)
     }
 
     protected void bindPresenceAndStatusMessage(final ContactListItemView view, Cursor cursor) {
diff --git a/src/com/android/contacts/list/PhoneNumberListAdapter.java b/src/com/android/contacts/list/PhoneNumberListAdapter.java
index b16b10c..459d232 100644
--- a/src/com/android/contacts/list/PhoneNumberListAdapter.java
+++ b/src/com/android/contacts/list/PhoneNumberListAdapter.java
@@ -53,7 +53,6 @@
         Phone.CONTACT_ID,                   // 6
         Phone.LOOKUP_KEY,                   // 7
         Phone.PHOTO_ID,                     // 8
-        Phone.PHONETIC_NAME,                // 9
     };
 
     protected static final int PHONE_ID_COLUMN_INDEX = 0;
@@ -65,7 +64,6 @@
     protected static final int PHONE_CONTACT_ID_COLUMN_INDEX = 6;
     protected static final int PHONE_LOOKUP_KEY_COLUMN_INDEX = 7;
     protected static final int PHONE_PHOTO_ID_COLUMN_INDEX = 8;
-    protected static final int PHONE_PHONETIC_NAME_COLUMN_INDEX = 9;
 
     private CharSequence mUnknownNameText;
     private int mDisplayNameColumnIndex;
@@ -230,9 +228,8 @@
         // Look at elements before and after this position, checking if contact IDs are same.
         // If they have one same contact ID, it means they can be grouped.
         //
-        // In one group, only the first entry will show its photo and names (display name and
-        // phonetic name), and the other entries in the group show just their data (e.g. phone
-        // number, email address).
+        // In one group, only the first entry will show its photo and its name, and the other
+        // entries in the group show just their data (e.g. phone number, email address).
         cursor.moveToPosition(position);
         boolean isFirstEntry = true;
         boolean showBottomDivider = true;
@@ -302,12 +299,11 @@
     protected void bindName(final ContactListItemView view, Cursor cursor) {
         view.showDisplayName(cursor, mDisplayNameColumnIndex, mAlternativeDisplayNameColumnIndex,
                 false, getContactNameDisplayOrder());
-        view.showPhoneticName(cursor, PHONE_PHONETIC_NAME_COLUMN_INDEX);
+        // Note: we don't show phonetic names any more (see issue 5265330)
     }
 
     protected void unbindName(final ContactListItemView view) {
         view.hideDisplayName();
-        view.hidePhoneticName();
     }
 
     protected void bindPhoto(final ContactListItemView view, Cursor cursor) {
