diff --git a/java/com/android/dialer/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java
index 672043b..4dc294e 100644
--- a/java/com/android/dialer/calldetails/CallDetailsActivity.java
+++ b/java/com/android/dialer/calldetails/CallDetailsActivity.java
@@ -28,7 +28,6 @@
 import com.android.dialer.calldetails.CallDetailsHeaderViewHolder.CallDetailsHeaderListener;
 import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.AnnotatedCallLog;
 import com.android.dialer.common.Assert;
-import com.android.dialer.dialercontact.DialerContact;
 import com.android.dialer.enrichedcall.EnrichedCallComponent;
 import com.android.dialer.protos.ProtoParsers;
 
@@ -42,26 +41,27 @@
  */
 public final class CallDetailsActivity extends CallDetailsActivityCommon {
   public static final String EXTRA_COALESCED_CALL_LOG_IDS = "coalesced_call_log_ids";
-  public static final String EXTRA_CONTACT = "contact";
+  public static final String EXTRA_HEADER_INFO = "header_info";
 
   private static final int CALL_DETAILS_LOADER_ID = 0;
 
   /** IDs of call log entries, used to retrieve them from the annotated call log. */
   private CoalescedIds coalescedCallLogIds;
 
-  private DialerContact contact;
+  /** Info to be shown in the header. */
+  private CallDetailsHeaderInfo headerInfo;
 
   /** Returns an {@link Intent} to launch this activity. */
   public static Intent newInstance(
       Context context,
       CoalescedIds coalescedAnnotatedCallLogIds,
-      DialerContact contact,
+      CallDetailsHeaderInfo callDetailsHeaderInfo,
       boolean canReportCallerId,
       boolean canSupportAssistedDialing) {
     Intent intent = new Intent(context, CallDetailsActivity.class);
-    ProtoParsers.put(intent, EXTRA_CONTACT, Assert.isNotNull(contact));
     ProtoParsers.put(
         intent, EXTRA_COALESCED_CALL_LOG_IDS, Assert.isNotNull(coalescedAnnotatedCallLogIds));
+    ProtoParsers.put(intent, EXTRA_HEADER_INFO, Assert.isNotNull(callDetailsHeaderInfo));
     intent.putExtra(EXTRA_CAN_REPORT_CALLER_ID, canReportCallerId);
     intent.putExtra(EXTRA_CAN_SUPPORT_ASSISTED_DIALING, canSupportAssistedDialing);
     return intent;
@@ -70,14 +70,17 @@
   @Override
   protected void handleIntent(Intent intent) {
     Assert.checkArgument(intent.hasExtra(EXTRA_COALESCED_CALL_LOG_IDS));
+    Assert.checkArgument(intent.hasExtra(EXTRA_HEADER_INFO));
     Assert.checkArgument(intent.hasExtra(EXTRA_CAN_REPORT_CALLER_ID));
     Assert.checkArgument(intent.hasExtra(EXTRA_CAN_SUPPORT_ASSISTED_DIALING));
 
-    contact = ProtoParsers.getTrusted(intent, EXTRA_CONTACT, DialerContact.getDefaultInstance());
     setCallDetailsEntries(CallDetailsEntries.getDefaultInstance());
     coalescedCallLogIds =
         ProtoParsers.getTrusted(
             intent, EXTRA_COALESCED_CALL_LOG_IDS, CoalescedIds.getDefaultInstance());
+    headerInfo =
+        ProtoParsers.getTrusted(
+            intent, EXTRA_HEADER_INFO, CallDetailsHeaderInfo.getDefaultInstance());
 
     getLoaderManager()
         .initLoader(
@@ -91,7 +94,7 @@
       DeleteCallDetailsListener deleteCallDetailsListener) {
     return new CallDetailsAdapter(
         this,
-        contact,
+        headerInfo,
         getCallDetailsEntries(),
         callDetailsHeaderListener,
         reportCallIdListener,
@@ -100,7 +103,7 @@
 
   @Override
   protected String getNumber() {
-    return contact.getNumber();
+    return headerInfo.getDialerPhoneNumber().getNormalizedNumber();
   }
 
   /**
diff --git a/java/com/android/dialer/calldetails/CallDetailsAdapter.java b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
index dfa472a..2a4c1ef 100644
--- a/java/com/android/dialer/calldetails/CallDetailsAdapter.java
+++ b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
@@ -16,12 +16,12 @@
 
 package com.android.dialer.calldetails;
 
+
 import android.content.Context;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
 import com.android.dialer.calldetails.CallDetailsFooterViewHolder.DeleteCallDetailsListener;
 import com.android.dialer.calldetails.CallDetailsHeaderViewHolder.CallDetailsHeaderListener;
-import com.android.dialer.dialercontact.DialerContact;
 
 /**
  * A {@link RecyclerView.Adapter} for {@link CallDetailsActivity}.
@@ -31,11 +31,12 @@
  */
 final class CallDetailsAdapter extends CallDetailsAdapterCommon {
 
-  private final DialerContact contact;
+  /** Info to be shown in the header. */
+  private final CallDetailsHeaderInfo headerInfo;
 
   CallDetailsAdapter(
       Context context,
-      DialerContact contact,
+      CallDetailsHeaderInfo calldetailsHeaderInfo,
       CallDetailsEntries callDetailsEntries,
       CallDetailsHeaderListener callDetailsHeaderListener,
       CallDetailsFooterViewHolder.ReportCallIdListener reportCallIdListener,
@@ -46,26 +47,29 @@
         callDetailsHeaderListener,
         reportCallIdListener,
         deleteCallDetailsListener);
-    this.contact = contact;
+    this.headerInfo = calldetailsHeaderInfo;
   }
 
   @Override
   protected CallDetailsHeaderViewHolder createCallDetailsHeaderViewHolder(
       View container, CallDetailsHeaderListener callDetailsHeaderListener) {
     return new CallDetailsHeaderViewHolder(
-        container, contact.getNumber(), contact.getPostDialDigits(), callDetailsHeaderListener);
+        container,
+        headerInfo.getDialerPhoneNumber().getNormalizedNumber(),
+        headerInfo.getDialerPhoneNumber().getPostDialPortion(),
+        callDetailsHeaderListener);
   }
 
   @Override
   protected void bindCallDetailsHeaderViewHolder(
       CallDetailsHeaderViewHolder callDetailsHeaderViewHolder, int position) {
-    callDetailsHeaderViewHolder.updateContactInfo(contact, getCallbackAction());
+    callDetailsHeaderViewHolder.updateContactInfo(headerInfo, getCallbackAction());
     callDetailsHeaderViewHolder.updateAssistedDialingInfo(
         getCallDetailsEntries().getEntries(position));
   }
 
   @Override
   protected String getNumber() {
-    return contact.getNumber();
+    return headerInfo.getDialerPhoneNumber().getNormalizedNumber();
   }
 }
diff --git a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
index 34ed688..e4fded1 100644
--- a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
+++ b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
@@ -37,6 +37,7 @@
 import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.contactphoto.ContactPhotoManager;
 import com.android.dialer.dialercontact.DialerContact;
+import com.android.dialer.glidephotomanager.GlidePhotoManagerComponent;
 import com.android.dialer.logging.InteractionEvent;
 import com.android.dialer.logging.Logger;
 
@@ -182,6 +183,19 @@
     setCallbackAction(callbackAction);
   }
 
+  void updateContactInfo(CallDetailsHeaderInfo headerInfo, @CallbackAction int callbackAction) {
+    GlidePhotoManagerComponent.get(context)
+        .glidePhotoManager()
+        .loadQuickContactBadge(contactPhoto, headerInfo.getPhotoInfo());
+
+    nameView.setText(headerInfo.getPrimaryText());
+    numberView.setText(headerInfo.getSecondaryText());
+
+    // TODO(a bug): show SIM info in the TextView returned by getNetworkView().
+
+    setCallbackAction(callbackAction);
+  }
+
   private void setCallbackAction(@CallbackAction int callbackAction) {
     this.callbackAction = callbackAction;
     switch (callbackAction) {
diff --git a/java/com/android/dialer/calldetails/proto/call_details_header_info.proto b/java/com/android/dialer/calldetails/proto/call_details_header_info.proto
new file mode 100644
index 0000000..ea7ba1e
--- /dev/null
+++ b/java/com/android/dialer/calldetails/proto/call_details_header_info.proto
@@ -0,0 +1,36 @@
+syntax = "proto2";
+
+option java_package = "com.android.dialer.calldetails";
+option java_multiple_files = true;
+option optimize_for = LITE_RUNTIME;
+
+
+import "java/com/android/dialer/phonenumberproto/dialer_phone_number.proto";
+import "java/com/android/dialer/glidephotomanager/photo_info.proto";
+
+package com.android.dialer.calldetails;
+
+// Contains information for the header in CallDetailsActivity
+// Next ID: 5
+message CallDetailsHeaderInfo {
+  // The number of all call detail entries.
+  optional com.android.dialer.DialerPhoneNumber dialer_phone_number = 1;
+
+  // Information used to load the contact photo.
+  optional com.android.dialer.glidephotomanager.PhotoInfo photo_info = 2;
+
+  // Primary text of the header, which can be
+  // (1) a presentation name (e.g., "Restricted", "Unknown", etc.),
+  // (2) the contact name, or
+  // (3) the formatted number.
+  optional string primary_text = 3;
+
+  // Secondary test of the header, which describes the number.
+  // Some examples are:
+  //   "Mobile • 555-1234",
+  //   "Blocked • Mobile • 555-1234", and
+  //   "Spam • Mobile • 555-1234".
+  optional string secondary_text = 4;
+
+  // TODO(a bug): Add SIM info.
+}
\ No newline at end of file
diff --git a/java/com/android/dialer/calllog/ui/menu/Modules.java b/java/com/android/dialer/calllog/ui/menu/Modules.java
index 184f7ab..fd5f6a3 100644
--- a/java/com/android/dialer/calllog/ui/menu/Modules.java
+++ b/java/com/android/dialer/calllog/ui/menu/Modules.java
@@ -22,11 +22,12 @@
 import android.text.TextUtils;
 import com.android.dialer.blockreportspam.BlockReportSpamDialogInfo;
 import com.android.dialer.calldetails.CallDetailsActivity;
+import com.android.dialer.calldetails.CallDetailsHeaderInfo;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.calllog.model.CoalescedRow;
-import com.android.dialer.calllogutils.CallLogContactTypes;
-import com.android.dialer.calllogutils.PhoneNumberDisplayUtil;
-import com.android.dialer.dialercontact.DialerContact;
+import com.android.dialer.calllogutils.CallLogEntryText;
+import com.android.dialer.calllogutils.NumberAttributesConverter;
+import com.android.dialer.glidephotomanager.PhotoInfo;
 import com.android.dialer.historyitemactions.DividerModule;
 import com.android.dialer.historyitemactions.HistoryItemActionModule;
 import com.android.dialer.historyitemactions.IntentModule;
@@ -106,8 +107,6 @@
       }
     }
 
-    // TODO(zachh): Revisit if DialerContact is the best thing to pass to CallDetails; could
-    // it use a HistoryItemPrimaryActionInfo instead?
     modules.add(createModuleForAccessingCallDetails(context, row));
 
     modules.add(new DeleteCallLogItemModule(context, row.coalescedIds()));
@@ -156,43 +155,31 @@
         CallDetailsActivity.newInstance(
             context,
             row.coalescedIds(),
-            createDialerContactFromRow(context, row),
+            createCallDetailsHeaderInfoFromRow(context, row),
             canReportAsInvalidNumber,
             canSupportAssistedDialing),
         R.string.call_details_menu_label,
         R.drawable.quantum_ic_info_outline_vd_theme_24);
   }
 
-  private static DialerContact createDialerContactFromRow(Context context, CoalescedRow row) {
-    Optional<String> presentationName =
-        PhoneNumberDisplayUtil.getNameForPresentation(context, row.numberPresentation());
-    if (presentationName.isPresent()) {
-      return DialerContact.newBuilder()
-          .setNameOrNumber(presentationName.get())
-          .setContactType(CallLogContactTypes.getContactType(row))
-          .build();
+  private static CallDetailsHeaderInfo createCallDetailsHeaderInfoFromRow(
+      Context context, CoalescedRow row) {
+    return CallDetailsHeaderInfo.newBuilder()
+        .setDialerPhoneNumber(row.number())
+        .setPhotoInfo(createPhotoInfoFromRow(row))
+        .setPrimaryText(CallLogEntryText.buildPrimaryText(context, row).toString())
+        .setSecondaryText(
+            CallLogEntryText.buildSecondaryTextForBottomSheet(context, row).toString())
+        .build();
+  }
+
+  private static PhotoInfo createPhotoInfoFromRow(CoalescedRow row) {
+    PhotoInfo.Builder photoInfoBuilder =
+        NumberAttributesConverter.toPhotoInfoBuilder(row.numberAttributes())
+            .setIsVideo((row.features() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO);
+    if (!TextUtils.isEmpty(row.formattedNumber())) {
+      photoInfoBuilder.setFormattedNumber(row.formattedNumber());
     }
-
-    String normalizedNumber = row.number().getNormalizedNumber();
-    DialerContact.Builder dialerContactBuilder =
-        DialerContact.newBuilder()
-            .setNumber(normalizedNumber)
-            .setContactType(CallLogContactTypes.getContactType(row))
-            .setPhotoId(row.numberAttributes().getPhotoId());
-
-    if (!row.numberAttributes().getName().isEmpty()) {
-      dialerContactBuilder.setNameOrNumber(row.numberAttributes().getName());
-      if (row.formattedNumber() != null) {
-        dialerContactBuilder.setDisplayNumber(row.formattedNumber());
-      }
-    } else if (!TextUtils.isEmpty(row.formattedNumber())) {
-      dialerContactBuilder.setNameOrNumber(row.formattedNumber());
-    }
-
-    dialerContactBuilder.setNumberLabel(row.numberAttributes().getNumberTypeLabel());
-    dialerContactBuilder.setPhotoUri(row.numberAttributes().getPhotoUri());
-    dialerContactBuilder.setContactUri(row.numberAttributes().getLookupUri());
-
-    return dialerContactBuilder.build();
+    return photoInfoBuilder.build();
   }
 }
diff --git a/java/com/android/dialer/calllogutils/CallLogContactTypes.java b/java/com/android/dialer/calllogutils/CallLogContactTypes.java
deleted file mode 100644
index 5865156..0000000
--- a/java/com/android/dialer/calllogutils/CallLogContactTypes.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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
- */
-
-package com.android.dialer.calllogutils;
-
-import com.android.dialer.calllog.model.CoalescedRow;
-import com.android.dialer.lettertile.LetterTileDrawable;
-
-/** Determines the {@link LetterTileDrawable.ContactType} for a {@link CoalescedRow}. */
-public class CallLogContactTypes {
-
-  /** Determines the {@link LetterTileDrawable.ContactType} for a {@link CoalescedRow}. */
-  @LetterTileDrawable.ContactType
-  public static int getContactType(CoalescedRow row) {
-    // TODO(zachh): Set these fields correctly.
-    boolean isVoicemail = false;
-    boolean isSpam = false;
-    boolean isBusiness = false;
-    int numberPresentation = row.numberPresentation();
-    boolean isConference = false;
-
-    return LetterTileDrawable.getContactTypeFromPrimitives(
-        isVoicemail, isSpam, isBusiness, numberPresentation, isConference);
-  }
-}
diff --git a/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java b/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
index f4338ce..ccc9420 100644
--- a/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
+++ b/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
@@ -49,7 +49,7 @@
   @Nullable
   public abstract Intent intent();
 
-  // TODO(zachh): Add SIM info here if should be shown in bottom sheet.
+  // TODO(a bug): Add SIM info.
 
   /** Builder for {@link HistoryItemPrimaryActionInfo}. */
   @AutoValue.Builder
