diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e10b17d..ec4d8ef 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2290,6 +2290,7 @@
             android:exported="true">
             <intent-filter>
                 <action android:name="android.bluetooth.device.action.PAIRING_REQUEST" />
+                <action android:name="android.bluetooth.action.CSIS_SET_MEMBER_AVAILABLE"/>
             </intent-filter>
         </receiver>
 
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
index 4ea4338..6b80256 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
@@ -16,12 +16,14 @@
 
 package com.android.settings.bluetooth;
 
+import android.bluetooth.BluetoothCsipSetCoordinator;
 import android.bluetooth.BluetoothDevice;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.os.PowerManager;
 import android.os.UserHandle;
+import android.text.TextUtils;
 
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
@@ -36,38 +38,55 @@
     @Override
     public void onReceive(Context context, Intent intent) {
         String action = intent.getAction();
-        if (action == null || !action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
+        if (action == null) {
             return;
         }
 
-        PowerManager powerManager = context.getSystemService(PowerManager.class);
         BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-        int pairingVariant = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
-                BluetoothDevice.ERROR);
-        String deviceAddress = device != null ? device.getAddress() : null;
-        String deviceName = device != null ? device.getName() : null;
-        boolean shouldShowDialog = LocalBluetoothPreferences.shouldShowDialogInForeground(
-                context, deviceAddress, deviceName);
-
         final LocalBluetoothManager mBluetoothManager = Utils.getLocalBtManager(context);
-        // Skips consent pairing dialog if the device was recently associated with CDM
-        if (pairingVariant == BluetoothDevice.PAIRING_VARIANT_CONSENT
-                && (device.canBondWithoutDialog()
-                || mBluetoothManager.getCachedDeviceManager().isOngoingPairByCsip(device))) {
-            device.setPairingConfirmation(true);
-        } else if (powerManager.isInteractive() && shouldShowDialog) {
-            // Since the screen is on and the BT-related activity is in the foreground,
-            // just open the dialog
-            // convert broadcast intent into activity intent (same action string)
-            Intent pairingIntent = BluetoothPairingService.getPairingDialogIntent(context, intent,
-                    BluetoothDevice.EXTRA_PAIRING_INITIATOR_FOREGROUND);
+        if (TextUtils.equals(action, BluetoothDevice.ACTION_PAIRING_REQUEST)) {
+            PowerManager powerManager = context.getSystemService(PowerManager.class);
+            int pairingVariant = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
+                    BluetoothDevice.ERROR);
+            String deviceAddress = device != null ? device.getAddress() : null;
+            String deviceName = device != null ? device.getName() : null;
+            boolean shouldShowDialog = LocalBluetoothPreferences.shouldShowDialogInForeground(
+                    context, deviceAddress, deviceName);
 
-            context.startActivityAsUser(pairingIntent, UserHandle.CURRENT);
-        } else {
-            // Put up a notification that leads to the dialog
-            intent.setClass(context, BluetoothPairingService.class);
-            intent.setAction(BluetoothDevice.ACTION_PAIRING_REQUEST);
-            context.startServiceAsUser(intent, UserHandle.CURRENT);
+            // Skips consent pairing dialog if the device was recently associated with CDM
+            if (pairingVariant == BluetoothDevice.PAIRING_VARIANT_CONSENT
+                    && (device.canBondWithoutDialog()
+                    || mBluetoothManager.getCachedDeviceManager().isOngoingPairByCsip(device))) {
+                device.setPairingConfirmation(true);
+            } else if (powerManager.isInteractive() && shouldShowDialog) {
+                // Since the screen is on and the BT-related activity is in the foreground,
+                // just open the dialog
+                // convert broadcast intent into activity intent (same action string)
+                Intent pairingIntent = BluetoothPairingService.getPairingDialogIntent(context,
+                        intent, BluetoothDevice.EXTRA_PAIRING_INITIATOR_FOREGROUND);
+
+                context.startActivityAsUser(pairingIntent, UserHandle.CURRENT);
+            } else {
+                // Put up a notification that leads to the dialog
+                intent.setClass(context, BluetoothPairingService.class);
+                intent.setAction(BluetoothDevice.ACTION_PAIRING_REQUEST);
+                context.startServiceAsUser(intent, UserHandle.CURRENT);
+            }
+        } else if (TextUtils.equals(action,
+                BluetoothCsipSetCoordinator.ACTION_CSIS_SET_MEMBER_AVAILABLE)) {
+            if (device == null) {
+                return;
+            }
+
+            final int groupId = intent.getIntExtra(BluetoothCsipSetCoordinator.EXTRA_CSIS_GROUP_ID,
+                    BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+            if (groupId == BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
+                return;
+            }
+
+            if (mBluetoothManager.getCachedDeviceManager().shouldPairByCsip(device, groupId)) {
+                device.createBond(BluetoothDevice.TRANSPORT_LE);
+            }
         }
     }
 }
