diff --git a/src/com/android/contacts/common/ContactsUtils.java b/src/com/android/contacts/common/ContactsUtils.java
index a6e0e0e..2ef68d4 100644
--- a/src/com/android/contacts/common/ContactsUtils.java
+++ b/src/com/android/contacts/common/ContactsUtils.java
@@ -20,6 +20,7 @@
 import android.content.Intent;
 import android.database.Cursor;
 import android.net.Uri;
+import android.os.Build;
 import android.provider.ContactsContract.CommonDataKinds.Im;
 import android.provider.ContactsContract.DisplayPhoto;
 import android.telephony.PhoneNumberUtils;
@@ -45,6 +46,11 @@
 
     private static int sThumbnailSize = -1;
 
+    public static final boolean FLAG_N_FEATURE =
+            false // Enforce Pre-N behavior in release build
+            && (Build.VERSION.SDK_INT > Build.VERSION_CODES.M
+                    || Build.VERSION.CODENAME.startsWith("N"));
+
     // TODO find a proper place for the canonical version of these
     public interface ProviderNames {
         String YAHOO = "Yahoo";
diff --git a/src/com/android/contacts/common/list/DirectoryListLoader.java b/src/com/android/contacts/common/list/DirectoryListLoader.java
index b327361..3e5868e 100644
--- a/src/com/android/contacts/common/list/DirectoryListLoader.java
+++ b/src/com/android/contacts/common/list/DirectoryListLoader.java
@@ -23,10 +23,12 @@
 import android.database.MatrixCursor;
 import android.net.Uri;
 import android.os.Handler;
+import android.provider.ContactsContract;
 import android.provider.ContactsContract.Directory;
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.R;
 
 /**
@@ -42,7 +44,10 @@
     public static final int SEARCH_MODE_DATA_SHORTCUT = 3;
 
     private static final class DirectoryQuery {
-        public static final Uri URI = Directory.CONTENT_URI;
+        // TODO(b/26056939): Directory.ENTERPRISE_CONTENT_URI;
+        public static final Uri URI = ContactsUtils.FLAG_N_FEATURE
+                ? Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, "directories_enterprise")
+                : Directory.CONTENT_URI;
         public static final String ORDER_BY = Directory._ID;
 
         public static final String[] PROJECTION = {
@@ -101,7 +106,7 @@
     @Override
     protected void onStartLoading() {
         getContext().getContentResolver().
-                registerContentObserver(Directory.CONTENT_URI, false, mObserver);
+                registerContentObserver(DirectoryQuery.URI, false, mObserver);
         forceLoad();
     }
 
diff --git a/src/com/android/contacts/common/list/PhoneNumberListAdapter.java b/src/com/android/contacts/common/list/PhoneNumberListAdapter.java
index fee0a6a..45470d1 100644
--- a/src/com/android/contacts/common/list/PhoneNumberListAdapter.java
+++ b/src/com/android/contacts/common/list/PhoneNumberListAdapter.java
@@ -28,15 +28,15 @@
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.Directory;
-import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
+import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.GeoUtil;
 import com.android.contacts.common.R;
-import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
 import com.android.contacts.common.extensions.ExtendedPhoneDirectoriesManager;
 import com.android.contacts.common.extensions.ExtensionsFactory;
 import com.android.contacts.common.preference.ContactsPreferences;
@@ -175,9 +175,19 @@
             if (isSearchMode()) {
                 final Uri baseUri;
                 if (isRemoteDirectoryQuery) {
-                    baseUri = Phone.CONTENT_FILTER_URI;
+                    if (ContactsUtils.FLAG_N_FEATURE) {
+                        //TODO(b/26056939): Phone.ENTERPRISE_CONTENT_FILTER_URI
+                        baseUri = Uri.withAppendedPath(Phone.CONTENT_URI, "filter_enterprise");
+                    } else {
+                        baseUri = Phone.CONTENT_FILTER_URI;
+                    }
                 } else if (mUseCallableUri) {
-                    baseUri = Callable.CONTENT_FILTER_URI;
+                    if (ContactsUtils.FLAG_N_FEATURE) {
+                        //TODO(b/26056939): Callable.ENTERPRISE_CONTENT_FILTER_URI
+                        baseUri = Uri.withAppendedPath(Callable.CONTENT_URI, "filter_enterprise");
+                    } else {
+                        baseUri = Callable.CONTENT_FILTER_URI;
+                    }
                 } else {
                     baseUri = Phone.CONTENT_FILTER_URI;
                 }
@@ -190,7 +200,16 @@
                             String.valueOf(getDirectoryResultLimit(getDirectoryById(directoryId))));
                 }
             } else {
-                final Uri baseUri = mUseCallableUri ? Callable.CONTENT_URI : Phone.CONTENT_URI;
+                Uri baseUri = mUseCallableUri ? Callable.CONTENT_URI : Phone.CONTENT_URI;
+                if (ContactsUtils.FLAG_N_FEATURE) {
+                    if (mUseCallableUri) {
+                        //TODO(b/26056939): Callable.ENTERPRISE_CONTENT_FILTER_URI
+                        baseUri = Uri.withAppendedPath(Callable.CONTENT_URI, "filter_enterprise");
+                    } else {
+                        //TODO(b/26056939): Phone.ENTERPRISE_CONTENT_FILTER_URI
+                        baseUri = Uri.withAppendedPath(Phone.CONTENT_URI, "filter_enterprise");
+                    }
+                }
                 builder = baseUri.buildUpon().appendQueryParameter(
                         ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT));
                 if (isSectionHeaderDisplayEnabled()) {
@@ -556,6 +575,7 @@
         }
     }
 
+    @Override
     protected Uri getContactUri(int partitionIndex, Cursor cursor,
             int contactIdColumn, int lookUpKeyColumn) {
         final DirectoryPartition directory = (DirectoryPartition) getPartition(partitionIndex);
