diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 5ec4f65..83740c9 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -450,6 +450,9 @@
     private ConcurrentHashMap<Integer, SatelliteProvisionStateChangedHandler>
             mSatelliteProvisionStateChangedHandlers = new ConcurrentHashMap<>();
 
+    private Boolean mIsSatelliteSupported = null;
+    private final Object mIsSatelliteSupportedLock = new Object();
+
     private static final String PREF_CARRIERS_ALPHATAG_PREFIX = "carrier_alphtag_";
     private static final String PREF_CARRIERS_NUMBER_PREFIX = "carrier_number_";
     private static final String PREF_CARRIERS_SUBSCRIBER_PREFIX = "carrier_subscriber_";
@@ -634,7 +637,7 @@
                         }
                     });
 
-                    setSatelliteEnabled(provisioned);
+                    setSatelliteProvisioned(provisioned);
                     /**
                      * TODO: Take bugreport if provisioned is true and user did not initiate the
                      * provision procedure for the corresponding subscription.
@@ -646,12 +649,12 @@
             }
         }
 
-        private void setSatelliteEnabled(boolean isEnabled) {
+        private void setSatelliteProvisioned(boolean isProvisioned) {
             if (mSubId != SubscriptionManager.DEFAULT_SUBSCRIPTION_ID) {
                 SubscriptionManager.setSubscriptionProperty(
-                        mSubId, SubscriptionManager.SATELLITE_ENABLED, isEnabled ? "1" : "0");
+                        mSubId, SubscriptionManager.SATELLITE_ENABLED, isProvisioned ? "1" : "0");
             } else {
-                //TODO (b/267826133): set enabled via SatelliteController.
+                //TODO (b/267826133): set via SatelliteController.
             }
         }
     }
@@ -2412,7 +2415,7 @@
                     } else {
                         loge("startSatellitePositionUpdates: No phone object");
                         request.result =
-                                SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                                SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
                         notifyRequester(request);
                     }
                     break;
@@ -2422,9 +2425,9 @@
                     ar = (AsyncResult) msg.obj;
                     request = (MainThreadRequest) ar.userObj;
                     if (ar.exception == null) {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+                        request.result = SatelliteManager.SATELLITE_ERROR_NONE;
                     } else {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_ERROR;
+                        request.result = SatelliteManager.SATELLITE_ERROR;
                         if (ar.exception instanceof CommandException) {
                             CommandException.Error error =
                                     ((CommandException) (ar.exception)).getCommandError();
@@ -2448,7 +2451,7 @@
                     } else {
                         loge("stopSatellitePositionUpdates: No phone object");
                         request.result =
-                                SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                                SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
                         notifyRequester(request);
                     }
                     break;
@@ -2458,9 +2461,9 @@
                     ar = (AsyncResult) msg.obj;
                     request = (MainThreadRequest) ar.userObj;
                     if (ar.exception == null) {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+                        request.result = SatelliteManager.SATELLITE_ERROR_NONE;
                     } else {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_ERROR;
+                        request.result = SatelliteManager.SATELLITE_ERROR;
                         if (ar.exception instanceof CommandException) {
                             CommandException.Error error =
                                     ((CommandException) (ar.exception)).getCommandError();
@@ -2484,7 +2487,7 @@
                     } else {
                         loge("getMaxCharactersPerSatelliteTextMessage: No phone object");
                         request.result = SatelliteManager
-                                .SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                                .SATELLITE_INVALID_TELEPHONY_STATE;
                         notifyRequester(request);
                     }
                     break;
@@ -2495,7 +2498,7 @@
                     request = (MainThreadRequest) ar.userObj;
                     Consumer<Integer> callback = (Consumer<Integer>) request.argument;
                     if (ar.exception != null) {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_ERROR;
+                        request.result = SatelliteManager.SATELLITE_ERROR;
                         if (ar.exception instanceof CommandException) {
                             CommandException.Error error =
                                     ((CommandException) (ar.exception)).getCommandError();
@@ -2508,10 +2511,10 @@
                         }
                     } else if (ar.result == null) {
                         request.result = SatelliteManager
-                                .SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                                .SATELLITE_INVALID_TELEPHONY_STATE;
                         loge("getMaxCharactersPerSatelliteTextMessage: result is null");
                     } else {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+                        request.result = SatelliteManager.SATELLITE_ERROR_NONE;
                         int maxCharLimit = ((int[]) ar.result)[0];
                         if (DBG) log("getMaxCharactersPerSatelliteTextMessage: " + maxCharLimit);
                         callback.accept(maxCharLimit);
@@ -2532,7 +2535,7 @@
                     } else {
                         loge("provisionSatelliteService: No phone object");
                         request.result =
-                                SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                                SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
                         notifyRequester(request);
                     }
                     break;
@@ -2542,9 +2545,9 @@
                     ar = (AsyncResult) msg.obj;
                     request = (MainThreadRequest) ar.userObj;
                     if (ar.exception == null) {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+                        request.result = SatelliteManager.SATELLITE_ERROR_NONE;
                     } else {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_ERROR;
+                        request.result = SatelliteManager.SATELLITE_ERROR;
                         if (ar.exception instanceof CommandException) {
                             CommandException.Error error =
                                     ((CommandException) (ar.exception)).getCommandError();
@@ -2572,11 +2575,11 @@
                     request = (MainThreadRequest) ar.userObj;
 
                     if (ar.exception == null) {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+                        request.result = SatelliteManager.SATELLITE_ERROR_NONE;
                         log("cancelProvisionSatelliteService succeeded for subId="
                                 + (int) request.argument);
                     } else {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_ERROR;
+                        request.result = SatelliteManager.SATELLITE_ERROR;
                         if (ar.exception instanceof CommandException) {
                             CommandException.Error error =
                                     ((CommandException) (ar.exception)).getCommandError();
@@ -2602,7 +2605,7 @@
                     } else {
                         loge("getProvisionedSatelliteFeatures: No phone object");
                         request.result = SatelliteManager
-                                .SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                                .SATELLITE_INVALID_TELEPHONY_STATE;
                         notifyRequester(request);
                     }
                     break;
@@ -2612,7 +2615,7 @@
                     ar = (AsyncResult) msg.obj;
                     request = (MainThreadRequest) ar.userObj;
                     if (ar.exception != null) {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_ERROR;
+                        request.result = SatelliteManager.SATELLITE_ERROR;
                         if (ar.exception instanceof CommandException) {
                             CommandException.Error error =
                                     ((CommandException) (ar.exception)).getCommandError();
@@ -2625,10 +2628,10 @@
                         }
                     } else if (ar.result == null) {
                         request.result = SatelliteManager
-                                .SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                                .SATELLITE_INVALID_TELEPHONY_STATE;
                         loge("getProvisionedSatelliteFeatures: result is null");
                     } else {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+                        request.result = SatelliteManager.SATELLITE_ERROR_NONE;
                         int[] features = ((int[]) ar.result);
                         if (DBG) {
                             log("getProvisionedSatelliteFeatures features:"
@@ -2658,7 +2661,7 @@
                         phone.setSatellitePower(onCompleted, (boolean) request.argument);
                     } else {
                         loge("setSatellitePower: No phone object");
-                        request.result = SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                        request.result = SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
                         notifyRequester(request);
                     }
                     break;
@@ -2668,7 +2671,7 @@
                     ar = (AsyncResult) msg.obj;
                     request = (MainThreadRequest) ar.userObj;
                     if (ar.exception == null) {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+                        request.result = SatelliteManager.SATELLITE_ERROR_NONE;
                     } else {
                         request.result = SatelliteManager.SATELLITE_SERVICE_ERROR;
                         if (ar.exception instanceof CommandException) {
@@ -2692,7 +2695,7 @@
                         phone.isSatellitePowerOn(onCompleted);
                     } else {
                         loge("isSatellitePowerOn: No phone object");
-                        request.result = SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                        request.result = SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
                         notifyRequester(request);
                     }
                     break;
@@ -2713,10 +2716,10 @@
                             loge("isSatellitePowerOn unknown exception:" + ar.exception);
                         }
                     } else if (ar.result == null) {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                        request.result = SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
                         loge("isSatellitePowerOn: result is null");
                     } else {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+                        request.result = SatelliteManager.SATELLITE_ERROR_NONE;
                         boolean powerOn = ((int[]) ar.result)[0] == 1;
                         if (DBG) log("isSatellitePowerOn: " + powerOn);
                         callback.accept(powerOn);
@@ -2733,7 +2736,7 @@
                         phone.isSatelliteSupported(onCompleted);
                     } else {
                         loge("isSatelliteSupported: No phone object");
-                        request.result = SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                        request.result = SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
                         notifyRequester(request);
                     }
                     break;
@@ -2754,13 +2757,16 @@
                             loge("isSatelliteSupported unknown exception:" + ar.exception);
                         }
                     } else if (ar.result == null) {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                        request.result = SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
                         loge("isSatelliteSupported: result is null");
                     } else {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_SUCCESS;
-                        boolean powerOn = ((int[]) ar.result)[0] == 1;
-                        if (DBG) log("isSatelliteSupported: " + powerOn);
-                        callback.accept(powerOn);
+                        request.result = SatelliteManager.SATELLITE_ERROR_NONE;
+                        boolean isSupported = ((int[]) ar.result)[0] == 1;
+                        if (DBG) log("isSatelliteSupported: " + isSupported);
+                        if (callback != null) callback.accept(isSupported);
+                        synchronized (mIsSatelliteSupportedLock) {
+                            mIsSatelliteSupported = isSupported;
+                        }
                     }
                     notifyRequester(request);
                     break;
@@ -2774,7 +2780,7 @@
                         phone.getSatelliteCapabilities(onCompleted);
                     } else {
                         loge("getSatelliteCapabilities: No phone object");
-                        request.result = SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                        request.result = SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
                         notifyRequester(request);
                     }
                     break;
@@ -2796,10 +2802,10 @@
                             loge("getSatelliteCapabilities unknown exception:" + ar.exception);
                         }
                     } else if (ar.result == null) {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+                        request.result = SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
                         loge("getSatelliteCapabilities: result is null");
                     } else {
-                        request.result = SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+                        request.result = SatelliteManager.SATELLITE_ERROR_NONE;
                         SatelliteCapabilities capabilities = (SatelliteCapabilities) ar.result;
                         if (DBG) log("getSatelliteCapabilities: " + capabilities);
                         callback.accept(capabilities);
@@ -12628,18 +12634,21 @@
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteServiceResult public int setSatellitePower(int subId,
+    @SatelliteManager.SatelliteError public int setSatellitePower(int subId,
             boolean powerOn) {
         enforceSatelliteCommunicationPermission("setSatellitePower");
+        if (!isSatelliteSupported()) {
+            return SatelliteManager.SATELLITE_NOT_SUPPORTED;
+        }
 
         final int validSubId = getValidSatelliteSubId(subId);
-        if (!isSatelliteEnabled(validSubId)) {
-            return SatelliteManager.SATELLITE_SERVICE_DISABLED;
+        if (!isSatelliteProvisioned(validSubId)) {
+            return SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED;
         }
 
         Phone phone = getPhoneOrDefault(validSubId, "setSatellitePower");
         if (phone == null) {
-            return SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+            return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
         }
 
         int result = (int) sendRequest(CMD_SET_SATELLITE_POWER, powerOn, subId);
@@ -12659,18 +12668,21 @@
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteServiceResult public int isSatellitePowerOn(int subId,
+    @SatelliteManager.SatelliteError public int isSatellitePowerOn(int subId,
             @NonNull IBooleanConsumer callback) {
         enforceSatelliteCommunicationPermission("isSatellitePowerOn");
+        if (!isSatelliteSupported()) {
+            return SatelliteManager.SATELLITE_NOT_SUPPORTED;
+        }
 
         final int validSubId = getValidSatelliteSubId(subId);
-        if (!isSatelliteEnabled(validSubId)) {
-            return SatelliteManager.SATELLITE_SERVICE_DISABLED;
+        if (!isSatelliteProvisioned(validSubId)) {
+            return SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED;
         }
 
         Phone phone = getPhoneOrDefault(validSubId, "isSatellitePowerOn");
         if (phone == null) {
-            return SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+            return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
         }
 
         Consumer<Boolean> argument = FunctionalUtils.ignoreRemoteException(callback::accept);
@@ -12691,17 +12703,31 @@
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteServiceResult public int isSatelliteSupported(int subId,
+    @SatelliteManager.SatelliteError public int isSatelliteSupported(int subId,
             @NonNull IBooleanConsumer callback) {
         enforceSatelliteCommunicationPermission("isSatelliteSupported");
+        synchronized (mIsSatelliteSupportedLock) {
+            if (mIsSatelliteSupported != null) {
+                /* We have already successfully queried the satellite modem. */
+                if (callback != null) {
+                    try {
+                        callback.accept(mIsSatelliteSupported);
+                    } catch (RemoteException ex) {
+                        loge("isSatelliteSupported: callback not available");
+                    }
+                }
+                return SatelliteManager.SATELLITE_ERROR_NONE;
+            }
+        }
 
         final int validSubId = getValidSatelliteSubId(subId);
         Phone phone = getPhoneOrDefault(validSubId, "isSatelliteSupported");
         if (phone == null) {
-            return SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+            return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
         }
 
-        Consumer<Boolean> argument = FunctionalUtils.ignoreRemoteException(callback::accept);
+        Consumer<Boolean> argument =
+                (callback == null) ? null : FunctionalUtils.ignoreRemoteException(callback::accept);
         int result = (int) sendRequest(CMD_IS_SATELLITE_SUPPORTED, argument, subId);
         if (DBG) log("isSatelliteSupported result: " + result);
         return result;
@@ -12718,14 +12744,17 @@
      * @throws SecurityException if the caller doesn't have required permission.
      */
     @Override
-    @SatelliteManager.SatelliteServiceResult public int getSatelliteCapabilities(int subId,
+    @SatelliteManager.SatelliteError public int getSatelliteCapabilities(int subId,
             @NonNull ISatelliteCapabilitiesConsumer callback) {
         enforceSatelliteCommunicationPermission("getSatelliteCapabilities");
+        if (!isSatelliteSupported()) {
+            return SatelliteManager.SATELLITE_NOT_SUPPORTED;
+        }
 
         final int validSubId = getValidSatelliteSubId(subId);
         Phone phone = getPhoneOrDefault(validSubId, "getSatelliteCapabilities");
         if (phone == null) {
-            return SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+            return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
         }
 
         Consumer<SatelliteCapabilities> argument =
@@ -12747,24 +12776,30 @@
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteServiceResult public int startSatellitePositionUpdates(int subId,
+    @SatelliteManager.SatelliteError
+    public int startSatellitePositionUpdates(int subId,
             @NonNull ISatelliteStateListener callback) {
         enforceSatelliteCommunicationPermission("startSatellitePositionUpdates");
+        if (!isSatelliteSupported()) {
+            return SatelliteManager.SATELLITE_NOT_SUPPORTED;
+        }
 
         final int validSubId = getValidSatelliteSubId(subId);
-        if (!isSatelliteEnabled(validSubId)) {
-            return SatelliteManager.SATELLITE_SERVICE_DISABLED;
+        if (!isSatelliteProvisioned(validSubId)) {
+            return SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED;
         }
 
         Phone phone = getPhoneOrDefault(validSubId, "startSatellitePositionUpdates");
         if (phone == null) {
-            return SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+            return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
         }
 
         if (mSatellitePositionUpdateHandlers.containsKey(callback.asBinder())) {
-            log("startSatellitePositionUpdates: callback already registered: "
-                    + callback.asBinder());
-            return SatelliteManager.SATELLITE_SERVICE_CALLBACK_ALREADY_REGISTERED;
+            if (DBG) {
+                log("startSatellitePositionUpdates: callback already registered: "
+                        + callback.asBinder());
+            }
+            return SatelliteManager.SATELLITE_ERROR_NONE;
         }
 
         SatellitePositionUpdateHandler handler =
@@ -12792,25 +12827,29 @@
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteServiceResult public int stopSatellitePositionUpdates(int subId,
+    @SatelliteManager.SatelliteError
+    public int stopSatellitePositionUpdates(int subId,
             @NonNull ISatelliteStateListener callback) {
         enforceSatelliteCommunicationPermission("stopSatellitePositionUpdates");
+        if (!isSatelliteSupported()) {
+            return SatelliteManager.SATELLITE_NOT_SUPPORTED;
+        }
 
         final int validSubId = getValidSatelliteSubId(subId);
-        if (!isSatelliteEnabled(validSubId)) {
-            return SatelliteManager.SATELLITE_SERVICE_DISABLED;
+        if (!isSatelliteProvisioned(validSubId)) {
+            return SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED;
         }
 
         Phone phone = getPhoneOrDefault(validSubId, "stopSatellitePositionUpdates");
         if (phone == null) {
-            return SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+            return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
         }
 
         SatellitePositionUpdateHandler handler =
                 mSatellitePositionUpdateHandlers.remove(callback.asBinder());
         if (handler == null) {
             loge("stopSatellitePositionUpdates: No SatellitePositionArgument");
-            return SatelliteManager.SATELLITE_SERVICE_CALLBACK_NOT_REGISTERED;
+            return SatelliteManager.SATELLITE_INVALID_ARGUMENTS;
         } else {
             phone.unregisterForSatellitePointingInfoChanged(handler);
             phone.unregisterForSatelliteMessagesTransferComplete(handler);
@@ -12818,7 +12857,7 @@
 
         if (!mSatellitePositionUpdateHandlers.isEmpty()) {
             log("stopSatellitePositionUpdates: other listeners still exist.");
-            return SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+            return SatelliteManager.SATELLITE_ERROR_NONE;
         }
 
         int result = (int) sendRequest(CMD_STOP_SATELLITE_POSITION_UPDATES, null, validSubId);
@@ -12838,15 +12877,18 @@
     @Override
     public int getMaxCharactersPerSatelliteTextMessage(int subId, IIntegerConsumer callback) {
         enforceSatelliteCommunicationPermission("getMaxCharactersPerSatelliteTextMessage");
+        if (!isSatelliteSupported()) {
+            return SatelliteManager.SATELLITE_NOT_SUPPORTED;
+        }
 
         final int validSubId = getValidSatelliteSubId(subId);
-        if (!isSatelliteEnabled(validSubId)) {
-            return SatelliteManager.SATELLITE_SERVICE_DISABLED;
+        if (!isSatelliteProvisioned(validSubId)) {
+            return SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED;
         }
 
         Phone phone = getPhoneOrDefault(validSubId, "getMaxCharactersPerSatelliteTextMessage");
         if (phone == null) {
-            return SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+            return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
         }
 
         Consumer<Integer> argument = FunctionalUtils.ignoreRemoteException(callback::accept);
@@ -12871,11 +12913,18 @@
             IIntegerConsumer callback) {
         enforceSatelliteCommunicationPermission("provisionSatelliteService");
 
-        final int validSubId = getValidSatelliteSubId(subId);
+
         String callbackRemoteExErrorMessage = "provisionSatelliteService: callback not available.";
+        if (!isSatelliteSupported()) {
+            sendResponse(callback, SatelliteManager.SATELLITE_NOT_SUPPORTED,
+                    callbackRemoteExErrorMessage);
+            return null;
+        }
+
+        final int validSubId = getValidSatelliteSubId(subId);
         Phone phone = getPhoneOrDefault(validSubId, "provisionSatelliteService");
         if (phone == null) {
-            sendResponse(callback, SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE,
+            sendResponse(callback, SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE,
                     callbackRemoteExErrorMessage);
             return null;
         }
@@ -12886,8 +12935,8 @@
             return null;
         }
 
-        if (isSatelliteEnabled(validSubId)) {
-            sendResponse(callback, SatelliteManager.SATELLITE_SERVICE_ALREADY_PROVISIONED,
+        if (isSatelliteProvisioned(validSubId)) {
+            sendResponse(callback, SatelliteManager.SATELLITE_ERROR_NONE,
                     callbackRemoteExErrorMessage);
             return null;
         }
@@ -12911,16 +12960,19 @@
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteServiceResult
+    @SatelliteManager.SatelliteError
     public int registerForSatelliteProvisionStateChanged(
             int subId, ISatelliteStateListener callback) {
-        //enforceSatelliteCommunicationPermission("registerForSatelliteProvisionStateChanged");
+        enforceSatelliteCommunicationPermission("registerForSatelliteProvisionStateChanged");
+        if (!isSatelliteSupported()) {
+            return SatelliteManager.SATELLITE_NOT_SUPPORTED;
+        }
 
         final int validSubId = getValidSatelliteSubId(subId);
         Phone phone = getPhoneOrDefault(
                 validSubId, "registerForSatelliteProvisionStateChanged");
         if (phone == null) {
-            return SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+            return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
         }
 
         SatelliteProvisionStateChangedHandler satelliteProvisionStateChangedHandler =
@@ -12939,7 +12991,7 @@
         }
         mSatelliteProvisionStateChangedHandlers.put(
                 validSubId, satelliteProvisionStateChangedHandler);
-        return SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+        return SatelliteManager.SATELLITE_ERROR_NONE;
     }
 
     /**
@@ -12951,20 +13003,23 @@
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteServiceResult
+    @SatelliteManager.SatelliteError
     public int unregisterForSatelliteProvisionStateChanged(
             int subId, ISatelliteStateListener callback) {
         enforceSatelliteCommunicationPermission("unregisterForSatelliteProvisionStateChanged");
+        if (!isSatelliteSupported()) {
+            return SatelliteManager.SATELLITE_NOT_SUPPORTED;
+        }
 
         final int validSubId = getValidSatelliteSubId(subId);
         SatelliteProvisionStateChangedHandler satelliteProvisionStateChangedHandler =
                 mSatelliteProvisionStateChangedHandlers.get(validSubId);
         if (satelliteProvisionStateChangedHandler != null) {
             if (satelliteProvisionStateChangedHandler.removeListener(callback)) {
-                return SatelliteManager.SATELLITE_SERVICE_SUCCESS;
+                return SatelliteManager.SATELLITE_ERROR_NONE;
             }
         }
-        return SatelliteManager.SATELLITE_SERVICE_CALLBACK_NOT_REGISTERED;
+        return SatelliteManager.SATELLITE_INVALID_ARGUMENTS;
     }
 
     /**
@@ -12976,18 +13031,21 @@
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteServiceResult
+    @SatelliteManager.SatelliteError
     public int getProvisionedSatelliteFeatures(int subId, IIntArrayConsumer callback) {
         enforceSatelliteCommunicationPermission("getProvisionedSatelliteFeatures");
+        if (!isSatelliteSupported()) {
+            return SatelliteManager.SATELLITE_NOT_SUPPORTED;
+        }
 
         final int validSubId = getValidSatelliteSubId(subId);
-        if (!isSatelliteEnabled(validSubId)) {
-            return SatelliteManager.SATELLITE_SERVICE_DISABLED;
+        if (!isSatelliteProvisioned(validSubId)) {
+            return SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED;
         }
 
         final Phone phone = getPhoneOrDefault(validSubId, "getProvisionedSatelliteFeatures");
         if (phone == null) {
-            return SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE;
+            return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
         }
 
         int result = (int) sendRequest(
@@ -13006,7 +13064,7 @@
         }
         if (phone == null) {
             loge("handleCmdProvisionSatelliteService: phone is null");
-            sendResponse(arg.callback, SatelliteManager.SATELLITE_SERVICE_INVALID_TELEPHONY_STATE,
+            sendResponse(arg.callback, SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE,
                     callbackRemoteExErrorMessage);
             return;
         }
@@ -13044,8 +13102,8 @@
         sendResponse(callback, result,
                 "handleEventProvisionSatelliteServiceDone: callback not available.");
 
-        if (result == SatelliteManager.SATELLITE_SERVICE_SUCCESS) {
-            setSatelliteEnabled(arg.subId, true);
+        if (result == SatelliteManager.SATELLITE_ERROR_NONE) {
+            setSatelliteProvisioned(arg.subId, true);
         }
 
         /**
@@ -13101,15 +13159,15 @@
     }
 
     /**
-     * Check if satellite is enabled for a subscription.
+     * Check if satellite is provisioned for a subscription or the device.
      *
      * Note: this is the version without permission check for telephony internal use only. The
      * caller need to take care of the permission check.
      */
-    private boolean isSatelliteEnabled(int subId) {
+    private boolean isSatelliteProvisioned(int subId) {
         if (subId != SubscriptionManager.DEFAULT_SUBSCRIPTION_ID) {
             if (mSubscriptionController == null) {
-                loge("setSatelliteEnabled mSubscriptionController is null");
+                loge("isSatelliteProvisioned mSubscriptionController is null");
                 return false;
             }
 
@@ -13126,22 +13184,22 @@
     }
 
     /**
-     * Set satellite enabled for a subscription.
+     * Set satellite provisioned for a subscription or the device.
      *
      * The permission {@link android.Manifest.permission#MODIFY_PHONE_STATE} will be enforced by
      * {@link SubscriptionController} when setting satellite enabled for an active subscription.
      * Otherwise, {@link android.Manifest.permission#SATELLITE_COMMUNICATION} will be enforced.
      */
-    private void setSatelliteEnabled(int subId, boolean isEnabled) {
+    private void setSatelliteProvisioned(int subId, boolean isEnabled) {
         if (subId != SubscriptionManager.DEFAULT_SUBSCRIPTION_ID) {
             if (mSubscriptionController == null) {
-                loge("setSatelliteEnabled mSubscriptionController is null");
+                loge("setSatelliteProvisioned mSubscriptionController is null");
                 return;
             }
             mSubscriptionController.setSubscriptionProperty(
                     subId, SubscriptionManager.SATELLITE_ENABLED, isEnabled ? "1" : "0");
         } else {
-            //TODO (b/267826133): enable via SatelliteController
+            //TODO (b/267826133): set via SatelliteController
         }
     }
 
@@ -13166,6 +13224,32 @@
     }
 
     /**
+     * If we have not successfully queried the satellite modem for its satellite service support, we
+     * will retry the query one more time. Otherwise, we will return the queried result.
+     */
+    private boolean isSatelliteSupported() {
+        synchronized (mIsSatelliteSupportedLock) {
+            if (mIsSatelliteSupported != null) {
+                /* We have already successfully queried the satellite modem. */
+                return mIsSatelliteSupported;
+            }
+        }
+        /**
+         * We have not successfully checked if the modem support satellite service. Thus, we need to
+         * retry it now.
+         */
+        if (isSatelliteSupported(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, null)
+                == SatelliteManager.SATELLITE_ERROR_NONE) {
+            synchronized (mIsSatelliteSupportedLock) {
+                if (mIsSatelliteSupported != null) {
+                    return mIsSatelliteSupported;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
      * Check whether the caller (or self, if not processing an IPC) can read device identifiers.
      *
      * <p>This method behaves in one of the following ways:
