diff --git a/src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java b/src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
index 6c16253..a608207 100644
--- a/src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
+++ b/src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
@@ -16,7 +16,9 @@
 
 package com.android.dialer.compat;
 
+import android.content.Context;
 import android.net.Uri;
+import android.provider.BlockedNumberContract;
 import android.provider.BlockedNumberContract.BlockedNumbers;
 
 public class BlockedNumbersSdkCompat {
@@ -29,4 +31,7 @@
 
     public static final String E164_NUMBER = BlockedNumbers.COLUMN_E164_NUMBER;
 
+    public static boolean canCurrentUserBlockNumbers(Context context) {
+        return BlockedNumberContract.canCurrentUserBlockNumbers(context);
+    }
 }
diff --git a/src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java b/src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
index cbdc595..559d718 100644
--- a/src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
+++ b/src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
@@ -16,6 +16,7 @@
 
 package com.android.dialer.compat;
 
+import android.content.Context;
 import android.net.Uri;
 
 public class BlockedNumbersSdkCompat {
@@ -27,4 +28,8 @@
     public static final String COLUMN_ORIGINAL_NUMBER = null;
 
     public static final String E164_NUMBER = null;
+
+    public static boolean canCurrentUserBlockNumbers(Context context) {
+        return false;
+    }
 }
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index 6c8d770..42bee1e 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -59,7 +59,6 @@
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
 import com.android.dialer.filterednumber.BlockNumberDialogFragment;
 import com.android.dialer.filterednumber.FilteredNumbersUtil;
-import com.android.dialer.filterednumber.MigrateBlockedNumbersDialogFragment;
 import com.android.dialer.logging.InteractionEvent;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.util.DialerUtils;
@@ -156,7 +155,8 @@
                     PhoneNumberUtil.canPlaceCallsTo(mNumber, mDetails.numberPresentation);
             mCallButton.setVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
             mCopyNumberActionItem.setVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
-            mBlockNumberActionItem.setVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
+
+            updateBlockActionItemVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
 
             final boolean isSipNumber = PhoneNumberUtil.isSipNumber(mNumber);
             final boolean isVoicemailNumber =
@@ -277,7 +277,9 @@
             }
         });
 
+
         mBlockNumberActionItem = (TextView) findViewById(R.id.call_detail_action_block);
+        updateBlockActionItemVisibility(View.VISIBLE);
         mBlockNumberActionItem.setOnClickListener(this);
         mEditBeforeCallActionItem = findViewById(R.id.call_detail_action_edit_before_call);
         mEditBeforeCallActionItem.setOnClickListener(this);
@@ -292,6 +294,13 @@
         }
     }
 
+    private void updateBlockActionItemVisibility(int visibility) {
+        if (!FilteredNumberCompat.canAttemptBlockOperations(mContext)) {
+            visibility = View.GONE;
+        }
+        mBlockNumberActionItem.setVisibility(visibility);
+    }
+
     @Override
     public void onResume() {
         super.onResume();
@@ -468,8 +477,6 @@
             mBlockNumberActionItem.setCompoundDrawablesRelativeWithIntrinsicBounds(
                     R.drawable.ic_call_detail_unblock, 0, 0, 0);
         }
-
-        mBlockNumberActionItem.setVisibility(View.VISIBLE);
     }
 
     private void closeSystemDialogs() {
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 750914b..baf2e1a 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -55,7 +55,6 @@
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.filterednumber.BlockNumberDialogFragment;
 import com.android.dialer.filterednumber.FilteredNumbersUtil;
-import com.android.dialer.filterednumber.MigrateBlockedNumbersDialogFragment;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.logging.ScreenEvent;
 import com.android.dialer.service.ExtendedBlockingButtonRenderer;
@@ -346,7 +345,8 @@
                     .setOnMenuItemClickListener(this);
         }
 
-        if (FilteredNumbersUtil.canBlockNumber(mContext, number, countryIso)) {
+        if (FilteredNumberCompat.canAttemptBlockOperations(mContext)
+                && FilteredNumbersUtil.canBlockNumber(mContext, number, countryIso)) {
             mFilteredNumberAsyncQueryHandler.isBlockedNumber(
                     new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() {
                         @Override
diff --git a/src/com/android/dialer/compat/FilteredNumberCompat.java b/src/com/android/dialer/compat/FilteredNumberCompat.java
index c6c714b..532cec5 100644
--- a/src/com/android/dialer/compat/FilteredNumberCompat.java
+++ b/src/com/android/dialer/compat/FilteredNumberCompat.java
@@ -25,6 +25,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
+import android.os.UserManager;
 import android.preference.PreferenceManager;
 import android.support.annotation.Nullable;
 import android.telecom.TelecomManager;
@@ -293,4 +294,39 @@
         }
         return new Intent(context, BlockedNumbersSettingsActivity.class);
     }
+
+    /**
+     * Method used to determine if block operations are possible.
+     *
+     * @param context The {@link Context}.
+     * @return {@code true} if the app and user can block numbers, {@code false} otherwise.
+     */
+    public static boolean canAttemptBlockOperations(Context context) {
+        if (!CompatUtils.isNCompatible()) {
+            // Dialer blocking, must be primary user
+            return UserManagerCompat.isSystemUser(
+                    (UserManager) context.getSystemService(Context.USER_SERVICE));
+        }
+
+        // Great Wall blocking, must be primary user and the default or system dialer
+        // TODO(maxwelb): check that we're the default or system Dialer
+        return BlockedNumbersSdkCompat.canCurrentUserBlockNumbers(context);
+    }
+
+    /**
+     * Used to determine if the call blocking settings can be opened.
+     *
+     * @param context The {@link Context}.
+     * @return {@code true} if the current user can open the call blocking settings, {@code false}
+     * otherwise.
+     */
+    public static boolean canCurrentUserOpenBlockSettings(Context context) {
+        if (!CompatUtils.isNCompatible()) {
+            // Dialer blocking, must be primary user
+            return UserManagerCompat.isSystemUser(
+                    (UserManager) context.getSystemService(Context.USER_SERVICE));
+        }
+        // BlockedNumberContract blocking, verify through Contract API
+        return BlockedNumbersSdkCompat.canCurrentUserBlockNumbers(context);
+    }
 }
diff --git a/src/com/android/dialer/settings/DialerSettingsActivity.java b/src/com/android/dialer/settings/DialerSettingsActivity.java
index bbcbd49..fc689d0 100644
--- a/src/com/android/dialer/settings/DialerSettingsActivity.java
+++ b/src/com/android/dialer/settings/DialerSettingsActivity.java
@@ -94,22 +94,21 @@
             phoneAccountSettingsHeader.intent = phoneAccountSettingsIntent;
             target.add(phoneAccountSettingsHeader);
         }
-        if (isPrimaryUser) {
+        if (FilteredNumberCompat.canCurrentUserOpenBlockSettings(this)) {
             Header blockedCallsHeader = new Header();
             blockedCallsHeader.titleRes = R.string.manage_blocked_numbers_label;
             blockedCallsHeader.intent = FilteredNumberCompat.createManageBlockedNumbersIntent(this);
             target.add(blockedCallsHeader);
-
-            if (TelephonyManagerCompat.isTtyModeSupported(telephonyManager)
-                    || TelephonyManagerCompat
-                    .isHearingAidCompatibilitySupported(telephonyManager)) {
-                Header accessibilitySettingsHeader = new Header();
-                Intent accessibilitySettingsIntent =
-                        new Intent(TelecomManager.ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS);
-                accessibilitySettingsHeader.titleRes = R.string.accessibility_settings_title;
-                accessibilitySettingsHeader.intent = accessibilitySettingsIntent;
-                target.add(accessibilitySettingsHeader);
-            }
+        }
+        if (isPrimaryUser
+                && (TelephonyManagerCompat.isTtyModeSupported(telephonyManager)
+                || TelephonyManagerCompat.isHearingAidCompatibilitySupported(telephonyManager))) {
+            Header accessibilitySettingsHeader = new Header();
+            Intent accessibilitySettingsIntent =
+                    new Intent(TelecomManager.ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS);
+            accessibilitySettingsHeader.titleRes = R.string.accessibility_settings_title;
+            accessibilitySettingsHeader.intent = accessibilitySettingsIntent;
+            target.add(accessibilitySettingsHeader);
         }
     }
 
diff --git a/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java b/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java
index 5ee2f28..3572316 100644
--- a/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java
+++ b/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java
@@ -18,19 +18,20 @@
 
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.ComponentName;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.Intent;
 import android.content.SharedPreferences;
 import android.net.Uri;
+import android.os.UserManager;
 import android.provider.BlockedNumberContract.BlockedNumbers;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Log;
 
 import com.android.contacts.common.compat.CompatUtils;
 import com.android.dialer.DialerApplication;
@@ -41,7 +42,6 @@
 import com.android.dialer.filterednumber.BlockedNumbersSettingsActivity;
 
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 
 import java.util.Arrays;
@@ -227,6 +227,54 @@
                         .getComponent()));
     }
 
+    public void testCanCurrentUserOpenBlockSettings_M_SecondaryUser() {
+        if (CompatUtils.isNCompatible()) {
+            return;
+        }
+        UserManager userManager = mock(UserManager.class);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+        when(userManager.isSystemUser()).thenReturn(false);
+        assertFalse(FilteredNumberCompat.canCurrentUserOpenBlockSettings(mContext));
+        verify(mContext).getSystemService(Context.USER_SERVICE);
+        verify(userManager).isSystemUser();
+    }
+
+    public void testCanCurrentUserOpenBlockSettings_M_PrimaryUser() {
+        if (CompatUtils.isNCompatible()) {
+            return;
+        }
+        UserManager userManager = mock(UserManager.class);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+        when(userManager.isSystemUser()).thenReturn(true);
+        assertTrue(FilteredNumberCompat.canCurrentUserOpenBlockSettings(mContext));
+        verify(mContext).getSystemService(Context.USER_SERVICE);
+        verify(userManager).isSystemUser();
+    }
+
+    public void testCanAttemptBlockOperations_M_SecondaryUser() {
+        if (CompatUtils.isNCompatible()) {
+            return;
+        }
+        UserManager userManager = mock(UserManager.class);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+        when(userManager.isSystemUser()).thenReturn(false);
+        assertFalse(FilteredNumberCompat.canAttemptBlockOperations(mContext));
+        verify(mContext).getSystemService(Context.USER_SERVICE);
+        verify(userManager).isSystemUser();
+    }
+
+    public void testCanAttemptBlockOperations_M_PrimaryUser() {
+        if (CompatUtils.isNCompatible()) {
+            return;
+        }
+        UserManager userManager = mock(UserManager.class);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+        when(userManager.isSystemUser()).thenReturn(true);
+        assertTrue(FilteredNumberCompat.canAttemptBlockOperations(mContext));
+        verify(mContext).getSystemService(Context.USER_SERVICE);
+        verify(userManager).isSystemUser();
+    }
+
     private ContentValues newExpectedContentValuesM(String number, String e164Number,
             String countryIso) {
         ContentValues contentValues = new ContentValues();
