diff --git a/src/com/android/contacts/common/ContactPhotoManager.java b/src/com/android/contacts/common/ContactPhotoManager.java
index 5ec1eea..b9b4bcc 100644
--- a/src/com/android/contacts/common/ContactPhotoManager.java
+++ b/src/com/android/contacts/common/ContactPhotoManager.java
@@ -467,7 +467,7 @@
     /**
      * Calls {@link #loadThumbnail(ImageView, long, boolean, DefaultImageRequest,
      * DefaultImageProvider)} using the {@link DefaultImageProvider} {@link #DEFAULT_AVATAR}.
-    */
+     */
     public final void loadThumbnail(ImageView view, long photoId, boolean darkTheme,
             boolean isCircular, DefaultImageRequest defaultImageRequest) {
         loadThumbnail(view, photoId, darkTheme, isCircular, defaultImageRequest, DEFAULT_AVATAR);
@@ -830,7 +830,7 @@
         } else {
             if (DEBUG) Log.d(TAG, "loadPhoto request: " + photoId);
             loadPhotoByIdOrUri(view, Request.createFromThumbnailId(photoId, darkTheme, isCircular,
-                    defaultProvider));
+                    defaultProvider, defaultImageRequest));
         }
     }
 
@@ -1178,6 +1178,8 @@
 
     /**
      * Stores the supplied bitmap in cache.
+     * bytes should be null to indicate a failure to load the photo. An empty byte[] signifies
+     * a successful load but no photo was available.
      */
     private void cacheBitmap(Object key, byte[] bytes, boolean preloading, int requestedExtent) {
         if (DEBUG) {
@@ -1507,6 +1509,9 @@
                     while (cursor.moveToNext()) {
                         Long id = cursor.getLong(0);
                         byte[] bytes = cursor.getBlob(1);
+                        if (bytes == null) {
+                            bytes = new byte[0];
+                        }
                         cacheBitmap(id, bytes, preloading, -1);
                         mPhotoIds.remove(id);
                     }
@@ -1526,8 +1531,11 @@
                                 ContentUris.withAppendedId(Data.CONTENT_URI, id),
                                 COLUMNS, null, null, null);
                         if (profileCursor != null && profileCursor.moveToFirst()) {
-                            cacheBitmap(profileCursor.getLong(0), profileCursor.getBlob(1),
-                                    preloading, -1);
+                            byte[] bytes = profileCursor.getBlob(1);
+                            if (bytes == null) {
+                                bytes = new byte[0];
+                            }
+                            cacheBitmap(profileCursor.getLong(0), bytes, preloading, -1);
                         } else {
                             // Couldn't load a photo this way either.
                             cacheBitmap(id, null, preloading, -1);
@@ -1641,9 +1649,9 @@
         }
 
         public static Request createFromThumbnailId(long id, boolean darkTheme, boolean isCircular,
-                DefaultImageProvider defaultProvider) {
+                DefaultImageProvider defaultProvider, DefaultImageRequest defaultRequest) {
             return new Request(id, null /* no URI */, -1, darkTheme, isCircular, defaultProvider,
-                    /* defaultRequest */ null);
+                    defaultRequest);
         }
 
         public static Request createFromUri(Uri uri, int requestedExtent, boolean darkTheme,
diff --git a/src/com/android/contacts/editor/PickRawContactDialogFragment.java b/src/com/android/contacts/editor/PickRawContactDialogFragment.java
index aa3e015..dd4eb30 100644
--- a/src/com/android/contacts/editor/PickRawContactDialogFragment.java
+++ b/src/com/android/contacts/editor/PickRawContactDialogFragment.java
@@ -3,12 +3,9 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.DialogFragment;
-import android.content.ContentUris;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.net.Uri;
 import android.os.Bundle;
-import android.provider.ContactsContract.RawContacts;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -100,7 +97,7 @@
 
             String displayName =
                     mPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY
-                    ? rawContact.displayName : rawContact.displayNameAlt;
+                            ? rawContact.displayName : rawContact.displayNameAlt;
 
             if (TextUtils.isEmpty(displayName)) {
                 displayName = mContext.getString(R.string.missing_name);
@@ -130,16 +127,12 @@
             final ContactPhotoManager.DefaultImageRequest
                     request = new ContactPhotoManager.DefaultImageRequest(
                     displayName, String.valueOf(rawContact.id), /* isCircular = */ true);
-            final Uri photoUri = Uri.withAppendedPath(
-                    ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContact.id),
-                    RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
 
-            ContactPhotoManager.getInstance(mContext).loadDirectoryPhoto(holder.photo,
-                    photoUri,
+            ContactPhotoManager.getInstance(mContext).loadThumbnail(holder.photo,
+                    rawContact.photoId,
                     /* darkTheme = */ false,
                     /* isCircular = */ true,
                     request);
-
             return view;
         }
 
diff --git a/src/com/android/contacts/editor/PickRawContactLoader.java b/src/com/android/contacts/editor/PickRawContactLoader.java
index 1939666..a4f1e5b 100644
--- a/src/com/android/contacts/editor/PickRawContactLoader.java
+++ b/src/com/android/contacts/editor/PickRawContactLoader.java
@@ -9,12 +9,16 @@
 import android.os.Parcelable;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.Profile;
 import android.provider.ContactsContract.RawContacts;
 
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.account.AccountType;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * Loader for the pick a raw contact to edit activity. Loads all raw contact metadata for the
@@ -43,6 +47,11 @@
     private static final int DISPLAY_NAME_PRIMARY = 4;
     private static final int DISPLAY_NAME_ALTERNATIVE = 5;
 
+    private static final String PHOTO_SELECTION_PREFIX =
+            ContactsContract.Data.RAW_CONTACT_ID + " IN (";
+    private static final String PHOTO_SELECTION_SUFFIX = ") AND " + ContactsContract.Data.MIMETYPE
+            + "=\"" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "\"";
+
     public PickRawContactLoader(Context context, Uri contactUri) {
         super(context);
         mContactUri = ensureIsContactUri(contactUri);
@@ -53,7 +62,7 @@
         final ContentResolver resolver = getContext().getContentResolver();
         // Get the id of the contact we're looking at.
         final Cursor contactCursor = resolver.query(
-                mContactUri, new String[]{Contacts._ID, Contacts.IS_USER_PROFILE}, null,
+                mContactUri, new String[] {Contacts._ID, Contacts.IS_USER_PROFILE}, null,
                 null, null);
 
         if (contactCursor == null) {
@@ -92,20 +101,51 @@
         }
 
         rawContactCursor.moveToPosition(-1);
+        final StringBuilder photoSelection = new StringBuilder(PHOTO_SELECTION_PREFIX);
+        final Map<Long, RawContact> rawContactMap = new HashMap<>();
         try {
             while (rawContactCursor.moveToNext()) {
                 RawContact rawContact = new RawContact();
                 rawContact.id = rawContactCursor.getLong(RAW_CONTACT_ID);
+                photoSelection.append(rawContact.id).append(',');
                 rawContact.displayName = rawContactCursor.getString(DISPLAY_NAME_PRIMARY);
                 rawContact.displayNameAlt = rawContactCursor.getString(DISPLAY_NAME_ALTERNATIVE);
                 rawContact.accountName = rawContactCursor.getString(ACCOUNT_NAME);
                 rawContact.accountType = rawContactCursor.getString(ACCOUNT_TYPE);
                 rawContact.accountDataSet = rawContactCursor.getString(DATA_SET);
                 result.rawContacts.add(rawContact);
+                rawContactMap.put(rawContact.id, rawContact);
             }
         } finally {
             rawContactCursor.close();
         }
+
+        // Remove the last ','
+        if (photoSelection.length() > 0) {
+            photoSelection.deleteCharAt(photoSelection.length() - 1);
+        }
+        photoSelection.append(PHOTO_SELECTION_SUFFIX);
+
+        final Uri dataUri = result.isUserProfile
+                ? Uri.withAppendedPath(Profile.CONTENT_URI, Data.CONTENT_URI.getPath())
+                : Data.CONTENT_URI;
+        final Cursor photoCursor = resolver.query(
+                dataUri,
+                new String[] {Data.RAW_CONTACT_ID, Contacts.Photo._ID},
+                photoSelection.toString(), null, null);
+
+        if (photoCursor != null) {
+            try {
+                photoCursor.moveToPosition(-1);
+                while (photoCursor.moveToNext()) {
+                    final long rawContactId = photoCursor.getLong(/* Data.RAW_CONTACT_ID */ 0);
+                    rawContactMap.get(rawContactId).photoId =
+                            photoCursor.getLong(/* PHOTO._ID */ 1);
+                }
+            } finally {
+                photoCursor.close();
+            }
+        }
         return result;
     }
 
@@ -225,6 +265,7 @@
                 };
 
         public long id;
+        public long photoId;
         public String displayName;
         public String displayNameAlt;
         public String accountName;
@@ -235,6 +276,7 @@
 
         private RawContact(Parcel in) {
             id = in.readLong();
+            photoId = in.readLong();
             displayName = in.readString();
             displayNameAlt = in.readString();
             accountName = in.readString();
@@ -250,6 +292,7 @@
         @Override
         public void writeToParcel(Parcel dest, int flags) {
             dest.writeLong(id);
+            dest.writeLong(photoId);
             dest.writeString(displayName);
             dest.writeString(displayNameAlt);
             dest.writeString(accountName);
