diff --git a/src/com/android/contacts/SocialStreamActivity.java b/src/com/android/contacts/SocialStreamActivity.java
index 920999b..486ee22 100644
--- a/src/com/android/contacts/SocialStreamActivity.java
+++ b/src/com/android/contacts/SocialStreamActivity.java
@@ -17,12 +17,12 @@
 package com.android.contacts;
 
 import com.android.contacts.EdgeTriggerView.EdgeTriggerListener;
+import com.android.contacts.SocialStreamActivity.MappingCache.Mapping;
 import com.android.providers.contacts2.ContactsContract;
 import com.android.providers.contacts2.ContactsContract.Aggregates;
 import com.android.providers.contacts2.ContactsContract.Contacts;
 import com.android.providers.contacts2.ContactsContract.Data;
 import com.android.providers.contacts2.ContactsContract.CommonDataKinds.Photo;
-import com.android.providers.contacts2.ContactsContract.CommonDataKinds.StructuredName;
 import com.android.providers.contacts2.SocialContract.Activities;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -35,7 +35,6 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.database.Cursor;
 import android.graphics.Bitmap;
@@ -43,26 +42,21 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.PaintFlagsDrawFilter;
-import android.graphics.PixelFormat;
 import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.PaintDrawable;
 import android.net.Uri;
 import android.os.Bundle;
+import android.text.SpannableStringBuilder;
 import android.text.format.DateUtils;
+import android.text.style.TextAppearanceSpan;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Xml;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.BaseAdapter;
 import android.widget.CursorAdapter;
 import android.widget.ImageView;
 import android.widget.ListAdapter;
-import android.widget.ListView;
-import android.widget.SimpleCursorAdapter;
 import android.widget.TextView;
 
 import java.io.IOException;
@@ -116,11 +110,7 @@
         mMappingCache = MappingCache.createAndFill(this);
 
         Cursor cursor = managedQuery(Activities.CONTENT_URI, PROJ_ACTIVITIES, null, null);
-        mAdapter = new SocialAdapter(this, cursor, mContactsCache);
-
-//        mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor,
-//                new String[] { Activities.AUTHOR_CONTACT_ID, Activities.TITLE },
-//                new int[] { android.R.id.text1, android.R.id.text2 });
+        mAdapter = new SocialAdapter(this, cursor, mContactsCache, mMappingCache);
 
         setListAdapter(mAdapter);
 
@@ -158,42 +148,67 @@
      * {@link Activities#CONTENT_URI}.
      */
     private static class SocialAdapter extends CursorAdapter {
-        private Context mContext;
-        private LayoutInflater mInflater;
-        private ContactsCache mContactsCache;
+        private final Context mContext;
+        private final LayoutInflater mInflater;
+        private final ContactsCache mContactsCache;
+        private final MappingCache mMappingCache;
+        private final TextAppearanceSpan mTextAppearanceName;
+        private final TextAppearanceSpan mTextAppearanceStatus;
 
         private static class SocialHolder {
             ImageView photo;
-            TextView displayname;
-            TextView title;
+            ImageView sourceIcon;
+            TextView content;
+            SpannableStringBuilder contentBuilder = new SpannableStringBuilder();
             TextView published;
         }
 
-        public SocialAdapter(Context context, Cursor c, ContactsCache contactsCache) {
+        public SocialAdapter(Context context, Cursor c, ContactsCache contactsCache,
+                MappingCache mappingCache) {
             super(context, c, true);
             mContext = context;
             mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             mContactsCache = contactsCache;
-        }
+            mMappingCache = mappingCache;
+            mTextAppearanceName =
+                    new TextAppearanceSpan(mContext, android.R.style.TextAppearance_Medium);
+            mTextAppearanceStatus =
+                    new TextAppearanceSpan(mContext, android.R.style.TextAppearance_Small);
+       }
 
         @Override
         public void bindView(View view, Context context, Cursor cursor) {
             SocialHolder holder = (SocialHolder)view.getTag();
 
             long contactId = cursor.getLong(COL_AUTHOR_CONTACT_ID);
+            String name = cursor.getString(COL_DISPLAY_NAME);
+            String title = cursor.getString(COL_TITLE);
+            long published = cursor.getLong(COL_PUBLISHED);
 
             // TODO: trigger async query to find actual name and photo instead
             // of using this lazy caching mechanism
             holder.photo.setImageBitmap(mContactsCache.getPhoto(contactId));
+            holder.contentBuilder.clear();
+            holder.contentBuilder.append(name);
+            holder.contentBuilder.append(": ");
+            holder.contentBuilder.append(title);
+            holder.contentBuilder.setSpan(mTextAppearanceName, 0, name.length() + 2, 0);
+            holder.contentBuilder.setSpan(mTextAppearanceStatus, name.length() + 2,
+                    holder.contentBuilder.length(), 0);
+            holder.content.setText(holder.contentBuilder);
 
-            holder.displayname.setText(cursor.getString(COL_DISPLAY_NAME));
-            holder.title.setText(cursor.getString(COL_TITLE));
-
-            long published = cursor.getLong(COL_PUBLISHED);
-            CharSequence relativePublished = DateUtils.getRelativeTimeSpanString(published, System
-                    .currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS);
+            CharSequence relativePublished = DateUtils.getRelativeTimeSpanString(published,
+                    System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS);
             holder.published.setText(relativePublished);
 
+            String packageName = cursor.getString(COL_PACKAGE);
+            String mimeType = cursor.getString(COL_MIMETYPE);
+            Mapping mapping = mMappingCache.getMapping(packageName, mimeType);
+            if (mapping != null && mapping.icon != null) {
+                holder.sourceIcon.setImageBitmap(mapping.icon);
+            } else {
+                holder.sourceIcon.setImageDrawable(null);
+            }
         }
 
         @Override
@@ -201,10 +216,10 @@
             View view = mInflater.inflate(R.layout.social_list_item, parent, false);
 
             SocialHolder holder = new SocialHolder();
-            holder.photo = (ImageView)view.findViewById(R.id.photo);
-            holder.displayname = (TextView)view.findViewById(R.id.displayname);
-            holder.title = (TextView)view.findViewById(R.id.title);
-            holder.published = (TextView)view.findViewById(R.id.published);
+            holder.photo = (ImageView) view.findViewById(R.id.photo);
+            holder.sourceIcon = (ImageView) view.findViewById(R.id.sourceIcon);
+            holder.content = (TextView) view.findViewById(R.id.content);
+            holder.published = (TextView) view.findViewById(R.id.published);
             view.setTag(holder);
 
             return view;
@@ -365,8 +380,9 @@
                 final int depth = parser.getDepth();
                 while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth)
                         && type != XmlPullParser.END_DOCUMENT) {
-                    if (type == XmlPullParser.END_TAG)
+                    if (type == XmlPullParser.END_TAG) {
                         continue;
+                    }
 
                     if (!TAG_MAPPING.equals(parser.getName())) {
                         throw new InflateException("Expected Mapping tag");
@@ -420,7 +436,7 @@
          * The size of the thumbnail is defined by the dimension
          * android.R.dimen.launcher_application_icon_size. This method is not
          * thread-safe and should be invoked on the UI thread only.
-         * 
+         *
          * @param bitmap The bitmap to get a thumbnail of.
          * @param context The application's context.
          * @return A thumbnail for the specified bitmap or the bitmap itself if
