diff --git a/res/values/strings.xml b/res/values/strings.xml
index 274d74c..9095828 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -166,8 +166,6 @@
     <string name="wifi_calling_use_call_assistant_summary">Let apps or services manage networks used for calls</string>
     <!-- Label for setting to configure the selected call assistant. -->
     <string name="wifi_calling_call_assistant_configure">Configure</string>
-    <!-- Label for setting to configure the selected call assistant when no call assistant is chosen. -->
-    <string name="wifi_calling_call_assistant_configure_no_selection">Call assistant off</string>
 
     <!-- Built-in label for the default connection service setting. -->
     <string name="connection_service_default_label">Built-in connection service</string>
diff --git a/src/com/android/phone/settings/PhoneAccountSettingsFragment.java b/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
index 3869294..19e4786 100644
--- a/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
+++ b/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
@@ -140,7 +140,7 @@
             mConfigureCallAssistant =
                     getPreferenceScreen().findPreference(CONFIGURE_CALL_ASSISTANT_PREF_KEY);
             mConfigureCallAssistant.setOnPreferenceClickListener(this);
-            updateConfigureCallAssistantSummary();
+            updateConfigureCallAssistant();
         }
 
         if (SipUtil.isVoipSupported(getActivity())) {
@@ -208,7 +208,7 @@
                 } else {
                     mTelecomManager.setSimCallManager(null);
                 }
-                updateConfigureCallAssistantSummary();
+                updateConfigureCallAssistant();
             } else {
                 Log.w(LOG_TAG, "Single call assistant expected but " + simCallManagers.size()
                     + " found. Ignoring preference change.");
@@ -221,15 +221,8 @@
     @Override
     public boolean onPreferenceClick(Preference pref) {
         if (pref == mConfigureCallAssistant) {
-            String packageName = null;
-            PhoneAccountHandle handle = mTelecomManager.getSimCallManager();
-            if (handle != null) {
-                packageName = handle.getComponentName().getPackageName();
-            }
-            if (packageName != null) {
-                Intent intent = new Intent(TelecomManager.ACTION_CONNECTION_SERVICE_CONFIGURE)
-                        .addCategory(Intent.CATEGORY_DEFAULT)
-                        .setPackage(packageName);
+            Intent intent = getConfigureCallAssistantIntent();
+            if (intent != null) {
                 try {
                     startActivity(intent);
                 } catch (ActivityNotFoundException e) {
@@ -271,7 +264,7 @@
             updateDefaultOutgoingAccountsModel();
         } else if (pref == mSelectCallAssistant) {
             updateCallAssistantModel();
-            updateConfigureCallAssistantSummary();
+            updateConfigureCallAssistant();
         }
     }
 
@@ -281,7 +274,7 @@
     @Override
     public void onAccountChanged(AccountSelectionPreference pref) {
         if (pref == mSelectCallAssistant) {
-            updateConfigureCallAssistantSummary();
+            updateConfigureCallAssistant();
         }
     }
 
@@ -327,16 +320,19 @@
     }
 
     /**
-     * Updates the summary on the "configure call assistant" preference.
+     * Shows or hides the "configure call assistant" preference.
      */
-    private void updateConfigureCallAssistantSummary() {
-        if (mTelecomManager.getSimCallManager() == null) {
-            mConfigureCallAssistant.setSummary(
-                    R.string.wifi_calling_call_assistant_configure_no_selection);
-            mConfigureCallAssistant.setEnabled(false);
+    private void updateConfigureCallAssistant() {
+        Intent intent = getConfigureCallAssistantIntent();
+        boolean shouldShow = intent != null && !mApplicationContext.getPackageManager()
+            .queryIntentActivities(intent, 0).isEmpty();
+
+        PreferenceCategory callAssistantCategory = (PreferenceCategory)
+                getPreferenceScreen().findPreference(CALL_ASSISTANT_CATEGORY_PREF_KEY);
+        if (shouldShow) {
+            callAssistantCategory.addPreference(mConfigureCallAssistant);
         } else {
-            mConfigureCallAssistant.setSummary(null);
-            mConfigureCallAssistant.setEnabled(true);
+            callAssistantCategory.removePreference(mConfigureCallAssistant);
         }
     }
 
@@ -357,4 +353,17 @@
             mAccountList.addPreference(accountPreference);
         }
     }
+
+    private Intent getConfigureCallAssistantIntent() {
+        PhoneAccountHandle handle = mTelecomManager.getSimCallManager();
+        if (handle != null) {
+            String packageName = handle.getComponentName().getPackageName();
+            if (packageName != null) {
+                return new Intent(TelecomManager.ACTION_CONNECTION_SERVICE_CONFIGURE)
+                        .addCategory(Intent.CATEGORY_DEFAULT)
+                        .setPackage(packageName);
+            }
+        }
+        return null;
+    }
 }
