diff --git a/src/com/android/contacts/CallDetailActivity.java b/src/com/android/contacts/CallDetailActivity.java
old mode 100755
new mode 100644
index 8b25c09..ada4778
--- a/src/com/android/contacts/CallDetailActivity.java
+++ b/src/com/android/contacts/CallDetailActivity.java
@@ -26,14 +26,15 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.CallLog;
-import android.provider.CallLog.Calls;
 import android.provider.Contacts;
-import android.provider.Contacts.Intents.Insert;
+import android.provider.CallLog.Calls;
 import android.provider.Contacts.People;
 import android.provider.Contacts.Phones;
+import android.provider.Contacts.Intents.Insert;
+import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
 import android.text.format.DateUtils;
-import android.util.Log;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -44,7 +45,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -54,14 +55,9 @@
         AdapterView.OnItemClickListener {
     private static final String TAG = "CallDetail";
 
-    private Uri mUri;
-    
-    private View mCallDetailItem;
-    
     private TextView mCallType;
     private ImageView mCallTypeIcon;
     private TextView mCallTime;
-    private View mCallDurationRow;
     private TextView mCallDuration;
 
     private String mNumber = null;
@@ -83,11 +79,16 @@
     
     static final String[] PHONES_PROJECTION = new String[] {
         Phones.PERSON_ID,
+        Phones.NAME,
+        Phones.TYPE,
+        Phones.LABEL,
+        Phones.NUMBER,
     };
-
-    static final int PERSON_ID_COLUMN_INDEX = 0;
-    
-    private static final int INVALID_TYPE = -1;
+    static final int COLUMN_INDEX_ID = 0;
+    static final int COLUMN_INDEX_NAME = 1;
+    static final int COLUMN_INDEX_TYPE = 2;
+    static final int COLUMN_INDEX_LABEL = 3;
+    static final int COLUMN_INDEX_NUMBER = 4;
 
     @Override
     protected void onCreate(Bundle icicle) {
@@ -98,13 +99,10 @@
         mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
         mResources = getResources();
         
-        mCallDetailItem = mInflater.inflate(R.layout.call_detail_item, getListView(), false);
-        
-        mCallType = (TextView) mCallDetailItem.findViewById(R.id.call_type);
-        mCallTypeIcon = (ImageView) mCallDetailItem.findViewById(R.id.call_type_icon);
-        mCallTime = (TextView) mCallDetailItem.findViewById(R.id.call_time);
-        mCallDurationRow = mCallDetailItem.findViewById(R.id.call_duration_row);
-        mCallDuration = (TextView) mCallDetailItem.findViewById(R.id.call_duration);
+        mCallType = (TextView) findViewById(R.id.type);
+        mCallTypeIcon = (ImageView) findViewById(R.id.icon);
+        mCallTime = (TextView) findViewById(R.id.time);
+        mCallDuration = (TextView) findViewById(R.id.duration);
         
         getListView().setOnItemClickListener(this);
     }
@@ -135,33 +133,6 @@
     }
     
     /**
-     * Try a reverse-phonebook lookup to find the contact, if any, behind the given number.
-     * 
-     * @param number Phone number to perform reverse-lookup against
-     * @return Uri into {@link Contacts.People} if found, otherwise null
-     */ 
-    private Uri getPersonUri(String number) {
-        Uri personUri = null;
-        
-        // Perform a reverse-phonebook lookup to find the PERSON_ID
-        ContentResolver resolver = getContentResolver();
-        Uri phoneUri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, Uri.encode(number));
-        Cursor phonesCursor = resolver.query(phoneUri, PHONES_PROJECTION, null, null, null);
-        try {
-            if (phonesCursor != null && phonesCursor.moveToFirst()) {
-                long personId = phonesCursor.getLong(PERSON_ID_COLUMN_INDEX);
-                personUri = ContentUris.withAppendedId(Contacts.People.CONTENT_URI, personId);
-            }
-        } finally {
-            if (phonesCursor != null) {
-                phonesCursor.close();
-            }
-        }
-        
-        return personUri;
-    }
-    
-    /**
      * Update user interface with details of given call.
      * 
      * @param callUri Uri into {@link CallLog.Calls}
@@ -180,71 +151,93 @@
                 // Pull out string in format [relative], [date]
                 CharSequence dateClause = DateUtils.formatDateRange(this, date, date,
                         DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE |
-                        DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_YEAR |
-                        DateUtils.FORMAT_ABBREV_ALL);
-                long now = System.currentTimeMillis();
-                CharSequence relativeClause = DateUtils.getRelativeTimeSpanString(date, now,
-                        DateUtils.SECOND_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE);
-                String dateString = getString(R.string.datetime_relative,
-                        dateClause, relativeClause);
-                mCallTime.setText(dateString);
+                        DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_YEAR);
+                mCallTime.setText(dateClause);
                 
                 // Set the duration
                 if (callType == Calls.MISSED_TYPE) {
-                    mCallDurationRow.setVisibility(View.GONE);
+                    mCallDuration.setVisibility(View.GONE);
                 } else {
-                    mCallDurationRow.setVisibility(View.VISIBLE);
-                    mCallDuration.setText(DateUtils.formatElapsedTime(duration));
+                    mCallDuration.setVisibility(View.VISIBLE);
+                    mCallDuration.setText(formatDuration(duration));
                 }
     
                 // Set the call type icon and caption
+                String callText = null;
                 switch (callType) {
                     case Calls.INCOMING_TYPE:
                         mCallTypeIcon.setImageResource(android.R.drawable.sym_call_incoming);
                         mCallType.setText(R.string.type_incoming);
+                        callText = getString(R.string.callBack);
                         break;
     
                     case Calls.OUTGOING_TYPE:
                         mCallTypeIcon.setImageResource(android.R.drawable.sym_call_outgoing);
                         mCallType.setText(R.string.type_outgoing);
+                        callText = getString(R.string.callAgain);
                         break;
     
                     case Calls.MISSED_TYPE:
                         mCallTypeIcon.setImageResource(android.R.drawable.sym_call_missed);
                         mCallType.setText(R.string.type_missed);
+                        callText = getString(R.string.returnCall);
                         break;
                 }
     
+                // Perform a reverse-phonebook lookup to find the PERSON_ID
+                String callLabel = null;
+                Uri personUri = null;
+                Uri phoneUri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, Uri.encode(mNumber));
+                Cursor phonesCursor = resolver.query(phoneUri, PHONES_PROJECTION, null, null, null);
+                try {
+                    if (phonesCursor != null && phonesCursor.moveToFirst()) {
+                        long personId = phonesCursor.getLong(COLUMN_INDEX_ID);
+                        personUri = ContentUris.withAppendedId(
+                                Contacts.People.CONTENT_URI, personId);
+                        callText = getString(R.string.recentCalls_callNumber,
+                                phonesCursor.getString(COLUMN_INDEX_NAME));
+                        mNumber = phonesCursor.getString(COLUMN_INDEX_NUMBER);
+                        callLabel = Phones.getDisplayLabel(this,
+                                phonesCursor.getInt(COLUMN_INDEX_TYPE),
+                                phonesCursor.getString(COLUMN_INDEX_LABEL)).toString();
+                    } else {
+                        mNumber = PhoneNumberUtils.formatNumber(mNumber);
+                    }
+                } finally {
+                    if (phonesCursor != null) phonesCursor.close();
+                }
+
                 // Build list of various available actions
-                List<ViewEntry> actions = new LinkedList<ViewEntry>();
+                List<ViewEntry> actions = new ArrayList<ViewEntry>();
                 
                 Intent callIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
                         Uri.fromParts("tel", mNumber, null));
-                actions.add(new ViewEntry(R.drawable.ic_dialer_fork_current_call,
-                        getString(R.string.recentCalls_callNumber, mNumber), callIntent));
-    
+                ViewEntry entry = new ViewEntry(android.R.drawable.sym_action_call, callText,
+                        callIntent);
+                entry.number = mNumber;
+                entry.label = callLabel;
+                actions.add(entry);
+                
                 Intent smsIntent = new Intent(Intent.ACTION_SENDTO,
                         Uri.fromParts("sms", mNumber, null));
                 actions.add(new ViewEntry(R.drawable.sym_action_sms,
                         getString(R.string.menu_sendTextMessage), smsIntent));
-    
+                
                 // Let user view contact details if they exist, otherwise add option
                 // to create new contact from this number.
-                Uri personUri = getPersonUri(mNumber);
-                
                 if (personUri != null) {
                     Intent viewIntent = new Intent(Intent.ACTION_VIEW, personUri);
-                    actions.add(new ViewEntry(R.drawable.ic_tab_unselected_contacts,
+                    actions.add(new ViewEntry(R.drawable.sym_action_view_contact,
                             getString(R.string.menu_viewContact), viewIntent));
                 } else {
                     Intent createIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
                     createIntent.setType(People.CONTENT_ITEM_TYPE);
                     createIntent.putExtra(Insert.PHONE, mNumber);
-                    actions.add(new ViewEntry(R.drawable.ic_dialer_fork_add_call,
+                    actions.add(new ViewEntry(R.drawable.sym_action_add,
                             getString(R.string.recentCalls_addToContact), createIntent));
                 }
                 
-                ViewAdapter adapter = new ViewAdapter(this, mCallDetailItem, actions);
+                ViewAdapter adapter = new ViewAdapter(this, actions);
                 setListAdapter(adapter);
             } else {
                 // Something went wrong reading in our primary data, so we're going to
@@ -260,10 +253,25 @@
         }
     }
 
+    private String formatDuration(long elapsedSeconds) {
+        long minutes = 0;
+        long seconds = 0;
+
+        if (elapsedSeconds >= 60) {
+            minutes = elapsedSeconds / 60;
+            elapsedSeconds -= minutes * 60;
+        }
+        seconds = elapsedSeconds;
+
+        return getString(R.string.callDetailsDurationFormat, minutes, seconds);
+    }
+
     static final class ViewEntry {
         public int icon = -1;
         public String text = null;
         public Intent intent = null;
+        public String label = null;
+        public String number = null;
         
         public ViewEntry(int icon, String text, Intent intent) {
             this.icon = icon;
@@ -274,120 +282,65 @@
 
     static final class ViewAdapter extends BaseAdapter {
         
-        private final View mCallDetailItem;
         private final List<ViewEntry> mActions;
         
-        private final Context mContext;
         private final LayoutInflater mInflater;
         
-        public ViewAdapter(Context context, View callDetailItem, List<ViewEntry> actions) {
-            mCallDetailItem = callDetailItem;
+        public ViewAdapter(Context context, List<ViewEntry> actions) {
             mActions = actions;
-            
-            mContext = context;
-            mInflater = (LayoutInflater) context
-                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
+            mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         }
         
         public int getCount() {
-            // Count is actions plus two headers and call details panel.
-            return mActions.size() + 2;
+            return mActions.size();
         }
 
         public Object getItem(int position) {
-            if (position >= POS_FIRST_ITEM) {
-                return mActions.get(position - POS_FIRST_ITEM);
-            }
-            return null;
+            return mActions.get(position);
         }
 
         public long getItemId(int position) {
             return position;
         }
         
-        private static final int TYPE_HEADER = 0;
-        private static final int TYPE_CALL_DETAILS = 1;
-        private static final int TYPE_ACTION = 2;
-        
-        private static final int POS_CALL_DETAILS = 0;
-        private static final int POS_ACTIONS_HEADER = 1;
-        private static final int POS_FIRST_ITEM = 2;
-
-        public int getViewTypeCount() {
-            // Types are headers, call details panel, and actions.
-            return 3;
-        }
-        
-        public int getItemViewType(int position) {
-            switch(position) {
-                case POS_CALL_DETAILS:
-                    return TYPE_CALL_DETAILS;
-                case POS_ACTIONS_HEADER:
-                    return TYPE_HEADER;
-                default:
-                    return TYPE_ACTION;
-            }
-        }
-        
-        public boolean areAllItemsEnabled() {
-            return false;
-        }
-        
-        public boolean isEnabled(int position) {
-            return (position > POS_ACTIONS_HEADER);
-        }
-
         public View getView(int position, View convertView, ViewGroup parent) {
             // Make sure we have a valid convertView to start with
             if (convertView == null) {
-                switch(getItemViewType(position)) {
-                    case TYPE_HEADER: {
-                        convertView = mInflater.inflate(R.layout.list_separator, parent, false);
-                        break;
-                    }
-                    case TYPE_CALL_DETAILS: {
-                        convertView = mCallDetailItem;
-                        break;
-                    }
-                    case TYPE_ACTION: {
-                        convertView = mInflater.inflate(R.layout.dialpad_chooser_list_item,
-                                parent, false);
-                        break;
-                    }
-                }
+                convertView = mInflater.inflate(R.layout.call_detail_list_item, parent, false);
             }
 
-            // Now fill our known-good convertView with data
-            switch(position) {
-                case POS_CALL_DETAILS: {
-                    // Assume mCallDetailItem is already filled with correct data.
-                    break;
+            // Fill action with icon and text.
+            ViewEntry entry = mActions.get(position);
+            convertView.setTag(entry);
+            
+            ImageView icon = (ImageView) convertView.findViewById(R.id.icon);
+            TextView text = (TextView) convertView.findViewById(android.R.id.text1);
+
+            icon.setImageResource(entry.icon);
+            text.setText(entry.text);
+
+            View line2 = convertView.findViewById(R.id.line2);
+            boolean numberEmpty = TextUtils.isEmpty(entry.number);
+            boolean labelEmpty = TextUtils.isEmpty(entry.label) || numberEmpty;
+            if (labelEmpty && numberEmpty) {
+                line2.setVisibility(View.GONE);
+            } else {
+                line2.setVisibility(View.VISIBLE);
+                
+                TextView label = (TextView) convertView.findViewById(R.id.label);
+                if (labelEmpty) {
+                    label.setVisibility(View.GONE);
+                } else {
+                    label.setText(entry.label);
+                    label.setVisibility(View.VISIBLE);
                 }
-                case POS_ACTIONS_HEADER: {
-                    TextView textView = (TextView) convertView;
-                    textView.setText(mContext.getResources().getString(
-                            R.string.header_actions));
-                    break;
-                }
-                default: {
-                    // Fill action with icon and text.
-                    ViewEntry entry = (ViewEntry) getItem(position);
-                    convertView.setTag(entry);
-                    
-                    ImageView icon = (ImageView) convertView.findViewById(R.id.icon);
-                    TextView text = (TextView) convertView.findViewById(R.id.text);
-                    
-                    icon.setImageResource(entry.icon);
-                    text.setText(entry.text);
-                    
-                    break;
-                }
+
+                TextView number = (TextView) convertView.findViewById(R.id.number);
+                number.setText(entry.number);
             }
             
             return convertView;
         }
-
     }
     
     public void onItemClick(AdapterView parent, View view, int position, long id) {
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index c239104..6fad5a9 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -417,13 +417,20 @@
         // Check to see if sync is enabled
         final ContentResolver resolver = getContentResolver();
         IContentProvider provider = resolver.acquireProvider(Contacts.CONTENT_URI);
+        if (provider == null) {
+            // No contacts provider, bail.
+            finish();
+            return;
+        }
+
         try {
             ISyncAdapter sa = provider.getSyncAdapter();
             mSyncEnabled = sa != null;
         } catch (RemoteException e) {
             mSyncEnabled = false;
+        } finally {
+            resolver.releaseProvider(provider);
         }
-        resolver.releaseProvider(provider);
     }
 
     private void setEmptyText() {
diff --git a/src/com/android/contacts/RecentCallsListActivity.java b/src/com/android/contacts/RecentCallsListActivity.java
index 8298d21..8d6360b 100644
--- a/src/com/android/contacts/RecentCallsListActivity.java
+++ b/src/com/android/contacts/RecentCallsListActivity.java
@@ -37,6 +37,7 @@
 import android.provider.Contacts.People;
 import android.provider.Contacts.Phones;
 import android.provider.Contacts.Intents.Insert;
+import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
@@ -414,6 +415,9 @@
                     number = getString(R.string.private_num);
                 } else if (number.equals(mVoiceMailNumber)) {
                     number = getString(R.string.voicemail);
+                } else {
+                    // Just a raw number, format it to look pretty
+                    number = PhoneNumberUtils.formatNumber(number);
                 }
 
                 views.line1View.setText(number);
