diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7c53cc3..be78912 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -716,4 +716,71 @@
 
     <string name="dialog_primary_name">Primary name</string>
 
+
+
+
+<string name="call_home">Call home</string>
+<string name="call_mobile">Call mobile</string>
+<string name="call_work">Call work</string>
+<string name="call_fax_work">Call work fax</string>
+<string name="call_fax_home">Call home fax</string>
+<string name="call_pager">Call pager</string>
+<string name="call_other">Call other</string>
+<string name="call_custom">Call <xliff:g id="custom">%s</xliff:g></string>
+
+<!-- exchange specific -->
+<string name="call_home_2">Call home 2</string>
+<string name="call_work_2">Call work 2</string>
+<string name="call_car">Call car</string>
+<string name="call_company_main">Call company main</string>
+<string name="call_mms">Call MMS</string>
+<string name="call_radio">Call radio</string>
+
+
+
+
+
+<string name="sms_home">Text home</string>
+<string name="sms_mobile">Text mobile</string>
+<string name="sms_work">Text work</string>
+<string name="sms_fax_work">Text work fax</string>
+<string name="sms_fax_home">Text home fax</string>
+<string name="sms_pager">Text pager</string>
+<string name="sms_other">Text other</string>
+<string name="sms_custom">Text <xliff:g id="custom">%s</xliff:g></string>
+
+<!-- exchange specific -->
+<string name="sms_home_2">Text home 2</string>
+<string name="sms_work_2">Text work 2</string>
+<string name="sms_car">Text car</string>
+<string name="sms_company_main">Text company main</string>
+<string name="sms_mms">Text MMS</string>
+<string name="sms_radio">Text radio</string>
+
+
+
+<string name="email_home">Email home</string>
+<string name="email_mobile">Email mobile</string>
+<string name="email_work">Email work</string>
+<string name="email_other">Email other</string>
+<string name="email_custom">Email <xliff:g id="custom">%s</xliff:g></string>
+
+<string name="email_1">Email 1</string>
+<string name="email_2">Email 2</string>
+<string name="email_3">Email 2</string>
+
+
+
+
+<string name="map_home">Map home</string>
+<string name="map_work">Map work</string>
+<string name="map_other">Map other</string>
+<string name="map_custom">Map <xliff:g id="custom">%s</xliff:g></string>
+
+
+
+
+
+
+
 </resources>
diff --git a/src/com/android/contacts/model/ContactsSource.java b/src/com/android/contacts/model/ContactsSource.java
index 078b46c..e0e0c7c 100644
--- a/src/com/android/contacts/model/ContactsSource.java
+++ b/src/com/android/contacts/model/ContactsSource.java
@@ -138,11 +138,13 @@
         public String mimeType;
         public int titleRes;
         public int iconRes;
+        public int iconAltRes;
         public int weight;
         public boolean secondary;
         public boolean editable;
 
         public StringInflater actionHeader;
+        public StringInflater actionAltHeader;
         public StringInflater actionBody;
         public boolean actionBodySocial;
         public boolean actionBodyCombine;
@@ -175,6 +177,7 @@
         public int rawValue;
         public int labelRes;
         public int actionRes;
+        public int actionAltRes;
         public boolean secondary;
         public int specificMax;
         public String customColumn;
@@ -182,23 +185,32 @@
         public EditType(int rawValue, int labelRes) {
             this.rawValue = rawValue;
             this.labelRes = labelRes;
-            this.actionRes = actionRes;
             this.specificMax = -1;
         }
 
-        public EditType(int rawValue, int labelRes, boolean secondary) {
+        public EditType(int rawValue, int labelRes, int actionRes) {
             this(rawValue, labelRes);
+            this.actionRes = actionRes;
+        }
+
+        public EditType(int rawValue, int labelRes, int actionRes, int actionAltRes) {
+            this(rawValue, labelRes, actionRes);
+            this.actionAltRes = actionAltRes;
+        }
+
+        public EditType setSecondary(boolean secondary) {
             this.secondary = secondary;
+            return this;
         }
 
-        public EditType(int rawValue, int labelRes, boolean secondary, int specificMax) {
-            this(rawValue, labelRes, secondary);
+        public EditType setSpecificMax(int specificMax) {
             this.specificMax = specificMax;
+            return this;
         }
 
-        public EditType(int rawValue, int labelRes, boolean secondary, int specificMax, String customColumn) {
-            this(rawValue, labelRes, secondary, specificMax);
+        public EditType setCustomColumn(String customColumn) {
             this.customColumn = customColumn;
+            return this;
         }
 
         @Override
diff --git a/src/com/android/contacts/model/Sources.java b/src/com/android/contacts/model/Sources.java
index ee13b82..f9618b2 100644
--- a/src/com/android/contacts/model/Sources.java
+++ b/src/com/android/contacts/model/Sources.java
@@ -123,20 +123,30 @@
             // GOOGLE: PHONE
             DataKind kind = new DataKind(Phone.CONTENT_ITEM_TYPE,
                     R.string.phoneLabelsGroup, android.R.drawable.sym_action_call, 10, true);
+            kind.iconAltRes = R.drawable.sym_action_sms;
 
-            kind.actionHeader = new ActionLabelInflater(list.resPackageName, kind);
+            kind.actionHeader = new ActionInflater(list.resPackageName, kind);
+            kind.actionAltHeader = new ActionAltInflater(list.resPackageName, kind);
             kind.actionBody = new SimpleInflater(Phone.NUMBER);
 
             kind.typeColumn = Phone.TYPE;
             kind.typeList = new ArrayList<EditType>();
-            kind.typeList.add(new EditType(Phone.TYPE_HOME, R.string.type_home));
-            kind.typeList.add(new EditType(Phone.TYPE_MOBILE, R.string.type_mobile));
-            kind.typeList.add(new EditType(Phone.TYPE_WORK, R.string.type_work));
-            kind.typeList.add(new EditType(Phone.TYPE_FAX_WORK, R.string.type_fax_work, true));
-            kind.typeList.add(new EditType(Phone.TYPE_FAX_HOME, R.string.type_fax_home, true));
-            kind.typeList.add(new EditType(Phone.TYPE_PAGER, R.string.type_pager, true));
-            kind.typeList.add(new EditType(Phone.TYPE_OTHER, R.string.type_other));
-            kind.typeList.add(new EditType(Phone.TYPE_CUSTOM, R.string.type_custom, true, -1,
+            kind.typeList.add(new EditType(Phone.TYPE_HOME, R.string.type_home, R.string.call_home,
+                    R.string.sms_home));
+            kind.typeList.add(new EditType(Phone.TYPE_MOBILE, R.string.type_mobile,
+                    R.string.call_mobile, R.string.sms_mobile));
+            kind.typeList.add(new EditType(Phone.TYPE_WORK, R.string.type_work, R.string.call_work,
+                    R.string.sms_work));
+            kind.typeList.add(new EditType(Phone.TYPE_FAX_WORK, R.string.type_fax_work,
+                    R.string.call_fax_work, R.string.sms_fax_work).setSecondary(true));
+            kind.typeList.add(new EditType(Phone.TYPE_FAX_HOME, R.string.type_fax_home,
+                    R.string.call_fax_home, R.string.sms_fax_home).setSecondary(true));
+            kind.typeList.add(new EditType(Phone.TYPE_PAGER, R.string.type_pager,
+                    R.string.call_pager, R.string.sms_pager).setSecondary(true));
+            kind.typeList.add(new EditType(Phone.TYPE_OTHER, R.string.type_other,
+                    R.string.call_other, R.string.sms_other));
+            kind.typeList.add(new EditType(Phone.TYPE_CUSTOM, R.string.type_custom,
+                    R.string.call_custom, R.string.sms_custom).setSecondary(true).setCustomColumn(
                     Phone.LABEL));
 
             kind.fieldList = new ArrayList<EditField>();
@@ -150,16 +160,19 @@
             DataKind kind = new DataKind(Email.CONTENT_ITEM_TYPE,
                     R.string.emailLabelsGroup, android.R.drawable.sym_action_email, 15, true);
 
-            kind.actionHeader = new ActionLabelInflater(list.resPackageName, kind);
+            kind.actionHeader = new ActionInflater(list.resPackageName, kind);
             kind.actionBody = new SimpleInflater(Email.DATA);
 
             kind.typeColumn = Email.TYPE;
             kind.typeList = new ArrayList<EditType>();
-            kind.typeList.add(new EditType(Email.TYPE_HOME, R.string.type_home));
-            kind.typeList.add(new EditType(Email.TYPE_WORK, R.string.type_work));
-            kind.typeList.add(new EditType(Email.TYPE_OTHER, R.string.type_other));
-            kind.typeList.add(new EditType(Email.TYPE_CUSTOM, R.string.type_custom, true, -1,
-                    Email.LABEL));
+            kind.typeList
+                    .add(new EditType(Email.TYPE_HOME, R.string.type_home, R.string.email_home));
+            kind.typeList
+                    .add(new EditType(Email.TYPE_WORK, R.string.type_work, R.string.email_work));
+            kind.typeList.add(new EditType(Email.TYPE_OTHER, R.string.type_other,
+                    R.string.email_other));
+            kind.typeList.add(new EditType(Email.TYPE_CUSTOM, R.string.type_custom,
+                    R.string.email_home).setSecondary(true).setCustomColumn(Email.LABEL));
 
             kind.fieldList = new ArrayList<EditField>();
             kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
@@ -172,7 +185,7 @@
             DataKind kind = new DataKind(Im.CONTENT_ITEM_TYPE, R.string.imLabelsGroup,
                     android.R.drawable.sym_action_chat, 20, true);
 
-            kind.actionHeader = new ActionLabelInflater(list.resPackageName, kind);
+            kind.actionHeader = new ActionInflater(list.resPackageName, kind);
             kind.actionBody = new SimpleInflater(Im.DATA);
 
             // NOTE: even though a traditional "type" exists, for editing
@@ -191,8 +204,8 @@
             kind.typeList.add(new EditType(Im.PROTOCOL_GOOGLE_TALK, R.string.type_im_google_talk));
             kind.typeList.add(new EditType(Im.PROTOCOL_ICQ, R.string.type_im_icq));
             kind.typeList.add(new EditType(Im.PROTOCOL_JABBER, R.string.type_im_jabber));
-            kind.typeList.add(new EditType(Im.PROTOCOL_CUSTOM, R.string.type_custom, true, -1,
-                    Im.CUSTOM_PROTOCOL));
+            kind.typeList.add(new EditType(Im.PROTOCOL_CUSTOM, R.string.type_custom).setSecondary(
+                    true).setCustomColumn(Im.CUSTOM_PROTOCOL));
 
             kind.fieldList = new ArrayList<EditField>();
             kind.fieldList.add(new EditField(Im.DATA, R.string.imLabelsGroup, FLAGS_EMAIL));
@@ -205,17 +218,22 @@
             DataKind kind = new DataKind(StructuredPostal.CONTENT_ITEM_TYPE,
                     R.string.postalLabelsGroup, R.drawable.sym_action_map, 25, true);
 
-            kind.actionHeader = new ActionLabelInflater(list.resPackageName, kind);
+            kind.actionHeader = new ActionInflater(list.resPackageName, kind);
             // TODO: build body from various structured fields
             kind.actionBody = new SimpleInflater(StructuredPostal.FORMATTED_ADDRESS);
 
             kind.typeColumn = StructuredPostal.TYPE;
             kind.typeList = new ArrayList<EditType>();
-            kind.typeList.add(new EditType(StructuredPostal.TYPE_HOME, R.string.type_home));
-            kind.typeList.add(new EditType(StructuredPostal.TYPE_WORK, R.string.type_work));
-            kind.typeList.add(new EditType(StructuredPostal.TYPE_OTHER, R.string.type_other));
-            kind.typeList.add(new EditType(StructuredPostal.TYPE_CUSTOM, R.string.type_custom,
-                    true, -1, StructuredPostal.LABEL));
+            kind.typeList.add(new EditType(StructuredPostal.TYPE_HOME, R.string.type_home,
+                    R.string.map_home));
+            kind.typeList.add(new EditType(StructuredPostal.TYPE_WORK, R.string.type_work,
+                    R.string.map_work));
+            kind.typeList.add(new EditType(StructuredPostal.TYPE_OTHER, R.string.type_other,
+                    R.string.map_other));
+            kind.typeList
+                    .add(new EditType(StructuredPostal.TYPE_CUSTOM, R.string.type_custom,
+                            R.string.map_custom).setSecondary(true).setCustomColumn(
+                            StructuredPostal.LABEL));
 
             kind.fieldList = new ArrayList<EditField>();
             kind.fieldList.add(new EditField(StructuredPostal.AGENT, -1, FLAGS_POSTAL, true));
@@ -245,8 +263,8 @@
             kind.typeList = new ArrayList<EditType>();
             kind.typeList.add(new EditType(Organization.TYPE_WORK, R.string.type_work));
             kind.typeList.add(new EditType(Organization.TYPE_OTHER, R.string.type_other));
-            kind.typeList.add(new EditType(Organization.TYPE_CUSTOM, R.string.type_custom, true,
-                    -1, Organization.LABEL));
+            kind.typeList.add(new EditType(Organization.TYPE_CUSTOM, R.string.type_custom)
+                    .setSecondary(true).setCustomColumn(Organization.LABEL));
 
             kind.fieldList = new ArrayList<EditField>();
             kind.fieldList.add(new EditField(Organization.COMPANY, R.string.ghostData_company,
@@ -340,26 +358,44 @@
             // EXCHANGE: PHONE
             DataKind kind = new DataKind(Phone.CONTENT_ITEM_TYPE,
                     R.string.phoneLabelsGroup, android.R.drawable.sym_action_call, 10, true);
+            kind.iconAltRes = R.drawable.sym_action_sms;
 
-            kind.actionHeader = new ActionLabelInflater(list.resPackageName, kind);
+            kind.actionHeader = new ActionInflater(list.resPackageName, kind);
+            kind.actionAltHeader = new ActionAltInflater(list.resPackageName, kind);
             kind.actionBody = new SimpleInflater(Phone.NUMBER);
 
             kind.typeColumn = Phone.TYPE;
             kind.typeList = new ArrayList<EditType>();
-            kind.typeList.add(new EditType(Phone.TYPE_HOME, R.string.type_home, false, 1));
-            kind.typeList.add(new EditType(TYPE_HOME2, R.string.type_home_2, true, 1));
-            kind.typeList.add(new EditType(Phone.TYPE_MOBILE, R.string.type_mobile, false, 1));
-            kind.typeList.add(new EditType(Phone.TYPE_WORK, R.string.type_work, false, 1));
-            kind.typeList.add(new EditType(TYPE_WORK2, R.string.type_work_2, true, 1));
-            kind.typeList.add(new EditType(Phone.TYPE_FAX_WORK, R.string.type_fax_work, true, 1));
-            kind.typeList.add(new EditType(Phone.TYPE_FAX_HOME, R.string.type_fax_home, true, 1));
-            kind.typeList.add(new EditType(Phone.TYPE_PAGER, R.string.type_pager, true, 1));
-            kind.typeList.add(new EditType(TYPE_CAR, R.string.type_car, true, 1));
-            kind.typeList.add(new EditType(TYPE_COMPANY_MAIN, R.string.type_company_main, true, 1));
-            kind.typeList.add(new EditType(TYPE_MMS, R.string.type_mms, true, 1));
-            kind.typeList.add(new EditType(TYPE_RADIO, R.string.type_radio, true, 1));
-            kind.typeList.add(new EditType(Phone.TYPE_CUSTOM, R.string.type_assistant, true, 1,
-                    Phone.LABEL));
+            kind.typeList.add(new EditType(Phone.TYPE_HOME, R.string.type_home, R.string.call_home,
+                    R.string.sms_home).setSpecificMax(1));
+            kind.typeList.add(new EditType(TYPE_HOME2, R.string.type_home_2, R.string.call_home_2,
+                    R.string.sms_home_2).setSecondary(true).setSpecificMax(1));
+            kind.typeList.add(new EditType(Phone.TYPE_MOBILE, R.string.type_mobile,
+                    R.string.call_mobile, R.string.sms_mobile).setSpecificMax(1));
+            kind.typeList.add(new EditType(Phone.TYPE_WORK, R.string.type_work, R.string.call_work,
+                    R.string.sms_work).setSpecificMax(1));
+            kind.typeList.add(new EditType(TYPE_WORK2, R.string.type_work_2, R.string.call_work_2,
+                    R.string.sms_work_2).setSecondary(true).setSpecificMax(1));
+            kind.typeList.add(new EditType(Phone.TYPE_FAX_WORK, R.string.type_fax_work,
+                    R.string.call_fax_work, R.string.sms_fax_work).setSecondary(true)
+                    .setSpecificMax(1));
+            kind.typeList.add(new EditType(Phone.TYPE_FAX_HOME, R.string.type_fax_home,
+                    R.string.call_fax_home, R.string.sms_fax_home).setSecondary(true)
+                    .setSpecificMax(1));
+            kind.typeList.add(new EditType(Phone.TYPE_PAGER, R.string.type_pager,
+                    R.string.call_pager, R.string.sms_pager).setSecondary(true).setSpecificMax(1));
+            kind.typeList.add(new EditType(TYPE_CAR, R.string.type_car, R.string.call_car,
+                    R.string.sms_car).setSecondary(true).setSpecificMax(1));
+            kind.typeList.add(new EditType(TYPE_COMPANY_MAIN, R.string.type_company_main,
+                    R.string.call_company_main, R.string.sms_company_main).setSecondary(true)
+                    .setSpecificMax(1));
+            kind.typeList.add(new EditType(TYPE_MMS, R.string.type_mms, R.string.call_mms,
+                    R.string.sms_mms).setSecondary(true).setSpecificMax(1));
+            kind.typeList.add(new EditType(TYPE_RADIO, R.string.type_radio, R.string.call_radio,
+                    R.string.sms_radio).setSecondary(true).setSpecificMax(1));
+            kind.typeList.add(new EditType(Phone.TYPE_CUSTOM, R.string.type_assistant,
+                    R.string.call_custom, R.string.sms_custom).setSecondary(true).setSpecificMax(1)
+                    .setCustomColumn(Phone.LABEL));
 
             kind.fieldList = new ArrayList<EditField>();
             kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE));
@@ -372,14 +408,17 @@
             DataKind kind = new DataKind(Email.CONTENT_ITEM_TYPE,
                     R.string.emailLabelsGroup, android.R.drawable.sym_action_email, 15, true);
 
-            kind.actionHeader = new ActionLabelInflater(list.resPackageName, kind);
+            kind.actionHeader = new ActionInflater(list.resPackageName, kind);
             kind.actionBody = new SimpleInflater(Email.DATA);
 
             kind.typeColumn = Email.TYPE;
             kind.typeList = new ArrayList<EditType>();
-            kind.typeList.add(new EditType(TYPE_EMAIL1, R.string.type_email_1, false, 1));
-            kind.typeList.add(new EditType(TYPE_EMAIL2, R.string.type_email_2, false, 1));
-            kind.typeList.add(new EditType(TYPE_EMAIL3, R.string.type_email_3, false, 1));
+            kind.typeList.add(new EditType(TYPE_EMAIL1, R.string.type_email_1, R.string.email_1)
+                    .setSpecificMax(1));
+            kind.typeList.add(new EditType(TYPE_EMAIL2, R.string.type_email_2, R.string.email_2)
+                    .setSpecificMax(1));
+            kind.typeList.add(new EditType(TYPE_EMAIL3, R.string.type_email_3, R.string.email_3)
+                    .setSpecificMax(1));
 
             kind.fieldList = new ArrayList<EditField>();
             kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
@@ -392,14 +431,14 @@
             DataKind kind = new DataKind(Im.CONTENT_ITEM_TYPE, R.string.imLabelsGroup,
                     android.R.drawable.sym_action_chat, 20, true);
 
-            kind.actionHeader = new ActionLabelInflater(list.resPackageName, kind);
+            kind.actionHeader = new ActionInflater(list.resPackageName, kind);
             kind.actionBody = new SimpleInflater(Im.DATA);
 
             kind.typeColumn = Im.TYPE;
             kind.typeList = new ArrayList<EditType>();
-            kind.typeList.add(new EditType(TYPE_IM1, R.string.type_im_1, false, 1));
-            kind.typeList.add(new EditType(TYPE_IM2, R.string.type_im_2, false, 1));
-            kind.typeList.add(new EditType(TYPE_IM3, R.string.type_im_3, false, 1));
+            kind.typeList.add(new EditType(TYPE_IM1, R.string.type_im_1).setSpecificMax(1));
+            kind.typeList.add(new EditType(TYPE_IM2, R.string.type_im_2).setSpecificMax(1));
+            kind.typeList.add(new EditType(TYPE_IM3, R.string.type_im_3).setSpecificMax(1));
 
             kind.fieldList = new ArrayList<EditField>();
             kind.fieldList.add(new EditField(Im.DATA, R.string.imLabelsGroup, FLAGS_EMAIL));
@@ -492,11 +531,11 @@
      * provide an action string like "Call home", where "home" is provided from
      * {@link EditType#labelRes}.
      */
-    public static class ActionLabelInflater implements StringInflater {
+    public static class ActionInflater implements StringInflater {
         private String mPackageName;
         private DataKind mKind;
 
-        public ActionLabelInflater(String packageName, DataKind labelProvider) {
+        public ActionInflater(String packageName, DataKind labelProvider) {
             mPackageName = packageName;
             mKind = labelProvider;
         }
@@ -508,4 +547,21 @@
                     null) : null;
         }
     }
+
+    public static class ActionAltInflater implements StringInflater {
+        private String mPackageName;
+        private DataKind mKind;
+
+        public ActionAltInflater(String packageName, DataKind labelProvider) {
+            mPackageName = packageName;
+            mKind = labelProvider;
+        }
+
+        public CharSequence inflateUsing(Context context, Cursor cursor) {
+            final EditType type = EntityModifier.getCurrentType(cursor, mKind);
+            final boolean validString = (type != null && type.actionAltRes > 0);
+            return validString ? context.getPackageManager().getText(mPackageName,
+                    type.actionAltRes, null) : null;
+        }
+    }
 }
diff --git a/src/com/android/contacts/ui/FastTrackWindow.java b/src/com/android/contacts/ui/FastTrackWindow.java
index 9862147..4a2acbc 100644
--- a/src/com/android/contacts/ui/FastTrackWindow.java
+++ b/src/com/android/contacts/ui/FastTrackWindow.java
@@ -28,12 +28,9 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
 import android.database.Cursor;
-import android.database.CursorWrapper;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.graphics.Color;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
@@ -48,13 +45,8 @@
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.Im.PresenceColumns;
 import android.provider.SocialContract.Activities;
-import android.text.SpannableStringBuilder;
 import android.text.format.DateUtils;
-import android.text.style.CharacterStyle;
-import android.text.style.ForegroundColorSpan;
-import android.text.style.StyleSpan;
 import android.util.Log;
 import android.view.ContextThemeWrapper;
 import android.view.Gravity;
@@ -78,7 +70,6 @@
 import android.widget.BaseAdapter;
 import android.widget.HorizontalScrollView;
 import android.widget.ImageView;
-import android.widget.LinearLayout;
 import android.widget.ListView;
 import android.widget.TextView;
 import android.widget.Toast;
@@ -86,7 +77,6 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.Set;
 
 /**
@@ -465,7 +455,7 @@
 
         final String name = getAsString(cursor, Contacts.DISPLAY_NAME);
         final int status = getAsInteger(cursor, Contacts.PRESENCE_STATUS);
-        final int statusIcon = Presence.getPresenceIconResourceId(status);
+        final Drawable statusIcon = getPresenceIcon(status);
 
         setHeaderText(R.id.name, name);
         setHeaderImage(R.id.presence, statusIcon);
@@ -487,6 +477,30 @@
     }
 
     /**
+     * Find the presence icon for showing in summary header.
+     */
+    private Drawable getPresenceIcon(int status) {
+        int resId = -1;
+        switch (status) {
+            case Presence.AVAILABLE:
+                resId = android.R.drawable.presence_online;
+                break;
+            case Presence.IDLE:
+            case Presence.AWAY:
+                resId = android.R.drawable.presence_away;
+                break;
+            case Presence.DO_NOT_DISTURB:
+                resId = android.R.drawable.presence_busy;
+                break;
+        }
+        if (resId > 0) {
+            return mContext.getResources().getDrawable(resId);
+        } else {
+            return null;
+        }
+    }
+
+    /**
      * Find the Fast-Track-specific presence icon for showing in chiclets.
      */
     private Drawable getTrackPresenceIcon(int status) {
@@ -558,29 +572,39 @@
         private CharSequence mBody;
         private Intent mIntent;
 
+        private boolean mAlternate;
+
         /**
          * Create an action from common {@link Data} elements.
          */
-        public DataAction(Context context, ContactsSource source, DataKind kind, Cursor cursor) {
+        public DataAction(Context context, ContactsSource source, String mimeType, DataKind kind, Cursor cursor) {
             mContext = context;
             mSource = source;
             mKind = kind;
 
             // Inflate strings from cursor
-            if (mKind.actionHeader != null) {
+            mAlternate = MIME_SMS_ADDRESS.equals(mimeType);
+            if (mAlternate && mKind.actionAltHeader != null) {
+                mHeader = mKind.actionAltHeader.inflateUsing(context, cursor);
+            } else if (mKind.actionHeader != null) {
                 mHeader = mKind.actionHeader.inflateUsing(context, cursor);
             }
+
             if (mKind.actionBody != null) {
                 mBody = mKind.actionBody.inflateUsing(context, cursor);
             }
 
             // Handle well-known MIME-types with special care
-            final String mimeType = mKind.mimeType;
             if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
                 final String number = getAsString(cursor, Phone.NUMBER);
                 final Uri callUri = Uri.fromParts(SCHEME_TEL, number, null);
                 mIntent = new Intent(Intent.ACTION_DIAL, callUri);
 
+            } else if (MIME_SMS_ADDRESS.equals(mimeType)) {
+                final String number = getAsString(cursor, Phone.NUMBER);
+                final Uri smsUri = Uri.fromParts(SCHEME_SMSTO, number, null);
+                mIntent = new Intent(Intent.ACTION_SENDTO, smsUri);
+
             } else if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
                 final String address = getAsString(cursor, Email.DATA);
                 final Uri mailUri = Uri.fromParts(SCHEME_MAILTO, address, null);
@@ -606,45 +630,17 @@
 
         /** {@inheritDoc} */
         public Drawable getIcon() {
-            Drawable icon = null;
-            if (mSource.resPackageName == null || mKind.iconRes != -1) {
-                icon = mContext.getPackageManager().getDrawable(mSource.resPackageName,
-                        mKind.iconRes, null);
+            // Bail early if no valid resources
+            if (mSource.resPackageName == null) return null;
+
+            final PackageManager pm = mContext.getPackageManager();
+            if (mAlternate && mKind.iconAltRes > 0) {
+                return pm.getDrawable(mSource.resPackageName, mKind.iconAltRes, null);
+            } else if (mKind.iconRes > 0) {
+                return pm.getDrawable(mSource.resPackageName, mKind.iconRes, null);
+            } else {
+                return null;
             }
-            return icon;
-        }
-
-        /** {@inheritDoc} */
-        public Intent getIntent() {
-            return mIntent;
-        }
-    }
-
-    private static class SmsAction implements Action {
-        private final Context mContext;
-        private final Intent mIntent;
-
-        public SmsAction(Context context, Cursor cursor) {
-            mContext = context;
-
-            final String number = getAsString(cursor, Phone.NUMBER);
-            final Uri smsUri = Uri.fromParts(SCHEME_SMSTO, number, null);
-            mIntent = new Intent(Intent.ACTION_SENDTO, smsUri);
-        }
-
-        /** {@inheritDoc} */
-        public CharSequence getHeader() {
-            return null;
-        }
-
-        /** {@inheritDoc} */
-        public CharSequence getBody() {
-            return null;
-        }
-
-        /** {@inheritDoc} */
-        public Drawable getIcon() {
-            return mContext.getResources().getDrawable(R.drawable.sym_action_sms);
         }
 
         /** {@inheritDoc} */
@@ -735,7 +731,8 @@
             if (photoView != null && Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
                 final int colPhoto = cursor.getColumnIndex(Photo.PHOTO);
                 final byte[] photoBlob = cursor.getBlob(colPhoto);
-                final Bitmap photoBitmap = BitmapFactory.decodeByteArray(photoBlob, 0, photoBlob.length);
+                final Bitmap photoBitmap = BitmapFactory.decodeByteArray(photoBlob, 0,
+                        photoBlob.length);
                 photoView.setImageBitmap(photoBitmap);
                 continue;
             }
@@ -749,13 +746,14 @@
                 // Build an action for this data entry, find a mapping to a UI
                 // element, build its summary from the cursor, and collect it
                 // along with all others of this MIME-type.
-                final Action action = new DataAction(mContext, source, kind, cursor);
+                final Action action = new DataAction(mContext, source, mimeType, kind, cursor);
                 considerAdd(action, mimeType);
             }
 
             // If phone number, also insert as text message action
             if (Phones.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                final Action action = new SmsAction(mContext, cursor);
+                final Action action = new DataAction(mContext, source, MIME_SMS_ADDRESS, kind,
+                        cursor);
                 considerAdd(action, MIME_SMS_ADDRESS);
             }
         }
diff --git a/tests/src/com/android/contacts/EntityModifierTests.java b/tests/src/com/android/contacts/EntityModifierTests.java
index 7b8580c..78597be 100644
--- a/tests/src/com/android/contacts/EntityModifierTests.java
+++ b/tests/src/com/android/contacts/EntityModifierTests.java
@@ -63,9 +63,9 @@
             kind.typeOverallMax = 5;
             kind.typeColumn = Phone.TYPE;
             kind.typeList = new ArrayList<EditType>();
-            kind.typeList.add(new EditType(Phone.TYPE_HOME, -1, false, 2));
-            kind.typeList.add(new EditType(Phone.TYPE_WORK, -1, false, 1));
-            kind.typeList.add(new EditType(Phone.TYPE_FAX_WORK, -1, true, -1));
+            kind.typeList.add(new EditType(Phone.TYPE_HOME, -1).setSpecificMax(2));
+            kind.typeList.add(new EditType(Phone.TYPE_WORK, -1).setSpecificMax(1));
+            kind.typeList.add(new EditType(Phone.TYPE_FAX_WORK, -1).setSecondary(true));
             kind.typeList.add(new EditType(Phone.TYPE_OTHER, -1));
 
             list.add(kind);
