diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index aa58bae..871793e 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -3132,7 +3132,7 @@
         long postCleanupInsertedStreamId = insertedStreamItemId;
         final SQLiteDatabase db = mDbHelper.get().getWritableDatabase();
         Cursor c = db.query(Tables.STREAM_ITEMS, new String[] {StreamItems._ID},
-                StreamItems.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(rawContactId)},
+                StreamItems.RAW_CONTACT_ID + "=?", new String[] {String.valueOf(rawContactId)},
                 null, null, StreamItems.TIMESTAMP + " DESC, " + StreamItems._ID + " DESC");
         try {
             int streamItemCount = c.getCount();
@@ -3906,8 +3906,8 @@
         final SQLiteDatabase db = mDbHelper.get().getReadableDatabase();
         Cursor c = db.query(Tables.RAW_CONTACTS, Projections.LITERAL_ONE,
                 RawContactsColumns.CONCRETE_ID + "=? AND " +
-                RawContactsColumns.ACCOUNT_ID + "=" + Clauses.LOCAL_ACCOUNT_ID,
-                new String[]{String.valueOf(rawContactId)}, null, null, null);
+                        RawContactsColumns.ACCOUNT_ID + "=" + Clauses.LOCAL_ACCOUNT_ID,
+                new String[] {String.valueOf(rawContactId)}, null, null, null);
         try {
             return c.getCount() > 0;
         } finally {
@@ -5559,7 +5559,7 @@
     }
 
     /**
-     * A helper function to query work CP2. It returns null when work profile is not availabe.
+     * A helper function to query work CP2. It returns null when work profile is not available.
      */
     @VisibleForTesting
     protected Cursor queryCorpContactsProvider(Uri localUri, String[] projection,
@@ -5567,16 +5567,20 @@
             CancellationSignal cancellationSignal) {
         final int corpUserId = UserUtils.getCorpUserId(getContext());
         if (corpUserId < 0) {
-            return null;
+            return createEmptyCursor(localUri, projection);
         }
         // Make sure authority is CP2 not other providers
         if (!ContactsContract.AUTHORITY.equals(localUri.getAuthority())) {
             Log.w(TAG, "Invalid authority: " + localUri.getAuthority());
-            return null;
+            return createEmptyCursor(localUri, projection);
         }
         final Uri remoteUri = maybeAddUserId(localUri, corpUserId);
-        return getContext().getContentResolver().query(remoteUri, projection, selection,
+        Cursor cursor = getContext().getContentResolver().query(remoteUri, projection, selection,
                 selectionArgs, sortOrder, cancellationSignal);
+        if (cursor == null) {
+            return createEmptyCursor(localUri, projection);
+        }
+        return cursor;
     }
 
     private Cursor addSnippetExtrasToCursor(Uri uri, Cursor cursor) {
@@ -5847,41 +5851,6 @@
                         snippetDeferred);
                 break;
             }
-
-            case CONTACTS_FILTER_ENTERPRISE: {
-                String filterParam = "";
-                if (uri.getPathSegments().size() > 2) {
-                    filterParam = uri.getLastPathSegment();
-                }
-                final String directory = getQueryParameter(uri,
-                        ContactsContract.DIRECTORY_PARAM_KEY);
-                if (TextUtils.isEmpty(directory)) {
-                    throw new IllegalArgumentException("Directory id cannot be null");
-                }
-                final long dirId = Long.parseLong(directory);
-                final boolean isCorpDirectory = Directory.isEnterpriseDirectoryId(dirId);
-                final Uri localUri = rewriteQueryParameters(
-                        Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(filterParam)),
-                        uri, isCorpDirectory);
-                // Redirect query to corp CP2 if it uses corp directory, otherwise just call
-                // queryDirectoryIfNecessary directly.
-                if (isCorpDirectory) {
-                    final String[] outputProjection = (projection != null) ? projection
-                            : sContactsProjectionWithSnippetMap.getColumnNames();
-                    final int corpUserId = UserUtils.getCorpUserId(getContext());
-                    if (corpUserId < 0) {
-                        // No Corp user or policy not allowed, return empty cursor
-                        return new MatrixCursor(outputProjection);
-                    }
-                    final Cursor cursor = queryCorpContacts(localUri, projection, selection,
-                            selectionArgs, sortOrder, Contacts._ID, dirId, cancellationSignal);
-                    return (cursor != null) ? cursor : new MatrixCursor(outputProjection);
-                } else {
-                    return queryDirectoryIfNecessary(localUri, projection, selection, selectionArgs,
-                            sortOrder, cancellationSignal);
-                }
-            }
-
             case CONTACTS_STREQUENT_FILTER:
             case CONTACTS_STREQUENT: {
                 // Basically the resultant SQL should look like this:
@@ -6361,7 +6330,8 @@
             }
             case PHONES_FILTER_ENTERPRISE:
             case CALLABLES_FILTER_ENTERPRISE:
-            case EMAILS_FILTER_ENTERPRISE: {
+            case EMAILS_FILTER_ENTERPRISE:
+            case CONTACTS_FILTER_ENTERPRISE: {
                 Uri initialUri = null;
                 String contactIdString = null;
                 if (match == PHONES_FILTER_ENTERPRISE) {
@@ -6373,9 +6343,12 @@
                 } else if (match == EMAILS_FILTER_ENTERPRISE) {
                     initialUri = Email.CONTENT_FILTER_URI;
                     contactIdString = Email.CONTACT_ID;
+                } else if (match == CONTACTS_FILTER_ENTERPRISE) {
+                    initialUri = Contacts.CONTENT_FILTER_URI;
+                    contactIdString = Contacts._ID;
                 }
-                return queryCallableEnterprise(uri, projection, selection, selectionArgs,
-                        sortOrder, initialUri, contactIdString, cancellationSignal);
+                return queryFilterEnterprise(uri, projection, selection, selectionArgs, sortOrder,
+                        cancellationSignal, initialUri, contactIdString);
             }
             case EMAILS: {
                 setTablesAndProjectionMapForData(qb, uri, projection, false);
@@ -6940,11 +6913,6 @@
                 final Cursor cursor = queryCorpContactsProvider(
                         RawContactsEntity.CONTENT_URI, projection, selection, selectionArgs,
                         sortOrder, cancellationSignal);
-                if (cursor == null) {
-                    final String[] outputProjection = (projection != null) ? projection
-                            : sRawEntityProjectionMap.getColumnNames();
-                    return new MatrixCursor(outputProjection);
-                }
                 return cursor;
             }
 
@@ -6999,12 +6967,6 @@
                             ContentUris.withAppendedId(Directory.CONTENT_URI,
                             inputDirectoryId - Directory.ENTERPRISE_DIRECTORY_ID_BASE),
                             projection, selection, selectionArgs, sortOrder, cancellationSignal);
-                    if (cursor == null) {
-                        // Work profile is not available yet
-                        final String[] outputProjection = (projection != null) ? projection
-                                : sDirectoryProjectionMap.getColumnNames();
-                        return new MatrixCursor(outputProjection);
-                    }
                     return rewriteCorpDirectories(cursor);
                 } else {
                     // As it is not an enterprise directory id, fall back to original API
@@ -7102,42 +7064,6 @@
     }
 
     /**
-     * A helper function to rewrites all parameters from source uri to target uri.
-     * It also helps you to rebase work directory id to regular directory id.
-     * This function also checks if parameters in source uri is valid.
-     * If isCorpDirectory is true, it cannot accept regular directory id in source parameters.
-     * If isCorpDirectory is false, it cannot accept work directory id in source parameters.
-     * @param targetUri A target uri that the parameters from source uri is to be copied.
-     * @param sourceUri A source uri that parameters in URI will be copied to target uri.
-     * @param isCorpDirectory Indicate if sourceUri contains work directory id.
-     * @return An target uri that contains all parameters in source uri.
-     */
-    private static Uri rewriteQueryParameters(Uri targetUri, Uri sourceUri,
-            boolean isCorpDirectory) {
-        final Uri.Builder builder = targetUri.buildUpon();
-        // Copy all parameters to new uri
-        final Set<String> names = sourceUri.getQueryParameterNames();
-        for(String name : names) {
-            final List<String> values = sourceUri.getQueryParameters(name);
-            for (String value : values) {
-                if (name.equals(ContactsContract.DIRECTORY_PARAM_KEY)) {
-                    final long workDirectoryId = Long.parseLong(value);
-                    if (isCorpDirectory != Directory.isEnterpriseDirectoryId(workDirectoryId)) {
-                        throw new IllegalArgumentException("Invalid directory Id");
-                    }
-                    if (isCorpDirectory) {
-                        // Change it back to regular directory id
-                        value = String.valueOf(workDirectoryId
-                                - Directory.ENTERPRISE_DIRECTORY_ID_BASE);
-                    }
-                }
-                builder.appendQueryParameter(name, value);
-            }
-        }
-        return builder.build();
-    }
-
-    /**
      * Handles {@link Directory#ENTERPRISE_CONTENT_URI}.
      */
     private Cursor queryMergedDirectories(Uri uri, String[] projection, String selection,
@@ -7258,9 +7184,6 @@
         int columnIdIndex = getContactIdColumnIndex(workProjection, contactIdColumnName);
         final Cursor managedCursor = queryCorpContactsProvider(localUri, workProjection,
                 selection, selectionArgs, sortOrder, cancellationSignal);
-        if (managedCursor == null) {
-            return null;
-        }
         if (projection == null) {
             // As projection is null and we didn't append contact id in projection, we need to fix
             // contact id column index.
@@ -7339,99 +7262,58 @@
         return local;
     }
 
-    /**
-     * Handles {@link PhoneLookup#ENTERPRISE_CONTENT_FILTER_URI}.
-     */
-    // TODO Test
-    private Cursor queryPhoneLookupEnterprise(final Uri uri, String[] projection, String selection,
-            String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal) {
-        // Unlike PHONE_LOOKUP, only decode once here even for SIP address. See bug 25900607.
-        final String phoneNumber = uri.getLastPathSegment();
-        final boolean isSipAddress = uri.getBooleanQueryParameter(
-                PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, false);
-        final Uri.Builder builder = PhoneLookup.CONTENT_FILTER_URI
-                .buildUpon()
-                .appendPath(phoneNumber)
-                .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS,
-                        String.valueOf(isSipAddress));
-        final String directory = getQueryParameter(uri, ContactsContract.DIRECTORY_PARAM_KEY);
-        if (!TextUtils.isEmpty(directory)) {
-            final long directoryId = Long.parseLong(directory);
-            if (Directory.isEnterpriseDirectoryId(directoryId)) {
-                // If it has enterprise directory, then query queryCorpContacts directory with
-                // regular directory id.
-                builder.appendQueryParameter(
-                        ContactsContract.DIRECTORY_PARAM_KEY,
-                        String.valueOf(directoryId - Directory.ENTERPRISE_DIRECTORY_ID_BASE));
-                final Cursor cursor = queryCorpContacts(builder.build(), projection, null, null,
-                        null, isSipAddress ? Data.CONTACT_ID : PhoneLookup._ID, directoryId,
-                        cancellationSignal);
-                if (cursor == null) {
-                    final String[] outputProjection = (projection != null) ? projection
-                            : sPhoneLookupProjectionMap.getColumnNames();
-                    return new MatrixCursor(outputProjection);
-                }
-                return cursor;
-            }
-            // Regular directory id
-            builder.appendQueryParameter(
-                    ContactsContract.DIRECTORY_PARAM_KEY,
-                    String.valueOf(directoryId));
-            return queryDirectoryIfNecessary(builder.build(), projection, selection,
-                    selectionArgs, sortOrder, cancellationSignal);
-        }
-        // No directory
-        return queryCorpLookupIfNecessary(builder.build(), projection, null, null, null,
-                isSipAddress ? Data.CONTACT_ID : PhoneLookup._ID, cancellationSignal);
-    }
-
     private static final Set<String> MODIFIED_KEY_SET_FOR_ENTERPRISE_FILTER =
             new ArraySet<String>(Arrays.asList(new String[] {
                 ContactsContract.DIRECTORY_PARAM_KEY
             }));
 
-
     /**
-     * Redirect CALLABLES_FILTER_ENTERPRISE / PHONES_FILTER_ENTERPRISE / EMAIL_FILTER_ENTERPRISE
-       into personal/work ContactsProvider2.
+     * Redirect CALLABLES_FILTER_ENTERPRISE / PHONES_FILTER_ENTERPRISE / EMAIL_FILTER_ENTERPRISE /
+     * CONTACTS_FILTER_ENTERPRISE into personal/work ContactsProvider2.
      */
-    private Cursor queryCallableEnterprise(Uri uri, String[] projection, String selection,
-            String[] selectionArgs, String sortOrder, Uri initialUri, String contactIdString,
-            CancellationSignal cancellationSignal) {
+    private Cursor queryFilterEnterprise(Uri uri, String[] projection, String selection,
+                                         String[] selectionArgs, String sortOrder,
+                                         CancellationSignal cancellationSignal,
+                                         Uri initialUri, String contactIdString) {
         final String directory = getQueryParameter(uri, ContactsContract.DIRECTORY_PARAM_KEY);
         if (directory == null) {
             throw new IllegalArgumentException("Directory id missing in URI: " + uri);
         }
-
-        final String filterParam = uri.getPathSegments().size() > 3 ? uri.getLastPathSegment() : "";
         final long directoryId = Long.parseLong(directory);
-        final Uri.Builder builder = initialUri.buildUpon()
-                .appendPath(filterParam);
-        addQueryParametersFromUri(builder, uri, MODIFIED_KEY_SET_FOR_ENTERPRISE_FILTER);
-        // If the query contains remote directory id, it should query work CP2 or directory
+        final Uri localUri = convertToLocalUri(uri, initialUri);
         // provider directory.
         if (Directory.isEnterpriseDirectoryId(directoryId)) {
-            builder.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
-                    String.valueOf(directoryId - Directory.ENTERPRISE_DIRECTORY_ID_BASE));
-            final Cursor corpCursor = queryCorpContacts(builder.build(), projection, selection,
+            return queryCorpContacts(localUri, projection, selection,
                     selectionArgs, sortOrder, contactIdString, directoryId, cancellationSignal);
-            if (corpCursor == null) {
-                // No Corp user or policy not allowed, return empty cursor
-                final String[] outputProjection = (projection != null) ? projection
-                        : sDistinctDataProjectionMap.getColumnNames();
-                return new MatrixCursor(outputProjection);
-            }
-            return corpCursor;
         } else {
-            builder.appendQueryParameter(
-                    ContactsContract.DIRECTORY_PARAM_KEY,
-                    String.valueOf(directoryId));
-            return queryDirectoryIfNecessary(builder.build(), projection, selection, selectionArgs,
+            return queryDirectoryIfNecessary(localUri, projection, selection, selectionArgs,
                     sortOrder, cancellationSignal);
         }
     }
 
     @VisibleForTesting
+    public static Uri convertToLocalUri(Uri uri, Uri initialUri) {
+        final String filterParam =
+                uri.getPathSegments().size() > initialUri.getPathSegments().size()
+                        ? uri.getLastPathSegment()
+                        : "";
+        final Uri.Builder builder = initialUri.buildUpon().appendPath(filterParam);
+        addQueryParametersFromUri(builder, uri, MODIFIED_KEY_SET_FOR_ENTERPRISE_FILTER);
+        final String directory = getQueryParameter(uri, ContactsContract.DIRECTORY_PARAM_KEY);
+        if (!TextUtils.isEmpty(directory)) {
+            final long directoryId = Long.parseLong(directory);
+            if (Directory.isEnterpriseDirectoryId(directoryId)) {
+                builder.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
+                        String.valueOf(directoryId - Directory.ENTERPRISE_DIRECTORY_ID_BASE));
+            } else {
+                builder.appendQueryParameter(
+                        ContactsContract.DIRECTORY_PARAM_KEY,
+                        String.valueOf(directoryId));
+            }
+        }
+        return builder.build();
+    }
+
     protected static final Uri.Builder addQueryParametersFromUri(Uri.Builder builder, Uri uri,
             Set<String> ignoredKeys) {
         Set<String> keys = uri.getQueryParameterNames();
@@ -7446,48 +7328,54 @@
     }
 
     /**
-     * Handles {@link Email#ENTERPRISE_CONTENT_LOOKUP_URI}.
+     * Handles {@link PhoneLookup#ENTERPRISE_CONTENT_FILTER_URI}.
      */
+    // TODO Test
+    private Cursor queryPhoneLookupEnterprise(final Uri uri, String[] projection, String selection,
+                                              String[] selectionArgs, String sortOrder,
+                                              CancellationSignal cancellationSignal) {
+        // Unlike PHONE_LOOKUP, only decode once here even for SIP address. See bug 25900607.
+        final boolean isSipAddress = uri.getBooleanQueryParameter(
+                PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, false);
+        final String columnIdName = isSipAddress ? Data.CONTACT_ID : PhoneLookup._ID;
+        return queryLookupEnterprise(uri, projection, selection, selectionArgs, sortOrder,
+                cancellationSignal, PhoneLookup.CONTENT_FILTER_URI, columnIdName);
+    }
+
     private Cursor queryEmailsLookupEnterprise(Uri uri, String[] projection, String selection,
-            String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal) {
-        final String email = uri.getLastPathSegment();
-        final Uri.Builder builder = Email.CONTENT_LOOKUP_URI
-                .buildUpon()
-                .appendPath(email);
+                                             String[] selectionArgs, String sortOrder,
+                                             CancellationSignal cancellationSignal) {
+        return queryLookupEnterprise(uri, projection, selection, selectionArgs, sortOrder,
+                cancellationSignal, Email.CONTENT_LOOKUP_URI, Email.CONTACT_ID);
+    }
+
+    private Cursor queryLookupEnterprise(Uri uri, String[] projection, String selection,
+                                         String[] selectionArgs, String sortOrder,
+                                         CancellationSignal cancellationSignal,
+                                         Uri originalUri, String columnIdName) {
+        final Uri localUri = convertToLocalUri(uri, originalUri);
         final String directory = getQueryParameter(uri, ContactsContract.DIRECTORY_PARAM_KEY);
         if (!TextUtils.isEmpty(directory)) {
             final long directoryId = Long.parseLong(directory);
             if (Directory.isEnterpriseDirectoryId(directoryId)) {
                 // If it has enterprise directory, then query queryCorpContacts directory with
                 // regular directory id.
-                builder.appendQueryParameter(
-                        ContactsContract.DIRECTORY_PARAM_KEY,
-                        String.valueOf(directoryId - Directory.ENTERPRISE_DIRECTORY_ID_BASE));
-                final Cursor corpCursor =
-                        queryCorpContacts(builder.build(), projection, selection, selectionArgs,
-                        sortOrder, Email.CONTACT_ID, directoryId, cancellationSignal);
-                if (corpCursor == null) {
-                    final String[] outputProjection = (projection != null) ? projection
-                            : sDataProjectionMap.getColumnNames();
-                    return new MatrixCursor(outputProjection);
-                }
-                return corpCursor;
+                return queryCorpContacts(localUri, projection, selection, selectionArgs,
+                        sortOrder, columnIdName, directoryId, cancellationSignal);
             }
-            // Regular directory id
-            builder.appendQueryParameter(
-                    ContactsContract.DIRECTORY_PARAM_KEY,
-                    String.valueOf(directoryId));
-
-            return queryDirectoryIfNecessary(builder.build(), projection, selection,
+            return queryDirectoryIfNecessary(localUri, projection, selection,
                     selectionArgs, sortOrder, cancellationSignal);
         }
         // No directory
-        return queryCorpLookupIfNecessary(builder.build(), projection, selection, selectionArgs,
-                sortOrder, Email.CONTACT_ID, cancellationSignal);
+        return queryCorpLookupIfNecessary(localUri, projection, selection, selectionArgs,
+                sortOrder, columnIdName, cancellationSignal);
     }
 
     // TODO: Add test case for this
-    static Cursor rewriteCorpDirectories(Cursor original) {
+    static Cursor rewriteCorpDirectories(@Nullable Cursor original) {
+        if (original == null) {
+            return null;
+        }
         final String[] projection = original.getColumnNames();
         final MatrixCursor ret = new MatrixCursor(projection);
         original.moveToPosition(-1);
@@ -9349,12 +9237,18 @@
             case PROFILE_RAW_CONTACTS_ID:
                 return sRawContactsProjectionMap.getColumnNames();
 
+            case RAW_CONTACT_ENTITIES:
+            case RAW_CONTACT_ENTITIES_CORP:
+                return sRawEntityProjectionMap.getColumnNames();
+
             case DATA_ID:
             case PHONES:
             case PHONES_ENTERPRISE:
             case PHONES_ID:
             case EMAILS:
             case EMAILS_ID:
+            case EMAILS_LOOKUP:
+            case EMAILS_LOOKUP_ENTERPRISE:
             case POSTALS:
             case POSTALS_ID:
             case PROFILE_DATA:
@@ -9380,6 +9274,13 @@
             case CONTACTS_FILTER_ENTERPRISE:
                 return sContactsProjectionWithSnippetMap.getColumnNames();
 
+            case CALLABLES_FILTER:
+            case CALLABLES_FILTER_ENTERPRISE:
+            case PHONES_FILTER:
+            case PHONES_FILTER_ENTERPRISE:
+            case EMAILS_FILTER:
+            case EMAILS_FILTER_ENTERPRISE:
+                return sDistinctDataProjectionMap.getColumnNames();
             default:
                 return null;
         }
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index d4418c4..65b8f1e 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -128,6 +128,53 @@
 
     private static final String TAG = ContactsProvider2Test.class.getSimpleName();
 
+    public void testConvertEnterpriseUriWithEnterpriseDirectoryToLocalUri() {
+        String phoneNumber = "886";
+        String directory = String.valueOf(Directory.ENTERPRISE_DEFAULT);
+        boolean isSip = true;
+        Uri enterpriseUri = Phone.ENTERPRISE_CONTENT_URI.buildUpon().appendPath(phoneNumber)
+                .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, directory)
+                .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS,
+                        String.valueOf(isSip)).build();
+        Uri localUri = ContactsProvider2.convertToLocalUri(enterpriseUri, Phone.CONTENT_URI);
+        Uri expectedUri = Phone.CONTENT_URI.buildUpon().appendPath(phoneNumber)
+                .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
+                        String.valueOf(Directory.DEFAULT))
+                .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS,
+                        String.valueOf(isSip)).build();
+        assertUriEquals(expectedUri, localUri);
+    }
+
+    public void testConvertEnterpriseUriWithPersonalDirectoryToLocalUri() {
+        String phoneNumber = "886";
+        String directory = String.valueOf(Directory.DEFAULT);
+        boolean isSip = true;
+        Uri enterpriseUri = Phone.ENTERPRISE_CONTENT_URI.buildUpon().appendPath(phoneNumber)
+                .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, directory)
+                .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS,
+                        String.valueOf(isSip)).build();
+        Uri localUri = ContactsProvider2.convertToLocalUri(enterpriseUri, Phone.CONTENT_URI);
+        Uri expectedUri = Phone.CONTENT_URI.buildUpon().appendPath(phoneNumber)
+                .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
+                        String.valueOf(Directory.DEFAULT))
+                .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS,
+                        String.valueOf(isSip)).build();
+        assertUriEquals(expectedUri, localUri);
+    }
+
+    public void testConvertEnterpriseUriWithoutDirectoryToLocalUri() {
+        String phoneNumber = "886";
+        boolean isSip = true;
+        Uri enterpriseUri = Phone.ENTERPRISE_CONTENT_URI.buildUpon().appendPath(phoneNumber)
+                .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS,
+                        String.valueOf(isSip)).build();
+        Uri localUri = ContactsProvider2.convertToLocalUri(enterpriseUri, Phone.CONTENT_URI);
+        Uri expectedUri = Phone.CONTENT_URI.buildUpon().appendPath(phoneNumber)
+                .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS,
+                        String.valueOf(isSip)).build();
+        assertUriEquals(expectedUri, localUri);
+    }
+
     public void testContactsProjection() {
         assertProjection(Contacts.CONTENT_URI, new String[]{
                 Contacts._ID,
@@ -9227,13 +9274,13 @@
                 cv(Contacts._ID, i1.mContactId, Contacts.PINNED, PinnedPositions.UNPINNED)
         );
 
-        ContactsContract.PinnedPositions.pin(mResolver,  i1.mContactId, 5);
+        ContactsContract.PinnedPositions.pin(mResolver, i1.mContactId, 5);
 
         assertStoredValuesWithProjection(Contacts.CONTENT_URI,
                 cv(Contacts._ID, i1.mContactId, Contacts.PINNED, 5)
         );
 
-        ContactsContract.PinnedPositions.pin(mResolver,  i1.mContactId, PinnedPositions.UNPINNED);
+        ContactsContract.PinnedPositions.pin(mResolver, i1.mContactId, PinnedPositions.UNPINNED);
 
         assertStoredValuesWithProjection(Contacts.CONTENT_URI,
                 cv(Contacts._ID, i1.mContactId, Contacts.PINNED, PinnedPositions.UNPINNED)
@@ -9350,9 +9397,9 @@
 
     private Cursor queryGroupMemberships(Account account) {
         Cursor c = mResolver.query(TestUtil.maybeAddAccountQueryParameters(Data.CONTENT_URI,
-                account),
-                new String[]{GroupMembership.GROUP_ROW_ID, GroupMembership.RAW_CONTACT_ID},
-                Data.MIMETYPE + "=?", new String[]{GroupMembership.CONTENT_ITEM_TYPE},
+                        account),
+                new String[] {GroupMembership.GROUP_ROW_ID, GroupMembership.RAW_CONTACT_ID},
+                Data.MIMETYPE + "=?", new String[] {GroupMembership.CONTENT_ITEM_TYPE},
                 GroupMembership.GROUP_SOURCE_ID);
         return c;
     }
@@ -9572,4 +9619,24 @@
         }
         return false;
     }
+
+
+    /**
+     * Asserts the equality of two Uri objects, ignoring the order of the query parameters.
+     */
+    public static void assertUriEquals(Uri expected, Uri actual) {
+        assertEquals(expected.getScheme(), actual.getScheme());
+        assertEquals(expected.getAuthority(), actual.getAuthority());
+        assertEquals(expected.getPath(), actual.getPath());
+        assertEquals(expected.getFragment(), actual.getFragment());
+        Set<String> expectedParameterNames = expected.getQueryParameterNames();
+        Set<String> actualParameterNames = actual.getQueryParameterNames();
+        assertEquals(expectedParameterNames.size(), actualParameterNames.size());
+        assertTrue(expectedParameterNames.containsAll(actualParameterNames));
+        for (String parameterName : expectedParameterNames) {
+            assertEquals(expected.getQueryParameter(parameterName),
+                    actual.getQueryParameter(parameterName));
+        }
+
+    }
 }
