diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index 6ab769a..af56caf 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -185,7 +185,7 @@
         Aggregates.PRIMARY_PHONE_ID, //3
         Aggregates.PRIMARY_EMAIL_ID, //4
     };
-    
+
     static final String[] AGGREGATES_PRIMARY_PHONE_PROJECTION = new String[] {
         Aggregates._ID, // 0
         Aggregates.DISPLAY_NAME, // 1
@@ -195,7 +195,7 @@
         CommonDataKinds.Phone.LABEL, //5
         CommonDataKinds.Phone.NUMBER, //6
     };
-    
+
     static final int ID_COLUMN_INDEX = 0;
     static final int NAME_COLUMN_INDEX = 1;
     static final int STARRED_COLUMN_INDEX = 2;
@@ -568,7 +568,7 @@
                 break;
             } */
 
-            case DISPLAY_TYPE_ALL: 
+            case DISPLAY_TYPE_ALL:
             default: {
                 mMode = MODE_ALL_CONTACTS;
                 mDisplayInfo = null;
@@ -823,7 +823,7 @@
             return;
         }
         long id = info.id;
-        Uri dataUri = Uri.withAppendedPath(Aggregates.CONTENT_URI, id + "/data");
+        Uri dataUri = ContentUris.withAppendedId(Aggregates.CONTENT_URI, id);
 
         // Setup the menu header
         menu.setHeaderTitle(cursor.getString(NAME_COLUMN_INDEX));
@@ -842,13 +842,13 @@
                     this, CommonDataKinds.Phone.CONTENT_ITEM_TYPE, type, label);
             Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
                     ContentUris.withAppendedId(Data.CONTENT_URI, id));
-            menu.add(0, MENU_ITEM_CALL, 0, 
+            menu.add(0, MENU_ITEM_CALL, 0,
                     String.format(getString(R.string.menu_callNumber), label)).setIntent(intent);
 
             // Send SMS item
             menu.add(0, MENU_ITEM_SEND_SMS, 0, R.string.menu_sendSMS)
                     .setIntent(new Intent(Intent.ACTION_SENDTO,
-                            Uri.fromParts("sms", 
+                            Uri.fromParts("sms",
                                     cursor.getString(PRIMARY_PHONE_NUMBER_COLUMN_INDEX), null)));
         }
 
@@ -967,7 +967,7 @@
             }
             startActivity(intent);
             finish();
-        } else */ 
+        } else */
         if (id != -1) {
             if ((mMode & MODE_MASK_PICKER) == 0) {
                 Intent intent = new Intent(Intent.ACTION_VIEW,
@@ -1073,7 +1073,7 @@
         } else {
             return NAME_COLUMN + " COLLATE LOCALIZED ASC";
         } */
-        
+
         return NAME_COLUMN + " COLLATE LOCALIZED ASC";
     }
 
@@ -1095,9 +1095,9 @@
             /* case MODE_PICK_CONTACT:
             case MODE_PICK_OR_CREATE_CONTACT:
             case MODE_INSERT_OR_EDIT_CONTACT: */
-                mQueryHandler.startQuery(QUERY_TOKEN, null, 
-                        Uri.parse(ContactsContract.AUTHORITY_URI + "/aggregates_primary_phone/*"), 
-                        AGGREGATES_PRIMARY_PHONE_PROJECTION, null, null, 
+                mQueryHandler.startQuery(QUERY_TOKEN, null,
+                        Uri.parse(ContactsContract.AUTHORITY_URI + "/aggregates_primary_phone/*"),
+                        AGGREGATES_PRIMARY_PHONE_PROJECTION, null, null,
                         getSortOrder(AGGREGATES_PRIMARY_PHONE_PROJECTION));
                 break;
 
@@ -1137,10 +1137,10 @@
             } */
 
             case MODE_STARRED:
-                mQueryHandler.startQuery(QUERY_TOKEN, null, 
+                mQueryHandler.startQuery(QUERY_TOKEN, null,
                         Uri.parse(ContactsContract.AUTHORITY_URI + "/aggregates_primary_phone/*"),
                         AGGREGATES_PRIMARY_PHONE_PROJECTION,
-                        Aggregates.STARRED + "=1", null, 
+                        Aggregates.STARRED + "=1", null,
                         getSortOrder(AGGREGATES_PRIMARY_PHONE_PROJECTION));
                 break;
 
@@ -1196,7 +1196,7 @@
             case MODE_PICK_CONTACT:
             case MODE_PICK_OR_CREATE_CONTACT:
             case MODE_INSERT_OR_EDIT_CONTACT: {
-                return resolver.query(getPeopleFilterUri(filter), 
+                return resolver.query(getPeopleFilterUri(filter),
                         AGGREGATES_PRIMARY_PHONE_PROJECTION, null, null,
                         getSortOrder(AGGREGATES_PRIMARY_PHONE_PROJECTION));
             }
@@ -1208,9 +1208,9 @@
             }
 
             case MODE_STARRED: {
-                return resolver.query(getPeopleFilterUri(filter), 
+                return resolver.query(getPeopleFilterUri(filter),
                         AGGREGATES_PRIMARY_PHONE_PROJECTION,
-                        Aggregates.STARRED + "=1", null, 
+                        Aggregates.STARRED + "=1", null,
                         getSortOrder(AGGREGATES_PRIMARY_PHONE_PROJECTION));
             }
 
@@ -1587,7 +1587,7 @@
             } else {
                 numberView.setVisibility(View.GONE);
                 labelView.setVisibility(View.GONE);
-            } 
+            }
 
             // Set the label
             if (!cursor.isNull(PRIMARY_PHONE_TYPE_COLUMN_INDEX)) {
@@ -1744,7 +1744,7 @@
         public Object [] getSections() {
             if (mMode == MODE_STARRED) {
                 return new String[] { " " };
-            } else { 
+            } else {
                 return mIndexer.getSections();
             }
         }
diff --git a/src/com/android/contacts/ViewContactActivity.java b/src/com/android/contacts/ViewContactActivity.java
index b38156d..a40d8b4 100644
--- a/src/com/android/contacts/ViewContactActivity.java
+++ b/src/com/android/contacts/ViewContactActivity.java
@@ -86,7 +86,7 @@
 /**
  * Displays the details of a specific contact.
  */
-public class ViewContactActivity extends ListActivity 
+public class ViewContactActivity extends ListActivity
         implements View.OnCreateContextMenuListener, View.OnClickListener,
         DialogInterface.OnClickListener {
     private static final String TAG = "ViewContact";
@@ -117,7 +117,7 @@
 
     private Cursor mCursor;
     private boolean mObserverRegistered;
-    
+
     private ContentObserver mObserver = new ContentObserver(new Handler()) {
         @Override
         public boolean deliverSelfNotifications() {
@@ -194,7 +194,7 @@
             mNoPhotoResource = R.drawable.ic_contact_picture_3;
         }
 
-        mUri = getIntent().getData();
+        mUri = Uri.withAppendedPath(getIntent().getData(), "data");
         mResolver = getContentResolver();
 
         // Build the list of sections. The order they're added to mSections dictates the
@@ -283,7 +283,7 @@
             // Load the photo
             mPhotoView.setImageBitmap(People.loadContactPhoto(this, mUri, mNoPhotoResource,
                     null)); */
-            
+
             mPhotoView.setImageBitmap(BitmapFactory.decodeResource(getResources(),
                     mNoPhotoResource, null));
 
@@ -355,7 +355,7 @@
             Log.e(TAG, "bad menuInfo");
             return;
         }
-        
+
         // TODO(emillar) Bring this back.
         /*ViewEntry entry = ContactEntryAdapter.getEntry(mSections, info.position, SHOW_SEPARATORS);
         switch (entry.kind) {
@@ -377,7 +377,7 @@
                 menu.add(0, 0, 0, R.string.menu_viewAddress).setIntent(entry.intent);
                 break;
             }
-            
+
             case ContactEntryAdapter.Entry.KIND_GROUP: {
                 menu.add(0, 0, 0, R.string.menu_viewGroup).setIntent(entry.intent);
                 break;
@@ -393,7 +393,7 @@
                 showDialog(DIALOG_CONFIRM_DELETE);
                 return true;
             }
-            
+
             // TODO(emillar) Bring this back.
             /*case MENU_ITEM_SHOW_BARCODE:
                 if (mCursor.moveToFirst()) {
@@ -404,7 +404,7 @@
                     if (!TextUtils.isEmpty(name)) {
                         // Correctly handle when section headers are hidden
                         int sepAdjust = SHOW_SEPARATORS ? 1 : 0;
-                        
+
                         bundle.putString(Contacts.Intents.Insert.NAME, name);
                         // The 0th ViewEntry in each ArrayList below is a separator item
                         int entriesToAdd = Math.min(mPhoneEntries.size() - sepAdjust, PHONE_KEYS.length);
@@ -439,7 +439,7 @@
         }
         return super.onOptionsItemSelected(item);
     }
-    
+
     @Override
     public boolean onContextItemSelected(MenuItem item) {
         switch (item.getItemId()) {
@@ -535,7 +535,7 @@
      */
     private void buildSeparators() {
         ViewEntry separator;
-        
+
         separator = new ViewEntry();
         separator.kind = ViewEntry.KIND_SEPARATOR;
         separator.data = getString(R.string.listSeparatorCallNumber);
@@ -588,7 +588,7 @@
 
     /**
      * Build up the entries to display on the screen.
-     * 
+     *
      * @param personCursor the URI for the contact being displayed
      */
     private final void buildEntries(Cursor aggCursor) {
@@ -601,13 +601,13 @@
         if (SHOW_SEPARATORS) {
             buildSeparators();
         }
-        
+
         // Build up method entries
         if (mUri != null) {
             while (aggCursor.moveToNext()) {
                 final String mimetype = aggCursor.getString(DATA_MIMETYPE_COLUMN);
                 final String pkg = aggCursor.getString(DATA_PACKAGE_COLUMN);
-                
+
                 ViewEntry entry = new ViewEntry();
 
                 final long id = aggCursor.getLong(DATA_ID_COLUMN);
@@ -618,8 +618,8 @@
                 entry.kind = 0;
 
                 if (mimetype.equals(CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
-                        || mimetype.equals(CommonDataKinds.Email.CONTENT_ITEM_TYPE) 
-                        || mimetype.equals(CommonDataKinds.Postal.CONTENT_ITEM_TYPE) 
+                        || mimetype.equals(CommonDataKinds.Email.CONTENT_ITEM_TYPE)
+                        || mimetype.equals(CommonDataKinds.Postal.CONTENT_ITEM_TYPE)
                         || mimetype.equals(CommonDataKinds.Im.CONTENT_ITEM_TYPE)) {
                     final int type = aggCursor.getInt(DATA_1_COLUMN);
                     final String label = aggCursor.getString(DATA_2_COLUMN);
@@ -635,7 +635,7 @@
                     // Build phone entries
                     if (mimetype.equals(CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
                         mNumPhoneNumbers++;
-                     
+
                         final CharSequence displayLabel = ContactsUtils.getDisplayLabel(
                                 this, mimetype, type, label);
                         entry.label = buildActionString(R.string.actionCall, displayLabel, true);
@@ -649,7 +649,7 @@
                         entry.actionIcon = android.R.drawable.sym_action_call;
                         mPhoneEntries.add(entry);
 
-                        if (type == CommonDataKinds.Phone.TYPE_MOBILE 
+                        if (type == CommonDataKinds.Phone.TYPE_MOBILE
                                 || mShowSmsLinksForAllPhones) {
                             // Add an SMS entry
                             ViewEntry smsEntry = new ViewEntry();
@@ -721,7 +721,7 @@
                         }*/
                         entry.actionIcon = android.R.drawable.sym_action_chat;
                         mImEntries.add(entry);
-                    } 
+                    }
                 // Build organization entries
                 } else if (mimetype.equals(CommonDataKinds.Organization.CONTENT_ITEM_TYPE)) {
                     final int type = aggCursor.getInt(DATA_1_COLUMN);
@@ -733,13 +733,13 @@
                     if (isPrimary) {
                         entry.primaryIcon = R.drawable.ic_default_number;
                     }
-                    
+
                     // Don't crash if the data is bogus
                     if (TextUtils.isEmpty(company) && TextUtils.isEmpty(title)) {
                         Log.w(TAG, "empty data for contact method " + id);
                         continue;
                     }
-                    
+
                     entry.data = title;
                     entry.actionIcon = R.drawable.sym_action_organization;
                     entry.label = company;
@@ -759,17 +759,17 @@
                         Log.w(TAG, "empty data for contact method " + id);
                         continue;
                     }
-                    
+
                     mOtherEntries.add(entry);
                 // Build the ringtone and send to voicemail entries
                 } else if (mimetype.equals(CommonDataKinds.CustomRingtone.CONTENT_ITEM_TYPE)) {
                     final Boolean sendToVoicemail = "1".equals(aggCursor.getString(DATA_1_COLUMN));
                     final String ringtoneStr = aggCursor.getString(DATA_2_COLUMN);
 
-                    // TODO(emillar) we need to enforce uniqueness of custom ringtone entries on a 
+                    // TODO(emillar) we need to enforce uniqueness of custom ringtone entries on a
                     // single aggregate. This could be done by checking against the reference ID stored
                     // in the aggregate.
-                    
+
                     // Build the send directly to voice mail entry
                     if (sendToVoicemail) {
                         entry.label = getString(R.string.actionIncomingCall);
@@ -791,7 +791,7 @@
                         }
                     }
                 }
-                
+
                 // TODO(emillar) Add group entries
 //              // Build the group entries
 //              final Uri groupsUri = Uri.withAppendedPath(mUri, GroupMembership.CONTENT_DIRECTORY);
@@ -834,7 +834,7 @@
 //                      groupCursor.close();
 //                  }
 //              }
-                
+
             }
         }
     }
@@ -852,7 +852,7 @@
             return getString(actionResId, type.toString());
         }
     }
-    
+
     /**
      * A basic structure with the data for a contact entry in the list.
      */
@@ -872,18 +872,18 @@
             public TextView data;
             public ImageView actionIcon;
             public ImageView presenceIcon;
-            
+
             // Need to keep track of this too
             ViewEntry entry;
         }
-        
+
         ViewAdapter(Context context, ArrayList<ArrayList<ViewEntry>> sections) {
             super(context, sections, SHOW_SEPARATORS);
         }
 
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
-            ViewEntry entry = getEntry(mSections, position, false); 
+            ViewEntry entry = getEntry(mSections, position, false);
             View v;
 
             // Handle separators specially
