diff --git a/res/values/strings.xml b/res/values/strings.xml
index c5d0017..ee77cdc 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2044,6 +2044,10 @@
     <string name="wifi_settings_wep_networks_button_allow">Allow WEP</string>
     <!-- Wi-Fi settings dialog. Button text of dialog displayed when WEP network toggle is blocked. [CHAR LIMIT=NONE] -->
     <string name="wifi_settings_ssid_block_button_close">Close</string>
+    <!-- Wi-Fi settings dialog. Title of dialog displayed when the user turns off “Allow WEP networks” while connected to a WEP network. [CHAR LIMIT=NONE] -->
+    <string name="wifi_settings_wep_networks_disconnect_title">Disconnect from <xliff:g id="name">%1$s</xliff:g>?</string>
+    <!-- Wi-Fi settings dialog. Summary text of dialog displayed when the user turns off “Allow WEP networks” while connected to a WEP network. [CHAR LIMIT=NONE] -->
+    <string name="wifi_settings_wep_networks_disconnect_summary">You\u0027re connected to a WEP network. If you block these networks, you\u0027ll be disconnected.</string>
 
     <!-- Dialog for Access Points --> <skip />
     <!-- Label to show/hide advanced options [CHAR LIMIT=40] -->
diff --git a/src/com/android/settings/wifi/WepNetworksPreferenceController.kt b/src/com/android/settings/wifi/WepNetworksPreferenceController.kt
index c84e79a..2db0e02 100644
--- a/src/com/android/settings/wifi/WepNetworksPreferenceController.kt
+++ b/src/com/android/settings/wifi/WepNetworksPreferenceController.kt
@@ -18,24 +18,33 @@
 
 import android.content.Context
 import android.net.wifi.WifiManager
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.style.TextAlign
+import androidx.fragment.app.Fragment
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import androidx.preference.Preference
-import androidx.preference.PreferenceScreen
 import com.android.settings.R
 import com.android.settings.spa.preference.ComposePreferenceController
 import com.android.settingslib.spa.framework.compose.OverridableFlow
+import com.android.settingslib.spa.widget.dialog.AlertDialogButton
+import com.android.settingslib.spa.widget.dialog.SettingsAlertDialogWithIcon
 import com.android.settingslib.spa.widget.preference.SwitchPreference
 import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
 import com.android.wifi.flags.Flags
+import com.android.wifitrackerlib.WifiEntry
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.asExecutor
 import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.flow.callbackFlow
 
-/** Controller that controls whether the Wi-Fi Wakeup feature should be enabled. */
+/** Controller that controls whether the WEP network can be connected. */
 class WepNetworksPreferenceController(context: Context, preferenceKey: String) :
     ComposePreferenceController(context, preferenceKey) {
 
@@ -47,6 +56,8 @@
     @Composable
     override fun Content() {
         val checked by wepAllowedFlow.flow.collectAsStateWithLifecycle(initialValue = null)
+        var openDialog by rememberSaveable { mutableStateOf(false) }
+        val wifiInfo = wifiManager.connectionInfo
         SwitchPreference(object : SwitchPreferenceModel {
             override val title = stringResource(R.string.wifi_allow_wep_networks)
             override val summary = { getSummary() }
@@ -54,10 +65,40 @@
             override val changeable: () -> Boolean
                 get() = { carrierAllowed }
             override val onCheckedChange: (Boolean) -> Unit = { newChecked ->
-                wifiManager.setWepAllowed(newChecked)
-                wepAllowedFlow.override(newChecked)
+                if (!newChecked && wifiInfo.currentSecurityType == WifiEntry.SECURITY_WEP) {
+                    openDialog = true
+                } else {
+                    wifiManager.setWepAllowed(newChecked)
+                    wepAllowedFlow.override(newChecked)
+                }
             }
         })
+        if (openDialog) {
+            SettingsAlertDialogWithIcon(
+                onDismissRequest = { openDialog = false },
+                confirmButton = AlertDialogButton(
+                    stringResource(R.string.wifi_disconnect_button_text)
+                ) {
+                    wifiManager.setWepAllowed(false)
+                    wepAllowedFlow.override(false)
+                    openDialog = false
+                },
+                dismissButton =
+                AlertDialogButton(
+                    stringResource(R.string.wifi_cancel)
+                ) { openDialog = false },
+                title = String.format(
+                    stringResource(R.string.wifi_settings_wep_networks_disconnect_title),
+                    wifiInfo.ssid.removeSurrounding("\"")
+                ),
+                text = {
+                    Text(
+                        stringResource(R.string.wifi_settings_wep_networks_disconnect_summary),
+                        modifier = Modifier.fillMaxWidth(),
+                        textAlign = TextAlign.Center
+                    )
+                })
+        }
     }
 
     override fun getSummary(): String = mContext.getString(
diff --git a/tests/spa_unit/src/com/android/settings/wifi/WepNetworksPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/wifi/WepNetworksPreferenceControllerTest.kt
index 994abbf..49e6a17 100644
--- a/tests/spa_unit/src/com/android/settings/wifi/WepNetworksPreferenceControllerTest.kt
+++ b/tests/spa_unit/src/com/android/settings/wifi/WepNetworksPreferenceControllerTest.kt
@@ -20,6 +20,8 @@
 import android.net.wifi.WifiManager
 import androidx.compose.ui.test.assertIsOff
 import androidx.compose.ui.test.assertIsOn
+import androidx.compose.ui.test.isDisplayed
+import androidx.compose.ui.test.isNotDisplayed
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.onRoot
@@ -28,12 +30,16 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.android.settings.R
+import com.android.settings.dashboard.DashboardFragment
 import com.android.settings.spa.preference.ComposePreference
+import com.android.settingslib.spa.testutils.onDialogText
+import com.android.wifitrackerlib.WifiEntry
 import java.util.function.Consumer
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.Mockito
 import org.mockito.kotlin.any
 import org.mockito.kotlin.doAnswer
 import org.mockito.kotlin.doReturn
@@ -48,25 +54,30 @@
 
     private var wepAllowed = true
 
-    private val mockWifiManager = mock<WifiManager> {
+    private var mockWifiInfo = mock<android.net.wifi.WifiInfo> {
+        on { it.currentSecurityType } doReturn WifiEntry.SECURITY_EAP
+        on { it.ssid } doReturn SSID
+    }
+
+    private var mockWifiManager = mock<WifiManager> {
         on { queryWepAllowed(any(), any()) } doAnswer {
             @Suppress("UNCHECKED_CAST")
             val consumer = it.arguments[1] as Consumer<Boolean>
             consumer.accept(wepAllowed)
         }
         on { it.isWepSupported } doReturn true
+        on { it.connectionInfo } doReturn mockWifiInfo
     }
 
     private var context: Context =
         spy(ApplicationProvider.getApplicationContext()) {
             on { getSystemService(WifiManager::class.java) } doReturn mockWifiManager
         }
-    private var controller = WepNetworksPreferenceController(context, TEST_KEY)
 
+    private var controller = WepNetworksPreferenceController(context, TEST_KEY)
     private val preference = ComposePreference(context).apply { key = TEST_KEY }
     private val preferenceScreen = PreferenceManager(context).createPreferenceScreen(context)
 
-
     @Before
     fun setUp() {
         preferenceScreen.addPreference(preference)
@@ -79,6 +90,7 @@
         composeTestRule.setContent {
             controller.Content()
         }
+
         composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks))
             .assertIsOn()
     }
@@ -89,6 +101,7 @@
         composeTestRule.setContent {
             controller.Content()
         }
+
         composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks))
             .assertIsOff()
     }
@@ -101,7 +114,6 @@
         }
 
         composeTestRule.onRoot().performClick()
-
         composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks))
             .assertIsOn()
     }
@@ -114,12 +126,38 @@
         }
 
         composeTestRule.onRoot().performClick()
-
         composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks))
             .assertIsOff()
     }
 
+    @Test
+    fun whenClick_wepAllowed_openDialog() {
+        wepAllowed = true
+        Mockito.`when`(mockWifiInfo.currentSecurityType).thenReturn(WifiEntry.SECURITY_WEP)
+        composeTestRule.setContent {
+            controller.Content()
+        }
+
+        composeTestRule.onRoot().performClick()
+        composeTestRule.onDialogText(context.getString(R.string.wifi_disconnect_button_text))
+            .isDisplayed()
+    }
+
+    @Test
+    fun whenClick_wepDisallowed_openDialog() {
+        wepAllowed = false
+        Mockito.`when`(mockWifiInfo.currentSecurityType).thenReturn(WifiEntry.SECURITY_WEP)
+        composeTestRule.setContent {
+            controller.Content()
+        }
+
+        composeTestRule.onRoot().performClick()
+        composeTestRule.onDialogText(context.getString(R.string.wifi_disconnect_button_text))
+            .isNotDisplayed()
+    }
+
     private companion object {
         const val TEST_KEY = "test_key"
+        const val SSID = "ssid"
     }
 }
\ No newline at end of file
