diff --git a/res/values/strings.xml b/res/values/strings.xml
index d3f42ef..f921738 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -97,6 +97,10 @@
     <!-- Menu item that makes a phone the default for a contact. The default number used when you
          try to call a contact without specifying a specific number. -->
     <string name="menu_makeDefaultNumber">Make default number</string>
+    
+    <!-- Menu item that makes an email address the default for a contact. The default email used 
+    	 when you try to email a contact without specifying a specific address. -->
+    <string name="menu_makeDefaultEmail">Make default email</string>
 
     <!-- Confirmation dialog title after users selects to delete a contact. -->
     <string name="deleteConfirmation_title">Delete</string>
diff --git a/src/com/android/contacts/ContactEntryAdapter.java b/src/com/android/contacts/ContactEntryAdapter.java
index 64f2585..ab47b5c 100644
--- a/src/com/android/contacts/ContactEntryAdapter.java
+++ b/src/com/android/contacts/ContactEntryAdapter.java
@@ -37,33 +37,37 @@
         Data._ID, // 2
         Data.PACKAGE, //3
         Data.MIMETYPE, //4
-        Data.DATA1, //5
-        Data.DATA2, //6
-        Data.DATA3, //7
-        Data.DATA4, //8
-        Data.DATA5, //9
-        Data.DATA6, //10
-        Data.DATA7, //11
-        Data.DATA8, //12
-        Data.DATA9, //13
-        Data.DATA10, //14
+        Data.IS_PRIMARY, //5
+        Data.IS_SUPER_PRIMARY, //6
+        Data.DATA1, //7
+        Data.DATA2, //8
+        Data.DATA3, //9
+        Data.DATA4, //10
+        Data.DATA5, //11
+        Data.DATA6, //12
+        Data.DATA7, //13
+        Data.DATA8, //14
+        Data.DATA9, //15
+        Data.DATA10, //16
     };
     public static final int AGGREGATE_DISPLAY_NAME_COLUMN = 0;
     public static final int AGGREGATE_STARRED_COLUMN = 1;
     public static final int DATA_ID_COLUMN = 2;
     public static final int DATA_PACKAGE_COLUMN = 3;
     public static final int DATA_MIMETYPE_COLUMN = 4;
-    public static final int DATA_1_COLUMN = 5;
-    public static final int DATA_2_COLUMN = 6;
-    public static final int DATA_3_COLUMN = 7;
-    public static final int DATA_4_COLUMN = 8;
-    public static final int DATA_5_COLUMN = 9;
-    public static final int DATA_6_COLUMN = 10;
-    public static final int DATA_7_COLUMN = 11;
-    public static final int DATA_8_COLUMN = 12;
-    public static final int DATA_9_COLUMN = 13;
-    public static final int DATA_10_COLUMN = 14;
-    
+    public static final int DATA_IS_PRIMARY_COLUMN = 5;
+    public static final int DATA_IS_SUPER_PRIMARY_COLUMN = 6;
+    public static final int DATA_1_COLUMN = 7;
+    public static final int DATA_2_COLUMN = 8;
+    public static final int DATA_3_COLUMN = 9;
+    public static final int DATA_4_COLUMN = 10;
+    public static final int DATA_5_COLUMN = 11;
+    public static final int DATA_6_COLUMN = 12;
+    public static final int DATA_7_COLUMN = 13;
+    public static final int DATA_8_COLUMN = 14;
+    public static final int DATA_9_COLUMN = 15;
+    public static final int DATA_10_COLUMN = 16;
+
     protected ArrayList<ArrayList<E>> mSections;
     protected LayoutInflater mInflater;
     protected Context mContext;
@@ -87,8 +91,10 @@
         public Uri uri;
         public long id = 0;
         public int maxLines = 1;
+        // TODO(emillar): remove "kind" completely once it is removed from EditContactActivity
         public int kind;
-        
+        public String mimetype;
+
         /**
          * Helper for making subclasses parcelable.
          */
@@ -98,9 +104,9 @@
             p.writeParcelable(uri, 0);
             p.writeLong(id);
             p.writeInt(maxLines);
-            p.writeInt(kind);
+            p.writeString(mimetype);
         }
-        
+
         /**
          * Helper for making subclasses parcelable.
          */
@@ -110,7 +116,7 @@
             uri = p.readParcelable(null);
             id = p.readLong();
             maxLines = p.readInt();
-            kind = p.readInt();
+            mimetype = p.readString();
         }
     }
 
@@ -123,7 +129,7 @@
 
     /**
      * Resets the section data.
-     * 
+     *
      * @param sections the section data
      */
     public final void setSections(ArrayList<ArrayList<E>> sections, boolean separators) {
@@ -134,7 +140,7 @@
 
     /**
      * Resets the section data and returns the position of the given entry.
-     * 
+     *
      * @param sections the section data
      * @param entry the entry to return the position for
      * @return the position of entry, or -1 if it isn't found
@@ -210,7 +216,7 @@
 
     /**
      * Get the entry for the given position.
-     * 
+     *
      * @param sections the list of sections
      * @param position the position for the desired entry
      * @return the ContactEntry for the given position
@@ -235,7 +241,7 @@
 
     /**
      * Get the count of entries in all sections
-     * 
+     *
      * @param sections the list of sections
      * @return the count of entries in all sections
      */
@@ -283,7 +289,7 @@
 
     /**
      * Create a new view for an entry.
-     * 
+     *
      * @parent the parent ViewGroup
      * @return the newly created view
      */
@@ -291,7 +297,7 @@
 
     /**
      * Binds the data from an entry to a view.
-     * 
+     *
      * @param view the view to display the entry in
      * @param entry the data to bind
      */
diff --git a/src/com/android/contacts/ContactsUtils.java b/src/com/android/contacts/ContactsUtils.java
index e812cc8..18d6dfb 100644
--- a/src/com/android/contacts/ContactsUtils.java
+++ b/src/com/android/contacts/ContactsUtils.java
@@ -1,18 +1,43 @@
+/*
+ * Copyright (C) 2009 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;
 
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import android.net.Uri;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+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.Postal;
 import android.provider.Im.ProviderNames;
-
-import android.content.Context;
 import android.text.TextUtils;
 
 public class ContactsUtils {
-    
+
     public static final CharSequence getDisplayLabel(Context context, String mimetype, int type,
             CharSequence label) {
         CharSequence display = "";
@@ -40,7 +65,7 @@
             // Can't return display label for given mimetype.
             return display;
         }
-        
+
         if (type != customType) {
             CharSequence[] labels = context.getResources().getTextArray(arrayResId);
             try {
@@ -55,7 +80,7 @@
         }
         return display;
     }
-    
+
     public static Object decodeImProtocol(String encodedString) {
         if (encodedString == null) {
             return null;
@@ -72,9 +97,43 @@
         throw new IllegalArgumentException(
                 "the value is not a valid encoded protocol, " + encodedString);
     }
-    
 
-    
+    /**
+     * Opens an InputStream for the person's photo and returns the photo as a Bitmap.
+     * If the person's photo isn't present returns null.
+     *
+     * @param aggCursor the Cursor pointing to the data record containing the photo.
+     * @param bitmapColumnIndex the column index where the photo Uri is stored.
+     * @param options the decoding options, can be set to null
+     * @return the photo Bitmap
+     */
+    public static Bitmap loadContactPhoto(Cursor aggCursor, int bitmapColumnIndex,
+            BitmapFactory.Options options) {
+        if (aggCursor == null) {
+            return null;
+        }
+
+        byte[] data = aggCursor.getBlob(bitmapColumnIndex);;
+        return BitmapFactory.decodeByteArray(data, 0, data.length, options);
+    }
+
+    /**
+     * Loads a placeholder photo.
+     *
+     * @param placeholderImageResource the resource to use for the placeholder image
+     * @param context the Context
+     * @param options the decoding options, can be set to null
+     * @return the placeholder Bitmap.
+     */
+    public static Bitmap loadPlaceholderPhoto(int placeholderImageResource, Context context,
+            BitmapFactory.Options options) {
+        if (placeholderImageResource == 0) {
+            return null;
+        }
+        return BitmapFactory.decodeResource(context.getResources(),
+                placeholderImageResource, options);
+    }
+
     /**
      * This looks up the provider name defined in
      * {@link android.provider.Im.ProviderNames} from the predefined IM protocol id.
diff --git a/src/com/android/contacts/ViewContactActivity.java b/src/com/android/contacts/ViewContactActivity.java
index a40d8b4..4b90199 100644
--- a/src/com/android/contacts/ViewContactActivity.java
+++ b/src/com/android/contacts/ViewContactActivity.java
@@ -22,6 +22,8 @@
 import static com.android.contacts.ContactEntryAdapter.DATA_ID_COLUMN;
 import static com.android.contacts.ContactEntryAdapter.DATA_PACKAGE_COLUMN;
 import static com.android.contacts.ContactEntryAdapter.DATA_MIMETYPE_COLUMN;
+import static com.android.contacts.ContactEntryAdapter.DATA_IS_PRIMARY_COLUMN;
+import static com.android.contacts.ContactEntryAdapter.DATA_IS_SUPER_PRIMARY_COLUMN;
 import static com.android.contacts.ContactEntryAdapter.DATA_1_COLUMN;
 import static com.android.contacts.ContactEntryAdapter.DATA_2_COLUMN;
 import static com.android.contacts.ContactEntryAdapter.DATA_3_COLUMN;
@@ -50,6 +52,7 @@
 import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.database.Cursor;
+import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.drawable.Drawable;
 import android.media.Ringtone;
@@ -62,6 +65,7 @@
 import android.os.SystemClock;
 import android.provider.ContactsContract.CommonDataKinds;
 import android.provider.ContactsContract.Aggregates;
+import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Data;
 import android.provider.Im;
 import android.text.TextUtils;
@@ -101,6 +105,7 @@
     public static final int MENU_ITEM_SHOW_BARCODE = 3;
 
     private Uri mUri;
+    private Uri mAggDataUri;
     private ContentResolver mResolver;
     private ViewAdapter mAdapter;
     private int mNumPhoneNumbers = 0;
@@ -194,7 +199,8 @@
             mNoPhotoResource = R.drawable.ic_contact_picture_3;
         }
 
-        mUri = Uri.withAppendedPath(getIntent().getData(), "data");
+        mUri = getIntent().getData();
+        mAggDataUri = Uri.withAppendedPath(mUri, "data");
         mResolver = getContentResolver();
 
         // Build the list of sections. The order they're added to mSections dictates the
@@ -211,7 +217,8 @@
         //TODO Read this value from a preference
         mShowSmsLinksForAllPhones = true;
 
-        mCursor = mResolver.query(mUri, AGGREGATE_PROJECTION, null, null, null);
+        mCursor = mResolver.query(mAggDataUri,
+                AGGREGATE_PROJECTION, null, null, null);
     }
 
     @Override
@@ -274,18 +281,11 @@
                 mNameView.setText(name);
             }
 
-			// TODO(emillar) Bring this back.
+            // TODO(emillar) Bring this back.
             /*if (mPhoneticNameView != null) {
                 String phoneticName = mCursor.getString(CONTACT_PHONETIC_NAME_COLUMN);
                 mPhoneticNameView.setText(phoneticName);
-            }
-
-            // Load the photo
-            mPhotoView.setImageBitmap(People.loadContactPhoto(this, mUri, mNoPhotoResource,
-                    null)); */
-
-            mPhotoView.setImageBitmap(BitmapFactory.decodeResource(getResources(),
-                    mNoPhotoResource, null));
+            } */
 
             // Set the star
             mStarView.setChecked(mCursor.getInt(AGGREGATE_STARRED_COLUMN) == 1 ? true : false);
@@ -356,33 +356,25 @@
             return;
         }
 
-        // TODO(emillar) Bring this back.
-        /*ViewEntry entry = ContactEntryAdapter.getEntry(mSections, info.position, SHOW_SEPARATORS);
-        switch (entry.kind) {
-            case Contacts.KIND_PHONE: {
-                menu.add(0, 0, 0, R.string.menu_call).setIntent(entry.intent);
-                menu.add(0, 0, 0, R.string.menu_sendSMS).setIntent(entry.auxIntent);
-                if (entry.primaryIcon == -1) {
-                    menu.add(0, MENU_ITEM_MAKE_DEFAULT, 0, R.string.menu_makeDefaultNumber);
-                }
-                break;
+        ViewEntry entry = ContactEntryAdapter.getEntry(mSections, info.position, SHOW_SEPARATORS);
+        if (entry.mimetype.equals(CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
+            menu.add(0, 0, 0, R.string.menu_call).setIntent(entry.intent);
+            menu.add(0, 0, 0, R.string.menu_sendSMS).setIntent(entry.auxIntent);
+            if (entry.primaryIcon == -1) {
+                menu.add(0, MENU_ITEM_MAKE_DEFAULT, 0, R.string.menu_makeDefaultNumber);
             }
-
-            case Contacts.KIND_EMAIL: {
-                menu.add(0, 0, 0, R.string.menu_sendEmail).setIntent(entry.intent);
-                break;
+        } else if (entry.mimetype.equals(CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {
+            menu.add(0, 0, 0, R.string.menu_sendEmail).setIntent(entry.intent);
+            if (entry.primaryIcon == -1) {
+                menu.add(0, MENU_ITEM_MAKE_DEFAULT, 0, R.string.menu_makeDefaultEmail);
             }
-
-            case Contacts.KIND_POSTAL: {
-                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;
-            }
-        } */
+        } else if (entry.mimetype.equals(CommonDataKinds.Postal.CONTENT_ITEM_TYPE)) {
+            menu.add(0, 0, 0, R.string.menu_viewAddress).setIntent(entry.intent);
+        }
+        // TODO(emillar): add back with group support.
+        /* else if (entry.mimetype.equals()) {
+            menu.add(0, 0, 0, R.string.menu_viewGroup).setIntent(entry.intent);
+            } */
     }
 
     @Override
@@ -444,8 +436,7 @@
     public boolean onContextItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case MENU_ITEM_MAKE_DEFAULT: {
-                //TODO(emillar) Bring this back.
-                /*AdapterView.AdapterContextMenuInfo info;
+                AdapterView.AdapterContextMenuInfo info;
                 try {
                      info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
                 } catch (ClassCastException e) {
@@ -455,10 +446,16 @@
 
                 ViewEntry entry = ContactEntryAdapter.getEntry(mSections, info.position,
                         SHOW_SEPARATORS);
+
+                // Update the primary values in the data record.
                 ContentValues values = new ContentValues(1);
-                values.put(PRIMARY_PHONE_ID, entry.id);
-                getContentResolver().update(mUri, values, null, null);
-                dataChanged();*/
+                values.put(Data.IS_PRIMARY, 1);
+                values.put(Data.IS_SUPER_PRIMARY, 1);
+
+                Log.i(TAG, mUri.toString());
+                getContentResolver().update(ContentUris.withAppendedId(Data.CONTENT_URI, entry.id),
+                        values, null, null);
+                dataChanged();
                 return true;
             }
         }
@@ -530,55 +527,8 @@
         //TODO: implement this when we have the sonification APIs
     }
 
-    /**
-     * Build separator entries for all of the sections.
-     */
-    private void buildSeparators() {
-        ViewEntry separator;
-
-        separator = new ViewEntry();
-        separator.kind = ViewEntry.KIND_SEPARATOR;
-        separator.data = getString(R.string.listSeparatorCallNumber);
-        mPhoneEntries.add(separator);
-
-        separator = new ViewEntry();
-        separator.kind = ViewEntry.KIND_SEPARATOR;
-        separator.data = getString(R.string.listSeparatorSendSmsMms);
-        mSmsEntries.add(separator);
-
-        separator = new ViewEntry();
-        separator.kind = ViewEntry.KIND_SEPARATOR;
-        separator.data = getString(R.string.listSeparatorSendEmail);
-        mEmailEntries.add(separator);
-
-        separator = new ViewEntry();
-        separator.kind = ViewEntry.KIND_SEPARATOR;
-        separator.data = getString(R.string.listSeparatorSendIm);
-        mImEntries.add(separator);
-
-        separator = new ViewEntry();
-        separator.kind = ViewEntry.KIND_SEPARATOR;
-        separator.data = getString(R.string.listSeparatorMapAddress);
-        mPostalEntries.add(separator);
-
-        separator = new ViewEntry();
-        separator.kind = ViewEntry.KIND_SEPARATOR;
-        separator.data = getString(R.string.listSeparatorOrganizations);
-        mOrganizationEntries.add(separator);
-
-        separator = new ViewEntry();
-        separator.kind = ViewEntry.KIND_SEPARATOR;
-        separator.data = getString(R.string.listSeparatorGroups);
-        mGroupEntries.add(separator);
-
-        separator = new ViewEntry();
-        separator.kind = ViewEntry.KIND_SEPARATOR;
-        separator.data = getString(R.string.listSeparatorOtherInformation);
-        mOtherEntries.add(separator);
-    }
-
     private Uri constructImToUrl(String host, String data) {
-	    // don't encode the url, because the Activity Manager can't find using the encoded url
+        // don't encode the url, because the Activity Manager can't find using the encoded url
         StringBuilder buf = new StringBuilder("imto://");
         buf.append(host);
         buf.append('/');
@@ -598,12 +548,9 @@
             mSections.get(i).clear();
         }
 
-        if (SHOW_SEPARATORS) {
-            buildSeparators();
-        }
-
         // Build up method entries
         if (mUri != null) {
+            Bitmap photoBitmap = null;
             while (aggCursor.moveToNext()) {
                 final String mimetype = aggCursor.getString(DATA_MIMETYPE_COLUMN);
                 final String pkg = aggCursor.getString(DATA_PACKAGE_COLUMN);
@@ -614,17 +561,17 @@
                 final Uri uri = ContentUris.withAppendedId(Data.CONTENT_URI, id);
                 entry.id = id;
                 entry.uri = uri;
-                //TODO(emillar) Can we get rid of kind?
-                entry.kind = 0;
+                entry.mimetype = mimetype;
 
                 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.Im.CONTENT_ITEM_TYPE)) {
                     final int type = aggCursor.getInt(DATA_1_COLUMN);
-                    final String label = aggCursor.getString(DATA_2_COLUMN);
-                    final String data = aggCursor.getString(DATA_3_COLUMN);
-                    final boolean isPrimary = "1".equals(aggCursor.getString(DATA_4_COLUMN));
+                    final String label = aggCursor.getString(DATA_3_COLUMN);
+                    final String data = aggCursor.getString(DATA_2_COLUMN);
+                    final boolean isSuperPrimary = "1".equals(
+                            aggCursor.getString(DATA_IS_SUPER_PRIMARY_COLUMN));
 
                     // Don't crash if the data is bogus
                     if (TextUtils.isEmpty(data)) {
@@ -643,7 +590,7 @@
                         entry.intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, entry.uri);
                         entry.auxIntent = new Intent(Intent.ACTION_SENDTO,
                                 Uri.fromParts("sms", data, null));
-                        if (isPrimary) {
+                        if (isSuperPrimary) {
                             entry.primaryIcon = R.drawable.ic_default_number;
                         }
                         entry.actionIcon = android.R.drawable.sym_action_call;
@@ -659,7 +606,7 @@
                             smsEntry.id = id;
                             smsEntry.uri = uri;
                             smsEntry.intent = entry.auxIntent;
-                            smsEntry.kind = ViewEntry.KIND_SMS;
+                            smsEntry.mimetype = FastTrackWindow.MIME_SMS_ADDRESS;
                             smsEntry.actionIcon = R.drawable.sym_action_sms;
                             mSmsEntries.add(smsEntry);
                         }
@@ -671,7 +618,7 @@
                         entry.intent = new Intent(Intent.ACTION_SENDTO,
                                 Uri.fromParts("mailto", data, null));
                         entry.actionIcon = android.R.drawable.sym_action_email;
-                        if (isPrimary) {
+                        if (isSuperPrimary) {
                             entry.primaryIcon = R.drawable.ic_default_number;
                         }
                         mEmailEntries.add(entry);
@@ -790,8 +737,12 @@
                             }
                         }
                     }
+                // Load the photo
+                } else if (mimetype.equals(CommonDataKinds.Photo.CONTENT_ITEM_TYPE)) {
+                    photoBitmap = ContactsUtils.loadContactPhoto(aggCursor, DATA_1_COLUMN, null);
                 }
 
+
                 // TODO(emillar) Add group entries
 //              // Build the group entries
 //              final Uri groupsUri = Uri.withAppendedPath(mUri, GroupMembership.CONTENT_DIRECTORY);
@@ -836,6 +787,11 @@
 //              }
 
             }
+
+            if (photoBitmap == null) {
+                photoBitmap = ContactsUtils.loadPlaceholderPhoto(mNoPhotoResource, this, null);
+            }
+            mPhotoView.setImageBitmap(photoBitmap);
         }
     }
 
@@ -886,14 +842,6 @@
             ViewEntry entry = getEntry(mSections, position, false);
             View v;
 
-            // Handle separators specially
-            if (entry.kind == ViewEntry.KIND_SEPARATOR) {
-                TextView separator = (TextView) mInflater.inflate(
-                        R.layout.list_separator, parent, SHOW_SEPARATORS);
-                separator.setText(entry.data);
-                return separator;
-            }
-
             ViewCache views;
 
             // Check to see if we can reuse convertView
