diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index a578576..c142182 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -221,7 +221,8 @@
         Contacts.STARRED, //2
         Contacts.TIMES_CONTACTED, //3
         Presence.PRESENCE_STATUS, //4
-        Contacts.PHOTO_ID, //4
+        Contacts.PHOTO_ID, //5
+        Contacts.HAS_PHONE_NUMBER, //6
     };
     static final String[] LEGACY_PEOPLE_PROJECTION = new String[] {
         People._ID, // 0
@@ -236,6 +237,7 @@
     static final int SUMMARY_TIMES_CONTACTED_COLUMN_INDEX = 3;
     static final int SUMMARY_PRESENCE_STATUS_COLUMN_INDEX = 4;
     static final int SUMMARY_PHOTO_ID_COLUMN_INDEX = 5;
+    static final int SUMMARY_HAS_PHONE_COLUMN_INDEX = 6;
 
     static final String[] PHONES_PROJECTION = new String[] {
         Data._ID, //0
@@ -882,14 +884,16 @@
             return;
         }
         long id = info.id;
-        Uri aggUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, id);
+        Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, id);
+        long rawContactId = ContactsUtils.queryForRawContactId(getContentResolver(), id);
+        Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
 
         // Setup the menu header
         menu.setHeaderTitle(cursor.getString(SUMMARY_NAME_COLUMN_INDEX));
 
         // View contact details
         menu.add(0, MENU_ITEM_VIEW_CONTACT, 0, R.string.menu_viewContact)
-                .setIntent(new Intent(Intent.ACTION_VIEW, aggUri));
+                .setIntent(new Intent(Intent.ACTION_VIEW, contactUri));
 
         /*
         // Calling contact
@@ -923,7 +927,7 @@
 
         // Contact editing
         menu.add(0, MENU_ITEM_EDIT, 0, R.string.menu_editContact)
-                .setIntent(new Intent(Intent.ACTION_EDIT, aggUri));
+                .setIntent(new Intent(Intent.ACTION_EDIT, rawContactUri));
         menu.add(0, MENU_ITEM_DELETE, 0, R.string.menu_deleteContact);
     }
 
@@ -1583,14 +1587,22 @@
         if (list.hasFocus()) {
             Cursor cursor = (Cursor) list.getSelectedItem();
             if (cursor != null) {
-                long dataId = cursor.getLong(ID_COLUMN_INDEX);
-                if (dataId == 0) {
+                boolean hasPhone = cursor.getInt(SUMMARY_HAS_PHONE_COLUMN_INDEX) != 0;
+                if (!hasPhone) {
                     // There is no phone number.
                     signalError();
                     return false;
                 }
-                Uri uri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
-                Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, uri);
+
+                String phone = ContactsUtils.querySuperPrimaryPhone(getContentResolver(), cursor.
+                        getLong(ID_COLUMN_INDEX));
+                if (phone == null) {
+                    signalError();
+                    return false;
+                }
+
+                Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
+                        Uri.fromParts("tel", phone, null));
                 startActivity(intent);
                 return true;
             }
diff --git a/src/com/android/contacts/ContactsUtils.java b/src/com/android/contacts/ContactsUtils.java
index 7611026..76f885e 100644
--- a/src/com/android/contacts/ContactsUtils.java
+++ b/src/com/android/contacts/ContactsUtils.java
@@ -21,6 +21,8 @@
 import com.android.contacts.ui.FastTrackWindow;
 
 import java.io.ByteArrayInputStream;
+
+import android.provider.Contacts.People.Phones;
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.RawContacts;
 
@@ -36,15 +38,13 @@
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.graphics.drawable.Drawable;
-import android.provider.Contacts;
-import android.provider.Contacts.Photos;
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Im;
 import android.provider.ContactsContract.CommonDataKinds.Organization;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.Photo;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
+import android.provider.ContactsContract.Contacts;
 import android.provider.Im.ProviderNames;
 import android.database.Cursor;
 import android.text.TextUtils;
@@ -260,6 +260,49 @@
         return contactId;
     }
 
+    public static String querySuperPrimaryPhone(ContentResolver cr, long contactId) {
+        Cursor c = null;
+        String phone = null;
+        try {
+            Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
+            Uri dataUri = Uri.withAppendedPath(baseUri, "data");
+
+            c = cr.query(dataUri,
+                    new String[] {Phone.NUMBER},
+                    Data.MIMETYPE + "=" + Phone.MIMETYPE +
+                        " AND " + Data.IS_SUPER_PRIMARY + "=1",
+                    null, null);
+            if (c != null && c.moveToFirst()) {
+                // Just return the first one.
+                phone = c.getString(0);
+            }
+        } finally {
+            if (c != null) {
+                c.close();
+            }
+        }
+        return phone;
+    }
+
+    public static long queryForRawContactId(ContentResolver cr, long contactId) {
+        Cursor rawContactIdCursor = null;
+        long rawContactId = -1;
+        try {
+            rawContactIdCursor = cr.query(RawContacts.CONTENT_URI,
+                    new String[] {RawContacts._ID},
+                    RawContacts.CONTACT_ID + "=" + contactId, null, null);
+            if (rawContactIdCursor != null && rawContactIdCursor.moveToFirst()) {
+                // Just return the first one.
+                rawContactId = rawContactIdCursor.getLong(0);
+            }
+        } finally {
+            if (rawContactIdCursor != null) {
+                rawContactIdCursor.close();
+            }
+        }
+        return rawContactId;
+    }
+
 
     /**
      * Utility for creating a standard tab indicator view.
