diff --git a/src/com/android/settings/network/apn/ApnEditPageProvider.kt b/src/com/android/settings/network/apn/ApnEditPageProvider.kt
index 90d96c6..f2c3325 100644
--- a/src/com/android/settings/network/apn/ApnEditPageProvider.kt
+++ b/src/com/android/settings/network/apn/ApnEditPageProvider.kt
@@ -34,6 +34,7 @@
 import com.android.settingslib.spa.framework.common.SettingsPageProvider
 import com.android.settingslib.spa.framework.compose.stateOf
 import com.android.settingslib.spa.widget.editor.SettingsExposedDropdownMenuBox
+import com.android.settingslib.spa.widget.editor.SettingsExposedDropdownMenuCheckBox
 import com.android.settingslib.spa.widget.editor.SettingsOutlinedTextField
 import com.android.settingslib.spa.widget.preference.SwitchPreference
 import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
@@ -86,8 +87,13 @@
     val context = LocalContext.current
     val authTypeOptions = stringArrayResource(R.array.apn_auth_entries).toList()
     val apnProtocolOptions = stringArrayResource(R.array.apn_protocol_entries).toList()
+    val bearerOptionsAll = stringArrayResource(R.array.bearer_entries)
+    val bearerOptions = bearerOptionsAll.drop(1).toList()
+    val bearerEmptyVal = bearerOptionsAll[0]
     val mvnoTypeOptions = stringArrayResource(R.array.mvno_type_entries).toList()
-
+    val bearerSelectedOptionsState = remember {
+        getBearerSelectedOptionsState(apnData.bearer, apnData.bearerBitmask, context)
+    }
     RegularScaffold(
         title = stringResource(id = R.string.apn_edit),
     ) {
@@ -184,6 +190,13 @@
                     }
                 }
             )
+            SettingsExposedDropdownMenuCheckBox(
+                stringResource(R.string.bearer),
+                bearerOptions,
+                bearerSelectedOptionsState,
+                bearerEmptyVal,
+                apnData.bearerEnabled
+            ) {}
             SettingsExposedDropdownMenuBox(
                 stringResource(R.string.mvno_type),
                 mvnoTypeOptions,
diff --git a/src/com/android/settings/network/apn/ApnStatus.kt b/src/com/android/settings/network/apn/ApnStatus.kt
index 7f4c297..06d8cfb 100644
--- a/src/com/android/settings/network/apn/ApnStatus.kt
+++ b/src/com/android/settings/network/apn/ApnStatus.kt
@@ -16,8 +16,12 @@
 
 package com.android.settings.network.apn
 
+import android.content.Context
 import android.provider.Telephony
 import android.telephony.TelephonyManager
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.snapshots.SnapshotStateList
+import com.android.settings.R
 
 data class ApnData(
     val name: String = "",
@@ -65,4 +69,29 @@
     var bearerEnabled = true
     var mvnoTypeEnabled = true
     var mvnoValueEnabled = false
-}
\ No newline at end of file
+}
+
+fun getBearerSelectedOptionsState(
+    bearer: Int,
+    bearerBitmask: Int,
+    context: Context
+): SnapshotStateList<Int> {
+    val bearerValues = context.resources.getStringArray(R.array.bearer_values)
+    val bearerSelectedOptionsState = mutableStateListOf<Int>()
+    if (bearerBitmask != 0) {
+        var i = 1
+        var _bearerBitmask = bearerBitmask
+        while (_bearerBitmask != 0) {
+            if (_bearerBitmask and 1 == 1 && !bearerSelectedOptionsState.contains(i)) {
+                bearerSelectedOptionsState.add(bearerValues.indexOf("$i") - 1)
+            }
+            _bearerBitmask = _bearerBitmask shr 1
+            i++
+        }
+    }
+    if (bearer != 0 && !bearerSelectedOptionsState.contains(bearer)) {
+        // add mBearerInitialVal to bearers
+        bearerSelectedOptionsState.add(bearerValues.indexOf("$bearer") - 1)
+    }
+    return bearerSelectedOptionsState
+}
diff --git a/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt
index 590fe9e..0d2dcef 100644
--- a/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt
+++ b/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt
@@ -17,16 +17,22 @@
 package com.android.settings.network.apn
 
 import android.content.Context
+import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.assertIsOff
 import androidx.compose.ui.test.assertIsOn
 import androidx.compose.ui.test.hasText
+import androidx.compose.ui.test.isFocused
 import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onAllNodesWithText
 import androidx.compose.ui.test.onChild
 import androidx.compose.ui.test.onChildAt
+import androidx.compose.ui.test.onLast
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.onRoot
+import androidx.compose.ui.test.performClick
 import androidx.compose.ui.test.performScrollToNode
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -49,15 +55,20 @@
     private val apnType = "apn_type"
     private val apnRoaming = "IPv4"
     private val apnEnable = context.resources.getString(R.string.carrier_enabled)
-    private val apnProtocolOptions = context.resources.getStringArray(R.array.apn_protocol_entries).toList()
-    private val apnData = ApnData(
-        name = apnName,
-        mmsc = mmsc,
-        mmsProxy = mmsProxy,
-        mnc = mnc,
-        apnType = apnType,
-        apnRoaming = apnProtocolOptions.indexOf(apnRoaming),
-        apnEnable = true
+    private val apnProtocolOptions =
+        context.resources.getStringArray(R.array.apn_protocol_entries).toList()
+    private val bearer = context.resources.getString(R.string.bearer)
+    private val bearerOptions = context.resources.getStringArray(R.array.bearer_entries).toList()
+    private val apnData = mutableStateOf(
+        ApnData(
+            name = apnName,
+            mmsc = mmsc,
+            mmsProxy = mmsProxy,
+            mnc = mnc,
+            apnType = apnType,
+            apnRoaming = apnProtocolOptions.indexOf(apnRoaming),
+            apnEnable = true
+        )
     )
 
     @Test
@@ -69,7 +80,7 @@
     fun title_displayed() {
         composeTestRule.setContent {
             ApnPage(remember {
-                mutableStateOf(apnData)
+                apnData
             })
         }
         composeTestRule.onNodeWithText(context.getString(R.string.apn_edit)).assertIsDisplayed()
@@ -79,7 +90,7 @@
     fun name_displayed() {
         composeTestRule.setContent {
             ApnPage(remember {
-                mutableStateOf(apnData)
+                apnData
             })
         }
         composeTestRule.onNodeWithText(apnName, true).assertIsDisplayed()
@@ -89,7 +100,7 @@
     fun mmsc_displayed() {
         composeTestRule.setContent {
             ApnPage(remember {
-                mutableStateOf(apnData)
+                apnData
             })
         }
         composeTestRule.onRoot().onChild().onChildAt(0)
@@ -101,7 +112,7 @@
     fun mms_proxy_displayed() {
         composeTestRule.setContent {
             ApnPage(remember {
-                mutableStateOf(apnData)
+                apnData
             })
         }
         composeTestRule.onRoot().onChild().onChildAt(0)
@@ -113,7 +124,7 @@
     fun mnc_displayed() {
         composeTestRule.setContent {
             ApnPage(remember {
-                mutableStateOf(apnData)
+                apnData
             })
         }
         composeTestRule.onRoot().onChild().onChildAt(0)
@@ -125,7 +136,7 @@
     fun apn_type_displayed() {
         composeTestRule.setContent {
             ApnPage(remember {
-                mutableStateOf(apnData)
+                apnData
             })
         }
         composeTestRule.onRoot().onChild().onChildAt(0)
@@ -137,7 +148,7 @@
     fun apn_roaming_displayed() {
         composeTestRule.setContent {
             ApnPage(remember {
-                mutableStateOf(apnData)
+                apnData
             })
         }
         composeTestRule.onRoot().onChild().onChildAt(0)
@@ -149,7 +160,7 @@
     fun carrier_enabled_displayed() {
         composeTestRule.setContent {
             ApnPage(remember {
-                mutableStateOf(apnData)
+                apnData
             })
         }
         composeTestRule.onRoot().onChild().onChildAt(0)
@@ -161,11 +172,73 @@
     fun carrier_enabled_isChecked() {
         composeTestRule.setContent {
             ApnPage(remember {
-                mutableStateOf(apnData)
+                apnData
             })
         }
         composeTestRule.onRoot().onChild().onChildAt(0)
             .performScrollToNode(hasText(apnEnable, true))
         composeTestRule.onNodeWithText(apnEnable, true).assertIsOn()
     }
+
+    @Test
+    fun carrier_enabled_checkChanged() {
+        composeTestRule.setContent {
+            ApnPage(remember {
+                apnData
+            })
+        }
+        composeTestRule.onRoot().onChild().onChildAt(0)
+            .performScrollToNode(hasText(apnEnable, true))
+        composeTestRule.onNodeWithText(apnEnable, true).performClick()
+        composeTestRule.onNodeWithText(apnEnable, true).assertIsOff()
+    }
+
+    @Test
+    fun bearer_displayed() {
+        composeTestRule.setContent {
+            ApnPage(remember {
+                apnData
+            })
+        }
+        composeTestRule.onRoot().onChild().onChildAt(0)
+            .performScrollToNode(hasText(bearer, true))
+        composeTestRule.onNodeWithText(bearer, true).assertIsDisplayed()
+    }
+
+    @Test
+    fun bearer_changed() {
+        var apnDataa: MutableState<ApnData> = apnData
+        composeTestRule.setContent {
+            apnDataa = remember {
+                apnData
+            }
+            ApnPage(apnDataa)
+        }
+        composeTestRule.onRoot().onChild().onChildAt(0)
+            .performScrollToNode(hasText(bearer, true))
+        composeTestRule.onNodeWithText(bearer, true).performClick()
+        composeTestRule.onNodeWithText(bearerOptions[1], true).performClick()
+        composeTestRule.onNode(hasText(bearerOptions[0]) and isFocused(), true).assertDoesNotExist()
+        composeTestRule.onNode(hasText(bearerOptions[1]) and isFocused(), true).assertIsDisplayed()
+    }
+
+    @Test
+    fun bearer_changed_back2Default() {
+        var apnDataa: MutableState<ApnData> = apnData
+        composeTestRule.setContent {
+            apnDataa = remember {
+                apnData
+            }
+            ApnPage(apnDataa)
+        }
+        composeTestRule.onRoot().onChild().onChildAt(0)
+            .performScrollToNode(hasText(bearer, true))
+        composeTestRule.onNodeWithText(bearer, true).performClick()
+        composeTestRule.onNodeWithText(bearerOptions[1], true).performClick()
+        composeTestRule.onNode(hasText(bearerOptions[0]) and isFocused(), true).assertDoesNotExist()
+        composeTestRule.onNode(hasText(bearerOptions[1]) and isFocused(), true).assertIsDisplayed()
+        composeTestRule.onAllNodesWithText(bearerOptions[1], true).onLast().performClick()
+        composeTestRule.onNode(hasText(bearerOptions[0]) and isFocused(), true).assertIsDisplayed()
+        composeTestRule.onNode(hasText(bearerOptions[1]) and isFocused(), true).assertDoesNotExist()
+    }
 }
\ No newline at end of file
