diff --git a/java/com/android/contacts/common/res/layout/select_account_list_item.xml b/java/com/android/contacts/common/res/layout/select_account_list_item.xml
index 84cb1fd..bf52d6f 100644
--- a/java/com/android/contacts/common/res/layout/select_account_list_item.xml
+++ b/java/com/android/contacts/common/res/layout/select_account_list_item.xml
@@ -54,6 +54,7 @@
         android:includeFontPadding="false"
         android:maxLines="1"
         android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="@color/dialer_secondary_text_color"
         android:visibility="gone"/>
     <TextView
         android:id="@+id/hint"
@@ -62,6 +63,7 @@
         android:includeFontPadding="false"
         android:maxLines="1"
         android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="@color/dialer_secondary_text_color"
         android:visibility="gone"/>
   </LinearLayout>
 
diff --git a/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java b/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java
index e1fdd91..3ee21cc 100644
--- a/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java
+++ b/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java
@@ -57,7 +57,8 @@
  */
 public class SelectPhoneAccountDialogFragment extends DialogFragment {
 
-  private static final String ARG_OPTIONS = "options";
+  @VisibleForTesting public static final String ARG_OPTIONS = "options";
+
   private static final String ARG_IS_DEFAULT_CHECKED = "is_default_checked";
 
   private SelectPhoneAccountDialogOptions options =
@@ -221,18 +222,30 @@
     public void onDialogDismissed(@Nullable String callId) {}
   }
 
-  private static class SelectAccountListAdapter
+  static class SelectAccountListAdapter
       extends ArrayAdapter<SelectPhoneAccountDialogOptions.Entry> {
 
     private int mResId;
+    private final SelectPhoneAccountDialogOptions options;
 
     SelectAccountListAdapter(
         Context context, int resource, SelectPhoneAccountDialogOptions options) {
       super(context, resource, options.getEntriesList());
+      this.options = options;
       mResId = resource;
     }
 
     @Override
+    public boolean areAllItemsEnabled() {
+      return false;
+    }
+
+    @Override
+    public boolean isEnabled(int position) {
+      return options.getEntries(position).getEnabled();
+    }
+
+    @Override
     public View getView(int position, View convertView, ViewGroup parent) {
       LayoutInflater inflater =
           (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@@ -283,7 +296,10 @@
         holder.hintTextView.setVisibility(View.VISIBLE);
         holder.hintTextView.setText(entry.getHint());
       }
-
+      holder.labelTextView.setEnabled(entry.getEnabled());
+      holder.numberTextView.setEnabled(entry.getEnabled());
+      holder.hintTextView.setEnabled(entry.getEnabled());
+      holder.imageView.setImageAlpha(entry.getEnabled() ? 255 : 97 /* 38%*/);
       return rowView;
     }
 
@@ -297,7 +313,7 @@
       return info.get().getCountryIso().toUpperCase();
     }
 
-    private static final class ViewHolder {
+    static final class ViewHolder {
 
       TextView labelTextView;
       TextView numberTextView;
diff --git a/java/com/android/contacts/common/widget/select_phone_account_dialog_options.proto b/java/com/android/contacts/common/widget/select_phone_account_dialog_options.proto
index 9938f57..cc40c64 100644
--- a/java/com/android/contacts/common/widget/select_phone_account_dialog_options.proto
+++ b/java/com/android/contacts/common/widget/select_phone_account_dialog_options.proto
@@ -45,10 +45,10 @@
     // The hint to show under the phone account, for example showing the user
     // the account was selected frequently before.
     optional string hint = 3;
-    // Whether the account is actually selectable. Defaults to true Sometimes an
-    // account will be temporarily unusable, for example the user is already in
-    // a call so the other SIM cannot be used. Hint should also be set to inform
-    // the user why the account is unavailable.
-    optional bool enabled = 4;
+    // Whether the account is actually selectable. Defaults to true. Sometimes
+    // an account will be temporarily unusable, for example the user is already
+    // in a call so the other SIM cannot be used. Hint should also be set to
+    // inform the user why the account is unavailable.
+    optional bool enabled = 4 [default = true];
   }
 }
\ No newline at end of file
diff --git a/java/com/android/dialer/logging/dialer_impression.proto b/java/com/android/dialer/logging/dialer_impression.proto
index c6c93ee..7cd2207 100644
--- a/java/com/android/dialer/logging/dialer_impression.proto
+++ b/java/com/android/dialer/logging/dialer_impression.proto
@@ -12,7 +12,7 @@
   // Event enums to be used for Impression Logging in Dialer.
   // It's perfectly acceptable for this enum to be large
   // Values should be from 1000 to 100000.
-  // Next Tag: 1389
+  // Next Tag: 1392
   enum Type {
     UNKNOWN_AOSP_EVENT_TYPE = 1000;
 
@@ -626,7 +626,11 @@
     DUAL_SIM_SELECTION_NON_SUGGESTED_SIM_SELECTED = 1304;
     DUAL_SIM_SELECTION_PREFERRED_SET = 1305;
     DUAL_SIM_SELECTION_PREFERRED_USED = 1306;
+    DUAL_SIM_SELECTION_PREFERRED_NOT_SELECTABLE = 1389;
     DUAL_SIM_SELECTION_GLOBAL_USED = 1307;
+    DUAL_SIM_SELECTION_GLOBAL_NOT_SELECTABLE = 1390;
+    DUAL_SIM_SELECTION_SUGGESTION_AUTO_SELECTED = 1322;
+    DUAL_SIM_SELECTION_SUGGESTION_AUTO_NOT_SELECTABLE = 1391;
 
     DUO_CALL_LOG_SET_UP_INSTALL = 1308;
     DUO_CALL_LOG_SET_UP_ACTIVATE = 1309;
@@ -655,8 +659,6 @@
     // Drag bubble to bottom and end call
     BUBBLE_V2_BOTTOM_ACTION_END_CALL = 1321;
 
-    DUAL_SIM_SELECTION_SUGGESTION_AUTO_SELECTED = 1322;
-
     // Bubble appears
     BUBBLE_V2_SHOW = 1323;
 
diff --git a/java/com/android/dialer/precall/impl/CallingAccountSelector.java b/java/com/android/dialer/precall/impl/CallingAccountSelector.java
index 6514a49..8f63fa0 100644
--- a/java/com/android/dialer/precall/impl/CallingAccountSelector.java
+++ b/java/com/android/dialer/precall/impl/CallingAccountSelector.java
@@ -30,12 +30,13 @@
 import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment.SelectPhoneAccountListener;
 import com.android.contacts.common.widget.SelectPhoneAccountDialogOptions;
 import com.android.contacts.common.widget.SelectPhoneAccountDialogOptionsUtil;
+import com.android.dialer.activecalls.ActiveCallInfo;
+import com.android.dialer.activecalls.ActiveCallsComponent;
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.DialerExecutorComponent;
 import com.android.dialer.configprovider.ConfigProviderBindings;
-import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.DialerImpression.Type;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.precall.PreCallAction;
@@ -43,11 +44,13 @@
 import com.android.dialer.precall.PreCallCoordinator.PendingAction;
 import com.android.dialer.preferredsim.PreferredAccountRecorder;
 import com.android.dialer.preferredsim.PreferredAccountWorker;
+import com.android.dialer.preferredsim.PreferredAccountWorker.Result;
 import com.android.dialer.preferredsim.suggestion.SuggestionProvider;
 import com.android.dialer.preferredsim.suggestion.SuggestionProvider.Suggestion;
-import com.android.dialer.telecom.TelecomUtil;
 import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
 import java.util.List;
+import java.util.Objects;
 
 /** PreCallAction to select which phone account to call with. Ignored if there's only one account */
 @SuppressWarnings("MissingPermission")
@@ -78,17 +81,6 @@
     if (accounts.size() <= 1) {
       return false;
     }
-
-    if (TelecomUtil.isInManagedCall(context)) {
-      // Most devices are DSDS (dual SIM dual standby) which only one SIM can have active calls at
-      // a time. Telecom will ignore the phone account handle and use the current active SIM, thus
-      // there's no point of selecting SIMs
-      // TODO(a bug): let the user know selections are not available and preferred SIM is not
-      // used
-      // TODO(twyen): support other dual SIM modes when the API is exposed.
-      return false;
-    }
-
     return true;
   }
 
@@ -137,12 +129,7 @@
                 return;
               }
               if (result.getPhoneAccountHandle().isPresent()) {
-                Logger.get(coordinator.getActivity())
-                    .logImpression(DialerImpression.Type.DUAL_SIM_SELECTION_PREFERRED_USED);
-                coordinator
-                    .getBuilder()
-                    .setPhoneAccountHandle(result.getPhoneAccountHandle().get());
-                pendingAction.finish();
+                usePreferredAccount(coordinator, pendingAction, result);
                 return;
               }
               PhoneAccountHandle defaultPhoneAccount =
@@ -150,10 +137,7 @@
                       .getSystemService(TelecomManager.class)
                       .getDefaultOutgoingPhoneAccount(builder.getUri().getScheme());
               if (defaultPhoneAccount != null) {
-                Logger.get(coordinator.getActivity())
-                    .logImpression(DialerImpression.Type.DUAL_SIM_SELECTION_GLOBAL_USED);
-                builder.setPhoneAccountHandle(defaultPhoneAccount);
-                pendingAction.finish();
+                useDefaultAccount(coordinator, pendingAction, result, defaultPhoneAccount);
                 return;
               }
               if (result.getSuggestion().isPresent()) {
@@ -161,18 +145,7 @@
                     "CallingAccountSelector.processPreferredAccount",
                     "SIM suggested: " + result.getSuggestion().get().reason);
                 if (result.getSuggestion().get().shouldAutoSelect) {
-                  Logger.get(coordinator.getActivity())
-                      .logImpression(
-                          DialerImpression.Type.DUAL_SIM_SELECTION_SUGGESTION_AUTO_SELECTED);
-                  LogUtil.i(
-                      "CallingAccountSelector.processPreferredAccount", "Auto selected suggestion");
-                  builder.setPhoneAccountHandle(result.getSuggestion().get().phoneAccountHandle);
-                  builder
-                      .getInCallUiIntentExtras()
-                      .putString(
-                          SuggestionProvider.EXTRA_SIM_SUGGESTION_REASON,
-                          result.getSuggestion().get().reason.name());
-                  pendingAction.finish();
+                  useSuggestedAccount(coordinator, pendingAction, result);
                   return;
                 }
               }
@@ -187,6 +160,120 @@
         .executeParallel(activity);
   }
 
+  private void usePreferredAccount(
+      PreCallCoordinator coordinator, PendingAction pendingAction, Result result) {
+    String phoneNumber = coordinator.getBuilder().getUri().getSchemeSpecificPart();
+    if (isSelectable(coordinator.getActivity(), result.getPhoneAccountHandle().get())) {
+      Logger.get(coordinator.getActivity()).logImpression(Type.DUAL_SIM_SELECTION_PREFERRED_USED);
+      coordinator.getBuilder().setPhoneAccountHandle(result.getPhoneAccountHandle().get());
+      pendingAction.finish();
+    } else {
+      Logger.get(coordinator.getActivity())
+          .logImpression(Type.DUAL_SIM_SELECTION_PREFERRED_NOT_SELECTABLE);
+      LogUtil.i("CallingAccountSelector.usePreferredAccount", "preferred account not selectable");
+      showDialog(
+          coordinator,
+          pendingAction,
+          result.getDataId().orNull(),
+          phoneNumber,
+          result.getSuggestion().orNull());
+    }
+  }
+
+  private void useDefaultAccount(
+      PreCallCoordinator coordinator,
+      PendingAction pendingAction,
+      Result result,
+      PhoneAccountHandle defaultPhoneAccount) {
+    CallIntentBuilder builder = coordinator.getBuilder();
+    String phoneNumber = builder.getUri().getSchemeSpecificPart();
+    if (isSelectable(coordinator.getActivity(), defaultPhoneAccount)) {
+      Logger.get(coordinator.getActivity()).logImpression(Type.DUAL_SIM_SELECTION_GLOBAL_USED);
+      builder.setPhoneAccountHandle(defaultPhoneAccount);
+      pendingAction.finish();
+    } else {
+      Logger.get(coordinator.getActivity())
+          .logImpression(Type.DUAL_SIM_SELECTION_GLOBAL_NOT_SELECTABLE);
+      LogUtil.i("CallingAccountSelector.useDefaultAccount", "default account not selectable");
+      showDialog(
+          coordinator,
+          pendingAction,
+          result.getDataId().orNull(),
+          phoneNumber,
+          result.getSuggestion().orNull());
+    }
+  }
+
+  private void useSuggestedAccount(
+      PreCallCoordinator coordinator, PendingAction pendingAction, Result result) {
+    CallIntentBuilder builder = coordinator.getBuilder();
+    String phoneNumber = builder.getUri().getSchemeSpecificPart();
+    if (isSelectable(coordinator.getActivity(), result.getSuggestion().get().phoneAccountHandle)) {
+      Logger.get(coordinator.getActivity())
+          .logImpression(Type.DUAL_SIM_SELECTION_SUGGESTION_AUTO_SELECTED);
+      LogUtil.i("CallingAccountSelector.processPreferredAccount", "Auto selected suggestion");
+      builder.setPhoneAccountHandle(result.getSuggestion().get().phoneAccountHandle);
+      builder
+          .getInCallUiIntentExtras()
+          .putString(
+              SuggestionProvider.EXTRA_SIM_SUGGESTION_REASON,
+              result.getSuggestion().get().reason.name());
+      pendingAction.finish();
+    } else {
+      LogUtil.i("CallingAccountSelector.useSuggestedAccount", "suggested account not selectable");
+      Logger.get(coordinator.getActivity())
+          .logImpression(Type.DUAL_SIM_SELECTION_SUGGESTION_AUTO_NOT_SELECTABLE);
+      showDialog(
+          coordinator,
+          pendingAction,
+          result.getDataId().orNull(),
+          phoneNumber,
+          result.getSuggestion().orNull());
+    }
+  }
+
+  /**
+   * Most devices are DSDS (dual SIM dual standby) which only one SIM can have active calls at a
+   * time. TODO(twyen): support other dual SIM modes when the API is exposed.
+   */
+  private static boolean isSelectable(Context context, PhoneAccountHandle phoneAccountHandle) {
+    ImmutableList<ActiveCallInfo> activeCalls =
+        ActiveCallsComponent.get(context).activeCalls().getActiveCalls();
+    if (activeCalls.isEmpty()) {
+      return true;
+    }
+    for (ActiveCallInfo activeCall : activeCalls) {
+      if (Objects.equals(phoneAccountHandle, activeCall.phoneAccountHandle().orNull())) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private static Optional<String> getActiveCallLabel(Context context) {
+    ImmutableList<ActiveCallInfo> activeCalls =
+        ActiveCallsComponent.get(context).activeCalls().getActiveCalls();
+
+    if (activeCalls.isEmpty()) {
+      LogUtil.e("CallingAccountSelector.getActiveCallLabel", "active calls no longer exist");
+      return Optional.absent();
+    }
+    ActiveCallInfo activeCall = activeCalls.get(0);
+    if (!activeCall.phoneAccountHandle().isPresent()) {
+      LogUtil.e("CallingAccountSelector.getActiveCallLabel", "active call has no phone account");
+      return Optional.absent();
+    }
+    PhoneAccount phoneAccount =
+        context
+            .getSystemService(TelecomManager.class)
+            .getPhoneAccount(activeCall.phoneAccountHandle().get());
+    if (phoneAccount == null) {
+      LogUtil.e("CallingAccountSelector.getActiveCallLabel", "phone account not found");
+      return Optional.absent();
+    }
+    return Optional.of(phoneAccount.getLabel().toString());
+  }
+
   @MainThread
   private void showDialog(
       PreCallCoordinator coordinator,
@@ -228,10 +315,23 @@
       SelectPhoneAccountDialogOptions.Entry.Builder entryBuilder =
           SelectPhoneAccountDialogOptions.Entry.newBuilder();
       SelectPhoneAccountDialogOptionsUtil.setPhoneAccountHandle(entryBuilder, phoneAccountHandle);
-      Optional<String> hint =
-          SuggestionProvider.getHint(coordinator.getActivity(), phoneAccountHandle, suggestion);
-      if (hint.isPresent()) {
-        entryBuilder.setHint(hint.get());
+      if (isSelectable(coordinator.getActivity(), phoneAccountHandle)) {
+        Optional<String> hint =
+            SuggestionProvider.getHint(coordinator.getActivity(), phoneAccountHandle, suggestion);
+        if (hint.isPresent()) {
+          entryBuilder.setHint(hint.get());
+        }
+      } else {
+        entryBuilder.setEnabled(false);
+        Optional<String> activeCallLabel = getActiveCallLabel(coordinator.getActivity());
+        if (activeCallLabel.isPresent()) {
+          entryBuilder.setHint(
+              coordinator
+                  .getActivity()
+                  .getString(
+                      R.string.pre_call_select_phone_account_hint_other_sim_in_use,
+                      activeCallLabel.get()));
+        }
       }
       optionsBuilder.addEntries(entryBuilder);
     }
diff --git a/java/com/android/dialer/precall/impl/res/values/strings.xml b/java/com/android/dialer/precall/impl/res/values/strings.xml
index 4bd5d36..3691271 100644
--- a/java/com/android/dialer/precall/impl/res/values/strings.xml
+++ b/java/com/android/dialer/precall/impl/res/values/strings.xml
@@ -14,7 +14,7 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License
   -->
-<resources>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
   <!-- Toast when the user tried to place a call but has revoked phone permission [CHAR_LIMIT=none]  -->
   <string name="pre_call_permission_check_no_phone_permission">Cannot make call without phone permission</string>
 
@@ -26,4 +26,8 @@
    same contact and never ask again [CHAR LIMIT=40]-->
   <string name="pre_call_select_phone_account_remember">Remember this choice</string>
 
+  <!-- Hint to show under a SIM entry when selecting SIM for call on a multi-SIM device, when the
+  call cannot be placed with the SIM because there is already a call on the other SIM,
+  [CHAR LIMIT=40]-->
+  <string name="pre_call_select_phone_account_hint_other_sim_in_use">Not available while using <xliff:g example="SIM 1" id="other_sim">%1$s</xliff:g></string>
 </resources>
\ No newline at end of file
diff --git a/java/com/android/dialer/theme/res/color/dialer_primary_text_color.xml b/java/com/android/dialer/theme/res/color/dialer_primary_text_color.xml
new file mode 100644
index 0000000..347db41
--- /dev/null
+++ b/java/com/android/dialer/theme/res/color/dialer_primary_text_color.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<!-- Primary text color in the Phone app -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_enabled="false" android:color="@color/dialer_disabled_text_color"/>
+  <item android:color="#212121"/>
+</selector>
\ No newline at end of file
diff --git a/java/com/android/dialer/theme/res/color/dialer_secondary_text_color.xml b/java/com/android/dialer/theme/res/color/dialer_secondary_text_color.xml
new file mode 100644
index 0000000..920b467
--- /dev/null
+++ b/java/com/android/dialer/theme/res/color/dialer_secondary_text_color.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<!-- Secondary text color in the Phone app -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_enabled="false" android:color="@color/dialer_disabled_text_color"/>
+  <item android:color="#636363"/>
+</selector>
\ No newline at end of file
diff --git a/java/com/android/dialer/theme/res/values/colors.xml b/java/com/android/dialer/theme/res/values/colors.xml
index e80fc4b..2185d86 100644
--- a/java/com/android/dialer/theme/res/values/colors.xml
+++ b/java/com/android/dialer/theme/res/values/colors.xml
@@ -36,15 +36,11 @@
 
   <color name="dialer_secondary_color">#F50057</color>
 
-  <!-- Primary text color in the Phone app -->
-  <color name="dialer_primary_text_color">#333333</color>
   <color name="dialer_primary_text_color_white">#ffffff</color>
   <color name="dialer_edit_text_hint_color">#DE78909C</color>
 
-  <!-- Secondary text color in the Phone app -->
-  <color name="dialer_secondary_text_color">#636363</color>
   <!-- 38% opacity -->
-  <color name="dialer_secondary_text_color_hiden">#61000000</color>
+  <color name="dialer_disabled_text_color">#9E9E9E</color>
 
   <color name="dialer_link_color">#2A56C6</color>
 
diff --git a/java/com/android/incallui/ConferenceParticipantListAdapter.java b/java/com/android/incallui/ConferenceParticipantListAdapter.java
index 4780974..dc793f7 100644
--- a/java/com/android/incallui/ConferenceParticipantListAdapter.java
+++ b/java/com/android/incallui/ConferenceParticipantListAdapter.java
@@ -356,7 +356,7 @@
     statusTextView.setText(onHoldText);
     statusTextView.setVisibility(View.VISIBLE);
 
-    int onHoldColor = getContext().getColor(R.color.dialer_secondary_text_color_hiden);
+    int onHoldColor = getContext().getColor(R.color.dialer_disabled_text_color);
     nameTextView.setTextColor(onHoldColor);
     numberTextView.setTextColor(onHoldColor);
 
diff --git a/java/com/android/incallui/res/layout/caller_in_conference.xml b/java/com/android/incallui/res/layout/caller_in_conference.xml
index be4eca5..23bb285 100644
--- a/java/com/android/incallui/res/layout/caller_in_conference.xml
+++ b/java/com/android/incallui/res/layout/caller_in_conference.xml
@@ -68,7 +68,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="@style/SecondaryText"
-            android:textColor="@color/dialer_secondary_text_color_hiden"
+            android:textColor="@color/dialer_disabled_text_color"
             android:visibility="gone"/>
 
         <!-- Number -->
