diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index d54fff0..901c8b2 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -407,7 +407,10 @@
     private static final int EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE = 138;
     private static final int CMD_SEND_SATELLITE_DATAGRAM = 139;
     private static final int EVENT_SEND_SATELLITE_DATAGRAM_DONE = 140;
-
+    private static final int CMD_IS_SATELLITE_COMMUNICATION_ALLOWED = 141;
+    private static final int EVENT_IS_SATELLITE_COMMUNICATION_ALLOWED_DONE = 142;
+    private static final int CMD_GET_TIME_SATELLITE_NEXT_VISIBLE = 143;
+    private static final int EVENT_GET_TIME_SATELLITE_NEXT_VISIBLE_DONE = 144;
     // Parameters of select command.
     private static final int SELECT_COMMAND = 0xA4;
     private static final int SELECT_P1 = 0x04;
@@ -618,7 +621,8 @@
                     AsyncResult ar = (AsyncResult) msg.obj;
                     int state = (int) ar.result;
                     try {
-                        mCallback.onMessageTransferStateUpdate(state);
+                        // TODO: get correct responses back from indication
+                        mCallback.onMessageTransferStateUpdate(state, 0, 0, 0);
                     } catch (RemoteException e) {
                         loge("EVENT_MESSAGE_TRANSFER_STATE_UPDATE RemoteException: " + e);
                     }
@@ -2861,6 +2865,73 @@
                     break;
                 }
 
+                case CMD_IS_SATELLITE_COMMUNICATION_ALLOWED: {
+                    request = (MainThreadRequest) msg.obj;
+                    onCompleted = obtainMessage(EVENT_IS_SATELLITE_COMMUNICATION_ALLOWED_DONE,
+                            request);
+                    Phone phone = getPhoneFromRequest(request);
+                    if (phone != null) {
+                        phone.isSatelliteCommunicationAllowedForCurrentLocation(onCompleted);
+                    } else {
+                        loge("isSatelliteCommunicationAllowedForCurrentLocation: No phone object");
+                        ((ResultReceiver) request.argument).send(
+                                SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE, null);
+                    }
+                    break;
+                }
+
+                case EVENT_IS_SATELLITE_COMMUNICATION_ALLOWED_DONE: {
+                    ar = (AsyncResult) msg.obj;
+                    request = (MainThreadRequest) ar.userObj;
+                    int error = getSatelliteError(
+                            ar, "isSatelliteCommunicationAllowedForCurrentLocation", true);
+                    Bundle bundle = new Bundle();
+                    if (error == SatelliteManager.SATELLITE_ERROR_NONE) {
+                        boolean communicationAllowed = ((int[]) ar.result)[0] == 1;
+                        if (DBG) {
+                            log("isSatelliteCommunicationAllowedForCurrentLocation: "
+                                    + communicationAllowed);
+                        }
+                        bundle.putBoolean(SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED,
+                                communicationAllowed);
+                    }
+                    ((ResultReceiver) request.argument).send(error, bundle);
+                    break;
+                }
+
+                case CMD_GET_TIME_SATELLITE_NEXT_VISIBLE: {
+                    request = (MainThreadRequest) msg.obj;
+                    onCompleted = obtainMessage(EVENT_GET_TIME_SATELLITE_NEXT_VISIBLE_DONE,
+                            request);
+                    Phone phone = getPhoneFromRequest(request);
+                    if (phone != null) {
+                        phone.requestTimeForNextSatelliteVisibility(onCompleted);
+                    } else {
+                        loge("requestTimeForNextSatelliteVisibility: No phone object");
+                        ((ResultReceiver) request.argument).send(
+                                SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE, null);
+                    }
+                    break;
+                }
+
+                case EVENT_GET_TIME_SATELLITE_NEXT_VISIBLE_DONE: {
+                    ar = (AsyncResult) msg.obj;
+                    request = (MainThreadRequest) ar.userObj;
+                    int error =
+                            getSatelliteError(ar, "requestTimeForNextSatelliteVisibility", true);
+                    Bundle bundle = new Bundle();
+                    if (error == SatelliteManager.SATELLITE_ERROR_NONE) {
+                        int nextVisibilityDuration = ((int[]) ar.result)[0];
+                        if (DBG) {
+                            log("requestTimeForNextSatelliteVisibility: " + nextVisibilityDuration);
+                        }
+                        bundle.putInt(SatelliteManager.KEY_SATELLITE_NEXT_VISIBILITY,
+                                nextVisibilityDuration);
+                    }
+                    ((ResultReceiver) request.argument).send(error, bundle);
+                    break;
+                }
+
                 default:
                     Log.w(LOG_TAG, "MainThreadHandler: unexpected message code: " + msg.what);
                     break;
@@ -12694,7 +12765,7 @@
      * disable the cellular modem, and if the satellite modem is disabled, this will also re-enable
      * the cellular modem.
      *
-     * @param subId The subId to set satellite enabled for.
+     * @param subId The subId of the subscription to set satellite enabled for.
      * @param enable {@code true} to enable the satellite modem and {@code false} to disable.
      * @param callback The callback to get the error code of the request.
      *
@@ -12728,7 +12799,7 @@
     /**
      * Request to get whether the satellite modem is enabled.
      *
-     * @param subId The subId to check whether satellite is enabled for.
+     * @param subId The subId of the subscription to check whether satellite is enabled for.
      * @param result The result receiver that returns whether the satellite modem is enabled
      *               if the request is successful or an error code if the request failed.
      *
@@ -12760,7 +12831,7 @@
     /**
      * Request to get whether the satellite service is supported on the device.
      *
-     * @param subId The subId to check satellite service support for.
+     * @param subId The subId of the subscription to check satellite service support for.
      * @param result The result receiver that returns whether the satellite service is supported on
      *               the device if the request is successful or an error code if the request failed.
      */
@@ -12789,7 +12860,7 @@
     /**
      * Request to get the {@link SatelliteCapabilities} of the satellite service.
      *
-     * @param subId The subId to get the satellite capabilities for.
+     * @param subId The subId of the subscription to get the satellite capabilities for.
      * @param result The result receiver that returns the {@link SatelliteCapabilities}
      *               if the request is successful or an error code if the request failed.
      *
@@ -12818,7 +12889,7 @@
      * This can be called by the pointing UI when the user starts pointing to the satellite.
      * Modem should continue to report the pointing input as the device or satellite moves.
      *
-     * @param subId The subId to start satellite position updates for.
+     * @param subId The subId of the subscription to start satellite position updates for.
      * @param errorCallback The callback to get the error code of the request.
      * @param callback The callback to notify of changes in satellite position.
      *
@@ -12870,7 +12941,7 @@
      * Stop receiving satellite position updates.
      * This can be called by the pointing UI when the user stops pointing to the satellite.
      *
-     * @param subId The subId to stop satellite position updates for.
+     * @param subId The subId of the subscription to stop satellite position updates for.
      * @param errorCallback The callback to get the error code of the request.
      * @param callback The callback that was passed to {@link
      * #startSatellitePositionUpdates(int, IIntegerConsumer, ISatelliteStateListener)}
@@ -12902,7 +12973,7 @@
         SatellitePositionUpdateHandler handler =
                 mSatellitePositionUpdateHandlers.remove(callback.asBinder());
         if (handler == null) {
-            loge("stopSatellitePositionUpdates: No SatellitePositionArgument");
+            loge("stopSatellitePositionUpdates: No SatellitePositionUpdateHandler");
             result.accept(SatelliteManager.SATELLITE_INVALID_ARGUMENTS);
             return;
         } else {
@@ -12922,7 +12993,7 @@
     /**
      * Request to get the maximum number of characters per text message on satellite.
      *
-     * @param subId The subId of the subscription.
+     * @param subId The subId of the subscription to get the maximum number of characters for.
      * @param result The result receiver that returns the maximum number of characters per text
      *               message on satellite if the request is successful or an error code
      *               if the request failed.
@@ -12961,6 +13032,7 @@
      * @param token The token to be used as a unique identifier for provisioning with satellite
      *              gateway.
      * @param callback The callback to get the error code of the request.
+     *
      * @return The signal transport used by the caller to cancel the provision request,
      *         or {@code null} if the request failed.
      *
@@ -13046,37 +13118,38 @@
     /**
      * Register for the satellite provision state change.
      *
-     * @param subId The subId of the subscription associated with the satellite service.
-     * @param errorCallback The callback to get the error code of the request.
+     * @param subId The subId of the subscription to register for provision state changes.
      * @param callback The callback to handle the satellite provision state changed event.
      *
+     * @return The {@link SatelliteManager.SatelliteError} result of the operation.
+     *
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    public void registerForSatelliteProvisionStateChanged(int subId,
-            @NonNull IIntegerConsumer errorCallback, @NonNull ISatelliteStateListener callback) {
+    @SatelliteManager.SatelliteError public int registerForSatelliteProvisionStateChanged(int subId,
+            @NonNull ISatelliteStateListener callback) {
         enforceSatelliteCommunicationPermission("registerForSatelliteProvisionStateChanged");
-        registerForSatelliteProvisionStateChangedInternal(subId, errorCallback, callback);
+        return registerForSatelliteProvisionStateChangedInternal(subId, callback);
     }
 
     /**
      * Unregister for the satellite provision state change.
      *
-     * @param subId The subId of the subscription associated with the satellite service.
+     * @param subId The subId of the subscription to unregister for provision state changes.
      * @param errorCallback The callback to get the error code of the request.
      * @param callback The callback that was passed to {@link
-     * #registerForSatelliteProvisionStateChanged(int, IIntegerConsumer, ISatelliteStateListener)}.
+     *                 #registerForSatelliteProvisionStateChanged(int, ISatelliteStateListener)}.
+     *
+     * @return The {@link SatelliteManager.SatelliteError} result of the operation.
      *
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    public void unregisterForSatelliteProvisionStateChanged(int subId,
-            @NonNull IIntegerConsumer errorCallback, @NonNull ISatelliteStateListener callback) {
+    @SatelliteManager.SatelliteError public int unregisterForSatelliteProvisionStateChanged(
+            int subId, @NonNull ISatelliteStateListener callback) {
         enforceSatelliteCommunicationPermission("unregisterForSatelliteProvisionStateChanged");
-        Consumer<Integer> result = FunctionalUtils.ignoreRemoteException(errorCallback::accept);
         if (!isSatelliteSupported()) {
-            result.accept(SatelliteManager.SATELLITE_NOT_SUPPORTED);
-            return;
+            return SatelliteManager.SATELLITE_NOT_SUPPORTED;
         }
 
         final int validSubId = getValidSatelliteSubId(subId);
@@ -13084,17 +13157,16 @@
                 mSatelliteProvisionStateChangedHandlers.get(validSubId);
         if (satelliteProvisionStateChangedHandler != null) {
             if (satelliteProvisionStateChangedHandler.removeListener(callback)) {
-                result.accept(SatelliteManager.SATELLITE_ERROR_NONE);
-                return;
+                return SatelliteManager.SATELLITE_ERROR_NONE;
             }
         }
-        result.accept(SatelliteManager.SATELLITE_INVALID_ARGUMENTS);
+        return SatelliteManager.SATELLITE_INVALID_ARGUMENTS;
     }
 
     /**
      * Request to get whether the device is provisioned with a satellite provider.
      *
-     * @param subId The subId of the subscription associated with the satellite service.
+     * @param subId The subId of the subscription to get whether the device is provisioned for.
      * @param result The result receiver that returns whether the device is provisioned with a
      *               satellite provider if the request is successful or an error code if the
      *               request failed.
@@ -13119,14 +13191,15 @@
     /**
      * Register for listening to satellite state changes.
      *
-     * @param subId - The subId to start listening to satellite state changes for.
-     * @param callback - The callback to handle the satellite state change event.
-     * @return The result of the operation.
+     * @param subId The subId of the subscription to register for satellite modem state changes.
+     * @param callback The callback to handle the satellite state change event.
+     *
+     * @return The {@link SatelliteManager.SatelliteError} result of the operation.
+     *
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteError
-    public int registerForSatelliteModemStateChange(int subId,
+    @SatelliteManager.SatelliteError public int registerForSatelliteModemStateChange(int subId,
             @NonNull ISatelliteStateListener callback) {
         enforceSatelliteCommunicationPermission("registerForSatelliteModemStateChange");
 
@@ -13156,16 +13229,16 @@
     /**
      * Unregister from listening to satellite state changes.
      *
-     * @param subId -  The subId to stop listening to satellite state changes for.
-     * @param callback - The callback that was passed to
-     * {@link #registerForSatelliteModemStateChange(int, ISatelliteStateListener)}
-     * @return The result of the operation.
+     * @param subId The subId of the subscription to unregister for satellite modem state changes.
+     * @param callback The callback that was passed to
+     *                 {@link #registerForSatelliteModemStateChange(int, ISatelliteStateListener)}.
+     *
+     * @return The {@link SatelliteManager.SatelliteError} result of the operation.
      *
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteError
-    public int unregisterForSatelliteModemStateChange(int subId,
+    @SatelliteManager.SatelliteError public int unregisterForSatelliteModemStateChange(int subId,
             @NonNull ISatelliteStateListener callback) {
         enforceSatelliteCommunicationPermission("unregisterForSatelliteModemStateChange");
 
@@ -13183,22 +13256,22 @@
     /**
      * Register to receive incoming datagrams over satellite.
      *
-     * @param subId - The subId to start receiving datagrams over satellite.
-     * @param datagramType - type of datagram
-     * @param callback - The callback to handle incoming datagrams over satellite.
-     * @return The result of the operation.
+     * @param subId The subId of the subscription to register for incoming satellite datagrams.
+     * @param datagramType Type of datagram.
+     * @param callback The callback to handle incoming datagrams over satellite.
+     *
+     * @return The {@link SatelliteManager.SatelliteError} result of the operation.
+     *
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteError
-    public int registerForSatelliteDatagram(int subId,
+    @SatelliteManager.SatelliteError public int registerForSatelliteDatagram(int subId,
             @SatelliteManager.DatagramType int datagramType,
             @NonNull ISatelliteStateListener callback) {
         enforceSatelliteCommunicationPermission("registerForSatelliteDatagram");
 
         final int validSubId = getValidSatelliteSubId(subId);
-        Phone phone = getPhoneOrDefault(
-                validSubId, "registerForSatelliteDatagram");
+        Phone phone = getPhoneOrDefault(validSubId, "registerForSatelliteDatagram");
         if (phone == null) {
             return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
         }
@@ -13220,16 +13293,16 @@
     /**
      * Unregister to stop receiving incoming datagrams over satellite.
      *
-     * @param subId -  The subId to stop listening incoming datagrams over satellite.
-     * @param callback - The callback that was passed to
-     * {@link #registerForSatelliteDatagram(int, int, ISatelliteStateListener)}
-     * @return The result of the operation.
+     * @param subId The subId of the subscription to unregister for incoming satellite datagrams.
+     * @param callback The callback that was passed to
+     *                 {@link #registerForSatelliteDatagram(int, int, ISatelliteStateListener)}.
+     *
+     * @return The {@link SatelliteManager.SatelliteError} result of the operation.
      *
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    @SatelliteManager.SatelliteError
-    public int unregisterForSatelliteDatagram(int subId,
+    @SatelliteManager.SatelliteError public int unregisterForSatelliteDatagram(int subId,
             @NonNull ISatelliteStateListener callback) {
         enforceSatelliteCommunicationPermission("unregisterForSatelliteDatagram");
 
@@ -13244,16 +13317,16 @@
         return SatelliteManager.SATELLITE_INVALID_ARGUMENTS;
     }
 
-
     /**
      * Poll pending satellite datagrams over satellite.
-     * @param subId - The subId of the subscription used for receiving datagrams.
-     * @return The result of the operation.
+     *
+     * @param subId The subId of the subscription to poll pending satellite datagrams for.
+     *
+     * @return The {@link SatelliteManager.SatelliteError} result of the operation.
+     *
      * @throws SecurityException if the caller doesn't have the required permission.
      */
-    @Override
-    @SatelliteManager.SatelliteError
-    public int pollPendingSatelliteDatagrams(int subId) {
+    @Override @SatelliteManager.SatelliteError public int pollPendingSatelliteDatagrams(int subId) {
         enforceSatelliteCommunicationPermission("pollPendingSatelliteDatagrams");
 
         final int validSubId = getValidSatelliteSubId(subId);
@@ -13273,10 +13346,12 @@
 
     /**
      * Send datagram over satellite.
-     * @param subId - The subId of the subscription used to send datagram
-     * @param datagramType - type of datagram
-     * @param datagram - datagram to send over satellite
-     * @param callback - The callback that will be used to send result of the operation.
+     *
+     * @param subId The subId of the subscription to send satellite datagrams for.
+     * @param datagramType Type of datagram.
+     * @param datagram Datagram to send over satellite.
+     * @param callback The callback to get the error code of the request.
+     *
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
@@ -13304,6 +13379,75 @@
                 phone, null);
     }
 
+    /**
+     * Request to get whether satellite communication is allowed for the current location.
+     *
+     * @param subId The subId of the subscription to check whether satellite communication is
+     *              allowed for the current location for.
+     * @param result The result receiver that returns whether satellite communication is allowed
+     *               for the current location if the request is successful or an error code
+     *               if the request failed.
+     *
+     * @throws SecurityException if the caller doesn't have the required permission.
+     */
+    @Override
+    public void requestIsSatelliteCommunicationAllowedForCurrentLocation(int subId,
+            @NonNull ResultReceiver result) {
+        enforceSatelliteCommunicationPermission(
+                "requestIsSatelliteCommunicationAllowedForCurrentLocation");
+        if (!isSatelliteSupported()) {
+            result.send(SatelliteManager.SATELLITE_NOT_SUPPORTED, null);
+            return;
+        }
+
+        final int validSubId = getValidSatelliteSubId(subId);
+        if (!isSatelliteProvisioned(validSubId)) {
+            result.send(SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED, null);
+            return;
+        }
+
+        Phone phone = getPhoneOrDefault(validSubId,
+                "requestIsSatelliteCommunicationAllowedForCurrentLocation");
+        if (phone == null) {
+            result.send(SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE, null);
+            return;
+        }
+
+        sendRequest(CMD_IS_SATELLITE_COMMUNICATION_ALLOWED, result, subId);
+    }
+
+    /**
+     * Request to get the time after which the satellite will next be visible
+     *
+     * @param subId The subId to get the time after which the satellite will next be visible for.
+     * @param result The result receiver that returns the time after which the satellite will next
+     *               be visible if the request is successful or an error code if the request failed.
+     *
+     * @throws SecurityException if the caller doesn't have the required permission.
+     */
+    @Override
+    public void requestTimeForNextSatelliteVisibility(int subId, @NonNull ResultReceiver result) {
+        enforceSatelliteCommunicationPermission("requestTimeForNextSatelliteVisibility");
+        if (!isSatelliteSupported()) {
+            result.send(SatelliteManager.SATELLITE_NOT_SUPPORTED, null);
+            return;
+        }
+
+        final int validSubId = getValidSatelliteSubId(subId);
+        if (!isSatelliteProvisioned(validSubId)) {
+            result.send(SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED, null);
+            return;
+        }
+
+        Phone phone = getPhoneOrDefault(validSubId, "requestTimeForNextSatelliteVisibility");
+        if (phone == null) {
+            result.send(SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE, null);
+            return;
+        }
+
+        sendRequestAsync(CMD_GET_TIME_SATELLITE_NEXT_VISIBLE, result, phone, null);
+    }
+
     private void handleCmdProvisionSatelliteService(@NonNull ProvisionSatelliteServiceArgument arg,
             @NonNull Phone phone, Message onCompleted) {
         if (!mSatelliteProvisionCallbacks.containsKey(arg.subId)) {
@@ -13337,12 +13481,12 @@
          * or SatelliteController.
          * TODO (b/267826133) we need to do this for all subscriptions on the device.
          */
-        registerForSatelliteProvisionStateChangedInternal(arg.subId, null, null);
+        registerForSatelliteProvisionStateChangedInternal(arg.subId, null);
     }
 
     private void handleCmdDeprovisionSatelliteService(
-            @NonNull ProvisionSatelliteServiceArgument arg,
-            @NonNull Phone phone, Message onCompleted) {
+            @NonNull ProvisionSatelliteServiceArgument arg, @NonNull Phone phone,
+            @NonNull Message onCompleted) {
         if (arg == null) {
             loge("handleCmdDeprovisionSatelliteService: arg is null");
             return;
@@ -13476,9 +13620,11 @@
 
     /**
      * Get the {@link SatelliteManager.SatelliteError} from the provided result.
+     *
      * @param ar AsyncResult used to determine the error code.
      * @param caller The satellite request.
      * @param checkResult Whether to check if the result exists.
+     *
      * @return The {@link SatelliteManager.SatelliteError} error code from the request.
      */
     @SatelliteManager.SatelliteError private int getSatelliteError(@NonNull AsyncResult ar,
@@ -13509,29 +13655,20 @@
      * Register for the satellite provision state change.
      *
      * @param subId The subId of the subscription associated with the satellite service.
-     * @param errorCallback The callback to get the error code of the request.
      * @param callback The callback to handle the satellite provision state changed event.
+     *
+     * @return The {@link SatelliteManager.SatelliteError} result of the operation.
      */
-    private void registerForSatelliteProvisionStateChangedInternal(int subId,
-            @Nullable IIntegerConsumer errorCallback, @Nullable ISatelliteStateListener callback) {
-        Consumer<Integer> result = null;
-        if (errorCallback != null) {
-            result = FunctionalUtils.ignoreRemoteException(errorCallback::accept);
-        }
+    @SatelliteManager.SatelliteError private int registerForSatelliteProvisionStateChangedInternal(
+            int subId, @Nullable ISatelliteStateListener callback) {
         if (!isSatelliteSupported()) {
-            if (result != null) {
-                result.accept(SatelliteManager.SATELLITE_NOT_SUPPORTED);
-            }
-            return;
+            return SatelliteManager.SATELLITE_NOT_SUPPORTED;
         }
 
         final int validSubId = getValidSatelliteSubId(subId);
         Phone phone = getPhoneOrDefault(validSubId, "registerForSatelliteProvisionStateChanged");
         if (phone == null) {
-            if (result != null) {
-                result.accept(SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE);
-            }
-            return;
+            return SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
         }
 
         SatelliteProvisionStateChangedHandler satelliteProvisionStateChangedHandler =
@@ -13548,9 +13685,7 @@
         }
         mSatelliteProvisionStateChangedHandlers.put(
                 validSubId, satelliteProvisionStateChangedHandler);
-        if (result != null) {
-            result.accept(SatelliteManager.SATELLITE_ERROR_NONE);
-        }
+        return SatelliteManager.SATELLITE_ERROR_NONE;
     }
 
     /**
