diff --git a/src/com/android/server/telecom/LogUtils.java b/src/com/android/server/telecom/LogUtils.java
index f55fa2c..1e82fc0 100644
--- a/src/com/android/server/telecom/LogUtils.java
+++ b/src/com/android/server/telecom/LogUtils.java
@@ -137,7 +137,6 @@
         public static final String BIND_SCREENING = "BIND_SCREENING";
         public static final String SCREENING_BOUND = "SCREENING_BOUND";
         public static final String SCREENING_SENT = "SCREENING_SENT";
-        public static final String SCREENING_SKIPPED = "SCREENING_SKIPPED";
         public static final String CONTROLLER_SCREENING_COMPLETED =
                 "CONTROLLER_SCREENING_COMPLETED";
         public static final String SCREENING_COMPLETED = "SCREENING_COMPLETED";
diff --git a/src/com/android/server/telecom/callfiltering/CallScreeningServiceController.java b/src/com/android/server/telecom/callfiltering/CallScreeningServiceController.java
index c2f6720..291fef8 100644
--- a/src/com/android/server/telecom/callfiltering/CallScreeningServiceController.java
+++ b/src/com/android/server/telecom/callfiltering/CallScreeningServiceController.java
@@ -195,18 +195,10 @@
             if (TextUtils.isEmpty(userChosenPackageName)) {
                 mIsUserChosenFinished = true;
             } else {
-                // If the user chosen call screening service is the same as the default dialer, then
-                // we have already bound to it above and don't need to do so again here.
-                if (userChosenPackageName.equals(dialerPackageName)) {
-                    Log.addEvent(mCall, LogUtils.Events.SCREENING_SKIPPED,
-                            "user pkg same as dialer: " + userChosenPackageName);
-                    mIsUserChosenFinished = true;
-                } else {
-                    createCallScreeningServiceFilter().startCallScreeningFilter(mCall,
-                            CallScreeningServiceController.this, userChosenPackageName,
-                            mAppLabelProxy.getAppLabel(userChosenPackageName),
-                            CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED);
-                }
+                createCallScreeningServiceFilter().startCallScreeningFilter(mCall,
+                        CallScreeningServiceController.this, userChosenPackageName,
+                        mAppLabelProxy.getAppLabel(userChosenPackageName),
+                        CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED);
             }
 
             if (mIsDefaultDialerFinished && mIsUserChosenFinished) {
diff --git a/tests/src/com/android/server/telecom/tests/CallScreeningServiceControllerTest.java b/tests/src/com/android/server/telecom/tests/CallScreeningServiceControllerTest.java
index 1f438d5..c4acfe0 100644
--- a/tests/src/com/android/server/telecom/tests/CallScreeningServiceControllerTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallScreeningServiceControllerTest.java
@@ -356,69 +356,6 @@
         )));
     }
 
-    /**
-     * This test verifies that where the default dialer role is filled by the same app as the caller
-     * id and spam role, we will only bind to that call screening service once.
-     */
-    @SmallTest
-    @Test
-    public void testOnlyBindOnce() {
-        // Assume the user chose the default dialer to also fill the caller id and spam role.
-        when(mRoleManagerAdapter.getDefaultCallScreeningApp()).thenReturn(
-                DEFAULT_DIALER_CALL_SCREENING.getPackageName());
-        CallScreeningServiceController controller = new CallScreeningServiceController(mContext,
-                mCallsManager,
-                mPhoneAccountRegistrar, mParcelableCallUtilsConverter, mLock,
-                mSettingsSecureAdapter, mCallerInfoLookupHelper, mAppLabelProxy);
-
-        controller.startFilterLookup(mCall, mCallback);
-
-        controller.onCallScreeningFilterComplete(mCall, PASS_RESULT,
-                CARRIER_DEFINED_CALL_SCREENING.getPackageName());
-
-        CallerInfoLookupHelper.OnQueryCompleteListener queryListener = verifyLookupStart();
-        CallerInfo callerInfo = new CallerInfo();
-        callerInfo.contactExists = false;
-        queryListener.onCallerInfoQueryComplete(TEST_HANDLE, callerInfo);
-
-        controller.onCallScreeningFilterComplete(mCall, new CallFilteringResult(
-                        false, // shouldAllowCall
-                        true, // shouldReject
-                        false, // shouldAddToCallLog
-                        true, // shouldShowNotification
-                        CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE,
-                        APP_NAME,
-                        DEFAULT_DIALER_CALL_SCREENING.flattenToString()
-                ),
-                DEFAULT_DIALER_CALL_SCREENING.getPackageName());
-        controller.onCallScreeningFilterComplete(mCall, new CallFilteringResult(
-                false, // shouldAllowCall
-                true, // shouldReject
-                false, // shouldAddToCallLog
-                true, // shouldShowNotification
-                CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE,
-                APP_NAME,
-                DEFAULT_DIALER_CALL_SCREENING.flattenToString()
-        ), USER_CHOSEN_CALL_SCREENING.getPackageName());
-
-        // Expect to bind twice; once to the carrier defined service, and then again to the default
-        // dialer.
-        verify(mContext, times(2)).bindServiceAsUser(any(Intent.class),
-                any(ServiceConnection.class),
-                eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
-                eq(UserHandle.CURRENT));
-
-        // Expect filtering to complete only a single time from the default dialer service.
-        verify(mCallback, times(1)).onCallFilteringComplete(eq(mCall), eq(new CallFilteringResult(
-                false, // shouldAllowCall
-                true, // shouldReject
-                true, // shouldAddToCallLog
-                true, // shouldShowNotification
-                CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE,
-                APP_NAME,
-                DEFAULT_DIALER_CALL_SCREENING.flattenToString()
-        )));    }
-
     private CallerInfoLookupHelper.OnQueryCompleteListener verifyLookupStart() {
         return verifyLookupStart(TEST_HANDLE);
     }
