diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index adf7f1b..6067c42 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -551,7 +551,7 @@
         if (mCallLogCache.isVoicemailNumber(accountHandle, number)) {
           // Call to generic voicemail number, in case there are multiple accounts
           primaryActionButtonView.setTag(IntentProvider.getReturnVoicemailCallIntentProvider());
-        } else if (this.info != null && this.info.lookupKey != null) {
+        } else if (canSupportAssistedDialing()) {
           primaryActionButtonView.setTag(
               IntentProvider.getAssistedDialIntentProvider(
                   number + postDialDigits,
@@ -618,7 +618,7 @@
         ((TextView) callButtonView.findViewById(R.id.call_type_or_location_text));
 
     if (canPlaceCallToNumber) {
-      if (this.info != null && this.info.lookupKey != null) {
+      if (canSupportAssistedDialing()) {
         callButtonView.setTag(
             IntentProvider.getAssistedDialIntentProvider(
                 number, mContext, mContext.getSystemService(TelephonyManager.class)));
@@ -685,7 +685,7 @@
               && mCachedNumberLookupService.canReportAsInvalid(info.sourceType, info.objectId);
       detailsButtonView.setTag(
           IntentProvider.getCallDetailIntentProvider(
-              callDetailsEntries, buildContact(), canReportCallerId));
+              callDetailsEntries, buildContact(), canReportCallerId, canSupportAssistedDialing()));
     }
 
     boolean isBlockedOrSpam = blockId != null || (isSpamFeatureEnabled && isSpam);
@@ -764,6 +764,10 @@
     return accountHandle.getComponentName().equals(mDefaultPhoneAccountHandle.getComponentName());
   }
 
+  private boolean canSupportAssistedDialing() {
+    return info != null && info.lookupKey != null;
+  }
+
   private boolean canSupportCarrierVideoCall() {
     return mCallLogCache.canRelyOnVideoPresence()
         && info != null
diff --git a/java/com/android/dialer/app/calllog/IntentProvider.java b/java/com/android/dialer/app/calllog/IntentProvider.java
index 52a7b0f..5030de5 100644
--- a/java/com/android/dialer/app/calllog/IntentProvider.java
+++ b/java/com/android/dialer/app/calllog/IntentProvider.java
@@ -124,15 +124,20 @@
    *
    * @param callDetailsEntries The call details of the other calls grouped together with the call.
    * @param contact The contact with which this call details intent pertains to.
+   * @param canReportCallerId Whether reporting a caller ID is supported.
+   * @param canSupportAssistedDialing Whether assisted dialing is supported.
    * @return The call details intent provider.
    */
   public static IntentProvider getCallDetailIntentProvider(
-      CallDetailsEntries callDetailsEntries, DialerContact contact, boolean canReportCallerId) {
+      CallDetailsEntries callDetailsEntries,
+      DialerContact contact,
+      boolean canReportCallerId,
+      boolean canSupportAssistedDialing) {
     return new IntentProvider() {
       @Override
       public Intent getIntent(Context context) {
         return CallDetailsActivity.newInstance(
-            context, callDetailsEntries, contact, canReportCallerId);
+            context, callDetailsEntries, contact, canReportCallerId, canSupportAssistedDialing);
       }
     };
   }
diff --git a/java/com/android/dialer/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java
index 569aaa5..d7f414b 100644
--- a/java/com/android/dialer/calldetails/CallDetailsActivity.java
+++ b/java/com/android/dialer/calldetails/CallDetailsActivity.java
@@ -16,6 +16,7 @@
 
 package com.android.dialer.calldetails;
 
+import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.Intent;
 import android.os.AsyncTask;
@@ -29,21 +30,30 @@
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.Toolbar;
 import android.support.v7.widget.Toolbar.OnMenuItemClickListener;
+import android.telephony.TelephonyManager;
 import android.view.MenuItem;
+import android.widget.Toast;
+import com.android.dialer.assisteddialing.ConcreteCreator;
 import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry;
+import com.android.dialer.callintent.CallInitiationType;
+import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.AsyncTaskExecutors;
+import com.android.dialer.constants.ActivityRequestCodes;
 import com.android.dialer.dialercontact.DialerContact;
 import com.android.dialer.enrichedcall.EnrichedCallComponent;
 import com.android.dialer.enrichedcall.EnrichedCallManager.HistoricalDataChangedListener;
 import com.android.dialer.enrichedcall.historyquery.proto.HistoryResult;
+import com.android.dialer.lightbringer.Lightbringer;
+import com.android.dialer.lightbringer.LightbringerComponent;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.logging.UiAction;
 import com.android.dialer.performancereport.PerformanceReport;
 import com.android.dialer.postcall.PostCall;
 import com.android.dialer.protos.ProtoParsers;
+import com.android.dialer.util.DialerUtils;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -51,6 +61,7 @@
 /** Displays the details of a specific call log entry. */
 public class CallDetailsActivity extends AppCompatActivity
     implements OnMenuItemClickListener,
+        CallDetailsHeaderViewHolder.CallbackActionListener,
         CallDetailsFooterViewHolder.ReportCallIdListener,
         HistoricalDataChangedListener {
 
@@ -59,6 +70,7 @@
   private static final String EXTRA_CALL_DETAILS_ENTRIES = "call_details_entries";
   private static final String EXTRA_CONTACT = "contact";
   private static final String EXTRA_CAN_REPORT_CALLER_ID = "can_report_caller_id";
+  private static final String EXTRA_CAN_SUPPORT_ASSISTED_DIALING = "can_support_assisted_dialing";
   private static final String TASK_DELETE = "task_delete";
 
   private CallDetailsEntries entries;
@@ -74,7 +86,8 @@
       Context context,
       @NonNull CallDetailsEntries details,
       @NonNull DialerContact contact,
-      boolean canReportCallerId) {
+      boolean canReportCallerId,
+      boolean canSupportAssistedDialing) {
     Assert.isNotNull(details);
     Assert.isNotNull(contact);
 
@@ -82,6 +95,7 @@
     ProtoParsers.put(intent, EXTRA_CONTACT, contact);
     ProtoParsers.put(intent, EXTRA_CALL_DETAILS_ENTRIES, details);
     intent.putExtra(EXTRA_CAN_REPORT_CALLER_ID, canReportCallerId);
+    intent.putExtra(EXTRA_CAN_SUPPORT_ASSISTED_DIALING, canSupportAssistedDialing);
     return intent;
   }
 
@@ -142,7 +156,13 @@
     entries =
         ProtoParsers.getTrusted(
             intent, EXTRA_CALL_DETAILS_ENTRIES, CallDetailsEntries.getDefaultInstance());
-    adapter = new CallDetailsAdapter(this, contact, entries.getEntriesList(), this);
+    adapter =
+        new CallDetailsAdapter(
+            this /* context */,
+            contact,
+            entries.getEntriesList(),
+            this /* callbackListener */,
+            this /* reportCallIdListener */);
 
     RecyclerView recyclerView = findViewById(R.id.recycler_view);
     recyclerView.setLayoutManager(new LinearLayoutManager(this));
@@ -188,6 +208,51 @@
             .getEntriesList());
   }
 
+  @Override
+  public void placeImsVideoCall(String phoneNumber) {
+    Logger.get(this).logImpression(DialerImpression.Type.CALL_DETAILS_IMS_VIDEO_CALL_BACK);
+    DialerUtils.startActivityWithErrorToast(
+        this,
+        new CallIntentBuilder(phoneNumber, CallInitiationType.Type.CALL_DETAILS)
+            .setIsVideoCall(true)
+            .build());
+  }
+
+  @Override
+  public void placeLightbringerCall(String phoneNumber) {
+    Logger.get(this).logImpression(DialerImpression.Type.CALL_DETAILS_LIGHTBRINGER_CALL_BACK);
+    Lightbringer lightbringer = LightbringerComponent.get(this).getLightbringer();
+    if (!lightbringer.isReachable(this, phoneNumber)) {
+      placeImsVideoCall(phoneNumber);
+      return;
+    }
+
+    try {
+      startActivityForResult(
+          lightbringer.getIntent(this, phoneNumber), ActivityRequestCodes.DIALTACTS_LIGHTBRINGER);
+    } catch (ActivityNotFoundException e) {
+      Toast.makeText(this, R.string.activity_not_available, Toast.LENGTH_SHORT).show();
+    }
+  }
+
+  @Override
+  public void placeVoiceCall(String phoneNumber, String postDialDigits) {
+    Logger.get(this).logImpression(DialerImpression.Type.CALL_DETAILS_VOICE_CALL_BACK);
+
+    boolean canSupportedAssistedDialing =
+        getIntent().getExtras().getBoolean(EXTRA_CAN_SUPPORT_ASSISTED_DIALING, false);
+    CallIntentBuilder callIntentBuilder =
+        new CallIntentBuilder(phoneNumber + postDialDigits, CallInitiationType.Type.CALL_DETAILS);
+    if (canSupportedAssistedDialing) {
+      callIntentBuilder.setAllowAssistedDial(
+          true,
+          ConcreteCreator.createNewAssistedDialingMediator(
+              getSystemService(TelephonyManager.class), this));
+    }
+
+    DialerUtils.startActivityWithErrorToast(this, callIntentBuilder.build());
+  }
+
   @NonNull
   private Map<CallDetailsEntry, List<HistoryResult>> getAllHistoricalData(
       @Nullable String number, @NonNull CallDetailsEntries entries) {
diff --git a/java/com/android/dialer/calldetails/CallDetailsAdapter.java b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
index 6455874..1f00d9d 100644
--- a/java/com/android/dialer/calldetails/CallDetailsAdapter.java
+++ b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
@@ -23,7 +23,10 @@
 import android.view.LayoutInflater;
 import android.view.ViewGroup;
 import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry;
+import com.android.dialer.calldetails.CallDetailsHeaderViewHolder.CallbackActionListener;
 import com.android.dialer.calllogutils.CallTypeHelper;
+import com.android.dialer.calllogutils.CallbackActionHelper;
+import com.android.dialer.calllogutils.CallbackActionHelper.CallbackAction;
 import com.android.dialer.common.Assert;
 import com.android.dialer.dialercontact.DialerContact;
 import com.android.dialer.lightbringer.LightbringerComponent;
@@ -37,7 +40,8 @@
   private static final int FOOTER_VIEW_TYPE = 3;
 
   private final DialerContact contact;
-  private final CallDetailsFooterViewHolder.ReportCallIdListener listener;
+  private final CallbackActionListener callbackActionListener;
+  private final CallDetailsFooterViewHolder.ReportCallIdListener reportCallIdListener;
   private final CallTypeHelper callTypeHelper;
   private List<CallDetailsEntry> callDetailsEntries;
 
@@ -45,10 +49,12 @@
       Context context,
       @NonNull DialerContact contact,
       @NonNull List<CallDetailsEntry> callDetailsEntries,
-      CallDetailsFooterViewHolder.ReportCallIdListener listener) {
+      CallbackActionListener callbackActionListener,
+      CallDetailsFooterViewHolder.ReportCallIdListener reportCallIdListener) {
     this.contact = Assert.isNotNull(contact);
     this.callDetailsEntries = callDetailsEntries;
-    this.listener = listener;
+    this.callbackActionListener = callbackActionListener;
+    this.reportCallIdListener = reportCallIdListener;
     callTypeHelper =
         new CallTypeHelper(
             context.getResources(), LightbringerComponent.get(context).getLightbringer());
@@ -60,13 +66,13 @@
     switch (viewType) {
       case HEADER_VIEW_TYPE:
         return new CallDetailsHeaderViewHolder(
-            inflater.inflate(R.layout.contact_container, parent, false));
+            inflater.inflate(R.layout.contact_container, parent, false), callbackActionListener);
       case CALL_ENTRY_VIEW_TYPE:
         return new CallDetailsEntryViewHolder(
             inflater.inflate(R.layout.call_details_entry, parent, false));
       case FOOTER_VIEW_TYPE:
         return new CallDetailsFooterViewHolder(
-            inflater.inflate(R.layout.call_details_footer, parent, false), listener);
+            inflater.inflate(R.layout.call_details_footer, parent, false), reportCallIdListener);
       default:
         throw Assert.createIllegalStateFailException(
             "No ViewHolder available for viewType: " + viewType);
@@ -76,7 +82,7 @@
   @Override
   public void onBindViewHolder(ViewHolder holder, int position) {
     if (position == 0) { // Header
-      ((CallDetailsHeaderViewHolder) holder).updateContactInfo(contact);
+      ((CallDetailsHeaderViewHolder) holder).updateContactInfo(contact, getCallbackAction());
     } else if (position == getItemCount() - 1) {
       ((CallDetailsFooterViewHolder) holder).setPhoneNumber(contact.getNumber());
     } else {
@@ -110,4 +116,12 @@
     callDetailsEntries = entries;
     notifyDataSetChanged();
   }
+
+  private @CallbackAction int getCallbackAction() {
+    Assert.checkState(!callDetailsEntries.isEmpty());
+
+    CallDetailsEntry entry = callDetailsEntries.get(0);
+    return CallbackActionHelper.getCallbackAction(
+        contact.getNumber(), entry.getFeatures(), entry.getIsLightbringerCall());
+  }
 }
diff --git a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
index dcd8e35..7c3892a 100644
--- a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
+++ b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
@@ -23,23 +23,22 @@
 import android.text.TextUtils;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.widget.ImageView;
 import android.widget.QuickContactBadge;
 import android.widget.TextView;
-import com.android.dialer.callintent.CallInitiationType;
-import com.android.dialer.callintent.CallIntentBuilder;
+import com.android.dialer.calllogutils.CallbackActionHelper.CallbackAction;
 import com.android.dialer.common.Assert;
 import com.android.dialer.contactphoto.ContactPhotoManager;
 import com.android.dialer.dialercontact.DialerContact;
-import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.InteractionEvent;
 import com.android.dialer.logging.Logger;
-import com.android.dialer.util.DialerUtils;
 
 /** ViewHolder for Header/Contact in {@link CallDetailsActivity}. */
 public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder
     implements OnClickListener {
 
-  private final View callBackButton;
+  private final CallbackActionListener callbackActionListener;
+  private final ImageView callbackButton;
   private final TextView nameView;
   private final TextView numberView;
   private final TextView networkView;
@@ -47,24 +46,26 @@
   private final Context context;
 
   private DialerContact contact;
+  private @CallbackAction int callbackAction;
 
-  CallDetailsHeaderViewHolder(View container) {
+  CallDetailsHeaderViewHolder(View container, CallbackActionListener callbackActionListener) {
     super(container);
     context = container.getContext();
-    callBackButton = container.findViewById(R.id.call_back_button);
+    callbackButton = container.findViewById(R.id.call_back_button);
     nameView = container.findViewById(R.id.contact_name);
     numberView = container.findViewById(R.id.phone_number);
     networkView = container.findViewById(R.id.network);
     contactPhoto = container.findViewById(R.id.quick_contact_photo);
 
-    callBackButton.setOnClickListener(this);
+    callbackButton.setOnClickListener(this);
+    this.callbackActionListener = callbackActionListener;
     Logger.get(context)
         .logQuickContactOnTouch(
             contactPhoto, InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_CALL_DETAILS, true);
   }
 
   /** Populates the contact info fields based on the current contact information. */
-  void updateContactInfo(DialerContact contact) {
+  void updateContactInfo(DialerContact contact, @CallbackAction int callbackAction) {
     this.contact = contact;
     ContactPhotoManager.getInstance(context)
         .loadDialerThumbnailOrPhoto(
@@ -99,23 +100,61 @@
       }
     }
 
-    if (TextUtils.isEmpty(contact.getNumber())) {
-      callBackButton.setVisibility(View.GONE);
+    setCallbackAction(callbackAction);
+  }
+
+  private void setCallbackAction(@CallbackAction int callbackAction) {
+    this.callbackAction = callbackAction;
+    switch (callbackAction) {
+      case CallbackAction.LIGHTBRINGER:
+      case CallbackAction.IMS_VIDEO:
+        callbackButton.setVisibility(View.VISIBLE);
+        callbackButton.setImageResource(R.drawable.quantum_ic_videocam_vd_theme_24);
+        break;
+      case CallbackAction.VOICE:
+        callbackButton.setVisibility(View.VISIBLE);
+        callbackButton.setImageResource(R.drawable.quantum_ic_call_vd_theme_24);
+        break;
+      case CallbackAction.NONE:
+        callbackButton.setVisibility(View.GONE);
+        break;
+      default:
+        throw Assert.createIllegalStateFailException("Invalid action: " + callbackAction);
     }
   }
 
   @Override
   public void onClick(View view) {
-    if (view == callBackButton) {
-      Logger.get(view.getContext()).logImpression(DialerImpression.Type.CALL_DETAILS_CALL_BACK);
-      DialerUtils.startActivityWithErrorToast(
-          view.getContext(),
-          new CallIntentBuilder(
-                  contact.getNumber() + contact.getPostDialDigits(),
-                  CallInitiationType.Type.CALL_DETAILS)
-              .build());
+    if (view == callbackButton) {
+      switch (callbackAction) {
+        case CallbackAction.IMS_VIDEO:
+          callbackActionListener.placeImsVideoCall(contact.getNumber());
+          break;
+        case CallbackAction.LIGHTBRINGER:
+          callbackActionListener.placeLightbringerCall(contact.getNumber());
+          break;
+        case CallbackAction.VOICE:
+          callbackActionListener.placeVoiceCall(contact.getNumber(), contact.getPostDialDigits());
+          break;
+        case CallbackAction.NONE:
+        default:
+          throw Assert.createIllegalStateFailException("Invalid action: " + callbackAction);
+      }
     } else {
       throw Assert.createIllegalStateFailException("View OnClickListener not implemented: " + view);
     }
   }
+
+  /** Listener for making a callback */
+  interface CallbackActionListener {
+
+    /** Places an IMS video call. */
+    void placeImsVideoCall(String phoneNumber);
+
+    /** Places a Lightbringer call. */
+    void placeLightbringerCall(String phoneNumber);
+
+    /** Place a traditional voice call. */
+    void placeVoiceCall(String phoneNumber, String postDialDigits);
+  }
 }
diff --git a/java/com/android/dialer/logging/dialer_impression.proto b/java/com/android/dialer/logging/dialer_impression.proto
index fe1c5e9..0983918 100644
--- a/java/com/android/dialer/logging/dialer_impression.proto
+++ b/java/com/android/dialer/logging/dialer_impression.proto
@@ -323,7 +323,7 @@
 
     CALL_DETAILS_COPY_NUMBER = 1121;
     CALL_DETAILS_EDIT_BEFORE_CALL = 1122;
-    CALL_DETAILS_CALL_BACK = 1123;
+    CALL_DETAILS_CALL_BACK = 1123 [deprecated = true];
 
     VVM_USER_DISMISSED_VM_ALMOST_FULL_PROMO = 1124;
     VVM_USER_DISMISSED_VM_FULL_PROMO = 1125;
@@ -554,5 +554,10 @@
 
     // More voicemail transcription impressions
     VVM_TRANSCRIPTION_POLL_REQUEST = 1283;
+
+    // Callback impressions (with more granularity) from the call details UI
+    CALL_DETAILS_IMS_VIDEO_CALL_BACK = 1284;
+    CALL_DETAILS_LIGHTBRINGER_CALL_BACK = 1285;
+    CALL_DETAILS_VOICE_CALL_BACK = 1286;
   }
 }
