diff --git a/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java b/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java
index 2bb5f6a..4a465a2 100644
--- a/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java
+++ b/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java
@@ -52,7 +52,8 @@
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
 import com.android.dialer.protos.ProtoParsers;
 import com.android.dialer.telecom.TelecomUtil;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /**
  * Dialog that allows the user to select a phone accounts for a given action. Optionally provides
diff --git a/java/com/android/dialer/activecalls/ActiveCallInfo.java b/java/com/android/dialer/activecalls/ActiveCallInfo.java
index ccf3501..7c93ceb 100644
--- a/java/com/android/dialer/activecalls/ActiveCallInfo.java
+++ b/java/com/android/dialer/activecalls/ActiveCallInfo.java
@@ -21,11 +21,11 @@
 import androidx.annotation.Nullable;
 
 import com.google.auto.value.AutoValue;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /** Info of an active call */
 @AutoValue
-@SuppressWarnings("Guava")
 public abstract class ActiveCallInfo {
 
   /** The {@link PhoneAccountHandle} the call is made with */
@@ -40,7 +40,7 @@
   public abstract static class Builder {
 
     public Builder setPhoneAccountHandle(@Nullable PhoneAccountHandle phoneAccountHandle) {
-      return setPhoneAccountHandle(Optional.fromNullable(phoneAccountHandle));
+      return setPhoneAccountHandle(Optional.ofNullable(phoneAccountHandle));
     }
 
     public abstract Builder setPhoneAccountHandle(Optional<PhoneAccountHandle> phoneAccountHandle);
diff --git a/java/com/android/dialer/calllogutils/CallLogEntryText.java b/java/com/android/dialer/calllogutils/CallLogEntryText.java
index 15d6538..54ce680 100644
--- a/java/com/android/dialer/calllogutils/CallLogEntryText.java
+++ b/java/com/android/dialer/calllogutils/CallLogEntryText.java
@@ -25,11 +25,11 @@
 import com.android.dialer.R;
 import com.android.dialer.calllog.model.CoalescedRow;
 import com.android.dialer.spam.Spam;
-import com.google.common.base.Optional;
 import com.google.common.collect.Collections2;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Computes the primary text and secondary text for call log entries.
diff --git a/java/com/android/dialer/calllogutils/PhoneNumberDisplayUtil.java b/java/com/android/dialer/calllogutils/PhoneNumberDisplayUtil.java
index 934945c..54c6987 100644
--- a/java/com/android/dialer/calllogutils/PhoneNumberDisplayUtil.java
+++ b/java/com/android/dialer/calllogutils/PhoneNumberDisplayUtil.java
@@ -25,7 +25,8 @@
 import android.text.TextUtils;
 
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /** Helper for formatting and managing the display of phone numbers. */
 public class PhoneNumberDisplayUtil {
@@ -57,7 +58,7 @@
     if (presentation == Calls.PRESENTATION_PAYPHONE) {
       return Optional.of(appContext.getResources().getString(R.string.payphone));
     }
-    return Optional.absent();
+    return Optional.empty();
   }
 
   /**
diff --git a/java/com/android/dialer/main/impl/MainSearchController.java b/java/com/android/dialer/main/impl/MainSearchController.java
index 1462368..2470ec0 100644
--- a/java/com/android/dialer/main/impl/MainSearchController.java
+++ b/java/com/android/dialer/main/impl/MainSearchController.java
@@ -55,10 +55,10 @@
 import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.TransactionSafeActivity;
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
-import com.google.common.base.Optional;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Search controller for handling all the logic related to entering and exiting the search UI.
@@ -159,7 +159,7 @@
 
     fab.hide();
     toolbar.slideUp(animate, fragmentContainer);
-    toolbar.expand(animate, Optional.absent(), /* requestFocus */ false);
+    toolbar.expand(animate, Optional.empty(), /* requestFocus */ false);
 
     activity.setTitle(R.string.dialpad_activity_title);
 
@@ -389,7 +389,7 @@
   @Override
   public void onSearchBarClicked() {
     LogUtil.enterBlock("MainSearchController.onSearchBarClicked");
-    openSearch(Optional.absent());
+    openSearch(Optional.empty());
   }
 
   private void openSearch(Optional<String> query) {
@@ -411,8 +411,7 @@
       transaction.show(searchFragment);
     }
 
-    searchFragment.setQuery(
-        query.isPresent() ? query.get() : "", CallInitiationType.Type.REGULAR_SEARCH);
+    searchFragment.setQuery(query.orElse(""), CallInitiationType.Type.REGULAR_SEARCH);
 
     if (activity.isSafeToCommitTransactions()) {
       transaction.commit();
@@ -540,7 +539,7 @@
     if (savedInstanceState.getBoolean(KEY_IS_TOOLBAR_EXPANDED, false)) {
       // If the toolbar is slide up, that means the dialpad is showing. Thus we don't want to
       // request focus or we'll break physical/bluetooth keyboards typing.
-      toolbar.expand(/* animate */ false, Optional.absent(), /* requestFocus */ !isSlideUp);
+      toolbar.expand(/* animate */ false, Optional.empty(), /* requestFocus */ !isSlideUp);
     }
   }
 
diff --git a/java/com/android/dialer/main/impl/toolbar/MainToolbar.java b/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
index 01e6015..4082d7e 100644
--- a/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
+++ b/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
@@ -34,7 +34,8 @@
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.util.ViewUtil;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /** Toolbar for {@link com.android.dialer.main.impl.MainActivity}. */
 public final class MainToolbar extends Toolbar implements PopupMenu.OnMenuItemClickListener {
diff --git a/java/com/android/dialer/main/impl/toolbar/SearchBarView.java b/java/com/android/dialer/main/impl/toolbar/SearchBarView.java
index 3662ec8..245eeda 100644
--- a/java/com/android/dialer/main/impl/toolbar/SearchBarView.java
+++ b/java/com/android/dialer/main/impl/toolbar/SearchBarView.java
@@ -38,7 +38,8 @@
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.UiUtil;
 import com.android.dialer.util.DialerUtils;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /** Search bar for {@link MainToolbar}. Mostly used to handle expand and collapse animation. */
 final class SearchBarView extends FrameLayout {
@@ -137,9 +138,7 @@
           @Override
           public void onAnimationEnd(Animator animation) {
             super.onAnimationEnd(animation);
-            if (text.isPresent()) {
-              searchBox.setText(text.get());
-            }
+            text.ifPresent(s -> searchBox.setText(s));
             // Don't request focus unless we're actually showing the search box, otherwise
             // physical/bluetooth keyboards will type into this box when the dialpad is open.
             if (requestFocus) {
diff --git a/java/com/android/dialer/precall/impl/CallingAccountSelector.java b/java/com/android/dialer/precall/impl/CallingAccountSelector.java
index 671c6c6..4ad1163 100644
--- a/java/com/android/dialer/precall/impl/CallingAccountSelector.java
+++ b/java/com/android/dialer/precall/impl/CallingAccountSelector.java
@@ -154,9 +154,9 @@
               coordinator,
               pendingAction,
               result.getDialogOptionsBuilder().get().build(),
-              result.getDataId().orNull(),
+              result.getDataId().orElse(null),
               phoneNumber,
-              result.getSuggestion().orNull());
+              result.getSuggestion().orElse(null));
         },
         (throwable) -> {
           throw new RuntimeException(throwable);
diff --git a/java/com/android/dialer/precall/impl/MalformedNumberRectifier.java b/java/com/android/dialer/precall/impl/MalformedNumberRectifier.java
index 3658158..e76df75 100644
--- a/java/com/android/dialer/precall/impl/MalformedNumberRectifier.java
+++ b/java/com/android/dialer/precall/impl/MalformedNumberRectifier.java
@@ -25,9 +25,10 @@
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.precall.PreCallAction;
 import com.android.dialer.precall.PreCallCoordinator;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 
+import java.util.Optional;
+
 /**
  * Fix common malformed number before it is dialed. Rewrite the number to the first handler that can
  * handle it
diff --git a/java/com/android/dialer/precall/impl/UkRegionPrefixInInternationalFormatHandler.java b/java/com/android/dialer/precall/impl/UkRegionPrefixInInternationalFormatHandler.java
index 0412b1f..d53d7d3 100644
--- a/java/com/android/dialer/precall/impl/UkRegionPrefixInInternationalFormatHandler.java
+++ b/java/com/android/dialer/precall/impl/UkRegionPrefixInInternationalFormatHandler.java
@@ -22,7 +22,8 @@
 
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.precall.impl.MalformedNumberRectifier.MalformedNumberHandler;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /**
  * It is customary in UK to present numbers as "+44 (0) xx xxxx xxxx". This is actually a amalgam of
@@ -39,7 +40,7 @@
   @Override
   public Optional<String> handle(Context context, String number) {
     if (!PhoneNumberUtils.normalizeNumber(number).startsWith(MALFORMED_PREFIX)) {
-      return Optional.absent();
+      return Optional.empty();
     }
     LogUtil.i("UkRegionPrefixInInternationalFormatHandler.handle", "removing (0) in UK numbers");
 
diff --git a/java/com/android/dialer/preferredsim/PreferredAccountUtil.java b/java/com/android/dialer/preferredsim/PreferredAccountUtil.java
index 7fc1547..1a5ce98 100644
--- a/java/com/android/dialer/preferredsim/PreferredAccountUtil.java
+++ b/java/com/android/dialer/preferredsim/PreferredAccountUtil.java
@@ -26,9 +26,10 @@
 import androidx.annotation.Nullable;
 
 import com.android.dialer.common.LogUtil;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableSet;
 
+import java.util.Optional;
+
 /**
  * Utilities for looking up and validating preferred {@link PhoneAccountHandle}. Contacts should
  * follow the same logic.
@@ -46,19 +47,19 @@
                                                                   @Nullable String idString) {
     if (TextUtils.isEmpty(componentNameString) || TextUtils.isEmpty(idString)) {
       LogUtil.i("PreferredAccountUtil.getValidPhoneAccount", "empty componentName or id");
-      return Optional.absent();
+      return Optional.empty();
     }
     ComponentName componentName = ComponentName.unflattenFromString(componentNameString);
     if (componentName == null) {
       LogUtil.e("PreferredAccountUtil.getValidPhoneAccount", "cannot parse component name");
-      return Optional.absent();
+      return Optional.empty();
     }
     PhoneAccountHandle phoneAccountHandle = new PhoneAccountHandle(componentName, idString);
 
     if (isPhoneAccountValid(context, phoneAccountHandle)) {
       return Optional.of(phoneAccountHandle);
     }
-    return Optional.absent();
+    return Optional.empty();
   }
 
   public static boolean isPhoneAccountValid(
diff --git a/java/com/android/dialer/preferredsim/PreferredAccountWorker.java b/java/com/android/dialer/preferredsim/PreferredAccountWorker.java
index e7bed83..0e66291 100644
--- a/java/com/android/dialer/preferredsim/PreferredAccountWorker.java
+++ b/java/com/android/dialer/preferredsim/PreferredAccountWorker.java
@@ -22,13 +22,13 @@
 import com.android.contacts.common.widget.SelectPhoneAccountDialogOptions;
 import com.android.dialer.preferredsim.suggestion.SuggestionProvider.Suggestion;
 import com.google.auto.value.AutoValue;
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.List;
+import java.util.Optional;
 
 /** Query a preferred SIM to make a call with. */
-@SuppressWarnings({"missingPermission", "Guava"})
+@SuppressWarnings("missingPermission")
 public interface PreferredAccountWorker {
 
   /** Result of the query. */
diff --git a/java/com/android/dialer/preferredsim/impl/PreferredAccountWorkerImpl.java b/java/com/android/dialer/preferredsim/impl/PreferredAccountWorkerImpl.java
index cc649b3..019ced4 100644
--- a/java/com/android/dialer/preferredsim/impl/PreferredAccountWorkerImpl.java
+++ b/java/com/android/dialer/preferredsim/impl/PreferredAccountWorkerImpl.java
@@ -57,7 +57,6 @@
 import com.android.dialer.preferredsim.suggestion.SuggestionProvider;
 import com.android.dialer.preferredsim.suggestion.SuggestionProvider.Suggestion;
 import com.android.dialer.util.PermissionsUtil;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -65,11 +64,12 @@
 
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 
 import javax.inject.Inject;
 
 /** Implements {@link PreferredAccountWorker}. */
-@SuppressWarnings({"missingPermission", "Guava"})
+@SuppressWarnings("missingPermission")
 public class PreferredAccountWorkerImpl implements PreferredAccountWorker {
 
   private final Context appContext;
@@ -116,7 +116,7 @@
             .getSystemService(TelecomManager.class)
             .getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL);
     if (defaultPhoneAccount != null) {
-      return useDefaultSim(defaultPhoneAccount, candidates, dataId.orNull());
+      return useDefaultSim(defaultPhoneAccount, candidates, dataId.orElse(null));
     }
 
     Optional<Suggestion> suggestion =
@@ -124,18 +124,14 @@
             .getSuggestionProvider()
             .getSuggestion(appContext, phoneNumber);
     if (suggestion.isPresent() && suggestion.get().shouldAutoSelect) {
-      return useSuggestedSim(suggestion.get(), candidates, dataId.orNull());
+      return useSuggestedSim(suggestion.get(), candidates, dataId.orElse(null));
     }
 
     Builder resultBuilder =
         Result.builder(
-            createDialogOptionsBuilder(candidates, dataId.orNull(), suggestion.orNull()));
-    if (suggestion.isPresent()) {
-      resultBuilder.setSuggestion(suggestion.get());
-    }
-    if (dataId.isPresent()) {
-      resultBuilder.setDataId(dataId.get());
-    }
+            createDialogOptionsBuilder(candidates, dataId.orElse(null), suggestion.orElse(null)));
+    suggestion.ifPresent(resultBuilder::setSuggestion);
+    dataId.ifPresent(resultBuilder::setDataId);
     return resultBuilder.build();
   }
 
@@ -221,15 +217,15 @@
     Assert.isWorkerThread();
 
     if (!isPreferredSimEnabled(appContext)) {
-      return Optional.absent();
+      return Optional.empty();
     }
     if (!PermissionsUtil.hasContactsReadPermissions(appContext)) {
       LogUtil.i("PreferredAccountWorker.doInBackground", "missing READ_CONTACTS permission");
-      return Optional.absent();
+      return Optional.empty();
     }
 
     if (TextUtils.isEmpty(phoneNumber)) {
-      return Optional.absent();
+      return Optional.empty();
     }
     try (Cursor cursor =
         appContext
@@ -241,7 +237,7 @@
                 null,
                 null)) {
       if (cursor == null) {
-        return Optional.absent();
+        return Optional.empty();
       }
       ImmutableSet<String> validAccountTypes = PreferredAccountUtil.getValidAccountTypes();
       String result = null;
@@ -257,11 +253,11 @@
           // TODO(twyen): if there are multiple entries attempt to grab from the contact that
           // initiated the call.
           LogUtil.i("CallingAccountSelector.getDataId", "lookup result not unique, ignoring");
-          return Optional.absent();
+          return Optional.empty();
         }
         result = cursor.getString(0);
       }
-      return Optional.fromNullable(result);
+      return Optional.ofNullable(result);
     }
   }
 
@@ -270,7 +266,7 @@
     Assert.isWorkerThread();
     Optional<Long> rawContactId = getRawContactId(contentResolver, dataId);
     if (!rawContactId.isPresent()) {
-      return Optional.absent();
+      return Optional.empty();
     }
     try (Cursor cursor =
         contentResolver.query(
@@ -280,9 +276,9 @@
             null,
             null)) {
       if (cursor == null || !cursor.moveToFirst()) {
-        return Optional.absent();
+        return Optional.empty();
       }
-      return Optional.fromNullable(cursor.getString(0));
+      return Optional.ofNullable(cursor.getString(0));
     }
   }
 
@@ -297,7 +293,7 @@
             null,
             null)) {
       if (cursor == null || !cursor.moveToFirst()) {
-        return Optional.absent();
+        return Optional.empty();
       }
       return Optional.of(cursor.getLong(0));
     }
@@ -322,10 +318,10 @@
                 new String[] {dataId},
                 null)) {
       if (cursor == null) {
-        return Optional.absent();
+        return Optional.empty();
       }
       if (!cursor.moveToFirst()) {
-        return Optional.absent();
+        return Optional.empty();
       }
       return PreferredAccountUtil.getValidPhoneAccount(
           context, cursor.getString(0), cursor.getString(1));
@@ -375,7 +371,7 @@
       return true;
     }
     for (ActiveCallInfo activeCall : activeCalls) {
-      if (Objects.equals(phoneAccountHandle, activeCall.phoneAccountHandle().orNull())) {
+      if (Objects.equals(phoneAccountHandle, activeCall.phoneAccountHandle().orElse(null))) {
         return true;
       }
     }
@@ -388,12 +384,12 @@
 
     if (activeCalls.isEmpty()) {
       LogUtil.e("CallingAccountSelector.getActiveCallLabel", "active calls no longer exist");
-      return Optional.absent();
+      return Optional.empty();
     }
     ActiveCallInfo activeCall = activeCalls.get(0);
     if (!activeCall.phoneAccountHandle().isPresent()) {
       LogUtil.e("CallingAccountSelector.getActiveCallLabel", "active call has no phone account");
-      return Optional.absent();
+      return Optional.empty();
     }
     PhoneAccount phoneAccount =
         appContext
@@ -401,7 +397,7 @@
             .getPhoneAccount(activeCall.phoneAccountHandle().get());
     if (phoneAccount == null) {
       LogUtil.e("CallingAccountSelector.getActiveCallLabel", "phone account not found");
-      return Optional.absent();
+      return Optional.empty();
     }
     return Optional.of(phoneAccount.getLabel().toString());
   }
diff --git a/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java b/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java
index 20b072b..ffd19c3 100644
--- a/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java
+++ b/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,10 +27,10 @@
 import com.android.dialer.R;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /** Provides hints to the user when selecting a SIM to make a call. */
-@SuppressWarnings("Guava")
 public interface SuggestionProvider {
 
   String EXTRA_SIM_SUGGESTION_REASON = "sim_suggestion_reason";
@@ -85,13 +86,13 @@
   /**
    * Return the hint for {@code phoneAccountHandle}. Absent if no hint is available for the account.
    */
-  static Optional<String> getHint(
-      Context context, PhoneAccountHandle phoneAccountHandle, @Nullable Suggestion suggestion) {
+  static Optional<String> getHint(Context context, PhoneAccountHandle phoneAccountHandle,
+                                  @Nullable Suggestion suggestion) {
     if (suggestion == null) {
-      return Optional.absent();
+      return Optional.empty();
     }
     if (!phoneAccountHandle.equals(suggestion.phoneAccountHandle)) {
-      return Optional.absent();
+      return Optional.empty();
     }
     switch (suggestion.reason) {
       case INTRA_CARRIER:
@@ -101,7 +102,7 @@
         return Optional.of(context.getString(R.string.pre_call_select_phone_account_hint_frequent));
       default:
         LogUtil.w("CallingAccountSelector.getHint", "unhandled reason " + suggestion.reason);
-        return Optional.absent();
+        return Optional.empty();
     }
   }
 }
diff --git a/java/com/android/dialer/preferredsim/suggestion/stub/StubSuggestionProvider.java b/java/com/android/dialer/preferredsim/suggestion/stub/StubSuggestionProvider.java
index efb75cd..86e45d1 100644
--- a/java/com/android/dialer/preferredsim/suggestion/stub/StubSuggestionProvider.java
+++ b/java/com/android/dialer/preferredsim/suggestion/stub/StubSuggestionProvider.java
@@ -24,7 +24,8 @@
 import androidx.annotation.WorkerThread;
 
 import com.android.dialer.preferredsim.suggestion.SuggestionProvider;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 import javax.inject.Inject;
 
@@ -37,7 +38,7 @@
   @WorkerThread
   @Override
   public Optional<Suggestion> getSuggestion(Context context, String number) {
-    return Optional.absent();
+    return Optional.empty();
   }
 
   @Override
diff --git a/java/com/android/dialer/simulator/service/SimulatorService.java b/java/com/android/dialer/simulator/service/SimulatorService.java
index 51936fb..ee4b8c6 100644
--- a/java/com/android/dialer/simulator/service/SimulatorService.java
+++ b/java/com/android/dialer/simulator/service/SimulatorService.java
@@ -34,11 +34,11 @@
 import androidx.annotation.Nullable;
 
 import com.android.dialer.simulator.impl.SimulatorMainPortal;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.Optional;
 
 /**
  * A secured android service that gives clients simulator api access through binder if clients do
@@ -167,7 +167,7 @@
         return Optional.of(processInfo.processName);
       }
     }
-    return Optional.absent();
+    return Optional.empty();
   }
 
   private static boolean isCertificateValid(
diff --git a/java/com/android/dialer/smartdial/map/BulgarianSmartDialMap.java b/java/com/android/dialer/smartdial/map/BulgarianSmartDialMap.java
index d34d325..a8cf00b 100644
--- a/java/com/android/dialer/smartdial/map/BulgarianSmartDialMap.java
+++ b/java/com/android/dialer/smartdial/map/BulgarianSmartDialMap.java
@@ -20,10 +20,10 @@
 import androidx.collection.SimpleArrayMap;
 
 import com.android.dialer.dialpadview.DialpadCharMappings;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /** A {@link SmartDialMap} for the Bulgarian alphabet. */
-@SuppressWarnings("Guava")
 final class BulgarianSmartDialMap extends SmartDialMap {
 
   private static BulgarianSmartDialMap instance;
@@ -41,7 +41,7 @@
   @Override
   Optional<Character> normalizeCharacter(char ch) {
     ch = Character.toLowerCase(ch);
-    return isValidDialpadAlphabeticChar(ch) ? Optional.of(ch) : Optional.absent();
+    return isValidDialpadAlphabeticChar(ch) ? Optional.of(ch) : Optional.empty();
   }
 
   @Override
diff --git a/java/com/android/dialer/smartdial/map/CompositeSmartDialMap.java b/java/com/android/dialer/smartdial/map/CompositeSmartDialMap.java
index b47ea88..5f36cc7 100644
--- a/java/com/android/dialer/smartdial/map/CompositeSmartDialMap.java
+++ b/java/com/android/dialer/smartdial/map/CompositeSmartDialMap.java
@@ -22,7 +22,8 @@
 import androidx.collection.SimpleArrayMap;
 
 import com.android.dialer.i18n.LocaleUtils;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /**
  * A utility class that combines the functionality of two implementations of {@link SmartDialMap} so
@@ -34,7 +35,6 @@
  * <p>Note that the second implementation can be absent if it is not defined for the system's 1st
  * language preference.
  */
-@SuppressWarnings("Guava")
 public class CompositeSmartDialMap {
 
   private static final SmartDialMap DEFAULT_MAP = LatinSmartDialMap.getInstance();
@@ -161,6 +161,6 @@
     String languageCode = LocaleUtils.getLocale(context).getISO3Language();
     return EXTRA_MAPS.containsKey(languageCode)
         ? Optional.of(EXTRA_MAPS.get(languageCode))
-        : Optional.absent();
+        : Optional.empty();
   }
 }
diff --git a/java/com/android/dialer/smartdial/map/LatinSmartDialMap.java b/java/com/android/dialer/smartdial/map/LatinSmartDialMap.java
index aa60f4f..6aad001 100644
--- a/java/com/android/dialer/smartdial/map/LatinSmartDialMap.java
+++ b/java/com/android/dialer/smartdial/map/LatinSmartDialMap.java
@@ -20,10 +20,10 @@
 import androidx.collection.SimpleArrayMap;
 
 import com.android.dialer.dialpadview.DialpadCharMappings;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /** A {@link SmartDialMap} for the Latin alphabet, which is for T9 dialpad searching. */
-@SuppressWarnings("Guava")
 final class LatinSmartDialMap extends SmartDialMap {
 
   private static LatinSmartDialMap instance;
@@ -63,683 +63,372 @@
 
     switch (ch) {
       case 'À':
-        return Optional.of('a');
       case 'Á':
-        return Optional.of('a');
       case 'Â':
-        return Optional.of('a');
       case 'Ã':
-        return Optional.of('a');
       case 'Ä':
-        return Optional.of('a');
       case 'Å':
-        return Optional.of('a');
-      case 'Ç':
-        return Optional.of('c');
-      case 'È':
-        return Optional.of('e');
-      case 'É':
-        return Optional.of('e');
-      case 'Ê':
-        return Optional.of('e');
-      case 'Ë':
-        return Optional.of('e');
-      case 'Ì':
-        return Optional.of('i');
-      case 'Í':
-        return Optional.of('i');
-      case 'Î':
-        return Optional.of('i');
-      case 'Ï':
-        return Optional.of('i');
-      case 'Ð':
-        return Optional.of('d');
-      case 'Ñ':
-        return Optional.of('n');
-      case 'Ò':
-        return Optional.of('o');
-      case 'Ó':
-        return Optional.of('o');
-      case 'Ô':
-        return Optional.of('o');
-      case 'Õ':
-        return Optional.of('o');
-      case 'Ö':
-        return Optional.of('o');
-      case '×':
-        return Optional.of('x');
-      case 'Ø':
-        return Optional.of('o');
-      case 'Ù':
-        return Optional.of('u');
-      case 'Ú':
-        return Optional.of('u');
-      case 'Û':
-        return Optional.of('u');
-      case 'Ü':
-        return Optional.of('u');
-      case 'Ý':
-        return Optional.of('u');
       case 'à':
-        return Optional.of('a');
       case 'á':
-        return Optional.of('a');
       case 'â':
-        return Optional.of('a');
       case 'ã':
-        return Optional.of('a');
       case 'ä':
-        return Optional.of('a');
       case 'å':
-        return Optional.of('a');
-      case 'ç':
-        return Optional.of('c');
-      case 'è':
-        return Optional.of('e');
-      case 'é':
-        return Optional.of('e');
-      case 'ê':
-        return Optional.of('e');
-      case 'ë':
-        return Optional.of('e');
-      case 'ì':
-        return Optional.of('i');
-      case 'í':
-        return Optional.of('i');
-      case 'î':
-        return Optional.of('i');
-      case 'ï':
-        return Optional.of('i');
-      case 'ð':
-        return Optional.of('d');
-      case 'ñ':
-        return Optional.of('n');
-      case 'ò':
-        return Optional.of('o');
-      case 'ó':
-        return Optional.of('o');
-      case 'ô':
-        return Optional.of('o');
-      case 'õ':
-        return Optional.of('o');
-      case 'ö':
-        return Optional.of('o');
-      case 'ø':
-        return Optional.of('o');
-      case 'ù':
-        return Optional.of('u');
-      case 'ú':
-        return Optional.of('u');
-      case 'û':
-        return Optional.of('u');
-      case 'ü':
-        return Optional.of('u');
-      case 'ý':
-        return Optional.of('y');
-      case 'ÿ':
-        return Optional.of('y');
       case 'Ā':
-        return Optional.of('a');
       case 'ā':
-        return Optional.of('a');
       case 'Ă':
-        return Optional.of('a');
       case 'ă':
-        return Optional.of('a');
       case 'Ą':
-        return Optional.of('a');
       case 'ą':
-        return Optional.of('a');
-      case 'Ć':
-        return Optional.of('c');
-      case 'ć':
-        return Optional.of('c');
-      case 'Ĉ':
-        return Optional.of('c');
-      case 'ĉ':
-        return Optional.of('c');
-      case 'Ċ':
-        return Optional.of('c');
-      case 'ċ':
-        return Optional.of('c');
-      case 'Č':
-        return Optional.of('c');
-      case 'č':
-        return Optional.of('c');
-      case 'Ď':
-        return Optional.of('d');
-      case 'ď':
-        return Optional.of('d');
-      case 'Đ':
-        return Optional.of('d');
-      case 'đ':
-        return Optional.of('d');
-      case 'Ē':
-        return Optional.of('e');
-      case 'ē':
-        return Optional.of('e');
-      case 'Ĕ':
-        return Optional.of('e');
-      case 'ĕ':
-        return Optional.of('e');
-      case 'Ė':
-        return Optional.of('e');
-      case 'ė':
-        return Optional.of('e');
-      case 'Ę':
-        return Optional.of('e');
-      case 'ę':
-        return Optional.of('e');
-      case 'Ě':
-        return Optional.of('e');
-      case 'ě':
-        return Optional.of('e');
-      case 'Ĝ':
-        return Optional.of('g');
-      case 'ĝ':
-        return Optional.of('g');
-      case 'Ğ':
-        return Optional.of('g');
-      case 'ğ':
-        return Optional.of('g');
-      case 'Ġ':
-        return Optional.of('g');
-      case 'ġ':
-        return Optional.of('g');
-      case 'Ģ':
-        return Optional.of('g');
-      case 'ģ':
-        return Optional.of('g');
-      case 'Ĥ':
-        return Optional.of('h');
-      case 'ĥ':
-        return Optional.of('h');
-      case 'Ħ':
-        return Optional.of('h');
-      case 'ħ':
-        return Optional.of('h');
-      case 'Ĩ':
-        return Optional.of('i');
-      case 'ĩ':
-        return Optional.of('i');
-      case 'Ī':
-        return Optional.of('i');
-      case 'ī':
-        return Optional.of('i');
-      case 'Ĭ':
-        return Optional.of('i');
-      case 'ĭ':
-        return Optional.of('i');
-      case 'Į':
-        return Optional.of('i');
-      case 'į':
-        return Optional.of('i');
-      case 'İ':
-        return Optional.of('i');
-      case 'ı':
-        return Optional.of('i');
-      case 'Ĵ':
-        return Optional.of('j');
-      case 'ĵ':
-        return Optional.of('j');
-      case 'Ķ':
-        return Optional.of('k');
-      case 'ķ':
-        return Optional.of('k');
-      case 'ĸ':
-        return Optional.of('k');
-      case 'Ĺ':
-        return Optional.of('l');
-      case 'ĺ':
-        return Optional.of('l');
-      case 'Ļ':
-        return Optional.of('l');
-      case 'ļ':
-        return Optional.of('l');
-      case 'Ľ':
-        return Optional.of('l');
-      case 'ľ':
-        return Optional.of('l');
-      case 'Ŀ':
-        return Optional.of('l');
-      case 'ŀ':
-        return Optional.of('l');
-      case 'Ł':
-        return Optional.of('l');
-      case 'ł':
-        return Optional.of('l');
-      case 'Ń':
-        return Optional.of('n');
-      case 'ń':
-        return Optional.of('n');
-      case 'Ņ':
-        return Optional.of('n');
-      case 'ņ':
-        return Optional.of('n');
-      case 'Ň':
-        return Optional.of('n');
-      case 'ň':
-        return Optional.of('n');
-      case 'Ō':
-        return Optional.of('o');
-      case 'ō':
-        return Optional.of('o');
-      case 'Ŏ':
-        return Optional.of('o');
-      case 'ŏ':
-        return Optional.of('o');
-      case 'Ő':
-        return Optional.of('o');
-      case 'ő':
-        return Optional.of('o');
-      case 'Ŕ':
-        return Optional.of('r');
-      case 'ŕ':
-        return Optional.of('r');
-      case 'Ŗ':
-        return Optional.of('r');
-      case 'ŗ':
-        return Optional.of('r');
-      case 'Ř':
-        return Optional.of('r');
-      case 'ř':
-        return Optional.of('r');
-      case 'Ś':
-        return Optional.of('s');
-      case 'ś':
-        return Optional.of('s');
-      case 'Ŝ':
-        return Optional.of('s');
-      case 'ŝ':
-        return Optional.of('s');
-      case 'Ş':
-        return Optional.of('s');
-      case 'ş':
-        return Optional.of('s');
-      case 'Š':
-        return Optional.of('s');
-      case 'š':
-        return Optional.of('s');
-      case 'Ţ':
-        return Optional.of('t');
-      case 'ţ':
-        return Optional.of('t');
-      case 'Ť':
-        return Optional.of('t');
-      case 'ť':
-        return Optional.of('t');
-      case 'Ŧ':
-        return Optional.of('t');
-      case 'ŧ':
-        return Optional.of('t');
-      case 'Ũ':
-        return Optional.of('u');
-      case 'ũ':
-        return Optional.of('u');
-      case 'Ū':
-        return Optional.of('u');
-      case 'ū':
-        return Optional.of('u');
-      case 'Ŭ':
-        return Optional.of('u');
-      case 'ŭ':
-        return Optional.of('u');
-      case 'Ů':
-        return Optional.of('u');
-      case 'ů':
-        return Optional.of('u');
-      case 'Ű':
-        return Optional.of('u');
-      case 'ű':
-        return Optional.of('u');
-      case 'Ų':
-        return Optional.of('u');
-      case 'ų':
-        return Optional.of('u');
-      case 'Ŵ':
-        return Optional.of('w');
-      case 'ŵ':
-        return Optional.of('w');
-      case 'Ŷ':
-        return Optional.of('y');
-      case 'ŷ':
-        return Optional.of('y');
-      case 'Ÿ':
-        return Optional.of('y');
-      case 'Ź':
-        return Optional.of('z');
-      case 'ź':
-        return Optional.of('z');
-      case 'Ż':
-        return Optional.of('z');
-      case 'ż':
-        return Optional.of('z');
-      case 'Ž':
-        return Optional.of('z');
-      case 'ž':
-        return Optional.of('z');
-      case 'ſ':
-        return Optional.of('s');
-      case 'ƀ':
-        return Optional.of('b');
-      case 'Ɓ':
-        return Optional.of('b');
-      case 'Ƃ':
-        return Optional.of('b');
-      case 'ƃ':
-        return Optional.of('b');
-      case 'Ɔ':
-        return Optional.of('o');
-      case 'Ƈ':
-        return Optional.of('c');
-      case 'ƈ':
-        return Optional.of('c');
-      case 'Ɖ':
-        return Optional.of('d');
-      case 'Ɗ':
-        return Optional.of('d');
-      case 'Ƌ':
-        return Optional.of('d');
-      case 'ƌ':
-        return Optional.of('d');
-      case 'ƍ':
-        return Optional.of('d');
-      case 'Ɛ':
-        return Optional.of('e');
-      case 'Ƒ':
-        return Optional.of('f');
-      case 'ƒ':
-        return Optional.of('f');
-      case 'Ɠ':
-        return Optional.of('g');
-      case 'Ɣ':
-        return Optional.of('g');
-      case 'Ɩ':
-        return Optional.of('i');
-      case 'Ɨ':
-        return Optional.of('i');
-      case 'Ƙ':
-        return Optional.of('k');
-      case 'ƙ':
-        return Optional.of('k');
-      case 'ƚ':
-        return Optional.of('l');
-      case 'ƛ':
-        return Optional.of('l');
-      case 'Ɯ':
-        return Optional.of('w');
-      case 'Ɲ':
-        return Optional.of('n');
-      case 'ƞ':
-        return Optional.of('n');
-      case 'Ɵ':
-        return Optional.of('o');
-      case 'Ơ':
-        return Optional.of('o');
-      case 'ơ':
-        return Optional.of('o');
-      case 'Ƥ':
-        return Optional.of('p');
-      case 'ƥ':
-        return Optional.of('p');
-      case 'ƫ':
-        return Optional.of('t');
-      case 'Ƭ':
-        return Optional.of('t');
-      case 'ƭ':
-        return Optional.of('t');
-      case 'Ʈ':
-        return Optional.of('t');
-      case 'Ư':
-        return Optional.of('u');
-      case 'ư':
-        return Optional.of('u');
-      case 'Ʊ':
-        return Optional.of('y');
-      case 'Ʋ':
-        return Optional.of('v');
-      case 'Ƴ':
-        return Optional.of('y');
-      case 'ƴ':
-        return Optional.of('y');
-      case 'Ƶ':
-        return Optional.of('z');
-      case 'ƶ':
-        return Optional.of('z');
-      case 'ƿ':
-        return Optional.of('w');
       case 'Ǎ':
-        return Optional.of('a');
       case 'ǎ':
-        return Optional.of('a');
-      case 'Ǐ':
-        return Optional.of('i');
-      case 'ǐ':
-        return Optional.of('i');
-      case 'Ǒ':
-        return Optional.of('o');
-      case 'ǒ':
-        return Optional.of('o');
-      case 'Ǔ':
-        return Optional.of('u');
-      case 'ǔ':
-        return Optional.of('u');
-      case 'Ǖ':
-        return Optional.of('u');
-      case 'ǖ':
-        return Optional.of('u');
-      case 'Ǘ':
-        return Optional.of('u');
-      case 'ǘ':
-        return Optional.of('u');
-      case 'Ǚ':
-        return Optional.of('u');
-      case 'ǚ':
-        return Optional.of('u');
-      case 'Ǜ':
-        return Optional.of('u');
-      case 'ǜ':
-        return Optional.of('u');
       case 'Ǟ':
-        return Optional.of('a');
       case 'ǟ':
-        return Optional.of('a');
       case 'Ǡ':
-        return Optional.of('a');
       case 'ǡ':
-        return Optional.of('a');
-      case 'Ǥ':
-        return Optional.of('g');
-      case 'ǥ':
-        return Optional.of('g');
-      case 'Ǧ':
-        return Optional.of('g');
-      case 'ǧ':
-        return Optional.of('g');
-      case 'Ǩ':
-        return Optional.of('k');
-      case 'ǩ':
-        return Optional.of('k');
-      case 'Ǫ':
-        return Optional.of('o');
-      case 'ǫ':
-        return Optional.of('o');
-      case 'Ǭ':
-        return Optional.of('o');
-      case 'ǭ':
-        return Optional.of('o');
-      case 'ǰ':
-        return Optional.of('j');
-      case 'ǲ':
-        return Optional.of('d');
-      case 'Ǵ':
-        return Optional.of('g');
-      case 'ǵ':
-        return Optional.of('g');
-      case 'Ƿ':
-        return Optional.of('w');
-      case 'Ǹ':
-        return Optional.of('n');
-      case 'ǹ':
-        return Optional.of('n');
       case 'Ǻ':
-        return Optional.of('a');
       case 'ǻ':
-        return Optional.of('a');
-      case 'Ǿ':
-        return Optional.of('o');
-      case 'ǿ':
-        return Optional.of('o');
       case 'Ȁ':
-        return Optional.of('a');
       case 'ȁ':
-        return Optional.of('a');
       case 'Ȃ':
-        return Optional.of('a');
       case 'ȃ':
-        return Optional.of('a');
-      case 'Ȅ':
-        return Optional.of('e');
-      case 'ȅ':
-        return Optional.of('e');
-      case 'Ȇ':
-        return Optional.of('e');
-      case 'ȇ':
-        return Optional.of('e');
-      case 'Ȉ':
-        return Optional.of('i');
-      case 'ȉ':
-        return Optional.of('i');
-      case 'Ȋ':
-        return Optional.of('i');
-      case 'ȋ':
-        return Optional.of('i');
-      case 'Ȍ':
-        return Optional.of('o');
-      case 'ȍ':
-        return Optional.of('o');
-      case 'Ȏ':
-        return Optional.of('o');
-      case 'ȏ':
-        return Optional.of('o');
-      case 'Ȑ':
-        return Optional.of('r');
-      case 'ȑ':
-        return Optional.of('r');
-      case 'Ȓ':
-        return Optional.of('r');
-      case 'ȓ':
-        return Optional.of('r');
-      case 'Ȕ':
-        return Optional.of('u');
-      case 'ȕ':
-        return Optional.of('u');
-      case 'Ȗ':
-        return Optional.of('u');
-      case 'ȗ':
-        return Optional.of('u');
-      case 'Ș':
-        return Optional.of('s');
-      case 'ș':
-        return Optional.of('s');
-      case 'Ț':
-        return Optional.of('t');
-      case 'ț':
-        return Optional.of('t');
-      case 'Ȝ':
-        return Optional.of('y');
-      case 'ȝ':
-        return Optional.of('y');
-      case 'Ȟ':
-        return Optional.of('h');
-      case 'ȟ':
-        return Optional.of('h');
-      case 'Ȥ':
-        return Optional.of('z');
-      case 'ȥ':
-        return Optional.of('z');
       case 'Ȧ':
-        return Optional.of('a');
       case 'ȧ':
-        return Optional.of('a');
-      case 'Ȩ':
-        return Optional.of('e');
-      case 'ȩ':
-        return Optional.of('e');
-      case 'Ȫ':
-        return Optional.of('o');
-      case 'ȫ':
-        return Optional.of('o');
-      case 'Ȭ':
-        return Optional.of('o');
-      case 'ȭ':
-        return Optional.of('o');
-      case 'Ȯ':
-        return Optional.of('o');
-      case 'ȯ':
-        return Optional.of('o');
-      case 'Ȱ':
-        return Optional.of('o');
-      case 'ȱ':
-        return Optional.of('o');
-      case 'Ȳ':
-        return Optional.of('y');
-      case 'ȳ':
-        return Optional.of('y');
       case 'A':
         return Optional.of('a');
+      case 'ƀ':
+      case 'Ɓ':
+      case 'Ƃ':
+      case 'ƃ':
       case 'B':
         return Optional.of('b');
+      case 'Ç':
+      case 'ç':
+      case 'Ć':
+      case 'ć':
+      case 'Ĉ':
+      case 'ĉ':
+      case 'Ċ':
+      case 'ċ':
+      case 'Č':
+      case 'č':
+      case 'Ƈ':
+      case 'ƈ':
       case 'C':
         return Optional.of('c');
+      case 'Ð':
+      case 'ð':
+      case 'Ď':
+      case 'ď':
+      case 'Đ':
+      case 'đ':
+      case 'Ɖ':
+      case 'Ɗ':
+      case 'Ƌ':
+      case 'ƌ':
+      case 'ƍ':
+      case 'ȡ':
       case 'D':
         return Optional.of('d');
+      case 'È':
+      case 'É':
+      case 'Ê':
+      case 'Ë':
+      case 'è':
+      case 'é':
+      case 'ê':
+      case 'ë':
+      case 'Ē':
+      case 'ē':
+      case 'Ĕ':
+      case 'ĕ':
+      case 'Ė':
+      case 'ė':
+      case 'Ę':
+      case 'ę':
+      case 'Ě':
+      case 'ě':
+      case 'Ɛ':
+      case 'Ȅ':
+      case 'ȅ':
+      case 'Ȇ':
+      case 'ȇ':
+      case 'Ȩ':
+      case 'ȩ':
       case 'E':
         return Optional.of('e');
+      case 'Ƒ':
+      case 'ƒ':
       case 'F':
         return Optional.of('f');
+      case 'Ĝ':
+      case 'ĝ':
+      case 'Ğ':
+      case 'ğ':
+      case 'Ġ':
+      case 'ġ':
+      case 'Ģ':
+      case 'ģ':
+      case 'Ɠ':
+      case 'Ɣ':
+      case 'Ǥ':
+      case 'ǥ':
+      case 'Ǧ':
+      case 'ǧ':
+      case 'Ǵ':
+      case 'ǵ':
       case 'G':
         return Optional.of('g');
+      case 'Ĥ':
+      case 'ĥ':
+      case 'Ħ':
+      case 'ħ':
+      case 'Ȟ':
+      case 'ȟ':
       case 'H':
         return Optional.of('h');
+      case 'Ì':
+      case 'Í':
+      case 'Î':
+      case 'Ï':
+      case 'ì':
+      case 'í':
+      case 'î':
+      case 'ï':
+      case 'Ĩ':
+      case 'ĩ':
+      case 'Ī':
+      case 'ī':
+      case 'Ĭ':
+      case 'ĭ':
+      case 'Į':
+      case 'į':
+      case 'İ':
+      case 'ı':
+      case 'Ɩ':
+      case 'Ɨ':
+      case 'Ǐ':
+      case 'ǐ':
+      case 'Ȉ':
+      case 'ȉ':
+      case 'Ȋ':
+      case 'ȋ':
       case 'I':
         return Optional.of('i');
+      case 'Ĵ':
+      case 'ĵ':
+      case 'ǰ':
       case 'J':
         return Optional.of('j');
+      case 'Ķ':
+      case 'ķ':
+      case 'ĸ':
+      case 'Ƙ':
+      case 'ƙ':
+      case 'Ǩ':
+      case 'ǩ':
       case 'K':
         return Optional.of('k');
+      case 'Ĺ':
+      case 'ĺ':
+      case 'Ļ':
+      case 'ļ':
+      case 'Ľ':
+      case 'ľ':
+      case 'Ŀ':
+      case 'ŀ':
+      case 'Ł':
+      case 'ł':
+      case 'ƚ':
+      case 'ƛ':
       case 'L':
         return Optional.of('l');
       case 'M':
         return Optional.of('m');
+      case 'Ñ':
+      case 'ñ':
+      case 'Ń':
+      case 'ń':
+      case 'Ņ':
+      case 'ņ':
+      case 'Ň':
+      case 'ň':
+      case 'Ɲ':
+      case 'ƞ':
+      case 'Ǹ':
+      case 'ǹ':
+      case 'Ƞ':
       case 'N':
         return Optional.of('n');
+      case 'Ò':
+      case 'Ó':
+      case 'Ô':
+      case 'Õ':
+      case 'Ö':
+      case 'Ø':
+      case 'ò':
+      case 'ó':
+      case 'ô':
+      case 'õ':
+      case 'ö':
+      case 'ø':
+      case 'Ō':
+      case 'ō':
+      case 'Ŏ':
+      case 'ŏ':
+      case 'Ő':
+      case 'ő':
+      case 'Ɔ':
+      case 'Ɵ':
+      case 'Ơ':
+      case 'ơ':
+      case 'Ǒ':
+      case 'ǒ':
+      case 'Ǫ':
+      case 'ǫ':
+      case 'Ǭ':
+      case 'ǭ':
+      case 'Ǿ':
+      case 'ǿ':
+      case 'Ȍ':
+      case 'ȍ':
+      case 'Ȏ':
+      case 'ȏ':
+      case 'Ȫ':
+      case 'ȫ':
+      case 'Ȭ':
+      case 'ȭ':
+      case 'Ȯ':
+      case 'ȯ':
+      case 'Ȱ':
+      case 'ȱ':
       case 'O':
         return Optional.of('o');
+      case 'Ƥ':
+      case 'ƥ':
       case 'P':
         return Optional.of('p');
       case 'Q':
         return Optional.of('q');
+      case 'Ŕ':
+      case 'ŕ':
+      case 'Ŗ':
+      case 'ŗ':
+      case 'Ř':
+      case 'ř':
+      case 'Ȑ':
+      case 'ȑ':
+      case 'Ȓ':
+      case 'ȓ':
       case 'R':
         return Optional.of('r');
+      case 'Ś':
+      case 'ś':
+      case 'Ŝ':
+      case 'ŝ':
+      case 'Ş':
+      case 'ş':
+      case 'Š':
+      case 'š':
+      case 'ſ':
+      case 'Ș':
+      case 'ș':
       case 'S':
         return Optional.of('s');
+      case 'Ţ':
+      case 'ţ':
+      case 'Ť':
+      case 'ť':
+      case 'Ŧ':
+      case 'ŧ':
+      case 'ƫ':
+      case 'Ƭ':
+      case 'ƭ':
+      case 'Ʈ':
+      case 'Ț':
+      case 'ț':
       case 'T':
         return Optional.of('t');
+      case 'Ù':
+      case 'Ú':
+      case 'Û':
+      case 'Ü':
+      case 'ù':
+      case 'ú':
+      case 'û':
+      case 'ü':
+      case 'Ũ':
+      case 'ũ':
+      case 'Ū':
+      case 'ū':
+      case 'Ŭ':
+      case 'ŭ':
+      case 'Ů':
+      case 'ů':
+      case 'Ű':
+      case 'ű':
+      case 'Ų':
+      case 'ų':
+      case 'Ư':
+      case 'ư':
+      case 'Ǔ':
+      case 'ǔ':
+      case 'Ǖ':
+      case 'ǖ':
+      case 'Ǘ':
+      case 'ǘ':
+      case 'Ǚ':
+      case 'ǚ':
+      case 'Ǜ':
+      case 'ǜ':
+      case 'Ȕ':
+      case 'ȕ':
+      case 'Ȗ':
+      case 'ȗ':
       case 'U':
         return Optional.of('u');
+      case 'Ʋ':
       case 'V':
         return Optional.of('v');
+      case 'Ŵ':
+      case 'ŵ':
+      case 'Ɯ':
+      case 'ƿ':
+      case 'Ƿ':
       case 'W':
         return Optional.of('w');
+      case '×':
       case 'X':
         return Optional.of('x');
+      case 'Ý':
+      case 'ý':
+      case 'ÿ':
+      case 'Ŷ':
+      case 'ŷ':
+      case 'Ÿ':
+      case 'Ʊ':
+      case 'Ƴ':
+      case 'ƴ':
+      case 'Ȝ':
+      case 'ȝ':
+      case 'Ȳ':
+      case 'ȳ':
       case 'Y':
         return Optional.of('y');
+      case 'Ź':
+      case 'ź':
+      case 'Ż':
+      case 'ż':
+      case 'Ž':
+      case 'ž':
+      case 'Ƶ':
+      case 'ƶ':
+      case 'Ȥ':
+      case 'ȥ':
       case 'Z':
         return Optional.of('z');
       default:
-        return Optional.absent();
+        return Optional.empty();
     }
   }
 
diff --git a/java/com/android/dialer/smartdial/map/RussianSmartDialMap.java b/java/com/android/dialer/smartdial/map/RussianSmartDialMap.java
index 914f2f3..15b174e 100644
--- a/java/com/android/dialer/smartdial/map/RussianSmartDialMap.java
+++ b/java/com/android/dialer/smartdial/map/RussianSmartDialMap.java
@@ -20,10 +20,10 @@
 import androidx.collection.SimpleArrayMap;
 
 import com.android.dialer.dialpadview.DialpadCharMappings;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /** A {@link SmartDialMap} for the Russian alphabet. */
-@SuppressWarnings("Guava")
 final class RussianSmartDialMap extends SmartDialMap {
 
   private static RussianSmartDialMap instance;
@@ -41,7 +41,7 @@
   @Override
   Optional<Character> normalizeCharacter(char ch) {
     ch = Character.toLowerCase(ch);
-    return isValidDialpadAlphabeticChar(ch) ? Optional.of(ch) : Optional.absent();
+    return isValidDialpadAlphabeticChar(ch) ? Optional.of(ch) : Optional.empty();
   }
 
   @Override
diff --git a/java/com/android/dialer/smartdial/map/SmartDialMap.java b/java/com/android/dialer/smartdial/map/SmartDialMap.java
index dc9eeb7..2d99ca2 100644
--- a/java/com/android/dialer/smartdial/map/SmartDialMap.java
+++ b/java/com/android/dialer/smartdial/map/SmartDialMap.java
@@ -19,10 +19,10 @@
 
 import androidx.collection.SimpleArrayMap;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 
 /** Definition for utilities that supports smart dial in different languages. */
-@SuppressWarnings("Guava")
+
 abstract class SmartDialMap {
 
   /**
@@ -58,7 +58,7 @@
    * <p>The provided character is expected to be a normalized character. See {@link
    * SmartDialMap#normalizeCharacter(char)} for details.
    *
-   * <p>An {@link Optional#absent()} is returned if the provided character can't be mapped to a key
+   * <p>An {@link Optional#empty()} ()} is returned if the provided character can't be mapped to a key
    * on the dialpad.
    */
   protected Optional<Byte> getDialpadIndex(char ch) {
@@ -70,7 +70,7 @@
       return Optional.of((byte) (getCharToKeyMap().get(ch) - '0'));
     }
 
-    return Optional.absent();
+    return Optional.empty();
   }
 
   /**
@@ -79,20 +79,20 @@
    * <p>The provided character is expected to be a normalized character. See {@link
    * SmartDialMap#normalizeCharacter(char)} for details.
    *
-   * <p>An {@link Optional#absent()} is returned if the provided character can't be mapped to a key
+   * <p>An {@link Optional#empty()} ()} is returned if the provided character can't be mapped to a key
    * on the dialpad.
    */
   protected Optional<Character> getDialpadNumericCharacter(char ch) {
     return isValidDialpadAlphabeticChar(ch)
         ? Optional.of(getCharToKeyMap().get(ch))
-        : Optional.absent();
+        : Optional.empty();
   }
 
   /**
    * Converts uppercase characters to lower case ones, and on a best effort basis, strips accents
    * from accented characters.
    *
-   * <p>An {@link Optional#absent()} is returned if the provided character can't be mapped to a key
+   * <p>An {@link Optional#empty()} ()} is returned if the provided character can't be mapped to a key
    * on the dialpad.
    */
   abstract Optional<Character> normalizeCharacter(char ch);
diff --git a/java/com/android/dialer/smartdial/map/UkrainianSmartDialMap.java b/java/com/android/dialer/smartdial/map/UkrainianSmartDialMap.java
index 69d2ccf..90b1555 100644
--- a/java/com/android/dialer/smartdial/map/UkrainianSmartDialMap.java
+++ b/java/com/android/dialer/smartdial/map/UkrainianSmartDialMap.java
@@ -20,7 +20,8 @@
 import androidx.collection.SimpleArrayMap;
 
 import com.android.dialer.dialpadview.DialpadCharMappings;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /** A {@link SmartDialMap} for the Ukrainian alphabet. */
 final class UkrainianSmartDialMap extends SmartDialMap {
@@ -40,7 +41,7 @@
   @Override
   Optional<Character> normalizeCharacter(char ch) {
     ch = Character.toLowerCase(ch);
-    return isValidDialpadAlphabeticChar(ch) ? Optional.of(ch) : Optional.absent();
+    return isValidDialpadAlphabeticChar(ch) ? Optional.of(ch) : Optional.empty();
   }
 
   @Override
diff --git a/java/com/android/dialer/speeddial/SpeedDialAdapter.java b/java/com/android/dialer/speeddial/SpeedDialAdapter.java
index 2404c7f..7d5336a 100644
--- a/java/com/android/dialer/speeddial/SpeedDialAdapter.java
+++ b/java/com/android/dialer/speeddial/SpeedDialAdapter.java
@@ -180,7 +180,7 @@
     speedDialUiItems.sort(
         (o1, o2) -> {
           if (o1.isStarred() && o2.isStarred()) {
-            return Integer.compare(o1.pinnedPosition().or(-1), o2.pinnedPosition().or(-1));
+            return Integer.compare(o1.pinnedPosition().orElse(-1), o2.pinnedPosition().orElse(-1));
           }
           return Boolean.compare(o2.isStarred(), o1.isStarred());
         });
diff --git a/java/com/android/dialer/speeddial/database/SpeedDialEntry.java b/java/com/android/dialer/speeddial/database/SpeedDialEntry.java
index 132a283..dfaa825 100644
--- a/java/com/android/dialer/speeddial/database/SpeedDialEntry.java
+++ b/java/com/android/dialer/speeddial/database/SpeedDialEntry.java
@@ -23,10 +23,10 @@
 import androidx.annotation.Nullable;
 
 import com.google.auto.value.AutoValue;
-import com.google.common.base.Optional;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Optional;
 
 /** POJO representation of database rows returned by {@link SpeedDialEntryDao}. */
 @AutoValue
@@ -61,7 +61,7 @@
   public abstract Builder toBuilder();
 
   public static Builder builder() {
-    return new AutoValue_SpeedDialEntry.Builder().setPinnedPosition(Optional.absent());
+    return new AutoValue_SpeedDialEntry.Builder().setPinnedPosition(Optional.empty());
   }
 
   /** Builder class for speed dial entry. */
diff --git a/java/com/android/dialer/speeddial/database/SpeedDialEntryDatabaseHelper.java b/java/com/android/dialer/speeddial/database/SpeedDialEntryDatabaseHelper.java
index f84cbab..2f189a2 100644
--- a/java/com/android/dialer/speeddial/database/SpeedDialEntryDatabaseHelper.java
+++ b/java/com/android/dialer/speeddial/database/SpeedDialEntryDatabaseHelper.java
@@ -27,12 +27,12 @@
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.database.Selection;
 import com.android.dialer.speeddial.database.SpeedDialEntry.Channel;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * {@link SpeedDialEntryDao} implemented as an SQLite database.
@@ -45,7 +45,7 @@
   /**
    * If the pinned position is absent, then we need to write an impossible value in the table like
    * -1 so that it doesn't default to 0. When we read this value from the table, we'll translate it
-   * to Optional.absent() in the resulting {@link SpeedDialEntry}.
+   * to Optional.empty() in the resulting {@link SpeedDialEntry}.
    */
   private static final int PINNED_POSITION_ABSENT = -1;
 
@@ -128,14 +128,14 @@
               Channel.builder()
                   .setNumber(number)
                   .setPhoneType(cursor.getInt(POSITION_PHONE_TYPE))
-                  .setLabel(Optional.fromNullable(cursor.getString(POSITION_PHONE_LABEL)).or(""))
+                  .setLabel(Optional.ofNullable(cursor.getString(POSITION_PHONE_LABEL)).orElse(""))
                   .setTechnology(cursor.getInt(POSITION_PHONE_TECHNOLOGY))
                   .build();
         }
 
         Optional<Integer> pinnedPosition = Optional.of(cursor.getInt(POSITION_PINNED_POSITION));
-        if (pinnedPosition.or(PINNED_POSITION_ABSENT) == PINNED_POSITION_ABSENT) {
-          pinnedPosition = Optional.absent();
+        if (pinnedPosition.orElse(PINNED_POSITION_ABSENT) == PINNED_POSITION_ABSENT) {
+          pinnedPosition = Optional.empty();
         }
 
         SpeedDialEntry entry =
@@ -246,7 +246,7 @@
     if (includeId) {
       values.put(ID, entry.id());
     }
-    values.put(PINNED_POSITION, entry.pinnedPosition().or(PINNED_POSITION_ABSENT));
+    values.put(PINNED_POSITION, entry.pinnedPosition().orElse(PINNED_POSITION_ABSENT));
     values.put(CONTACT_ID, entry.contactId());
     values.put(LOOKUP_KEY, entry.lookupKey());
     if (entry.defaultChannel() != null) {
diff --git a/java/com/android/dialer/speeddial/loader/SpeedDialUiItem.java b/java/com/android/dialer/speeddial/loader/SpeedDialUiItem.java
index 59f9d53..5ba16b4 100644
--- a/java/com/android/dialer/speeddial/loader/SpeedDialUiItem.java
+++ b/java/com/android/dialer/speeddial/loader/SpeedDialUiItem.java
@@ -34,12 +34,12 @@
 import com.android.dialer.speeddial.database.SpeedDialEntry;
 import com.android.dialer.speeddial.database.SpeedDialEntry.Channel;
 import com.google.auto.value.AutoValue;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -97,7 +97,7 @@
   public static Builder builder() {
     return new AutoValue_SpeedDialUiItem.Builder()
         .setChannels(ImmutableList.of())
-        .setPinnedPosition(Optional.absent());
+        .setPinnedPosition(Optional.empty());
   }
 
   /**
diff --git a/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java b/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java
index 47d102a..55b6da6 100644
--- a/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java
+++ b/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java
@@ -50,7 +50,6 @@
 import com.android.dialer.speeddial.database.SpeedDialEntryDao;
 import com.android.dialer.speeddial.database.SpeedDialEntryDatabaseHelper;
 import com.android.dialer.util.CallUtil;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.util.concurrent.Futures;
@@ -62,6 +61,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 
 import javax.inject.Inject;
diff --git a/java/com/android/dialer/telecom/TelecomCallUtil.java b/java/com/android/dialer/telecom/TelecomCallUtil.java
index 600ed6f..6868a5c 100644
--- a/java/com/android/dialer/telecom/TelecomCallUtil.java
+++ b/java/com/android/dialer/telecom/TelecomCallUtil.java
@@ -29,7 +29,8 @@
 
 import com.android.dialer.common.Assert;
 import com.android.dialer.location.GeoUtil;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /**
  * Class to provide a standard interface for obtaining information from the underlying
@@ -89,7 +90,7 @@
     }
     String rawNumber = getNumber(call);
     if (TextUtils.isEmpty(rawNumber)) {
-      return Optional.absent();
+      return Optional.empty();
     }
     return Optional.of(PhoneNumberUtils.normalizeNumber(rawNumber));
   }
@@ -100,16 +101,16 @@
    * GeoUtil#getCurrentCountryIso(Context)} is used.
    *
    * <p>If the number cannot be formatted (because for example it is invalid), returns {@link
-   * Optional#absent()}.
+   * Optional#empty()} ()}.
    */
   @WorkerThread
   public static Optional<String> getValidE164Number(Context appContext, Call call) {
     Assert.isWorkerThread();
     String rawNumber = getNumber(call);
     if (TextUtils.isEmpty(rawNumber)) {
-      return Optional.absent();
+      return Optional.empty();
     }
-    return Optional.fromNullable(
+    return Optional.ofNullable(
         PhoneNumberUtils.formatNumberToE164(rawNumber, GeoUtil.getCurrentCountryIso(appContext)));
   }
 }
diff --git a/java/com/android/dialer/telecom/TelecomUtil.java b/java/com/android/dialer/telecom/TelecomUtil.java
index b71a007..dd481d9 100644
--- a/java/com/android/dialer/telecom/TelecomUtil.java
+++ b/java/com/android/dialer/telecom/TelecomUtil.java
@@ -41,19 +41,19 @@
 
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.util.PermissionsUtil;
-import com.google.common.base.Optional;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.Optional;
 
 /**
  * Performs permission checks before calling into TelecomManager. Each method is self-explanatory -
  * perform the required check and return the fallback default if the permission is missing,
  * otherwise return the value from TelecomManager.
  */
-@SuppressWarnings({"MissingPermission", "Guava"})
+@SuppressWarnings("MissingPermission")
 public abstract class TelecomUtil {
 
   private static final String TAG = "TelecomUtil";
@@ -143,8 +143,8 @@
 
   public static List<PhoneAccountHandle> getCallCapablePhoneAccounts(Context context) {
     if (PermissionsUtil.hasReadPhoneStatePermissions(context)) {
-      return Optional.fromNullable(getTelecomManager(context).getCallCapablePhoneAccounts())
-          .or(new ArrayList<>());
+      return Optional.ofNullable(getTelecomManager(context).getCallCapablePhoneAccounts())
+          .orElse(new ArrayList<>());
     }
     return new ArrayList<>();
   }
@@ -196,22 +196,22 @@
   public static Optional<SubscriptionInfo> getSubscriptionInfo(
           @NonNull Context context, @NonNull PhoneAccountHandle phoneAccountHandle) {
     if (TextUtils.isEmpty(phoneAccountHandle.getId())) {
-      return Optional.absent();
+      return Optional.empty();
     }
     if (!PermissionsUtil.hasReadPhoneStatePermissions(context)) {
-      return Optional.absent();
+      return Optional.empty();
     }
     SubscriptionManager subscriptionManager = context.getSystemService(SubscriptionManager.class);
     List<SubscriptionInfo> subscriptionInfos = subscriptionManager.getActiveSubscriptionInfoList();
     if (subscriptionInfos == null) {
-      return Optional.absent();
+      return Optional.empty();
     }
     for (SubscriptionInfo info : subscriptionInfos) {
       if (phoneAccountHandle.getId().startsWith(info.getIccId())) {
         return Optional.of(info);
       }
     }
-    return Optional.absent();
+    return Optional.empty();
   }
 
   /**
diff --git a/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java b/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java
index 4c9f0ba..a0cfc82 100644
--- a/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java
+++ b/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java
@@ -42,10 +42,10 @@
 import com.android.voicemail.VoicemailClient;
 import com.android.voicemail.VoicemailClient.ActivationStateListener;
 import com.android.voicemail.VoicemailComponent;
-import com.google.common.base.Optional;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Optional;
 
 /**
  * Fragment for voicemail settings. Requires {@link VoicemailClient#PARAM_PHONE_ACCOUNT_HANDLE} set
diff --git a/java/com/android/incallui/ActiveCallsCallListListener.java b/java/com/android/incallui/ActiveCallsCallListListener.java
index 8c381a24..b7f452e 100644
--- a/java/com/android/incallui/ActiveCallsCallListListener.java
+++ b/java/com/android/incallui/ActiveCallsCallListListener.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,11 +26,11 @@
 import com.android.incallui.call.CallList;
 import com.android.incallui.call.DialerCall;
 import com.android.incallui.call.state.DialerCallState;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 
+import java.util.Optional;
+
 /** Updates {@link com.android.dialer.activecalls.ActiveCalls} */
-@SuppressWarnings("Guava")
 public class ActiveCallsCallListListener implements CallList.Listener {
 
   private final Context appContext;
diff --git a/java/com/android/incallui/InCallActivity.java b/java/com/android/incallui/InCallActivity.java
index 8213678..0f1a156 100644
--- a/java/com/android/incallui/InCallActivity.java
+++ b/java/com/android/incallui/InCallActivity.java
@@ -379,8 +379,8 @@
           waitingForAccountCall.setPreferredAccountRecorder(
               new PreferredAccountRecorder(
                   waitingForAccountCall.getNumber(),
-                  result.getSuggestion().orNull(),
-                  result.getDataId().orNull()));
+                  result.getSuggestion().orElse(null),
+                  result.getDataId().orElse(null)));
           selectPhoneAccountDialogFragment =
               SelectPhoneAccountDialogFragment.newInstance(
                   result.getDialogOptionsBuilder().get().setCallId(callId).build(),
diff --git a/java/com/android/voicemail/impl/CarrierIdentifierMatcher.java b/java/com/android/voicemail/impl/CarrierIdentifierMatcher.java
index 5953755..2f57b1e 100644
--- a/java/com/android/voicemail/impl/CarrierIdentifierMatcher.java
+++ b/java/com/android/voicemail/impl/CarrierIdentifierMatcher.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,7 +18,8 @@
 package com.android.voicemail.impl;
 
 import com.google.auto.value.AutoValue;
-import com.google.common.base.Optional;
+
+import java.util.Optional;
 
 /**
  * Matches a {@link CarrierIdentifier}. Full equality check on CarrierIdentifiers is often unfit
