diff --git a/src/com/android/contacts/ContactsGroupSyncSelector.java b/src/com/android/contacts/ContactsGroupSyncSelector.java
index 6081c79..80b5166 100644
--- a/src/com/android/contacts/ContactsGroupSyncSelector.java
+++ b/src/com/android/contacts/ContactsGroupSyncSelector.java
@@ -112,6 +112,12 @@
             }
             
             case R.id.ok: {
+                // The list isn't setup yet, so just return without doing anything.
+                if (mChecked == null) {
+                    finish();
+                    return;
+                }
+
                 final ContentResolver resolver = getContentResolver();
                 if (mSyncAllGroups) {
                     // For now we only support a single account and the UI doesn't know what
diff --git a/src/com/android/contacts/DialtactsActivity.java b/src/com/android/contacts/DialtactsActivity.java
index 1933c4c..d3f8981 100644
--- a/src/com/android/contacts/DialtactsActivity.java
+++ b/src/com/android/contacts/DialtactsActivity.java
@@ -176,6 +176,14 @@
             finish();
             return;
         }
+        
+        // Dismiss menu provided by any children activites
+        Activity activity = getLocalActivityManager().
+                getActivity(mTabHost.getCurrentTabTag());
+        if (activity != null) {
+            activity.closeOptionsMenu();
+        }
+
         intent.putExtra(EXTRA_IGNORE_STATE, true);
         if (intent.getComponent().getClassName().equals(getClass().getName())) {
             if (recentCallsRequest) {
diff --git a/src/com/android/contacts/EditContactActivity.java b/src/com/android/contacts/EditContactActivity.java
index fb8dd70..d34713d 100644
--- a/src/com/android/contacts/EditContactActivity.java
+++ b/src/com/android/contacts/EditContactActivity.java
@@ -170,7 +170,6 @@
     
     private EditText mNameView;
     private ImageView mPhotoImageView;
-    private View mPhotoButton;
     private CheckBox mSendToVoicemailCheckBox;
     private LinearLayout mLayout;
     private LayoutInflater mInflater;
@@ -198,7 +197,6 @@
 
     public void onClick(View v) {
         switch (v.getId()) {
-            case R.id.photoButton:
             case R.id.photoImage: {
                 doPickPhotoAction();
                 break;
@@ -252,9 +250,17 @@
     }
 
     private void setPhotoPresent(boolean present) {
-        mPhotoImageView.setVisibility(present ? View.VISIBLE : View.GONE);
-        mPhotoButton.setVisibility(present ? View.GONE : View.VISIBLE);
         mPhotoPresent = present;
+        
+        // Correctly scale the contact photo if present, otherwise just center
+        // the photo placeholder icon.
+        if (mPhotoPresent) {
+            mPhotoImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
+        } else {
+            mPhotoImageView.setImageResource(R.drawable.ic_menu_add_picture);
+            mPhotoImageView.setScaleType(ImageView.ScaleType.CENTER);
+        }
+        
         if (mPhotoMenuItem != null) {
             if (present) {
                 mPhotoMenuItem.setTitle(R.string.removePicture);
@@ -312,9 +318,6 @@
         mNameView = (EditText) findViewById(R.id.name);
         mPhotoImageView = (ImageView) findViewById(R.id.photoImage);
         mPhotoImageView.setOnClickListener(this);
-        mPhotoImageView.setVisibility(View.GONE);
-        mPhotoButton = findViewById(R.id.photoButton);
-        mPhotoButton.setOnClickListener(this);
         mSendToVoicemailCheckBox = (CheckBox) findViewById(R.id.send_to_voicemail);
         mPhoneticNameView = (EditText) findViewById(R.id.phonetic_name);
 
@@ -340,6 +343,7 @@
                     buildEntriesForEdit(getIntent().getExtras());
                     buildViews();
                 }
+                setTitle(R.string.editContact_title_edit);
                 mState = STATE_EDIT;
             } else if (action.equals(Intent.ACTION_INSERT)) {
                 if (icicle == null) {
@@ -347,6 +351,7 @@
                     buildEntriesForInsert(getIntent().getExtras());
                     buildViews();
                 }
+                setTitle(R.string.editContact_title_insert);
                 mState = STATE_INSERT;
                 mInsert = true;
             }
@@ -459,7 +464,7 @@
         }
         return super.onKeyDown(keyCode, event);
     }
-
+    
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
@@ -549,7 +554,6 @@
     private void doRemovePhotoAction() {
         mPhoto = null;
         mPhotoChanged = true;
-        mPhotoImageView.setImageResource(R.drawable.ic_contact_picture);
         setPhotoPresent(false);
     }
     
@@ -593,8 +597,9 @@
     }
 
     private void updateRingtoneView(EditEntry entry) {
+        String ringtoneName;
         if (entry.data == null) {
-            updateDataView(entry, getString(R.string.default_ringtone));
+            ringtoneName = getString(R.string.default_ringtone);
         } else {
             Uri ringtoneUri = Uri.parse(entry.data);
             Ringtone ringtone = RingtoneManager.getRingtone(this, ringtoneUri);
@@ -602,8 +607,12 @@
                 Log.w(TAG, "ringtone's URI doesn't resolve to a Ringtone");
                 return;
             }
-            updateDataView(entry, ringtone.getTitle(this));
+            ringtoneName = ringtone.getTitle(this);
         }
+        
+        // Build actual "Ringtone: Default" string that is assigned to spinner.
+        String text = getString(R.string.ringtone_spinner, ringtoneName);
+        updateDataView(entry, text);
     }
     
     private void updateDataView(EditEntry entry, String text) {
@@ -1456,11 +1465,11 @@
         final LinearLayout layout = mLayout;
         layout.removeAllViews();
 
-        buildViewsForSection(layout, mPhoneEntries, R.string.listSeparatorCallNumber);
-        buildViewsForSection(layout, mEmailEntries, R.string.listSeparatorSendEmail);
-        buildViewsForSection(layout, mImEntries, R.string.listSeparatorSendIm);
-        buildViewsForSection(layout, mPostalEntries, R.string.listSeparatorMapAddress);
-        buildViewsForSection(layout, mOtherEntries, R.string.listSeparatorOtherInformation);
+        buildViewsForSection(layout, mPhoneEntries, R.string.listSeparatorCallNumber_edit);
+        buildViewsForSection(layout, mEmailEntries, R.string.listSeparatorSendEmail_edit);
+        buildViewsForSection(layout, mImEntries, R.string.listSeparatorSendIm_edit);
+        buildViewsForSection(layout, mPostalEntries, R.string.listSeparatorMapAddress_edit);
+        buildViewsForSection(layout, mOtherEntries, R.string.listSeparatorOtherInformation_edit);
     }
 
 
@@ -1530,7 +1539,7 @@
         // Bind data
         TextView data = (TextView) view.findViewById(R.id.data);
         TextView data2 = (TextView) view.findViewById(R.id.data2);
-
+        
         if (data instanceof Button) {
             data.setOnClickListener(this);
         }
diff --git a/src/com/android/contacts/ViewContactActivity.java b/src/com/android/contacts/ViewContactActivity.java
index 4690b12..3a177b2 100644
--- a/src/com/android/contacts/ViewContactActivity.java
+++ b/src/com/android/contacts/ViewContactActivity.java
@@ -576,7 +576,16 @@
         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
+        StringBuilder buf = new StringBuilder("imto://");
+        buf.append(host);
+        buf.append('/');
+        buf.append(data);
+        return Uri.parse(buf.toString());
+    }
+
     /**
      * Build up the entries to display on the screen.
      * 
@@ -701,12 +710,11 @@
                     case Contacts.KIND_IM: {
                         Object protocolObj = ContactMethods.decodeImProtocol(
                                 methodsCursor.getString(METHODS_AUX_DATA_COLUMN));
-                        String providerCategory;
+                        String host;
                         if (protocolObj instanceof Number) {
                             int protocol = ((Number) protocolObj).intValue();
                             entry.label = protocolStrings[protocol];
-                            providerCategory = ContactMethods.lookupProviderCategoryFromId(
-                                    protocol);
+                            host = ContactMethods.lookupProviderNameFromId(protocol).toLowerCase();
                             if (protocol == ContactMethods.PROTOCOL_GOOGLE_TALK
                                     || protocol == ContactMethods.PROTOCOL_MSN) {
                                 entry.maxLabelLines = 2;
@@ -714,14 +722,12 @@
                         } else {
                             String providerName = (String) protocolObj;
                             entry.label = providerName;
-                            providerCategory = Im.Provider.getProviderCategoryFromName(
-                                    providerName);
+                            host = providerName.toLowerCase();
                         }
 
-                        // Only add the intent if there is a valid provider name
-                        if (!TextUtils.isEmpty(providerCategory)) {
-                            entry.intent = new Intent(Intent.ACTION_SENDTO,
-                                    Uri.fromParts("im", data, null)).addCategory(providerCategory);
+                        // Only add the intent if there is a valid host
+                        if (!TextUtils.isEmpty(host)) {
+                            entry.intent = new Intent(Intent.ACTION_SENDTO, constructImToUrl(host, data));
                         }
                         entry.data = data;
                         if (!methodsCursor.isNull(METHODS_STATUS_COLUMN)) {
@@ -755,26 +761,25 @@
                     String label;
                     Object protocolObj = ContactMethods.decodeImProtocol(
                             presenceCursor.getString(1));
-                    String providerCategory;
+                    String host;
                     if (protocolObj instanceof Number) {
                         int protocol = ((Number) protocolObj).intValue();
                         label = getResources().getStringArray(
                                 android.R.array.imProtocols)[protocol];
-                        providerCategory = ContactMethods.lookupProviderCategoryFromId(
-                                protocol);
+                        host = ContactMethods.lookupProviderNameFromId(protocol).toLowerCase();
                     } else {
                         String providerName = (String) protocolObj;
                         label = providerName;
-                        providerCategory = Im.Provider.getProviderCategoryFromName(providerName);
+                        host = providerName.toLowerCase();
                     }
 
-                    if (TextUtils.isEmpty(providerCategory)) {
+                    if (TextUtils.isEmpty(host)) {
                         // A valid provider name is required
                         continue;
                     }
 
-                    Intent intent = new Intent(Intent.ACTION_SENDTO,
-                            Uri.fromParts("im", data, null)).addCategory(providerCategory);
+
+                    Intent intent = new Intent(Intent.ACTION_SENDTO, constructImToUrl(host, data));
 
                     // Check to see if there is already an entry for this IM account
                     boolean addEntry = true;
