diff --git a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
index 18703d1..209284f 100644
--- a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
+++ b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
@@ -23,6 +23,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Resources;
+import android.graphics.ColorFilter;
 import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
 import android.util.AttributeSet;
@@ -122,7 +123,10 @@
     private List<Entry> mEntries;
     private List<View> mEntryViews;
     private LinearLayout mEntriesViewGroup;
+    private final Drawable mCollapseArrowDrawable;
+    private final Drawable mExpandArrowDrawable;
     private int mThemeColor;
+    private ColorFilter mThemeColorFilter;
 
     private final OnClickListener mExpandCollapseButtonListener = new OnClickListener() {
         @Override
@@ -146,6 +150,17 @@
         mEntriesViewGroup = (LinearLayout)
                 expandingEntryCardView.findViewById(R.id.content_area_linear_layout);
         mTitleTextView = (TextView) expandingEntryCardView.findViewById(R.id.title);
+        mCollapseArrowDrawable =
+                getResources().getDrawable(R.drawable.expanding_entry_card_collapse_white_24);
+        mExpandArrowDrawable =
+                getResources().getDrawable(R.drawable.expanding_entry_card_expand_white_24);
+
+        mExpandCollapseButton = inflater.inflate(
+                R.layout.quickcontact_expanding_entry_card_button, this, false);
+        mExpandCollapseTextView = (TextView) mExpandCollapseButton.findViewById(R.id.text);
+        mExpandCollapseButton.setOnClickListener(mExpandCollapseButtonListener);
+
+
     }
 
     /**
@@ -154,19 +169,21 @@
      * @param entries The Entry list to display.
      */
     public void initialize(List<Entry> entries, int numInitialVisibleEntries,
-            boolean isExpanded, int themeColor) {
+            boolean isExpanded) {
         LayoutInflater layoutInflater = LayoutInflater.from(getContext());
         mIsExpanded = isExpanded;
         mEntries = entries;
         mEntryViews = new ArrayList<View>(entries.size());
         mCollapsedEntriesCount = Math.min(numInitialVisibleEntries, entries.size());
-        mThemeColor = themeColor;
 
-        if (mExpandCollapseButton == null) {
-            createExpandButton(layoutInflater);
+        if (mIsExpanded) {
+            updateExpandCollapseButton(getCollapseButtonText());
+        } else {
+            updateExpandCollapseButton(getExpandButtonText());
         }
         inflateViewsIfNeeded(layoutInflater);
         insertEntriesIntoViewGroup();
+        applyColor();
     }
 
     /**
@@ -260,18 +277,6 @@
         }
     }
 
-    private void createExpandButton(LayoutInflater layoutInflater) {
-        mExpandCollapseButton = layoutInflater.inflate(
-                R.layout.quickcontact_expanding_entry_card_button, this, false);
-        mExpandCollapseTextView = (TextView) mExpandCollapseButton.findViewById(R.id.text);
-        if (mIsExpanded) {
-            updateExpandCollapseButton(getCollapseButtonText());
-        } else {
-            updateExpandCollapseButton(getExpandButtonText());
-        }
-        mExpandCollapseButton.setOnClickListener(mExpandCollapseButtonListener);
-    }
-
     /**
      * Lazily inflate the number of views currently needed, and bind data from
      * mEntries into these views.
@@ -283,6 +288,41 @@
         }
     }
 
+    public void setColorAndFilter(int color, ColorFilter colorFilter) {
+        mThemeColor = color;
+        mThemeColorFilter = colorFilter;
+        applyColor();
+    }
+
+    /**
+     * The ColorFilter is passed in along with the color so that a new one only needs to be created
+     * once for the entire activity.
+     * 1. Title
+     * 2. Entry icons
+     * 3. Expand/Collapse Text
+     * 4. Expand/Collapse Button
+     */
+    public void applyColor() {
+        if (mThemeColor != 0 && mThemeColorFilter != null) {
+            // Title
+            if (mTitleTextView != null) {
+                mTitleTextView.setTextColor(mThemeColor);
+            }
+
+            // Entry icons
+            if (mEntries != null) {
+                for (Entry entry : mEntries) {
+                    entry.getIcon().setColorFilter(mThemeColorFilter);
+                }
+            }
+
+            // Expand/Collapse
+            mExpandCollapseTextView.setTextColor(mThemeColor);
+            mCollapseArrowDrawable.setColorFilter(mThemeColorFilter);
+            mExpandArrowDrawable.setColorFilter(mThemeColorFilter);
+        }
+    }
+
     private View createEntryView(LayoutInflater layoutInflater, Entry entry) {
         View view = layoutInflater.inflate(
                 R.layout.expanding_entry_card_item, this, false);
@@ -335,15 +375,12 @@
     }
 
     private void updateExpandCollapseButton(CharSequence buttonText) {
-        int resId = mIsExpanded ? R.drawable.expanding_entry_card_collapse_white_24
-                : R.drawable.expanding_entry_card_expand_white_24;
-        // TODO: apply color theme to the drawable
-        Drawable drawable = getResources().getDrawable(resId);
+        final Drawable arrow = mIsExpanded ? mCollapseArrowDrawable : mExpandArrowDrawable;
         if (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
-            mExpandCollapseTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable,
+            mExpandCollapseTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, arrow,
                     null);
         } else {
-            mExpandCollapseTextView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null,
+            mExpandCollapseTextView.setCompoundDrawablesWithIntrinsicBounds(arrow, null, null,
                     null);
         }
         mExpandCollapseTextView.setText(buttonText);
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index b186038..303dae5 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -31,6 +31,7 @@
 import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
 import android.graphics.Color;
+import android.graphics.ColorFilter;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
@@ -93,7 +94,6 @@
 import com.android.contacts.util.SchedulingUtils;
 import com.android.contacts.widget.MultiShrinkScroller;
 import com.android.contacts.widget.MultiShrinkScroller.MultiShrinkScrollerListener;
-
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 
@@ -159,9 +159,6 @@
     private Contact mContactData;
     private ContactLoader mContactLoader;
 
-    private PorterDuffColorFilter mColorFilter;
-    List<Drawable> mDrawablesToTint;
-
     private final ImageViewDrawableSetter mPhotoSetter = new ImageViewDrawableSetter();
 
     /**
@@ -380,7 +377,6 @@
             }
         }
 
-        mDrawablesToTint = new ArrayList<>();
         mSelectAccountFragmentListener= (SelectAccountDialogFragmentListener) getFragmentManager()
                 .findFragmentByTag(FRAGMENT_TAG_SELECT_ACCOUNT);
         if (mSelectAccountFragmentListener == null) {
@@ -564,8 +560,7 @@
         if (entries.size() > 0) {
             mCommunicationCard.initialize(entries,
                     /* numInitialVisibleEntries = */ MIN_NUM_COMMUNICATION_ENTRIES_SHOWN,
-                    /* isExpanded = */ false,
-                    /* themeColor = */ 0);
+                    /* isExpanded = */ false);
         }
 
         final boolean hasData = !sortedActionMimeTypes.isEmpty();
@@ -730,10 +725,13 @@
             @Override
             protected void onPostExecute(Integer color) {
                 super.onPostExecute(color);
-                mColorFilter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP);
-                // Make sure the color is valid. Also check that the Photo has not changed. If it
-                // has changed, the new tint color needs to be extracted
-                if (color != 0 && imageViewDrawable == mPhotoView.getDrawable()) {
+                // Check that the Photo has not changed. If it has changed, the new tint color
+                // needs to be extracted
+                if (imageViewDrawable == mPhotoView.getDrawable()) {
+                    // If the color is invalid, use the predefined default
+                    if (color == 0) {
+                        color = getResources().getColor(R.color.actionbar_background_color);
+                    }
                     // TODO: animate from the previous tint.
                     mScroller.setHeaderTintColor(color);
 
@@ -746,10 +744,10 @@
                     mStatusBarColor = Color.HSVToColor(hsvComponents);
 
                     updateStatusBarColor();
-                    for (Drawable drawable : mDrawablesToTint) {
-                        applyThemeColorIfAvailable(drawable);
-                    }
-                    mDrawablesToTint.clear();
+                    final ColorFilter colorFilter =
+                            new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP);
+                    mCommunicationCard.setColorAndFilter(color, colorFilter);
+                    mRecentCard.setColorAndFilter(color, colorFilter);
                 }
             }
         }.execute();
@@ -819,20 +817,17 @@
                 case Phone.CONTENT_ITEM_TYPE:
                     header = String.valueOf(action.getBody());
                     footer = String.valueOf(action.getSubtitle());
-                    icon = applyThemeColorIfAvailable(
-                            getResources().getDrawable(R.drawable.ic_phone_24dp));
+                    icon = getResources().getDrawable(R.drawable.ic_phone_24dp);
                     break;
                 case Email.CONTENT_ITEM_TYPE:
                     header = String.valueOf(action.getBody());
                     footer = String.valueOf(action.getSubtitle());
-                    icon = applyThemeColorIfAvailable(
-                            getResources().getDrawable(R.drawable.ic_email_24dp));
+                    icon = getResources().getDrawable(R.drawable.ic_email_24dp);
                     break;
                 case StructuredPostal.CONTENT_ITEM_TYPE:
                     header = String.valueOf(action.getBody());
                     footer = String.valueOf(action.getSubtitle());
-                    icon = applyThemeColorIfAvailable(
-                            getResources().getDrawable(R.drawable.ic_place_24dp));
+                    icon = getResources().getDrawable(R.drawable.ic_place_24dp);
                     break;
                 default:
                     header = String.valueOf(action.getSubtitle());
@@ -844,8 +839,7 @@
 
             // Add SMS in addition to phone calls
             if (action.getMimeType().equals(Phone.CONTENT_ITEM_TYPE)) {
-                entries.add(new Entry(applyThemeColorIfAvailable(getResources().getDrawable(
-                        R.drawable.ic_message_24dp)),
+                entries.add(new Entry(getResources().getDrawable(R.drawable.ic_message_24dp),
                         getResources().getString(R.string.send_message), null, header,
                         action.getAlternateIntent(), /* isEditable = */ false));
             }
@@ -856,7 +850,7 @@
     private List<Entry> contactInteractionsToEntries(List<ContactInteraction> interactions) {
         List<Entry> entries = new ArrayList<>();
         for (ContactInteraction interaction : interactions) {
-            entries.add(new Entry(applyThemeColorIfAvailable(interaction.getIcon(this)),
+            entries.add(new Entry(interaction.getIcon(this),
                     interaction.getViewHeader(this),
                     interaction.getViewBody(this),
                     interaction.getBodyIcon(this),
@@ -1012,8 +1006,7 @@
         if (allInteractions.size() > 0) {
             mRecentCard.initialize(contactInteractionsToEntries(allInteractions),
                     /* numInitialVisibleEntries = */ MIN_NUM_COLLAPSED_RECENT_ENTRIES_SHOWN,
-                    /* isExpanded = */ false,
-                    /* themeColor = */ 0);
+                    /* isExpanded = */ false);
             mRecentCard.setVisibility(View.VISIBLE);
         }
     }
@@ -1032,20 +1025,6 @@
     }
 
     /**
-     * Applies the theme color as extracted in
-     * {@link #extractAndApplyTintFromPhotoViewAsynchronously()} if available. If the color is not
-     * available, store a reference to the drawable to tint when a color becomes available.
-     */
-    private Drawable applyThemeColorIfAvailable(Drawable drawable) {
-        if (mColorFilter != null) {
-            drawable.setColorFilter(mColorFilter);
-        } else {
-            mDrawablesToTint.add(drawable);
-        }
-        return drawable;
-    }
-
-    /**
      * Returns true if it is possible to edit the current contact.
      */
     private boolean isContactEditable() {
diff --git a/src/com/android/contacts/widget/MultiShrinkScroller.java b/src/com/android/contacts/widget/MultiShrinkScroller.java
index b38f5cf..96a3d0b 100644
--- a/src/com/android/contacts/widget/MultiShrinkScroller.java
+++ b/src/com/android/contacts/widget/MultiShrinkScroller.java
@@ -152,8 +152,6 @@
                 R.dimen.quickcontact_starting_header_height);
         mTransparentStartHeight = (int) getResources().getDimension(
                 R.dimen.quickcontact_starting_empty_height);
-        mHeaderTintColor = mContext.getResources().getColor(
-                R.color.actionbar_background_color);
         mToolbarElevation = mContext.getResources().getDimension(
                 R.dimen.quick_contact_toolbar_elevation);
 
