diff --git a/res/values/colors.xml b/res/values/colors.xml
index a04e9cd..b44f34b 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -60,4 +60,8 @@
 
     <!-- Background color of pinned header items. -->
     <color name="list_item_pinned_header_color">#f5f5f5</color>
+
+    <!-- The default color used for tinting photos when no color can be extracted via Palette,
+         this is Blue Grey 500 -->
+    <color name="quickcontact_default_photo_tint_color">#607D8B</color>
 </resources>
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index bc7dc1f..0411152 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -110,6 +110,8 @@
 import com.android.contacts.common.model.dataitem.StructuredPostalDataItem;
 import com.android.contacts.common.model.dataitem.WebsiteDataItem;
 import com.android.contacts.common.util.DateUtils;
+import com.android.contacts.common.util.MaterialColorMapUtils;
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
 import com.android.contacts.detail.ContactDetailDisplayUtils;
 import com.android.contacts.interactions.CalendarInteractionsLoader;
 import com.android.contacts.interactions.CallLogInteractionsLoader;
@@ -124,7 +126,7 @@
 import com.android.contacts.util.StructuredPostalUtils;
 import com.android.contacts.widget.MultiShrinkScroller;
 import com.android.contacts.widget.MultiShrinkScroller.MultiShrinkScrollerListener;
-import com.google.common.annotations.VisibleForTesting;
+
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 
@@ -135,10 +137,8 @@
 import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * Mostly translucent {@link Activity} that shows QuickContact dialog. It loads
@@ -160,7 +160,6 @@
 
     private static final int ANIMATION_STATUS_BAR_COLOR_CHANGE_DURATION = 150;
     private static final int REQUEST_CODE_CONTACT_EDITOR_ACTIVITY = 1;
-    private static final float SYSTEM_BAR_BRIGHTNESS_FACTOR = 0.7f;
     private static final int SCRIM_COLOR = Color.argb(0xB2, 0, 0, 0);
     private static final String SCHEME_SMSTO = "smsto";
     private static final String MIMETYPE_SMS = "vnd.android-dir/mms-sms";
@@ -567,7 +566,7 @@
                             // header tint before the MultiShrinkScroller has been measured will
                             // cause incorrect tinting calculations.
                             if (color != 0) {
-                                setThemeColor(color);
+                                setThemeColor(MaterialColorMapUtils.calculateSecondaryColor(color));
                             }
                         }
                     });
@@ -1121,22 +1120,29 @@
             return;
         }
         final Drawable imageViewDrawable = mPhotoView.getDrawable();
-        new AsyncTask<Void, Void, Integer>() {
+        new AsyncTask<Void, Void, MaterialPalette>() {
             @Override
-            protected Integer doInBackground(Void... params) {
+            protected MaterialPalette doInBackground(Void... params) {
+
                 if (imageViewDrawable instanceof BitmapDrawable) {
                     final Bitmap bitmap = ((BitmapDrawable) imageViewDrawable).getBitmap();
-                    return colorFromBitmap(bitmap);
+                    final int primaryColor = colorFromBitmap(bitmap);
+                    if (primaryColor != 0) {
+                        return MaterialColorMapUtils.calculatePrimaryAndSecondaryColor(
+                                primaryColor);
+                    }
                 }
                 if (imageViewDrawable instanceof LetterTileDrawable) {
-                    return ((LetterTileDrawable) imageViewDrawable).getColor();
+                    final int primaryColor = ((LetterTileDrawable) imageViewDrawable).getColor();
+                    return MaterialColorMapUtils.calculateSecondaryColor(primaryColor);
                 }
-                return 0;
+                return MaterialColorMapUtils.calculatePrimaryAndSecondaryColor(
+                        getResources().getColor(R.color.quickcontact_default_photo_tint_color));
             }
 
             @Override
-            protected void onPostExecute(Integer color) {
-                super.onPostExecute(color);
+            protected void onPostExecute(MaterialPalette palette) {
+                super.onPostExecute(palette);
                 if (mHasComputedThemeColor) {
                     // If we had previously computed a theme color from the contact photo,
                     // then do not update the theme color. Changing the theme color several
@@ -1149,7 +1155,7 @@
                 // color needs to be extracted
                 if (imageViewDrawable == mPhotoView.getDrawable()) {
                     mHasComputedThemeColor = true;
-                    setThemeColor(color);
+                    setThemeColor(palette);
                 }
             }
         }.execute();
@@ -1179,27 +1185,18 @@
         }.execute();
     }
 
-    private void setThemeColor(int color) {
+    private void setThemeColor(MaterialPalette palette) {
         // If the color is invalid, use the predefined default
-        if (color == 0) {
-            color = getResources().getColor(R.color.actionbar_background_color);
-        }
-        mScroller.setHeaderTintColor(color);
-
-        // Create a darker version of the actionbar color. HSV is device dependent
-        // and not perceptually-linear. Therefore, we can't say mStatusBarColor is
-        // 70% as bright as the action bar color. We can only say: it is a bit darker.
-        final float hsvComponents[] = new float[3];
-        Color.colorToHSV(color, hsvComponents);
-        hsvComponents[2] *= SYSTEM_BAR_BRIGHTNESS_FACTOR;
-        mStatusBarColor = Color.HSVToColor(hsvComponents);
+        final int primaryColor = palette.mPrimaryColor;
+        mScroller.setHeaderTintColor(primaryColor);
+        mStatusBarColor = palette.mSecondaryColor;
         updateStatusBarColor();
 
         mColorFilter =
-                new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP);
-        mContactCard.setColorAndFilter(color, mColorFilter);
-        mRecentCard.setColorAndFilter(color, mColorFilter);
-        mAboutCard.setColorAndFilter(color, mColorFilter);
+                new PorterDuffColorFilter(primaryColor, PorterDuff.Mode.SRC_ATOP);
+        mContactCard.setColorAndFilter(primaryColor, mColorFilter);
+        mRecentCard.setColorAndFilter(primaryColor, mColorFilter);
+        mAboutCard.setColorAndFilter(primaryColor, mColorFilter);
     }
 
     private void updateStatusBarColor() {
