diff --git a/res/drawable-finger/facebook.png b/res/drawable-finger/facebook.png
deleted file mode 100644
index 8281223..0000000
--- a/res/drawable-finger/facebook.png
+++ /dev/null
Binary files differ
diff --git a/res/layout-finger/fasttrack_header_med.xml b/res/layout-finger/fasttrack_header_med.xml
index bbfcc06..98e9233 100644
--- a/res/layout-finger/fasttrack_header_med.xml
+++ b/res/layout-finger/fasttrack_header_med.xml
@@ -44,20 +44,10 @@
 
     <ImageView
         android:id="@+id/source"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_width="24dip"
+        android:layout_height="24dip"
         android:layout_marginLeft="13dip"
         android:layout_marginRight="16dip"
-        android:src="@drawable/facebook" />
-
-    <!--
-    <ImageView
-        android:id="@+id/presence"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginRight="15dip"
-        android:src="@drawable/fasttrack_slider_presence_active"
         android:scaleType="centerInside" />
-    -->
 
 </LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e0fdb2f..866b4da 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -829,9 +829,6 @@
     <!-- Shown as the header name for a person when the name is missing or unknown. -->
     <string name="fasttrack_missing_name">Unknown</string>
 
-    <!-- Shown as the social status snippet for a person when no social updates exist. -->
-    <string name="fasttrack_missing_status">No recent updates</string>
-
     <!-- The menu item to open the list of accounts -->
     <string name="menu_accounts">Accounts</string>
 
diff --git a/src/com/android/contacts/ui/FastTrackWindow.java b/src/com/android/contacts/ui/FastTrackWindow.java
index 63577d6..9487e15 100644
--- a/src/com/android/contacts/ui/FastTrackWindow.java
+++ b/src/com/android/contacts/ui/FastTrackWindow.java
@@ -23,7 +23,6 @@
 import com.android.internal.policy.PolicyManager;
 
 import android.content.ActivityNotFoundException;
-import android.content.ComponentName;
 import android.content.ContentUris;
 import android.content.Context;
 import android.content.EntityIterator;
@@ -32,8 +31,6 @@
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
@@ -46,7 +43,6 @@
 import android.provider.ContactsContract.RawContacts;
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
 import android.provider.SocialContract.Activities;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
@@ -120,11 +116,13 @@
 
     private boolean mHasSummary = false;
     private boolean mHasSocial = false;
+    private boolean mHasValidSocial = false;
     private boolean mHasActions = false;
 
     private ImageView mArrowUp;
     private ImageView mArrowDown;
 
+    private int mMode;
     private View mHeader;
     private HorizontalScrollView mTrackScroll;
     private ViewGroup mTrack;
@@ -257,20 +255,23 @@
         }
 
         // Prepare header view for requested mode
+        mMode = mode;
         mHeader = getHeaderView(mode);
         mExcludeMimes = excludeMimes;
 
         setHeaderText(R.id.name, R.string.fasttrack_missing_name);
-        setHeaderText(R.id.status, R.string.fasttrack_missing_status);
+        setHeaderText(R.id.status, null);
         setHeaderText(R.id.published, null);
         setHeaderImage(R.id.presence, null);
 
+        mHasValidSocial = false;
+
         mAggId = ContentUris.parseId(aggUri);
         mAnchor = new Rect(anchor);
         mQuerying = true;
 
         Uri aggSummary = ContentUris.withAppendedId(
-                ContactsContract.Contacts.CONTENT_SUMMARY_URI, mAggId);
+                ContactsContract.Contacts.CONTENT_URI, mAggId);
         Uri aggSocial = ContentUris.withAppendedId(
                 SocialContract.Activities.CONTENT_CONTACT_STATUS_URI, mAggId);
         Uri aggData = Uri.withAppendedPath(aggUri,
@@ -278,9 +279,9 @@
 
         // Start data query in background
         mHandler = new NotifyingAsyncQueryHandler(mContext, this);
-        mHandler.startQuery(TOKEN_SUMMARY, null, aggSummary, null, null, null, null);
-        mHandler.startQuery(TOKEN_SOCIAL, null, aggSocial, null, null, null, null);
-        mHandler.startQuery(TOKEN_DATA, null, aggData, null, null, null, null);
+        mHandler.startQuery(TOKEN_SUMMARY, null, aggSummary, SummaryQuery.PROJECTION, null, null, null);
+        mHandler.startQuery(TOKEN_SOCIAL, null, aggSocial, SocialQuery.PROJECTION, null, null, null);
+        mHandler.startQuery(TOKEN_DATA, null, aggData, DataQuery.PROJECTION, null, null, null);
     }
 
     /**
@@ -404,6 +405,13 @@
      */
     private synchronized void considerShowing() {
         if (mHasSummary && mHasSocial && mHasActions && !mShowing) {
+            if (mMode == Intents.MODE_MEDIUM && !mHasValidSocial) {
+                // Missing valid social, swap medium for small header
+                mHeader.setVisibility(View.GONE);
+                mHeader = getHeaderView(Intents.MODE_SMALL);
+            }
+
+            // All queries have returned, pull curtain
             showInternal();
         }
     }
@@ -471,8 +479,10 @@
     private void handleSummary(Cursor cursor) {
         if (cursor == null || !cursor.moveToNext()) return;
 
-        final String name = getAsString(cursor, Contacts.DISPLAY_NAME);
-        final int status = getAsInteger(cursor, Contacts.PRESENCE_STATUS);
+        // TODO: switch to provider-specific presence dots instead of using
+        // overall summary dot.
+        final String name = cursor.getString(SummaryQuery.DISPLAY_NAME);
+        final int status = cursor.getInt(SummaryQuery.PRESENCE_STATUS);
         final Drawable statusIcon = getPresenceIcon(status);
 
         setHeaderText(R.id.name, name);
@@ -485,11 +495,13 @@
     private void handleSocial(Cursor cursor) {
         if (cursor == null || !cursor.moveToNext()) return;
 
-        final String status = getAsString(cursor, Activities.TITLE);
-        final long published = getAsLong(cursor, Activities.PUBLISHED);
+        final String status = cursor.getString(SocialQuery.TITLE);
+        final long published = cursor.getLong(SocialQuery.PUBLISHED);
         final CharSequence relativePublished = DateUtils.getRelativeTimeSpanString(published,
                 System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS);
 
+        mHasValidSocial = !TextUtils.isEmpty(status);
+
         setHeaderText(R.id.status, status);
         setHeaderText(R.id.published, relativePublished);
     }
@@ -550,18 +562,6 @@
         return cursor.getString(index);
     }
 
-    /** Read int from the given {@link Cursor}. */
-    private static int getAsInteger(Cursor cursor, String columnName) {
-        final int index = cursor.getColumnIndex(columnName);
-        return cursor.getInt(index);
-    }
-
-    /** Read long from the given {@link Cursor}. */
-    private static long getAsLong(Cursor cursor, String columnName) {
-        final int index = cursor.getColumnIndex(columnName);
-        return cursor.getLong(index);
-    }
-
     /**
      * Abstract definition of an action that could be performed, along with
      * string description and icon.
@@ -622,7 +622,7 @@
                 final String number = getAsString(cursor, Phone.NUMBER);
                 if (!TextUtils.isEmpty(number)) {
                     final Uri callUri = Uri.fromParts(SCHEME_TEL, number, null);
-                    mIntent = new Intent(Intent.ACTION_DIAL, callUri);
+                    mIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED, callUri);
                 }
 
             } else if (MIME_SMS_ADDRESS.equals(mimeType)) {
@@ -641,7 +641,7 @@
 
             } else {
                 // Otherwise fall back to default VIEW action
-                final long dataId = getAsLong(cursor, Data._ID);
+                final long dataId = cursor.getLong(DataQuery._ID);
                 final Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
                 mIntent = new Intent(Intent.ACTION_VIEW, dataUri);
             }
@@ -865,9 +865,9 @@
         final ImageView photoView = (ImageView)mHeader.findViewById(R.id.photo);
 
         while (cursor.moveToNext()) {
-            final String accountType = getAsString(cursor, RawContacts.ACCOUNT_TYPE);
-            final String resPackage = getAsString(cursor, Data.RES_PACKAGE);
-            final String mimeType = getAsString(cursor, Data.MIMETYPE);
+            final String accountType = cursor.getString(DataQuery.ACCOUNT_TYPE);
+            final String resPackage = cursor.getString(DataQuery.RES_PACKAGE);
+            final String mimeType = cursor.getString(DataQuery.MIMETYPE);
 
             // Skip this data item if MIME-type excluded
             if (isMimeExcluded(mimeType)) continue;
@@ -875,14 +875,15 @@
             // Handle when a photo appears in the various data items
             // TODO: accept a photo only if its marked as primary
             // TODO: move to using photo thumbnail columns, when they exist
-            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);
-                photoView.setImageBitmap(photoBitmap);
-                continue;
-            }
+            // TODO: launch photo as separate TOKEN query, only for large
+//            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);
+//                photoView.setImageBitmap(photoBitmap);
+//                continue;
+//            }
 
             // TODO: find the ContactsSource for this, either from accountType,
             // or through lazy-loading when resPackage is set, or default.
@@ -1159,4 +1160,49 @@
     public void onDetachedFromWindow() {
         // No actions
     }
+
+    private interface SummaryQuery {
+        final String[] PROJECTION = new String[] {
+                Contacts.DISPLAY_NAME,
+                Contacts.PHOTO_ID,
+                Contacts.PRESENCE_STATUS,
+                Contacts.PRESENCE_CUSTOM_STATUS,
+        };
+
+        final int DISPLAY_NAME = 0;
+        final int PHOTO_ID = 1;
+        final int PRESENCE_STATUS = 2;
+        final int PRESENCE_CUSTOM_STATUS = 3;
+    }
+
+    private interface SocialQuery {
+        final String[] PROJECTION = new String[] {
+                Activities.PUBLISHED,
+                Activities.TITLE,
+        };
+
+        final int PUBLISHED = 0;
+        final int TITLE = 0;
+    }
+
+    private interface DataQuery {
+        final String[] PROJECTION = new String[] {
+                Data._ID,
+                RawContacts.ACCOUNT_TYPE,
+                Data.RES_PACKAGE,
+                Data.MIMETYPE,
+                Data.IS_PRIMARY,
+                Data.IS_SUPER_PRIMARY,
+                Data.DATA1, Data.DATA2, Data.DATA3, Data.DATA4, Data.DATA5,
+                Data.DATA6, Data.DATA7, Data.DATA8, Data.DATA9, Data.DATA10, Data.DATA11,
+                Data.DATA12, Data.DATA13, Data.DATA14, Data.DATA15,
+        };
+
+        final int _ID = 0;
+        final int ACCOUNT_TYPE = 1;
+        final int RES_PACKAGE = 2;
+        final int MIMETYPE = 3;
+        final int IS_PRIMARY = 4;
+        final int IS_SUPER_PRIMARY = 5;
+    }
 }
