diff --git a/java/com/android/dialer/spam/status/SimpleSpamStatus.java b/java/com/android/dialer/spam/status/SimpleSpamStatus.java
index ff080ed..5f45c1a 100644
--- a/java/com/android/dialer/spam/status/SimpleSpamStatus.java
+++ b/java/com/android/dialer/spam/status/SimpleSpamStatus.java
@@ -26,7 +26,11 @@
 
   /** Returns a SimpleSpamStatus with the given boolean and timestamp. */
   public static SimpleSpamStatus create(boolean isSpam, @Nullable Long timestampMillis) {
-    return new AutoValue_SimpleSpamStatus(isSpam, Optional.fromNullable(timestampMillis));
+    return builder()
+        .setSpam(isSpam)
+        .setTimestampMillis(timestampMillis)
+        .setSpamMetadata(SpamMetadata.empty())
+        .build();
   }
 
   /** Returns a SimpleSpamStatus that's not marked as spam and has no timestamp. */
@@ -34,9 +38,23 @@
     return create(false, null);
   }
 
-  /** Returns an empty {@link SpamMetadata}. */
-  @Override
-  public final SpamMetadata getSpamMetadata() {
-    return SpamMetadata.empty();
+  public static Builder builder() {
+    return new AutoValue_SimpleSpamStatus.Builder();
+  }
+
+  /** Creates instances of SimpleSpamStatus. */
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract Builder setSpam(boolean isSpam);
+
+    abstract Builder setTimestampMillis(Optional<Long> timestamp);
+
+    public Builder setTimestampMillis(@Nullable Long timestampMillis) {
+      return setTimestampMillis(Optional.fromNullable(timestampMillis));
+    }
+
+    public abstract Builder setSpamMetadata(SpamMetadata spamMetadata);
+
+    public abstract SimpleSpamStatus build();
   }
 }
diff --git a/java/com/android/incallui/call/CallList.java b/java/com/android/incallui/call/CallList.java
index 13be252..6940f7d 100644
--- a/java/com/android/incallui/call/CallList.java
+++ b/java/com/android/incallui/call/CallList.java
@@ -23,13 +23,11 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
-import android.support.v4.os.BuildCompat;
 import android.telecom.Call;
 import android.telecom.DisconnectCause;
 import android.telecom.PhoneAccount;
 import android.util.ArrayMap;
 import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
-import com.android.dialer.blocking.FilteredNumbersUtil;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.DialerExecutorComponent;
@@ -41,7 +39,6 @@
 import com.android.dialer.metrics.MetricsComponent;
 import com.android.dialer.promotion.RttPromotion;
 import com.android.dialer.shortcuts.ShortcutUsageReporter;
-import com.android.dialer.spam.Spam;
 import com.android.dialer.spam.SpamComponent;
 import com.android.dialer.spam.status.SpamStatus;
 import com.android.dialer.telecom.TelecomCallUtil;
@@ -164,20 +161,7 @@
                   call.getState() == DialerCallState.INCOMING
                       || call.getState() == DialerCallState.CALL_WAITING;
               boolean isSpam = result.isSpam();
-              if (isSpam) {
-                if (!isIncomingCall) {
-                  LogUtil.i(
-                      "CallList.onCallAdded",
-                      "marking spam call as not spam because it's not an incoming call");
-                  isSpam = false;
-                } else if (isPotentialEmergencyCallback(context, call)) {
-                  LogUtil.i(
-                      "CallList.onCallAdded",
-                      "marking spam call as not spam because an emergency call was made on this"
-                          + " device recently");
-                  isSpam = false;
-                }
-              }
+              call.setSpamStatus(result);
 
               if (isIncomingCall) {
                 Logger.get(context)
@@ -188,7 +172,6 @@
                         call.getUniqueCallId(),
                         call.getTimeAddedMs());
               }
-              call.setSpam(isSpam);
               onUpdateCall(call);
               notifyGenericListeners();
             }
@@ -201,7 +184,6 @@
           DialerExecutorComponent.get(context).uiExecutor());
 
       Trace.beginSection("updateUserMarkedSpamStatus");
-      updateUserMarkedSpamStatus(call, context, number);
       Trace.endSection();
     }
     Trace.endSection();
@@ -279,60 +261,11 @@
             impression, incomingCall.getUniqueCallId(), incomingCall.getTimeAddedMs());
   }
 
-  private static boolean isPotentialEmergencyCallback(Context context, DialerCall call) {
-    if (BuildCompat.isAtLeastO()) {
-      return call.isPotentialEmergencyCallback();
-    } else {
-      long timestampMillis = FilteredNumbersUtil.getLastEmergencyCallTimeMillis(context);
-      return call.isInEmergencyCallbackWindow(timestampMillis);
-    }
-  }
-
   @Override
   public DialerCall getDialerCallFromTelecomCall(Call telecomCall) {
     return callByTelecomCall.get(telecomCall);
   }
 
-  private void updateUserMarkedSpamStatus(
-      final DialerCall call, final Context context, String number) {
-
-    SpamComponent.get(context)
-        .spam()
-        .checkUserMarkedNonSpamStatus(
-            number,
-            call.getCountryIso(),
-            new Spam.Listener() {
-              @Override
-              public void onComplete(boolean isInUserWhiteList) {
-                call.setIsInUserWhiteList(isInUserWhiteList);
-              }
-            });
-
-    SpamComponent.get(context)
-        .spam()
-        .checkGlobalSpamListStatus(
-            number,
-            call.getCountryIso(),
-            new Spam.Listener() {
-              @Override
-              public void onComplete(boolean isInGlobalSpamList) {
-                call.setIsInGlobalSpamList(isInGlobalSpamList);
-              }
-            });
-
-    SpamComponent.get(context)
-        .spam()
-        .checkUserMarkedSpamStatus(
-            number,
-            call.getCountryIso(),
-            new Spam.Listener() {
-              @Override
-              public void onComplete(boolean isInUserSpamList) {
-                call.setIsInUserSpamList(isInUserSpamList);
-              }
-            });
-  }
-
   public void onCallRemoved(Context context, android.telecom.Call telecomCall) {
     if (callByTelecomCall.containsKey(telecomCall)) {
       DialerCall call = callByTelecomCall.get(telecomCall);
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index 431634a..da7c54d 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -52,6 +52,7 @@
 import com.android.contacts.common.compat.CallCompat;
 import com.android.dialer.assisteddialing.ConcreteCreator;
 import com.android.dialer.assisteddialing.TransformationInfo;
+import com.android.dialer.blocking.FilteredNumbersUtil;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.callintent.CallIntentParser;
 import com.android.dialer.callintent.CallSpecificAppData;
@@ -76,6 +77,7 @@
 import com.android.dialer.preferredsim.PreferredAccountRecorder;
 import com.android.dialer.rtt.RttTranscript;
 import com.android.dialer.rtt.RttTranscriptUtil;
+import com.android.dialer.spam.status.SpamStatus;
 import com.android.dialer.telecom.TelecomCallUtil;
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.theme.R;
@@ -91,6 +93,7 @@
 import com.android.incallui.videotech.empty.EmptyVideoTech;
 import com.android.incallui.videotech.ims.ImsVideoTech;
 import com.android.incallui.videotech.utils.VideoUtils;
+import com.google.common.base.Optional;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.io.IOException;
@@ -165,14 +168,10 @@
   private String callSubject;
   @Nullable private PhoneAccountHandle phoneAccountHandle;
   @CallHistoryStatus private int callHistoryStatus = CALL_HISTORY_STATUS_UNKNOWN;
-  private boolean isSpam;
+
+  @Nullable private SpamStatus spamStatus;
   private boolean isBlocked;
 
-  @Nullable private Boolean isInUserSpamList;
-
-  @Nullable private Boolean isInUserWhiteList;
-
-  @Nullable private Boolean isInGlobalSpamList;
   private boolean didShowCameraPermission;
   private boolean didDismissVideoChargesAlertDialog;
   private PersistableBundle carrierConfig;
@@ -820,6 +819,13 @@
     if (hasProperty(Details.PROPERTY_EMERGENCY_CALLBACK_MODE)) {
       return true;
     }
+
+    // Call.EXTRA_LAST_EMERGENCY_CALLBACK_TIME_MILLIS is available starting in O
+    if (VERSION.SDK_INT < VERSION_CODES.O) {
+      long timestampMillis = FilteredNumbersUtil.getLastEmergencyCallTimeMillis(context);
+      return isInEmergencyCallbackWindow(timestampMillis);
+    }
+
     // We want to treat any incoming call that arrives a short time after an outgoing emergency call
     // as a potential emergency callback.
     if (getExtras() != null
@@ -1270,39 +1276,28 @@
     didDismissVideoChargesAlertDialog = didDismiss;
   }
 
-  @Nullable
-  public Boolean isInGlobalSpamList() {
-    return isInGlobalSpamList;
+  public void setSpamStatus(@Nullable SpamStatus spamStatus) {
+    this.spamStatus = spamStatus;
   }
 
-  public void setIsInGlobalSpamList(boolean inSpamList) {
-    isInGlobalSpamList = inSpamList;
-  }
-
-  @Nullable
-  public Boolean isInUserSpamList() {
-    return isInUserSpamList;
-  }
-
-  public void setIsInUserSpamList(boolean inSpamList) {
-    isInUserSpamList = inSpamList;
-  }
-
-  @Nullable
-  public Boolean isInUserWhiteList() {
-    return isInUserWhiteList;
-  }
-
-  public void setIsInUserWhiteList(boolean inWhiteList) {
-    isInUserWhiteList = inWhiteList;
+  public Optional<SpamStatus> getSpamStatus() {
+    return Optional.fromNullable(spamStatus);
   }
 
   public boolean isSpam() {
-    return isSpam;
-  }
+    if (spamStatus == null || !spamStatus.isSpam()) {
+      return false;
+    }
 
-  public void setSpam(boolean isSpam) {
-    this.isSpam = isSpam;
+    if (!isIncoming()) {
+      return false;
+    }
+
+    if (isPotentialEmergencyCallback()) {
+      return false;
+    }
+
+    return true;
   }
 
   public boolean isBlocked() {
