diff --git a/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java b/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java
index f32ee5b..74991b0 100644
--- a/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java
@@ -118,6 +118,12 @@
         final FragmentManager fm = getFragmentManager();
         final PickRawContactDialogFragment oldFragment = (PickRawContactDialogFragment)
                 fm.findFragmentByTag(TAG_RAW_CONTACTS_DIALOG);
+        if (oldFragment != null && oldFragment.getDialog() != null
+                && oldFragment.getDialog().isShowing()) {
+            // Just update the cursor without reshowing the dialog.
+            oldFragment.setCursor(mCursor);
+            return;
+        }
         final FragmentTransaction ft = fm.beginTransaction();
         if (oldFragment != null) {
             ft.remove(oldFragment);
diff --git a/src/com/android/contacts/common/ContactPhotoManager.java b/src/com/android/contacts/common/ContactPhotoManager.java
index 623b207..5ec1eea 100644
--- a/src/com/android/contacts/common/ContactPhotoManager.java
+++ b/src/com/android/contacts/common/ContactPhotoManager.java
@@ -850,7 +850,7 @@
                         isCircular, defaultProvider);
             } else {
                 loadPhotoByIdOrUri(view, Request.createFromUri(photoUri, requestedExtent,
-                        darkTheme, isCircular, defaultProvider));
+                        darkTheme, isCircular, defaultProvider, defaultImageRequest));
             }
         }
     }
@@ -937,7 +937,7 @@
             return false;
         }
 
-        if (holder.bytes == null) {
+        if (holder.bytes == null || holder.bytes.length == 0) {
             request.applyDefaultImage(view, request.mIsCircular);
             return holder.fresh;
         }
@@ -1622,30 +1622,41 @@
         private final boolean mDarkTheme;
         private final int mRequestedExtent;
         private final DefaultImageProvider mDefaultProvider;
+        private final DefaultImageRequest mDefaultRequest;
         /**
          * Whether or not the contact photo is to be displayed as a circle
          */
         private final boolean mIsCircular;
 
         private Request(long id, Uri uri, int requestedExtent, boolean darkTheme,
-                boolean isCircular, DefaultImageProvider defaultProvider) {
+                boolean isCircular, DefaultImageProvider defaultProvider,
+                DefaultImageRequest defaultRequest) {
             mId = id;
             mUri = uri;
             mDarkTheme = darkTheme;
             mIsCircular = isCircular;
             mRequestedExtent = requestedExtent;
             mDefaultProvider = defaultProvider;
+            mDefaultRequest = defaultRequest;
         }
 
         public static Request createFromThumbnailId(long id, boolean darkTheme, boolean isCircular,
                 DefaultImageProvider defaultProvider) {
-            return new Request(id, null /* no URI */, -1, darkTheme, isCircular, defaultProvider);
+            return new Request(id, null /* no URI */, -1, darkTheme, isCircular, defaultProvider,
+                    /* defaultRequest */ null);
         }
 
         public static Request createFromUri(Uri uri, int requestedExtent, boolean darkTheme,
                 boolean isCircular, DefaultImageProvider defaultProvider) {
+            return createFromUri(uri, requestedExtent, darkTheme, isCircular, defaultProvider,
+                    /* defaultRequest */ null);
+        }
+
+        public static Request createFromUri(Uri uri, int requestedExtent, boolean darkTheme,
+                boolean isCircular, DefaultImageProvider defaultProvider,
+                DefaultImageRequest defaultRequest) {
             return new Request(0 /* no ID */, uri, requestedExtent, darkTheme, isCircular,
-                    defaultProvider);
+                    defaultProvider, defaultRequest);
         }
 
         public boolean isUriRequest() {
@@ -1705,14 +1716,18 @@
         public void applyDefaultImage(ImageView view, boolean isCircular) {
             final DefaultImageRequest request;
 
-            if (isCircular) {
-                request = ContactPhotoManager.isBusinessContactUri(mUri)
-                        ? DefaultImageRequest.EMPTY_CIRCULAR_BUSINESS_IMAGE_REQUEST
-                        : DefaultImageRequest.EMPTY_CIRCULAR_DEFAULT_IMAGE_REQUEST;
+            if (mDefaultRequest == null) {
+                if (isCircular) {
+                    request = ContactPhotoManager.isBusinessContactUri(mUri)
+                            ? DefaultImageRequest.EMPTY_CIRCULAR_BUSINESS_IMAGE_REQUEST
+                            : DefaultImageRequest.EMPTY_CIRCULAR_DEFAULT_IMAGE_REQUEST;
+                } else {
+                    request = ContactPhotoManager.isBusinessContactUri(mUri)
+                            ? DefaultImageRequest.EMPTY_DEFAULT_BUSINESS_IMAGE_REQUEST
+                            : DefaultImageRequest.EMPTY_DEFAULT_IMAGE_REQUEST;
+                }
             } else {
-                request = ContactPhotoManager.isBusinessContactUri(mUri)
-                        ? DefaultImageRequest.EMPTY_DEFAULT_BUSINESS_IMAGE_REQUEST
-                        : DefaultImageRequest.EMPTY_DEFAULT_IMAGE_REQUEST;
+                request = mDefaultRequest;
             }
             mDefaultProvider.applyDefaultImage(view, mRequestedExtent, mDarkTheme, request);
         }
diff --git a/src/com/android/contacts/common/database/SimContactDao.java b/src/com/android/contacts/common/database/SimContactDao.java
index f9fb4e8..9ce7970 100644
--- a/src/com/android/contacts/common/database/SimContactDao.java
+++ b/src/com/android/contacts/common/database/SimContactDao.java
@@ -52,7 +52,8 @@
         this(context.getContentResolver());
     }
 
-    private SimContactDao(ContentResolver resolver) {
+    @VisibleForTesting
+    public SimContactDao(ContentResolver resolver) {
         mResolver = resolver;
     }
 
diff --git a/src/com/android/contacts/editor/EventFieldEditorView.java b/src/com/android/contacts/editor/EventFieldEditorView.java
index 059208e..8afcc0a 100644
--- a/src/com/android/contacts/editor/EventFieldEditorView.java
+++ b/src/com/android/contacts/editor/EventFieldEditorView.java
@@ -173,7 +173,8 @@
 
         if (!isYearOptional && !TextUtils.isEmpty(oldValue)) {
             final ParsePosition position = new ParsePosition(0);
-            final Date date2 = kind.dateFormatWithoutYear.parse(oldValue, position);
+            final Date date2 = kind.dateFormatWithoutYear == null
+                    ? null : kind.dateFormatWithoutYear.parse(oldValue, position);
 
             // Don't understand the date, lets not change it
             if (date2 == null) return;
@@ -183,7 +184,11 @@
             calendar.set(defaultYear, calendar.get(Calendar.MONTH),
                     calendar.get(Calendar.DAY_OF_MONTH), CommonDateUtils.DEFAULT_HOUR, 0, 0);
 
-            onFieldChanged(column, kind.dateFormatWithYear.format(calendar.getTime()));
+            final String formattedDate = kind.dateFormatWithYear == null
+                    ? null : kind.dateFormatWithYear.format(calendar.getTime());
+            if (formattedDate == null) return;
+
+            onFieldChanged(column, formattedDate);
             rebuildDateView();
         }
     }
@@ -241,10 +246,14 @@
 
                 final String resultString;
                 if (year == 0) {
-                    resultString = kind.dateFormatWithoutYear.format(outCalendar.getTime());
+                    resultString = kind.dateFormatWithoutYear == null
+                            ? null : kind.dateFormatWithoutYear.format(outCalendar.getTime());
                 } else {
-                    resultString = kind.dateFormatWithYear.format(outCalendar.getTime());
+                    resultString = kind.dateFormatWithYear == null
+                            ? null : kind.dateFormatWithYear.format(outCalendar.getTime());
                 }
+                if (resultString == null) return;
+
                 onFieldChanged(column, resultString);
                 rebuildDateView();
             }
diff --git a/src/com/android/contacts/editor/PickRawContactDialogFragment.java b/src/com/android/contacts/editor/PickRawContactDialogFragment.java
index 20e8f35..b9800de 100644
--- a/src/com/android/contacts/editor/PickRawContactDialogFragment.java
+++ b/src/com/android/contacts/editor/PickRawContactDialogFragment.java
@@ -3,12 +3,14 @@
 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.content.Intent;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
+import android.provider.ContactsContract.RawContacts;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -82,8 +84,11 @@
                     displayName, String.valueOf(rawContactId), /* isCircular = */ true);
             final ImageView photoView = (ImageView) view.findViewById(
                     R.id.photo);
+            final Uri photoUri = Uri.withAppendedPath(
+                    ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
+                    RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
             ContactPhotoManager.getInstance(mContext).loadDirectoryPhoto(photoView,
-                    ContactPhotoManager.getDefaultAvatarUriForContact(request),
+                    photoUri,
                     /* darkTheme = */ false,
                     /* isCircular = */ true,
                     request);
@@ -105,6 +110,7 @@
     private Cursor mCursor;
     // Uri for the whole Contact.
     private Uri mUri;
+    private CursorAdapter mAdapter;
     private MaterialPalette mMaterialPalette;
 
     public static PickRawContactDialogFragment getInstance(Uri uri, Cursor cursor,
@@ -119,12 +125,12 @@
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
-        final CursorAdapter adapter = new RawContactAccountListAdapter(getContext(), mCursor);
+        mAdapter = new RawContactAccountListAdapter(getContext(), mCursor);
         builder.setTitle(R.string.contact_editor_pick_raw_contact_dialog_title);
-        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
+        builder.setAdapter(mAdapter, new DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int which) {
-                final long rawContactId = adapter.getItemId(which);
+                final long rawContactId = mAdapter.getItemId(which);
                 final Intent intent = EditorIntents.createEditContactIntentForRawContact(
                         getActivity(), mUri, rawContactId, mMaterialPalette);
                 intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
@@ -146,7 +152,10 @@
         mUri = uri;
     }
 
-    private void setCursor(Cursor cursor) {
+    public void setCursor(Cursor cursor) {
+        if (mAdapter != null) {
+            mAdapter.swapCursor(cursor);
+        }
         mCursor = cursor;
     }
 
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index d3c7535..038a8de 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -554,7 +554,8 @@
             final String mimeType = dataKind.mimeType;
 
             // Skip psuedo mime types
-            if (DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(mimeType)) {
+            if (DataKind.PSEUDO_MIME_TYPE_NAME.equals(mimeType) ||
+                    DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(mimeType)) {
                 vlog("parse: " + i + " " + dataKind.mimeType + " dropped pseudo type");
                 continue;
             }
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 6f50aab..472ee1c 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -98,14 +98,15 @@
         android:label="Contacts app tests">
     </instrumentation>
 
-    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-        android:targetPackage="com.android.contacts"
-        android:label="Contacts app tests">
-    </instrumentation>
-
     <instrumentation android:name="com.android.contacts.ContactsLaunchPerformance"
         android:targetPackage="com.android.contacts"
         android:label="Contacts launch performance">
     </instrumentation>
 
+    <instrumentation
+        android:name="com.android.contacts.RunMethodInstrumentation"
+        android:targetPackage="com.android.contacts"
+        android:label="Run Contacts Method">
+    </instrumentation>
+
 </manifest>
diff --git a/tests/src/com/android/contacts/RunMethodInstrumentation.java b/tests/src/com/android/contacts/RunMethodInstrumentation.java
new file mode 100644
index 0000000..77f36ed
--- /dev/null
+++ b/tests/src/com/android/contacts/RunMethodInstrumentation.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.contacts;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.test.InstrumentationRegistry;
+import android.util.Log;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Runs a single static method specified via the arguments.
+ *
+ * Useful for manipulating the app state during manual testing.
+ *
+ * Valid signatures: void f(Context, Bundle), void f(Context), void f()
+ *
+ * Example usage:
+ * $ adb shell am instrument -e class com.android.contacts.Foo -e method bar -e someArg someValue\
+ *   -w com.google.android.contacts.tests/com.android.contacts.RunMethodInstrumentation
+ */
+public class RunMethodInstrumentation extends Instrumentation {
+
+    private static final String TAG = "RunMethod";
+
+    private String className;
+    private String methodName;
+    private Bundle args;
+
+    @Override
+    public void onCreate(Bundle arguments) {
+        super.onCreate(arguments);
+
+        InstrumentationRegistry.registerInstance(this, arguments);
+
+        className = arguments.getString("class");
+        methodName = arguments.getString("method");
+        args = arguments;
+
+        Log.d(TAG, "Running " + className + "." + methodName);
+        Log.d(TAG, "args=" + args);
+
+        start();
+    }
+
+    public void onStart() {
+        Log.d(TAG, "onStart");
+        super.onStart();
+
+        if (className == null || methodName == null) {
+            Log.e(TAG, "Must supply class and method");
+            finish(Activity.RESULT_CANCELED, null);
+            return;
+        }
+
+        try {
+            invokeMethod(args, className, methodName);
+        } catch (Exception e) {
+            e.printStackTrace();
+            finish(Activity.RESULT_CANCELED, null);
+            return;
+        }
+        // Maybe should let the method determine when this is called.
+        finish(Activity.RESULT_OK, null);
+    }
+
+    private void invokeMethod(Bundle args, String className, String methodName) throws
+            InvocationTargetException, IllegalAccessException, NoSuchMethodException,
+            ClassNotFoundException {
+        Context context;
+        Class<?> clazz = null;
+        try {
+            // Try to load from App's code
+            clazz = getTargetContext().getClassLoader().loadClass(className);
+            context = getTargetContext();
+        } catch (Exception e) {
+            // Try to load from Test App's code
+            clazz = getContext().getClassLoader().loadClass(className);
+            context = getContext();
+        }
+
+        Object[] methodArgs = null;
+        Method method = null;
+
+        try {
+            method = clazz.getMethod(methodName, Context.class, Bundle.class);
+            methodArgs = new Object[] { context, args };
+        } catch (NoSuchMethodException e) {
+        }
+
+        if (method != null) {
+            method.invoke(clazz, methodArgs);
+            return;
+        }
+
+        try {
+            method = clazz.getMethod(methodName, Context.class);
+            methodArgs = new Object[] { context };
+        } catch (NoSuchMethodException e) {
+        }
+
+        if (method != null) {
+            method.invoke(clazz, methodArgs);
+            return;
+        }
+
+        method = clazz.getMethod(methodName);
+        method.invoke(clazz);
+    }
+}
diff --git a/tests/src/com/android/contacts/tests/AccountsTestHelper.java b/tests/src/com/android/contacts/tests/AccountsTestHelper.java
index be826f7..11476b3 100644
--- a/tests/src/com/android/contacts/tests/AccountsTestHelper.java
+++ b/tests/src/com/android/contacts/tests/AccountsTestHelper.java
@@ -20,10 +20,12 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.os.Build;
+import android.os.Bundle;
 import android.provider.ContactsContract.RawContacts;
 import android.support.annotation.NonNull;
 import android.support.annotation.RequiresApi;
 import android.support.test.InstrumentationRegistry;
+import android.util.Log;
 
 import com.android.contacts.common.model.account.AccountWithDataSet;
 
@@ -32,8 +34,12 @@
 
 @SuppressWarnings("MissingPermission")
 public class AccountsTestHelper {
+    private static final String TAG = "AccountsTestHelper";
+
     public static final String TEST_ACCOUNT_TYPE = "com.android.contacts.tests.testauth.basic";
 
+    public static final String EXTRA_ACCOUNT_NAME = "accountName";
+
     private final Context mContext;
     private final AccountManager mAccountManager;
     private final ContentResolver mResolver;
@@ -103,4 +109,32 @@
     private AccountWithDataSet convertTestAccount() {
         return new AccountWithDataSet(mTestAccount.name, mTestAccount.type, null);
     }
+
+    /**
+     * Invoke from adb using the RunMethodInstrumentation:
+     * $ adb shell am instrument -e class com.android.contacts.tests.AccountTestHelper\
+     *   -e method addTestAccount -e accountName fooAccount\
+     *   -w com.google.android.contacts.tests/com.android.contacts.RunMethodInstrumentation
+     */
+    public static void addTestAccount(Context context, Bundle args) {
+        final String accountName = args.getString(EXTRA_ACCOUNT_NAME);
+        if (accountName == null) {
+            Log.e(TAG, "args must contain extra " + EXTRA_ACCOUNT_NAME);
+            return;
+        }
+
+        new AccountsTestHelper(context).addTestAccount(accountName);
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
+    public static void removeTestAccount(Context context, Bundle args) {
+        final String accountName = args.getString(EXTRA_ACCOUNT_NAME);
+        if (accountName == null) {
+            Log.e(TAG, "args must contain extra " + EXTRA_ACCOUNT_NAME);
+            return;
+        }
+
+        AccountWithDataSet account = new AccountWithDataSet(accountName, TEST_ACCOUNT_TYPE, null);
+        new AccountsTestHelper(context).removeTestAccount(account);
+    }
 }
