diff --git a/src/com/android/contacts/activities/ContactDetailActivity.java b/src/com/android/contacts/activities/ContactDetailActivity.java
index 237e387..0f793e2 100644
--- a/src/com/android/contacts/activities/ContactDetailActivity.java
+++ b/src/com/android/contacts/activities/ContactDetailActivity.java
@@ -55,9 +55,6 @@
 public class ContactDetailActivity extends ContactsActivity {
     private static final String TAG = "ContactDetailActivity";
 
-    /** Shows a toogle button for hiding/showing updates. Don't submit with true */
-    private static final boolean DEBUG_TRANSITIONS = false;
-
     private Contact mContactData;
     private Uri mLookupUri;
 
@@ -126,19 +123,6 @@
         super.onCreateOptionsMenu(menu);
         MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.star, menu);
-        if (DEBUG_TRANSITIONS) {
-            final MenuItem toggleSocial =
-                    menu.add(mLoaderFragment.getLoadStreamItems() ? "less" : "more");
-            toggleSocial.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-            toggleSocial.setOnMenuItemClickListener(new OnMenuItemClickListener() {
-                @Override
-                public boolean onMenuItemClick(MenuItem item) {
-                    mLoaderFragment.toggleLoadStreamItems();
-                    invalidateOptionsMenu();
-                    return false;
-                }
-            });
-        }
         return true;
     }
 
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 80d5885..6a8cf4c 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -109,9 +109,6 @@
 
     private static final String TAG = "PeopleActivity";
 
-    /** Shows a toogle button for hiding/showing updates. Don't submit with true */
-    private static final boolean DEBUG_TRANSITIONS = false;
-
     private static final int TAB_FADE_IN_DURATION = 500;
 
     private static final String ENABLE_DEBUG_OPTIONS_HIDDEN_CODE = "debug debug!";
@@ -1376,20 +1373,6 @@
         MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.people_options, menu);
 
-        if (DEBUG_TRANSITIONS && mContactDetailLoaderFragment != null) {
-            final MenuItem toggleSocial =
-                    menu.add(mContactDetailLoaderFragment.getLoadStreamItems() ? "less" : "more");
-            toggleSocial.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-            toggleSocial.setOnMenuItemClickListener(new OnMenuItemClickListener() {
-                @Override
-                public boolean onMenuItemClick(MenuItem item) {
-                    mContactDetailLoaderFragment.toggleLoadStreamItems();
-                    invalidateOptionsMenu();
-                    return false;
-                }
-            });
-        }
-
         return true;
     }
 
diff --git a/src/com/android/contacts/detail/ContactLoaderFragment.java b/src/com/android/contacts/detail/ContactLoaderFragment.java
index 0d4285f..5f5a137 100644
--- a/src/com/android/contacts/detail/ContactLoaderFragment.java
+++ b/src/com/android/contacts/detail/ContactLoaderFragment.java
@@ -186,8 +186,8 @@
         public Loader<Contact> onCreateLoader(int id, Bundle args) {
             Uri lookupUri = args.getParcelable(LOADER_ARG_CONTACT_URI);
             return new ContactLoader(mContext, lookupUri, true /* loadGroupMetaData */,
-                    true /* loadStreamItems */, true /* load invitable account types */,
-                    true /* postViewNotification */, true /* computeFormattedPhoneNumber */);
+                    true /* load invitable account types */, true /* postViewNotification */,
+                    true /* computeFormattedPhoneNumber */);
         }
 
         @Override
@@ -467,18 +467,4 @@
                 mContext, mLookupUri, mCustomRingtone);
         mContext.startService(intent);
     }
-
-    /** Toggles whether to load stream items. Just for debugging */
-    public void toggleLoadStreamItems() {
-        Loader<Contact> loaderObj = getLoaderManager().getLoader(LOADER_DETAILS);
-        ContactLoader loader = (ContactLoader) loaderObj;
-        loader.setLoadStreamItems(!loader.getLoadStreamItems());
-    }
-
-    /** Returns whether to load stream items. Just for debugging */
-    public boolean getLoadStreamItems() {
-        Loader<Contact> loaderObj = getLoaderManager().getLoader(LOADER_DETAILS);
-        ContactLoader loader = (ContactLoader) loaderObj;
-        return loader != null && loader.getLoadStreamItems();
-    }
 }
diff --git a/src/com/android/contacts/model/Contact.java b/src/com/android/contacts/model/Contact.java
index 0314c3c..9f7f217 100644
--- a/src/com/android/contacts/model/Contact.java
+++ b/src/com/android/contacts/model/Contact.java
@@ -33,6 +33,7 @@
 import com.google.common.collect.ImmutableMap;
 
 import java.util.ArrayList;
+import java.util.Collections;
 
 /**
  * A Contact represents a single person or logical entity as perceived by the user.  The information
@@ -72,7 +73,6 @@
     private final boolean mStarred;
     private final Integer mPresence;
     private ImmutableList<RawContact> mRawContacts;
-    private ImmutableList<StreamItemEntry> mStreamItems;
     private ImmutableMap<Long,DataStatus> mStatuses;
     private ImmutableList<AccountType> mInvitableAccountTypes;
 
@@ -108,7 +108,6 @@
         mLookupKey = null;
         mId = -1;
         mRawContacts = null;
-        mStreamItems = null;
         mStatuses = null;
         mNameRawContactId = -1;
         mDisplayNameSource = DisplayNameSources.UNDEFINED;
@@ -150,7 +149,6 @@
         mLookupKey = lookupKey;
         mId = id;
         mRawContacts = null;
-        mStreamItems = null;
         mStatuses = null;
         mNameRawContactId = nameRawContactId;
         mDisplayNameSource = displayNameSource;
@@ -187,7 +185,6 @@
         mStarred = from.mStarred;
         mPresence = from.mPresence;
         mRawContacts = from.mRawContacts;
-        mStreamItems = from.mStreamItems;
         mStatuses = from.mStatuses;
         mInvitableAccountTypes = from.mInvitableAccountTypes;
 
@@ -354,7 +351,7 @@
      * @return
      */
     public ImmutableList<StreamItemEntry> getStreamItems() {
-        return mStreamItems;
+        return ImmutableList.of();
     }
 
     public ImmutableMap<Long, DataStatus> getStatuses() {
@@ -484,8 +481,4 @@
     /* package */ void setGroupMetaData(ImmutableList<GroupMetaData> groups) {
         mGroups = groups;
     }
-
-    /* package */ void setStreamItems(ImmutableList<StreamItemEntry> streamItems) {
-        mStreamItems = streamItems;
-    }
 }
diff --git a/src/com/android/contacts/model/ContactLoader.java b/src/com/android/contacts/model/ContactLoader.java
index 3c1fc9d..c780f23 100644
--- a/src/com/android/contacts/model/ContactLoader.java
+++ b/src/com/android/contacts/model/ContactLoader.java
@@ -82,7 +82,6 @@
     private final Uri mRequestedUri;
     private Uri mLookupUri;
     private boolean mLoadGroupMetaData;
-    private boolean mLoadStreamItems;
     private boolean mLoadInvitableAccountTypes;
     private boolean mPostViewNotification;
     private boolean mComputeFormattedPhoneNumber;
@@ -91,17 +90,16 @@
     private final Set<Long> mNotifiedRawContactIds = Sets.newHashSet();
 
     public ContactLoader(Context context, Uri lookupUri, boolean postViewNotification) {
-        this(context, lookupUri, false, false, false, postViewNotification, false);
+        this(context, lookupUri, false, false, postViewNotification, false);
     }
 
     public ContactLoader(Context context, Uri lookupUri, boolean loadGroupMetaData,
-            boolean loadStreamItems, boolean loadInvitableAccountTypes,
+            boolean loadInvitableAccountTypes,
             boolean postViewNotification, boolean computeFormattedPhoneNumber) {
         super(context);
         mLookupUri = lookupUri;
         mRequestedUri = lookupUri;
         mLoadGroupMetaData = loadGroupMetaData;
-        mLoadStreamItems = loadStreamItems;
         mLoadInvitableAccountTypes = loadInvitableAccountTypes;
         mPostViewNotification = postViewNotification;
         mComputeFormattedPhoneNumber = computeFormattedPhoneNumber;
@@ -331,9 +329,6 @@
                         loadGroupMetaData(result);
                     }
                 }
-                if (mLoadStreamItems && result.getStreamItems() == null) {
-                    loadStreamItems(result);
-                }
                 if (mComputeFormattedPhoneNumber) {
                     computeFormattedPhoneNumbers(result);
                 }
@@ -711,95 +706,6 @@
     }
 
     /**
-     * Loads all stream items and stream item photos belonging to this contact.
-     */
-    private void loadStreamItems(Contact result) {
-        final Cursor cursor = getContext().getContentResolver().query(
-                Contacts.CONTENT_LOOKUP_URI.buildUpon()
-                        .appendPath(result.getLookupKey())
-                        .appendPath(Contacts.StreamItems.CONTENT_DIRECTORY).build(),
-                null, null, null, null);
-        final LongSparseArray<StreamItemEntry> streamItemsById =
-                new LongSparseArray<StreamItemEntry>();
-        final ArrayList<StreamItemEntry> streamItems = new ArrayList<StreamItemEntry>();
-        try {
-            while (cursor.moveToNext()) {
-                StreamItemEntry streamItem = new StreamItemEntry(cursor);
-                streamItemsById.put(streamItem.getId(), streamItem);
-                streamItems.add(streamItem);
-            }
-        } finally {
-            cursor.close();
-        }
-
-        // Pre-decode all HTMLs
-        final long start = System.currentTimeMillis();
-        for (StreamItemEntry streamItem : streamItems) {
-            streamItem.decodeHtml(getContext());
-        }
-        final long end = System.currentTimeMillis();
-        if (DEBUG) {
-            Log.d(TAG, "Decoded HTML for " + streamItems.size() + " items, took "
-                    + (end - start) + " ms");
-        }
-
-        // Now retrieve any photo records associated with the stream items.
-        if (!streamItems.isEmpty()) {
-            if (result.isUserProfile()) {
-                // If the stream items we're loading are for the profile, we can't bulk-load the
-                // stream items with a custom selection.
-                for (StreamItemEntry entry : streamItems) {
-                    Cursor siCursor = getContext().getContentResolver().query(
-                            Uri.withAppendedPath(
-                                    ContentUris.withAppendedId(
-                                            StreamItems.CONTENT_URI, entry.getId()),
-                                    StreamItems.StreamItemPhotos.CONTENT_DIRECTORY),
-                            null, null, null, null);
-                    try {
-                        while (siCursor.moveToNext()) {
-                            entry.addPhoto(new StreamItemPhotoEntry(siCursor));
-                        }
-                    } finally {
-                        siCursor.close();
-                    }
-                }
-            } else {
-                String[] streamItemIdArr = new String[streamItems.size()];
-                StringBuilder streamItemPhotoSelection = new StringBuilder();
-                streamItemPhotoSelection.append(StreamItemPhotos.STREAM_ITEM_ID + " IN (");
-                for (int i = 0; i < streamItems.size(); i++) {
-                    if (i > 0) {
-                        streamItemPhotoSelection.append(",");
-                    }
-                    streamItemPhotoSelection.append("?");
-                    streamItemIdArr[i] = String.valueOf(streamItems.get(i).getId());
-                }
-                streamItemPhotoSelection.append(")");
-                Cursor sipCursor = getContext().getContentResolver().query(
-                        StreamItems.CONTENT_PHOTO_URI,
-                        null, streamItemPhotoSelection.toString(), streamItemIdArr,
-                        StreamItemPhotos.STREAM_ITEM_ID);
-                try {
-                    while (sipCursor.moveToNext()) {
-                        long streamItemId = sipCursor.getLong(
-                                sipCursor.getColumnIndex(StreamItemPhotos.STREAM_ITEM_ID));
-                        StreamItemEntry streamItem = streamItemsById.get(streamItemId);
-                        streamItem.addPhoto(new StreamItemPhotoEntry(sipCursor));
-                    }
-                } finally {
-                    sipCursor.close();
-                }
-            }
-        }
-
-        // Set the sorted stream items on the result.
-        Collections.sort(streamItems);
-        result.setStreamItems(new ImmutableList.Builder<StreamItemEntry>()
-                .addAll(streamItems.iterator())
-                .build());
-    }
-
-    /**
      * Iterates over all data items that represent phone numbers are tries to calculate a formatted
      * number. This function can safely be called several times as no unformatted data is
      * overwritten
@@ -892,28 +798,16 @@
     }
 
     /**
-     * Sets whether to load stream items. Will trigger a reload if the value has changed.
-     * At the moment, this is only used for debugging purposes
-     */
-    public void setLoadStreamItems(boolean value) {
-        if (mLoadStreamItems != value) {
-            mLoadStreamItems = value;
-            onContentChanged();
-        }
-    }
-
-    /**
      * Fully upgrades this ContactLoader to one with all lists fully loaded. When done, the
      * new result will be delivered
      */
     public void upgradeToFullContact() {
         // Everything requested already? Nothing to do, so let's bail out
-        if (mLoadGroupMetaData && mLoadInvitableAccountTypes && mLoadStreamItems
+        if (mLoadGroupMetaData && mLoadInvitableAccountTypes
                 && mPostViewNotification && mComputeFormattedPhoneNumber) return;
 
         mLoadGroupMetaData = true;
         mLoadInvitableAccountTypes = true;
-        mLoadStreamItems = true;
         mPostViewNotification = true;
         mComputeFormattedPhoneNumber = true;
 
@@ -925,10 +819,6 @@
         onContentChanged();
     }
 
-    public boolean getLoadStreamItems() {
-        return mLoadStreamItems;
-    }
-
     public Uri getLookupUri() {
         return mLookupUri;
     }
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 79a71d7..c1cfb55 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -585,9 +585,8 @@
                 Log.wtf(TAG, "Lookup uri wasn't initialized. Loader was started too early");
             }
             return new ContactLoader(getApplicationContext(), mLookupUri,
-                    false /*loadGroupMetaData*/, false /*loadStreamItems*/,
-                    false /*loadInvitableAccountTypes*/, false /*postViewNotification*/,
-                    true /*computeFormattedPhoneNumber*/);
+                    false /*loadGroupMetaData*/, false /*loadInvitableAccountTypes*/,
+                    false /*postViewNotification*/, true /*computeFormattedPhoneNumber*/);
         }
     };
 
diff --git a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
index 40c29b9..e8b8e03 100644
--- a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
+++ b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
@@ -113,7 +113,7 @@
             // Not yet set-up (this can happen while the Configuration activity is visible)
             return;
         }
-        final ContactLoader contactLoader = new ContactLoader(context, contactUri, false, true,
+        final ContactLoader contactLoader = new ContactLoader(context, contactUri, false,
                 false, true, false);
         contactLoader.registerListener(0,
                 new ContactLoader.OnLoadCompleteListener<Contact>() {
