diff --git a/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java b/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
index 307f998..cfb8fb7 100644
--- a/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
@@ -82,7 +82,8 @@
 
   @Override
   public ListenableFuture<PhoneLookupInfo> lookup(@NonNull Call call) {
-    throw new UnsupportedOperationException();
+    // TODO(zachh): Implementation.
+    return MoreExecutors.newDirectExecutorService().submit(PhoneLookupInfo::getDefaultInstance);
   }
 
   @Override
diff --git a/java/com/android/dialer/phonelookup/database/PhoneLookupHistoryContentProvider.java b/java/com/android/dialer/phonelookup/database/PhoneLookupHistoryContentProvider.java
index 27041e7..e85654e 100644
--- a/java/com/android/dialer/phonelookup/database/PhoneLookupHistoryContentProvider.java
+++ b/java/com/android/dialer/phonelookup/database/PhoneLookupHistoryContentProvider.java
@@ -201,6 +201,12 @@
     return rows;
   }
 
+  /**
+   * Note: If the normalized number is included as part of the URI (for example,
+   * "content://com.android.dialer.phonelookuphistory/PhoneLookupHistory/+123") then the update
+   * operation will actually be a "replace" operation, inserting a new row if one does not already
+   * exist.
+   */
   @Override
   public int update(
       @NonNull Uri uri,
@@ -214,7 +220,13 @@
     int match = uriMatcher.match(uri);
     switch (match) {
       case PHONE_LOOKUP_HISTORY_TABLE_CODE:
-        break;
+        int rows = database.update(PhoneLookupHistory.TABLE, values, selection, selectionArgs);
+        if (rows == 0) {
+          LogUtil.w("PhoneLookupHistoryContentProvider.update", "no rows updated");
+          return rows;
+        }
+        notifyChange(uri);
+        return rows;
       case PHONE_LOOKUP_HISTORY_TABLE_ID_CODE:
         Assert.checkArgument(
             !values.containsKey(PhoneLookupHistory.NORMALIZED_NUMBER),
@@ -222,19 +234,15 @@
         Assert.checkArgument(selection == null, "Do not specify selection when updating by ID");
         Assert.checkArgument(
             selectionArgs == null, "Do not specify selection args when updating by ID");
-        selection = PhoneLookupHistory.NORMALIZED_NUMBER + "= ?";
-        selectionArgs = new String[] {uri.getLastPathSegment()};
-        break;
+
+        String normalizedNumber = uri.getLastPathSegment();
+        values.put(PhoneLookupHistory.NORMALIZED_NUMBER, normalizedNumber);
+        database.replace(PhoneLookupHistory.TABLE, null, values);
+        notifyChange(uri);
+        return 1;
       default:
         throw new IllegalArgumentException("Unknown uri: " + uri);
     }
-    int rows = database.update(PhoneLookupHistory.TABLE, values, selection, selectionArgs);
-    if (rows == 0) {
-      LogUtil.w("PhoneLookupHistoryContentProvider.update", "no rows updated");
-      return rows;
-    }
-    notifyChange(uri);
-    return rows;
   }
 
   private void notifyChange(Uri uri) {
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index c5310b9..f8605ae 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -545,6 +545,8 @@
     // Since a call has been added we are no longer waiting for Telecom to send us a call.
     setBoundAndWaitingForOutgoingCall(false, null);
     call.registerCallback(mCallCallback);
+    // TODO(maxwelb): Return the future in recordPhoneLookupInfo and propagate.
+    PhoneLookupHistoryRecorder.recordPhoneLookupInfo(mContext.getApplicationContext(), call);
     Trace.endSection();
   }
 
diff --git a/java/com/android/incallui/PhoneLookupHistoryRecorder.java b/java/com/android/incallui/PhoneLookupHistoryRecorder.java
new file mode 100644
index 0000000..2632e65
--- /dev/null
+++ b/java/com/android/incallui/PhoneLookupHistoryRecorder.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2017 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.incallui;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.telecom.Call;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.PhoneNumberUtils;
+import android.telephony.SubscriptionInfo;
+import android.text.TextUtils;
+import com.android.dialer.buildtype.BuildType;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.DialerExecutors;
+import com.android.dialer.location.CountryDetector;
+import com.android.dialer.phonelookup.PhoneLookupComponent;
+import com.android.dialer.phonelookup.PhoneLookupInfo;
+import com.android.dialer.phonelookup.database.contract.PhoneLookupHistoryContract.PhoneLookupHistory;
+import com.android.dialer.telecom.TelecomUtil;
+import com.android.incallui.util.TelecomCallUtil;
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Locale;
+
+/**
+ * Fetches the current {@link PhoneLookupInfo} for the provided call and writes it to the
+ * PhoneLookupHistory.
+ */
+final class PhoneLookupHistoryRecorder {
+
+  /**
+   * If the new UI is enabled, fetches the current {@link PhoneLookupInfo} for the provided call and
+   * writes it to the PhoneLookupHistory. Otherwise does nothing.
+   */
+  static void recordPhoneLookupInfo(Context appContext, Call call) {
+    if (!(BuildType.get() == BuildType.BUGFOOD || LogUtil.isDebugEnabled())) {
+      return;
+    }
+    ListenableFuture<PhoneLookupInfo> future =
+        PhoneLookupComponent.get(appContext).phoneLookup().lookup(call);
+    Futures.addCallback(
+        future,
+        new FutureCallback<PhoneLookupInfo>() {
+          @Override
+          public void onSuccess(@Nullable PhoneLookupInfo result) {
+            Assert.checkArgument(result != null);
+            Optional<String> normalizedNumber = getNormalizedNumber(appContext, call);
+            if (!normalizedNumber.isPresent()) {
+              LogUtil.w("PhoneLookupHistoryRecorder.onSuccess", "couldn't get a number");
+              return;
+            }
+            ContentValues contentValues = new ContentValues();
+            contentValues.put(PhoneLookupHistory.PHONE_LOOKUP_INFO, result.toByteArray());
+            contentValues.put(PhoneLookupHistory.LAST_MODIFIED, System.currentTimeMillis());
+            appContext
+                .getContentResolver()
+                .update(
+                    PhoneLookupHistory.CONTENT_URI
+                        .buildUpon()
+                        .appendEncodedPath(normalizedNumber.get())
+                        .build(),
+                    contentValues,
+                    null,
+                    null);
+          }
+
+          @Override
+          public void onFailure(Throwable t) {
+            // TODO(zachh): Consider how to best handle this; take measures to repair call log?
+            LogUtil.w(
+                "PhoneLookupHistoryRecorder.onFailure", "could not write PhoneLookupHistory", t);
+          }
+        },
+        DialerExecutors.getLowPriorityThreadPool(appContext));
+  }
+
+  private static Optional<String> getNormalizedNumber(Context appContext, Call call) {
+    PhoneAccountHandle phoneAccountHandle = call.getDetails().getAccountHandle();
+    Optional<SubscriptionInfo> subscriptionInfo =
+        TelecomUtil.getSubscriptionInfo(appContext, phoneAccountHandle);
+    String countryCode =
+        subscriptionInfo.isPresent()
+            ? subscriptionInfo.get().getCountryIso()
+            : CountryDetector.getInstance(appContext).getCurrentCountryIso();
+    if (countryCode == null) {
+      LogUtil.w(
+          "PhoneLookupHistoryRecorder.getNormalizedNumber",
+          "couldn't find a country code for call");
+      countryCode = "US";
+    }
+    String rawNumber = TelecomCallUtil.getNumber(call);
+    if (TextUtils.isEmpty(rawNumber)) {
+      return Optional.absent();
+    }
+    String normalizedNumber =
+        PhoneNumberUtils.formatNumberToE164(rawNumber, countryCode.toUpperCase(Locale.US));
+    return normalizedNumber == null ? Optional.of(rawNumber) : Optional.of(normalizedNumber);
+  }
+}
