Snap for 8730993 from cbaaf03b8515fb290528f5892a78f8a8c309f34e to mainline-tzdata3-release

Change-Id: Ia81c29c3b9640be99ede4b32d385d8c7fc6a7e7f
diff --git a/Android.bp b/Android.bp
index dea49d7..6b78ebb 100644
--- a/Android.bp
+++ b/Android.bp
@@ -13,18 +13,31 @@
 // limitations under the License.
 
 package {
-    // See: http://go/android-license-faq
-    default_applicable_licenses: [
-        "frameworks_opt_net_ims_license",
-        "Android-Apache-2.0",
-    ],
+    default_applicable_licenses: ["frameworks_opt_net_ims_license"],
 }
 
+// Added automatically by a large-scale-change that took the approach of
+// 'apply every license found to every target'. While this makes sure we respect
+// every license restriction, it may not be entirely correct.
+//
+// e.g. GPL in an MIT project might only apply to the contrib/ directory.
+//
+// Please consider splitting the single license below into multiple licenses,
+// taking care not to lose any license_kind information, and overriding the
+// default license using the 'licenses: [...]' property on targets as needed.
+//
+// For unused files, consider creating a 'fileGroup' with "//visibility:private"
+// to attach the license to, and including a comment whether the files may be
+// used in the current project.
+// See: http://go/android-license-faq
 license {
     name: "frameworks_opt_net_ims_license",
-    package_name: "Android IMS",
-    license_kinds: ["SPDX-license-identifier-BSD"],
-    license_text: ["LICENSE_BSD"],
+    visibility: [":__subpackages__"],
+    license_kinds: [
+        "SPDX-license-identifier-Apache-2.0",
+        "SPDX-license-identifier-BSD",
+    ],
+    // large-scale-change unable to identify any license_text files
 }
 
 java_library {
diff --git a/LICENSE_BSD b/LICENSE_BSD
deleted file mode 100644
index 47664b8..0000000
--- a/LICENSE_BSD
+++ /dev/null
@@ -1,26 +0,0 @@
- Copyright (c) 2014, The Linux Foundation. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of The Linux Foundation nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/TEST_MAPPING b/TEST_MAPPING
index edb25a6..4b2fe34 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -7,14 +7,6 @@
           "exclude-annotation": "androidx.test.filters.FlakyTest"
         }
       ]
-    },
-    {
-      "name": "TeleServiceTests",
-      "options": [
-        {
-          "exclude-annotation": "androidx.test.filters.FlakyTest"
-        }
-      ]
     }
   ]
 }
diff --git a/src/java/com/android/ims/FeatureConnection.java b/src/java/com/android/ims/FeatureConnection.java
index 6fee444..748ae57 100644
--- a/src/java/com/android/ims/FeatureConnection.java
+++ b/src/java/com/android/ims/FeatureConnection.java
@@ -43,7 +43,6 @@
     protected static boolean sImsSupportedOnDevice = true;
 
     protected final int mSlotId;
-    protected final int mSubId;
     protected Context mContext;
     protected IBinder mBinder;
 
@@ -57,10 +56,9 @@
     private final ISipTransport mSipTransportBinder;
     protected final Object mLock = new Object();
 
-    public FeatureConnection(Context context, int slotId, int subId, IImsConfig c,
-            IImsRegistration r, ISipTransport s) {
+    public FeatureConnection(Context context, int slotId, IImsConfig c, IImsRegistration r,
+            ISipTransport s) {
         mSlotId = slotId;
-        mSubId = subId;
         mContext = context;
         mRegistrationBinder = r;
         mConfigBinder = c;
@@ -225,10 +223,6 @@
         return state;
     }
 
-    public int getSubId() {
-        return mSubId;
-    }
-
     /**
      * Internal method used to retrieve the feature status from the corresponding ImsService.
      */
diff --git a/src/java/com/android/ims/FeatureConnector.java b/src/java/com/android/ims/FeatureConnector.java
index 32674d9..19e2151 100644
--- a/src/java/com/android/ims/FeatureConnector.java
+++ b/src/java/com/android/ims/FeatureConnector.java
@@ -104,7 +104,7 @@
         /**
          * ImsFeature manager is connected to the underlying IMS implementation.
          */
-        void connectionReady(U manager, int subId) throws ImsException;
+        void connectionReady(U manager) throws ImsException;
 
         /**
          * The underlying IMS implementation is unavailable and can not be used to communicate.
@@ -115,15 +115,15 @@
     private final IImsServiceFeatureCallback mCallback = new IImsServiceFeatureCallback.Stub() {
 
         @Override
-        public void imsFeatureCreated(ImsFeatureContainer c, int subId) {
-            log("imsFeatureCreated: " + c + ", subId: " + subId);
+        public void imsFeatureCreated(ImsFeatureContainer c) {
+            log("imsFeatureCreated: " + c);
             synchronized (mLock) {
-                mManager.associate(c, subId);
+                mManager.associate(c);
                 mManager.updateFeatureCapabilities(c.getCapabilities());
                 mDisconnectedReason = null;
             }
             // Notifies executor, so notify outside of lock
-            imsStatusChanged(c.getState(), subId);
+            imsStatusChanged(c.getState());
         }
 
         @Override
@@ -151,7 +151,7 @@
         }
 
         @Override
-        public void imsStatusChanged(int status, int subId) {
+        public void imsStatusChanged(int status) {
             log("imsStatusChanged: status=" + ImsFeature.STATE_LOG_MAP.get(status));
             final U manager;
             final boolean isReady;
@@ -173,7 +173,7 @@
             mExecutor.execute(() -> {
                 try {
                     if (isReady) {
-                        notifyReady(manager, subId);
+                        notifyReady(manager);
                     } else {
                         notifyNotReady();
                     }
@@ -282,10 +282,10 @@
     }
 
     // Should be called on executor
-    private void notifyReady(U manager, int subId) throws ImsException {
+    private void notifyReady(U manager) throws ImsException {
         try {
             if (DBG) log("notifyReady");
-            mListener.connectionReady(manager, subId);
+            mListener.connectionReady(manager);
         }
         catch (ImsException e) {
             if(DBG) log("notifyReady exception: " + e.getMessage());
diff --git a/src/java/com/android/ims/FeatureUpdates.java b/src/java/com/android/ims/FeatureUpdates.java
index 550b604..446a78b 100644
--- a/src/java/com/android/ims/FeatureUpdates.java
+++ b/src/java/com/android/ims/FeatureUpdates.java
@@ -48,9 +48,8 @@
      * Associate this Manager instance with the IMS Binder interfaces specified. This is usually
      * done by creating a FeatureConnection instance with these interfaces.
      * @param container Contains all of the related interfaces attached to a specific ImsFeature.
-     * @param subId The subscription ID that the IMS Feature is being created for.
      */
-    void associate(ImsFeatureContainer container, int subId);
+    void associate(ImsFeatureContainer container);
 
     /**
      * Invalidate the previously associated Binder interfaces set in {@link #associate}.
diff --git a/src/java/com/android/ims/ImsCall.java b/src/java/com/android/ims/ImsCall.java
index a5813d8..7af0b71 100755
--- a/src/java/com/android/ims/ImsCall.java
+++ b/src/java/com/android/ims/ImsCall.java
@@ -1123,7 +1123,7 @@
              mSession = session;
 
              try {
-                 mSession.setListener(createCallSessionListener(), mContext.getMainExecutor());
+                 mSession.setListener(createCallSessionListener());
              } catch (Throwable t) {
                  loge("attachSession :: ", t);
                  throwImsException(t, 0);
@@ -1147,7 +1147,7 @@
             mSession = session;
 
             try {
-                session.setListener(createCallSessionListener(), mContext.getMainExecutor());
+                session.setListener(createCallSessionListener());
                 session.start(callee, mCallProfile);
             } catch (Throwable t) {
                 loge("start(1) :: ", t);
@@ -1173,7 +1173,7 @@
             mIsConferenceHost = true;
 
             try {
-                session.setListener(createCallSessionListener(), mContext.getMainExecutor());
+                session.setListener(createCallSessionListener());
                 session.start(participants, mCallProfile);
             } catch (Throwable t) {
                 loge("start(n) :: ", t);
@@ -2097,9 +2097,9 @@
 
     private void setTransientSessionAsPrimary(ImsCallSession transientSession) {
         synchronized (ImsCall.this) {
-            mSession.setListener(null, null);
+            mSession.setListener(null);
             mSession = transientSession;
-            mSession.setListener(createCallSessionListener(), mContext.getMainExecutor());
+            mSession.setListener(createCallSessionListener());
         }
     }
 
@@ -2214,7 +2214,7 @@
 
                 // Clear the listener for this transient session, we'll create a new listener
                 // when it is attached to the final ImsCall that it should live on.
-                transientConferenceSession.setListener(null, null);
+                transientConferenceSession.setListener(null);
 
                 // Determine which call the transient session should be moved to.  If the current
                 // call session is still alive and the merge peer's session is not, we have a
@@ -2409,7 +2409,7 @@
 
             // Try to clean up the transient session if it exists.
             if (mTransientConferenceSession != null) {
-                mTransientConferenceSession.setListener(null, null);
+                mTransientConferenceSession.setListener(null);
                 mTransientConferenceSession = null;
             }
 
diff --git a/src/java/com/android/ims/ImsCallbackAdapterManager.java b/src/java/com/android/ims/ImsCallbackAdapterManager.java
index 931ce57..d4926b2 100644
--- a/src/java/com/android/ims/ImsCallbackAdapterManager.java
+++ b/src/java/com/android/ims/ImsCallbackAdapterManager.java
@@ -18,10 +18,21 @@
 
 import android.content.Context;
 import android.os.IInterface;
+import android.os.Looper;
 import android.os.RemoteCallbackList;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.util.ArraySet;
 import android.util.Log;
+import android.util.SparseArray;
 
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 public abstract class ImsCallbackAdapterManager<T extends IInterface> {
     private static final String TAG = "ImsCallbackAM";
@@ -29,16 +40,62 @@
     private final Context mContext;
     private final Object mLock;
     private final int mSlotId;
-    private final int mSubId;
+
+    // Map of sub id -> List<callbacks> for sub id linked callbacks.
+    private final SparseArray<Set<T>> mCallbackSubscriptionMap = new SparseArray<>();
 
     // List of all active callbacks to ImsService
     private final RemoteCallbackList<T> mRemoteCallbacks = new RemoteCallbackList<>();
 
-    public ImsCallbackAdapterManager(Context context, Object lock, int slotId, int subId) {
+    @VisibleForTesting
+    public SubscriptionManager.OnSubscriptionsChangedListener mSubChangedListener;
+
+    public ImsCallbackAdapterManager(Context context, Object lock, int slotId) {
         mContext = context;
         mLock = lock;
         mSlotId = slotId;
-        mSubId = subId;
+
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+        }
+
+        // Must be created after Looper.prepare() is called, or else we will get an exception.
+        mSubChangedListener = new SubscriptionManager.OnSubscriptionsChangedListener() {
+            @Override
+            public void onSubscriptionsChanged() {
+                SubscriptionManager manager = mContext.getSystemService(SubscriptionManager.class);
+                if (manager == null) {
+                    Log.w(TAG + " [" + mSlotId + "]", "onSubscriptionsChanged: could not find "
+                            + "SubscriptionManager.");
+                    return;
+                }
+
+                List<SubscriptionInfo> subInfos = manager.getActiveSubscriptionInfoList(false);
+                if (subInfos == null) {
+                    subInfos = Collections.emptyList();
+                }
+
+                Set<Integer> newSubIds = subInfos.stream()
+                        .map(SubscriptionInfo::getSubscriptionId)
+                        .collect(Collectors.toSet());
+
+                synchronized (mLock) {
+                    Set<Integer> storedSubIds = new ArraySet<>(mCallbackSubscriptionMap.size());
+                    for (int keyIndex = 0; keyIndex < mCallbackSubscriptionMap.size();
+                            keyIndex++) {
+                        storedSubIds.add(mCallbackSubscriptionMap.keyAt(keyIndex));
+                    }
+
+                    // Get the set of sub ids that are in storedSubIds that are not in newSubIds.
+                    // This is the set of sub ids that need to be removed.
+                    storedSubIds.removeAll(newSubIds);
+
+                    for (Integer subId : storedSubIds) {
+                        removeCallbacksForSubscription(subId);
+                    }
+                }
+            }
+        };
     }
 
     // Add a callback to the ImsFeature associated with this manager (independent of the
@@ -50,31 +107,20 @@
             // Throws a IllegalStateException if this registration fails.
             registerCallback(localCallback);
             Log.i(TAG + " [" + mSlotId + "]", "Local callback added: " + localCallback);
-
             mRemoteCallbacks.register(localCallback);
         }
     }
 
-    // Add a callback to be associated with a subscription.
+    // Add a callback to be associated with a subscription. If that subscription is removed,
+    // remove the callback and notify the callback that the subscription has been removed.
     public void addCallbackForSubscription(T localCallback, int subId) {
         if (!SubscriptionManager.isValidSubscriptionId(subId)) {
-            Log.w(TAG + " [" + mSlotId + ", " + mSubId + "]", "add callback: invalid subId.");
+            Log.w(TAG + " [" + mSlotId + "]", "add callback: invalid subId " + subId);
             return;
         }
-        if (mSubId != subId) {
-            // In some cases, telephony has changed sub id and IMS is still catching up to the
-            // state change. Ensure that the device does not try to register a callback on an
-            // inactive subscription, because this can cause a condition where we remove the
-            // callback invisibly when the new subscription loads. Instead, simulate the existing
-            // IllegalStateException that happens when the ImsService is not ready/active for
-            // backwards compatibility.
-            Log.w(TAG + " [" + mSlotId + ", " + mSubId + "]", "add callback: inactive"
-                    + " subID detected: " + subId);
-            throw new IllegalStateException("ImsService is not available for the subscription "
-                    + "specified.");
-        }
         synchronized (mLock) {
             addCallback(localCallback);
+            linkCallbackToSubscription(localCallback, subId);
         }
     }
 
@@ -89,6 +135,110 @@
         }
     }
 
+    // Remove an existing callback that has been linked to a subscription.
+    public void removeCallbackForSubscription(T localCallback, int subId) {
+        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+            Log.w(TAG + " [" + mSlotId + "]", "remove callback: invalid subId " + subId);
+            return;
+        }
+        synchronized (mLock) {
+            removeCallback(localCallback);
+            unlinkCallbackFromSubscription(localCallback, subId);
+        }
+    }
+
+    // Links a callback to be tracked by a subscription. If it goes away, emove.
+    private void linkCallbackToSubscription(T callback, int subId) {
+        synchronized (mLock) {
+            if (mCallbackSubscriptionMap.size() == 0) {
+                // we are about to add the first entry to the map, register for subscriptions
+                //changed listener.
+                registerForSubscriptionsChanged();
+            }
+            Set<T> callbacksPerSub = mCallbackSubscriptionMap.get(subId);
+            if (callbacksPerSub == null) {
+                // the callback list has not been created yet for this subscription.
+                callbacksPerSub = new ArraySet<>();
+                mCallbackSubscriptionMap.put(subId, callbacksPerSub);
+            }
+            callbacksPerSub.add(callback);
+        }
+    }
+
+    // Unlink the callback from the associated subscription.
+    private void unlinkCallbackFromSubscription(T callback, int subId) {
+        synchronized (mLock) {
+            Set<T> callbacksPerSub = mCallbackSubscriptionMap.get(subId);
+            if (callbacksPerSub != null) {
+                callbacksPerSub.remove(callback);
+                if (callbacksPerSub.isEmpty()) {
+                    mCallbackSubscriptionMap.remove(subId);
+                }
+            }
+            if (mCallbackSubscriptionMap.size() == 0) {
+                unregisterForSubscriptionsChanged();
+            }
+        }
+    }
+
+    // Removes all of the callbacks that have been registered to the subscription specified.
+    // This happens when Telephony sends an indication that the subscriptions have changed.
+    private void removeCallbacksForSubscription(int subId) {
+        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+            Log.w(TAG + " [" + mSlotId + "]", "remove all callbacks: invalid subId " + subId);
+            return;
+        }
+        synchronized (mLock) {
+            Set<T> callbacksPerSub = mCallbackSubscriptionMap.get(subId);
+            if (callbacksPerSub == null) {
+                // no callbacks registered for this subscription.
+                return;
+            }
+            // clear all registered callbacks in the subscription map for this subscription.
+            mCallbackSubscriptionMap.remove(subId);
+            for (T callback : callbacksPerSub) {
+                removeCallback(callback);
+            }
+            // If there are no more callbacks being tracked, remove subscriptions changed
+            // listener.
+            if (mCallbackSubscriptionMap.size() == 0) {
+                unregisterForSubscriptionsChanged();
+            }
+        }
+    }
+
+    // Clear the Subscription -> Callback map because the ImsService connection is no longer
+    // current.
+    private void clearCallbacksForAllSubscriptions() {
+        synchronized (mLock) {
+            List<Integer> keys = new ArrayList<>();
+            for (int keyIndex = 0; keyIndex < mCallbackSubscriptionMap.size(); keyIndex++) {
+                keys.add(mCallbackSubscriptionMap.keyAt(keyIndex));
+            }
+            keys.forEach(this::removeCallbacksForSubscription);
+        }
+    }
+
+    private void registerForSubscriptionsChanged() {
+        SubscriptionManager manager = mContext.getSystemService(SubscriptionManager.class);
+        if (manager != null) {
+            manager.addOnSubscriptionsChangedListener(mSubChangedListener);
+        } else {
+            Log.w(TAG + " [" + mSlotId + "]", "registerForSubscriptionsChanged: could not find"
+                    + " SubscriptionManager.");
+        }
+    }
+
+    private void unregisterForSubscriptionsChanged() {
+        SubscriptionManager manager = mContext.getSystemService(SubscriptionManager.class);
+        if (manager != null) {
+        manager.removeOnSubscriptionsChangedListener(mSubChangedListener);
+        } else {
+            Log.w(TAG + " [" + mSlotId + "]", "unregisterForSubscriptionsChanged: could not"
+                    + " find SubscriptionManager.");
+        }
+    }
+
     // The ImsService these callbacks are registered to has become unavailable or crashed, or
     // the ImsResolver has switched to a new ImsService. In these cases, clean up all existing
     // callbacks.
@@ -100,6 +250,7 @@
                 unregisterCallback(callbackItem);
                 mRemoteCallbacks.unregister(callbackItem);
             }
+            clearCallbacksForAllSubscriptions();
             Log.i(TAG + " [" + mSlotId + "]", "Closing connection and clearing callbacks");
         }
     }
diff --git a/src/java/com/android/ims/ImsEcbmStateListener.java b/src/java/com/android/ims/ImsEcbmStateListener.java
index 814ba5f..ea662ee 100644
--- a/src/java/com/android/ims/ImsEcbmStateListener.java
+++ b/src/java/com/android/ims/ImsEcbmStateListener.java
@@ -29,8 +29,6 @@
 
 package com.android.ims;
 
-import java.util.concurrent.Executor;
-
 /**
  * Listener for receiving notifications about changes to the IMS connection.
  * It provides a state of IMS registration between UE and IMS network, the service
@@ -38,42 +36,18 @@
  *
  * @hide
  */
-public abstract class ImsEcbmStateListener {
-    protected Executor mListenerExecutor = Runnable::run;
-    /**
-     * constructor.
-     *
-     * @param executor the executor that will execute callbacks.
-     */
-    public ImsEcbmStateListener(Executor executor) {
-        if (executor != null)
-            mListenerExecutor = executor;
-    }
+public class ImsEcbmStateListener {
     /**
      * Called when the device enters Emergency Callback Mode
      */
-    public final void onECBMEntered() {
-        onECBMEntered(mListenerExecutor);
+    public void onECBMEntered() {
+        // no-op
     }
 
     /**
-     * Called when the device enters Emergency Callback Mode
-     *
-     * @param executor the executor that will execute callbacks.
-     */
-    public abstract void onECBMEntered(Executor executor);
-
-    /**
      * Called when the device exits Emergency Callback Mode
      */
-    public final void onECBMExited() {
-        onECBMExited(mListenerExecutor);
+    public void onECBMExited() {
+        // no-op
     }
-
-    /**
-     * Called when the device exits Emergency Callback Mode
-     *
-     * @param executor the executor that will execute callbacks.
-     */
-    public abstract void onECBMExited(Executor executor);
 }
diff --git a/src/java/com/android/ims/ImsExternalCallStateListener.java b/src/java/com/android/ims/ImsExternalCallStateListener.java
index 880710a..aae4c9b 100644
--- a/src/java/com/android/ims/ImsExternalCallStateListener.java
+++ b/src/java/com/android/ims/ImsExternalCallStateListener.java
@@ -19,7 +19,6 @@
 import android.telephony.ims.ImsExternalCallState;
 
 import java.util.List;
-import java.util.concurrent.Executor;
 
 /**
  * Listener for receiving notifications about {@link ImsExternalCallState} information received
@@ -27,32 +26,13 @@
  *
  * @hide
  */
-public abstract class ImsExternalCallStateListener {
-    protected Executor mListenerExecutor = Runnable::run;
-    /**
-     * constructor.
-     *
-     * @param executor the executor that will execute callbacks.
-     */
-    public ImsExternalCallStateListener(Executor executor) {
-        if (executor != null)
-            mListenerExecutor = executor;
-    }
+public class ImsExternalCallStateListener {
     /**
      * Notifies client when Dialog Event Package update is received
      *
      * @param externalCallState the external call state.
      */
-    public final void onImsExternalCallStateUpdate(List<ImsExternalCallState> externalCallState) {
-        onImsExternalCallStateUpdate(externalCallState, mListenerExecutor);
+    public void onImsExternalCallStateUpdate(List<ImsExternalCallState> externalCallState) {
+        // no-op
     }
-    /**
-     * Notifies client when Dialog Event Package update is received
-     *
-     * @param externalCallState the external call state.
-     *
-     * @param executor the executor that will execute callbacks.
-     */
-    public abstract void onImsExternalCallStateUpdate(
-        List<ImsExternalCallState> externalCallState, Executor executor);
 }
diff --git a/src/java/com/android/ims/ImsFeatureBinderRepository.java b/src/java/com/android/ims/ImsFeatureBinderRepository.java
index 5c352b1..538e5cf 100644
--- a/src/java/com/android/ims/ImsFeatureBinderRepository.java
+++ b/src/java/com/android/ims/ImsFeatureBinderRepository.java
@@ -59,7 +59,7 @@
             mExecutor = e;
         }
 
-        public void notifyFeatureCreatedOrRemoved(ImsFeatureContainer connector, int subId) {
+        public void notifyFeatureCreatedOrRemoved(ImsFeatureContainer connector) {
             if (connector == null) {
                 mExecutor.execute(() -> {
                     try {
@@ -73,7 +73,7 @@
             else {
                 mExecutor.execute(() -> {
                     try {
-                        mCallback.imsFeatureCreated(connector, subId);
+                        mCallback.imsFeatureCreated(connector);
                     } catch (RemoteException e) {
                         // This listener will eventually be caught and removed during stale checks.
                     }
@@ -81,10 +81,10 @@
             }
         }
 
-        public void notifyStateChanged(int state, int subId) {
+        public void notifyStateChanged(int state) {
             mExecutor.execute(() -> {
                 try {
-                    mCallback.imsStatusChanged(state, subId);
+                    mCallback.imsStatusChanged(state);
                 } catch (RemoteException e) {
                     // This listener will eventually be caught and removed during stale checks.
                 }
@@ -132,7 +132,6 @@
      */
     private static final class UpdateMapper {
         public final int phoneId;
-        public int subId;
         public final @ImsFeature.FeatureType int imsFeatureType;
         private final List<ListenerContainer> mListeners = new ArrayList<>();
         private ImsFeatureContainer mFeatureContainer;
@@ -151,7 +150,7 @@
                 mFeatureContainer = c;
                 listeners = copyListenerList(mListeners);
             }
-            listeners.forEach(l -> l.notifyFeatureCreatedOrRemoved(mFeatureContainer, subId));
+            listeners.forEach(l -> l.notifyFeatureCreatedOrRemoved(mFeatureContainer));
         }
 
         public ImsFeatureContainer removeFeatureContainer() {
@@ -163,7 +162,7 @@
                 mFeatureContainer = null;
                 listeners = copyListenerList(mListeners);
             }
-            listeners.forEach(l -> l.notifyFeatureCreatedOrRemoved(mFeatureContainer, subId));
+            listeners.forEach(l -> l.notifyFeatureCreatedOrRemoved(mFeatureContainer));
             return oldContainer;
         }
 
@@ -185,7 +184,7 @@
             }
             // Do not call back until the feature container has been set.
             if (featureContainer != null) {
-                c.notifyFeatureCreatedOrRemoved(featureContainer, subId);
+                c.notifyFeatureCreatedOrRemoved(featureContainer);
             }
         }
 
@@ -214,7 +213,7 @@
             }
             // Only update if the feature container is set.
             if (featureContainer != null) {
-                listeners.forEach(l -> l.notifyStateChanged(newState, subId));
+                listeners.forEach(l -> l.notifyStateChanged(newState));
             }
         }
 
@@ -237,10 +236,6 @@
             }
         }
 
-        public void updateSubId(int newSubId) {
-            subId = newSubId;
-        }
-
         @GuardedBy("mLock")
         private void removeStaleListeners() {
             List<ListenerContainer> staleListeners = mListeners.stream().filter(
@@ -342,15 +337,14 @@
      * @param newConnection A Container containing the IBinder interface connections associated with
      *                      the ImsFeature type.
      */
-    public void addConnection(int phoneId, int subId, @ImsFeature.FeatureType int type,
+    public void addConnection(int phoneId, @ImsFeature.FeatureType int type,
             @Nullable ImsFeatureContainer newConnection) {
         if (type < 0 || type >= ImsFeature.FEATURE_MAX) {
             throw new IllegalArgumentException("The type must valid");
         }
-        logInfoLineLocked(phoneId, "addConnection, subId=" + subId + ", type="
-                + ImsFeature.FEATURE_LOG_MAP.get(type) + ", conn=" + newConnection);
+        logInfoLineLocked(phoneId, "addConnection, type=" + ImsFeature.FEATURE_LOG_MAP.get(type)
+                + ", conn=" + newConnection);
         UpdateMapper m = getUpdateMapper(phoneId, type);
-        m.updateSubId(subId);
         m.addFeatureContainer(newConnection);
     }
 
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index c41426d..345cbc5 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -17,12 +17,6 @@
 package com.android.ims;
 
 import static android.telephony.ims.ProvisioningManager.KEY_VOIMS_OPT_IN_STATUS;
-import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT;
-import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO;
-import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE;
-import static android.telephony.ims.feature.RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE;
-import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
-import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_LTE;
 
 import android.annotation.NonNull;
 import android.app.PendingIntent;
@@ -242,8 +236,8 @@
 
     @VisibleForTesting
     public interface MmTelFeatureConnectionFactory {
-        MmTelFeatureConnection create(Context context, int phoneId, int subId,
-                IImsMmTelFeature feature, IImsConfig c, IImsRegistration r, ISipTransport s);
+        MmTelFeatureConnection create(Context context, int phoneId, IImsMmTelFeature feature,
+                IImsConfig c, IImsRegistration r, ISipTransport s);
     }
 
     @VisibleForTesting
@@ -396,18 +390,15 @@
             try {
                 // If this is during initial reconnect, let all threads wait for connect
                 // (or timeout)
-                if(!mConnectedLatch.await(CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-                    mImsManager.log("ImsService not up yet - timeout waiting for connection.");
-                }
+                mConnectedLatch.await(CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
             } catch (InterruptedException e) {
                 // Do nothing and allow ImsService to attach behind the scenes
             }
         }
 
         @Override
-        public void connectionReady(ImsManager manager, int subId) {
+        public void connectionReady(ImsManager manager) {
             synchronized (mLock) {
-                mImsManager.logi("connectionReady, subId: " + subId);
                 mConnectedLatch.countDown();
             }
         }
@@ -415,7 +406,6 @@
         @Override
         public void connectionUnavailable(int reason) {
             synchronized (mLock) {
-                mImsManager.logi("connectionUnavailable, reason: " + reason);
                 // only need to track the connection becoming unavailable due to telephony going
                 // down.
                 if (reason == FeatureConnector.UNAVAILABLE_REASON_SERVER_UNAVAILABLE) {
@@ -699,28 +689,6 @@
     }
 
     /**
-     * @return true if we are either not on TTY or TTY over VoWiFi is enabled. If we
-     * are on TTY and TTY over VoWiFi is not allowed, this method will return false.
-     */
-    public boolean isNonTtyOrTtyOnVoWifiEnabled() {
-
-        if (isTtyOnVoWifiCapable()) {
-            return true;
-        }
-
-        TelecomManager tm = mContext.getSystemService(TelecomManager.class);
-        if (tm == null) {
-            logw("isNonTtyOrTtyOnVoWifiEnabled: telecom not available");
-            return true;
-        }
-        return tm.getCurrentTtyMode() == TelecomManager.TTY_MODE_OFF;
-    }
-
-    public boolean isTtyOnVoWifiCapable() {
-        return getBooleanCarrierConfig(CarrierConfigManager.KEY_CARRIER_VOWIFI_TTY_SUPPORTED_BOOL);
-    }
-
-    /**
      * Returns a platform configuration for VoLTE which may override the user setting.
      * @deprecated Does not support MSIM devices. Please use
      * {@link #isVolteEnabledByPlatform()} instead.
@@ -849,7 +817,8 @@
      * Indicates whether VoLTE is provisioned on this slot.
      */
     public boolean isVolteProvisionedOnDevice() {
-        if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE)) {
+        if (getBooleanCarrierConfig(
+                CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
             return isVolteProvisioned();
         }
 
@@ -860,7 +829,8 @@
      * Indicates whether EAB is provisioned on this slot.
      */
     public boolean isEabProvisionedOnDevice() {
-        if (isRcsProvisioningRequired(CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE)) {
+        if (getBooleanCarrierConfig(
+                CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL)) {
             return isEabProvisioned();
         }
 
@@ -900,7 +870,8 @@
             }
         }
 
-        if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_IWLAN)) {
+        if (getBooleanCarrierConfig(
+                CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
             return isWfcProvisioned();
         }
 
@@ -927,7 +898,8 @@
      * Indicates whether VT is provisioned on slot.
      */
     public boolean isVtProvisionedOnDevice() {
-        if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE)) {
+        if (getBooleanCarrierConfig(
+                CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
             return isVtProvisioned();
         }
 
@@ -1151,9 +1123,8 @@
 
         try {
             if (enabled) {
-                boolean isNonTtyWifi = isNonTtyOrTtyOnVoWifiEnabled();
                 CapabilityChangeRequest request = new CapabilityChangeRequest();
-                updateVoiceWifiFeatureAndProvisionedValues(request, isNonTtyWifi);
+                updateVoiceWifiFeatureAndProvisionedValues(request);
                 changeMmTelCapability(request);
                 // Ensure IMS is on if this setting is updated.
                 turnOnIms();
@@ -1616,55 +1587,59 @@
     }
 
     /**
-     * Will return with MmTel config value or return false if we receive an error from the AOSP
-     * storage(ImsProvisioningController) implementation for that value.
+     * Will return with config value or throw an ImsException if we receive an error from
+     * ImsConfig for that value.
      */
-    private boolean getImsProvisionedBoolNoException(int capability, int tech) {
-        int subId = getSubId();
-        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            logw("getImsProvisionedBoolNoException subId is invalid");
-            return false;
+    private boolean getProvisionedBool(ImsConfig config, int item) throws ImsException {
+        int value = config.getProvisionedValue(item);
+        if (value == ImsConfigImplBase.CONFIG_RESULT_UNKNOWN) {
+            throw new ImsException("getProvisionedBool failed with error for item: " + item,
+                    ImsReasonInfo.CODE_LOCAL_INTERNAL_ERROR);
         }
+        return value == ProvisioningManager.PROVISIONING_VALUE_ENABLED;
+    }
 
-        ITelephony iTelephony = getITelephony();
-        if (iTelephony == null) {
-            logw("getImsProvisionedBoolNoException ITelephony interface is invalid");
-            return false;
+    /**
+     * Will set config value or throw an ImsException if we receive an error from ImsConfig for that
+     * value.
+     */
+    private void setProvisionedBool(ImsConfig config, int item, int value) throws ImsException {
+        int result = config.setConfig(item, value);
+        if (result != ImsConfigImplBase.CONFIG_RESULT_SUCCESS) {
+            throw new ImsException("setProvisionedBool failed with error for item: " + item,
+                    ImsReasonInfo.CODE_LOCAL_INTERNAL_ERROR);
         }
+    }
 
+    /**
+     * Will return with config value or return false if we receive an error from
+     * ImsConfigImplBase implementation for that value.
+     */
+    private boolean getProvisionedBoolNoException(int item) {
         try {
-            return iTelephony.getImsProvisioningStatusForCapability(subId, capability, tech);
-        } catch (RemoteException | IllegalArgumentException e) {
-            logw("getImsProvisionedBoolNoException: operation failed for capability=" + capability
-                    + ". Exception:" + e.getMessage() + ". Returning false.");
+            ImsConfig config = getConfigInterface();
+            return getProvisionedBool(config, item);
+        } catch (ImsException ex) {
+            logw("getProvisionedBoolNoException: operation failed for item=" + item
+                    + ". Exception:" + ex.getMessage() + ". Returning false.");
             return false;
         }
     }
 
     /**
-     * Will return with Rcs config value or return false if we receive an error from the AOSP
-     * storage(ImsProvisioningController) implementation for that value.
+     * Will return with config value or return false if we receive an error from
+     * ImsConfigImplBase implementation for that value.
      */
-    private boolean getRcsProvisionedBoolNoException(int capability, int tech) {
-        int subId = getSubId();
-        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            logw("getRcsProvisionedBoolNoException subId is invalid");
-            return false;
-        }
-
-        ITelephony iTelephony = getITelephony();
-        if (iTelephony == null) {
-            logw("getRcsProvisionedBoolNoException ITelephony interface is invalid");
-            return false;
-        }
-
+    private boolean setProvisionedBoolNoException(int item, int value) {
         try {
-            return iTelephony.getRcsProvisioningStatusForCapability(subId, capability, tech);
-        } catch (RemoteException | IllegalArgumentException e) {
-            logw("getRcsProvisionedBoolNoException: operation failed for capability=" + capability
-                    + ". Exception:" + e.getMessage() + ". Returning false.");
+            ImsConfig config = getConfigInterface();
+            setProvisionedBool(config, item, value);
+        } catch (ImsException ex) {
+            logw("setProvisionedBoolNoException: operation failed for item=" + item
+                    + ", value=" + value + ". Exception:" + ex.getMessage());
             return false;
         }
+        return true;
     }
 
     /**
@@ -1696,9 +1671,8 @@
         logi("reevaluateCapabilities");
         CapabilityChangeRequest request = new CapabilityChangeRequest();
         boolean isNonTty = isNonTtyOrTtyOnVolteEnabled();
-        boolean isNonTtyWifi = isNonTtyOrTtyOnVoWifiEnabled();
         updateVoiceCellFeatureValue(request, isNonTty);
-        updateVoiceWifiFeatureAndProvisionedValues(request, isNonTtyWifi);
+        updateVoiceWifiFeatureAndProvisionedValues(request);
         updateCrossSimFeatureAndProvisionedValues(request);
         updateVideoCallFeatureValue(request, isNonTty);
         updateCallComposerFeatureValue(request);
@@ -1836,8 +1810,7 @@
     /**
      * Update WFC config
      */
-    private void updateVoiceWifiFeatureAndProvisionedValues(CapabilityChangeRequest request,
-     boolean isNonTty) {
+    private void updateVoiceWifiFeatureAndProvisionedValues(CapabilityChangeRequest request) {
         TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
         boolean isNetworkRoaming =  false;
         if (tm == null) {
@@ -1860,10 +1833,9 @@
                 + ", mode = " + mode
                 + ", provisioned = " + isProvisioned
                 + ", roaming = " + roaming
-                + ", isFeatureOn = " + isFeatureOn
-                + ", isNonTtyWifi = " + isNonTty);
+                + ", isFeatureOn = " + isFeatureOn);
 
-        if (isFeatureOn && isNonTty) {
+        if (isFeatureOn) {
             request.addCapabilitiesToEnableForTech(
                     MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
                     ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN);
@@ -1899,13 +1871,8 @@
 
     private void updateUtFeatureValue(CapabilityChangeRequest request) {
         boolean isCarrierSupported = isSuppServicesOverUtEnabledByPlatform();
-
-        // check new carrier config first KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
-        // if that returns false, check deprecated carrier config
-        // KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL
-        boolean requiresProvisioning = isMmTelProvisioningRequired(CAPABILITY_TYPE_UT,
-                REGISTRATION_TECH_LTE) || getBooleanCarrierConfig(
-                        CarrierConfigManager.KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL);
+        boolean requiresProvisioning = getBooleanCarrierConfig(
+                CarrierConfigManager.KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL);
         // Count as "provisioned" if we do not require provisioning.
         boolean isProvisioned = true;
         if (requiresProvisioning) {
@@ -1914,7 +1881,7 @@
             // currently.
             try {
                 if (telephony != null) {
-                    isProvisioned = telephony.getImsProvisioningStatusForCapability(getSubId(),
+                    isProvisioned = telephony.isMmTelCapabilityProvisionedInCache(getSubId(),
                             MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT,
                             ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
                 }
@@ -1989,7 +1956,7 @@
         mBinderCache = new BinderCacheManager<>(ImsManager::getITelephonyInterface);
         // Start off with an empty MmTelFeatureConnection, which will be replaced one an
         // ImsService is available (ImsManager expects a non-null FeatureConnection)
-        associate(null /*container*/, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        associate(null /*container*/);
     }
 
     /**
@@ -1997,8 +1964,7 @@
      */
     @VisibleForTesting
     public ImsManager(Context context, int phoneId, MmTelFeatureConnectionFactory factory,
-            SubscriptionManagerProxy subManagerProxy, SettingsProxy settingsProxy,
-            BinderCacheManager binderCacheManager) {
+            SubscriptionManagerProxy subManagerProxy, SettingsProxy settingsProxy) {
         mContext = context;
         mPhoneId = phoneId;
         mMmTelFeatureConnectionFactory = factory;
@@ -2008,9 +1974,9 @@
                 Context.CARRIER_CONFIG_SERVICE);
         // Do not multithread tests
         mExecutor = Runnable::run;
-        mBinderCache = binderCacheManager;
+        mBinderCache = new BinderCacheManager<>(ImsManager::getITelephonyInterface);
         // MmTelFeatureConnection should be replaced for tests with mMmTelFeatureConnectionFactory.
-        associate(null /*container*/, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        associate(null /*container*/);
     }
 
     /*
@@ -2648,14 +2614,10 @@
     public void setTtyMode(int ttyMode) throws ImsException {
         boolean isNonTtyOrTtyOnVolteEnabled = isTtyOnVoLteCapable() ||
                 (ttyMode == TelecomManager.TTY_MODE_OFF);
-
-        boolean isNonTtyOrTtyOnWifiEnabled = isTtyOnVoWifiCapable() ||
-                (ttyMode == TelecomManager.TTY_MODE_OFF);
-
+        logi("setTtyMode: isNonTtyOrTtyOnVolteEnabled=" + isNonTtyOrTtyOnVolteEnabled);
         CapabilityChangeRequest request = new CapabilityChangeRequest();
         updateVoiceCellFeatureValue(request, isNonTtyOrTtyOnVolteEnabled);
         updateVideoCallFeatureValue(request, isNonTtyOrTtyOnVolteEnabled);
-        updateVoiceWifiFeatureAndProvisionedValues(request, isNonTtyOrTtyOnWifiEnabled);
         // update MMTEL caps for the new configuration.
         changeMmTelCapability(request);
         if (isImsNeeded(request)) {
@@ -2797,12 +2759,6 @@
             throw new ImsException("Service is unavailable",
                     ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
         }
-        if (getSubId() != c.getSubId()) {
-            logi("Trying to get MmTelFeature when it is still setting up, curr subId=" + getSubId()
-                    + ", target subId=" + c.getSubId());
-            throw new ImsException("Service is still initializing",
-                    ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
-        }
         return c;
     }
 
@@ -2854,13 +2810,13 @@
     }
 
     @Override
-    public void associate(ImsFeatureContainer c, int subId) {
+    public void associate(ImsFeatureContainer c) {
         if (c == null) {
             mMmTelConnectionRef.set(mMmTelFeatureConnectionFactory.create(
-                    mContext, mPhoneId, subId, null, null, null, null));
+                    mContext, mPhoneId, null, null, null, null));
         } else {
             mMmTelConnectionRef.set(mMmTelFeatureConnectionFactory.create(
-                    mContext, mPhoneId, subId, IImsMmTelFeature.Stub.asInterface(c.imsFeature),
+                    mContext, mPhoneId, IImsMmTelFeature.Stub.asInterface(c.imsFeature),
                     c.imsConfig, c.imsRegistration, c.sipTransport));
         }
     }
@@ -2909,7 +2865,7 @@
     private void logi(String s) {
         Rlog.i(TAG + mLogTagPostfix + " [" + mPhoneId + "]", s);
     }
-
+    
     private void logw(String s) {
         Rlog.w(TAG + mLogTagPostfix + " [" + mPhoneId + "]", s);
     }
@@ -3035,8 +2991,7 @@
     public @MmTelFeature.ProcessCallResult int shouldProcessCall(boolean isEmergency,
             String[] numbers) throws ImsException {
         try {
-            MmTelFeatureConnection c = getOrThrowExceptionIfServiceUnavailable();
-            return c.shouldProcessCall(isEmergency, numbers);
+            return mMmTelConnectionRef.get().shouldProcessCall(isEmergency, numbers);
         } catch (RemoteException e) {
             throw new ImsException("shouldProcessCall()", e,
                     ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
@@ -3114,6 +3069,34 @@
         }
     }
 
+    public void setVolteProvisioned(boolean isProvisioned) {
+        int provisionStatus = isProvisioned ? ProvisioningManager.PROVISIONING_VALUE_ENABLED :
+                ProvisioningManager.PROVISIONING_VALUE_DISABLED;
+        setProvisionedBoolNoException(ImsConfig.ConfigConstants.VLT_SETTING_ENABLED,
+                provisionStatus);
+    }
+
+    public void setWfcProvisioned(boolean isProvisioned) {
+        int provisionStatus = isProvisioned ? ProvisioningManager.PROVISIONING_VALUE_ENABLED :
+                ProvisioningManager.PROVISIONING_VALUE_DISABLED;
+        setProvisionedBoolNoException(
+                ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED, provisionStatus);
+    }
+
+    public void setVtProvisioned(boolean isProvisioned) {
+        int provisionStatus = isProvisioned ? ProvisioningManager.PROVISIONING_VALUE_ENABLED :
+                ProvisioningManager.PROVISIONING_VALUE_DISABLED;
+        setProvisionedBoolNoException(ImsConfig.ConfigConstants.LVC_SETTING_ENABLED,
+                provisionStatus);
+    }
+
+    public void setEabProvisioned(boolean isProvisioned) {
+        int provisionStatus = isProvisioned ? ProvisioningManager.PROVISIONING_VALUE_ENABLED :
+                ProvisioningManager.PROVISIONING_VALUE_DISABLED;
+        setProvisionedBoolNoException(ImsConfig.ConfigConstants.EAB_SETTING_ENABLED,
+                provisionStatus);
+    }
+
     private boolean isDataEnabled() {
         TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
         if (tm == null) {
@@ -3125,72 +3108,23 @@
     }
 
     private boolean isVolteProvisioned() {
-        return getImsProvisionedBoolNoException(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE);
+        return getProvisionedBoolNoException(
+                ImsConfig.ConfigConstants.VLT_SETTING_ENABLED);
     }
 
     private boolean isEabProvisioned() {
-        return getRcsProvisionedBoolNoException(CAPABILITY_TYPE_PRESENCE_UCE,
-                REGISTRATION_TECH_LTE);
+        return getProvisionedBoolNoException(
+                ImsConfig.ConfigConstants.EAB_SETTING_ENABLED);
     }
 
     private boolean isWfcProvisioned() {
-        return getImsProvisionedBoolNoException(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_IWLAN);
+        return getProvisionedBoolNoException(
+                ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED);
     }
 
     private boolean isVtProvisioned() {
-        return getImsProvisionedBoolNoException(CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE);
-    }
-
-    private boolean isMmTelProvisioningRequired(int capability, int tech) {
-        int subId = getSubId();
-        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            logw("isMmTelProvisioningRequired subId is invalid");
-            return false;
-        }
-
-        ITelephony iTelephony = getITelephony();
-        if (iTelephony == null) {
-            logw("isMmTelProvisioningRequired ITelephony interface is invalid");
-            return false;
-        }
-
-        boolean required = false;
-        try {
-            required = iTelephony.isProvisioningRequiredForCapability(subId, capability,
-                    tech);
-        } catch (RemoteException | IllegalArgumentException e) {
-            logw("isMmTelProvisioningRequired : operation failed" + " capability=" + capability
-                    + " tech=" + tech + ". Exception:" + e.getMessage());
-        }
-
-        log("MmTel Provisioning required " + required + " for capability " + capability);
-        return required;
-    }
-
-    private boolean isRcsProvisioningRequired(int capability, int tech) {
-        int subId = getSubId();
-        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            logw("isRcsProvisioningRequired subId is invalid");
-            return false;
-        }
-
-        ITelephony iTelephony = getITelephony();
-        if (iTelephony == null) {
-            logw("isRcsProvisioningRequired ITelephony interface is invalid");
-            return false;
-        }
-
-        boolean required = false;
-        try {
-            required = iTelephony.isRcsProvisioningRequiredForCapability(subId, capability,
-                    tech);
-        } catch (RemoteException | IllegalArgumentException e) {
-            logw("isRcsProvisioningRequired : operation failed" + " capability=" + capability
-                    + " tech=" + tech + ". Exception:" + e.getMessage());
-        }
-
-        log("Rcs Provisioning required " + required + " for capability " + capability);
-        return required;
+        return getProvisionedBoolNoException(
+                ImsConfig.ConfigConstants.LVC_SETTING_ENABLED);
     }
 
     private static String booleanToPropertyString(boolean bool) {
diff --git a/src/java/com/android/ims/ImsUt.java b/src/java/com/android/ims/ImsUt.java
index d02ffaa..61a1111 100644
--- a/src/java/com/android/ims/ImsUt.java
+++ b/src/java/com/android/ims/ImsUt.java
@@ -33,11 +33,9 @@
 import com.android.ims.internal.IImsUtListener;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.telephony.Rlog;
-import com.android.internal.telephony.util.TelephonyUtils;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.Executor;
 
 /**
  * Provides APIs for the supplementary service settings using IMS (Ut interface).
@@ -87,13 +85,9 @@
     private HashMap<Integer, Message> mPendingCmds =
             new HashMap<Integer, Message>();
     private Registrant mSsIndicationRegistrant;
-    private Executor mExecutor = Runnable::run;
 
-    public ImsUt(IImsUt iUt, Executor executor) {
+    public ImsUt(IImsUt iUt) {
         miUt = iUt;
-        if (executor != null) {
-            mExecutor = executor;
-        }
 
         if (miUt != null) {
             try {
@@ -670,26 +664,22 @@
          */
         @Override
         public void utConfigurationUpdated(IImsUt ut, int id) {
-            TelephonyUtils.runWithCleanCallingIdentity(()-> {
-                Integer key = Integer.valueOf(id);
+            Integer key = Integer.valueOf(id);
 
-                synchronized(mLockObj) {
-                    sendSuccessReport(mPendingCmds.get(key));
-                    mPendingCmds.remove(key);
-                }
-            }, mExecutor);
+            synchronized(mLockObj) {
+                sendSuccessReport(mPendingCmds.get(key));
+                mPendingCmds.remove(key);
+            }
         }
 
         @Override
         public void utConfigurationUpdateFailed(IImsUt ut, int id, ImsReasonInfo error) {
-            TelephonyUtils.runWithCleanCallingIdentity(()-> {
-                Integer key = Integer.valueOf(id);
+            Integer key = Integer.valueOf(id);
 
-                synchronized(mLockObj) {
-                    sendFailureReport(mPendingCmds.get(key), error);
-                    mPendingCmds.remove(key);
-                }
-            }, mExecutor);
+            synchronized(mLockObj) {
+                sendFailureReport(mPendingCmds.get(key), error);
+                mPendingCmds.remove(key);
+            }
         }
 
         /**
@@ -720,24 +710,20 @@
          */
         @Override
         public void lineIdentificationSupplementaryServiceResponse(int id, ImsSsInfo config) {
-            TelephonyUtils.runWithCleanCallingIdentity(()-> {
-                synchronized(mLockObj) {
-                    sendSuccessReport(mPendingCmds.get(id), config);
-                    mPendingCmds.remove(id);
-                }
-            }, mExecutor);
+            synchronized(mLockObj) {
+                sendSuccessReport(mPendingCmds.get(id), config);
+                mPendingCmds.remove(id);
+            }
         }
 
         @Override
         public void utConfigurationQueryFailed(IImsUt ut, int id, ImsReasonInfo error) {
-            TelephonyUtils.runWithCleanCallingIdentity(()-> {
-                Integer key = Integer.valueOf(id);
+            Integer key = Integer.valueOf(id);
 
-                synchronized(mLockObj) {
-                    sendFailureReport(mPendingCmds.get(key), error);
-                    mPendingCmds.remove(key);
-                }
-            }, mExecutor);
+            synchronized(mLockObj) {
+                sendFailureReport(mPendingCmds.get(key), error);
+                mPendingCmds.remove(key);
+            }
         }
 
         /**
@@ -746,14 +732,12 @@
         @Override
         public void utConfigurationCallBarringQueried(IImsUt ut,
                 int id, ImsSsInfo[] cbInfo) {
-            TelephonyUtils.runWithCleanCallingIdentity(()-> {
-                Integer key = Integer.valueOf(id);
+            Integer key = Integer.valueOf(id);
 
-                synchronized(mLockObj) {
-                    sendSuccessReport(mPendingCmds.get(key), cbInfo);
-                    mPendingCmds.remove(key);
-                }
-            }, mExecutor);
+            synchronized(mLockObj) {
+                sendSuccessReport(mPendingCmds.get(key), cbInfo);
+                mPendingCmds.remove(key);
+            }
         }
 
         /**
@@ -762,14 +746,12 @@
         @Override
         public void utConfigurationCallForwardQueried(IImsUt ut,
                 int id, ImsCallForwardInfo[] cfInfo) {
-            TelephonyUtils.runWithCleanCallingIdentity(()-> {
-                Integer key = Integer.valueOf(id);
+            Integer key = Integer.valueOf(id);
 
-                synchronized(mLockObj) {
-                    sendSuccessReport(mPendingCmds.get(key), cfInfo);
-                    mPendingCmds.remove(key);
-                }
-            }, mExecutor);
+            synchronized(mLockObj) {
+                sendSuccessReport(mPendingCmds.get(key), cfInfo);
+                mPendingCmds.remove(key);
+            }
         }
 
         /**
@@ -778,14 +760,12 @@
         @Override
         public void utConfigurationCallWaitingQueried(IImsUt ut,
                 int id, ImsSsInfo[] cwInfo) {
-            TelephonyUtils.runWithCleanCallingIdentity(()-> {
-                Integer key = Integer.valueOf(id);
+            Integer key = Integer.valueOf(id);
 
-                synchronized(mLockObj) {
-                    sendSuccessReport(mPendingCmds.get(key), cwInfo);
-                    mPendingCmds.remove(key);
-                }
-            }, mExecutor);
+            synchronized(mLockObj) {
+                sendSuccessReport(mPendingCmds.get(key), cwInfo);
+                mPendingCmds.remove(key);
+            }
         }
 
         /**
@@ -793,11 +773,9 @@
          */
         @Override
         public void onSupplementaryServiceIndication(ImsSsData ssData) {
-            TelephonyUtils.runWithCleanCallingIdentity(()-> {
-                if (mSsIndicationRegistrant != null) {
-                    mSsIndicationRegistrant.notifyResult(ssData);
-                }
-            }, mExecutor);
+            if (mSsIndicationRegistrant != null) {
+                mSsIndicationRegistrant.notifyResult(ssData);
+            }
         }
     }
 }
diff --git a/src/java/com/android/ims/MmTelFeatureConnection.java b/src/java/com/android/ims/MmTelFeatureConnection.java
index 3170d41..7201313 100644
--- a/src/java/com/android/ims/MmTelFeatureConnection.java
+++ b/src/java/com/android/ims/MmTelFeatureConnection.java
@@ -60,7 +60,7 @@
             ImsCallbackAdapterManager<IImsRegistrationCallback> {
 
         public ImsRegistrationCallbackAdapter(Context context, Object lock) {
-            super(context, lock, mSlotId, mSubId);
+            super(context, lock, mSlotId);
         }
 
         @Override
@@ -87,10 +87,9 @@
             if (imsRegistration != null) {
                 try {
                     imsRegistration.removeRegistrationCallback(localCallback);
-                } catch (RemoteException | IllegalStateException e) {
+                } catch (RemoteException e) {
                     Log.w(TAG + " [" + mSlotId + "]", "ImsRegistrationCallbackAdapter -"
-                            + " unregisterCallback: couldn't remove registration callback"
-                            + " Exception: " + e.getMessage());
+                            + " unregisterCallback: couldn't remove registration callback");
                 }
             } else {
                 Log.e(TAG + " [" + mSlotId + "]", "ImsRegistrationCallbackAdapter: ImsRegistration"
@@ -102,7 +101,7 @@
     private class CapabilityCallbackManager extends ImsCallbackAdapterManager<IImsCapabilityCallback> {
 
         public CapabilityCallbackManager(Context context, Object lock) {
-            super(context, lock, mSlotId, mSubId);
+            super(context, lock, mSlotId);
         }
 
         @Override
@@ -136,19 +135,22 @@
         public void unregisterCallback(IImsCapabilityCallback localCallback) {
             IImsMmTelFeature binder;
             synchronized (mLock) {
-                if (!isBinderAlive()) {
+                try {
+                    checkServiceIsReady();
+                    binder = getServiceInterface(mBinder);
+                } catch (RemoteException e) {
+                    // binder is null
                     Log.w(TAG + " [" + mSlotId + "]", "CapabilityCallbackManager, unregister:"
-                            + " binder is not alive");
+                            + " couldn't get binder.");
                     return;
                 }
-                binder = getServiceInterface(mBinder);
             }
             if (binder != null) {
                 try {
                     binder.removeCapabilityCallback(localCallback);
-                } catch (RemoteException | IllegalStateException e) {
+                } catch (RemoteException e) {
                     Log.w(TAG + " [" + mSlotId + "]", "CapabilityCallbackManager, unregister:"
-                            + " Binder is dead. Exception: " + e.getMessage());
+                            + " Binder is dead.");
                 }
             } else {
                 Log.w(TAG + " [" + mSlotId + "]", "CapabilityCallbackManager, unregister:"
@@ -159,7 +161,7 @@
 
     private class ProvisioningCallbackManager extends ImsCallbackAdapterManager<IImsConfigCallback> {
         public ProvisioningCallbackManager (Context context, Object lock) {
-            super(context, lock, mSlotId, mSubId);
+            super(context, lock, mSlotId);
         }
 
         @Override
@@ -188,9 +190,9 @@
             }
             try {
                 binder.removeImsConfigCallback(localCallback);
-            } catch (RemoteException | IllegalStateException e) {
+            } catch (RemoteException e) {
                 Log.w(TAG + " [" + mSlotId + "]", "ProvisioningCallbackManager - couldn't"
-                        + " unregister, binder is dead. Exception: " + e.getMessage());
+                        + " unregister, binder is dead.");
             }
         }
     }
@@ -248,9 +250,9 @@
     private final CapabilityCallbackManager mCapabilityCallbackManager;
     private final ProvisioningCallbackManager mProvisioningCallbackManager;
 
-    public MmTelFeatureConnection(Context context, int slotId, int subId, IImsMmTelFeature f,
+    public MmTelFeatureConnection(Context context, int slotId, IImsMmTelFeature f,
             IImsConfig c, IImsRegistration r, ISipTransport s) {
-        super(context, slotId, subId, c, r, s);
+        super(context, slotId, c, r, s);
 
         setBinder((f != null) ? f.asBinder() : null);
         mRegistrationCallbackManager = new ImsRegistrationCallbackAdapter(context, mLock);
@@ -323,9 +325,8 @@
                     mMultiEndpoint.getInterface().setExternalCallStateListener(null);
                     mMultiEndpoint = new BinderAccessState<>(BinderAccessState.STATE_NOT_SET);
                 }
-            } catch (RemoteException | IllegalStateException e) {
-                Log.w(TAG + " [" + mSlotId + "]", "closeConnection: couldn't remove listeners!" +
-                        " Exception: " + e.getMessage());
+            } catch (RemoteException e) {
+                Log.w(TAG + " [" + mSlotId + "]", "closeConnection: couldn't remove listeners!");
             }
         }
     }
@@ -345,7 +346,7 @@
 
     public void removeRegistrationCallbackForSubscription(IImsRegistrationCallback callback,
             int subId) {
-        mRegistrationCallbackManager.removeCallback(callback);
+        mRegistrationCallbackManager.removeCallbackForSubscription(callback, subId);
     }
 
     public void addCapabilityCallback(IImsCapabilityCallback callback) {
@@ -363,7 +364,7 @@
 
     public void removeCapabilityCallbackForSubscription(IImsCapabilityCallback callback,
             int subId) {
-        mCapabilityCallbackManager.removeCallback(callback);
+        mCapabilityCallbackManager.removeCallbackForSubscription(callback , subId);
     }
 
     public void addProvisioningCallbackForSubscription(IImsConfigCallback callback,
@@ -373,7 +374,7 @@
 
     public void removeProvisioningCallbackForSubscription(IImsConfigCallback callback,
             int subId) {
-        mProvisioningCallbackManager.removeCallback(callback);
+        mProvisioningCallbackManager.removeCallbackForSubscription(callback , subId);
     }
 
     public void changeEnabledCapabilities(CapabilityChangeRequest request,
@@ -435,7 +436,7 @@
             // This will internally set up a listener on the ImsUtImplBase interface, and there is
             // a limitation that there can only be one. If multiple connections try to create this
             // UT interface, it will throw an IllegalStateException.
-            mUt = (imsUt != null) ? new ImsUt(imsUt, mContext.getMainExecutor()) : null;
+            mUt = (imsUt != null) ? new ImsUt(imsUt) : null;
             return mUt;
         }
     }
diff --git a/src/java/com/android/ims/RcsFeatureConnection.java b/src/java/com/android/ims/RcsFeatureConnection.java
index c19c36c..b090810 100644
--- a/src/java/com/android/ims/RcsFeatureConnection.java
+++ b/src/java/com/android/ims/RcsFeatureConnection.java
@@ -49,7 +49,7 @@
             ImsCallbackAdapterManager<IImsCapabilityCallback> {
 
         AvailabilityCallbackManager(Context context) {
-            super(context, new Object() /* Lock object */, mSlotId, mSubId);
+            super(context, new Object() /* Lock object */, mSlotId);
         }
 
         @Override
@@ -77,7 +77,7 @@
             ImsCallbackAdapterManager<IImsRegistrationCallback> {
 
         public RegistrationCallbackManager(Context context) {
-            super(context, new Object() /* Lock object */, mSlotId, mSubId);
+            super(context, new Object() /* Lock object */, mSlotId);
         }
 
         @Override
@@ -118,9 +118,9 @@
     @VisibleForTesting
     public RegistrationCallbackManager mRegistrationCallbackManager;
 
-    public RcsFeatureConnection(Context context, int slotId, int subId, IImsRcsFeature feature,
-            IImsConfig c, IImsRegistration r, ISipTransport s) {
-        super(context, slotId, subId, c, r, s);
+    public RcsFeatureConnection(Context context, int slotId, IImsRcsFeature feature, IImsConfig c,
+            IImsRegistration r, ISipTransport s) {
+        super(context, slotId, c, r, s);
         setBinder(feature != null ? feature.asBinder() : null);
         mAvailabilityCallbackManager = new AvailabilityCallbackManager(mContext);
         mRegistrationCallbackManager = new RegistrationCallbackManager(mContext);
@@ -184,11 +184,11 @@
     }
 
     public void removeCallbackForSubscription(int subId, IImsCapabilityCallback cb) {
-        mAvailabilityCallbackManager.removeCallback(cb);
+        mAvailabilityCallbackManager.removeCallbackForSubscription(cb, subId);
     }
 
     public void removeCallbackForSubscription(int subId, IImsRegistrationCallback cb) {
-        mRegistrationCallbackManager.removeCallback(cb);
+        mRegistrationCallbackManager.removeCallbackForSubscription(cb, subId);
     }
 
     public void removeCallback(IImsRegistrationCallback cb) {
diff --git a/src/java/com/android/ims/RcsFeatureManager.java b/src/java/com/android/ims/RcsFeatureManager.java
index e034a68..af2298a 100644
--- a/src/java/com/android/ims/RcsFeatureManager.java
+++ b/src/java/com/android/ims/RcsFeatureManager.java
@@ -90,16 +90,6 @@
         void onUnpublish();
 
         /**
-         * Notify the framework that the ImsService has refreshed the PUBLISH
-         * internally, which has resulted in a new PUBLISH result.
-         * <p>
-         * This method must be called to notify the framework of SUCCESS (200 OK) and FAILURE (300+)
-         * codes in order to keep the AOSP stack up to date.
-         */
-        void onPublishUpdated(int reasonCode, String reasonPhrase,
-                int reasonHeaderCause, String reasonHeaderText);
-
-        /**
          * Receive a capabilities request from the remote client.
          */
         void onRemoteCapabilityRequest(Uri contactUri,
@@ -123,13 +113,6 @@
                 }
 
                 @Override
-                public void onPublishUpdated(int reasonCode, String reasonPhrase,
-                        int reasonHeaderCause, String reasonHeaderText) {
-                    mCapabilityEventCallback.forEach(callback -> callback.onPublishUpdated(
-                            reasonCode, reasonPhrase, reasonHeaderCause, reasonHeaderText));
-                }
-
-                @Override
                 public void onRemoteCapabilityRequest(Uri contactUri,
                         List<String> remoteCapabilities, IOptionsRequestCallback cb) {
                     mCapabilityEventCallback.forEach(
@@ -583,9 +566,9 @@
     }
 
     @Override
-    public void associate(ImsFeatureContainer c, int subId) {
+    public void associate(ImsFeatureContainer c) {
         IImsRcsFeature f = IImsRcsFeature.Stub.asInterface(c.imsFeature);
-        mRcsFeatureConnection = new RcsFeatureConnection(mContext, mSlotId, subId, f, c.imsConfig,
+        mRcsFeatureConnection = new RcsFeatureConnection(mContext, mSlotId, f, c.imsConfig,
                 c.imsRegistration, c.sipTransport);
     }
 
diff --git a/src/java/com/android/ims/rcs/uce/UceController.java b/src/java/com/android/ims/rcs/uce/UceController.java
index 6fb27b0..c609909 100644
--- a/src/java/com/android/ims/rcs/uce/UceController.java
+++ b/src/java/com/android/ims/rcs/uce/UceController.java
@@ -80,23 +80,11 @@
         List<EabCapabilityResult> getCapabilitiesFromCache(@NonNull List<Uri> uris);
 
         /**
-         * Retrieve the capabilities associated with the given uris from the cache including
-         * expired capabilities.
-         */
-        List<EabCapabilityResult> getCapabilitiesFromCacheIncludingExpired(@NonNull List<Uri> uris);
-
-        /**
          * Retrieve the contact's capabilities from the availability cache.
          */
         EabCapabilityResult getAvailabilityFromCache(@NonNull Uri uri);
 
         /**
-         * Retrieve the contact's capabilities from the availability cache including expired
-         * capabilities
-         */
-        EabCapabilityResult getAvailabilityFromCacheIncludingExpired(@NonNull Uri uri);
-
-        /**
          * Store the given capabilities to the cache.
          */
         void saveCapabilities(List<RcsContactUceCapability> contactCapabilities);
@@ -212,13 +200,11 @@
     private static class CachedCapabilityEvent {
         private Optional<Integer> mRequestPublishCapabilitiesEvent;
         private Optional<Boolean> mUnpublishEvent;
-        private Optional<SomeArgs> mPublishUpdatedEvent;
         private Optional<SomeArgs> mRemoteCapabilityRequestEvent;
 
         public CachedCapabilityEvent() {
             mRequestPublishCapabilitiesEvent = Optional.empty();
             mUnpublishEvent = Optional.empty();
-            mPublishUpdatedEvent = Optional.empty();
             mRemoteCapabilityRequestEvent = Optional.empty();
         }
 
@@ -237,19 +223,6 @@
         }
 
         /**
-         * Cache the publish update event triggered by the ImsService.
-         */
-        public synchronized void setOnPublishUpdatedEvent(int reasonCode, String reasonPhrase,
-                int reasonHeaderCause, String reasonHeaderText) {
-            SomeArgs args = SomeArgs.obtain();
-            args.arg1 = reasonCode;
-            args.arg2 = reasonPhrase;
-            args.arg3 = reasonHeaderCause;
-            args.arg4 = reasonHeaderText;
-            mPublishUpdatedEvent = Optional.of(args);
-        }
-
-        /**
          * Cache the remote capability request event triggered by the ImsService.
          */
         public synchronized void setRemoteCapabilityRequestEvent(Uri contactUri,
@@ -271,11 +244,6 @@
             return mUnpublishEvent;
         }
 
-        /** @Return the cached pubilsh update event */
-        public synchronized Optional<SomeArgs> getPublishUpdatedEvent() {
-            return mPublishUpdatedEvent;
-        }
-
         /** @Return the cached remote capability request event */
         public synchronized Optional<SomeArgs> getRemoteCapabilityRequestEvent() {
             return mRemoteCapabilityRequestEvent;
@@ -285,8 +253,6 @@
         public synchronized void clear() {
             mRequestPublishCapabilitiesEvent = Optional.empty();
             mUnpublishEvent = Optional.empty();
-            mPublishUpdatedEvent.ifPresent(args -> args.recycle());
-            mPublishUpdatedEvent = Optional.empty();
             mRemoteCapabilityRequestEvent.ifPresent(args -> args.recycle());
             mRemoteCapabilityRequestEvent = Optional.empty();
         }
@@ -489,15 +455,6 @@
         Optional<Boolean> unpublishEvent = mCachedCapabilityEvent.getUnpublishEvent();
         unpublishEvent.ifPresent(unpublish -> onUnpublish());
 
-        Optional<SomeArgs> publishUpdatedEvent = mCachedCapabilityEvent.getPublishUpdatedEvent();
-        publishUpdatedEvent.ifPresent(args -> {
-            int reasonCode = (Integer) args.arg1;
-            String reasonPhrase = (String) args.arg2;
-            int reasonHeaderCause = (Integer) args.arg3;
-            String reasonHeaderText = (String) args.arg4;
-            onPublishUpdated(reasonCode, reasonPhrase, reasonHeaderCause, reasonHeaderText);
-        });
-
         Optional<SomeArgs> remoteRequest = mCachedCapabilityEvent.getRemoteCapabilityRequestEvent();
         remoteRequest.ifPresent(args -> {
             Uri contactUri = (Uri) args.arg1;
@@ -519,21 +476,11 @@
         }
 
         @Override
-        public List<EabCapabilityResult> getCapabilitiesFromCacheIncludingExpired(List<Uri> uris) {
-            return mEabController.getCapabilitiesIncludingExpired(uris);
-        }
-
-        @Override
         public EabCapabilityResult getAvailabilityFromCache(Uri contactUri) {
             return mEabController.getAvailability(contactUri);
         }
 
         @Override
-        public EabCapabilityResult getAvailabilityFromCacheIncludingExpired(Uri contactUri) {
-            return mEabController.getAvailabilityIncludingExpired(contactUri);
-        }
-
-        @Override
         public void saveCapabilities(List<RcsContactUceCapability> contactCapabilities) {
             mEabController.saveCapabilities(contactCapabilities);
         }
@@ -606,18 +553,6 @@
                 }
 
                 @Override
-                public void onPublishUpdated(int reasonCode, String reasonPhrase,
-                        int reasonHeaderCause, String reasonHeaderText) {
-                    if (isRcsConnecting()) {
-                        mCachedCapabilityEvent.setOnPublishUpdatedEvent(reasonCode, reasonPhrase,
-                                reasonHeaderCause, reasonHeaderText);
-                        return;
-                    }
-                    UceController.this.onPublishUpdated(reasonCode, reasonPhrase,
-                            reasonHeaderCause, reasonHeaderText);
-                }
-
-                @Override
                 public void onRemoteCapabilityRequest(Uri contactUri,
                         List<String> remoteCapabilities, IOptionsRequestCallback cb) {
                     if (contactUri == null || remoteCapabilities == null || cb == null) {
@@ -737,17 +672,6 @@
     }
 
     /**
-     * This method is triggered by the ImsService to notify framework that the device's
-     * publish status has been changed.
-     */
-    public void onPublishUpdated(int reasonCode, String reasonPhrase,
-            int reasonHeaderCause, String reasonHeaderText) {
-        logi("onPublishUpdated");
-        mPublishController.onPublishUpdated(reasonCode, reasonPhrase,
-                reasonHeaderCause, reasonHeaderText);
-    }
-
-    /**
      * Request publish the device's capabilities. This request is from the ImsService to send the
      * capabilities to the remote side.
      */
@@ -760,9 +684,8 @@
     /**
      * Register a {@link PublishStateCallback} to receive the published state changed.
      */
-    public void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c,
-            boolean supportPublishingState) {
-        mPublishController.registerPublishStateCallback(c, supportPublishingState);
+    public void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c) {
+        mPublishController.registerPublishStateCallback(c);
     }
 
     /**
@@ -775,8 +698,8 @@
     /**
      * Get the UCE publish state if the PUBLISH is supported by the carrier.
      */
-    public @PublishState int getUcePublishState(boolean isSupportPublishingState) {
-        return mPublishController.getUcePublishState(isSupportPublishingState);
+    public @PublishState int getUcePublishState() {
+        return mPublishController.getUcePublishState();
     }
 
     /**
@@ -832,7 +755,6 @@
     public void removeRequestDisallowedStatus() {
         logd("removeRequestDisallowedStatus");
         mDeviceState.resetDeviceState();
-        mRequestManager.resetThrottlingList();
     }
 
     /**
diff --git a/src/java/com/android/ims/rcs/uce/UceDeviceState.java b/src/java/com/android/ims/rcs/uce/UceDeviceState.java
index 93445db..773726a 100644
--- a/src/java/com/android/ims/rcs/uce/UceDeviceState.java
+++ b/src/java/com/android/ims/rcs/uce/UceDeviceState.java
@@ -64,18 +64,11 @@
      */
     private static final int DEVICE_STATE_BAD_EVENT = 3;
 
-    /**
-     * The device will be in the NO_RETRY error state when the PUBLISH request fails and the
-     * SIP code is 413 REQUEST ENTITY TOO LARGE.
-     */
-    private static final int DEVICE_STATE_NO_RETRY = 4;
-
     @IntDef(value = {
             DEVICE_STATE_OK,
             DEVICE_STATE_FORBIDDEN,
             DEVICE_STATE_PROVISION_ERROR,
             DEVICE_STATE_BAD_EVENT,
-            DEVICE_STATE_NO_RETRY,
     }, prefix="DEVICE_STATE_")
     @Retention(RetentionPolicy.SOURCE)
     public @interface DeviceStateType {}
@@ -86,7 +79,6 @@
         DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_FORBIDDEN, "DEVICE_STATE_FORBIDDEN");
         DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_PROVISION_ERROR, "DEVICE_STATE_PROVISION_ERROR");
         DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_BAD_EVENT, "DEVICE_STATE_BAD_EVENT");
-        DEVICE_STATE_DESCRIPTION.put(DEVICE_STATE_NO_RETRY, "DEVICE_STATE_NO_RETRY");
     }
 
     /**
@@ -120,18 +112,6 @@
             }
         }
 
-        /**
-         * Check current state to see if only the PUBLISH request is allowed to be executed.
-         */
-        public boolean isPublishRequestBlocked() {
-            switch(mDeviceState) {
-                case DEVICE_STATE_NO_RETRY:
-                    return true;
-                default:
-                    return false;
-            }
-        }
-
         public int getDeviceState() {
             return mDeviceState;
         }
@@ -255,16 +235,17 @@
         // Update the device state based on the given sip code.
         switch (sipCode) {
             case NetworkSipCode.SIP_CODE_FORBIDDEN:   // sip 403
-            case NetworkSipCode.SIP_CODE_SERVER_TIMEOUT: // sip 504
                 if (requestType == UceController.REQUEST_TYPE_PUBLISH) {
                     // Provisioning error for publish request.
                     setDeviceState(DEVICE_STATE_PROVISION_ERROR);
-                    updateErrorCode(sipCode, reason, requestType);
-                    // There is no request retry time for SIP code 403
-                    removeRequestRetryTime();
-                    // No timer to exit the forbidden state.
-                    removeExitStateTimer();
+                } else {
+                    setDeviceState(DEVICE_STATE_FORBIDDEN);
                 }
+                updateErrorCode(sipCode, reason, requestType);
+                // There is no request retry time for SIP code 403
+                removeRequestRetryTime();
+                // No timer to exit the forbidden state.
+                removeExitStateTimer();
                 break;
 
             case NetworkSipCode.SIP_CODE_NOT_FOUND:  // sip 404
@@ -295,22 +276,6 @@
                 // Reset the device state when the network response is OK.
                 resetInternal();
                 break;
-
-            case NetworkSipCode.SIP_CODE_REQUEST_ENTITY_TOO_LARGE:   // sip 413
-            case NetworkSipCode.SIP_CODE_TEMPORARILY_UNAVAILABLE:   // sip 480
-            case NetworkSipCode.SIP_CODE_BUSY:   // sip 486
-            case NetworkSipCode.SIP_CODE_SERVER_INTERNAL_ERROR:   // sip 500
-            case NetworkSipCode.SIP_CODE_SERVICE_UNAVAILABLE:   // sip 503
-            case NetworkSipCode.SIP_CODE_BUSY_EVERYWHERE:   // sip 600
-            case NetworkSipCode.SIP_CODE_DECLINE:   // sip 603
-                if (requestType == UceController.REQUEST_TYPE_PUBLISH) {
-                    setDeviceState(DEVICE_STATE_NO_RETRY);
-                    // There is no request retry time for SIP code 413
-                    removeRequestRetryTime();
-                    // No timer to exit this state.
-                    removeExitStateTimer();
-                }
-                break;
         }
 
         // Get the updated device state.
diff --git a/src/java/com/android/ims/rcs/uce/UceStatsWriter.java b/src/java/com/android/ims/rcs/uce/UceStatsWriter.java
deleted file mode 100644
index 1db9040..0000000
--- a/src/java/com/android/ims/rcs/uce/UceStatsWriter.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce;
-
-import android.annotation.IntDef;
-import android.telephony.ims.stub.ImsRegistrationImplBase;
-import android.telephony.ims.stub.RcsCapabilityExchangeImplBase;
-import android.telephony.ims.RcsContactPresenceTuple;
-import android.telephony.ims.RcsContactUceCapability;
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
-/**
- * The UceStatsWriter should be a singleton class for storing atoms in RcsStats.
- * ims-common provides an interface for setting atoms to telephony-common.
- **/
-public class UceStatsWriter {
-    private static UceStatsWriter sInstance = null;
-    private UceStatsCallback mCallBack;
-
-    /**
-     * @hide
-     */
-    // Defines which UCE event occurred.
-    @IntDef(value = {
-        PUBLISH_EVENT,
-        SUBSCRIBE_EVENT,
-        INCOMING_OPTION_EVENT,
-        OUTGOING_OPTION_EVENT
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface UceEventType {}
-    /**
-     * UCE events related to Publish Method.
-     */
-    public static final int PUBLISH_EVENT = 0;
-    /**
-     * UCE events related to Subscribe Method.
-     */
-    public static final int SUBSCRIBE_EVENT = 1;
-    /**
-     * UCE events related to incoming Options Method.
-     */
-    public static final int INCOMING_OPTION_EVENT = 2;
-    /**
-     * UCE events related to outgoing Options Method.
-     */
-    public static final int OUTGOING_OPTION_EVENT = 3;
-
-    /**
-     * The callback interface is called by the Metrics data creator to receive information from
-     * others controllers.
-     */
-    public interface UceStatsCallback {
-        /**
-         * Notify the callback listener that the feature tag associated with
-         * IMS registration of this device have changed.
-         */
-        public void onImsRegistrationFeatureTagStats(int subId, List<String> featureTagList,
-            int registrationTech);
-
-        /**
-         * Notify that the active IMS registration to the carrier network has been terminated.
-         */
-        public void onStoreCompleteImsRegistrationFeatureTagStats(int subId);
-
-        /**
-         * Notify the callback listener that the PIDF ServiceDescriptions associated with
-         * the UCE presence of this device have changed.
-         */
-        void onImsRegistrationServiceDescStats(int subId, List<String> serviceIdList,
-            List<String> serviceIdVersionList, int registrationTech);
-
-        /**
-         * Notify the callback listener that a subscribe response received.
-         */
-        void onSubscribeResponse(int subId, long taskId, int networkResponse);
-
-        /**
-         * Notify the callback listener that a UCE Network Event has occurred.
-         */
-        void onUceEvent(int subId, int type, boolean successful, int commandCode,
-            int networkResponse);
-
-        /**
-         * Notify the callback listener that a subscribe has ended.
-         */
-        void onSubscribeTerminated(int subId, long taskId, String reason);
-
-        /**
-         * Notify that the Presence Notify Event has changed.
-         */
-        void onPresenceNotifyEvent(int subId, long taskId,
-            List<RcsContactUceCapability> updatedCapList);
-
-        /**
-         * Notify that the active UCE PUBLISH to the carrier network has been terminated.
-         */
-        void onStoreCompleteImsRegistrationServiceDescStats(int subId);
-    }
-
-    /**
-     * create an instance of UceStatsWriter
-     */
-    public static UceStatsWriter init(UceStatsCallback callback) {
-        synchronized (UceStatsWriter.class) {
-            if (sInstance == null) {
-                sInstance = new UceStatsWriter(callback);
-            }
-            return sInstance;
-        }
-    }
-
-    /**
-     * get the current instance of UceStatsWriter
-     */
-    public static UceStatsWriter getInstance() {
-        synchronized (UceStatsWriter.class) {
-            return sInstance;
-        }
-    }
-
-    /**
-     * Stats about each Feature tag that was included in IMS registration received from
-     * the network during register.
-     * @param subId The subId associated with the event.
-     * @param featureTagList Ims Feature tag list.
-     * @param registrationTech The registration tech associated with the feature tag.
-     */
-    public void setImsRegistrationFeatureTagStats(int subId, List<String> featureTagList,
-        @ImsRegistrationImplBase.ImsRegistrationTech int registrationTech) {
-        if (mCallBack == null) {
-            return;
-        }
-        mCallBack.onImsRegistrationFeatureTagStats(subId, featureTagList, registrationTech);
-    }
-
-    /**
-     * Update time of stats for each stored feature tag.
-     * @param subId The subId associated with the event.
-     */
-    public void setStoreCompleteImsRegistrationFeatureTagStats(int subId) {
-        if (mCallBack == null) {
-            return;
-        }
-        mCallBack.onStoreCompleteImsRegistrationFeatureTagStats(subId);
-    }
-
-    /**
-     * Stats about each ServiceDescription that was included in the PIDF XML sent to
-     * the network during publish
-     * @param subId The subId associated with the event.
-     * @param tupleList Tuple information set in PIDF.
-     * @param registrationTech The registration tech associated with the feature tag.
-     */
-    public void setImsRegistrationServiceDescStats(int subId,
-        List<RcsContactPresenceTuple> tupleList,
-        @ImsRegistrationImplBase.ImsRegistrationTech int registrationTech) {
-        if (mCallBack == null) {
-            return;
-        }
-        ArrayList<String> svcId = new ArrayList<>();
-        ArrayList<String> svcVersion = new ArrayList<>();
-
-        for (RcsContactPresenceTuple tuple : tupleList) {
-            svcId.add(tuple.getServiceId());
-            svcVersion.add(tuple.getServiceVersion());
-        }
-        mCallBack.onImsRegistrationServiceDescStats(subId, svcId, svcVersion, registrationTech);
-    }
-
-    /**
-     * Stats related to UCE queries to the network
-     * @param subId The subId associated with the event.
-     * @param taskId The taskId associate with the event.
-     * @param networkResponse The network response code for the Uce event
-     */
-    public void setSubscribeResponse(int subId, long taskId, int networkResponse) {
-        if (mCallBack != null) {
-            mCallBack.onSubscribeResponse(subId, taskId, networkResponse);
-        }
-    }
-
-    /**
-     * Stats related to UCE queries to the network
-     * @param subId The subId associated with the event.
-     * @param type Used to identify the message type.
-     * @param successful Whether the UCE event is successfully finished.
-     * @param commandCode The command error code for the Uce event
-     * @param networkResponse The network response code for the Uce event
-     */
-    public void setUceEvent(int subId, @UceEventType int type, boolean successful,
-        @RcsCapabilityExchangeImplBase.CommandCode int commandCode, int networkResponse) {
-        if (mCallBack != null) {
-            mCallBack.onUceEvent(subId, type, successful, commandCode, networkResponse);
-        }
-    }
-
-    /**
-     * The result of processing received notify messages.
-     * @param subId The subId associated with the event.
-     * @param taskId The taskId associate with the event.
-     * @param updatedCapList Capability information of the user contained in Presence Notify.
-     */
-    public void setPresenceNotifyEvent(int subId, long taskId,
-        List<RcsContactUceCapability> updatedCapList) {
-        if (mCallBack == null || updatedCapList == null || updatedCapList.isEmpty()) {
-            return;
-        }
-        mCallBack.onPresenceNotifyEvent(subId, taskId, updatedCapList);
-    }
-
-    /**
-     * Indicates that the subscription request has become a terminated state.
-     * @param subId The subId associated with the event.
-     * @param taskId The taskId associate with the event.
-     * @param reason The terminated reason associated with the subscription state.
-     */
-    public void setSubscribeTerminated(int subId, long taskId, String reason) {
-        if (mCallBack != null) {
-            mCallBack.onSubscribeTerminated(subId, taskId, reason);
-        }
-    }
-
-    /**
-     * indicates that the device has removed an existing PUBLISH from the carrier's network
-     * containing the device's RCS capabilities state.
-     * The registered time of publication must be set in ImsRegistrationServiceDescStats,
-     * which is the life time of publication, so it can be set only when publication is over.
-     * @param subId The subId associated with the event.
-     */
-    public void setUnPublish(int subId) {
-        if (mCallBack != null) {
-            mCallBack.onStoreCompleteImsRegistrationServiceDescStats(subId);
-        }
-    }
-
-    @VisibleForTesting
-    protected UceStatsWriter(UceStatsCallback callback) {
-        mCallBack = callback;
-    }
-}
diff --git a/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java b/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java
index b4406fd..6d3eabf 100644
--- a/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java
+++ b/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java
@@ -59,6 +59,7 @@
     private final AlarmManager.OnAlarmListener mCapabilityExpiredListener;
     private final ContactChangedListener mContactProviderListener;
     private final EabSettingsListener mEabSettingListener;
+    private final BroadcastReceiver mCarrierConfigChangedListener;
     private final EabControllerImpl mEabControllerImpl;
     private final EabContactSyncController mEabContactSyncController;
 
@@ -134,6 +135,28 @@
         }
     }
 
+    /**
+     * Listen carrier config changed to prevent this instance created before carrier config loaded.
+     */
+    private class CarrierConfigChangedListener extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            boolean isSupportBulkCapabilityExchange = getBooleanCarrierConfig(
+                CarrierConfigManager.Ims.KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL, mSubId);
+
+            Log.d(TAG, "Carrier config changed. "
+                    + "isCarrierConfigEnabled: " + mIsCarrierConfigEnabled
+                    + ", isSupportBulkCapabilityExchange: " + isSupportBulkCapabilityExchange);
+            if (!mIsCarrierConfigEnabled && isSupportBulkCapabilityExchange) {
+                enableBulkCapability();
+                updateExpiredTimeAlert();
+                mIsCarrierConfigEnabled = true;
+            } else if (mIsCarrierConfigEnabled && !isSupportBulkCapabilityExchange) {
+                onDestroy();
+            }
+        }
+    }
+
     private IRcsUceControllerCallback mRcsUceControllerCallback = new IRcsUceControllerCallback() {
         @Override
         public void onCapabilitiesReceived(List<RcsContactUceCapability> contactCapabilities) {
@@ -204,6 +227,7 @@
         mContactProviderListener = new ContactChangedListener(mHandler);
         mEabSettingListener = new EabSettingsListener(mHandler);
         mCapabilityExpiredListener = new CapabilityExpiredListener();
+        mCarrierConfigChangedListener = new CarrierConfigChangedListener();
 
         Log.d(TAG, "create EabBulkCapabilityUpdater() subId: " + mSubId);
 
@@ -226,6 +250,7 @@
             registerEabUserSettingsListener();
             mIsCarrierConfigEnabled = false;
         } else {
+            registerCarrierConfigChanged();
             Log.d(TAG, "Not support bulk capability exchange.");
         }
     }
@@ -396,6 +421,7 @@
         cancelTimeAlert(mContext);
         unRegisterContactProviderListener();
         unRegisterEabUserSettings();
+        unRegisterCarrierConfigChanged();
     }
 
     private void registerContactProviderListener() {
@@ -416,6 +442,14 @@
                 mEabSettingListener);
     }
 
+    private void registerCarrierConfigChanged() {
+        Log.d(TAG, "registerCarrierConfigChanged");
+        mIsCarrierConfigListenerRegistered = true;
+        IntentFilter FILTER_CARRIER_CONFIG_CHANGED =
+                new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
+        mContext.registerReceiver(mCarrierConfigChangedListener, FILTER_CARRIER_CONFIG_CHANGED);
+    }
+
     private void unRegisterContactProviderListener() {
         Log.d(TAG, "unRegisterContactProviderListener");
         if (mIsContactProviderListenerRegistered) {
@@ -432,23 +466,15 @@
         }
     }
 
-    public void setUceRequestCallback(UceController.UceControllerCallback uceControllerCallback) {
-        mUceControllerCallback = uceControllerCallback;
+    private void unRegisterCarrierConfigChanged() {
+        Log.d(TAG, "unregisterCarrierConfigChanged");
+        if (mIsCarrierConfigListenerRegistered) {
+            mIsCarrierConfigListenerRegistered = false;
+            mContext.unregisterReceiver(mCarrierConfigChangedListener);
+        }
     }
 
-    public void onCarrierConfigChanged() {
-        boolean isSupportBulkCapabilityExchange = getBooleanCarrierConfig(
-                CarrierConfigManager.Ims.KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL, mSubId);
-
-        Log.d(TAG, "Carrier config changed. "
-                + "isCarrierConfigEnabled: " + mIsCarrierConfigEnabled
-                + ", isSupportBulkCapabilityExchange: " + isSupportBulkCapabilityExchange);
-        if (!mIsCarrierConfigEnabled && isSupportBulkCapabilityExchange) {
-            enableBulkCapability();
-            updateExpiredTimeAlert();
-            mIsCarrierConfigEnabled = true;
-        } else if (mIsCarrierConfigEnabled && !isSupportBulkCapabilityExchange) {
-            onDestroy();
-        }
+    public void setUceRequestCallback(UceController.UceControllerCallback uceControllerCallback) {
+        mUceControllerCallback = uceControllerCallback;
     }
 }
diff --git a/src/java/com/android/ims/rcs/uce/eab/EabController.java b/src/java/com/android/ims/rcs/uce/eab/EabController.java
index b03e465..903a19d 100644
--- a/src/java/com/android/ims/rcs/uce/eab/EabController.java
+++ b/src/java/com/android/ims/rcs/uce/eab/EabController.java
@@ -35,23 +35,11 @@
     @NonNull List<EabCapabilityResult> getCapabilities(@NonNull List<Uri> uris);
 
     /**
-     * Get contact capabilities from cache including expired capabilities.
-     * @param uris the uri list to get contact capabilities from cache.
-     * @return The contact capabilities of the given uri list.
-     */
-    @NonNull List<EabCapabilityResult> getCapabilitiesIncludingExpired(@NonNull List<Uri> uris);
-
-    /**
      * Retrieve the contact's capabilities from the availability cache.
      */
     @NonNull EabCapabilityResult getAvailability(@NonNull Uri contactUri);
 
     /**
-     * Retrieve the contact's capabilities from the availability cache.
-     */
-    @NonNull EabCapabilityResult getAvailabilityIncludingExpired(@NonNull Uri contactUri);
-
-    /**
      * Save the capabilities to the EAB database.
      */
     void saveCapabilities(@NonNull List<RcsContactUceCapability> contactCapabilities);
diff --git a/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java b/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java
index aaab0a9..cc1011f 100644
--- a/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java
+++ b/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java
@@ -56,7 +56,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.function.Predicate;
 
 /**
@@ -65,10 +64,8 @@
 public class EabControllerImpl implements EabController {
     private static final String TAG = "EabControllerImpl";
 
-    // 7 days
-    private static final int DEFAULT_NON_RCS_CAPABILITY_CACHE_EXPIRATION_SEC = 7 * 24 * 60 * 60;
-    // 1 day
-    private static final int DEFAULT_CAPABILITY_CACHE_EXPIRATION_SEC = 24 * 60 * 60;
+    // 90 days
+    private static final int DEFAULT_CAPABILITY_CACHE_EXPIRATION_SEC = 90 * 24 * 60 * 60;
     private static final int DEFAULT_AVAILABILITY_CACHE_EXPIRATION_SEC = 60;
 
     // 1 week
@@ -128,10 +125,6 @@
         // Pick up changes to CarrierConfig and run any applicable cleanup tasks associated with
         // that configuration.
         mCapabilityCleanupRunnable.run();
-        cleanupOrphanedRows();
-        if (!mIsSetDestroyedFlag) {
-            mEabBulkCapabilityUpdater.onCarrierConfigChanged();
-        }
     }
 
     /**
@@ -170,29 +163,6 @@
     }
 
     /**
-     * Retrieve the contacts' capabilities from the EAB database including expired capabilities.
-     */
-    @Override
-    public @NonNull List<EabCapabilityResult> getCapabilitiesIncludingExpired(
-            @NonNull List<Uri> uris) {
-        Objects.requireNonNull(uris);
-        if (mIsSetDestroyedFlag) {
-            Log.d(TAG, "EabController destroyed.");
-            return generateDestroyedResult(uris);
-        }
-
-        Log.d(TAG, "getCapabilitiesIncludingExpired uri size=" + uris.size());
-        List<EabCapabilityResult> capabilityResultList = new ArrayList();
-
-        for (Uri uri : uris) {
-            EabCapabilityResult result = generateEabResultIncludingExpired(uri,
-                    this::isCapabilityExpired);
-            capabilityResultList.add(result);
-        }
-        return capabilityResultList;
-    }
-
-    /**
      * Retrieve the contact's capabilities from the availability cache.
      */
     @Override
@@ -209,23 +179,6 @@
     }
 
     /**
-     * Retrieve the contact's capabilities from the availability cache including expired
-     * capabilities.
-     */
-    @Override
-    public @NonNull EabCapabilityResult getAvailabilityIncludingExpired(@NonNull Uri contactUri) {
-        Objects.requireNonNull(contactUri);
-        if (mIsSetDestroyedFlag) {
-            Log.d(TAG, "EabController destroyed.");
-            return new EabCapabilityResult(
-                contactUri,
-                EabCapabilityResult.EAB_CONTROLLER_DESTROYED_FAILURE,
-                null);
-        }
-        return generateEabResultIncludingExpired(contactUri, this::isAvailabilityExpired);
-    }
-
-    /**
      * Update the availability catch and save the capabilities to the EAB database.
      */
     @Override
@@ -271,7 +224,7 @@
                 c.close();
             }
         }
-        cleanupOrphanedRows();
+
         mEabBulkCapabilityUpdater.updateExpiredTimeAlert();
 
         if (mHandler.hasCallbacks(mCapabilityCleanupRunnable)) {
@@ -281,25 +234,6 @@
                 CLEAN_UP_LEGACY_CAPABILITY_DELAY_MILLI_SEC);
     }
 
-    /**
-     * Cleanup the entry of common table that can't map to presence or option table
-     */
-    @VisibleForTesting
-    public void cleanupOrphanedRows() {
-        String presenceSelection =
-                " (SELECT " + EabProvider.PresenceTupleColumns.EAB_COMMON_ID +
-                        " FROM " + EAB_PRESENCE_TUPLE_TABLE_NAME + ") ";
-        String optionSelection =
-                " (SELECT " + EabProvider.OptionsColumns.EAB_COMMON_ID +
-                        " FROM " + EAB_OPTIONS_TABLE_NAME + ") ";
-
-        mContext.getContentResolver().delete(
-                EabProvider.COMMON_URI,
-                EabProvider.EabCommonColumns._ID + " NOT IN " + presenceSelection +
-                        " AND " + EabProvider.EabCommonColumns._ID+ " NOT IN " + optionSelection,
-                null);
-    }
-
     private List<EabCapabilityResult> generateDestroyedResult(List<Uri> contactUri) {
         List<EabCapabilityResult> destroyedResult = new ArrayList<>();
         for (Uri uri : contactUri) {
@@ -362,62 +296,12 @@
         return result;
     }
 
-    private EabCapabilityResult generateEabResultIncludingExpired(Uri contactUri,
-            Predicate<Cursor> isExpiredMethod) {
-        RcsUceCapabilityBuilderWrapper builder = null;
-        EabCapabilityResult result;
-        Optional<Boolean> isExpired = Optional.empty();
-
-        // query EAB provider
-        Uri queryUri = Uri.withAppendedPath(
-                Uri.withAppendedPath(EabProvider.ALL_DATA_URI, String.valueOf(mSubId)),
-                getNumberFromUri(mContext, contactUri));
-        Cursor cursor = mContext.getContentResolver().query(queryUri, null, null, null, null);
-
-        if (cursor != null && cursor.getCount() != 0) {
-            while (cursor.moveToNext()) {
-                // Record whether it has expired.
-                if (!isExpired.isPresent()) {
-                    isExpired = Optional.of(isExpiredMethod.test(cursor));
-                }
-                if (builder == null) {
-                    builder = createNewBuilder(contactUri, cursor);
-                } else {
-                    updateCapability(contactUri, cursor, builder);
-                }
-            }
-            cursor.close();
-
-            // Determine the query result
-            int eabResult = EabCapabilityResult.EAB_QUERY_SUCCESSFUL;
-            if (isExpired.orElse(false)) {
-                eabResult = EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE;
-            }
-
-            if (builder.getMechanism() == CAPABILITY_MECHANISM_PRESENCE) {
-                PresenceBuilder presenceBuilder = builder.getPresenceBuilder();
-                result = new EabCapabilityResult(contactUri, eabResult, presenceBuilder.build());
-            } else {
-                OptionsBuilder optionsBuilder = builder.getOptionsBuilder();
-                result = new EabCapabilityResult(contactUri, eabResult, optionsBuilder.build());
-            }
-        } else {
-            result = new EabCapabilityResult(contactUri,
-                    EabCapabilityResult.EAB_CONTACT_NOT_FOUND_FAILURE, null);
-        }
-        return result;
-    }
-
     private void updateCapability(Uri contactUri, Cursor cursor,
                 RcsUceCapabilityBuilderWrapper builderWrapper) {
         if (builderWrapper.getMechanism() == CAPABILITY_MECHANISM_PRESENCE) {
             PresenceBuilder builder = builderWrapper.getPresenceBuilder();
-            if (builder == null) {
-                return;
-            }
-            RcsContactPresenceTuple presenceTuple = createPresenceTuple(contactUri, cursor);
-            if (presenceTuple != null) {
-                builder.addCapabilityTuple(presenceTuple);
+            if (builder != null) {
+                builder.addCapabilityTuple(createPresenceTuple(contactUri, cursor));
             }
         } else {
             OptionsBuilder builder = builderWrapper.getOptionsBuilder();
@@ -436,14 +320,7 @@
         if (mechanism == CAPABILITY_MECHANISM_PRESENCE) {
             PresenceBuilder builder = new PresenceBuilder(
                     contactUri, SOURCE_TYPE_CACHED, result);
-            RcsContactPresenceTuple tuple = createPresenceTuple(contactUri, cursor);
-            if (tuple != null) {
-                builder.addCapabilityTuple(tuple);
-            }
-            String entityUri = getStringValue(cursor, EabProvider.EabCommonColumns.ENTITY_URI);
-            if (!TextUtils.isEmpty(entityUri)) {
-                builder.setEntityUri(Uri.parse(entityUri));
-            }
+            builder.addCapabilityTuple(createPresenceTuple(contactUri, cursor));
             builderWrapper.setPresenceBuilder(builder);
         } else {
             OptionsBuilder builder = new OptionsBuilder(contactUri, SOURCE_TYPE_CACHED);
@@ -505,34 +382,29 @@
         serviceCapabilities = serviceCapabilitiesBuilder.build();
 
         // Create RcsContactPresenceTuple
-        boolean isTupleEmpty = TextUtils.isEmpty(status) && TextUtils.isEmpty(serviceId)
-                && TextUtils.isEmpty(version);
-        if (!isTupleEmpty) {
-            RcsContactPresenceTuple.Builder rcsContactPresenceTupleBuilder =
-                    new RcsContactPresenceTuple.Builder(status, serviceId, version);
-            if (description != null) {
-                rcsContactPresenceTupleBuilder.setServiceDescription(description);
-            }
-            if (contactUri != null) {
-                rcsContactPresenceTupleBuilder.setContactUri(contactUri);
-            }
-            if (serviceCapabilities != null) {
-                rcsContactPresenceTupleBuilder.setServiceCapabilities(serviceCapabilities);
-            }
-            if (timeStamp != null) {
-                try {
-                    Instant instant = Instant.ofEpochSecond(Long.parseLong(timeStamp));
-                    rcsContactPresenceTupleBuilder.setTime(instant);
-                } catch (NumberFormatException ex) {
-                    Log.w(TAG, "Create presence tuple: NumberFormatException");
-                } catch (DateTimeParseException e) {
-                    Log.w(TAG, "Create presence tuple: parse timestamp failed");
-                }
-            }
-            return rcsContactPresenceTupleBuilder.build();
-        } else {
-            return null;
+        RcsContactPresenceTuple.Builder rcsContactPresenceTupleBuilder =
+                new RcsContactPresenceTuple.Builder(status, serviceId, version);
+        if (description != null) {
+            rcsContactPresenceTupleBuilder.setServiceDescription(description);
         }
+        if (contactUri != null) {
+            rcsContactPresenceTupleBuilder.setContactUri(contactUri);
+        }
+        if (serviceCapabilities != null) {
+            rcsContactPresenceTupleBuilder.setServiceCapabilities(serviceCapabilities);
+        }
+        if (timeStamp != null) {
+            try {
+                Instant instant = Instant.ofEpochSecond(Long.parseLong(timeStamp));
+                rcsContactPresenceTupleBuilder.setTime(instant);
+            } catch (NumberFormatException ex) {
+                Log.w(TAG, "Create presence tuple: NumberFormatException");
+            } catch (DateTimeParseException e) {
+                Log.w(TAG, "Create presence tuple: parse timestamp failed");
+            }
+        }
+
+        return rcsContactPresenceTupleBuilder.build();
     }
 
     private boolean isCapabilityExpired(Cursor cursor) {
@@ -605,7 +477,7 @@
             value = carrierConfig.getInt(
                     CarrierConfigManager.Ims.KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT);
         } else {
-            value = DEFAULT_NON_RCS_CAPABILITY_CACHE_EXPIRATION_SEC;
+            value = DEFAULT_CAPABILITY_CACHE_EXPIRATION_SEC;
             Log.e(TAG, "getNonRcsCapabilityCacheExpiration: " +
                     "CarrierConfig is null, returning default");
         }
@@ -682,36 +554,12 @@
         contentValues.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, mSubId);
         contentValues.put(EabProvider.EabCommonColumns.REQUEST_RESULT,
                 capability.getRequestResult());
-        if (capability.getEntityUri() != null) {
-            contentValues.put(EabProvider.EabCommonColumns.ENTITY_URI,
-                    capability.getEntityUri().toString());
-        }
         Uri result = mContext.getContentResolver().insert(EabProvider.COMMON_URI, contentValues);
         int commonId = Integer.parseInt(result.getLastPathSegment());
         Log.d(TAG, "Insert into common table. Id: " + commonId);
 
-        if (capability.getCapabilityTuples().size() == 0) {
-            insertEmptyTuple(commonId);
-        } else {
-            insertAllTuples(commonId, capability);
-        }
-    }
-
-    private void insertEmptyTuple(int commonId) {
-        Log.d(TAG, "Insert empty tuple into presence table.");
-        ContentValues contentValues = new ContentValues();
-        contentValues.put(EabProvider.PresenceTupleColumns.EAB_COMMON_ID, commonId);
-        // Using current timestamp instead of network timestamp since there is not use cases for
-        // network timestamp and the network timestamp may cause capability expire immediately.
-        contentValues.put(EabProvider.PresenceTupleColumns.REQUEST_TIMESTAMP,
-                mExpirationTimeFactory.getExpirationTime());
-        mContext.getContentResolver().insert(EabProvider.PRESENCE_URI, contentValues);
-    }
-
-    private void insertAllTuples(int commonId, RcsContactUceCapability capability) {
         ContentValues[] presenceContent =
                 new ContentValues[capability.getCapabilityTuples().size()];
-
         for (int i = 0; i < presenceContent.length; i++) {
             RcsContactPresenceTuple tuple = capability.getCapabilityTuples().get(i);
 
@@ -732,7 +580,7 @@
                 }
             }
 
-            ContentValues contentValues = new ContentValues();
+            contentValues = new ContentValues();
             contentValues.put(EabProvider.PresenceTupleColumns.EAB_COMMON_ID, commonId);
             contentValues.put(EabProvider.PresenceTupleColumns.BASIC_STATUS, tuple.getStatus());
             contentValues.put(EabProvider.PresenceTupleColumns.SERVICE_ID, tuple.getServiceId());
@@ -823,6 +671,7 @@
 
         cleanupCapabilities(rcsCapabilitiesExpiredTime, getRcsCommonIdList());
         cleanupCapabilities(nonRcsCapabilitiesExpiredTime, getNonRcsCommonIdList());
+        cleanupOrphanedRows();
     }
 
     private void cleanupCapabilities(long rcsCapabilitiesExpiredTime, List<Integer> commonIdList) {
@@ -890,6 +739,24 @@
         return list;
     }
 
+    /**
+     * Cleanup the entry of common table that can't map to presence or option table
+     */
+    private void cleanupOrphanedRows() {
+        String presenceSelection =
+                " (SELECT " + EabProvider.PresenceTupleColumns.EAB_COMMON_ID +
+                        " FROM " + EAB_PRESENCE_TUPLE_TABLE_NAME + ") ";
+        String optionSelection =
+                " (SELECT " + EabProvider.OptionsColumns.EAB_COMMON_ID +
+                        " FROM " + EAB_OPTIONS_TABLE_NAME + ") ";
+
+        mContext.getContentResolver().delete(
+                EabProvider.COMMON_URI,
+                EabProvider.EabCommonColumns._ID + " NOT IN " + presenceSelection +
+                        " AND " + EabProvider.EabCommonColumns._ID+ " NOT IN " + optionSelection,
+                null);
+    }
+
     private String getStringValue(Cursor cursor, String column) {
         return cursor.getString(cursor.getColumnIndex(column));
     }
diff --git a/src/java/com/android/ims/rcs/uce/eab/EabProvider.java b/src/java/com/android/ims/rcs/uce/eab/EabProvider.java
index e2a8308..da70349 100644
--- a/src/java/com/android/ims/rcs/uce/eab/EabProvider.java
+++ b/src/java/com/android/ims/rcs/uce/eab/EabProvider.java
@@ -81,7 +81,7 @@
     public static final String AUTHORITY = "eab";
 
     private static final String TAG = "EabProvider";
-    private static final int DATABASE_VERSION = 4;
+    private static final int DATABASE_VERSION = 3;
 
     public static final String EAB_CONTACT_TABLE_NAME = "eab_contact";
     public static final String EAB_COMMON_TABLE_NAME = "eab_common";
@@ -205,13 +205,6 @@
          * <P>Type:  INTEGER</P>
          */
         public static final String SUBSCRIPTION_ID = "subscription_id";
-
-        /**
-         * The value of the 'entity' attribute is the 'pres' URL of the PRESENTITY publishing
-         * presence document
-         * <P>Type:  TEXT</P>
-         */
-        public static final String ENTITY_URI = "entity_uri";
     }
 
     /**
@@ -361,8 +354,7 @@
                 + EabCommonColumns.EAB_CONTACT_ID + " INTEGER DEFAULT -1, "
                 + EabCommonColumns.MECHANISM + " INTEGER DEFAULT NULL, "
                 + EabCommonColumns.REQUEST_RESULT + " INTEGER DEFAULT -1, "
-                + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1, "
-                + EabCommonColumns.ENTITY_URI + " TEXT DEFAULT NULL "
+                + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1 "
                 + ");";
 
         @VisibleForTesting
@@ -455,12 +447,6 @@
                 sqLiteDatabase.execSQL("ALTER TABLE temp RENAME TO " + EAB_COMMON_TABLE_NAME + ";");
                 oldVersion = 3;
             }
-
-            if (oldVersion < 4) {
-                sqLiteDatabase.execSQL("ALTER TABLE " + EAB_COMMON_TABLE_NAME + " ADD COLUMN "
-                        + EabCommonColumns.ENTITY_URI + " Text DEFAULT NULL;");
-                oldVersion = 4;
-            }
         }
     }
 
diff --git a/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java b/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java
index 10b43a5..dc2dc04 100644
--- a/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java
+++ b/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParser.java
@@ -21,10 +21,10 @@
 import android.telephony.ims.RcsContactPresenceTuple;
 import android.telephony.ims.RcsContactPresenceTuple.ServiceCapabilities;
 import android.telephony.ims.RcsContactUceCapability;
+import android.telephony.ims.RcsContactUceCapability.PresenceBuilder;
 import android.text.TextUtils;
 import android.util.Log;
 
-
 import com.android.ims.rcs.uce.presence.pidfparser.capabilities.Audio;
 import com.android.ims.rcs.uce.presence.pidfparser.capabilities.CapsConstant;
 import com.android.ims.rcs.uce.presence.pidfparser.capabilities.Duplex;
@@ -35,7 +35,6 @@
 import com.android.ims.rcs.uce.presence.pidfparser.pidf.PidfConstant;
 import com.android.ims.rcs.uce.presence.pidfparser.pidf.Presence;
 import com.android.ims.rcs.uce.presence.pidfparser.pidf.Tuple;
-import com.android.ims.rcs.uce.presence.pidfparser.RcsContactUceCapabilityWrapper;
 import com.android.ims.rcs.uce.util.UceUtils;
 import com.android.internal.annotations.VisibleForTesting;
 
@@ -121,12 +120,11 @@
     }
 
     /**
-     * Get the RcsContactUceCapabilityWrapper from the given PIDF xml format.
+     * Get the RcsContactUceCapability from the given PIDF xml format.
      */
-    public static @Nullable RcsContactUceCapabilityWrapper getRcsContactUceCapabilityWrapper(
-            String pidf) {
+    public static @Nullable RcsContactUceCapability getRcsContactUceCapability(String pidf) {
         if (TextUtils.isEmpty(pidf)) {
-            Log.w(LOG_TAG, "getRcsContactUceCapabilityWrapper: The given pidf is empty");
+            Log.w(LOG_TAG, "getRcsContactUceCapability: The given pidf is empty");
             return null;
         }
 
@@ -134,7 +132,7 @@
         Matcher matcher = PIDF_PATTERN.matcher(pidf);
         String formattedPidf = matcher.replaceAll("");
         if (TextUtils.isEmpty(formattedPidf)) {
-            Log.w(LOG_TAG, "getRcsContactUceCapabilityWrapper: The formatted pidf is empty");
+            Log.w(LOG_TAG, "getRcsContactUceCapability: The formatted pidf is empty");
             return null;
         }
 
@@ -149,7 +147,7 @@
             // Start parsing
             Presence presence = parsePidf(parser);
 
-            // Convert from the Presence to the RcsContactUceCapabilityWrapper
+            // Convert from the Presence to the RcsContactUceCapability
             return convertToRcsContactUceCapability(presence);
 
         } catch (XmlPullParserException | IOException e) {
@@ -170,12 +168,10 @@
             XmlPullParserException {
         Presence presence = null;
         int nextType = parser.next();
-        boolean findPresenceTag = false;
         do {
             // Find the Presence start tag
             if (nextType == XmlPullParser.START_TAG
                     && Presence.ELEMENT_NAME.equals(parser.getName())) {
-                findPresenceTag = true;
                 presence = new Presence();
                 presence.parse(parser);
                 break;
@@ -183,18 +179,13 @@
             nextType = parser.next();
         } while(nextType != XmlPullParser.END_DOCUMENT);
 
-        if (!findPresenceTag) {
-            Log.w(LOG_TAG, "parsePidf: The presence start tag not found.");
-        }
-
         return presence;
     }
 
     /*
-     * Convert the given Presence to the RcsContactUceCapabilityWrapper
+     * Convert the given Presence to the RcsContactUceCapability
      */
-    private static RcsContactUceCapabilityWrapper convertToRcsContactUceCapability(
-            Presence presence) {
+    private static RcsContactUceCapability convertToRcsContactUceCapability(Presence presence) {
         if (presence == null) {
             Log.w(LOG_TAG, "convertToRcsContactUceCapability: The presence is null");
             return null;
@@ -204,24 +195,19 @@
             return null;
         }
 
-        RcsContactUceCapabilityWrapper uceCapabilityWrapper = new RcsContactUceCapabilityWrapper(
-                Uri.parse(presence.getEntity()), RcsContactUceCapability.SOURCE_TYPE_NETWORK,
+        PresenceBuilder presenceBuilder = new PresenceBuilder(Uri.parse(presence.getEntity()),
+                RcsContactUceCapability.SOURCE_TYPE_NETWORK,
                 RcsContactUceCapability.REQUEST_RESULT_FOUND);
 
         // Add all the capability tuples of this contact
         presence.getTupleList().forEach(tuple -> {
-            // The tuple that fails parsing is invalid data, so discard it.
-            if (!tuple.getMalformed()) {
-                RcsContactPresenceTuple capabilityTuple = getRcsContactPresenceTuple(tuple);
-                if (capabilityTuple != null) {
-                    uceCapabilityWrapper.addCapabilityTuple(capabilityTuple);
-                }
-            } else {
-                uceCapabilityWrapper.setMalformedContents();
+            RcsContactPresenceTuple capabilityTuple = getRcsContactPresenceTuple(tuple);
+            if (capabilityTuple != null) {
+                presenceBuilder.addCapabilityTuple(capabilityTuple);
             }
         });
-        uceCapabilityWrapper.setEntityUri(Uri.parse(presence.getEntity()));
-        return uceCapabilityWrapper;
+
+        return presenceBuilder.build();
     }
 
     /*
diff --git a/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParserUtils.java b/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParserUtils.java
index d43819e..f2b21bd 100644
--- a/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParserUtils.java
+++ b/src/java/com/android/ims/rcs/uce/presence/pidfparser/PidfParserUtils.java
@@ -284,16 +284,6 @@
     }
 
     /**
-     * Get the malformed status from the given tuple.
-     */
-    public static boolean getTupleMalformedStatus(Tuple tuple) {
-        if (tuple == null) {
-            return false;
-        }
-        return tuple.getMalformed();
-    }
-
-    /**
      * Get the terminated capability which disable all the capabilities.
      */
     public static RcsContactUceCapability getTerminatedCapability(Uri contact, String reason) {
diff --git a/src/java/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapper.java b/src/java/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapper.java
deleted file mode 100644
index 3b2f163..0000000
--- a/src/java/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapper.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce.presence.pidfparser;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.net.Uri;
-
-import android.telephony.ims.RcsContactPresenceTuple;
-import android.telephony.ims.RcsContactUceCapability;
-import android.telephony.ims.RcsContactUceCapability.PresenceBuilder;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A wrapper class that uses the parsed information to construct {@link RcsContactUceCapability}
- * instances.
- */
-
-public class RcsContactUceCapabilityWrapper {
-    private final Uri mContactUri;
-    private final int mSourceType;
-    private final int mRequestResult;
-    private boolean mIsMalformed;
-    private final List<RcsContactPresenceTuple> mPresenceTuples = new ArrayList<>();
-    private Uri mEntityUri;
-
-    /**
-     * Create the wrapper, which can be used to set UCE capabilities as well as custom
-     * capability extensions.
-     * @param contact The contact URI that the capabilities are attached to.
-     * @param sourceType The type where the capabilities of this contact were retrieved from.
-     * @param requestResult the request result
-     */
-    public RcsContactUceCapabilityWrapper(@NonNull Uri contact, int sourceType, int requestResult) {
-        mContactUri = contact;
-        mSourceType = sourceType;
-        mRequestResult = requestResult;
-        mIsMalformed = false;
-    }
-
-    /**
-     * Add the {@link RcsContactPresenceTuple} into the presence tuple list.
-     * @param tuple The {@link RcsContactPresenceTuple} to be added into.
-     */
-    public void addCapabilityTuple(@NonNull RcsContactPresenceTuple tuple) {
-        mPresenceTuples.add(tuple);
-    }
-
-    /**
-     * This flag is set if at least one tuple could not be parsed due to malformed contents.
-     */
-    public void setMalformedContents() {
-        mIsMalformed = true;
-    }
-
-    /**
-     * Set the entity URI related to the contact whose capabilities were requested.
-     * @param entityUri the 'pres' URL of the PRESENTITY publishing presence document.
-     */
-    public void setEntityUri(@NonNull Uri entityUri) {
-        mEntityUri = entityUri;
-    }
-
-    /**
-     * Whether the XML is malformed.
-     * @return {@code true} if all of the presence tuple information associated with
-     * the entity URI ({@link #getEntityUri}) is malformed and there is no tuple info
-     * available. If one or more of the tuples are still well-formed after parsing the
-     * XML, this method will return {@code false}.
-     */
-    public boolean isMalformed() {
-        if (mIsMalformed == false) {
-            return false;
-        }
-        if (mPresenceTuples.isEmpty()) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Retrieve the entity URI of the contact whose presence information is being requested for.
-     * @return the URI representing the 'pres' URL of the PRESENTITY publishing presence document
-     * or {@code null} if the entity uri does not exist in the presence document.
-     */
-    public @Nullable Uri getEntityUri() {
-        return mEntityUri;
-    }
-
-    /**
-     * @return a new RcsContactUceCapability instance from the contents of this wrapper.
-     */
-    public @NonNull RcsContactUceCapability toRcsContactUceCapability() {
-
-        PresenceBuilder presenceBuilder = new PresenceBuilder(mContactUri,
-                mSourceType, mRequestResult);
-
-        // Add all the capability tuples of this contact
-        presenceBuilder.addCapabilityTuples(mPresenceTuples);
-        presenceBuilder.setEntityUri(mEntityUri);
-        return presenceBuilder.build();
-    }
-}
diff --git a/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Presence.java b/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Presence.java
index b217314..e9a40a8 100644
--- a/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Presence.java
+++ b/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Presence.java
@@ -18,11 +18,8 @@
 
 import android.annotation.NonNull;
 import android.net.Uri;
-import android.text.TextUtils;
-import android.util.Log;
 
 import com.android.ims.rcs.uce.presence.pidfparser.ElementBase;
-import com.android.ims.rcs.uce.util.UceUtils;
 import com.android.internal.annotations.VisibleForTesting;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -44,7 +41,6 @@
      * 2: Any number (including 0) of <note> elements
      * 3: Any number of OPTIONAL extension elements from other namespaces.
      */
-    private static final String LOG_TAG = UceUtils.getLogPrefix() + "Presence";
 
     /** The name of this element */
     public static final String ELEMENT_NAME = "presence";
@@ -137,9 +133,6 @@
         }
 
         mEntity = parser.getAttributeValue(XmlPullParser.NO_NAMESPACE, ATTRIBUTE_NAME_ENTITY);
-        if (TextUtils.isEmpty(mEntity)) {
-            throw new XmlPullParserException("Entity uri of presence is empty");
-        }
 
         // Move to the next event.
         int eventType = parser.next();
@@ -153,24 +146,11 @@
 
                 if (isTupleElement(eventType, tagName)) {
                     Tuple tuple = new Tuple();
-                    try {
-                        // If one tuple encounters an xml exception, we must parse the other tuple
-                        // and store valid information.
-                        tuple.parse(parser);
-                    } catch (XmlPullParserException e) {
-                        e.printStackTrace();
-                        Log.w(LOG_TAG, "parse: Exception occurred during Tuple parsing.");
-                        tuple.setMalformed(true);
-                    }
+                    tuple.parse(parser);
                     mTupleList.add(tuple);
                 } else if (isNoteElement(eventType, tagName)) {
                     Note note = new Note();
-                    try {
-                        note.parse(parser);
-                    } catch (XmlPullParserException e) {
-                        e.printStackTrace();
-                        Log.w(LOG_TAG, "parse: Exception occurred during Note parsing.");
-                    }
+                    note.parse(parser);
                     mNoteList.add(note);
                 }
             }
diff --git a/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Tuple.java b/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Tuple.java
index e274466..014dbed 100644
--- a/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Tuple.java
+++ b/src/java/com/android/ims/rcs/uce/presence/pidfparser/pidf/Tuple.java
@@ -59,11 +59,8 @@
     private List<Note> mNoteList = new ArrayList<>();
     private Timestamp mTimestamp;
 
-    private boolean mMalformed;
-
     public Tuple() {
         mId = getTupleId();
-        mMalformed = false;
     }
 
     @Override
@@ -124,14 +121,6 @@
         return mTimestamp;
     }
 
-    public void setMalformed(boolean malformed) {
-        mMalformed = malformed;
-    }
-
-    public boolean getMalformed() {
-        return mMalformed;
-    }
-
     @Override
     public void serialize(XmlSerializer serializer) throws IOException {
         String namespace = getNamespace();
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java
index dc79433..16d6cea 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfo.java
@@ -20,7 +20,6 @@
 
 import android.content.Context;
 import android.net.Uri;
-import android.telecom.PhoneAccount;
 import android.telecom.TelecomManager;
 import android.telephony.AccessNetworkConstants;
 import android.telephony.ims.ImsRegistrationAttributes;
@@ -144,7 +143,7 @@
     }
 
     public synchronized boolean isImsRegistered() {
-        return mMmtelRegistered || mRcsRegistered;
+        return mMmtelRegistered;
     }
 
     /**
@@ -274,33 +273,10 @@
     }
 
     /**
-     * Get the first URI from the "p-associated-uri" header included in the IMS registration
-     * response.
-     * @param preferTelUri If {@code true}, prefer returning the first TEL URI. If no TEL
-     *                     URIs exist, this method will still return the preferred (first) SIP URI
-     *                     in the header. If {@code false}, we will return the first URI
-     *                     in the "p-associated-uri" header, independent of the URI scheme.
+     * Get the IMS associated URI. It will first get the uri of MMTEL if it is not empty, otherwise
+     * it will try to get the uri of RCS. The null will be returned if both MMTEL and RCS are empty.
      */
-    public synchronized Uri getImsAssociatedUri(boolean preferTelUri) {
-        if (preferTelUri) {
-            if (!mRcsAssociatedUris.isEmpty()) {
-                for (Uri rcsAssociatedUri : mRcsAssociatedUris) {
-                    if (PhoneAccount.SCHEME_TEL.equalsIgnoreCase(rcsAssociatedUri.getScheme())) {
-                        return rcsAssociatedUri;
-                    }
-                }
-            }
-            if (!mMmtelAssociatedUris.isEmpty()) {
-                for (Uri mmtelAssociatedUri : mMmtelAssociatedUris) {
-                    if (PhoneAccount.SCHEME_TEL.equalsIgnoreCase(mmtelAssociatedUri.getScheme())) {
-                        return mmtelAssociatedUri;
-                    }
-                }
-            }
-        }
-
-        // Either we have not found a TEL URI or we do not prefer TEL URIs. Get the first URI from
-        // p-associated-uri list.
+    public synchronized Uri getImsAssociatedUri() {
         if (!mRcsAssociatedUris.isEmpty()) {
             return mRcsAssociatedUris.get(0);
         } else if (!mMmtelAssociatedUris.isEmpty()) {
@@ -497,7 +473,7 @@
 
     // Get the device's capabilities with the PRESENCE mechanism.
     private RcsContactUceCapability getPresenceCapabilities(Context context) {
-        Uri uri = PublishUtils.getDeviceContactUri(context, mSubId, this, true);
+        Uri uri = PublishUtils.getDeviceContactUri(context, mSubId, this);
         if (uri == null) {
             logw("getPresenceCapabilities: uri is empty");
             return null;
@@ -558,7 +534,7 @@
 
     // Get the device's capabilities with the OPTIONS mechanism.
     private RcsContactUceCapability getOptionsCapabilities(Context context) {
-        Uri uri = PublishUtils.getDeviceContactUri(context, mSubId, this, false);
+        Uri uri = PublishUtils.getDeviceContactUri(context, mSubId, this);
         if (uri == null) {
             logw("getOptionsCapabilities: uri is empty");
             return null;
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java
index 442cf7d..e881ae0 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java
@@ -46,7 +46,6 @@
 import android.util.LocalLog;
 import android.util.Log;
 
-import com.android.ims.rcs.uce.UceStatsWriter;
 import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
 import com.android.ims.rcs.uce.presence.publish.PublishController.PublishTriggerType;
 import com.android.ims.rcs.uce.util.UceUtils;
@@ -54,12 +53,7 @@
 import com.android.internal.telephony.util.HandlerExecutor;
 
 import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
 import java.util.Objects;
-import java.util.Set;
 
 /**
  * Listen to the device changes and notify the PublishController to publish the device's
@@ -71,8 +65,6 @@
 
     private static final long REGISTER_IMS_CHANGED_DELAY = 15000L;  // 15 seconds
 
-    private final UceStatsWriter mUceStatsWriter;
-
     /**
      * Used to inject ImsMmTelManager instances for testing.
      */
@@ -107,7 +99,6 @@
         private static final int EVENT_REGISTER_IMS_CONTENT_CHANGE = 1;
         private static final int EVENT_UNREGISTER_IMS_CHANGE = 2;
         private static final int EVENT_REQUEST_PUBLISH = 3;
-        private static final int EVENT_IMS_UNREGISTERED = 4;
 
         DeviceCapabilityHandler(Looper looper) {
             super(looper);
@@ -128,9 +119,6 @@
                     int triggerType = msg.arg1;
                     mCallback.requestPublishFromInternal(triggerType);
                     break;
-                case EVENT_IMS_UNREGISTERED:
-                    mCallback.updateImsUnregistered();
-                    break;
             }
         }
 
@@ -159,14 +147,6 @@
             message.arg1 = type;
             sendMessageDelayed(message, TRIGGER_PUBLISH_REQUEST_DELAY_MS);
         }
-
-        public void sendImsUnregisteredMessage() {
-            logd("sendImsUnregisteredMessage");
-            // Remove the existing message and resend a new message.
-            removeMessages(EVENT_IMS_UNREGISTERED);
-            Message msg = obtainMessage(EVENT_IMS_UNREGISTERED);
-            sendMessageDelayed(msg, TRIGGER_PUBLISH_REQUEST_DELAY_MS);
-        }
     }
 
     private final int mSubId;
@@ -200,7 +180,7 @@
     private final Object mLock = new Object();
 
     public DeviceCapabilityListener(Context context, int subId, DeviceCapabilityInfo info,
-            PublishControllerCallback callback, UceStatsWriter uceStatsWriter) {
+            PublishControllerCallback callback) {
         mSubId = subId;
         logi("create");
 
@@ -208,7 +188,6 @@
         mCallback = callback;
         mCapabilityInfo = info;
         mInitialized = false;
-        mUceStatsWriter = uceStatsWriter;
 
         mHandlerThread = new HandlerThread("DeviceCapListenerThread");
         mHandlerThread.start();
@@ -468,12 +447,6 @@
                     synchronized (mLock) {
                         logi("onRcsRegistered: " + attributes);
                         if (!mIsImsCallbackRegistered) return;
-
-                        List<String> featureTagList = new ArrayList<>(attributes.getFeatureTags());
-                        int registrationTech = attributes.getRegistrationTechnology();
-
-                        mUceStatsWriter.setImsRegistrationFeatureTagStats(
-                                mSubId, featureTagList, registrationTech);
                         handleImsRcsRegistered(attributes);
                     }
                 }
@@ -483,7 +456,6 @@
                     synchronized (mLock) {
                         logi("onRcsUnregistered: " + info);
                         if (!mIsImsCallbackRegistered) return;
-                        mUceStatsWriter.setStoreCompleteImsRegistrationFeatureTagStats(mSubId);
                         handleImsRcsUnregistered();
                     }
                 }
@@ -554,7 +526,6 @@
                         case ProvisioningManager.KEY_VOLTE_PROVISIONING_STATUS:
                         case ProvisioningManager.KEY_VT_PROVISIONING_STATUS:
                             handleProvisioningChanged();
-                            break;
                         case ProvisioningManager.KEY_RCS_PUBLISH_SOURCE_THROTTLE_MS:
                             handlePublishThrottleChanged(value);
                             break;
@@ -614,11 +585,8 @@
         mCapabilityInfo.updateImsMmtelUnregistered();
         // When the MMTEL is unregistered, the mmtel associated uri should be cleared.
         handleMmTelSubscriberAssociatedUriChanged(null, false);
-
-        // If the RCS is already unregistered, it informs that the IMS is unregistered.
-        if (mCapabilityInfo.isImsRegistered() == false) {
-            mHandler.sendImsUnregisteredMessage();
-        }
+        mHandler.sendTriggeringPublishMessage(
+                PublishController.PUBLISH_TRIGGER_MMTEL_UNREGISTERED);
     }
 
     /*
@@ -664,9 +632,10 @@
         boolean hasChanged = mCapabilityInfo.updateImsRcsUnregistered();
         // When the RCS is unregistered, the rcs associated uri should be cleared.
         handleRcsSubscriberAssociatedUriChanged(null, false);
-        // If the MMTEL is already unregistered, it informs that the IMS is unregistered.
-        if (mCapabilityInfo.isImsRegistered() == false) {
-            mHandler.sendImsUnregisteredMessage();
+        // Trigger publish if the state has changed.
+        if (hasChanged) {
+            mHandler.sendTriggeringPublishMessage(
+                    PublishController.PUBLISH_TRIGGER_RCS_UNREGISTERED);
         }
     }
 
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishController.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishController.java
index b20f5ce..7ea9047 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishController.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishController.java
@@ -84,9 +84,6 @@
     /** The Carrier Config for the subscription has Changed **/
     int PUBLISH_TRIGGER_CARRIER_CONFIG_CHANGED = 16;
 
-    /** MMTEL and RCS are unregistered. **/
-    int PUBLISH_TRIGGER_MMTEL_RCS_UNREGISTERED = 17;
-
     @IntDef(value = {
             PUBLISH_TRIGGER_SERVICE,
             PUBLISH_TRIGGER_RETRY,
@@ -103,8 +100,7 @@
             PUBLISH_TRIGGER_RCS_URI_CHANGE,
             PUBLISH_TRIGGER_PROVISIONING_CHANGE,
             PUBLISH_TRIGGER_OVERRIDE_CAPS,
-            PUBLISH_TRIGGER_CARRIER_CONFIG_CHANGED,
-            PUBLISH_TRIGGER_MMTEL_RCS_UNREGISTERED
+            PUBLISH_TRIGGER_CARRIER_CONFIG_CHANGED
     }, prefix="PUBLISH_TRIGGER_")
     @Retention(RetentionPolicy.SOURCE)
     @interface PublishTriggerType {}
@@ -153,16 +149,6 @@
          * Update the device state with the publish request result.
          */
         void refreshDeviceState(int SipCode, String reason);
-
-        /**
-         * Sent the publish request to ImsService.
-         */
-        void notifyPendingPublishRequest();
-
-        /**
-         * Update the Ims unregistered. This api will be called if the IMS unregistered.
-         */
-        void updateImsUnregistered();
     }
 
     /**
@@ -197,7 +183,7 @@
     /**
      * Retrieve the RCS UCE Publish state.
      */
-    @PublishState int getUcePublishState(boolean isSupportPublishingState);
+    @PublishState int getUcePublishState();
 
     /**
      * @return the last PIDF XML used for publish or {@code null} if the device is not published.
@@ -210,12 +196,6 @@
     void onUnpublish();
 
     /**
-     * Notify that the device's publish status have been changed.
-     */
-    void onPublishUpdated(int reasonCode, String reasonPhrase,
-            int reasonHeaderCause, String reasonHeaderText);
-
-    /**
      * Retrieve the device's capabilities.
      */
     RcsContactUceCapability getDeviceCapabilities(@CapabilityMechanism int mechanism);
@@ -228,8 +208,7 @@
     /**
      * Register a {@link PublishStateCallback} to listen to the published state changed.
      */
-    void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c,
-            boolean supportPublishingState);
+    void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c);
 
     /**
      * Removes an existing {@link PublishStateCallback}.
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java
index 034d9ac..e2340ff 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishControllerImpl.java
@@ -44,7 +44,6 @@
 import com.android.ims.rcs.uce.UceController.UceControllerCallback;
 import com.android.ims.rcs.uce.UceDeviceState;
 import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult;
-import com.android.ims.rcs.uce.UceStatsWriter;
 import com.android.ims.rcs.uce.util.UceUtils;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.os.SomeArgs;
@@ -80,8 +79,7 @@
     @VisibleForTesting
     public interface DeviceCapListenerFactory {
         DeviceCapabilityListener createDeviceCapListener(Context context, int subId,
-                DeviceCapabilityInfo capInfo, PublishControllerCallback callback,
-                UceStatsWriter uceStatsWriter);
+                DeviceCapabilityInfo capInfo, PublishControllerCallback callback);
     }
 
     private final int mSubId;
@@ -92,17 +90,11 @@
     private volatile boolean mReceivePublishFromService;
     private volatile RcsFeatureManager mRcsFeatureManager;
     private final UceControllerCallback mUceCtrlCallback;
-    private final UceStatsWriter mUceStatsWriter;
 
     // The capability type that the device is using.
     private @RcsImsCapabilityFlag int mCapabilityType;
     // The device publish state
-    @VisibleForTesting
-    public @PublishState int mLastPublishState;
-    // The device publish state to support the newly added publish state
-    @VisibleForTesting
-    public @PublishState int mCurrentPublishState;
-
+    private @PublishState int mPublishState;
     // The timestamp of updating the publish state
     private Instant mPublishStateUpdatedTime = Instant.now();
     // The last PIDF XML used in the publish
@@ -110,6 +102,7 @@
 
     // The callbacks to notify publish state changed.
     private RemoteCallbackList<IRcsUcePublishStateCallback> mPublishStateCallbacks;
+
     private final Object mPublishStateLock = new Object();
 
     // The information of the device's capabilities.
@@ -122,9 +115,8 @@
 
     // The listener to listen to the device's capabilities changed.
     private DeviceCapabilityListener mDeviceCapListener;
-    private DeviceCapListenerFactory mDeviceCapListenerFactory = (context, subId, capInfo, callback,
-            uceStatsWriter)
-            -> new DeviceCapabilityListener(context, subId, capInfo, callback, uceStatsWriter);
+    private DeviceCapListenerFactory mDeviceCapListenerFactory = (context, subId, capInfo, callback)
+            -> new DeviceCapabilityListener(context, subId, capInfo, callback);
 
     // Listen to the RCS availability status changed.
     private final IImsCapabilityCallback mRcsCapabilitiesCallback =
@@ -149,7 +141,6 @@
         mSubId = subId;
         mContext = context;
         mUceCtrlCallback = callback;
-        mUceStatsWriter = UceStatsWriter.getInstance();
         logi("create");
         initPublishController(looper);
     }
@@ -157,20 +148,18 @@
     @VisibleForTesting
     public PublishControllerImpl(Context context, int subId, UceControllerCallback c,
             Looper looper, DeviceCapListenerFactory deviceCapFactory,
-            PublishProcessorFactory processorFactory, UceStatsWriter instance) {
+            PublishProcessorFactory processorFactory) {
         mSubId = subId;
         mContext = context;
         mUceCtrlCallback = c;
         mDeviceCapListenerFactory = deviceCapFactory;
         mPublishProcessorFactory = processorFactory;
-        mUceStatsWriter = instance;
         initPublishController(looper);
     }
 
     private void initPublishController(Looper looper) {
         mCapabilityType = PublishUtils.getCapabilityType(mContext, mSubId);
-        mCurrentPublishState = getInitialPublishState(mCapabilityType);
-        mLastPublishState = mCurrentPublishState;
+        mPublishState = getInitialPublishState(mCapabilityType);
         mPublishStateCallbacks = new RemoteCallbackList<>();
         mPublishHandler = new PublishHandler(this, looper);
 
@@ -184,7 +173,7 @@
         mDeviceCapListener.initialize();
 
         logd("initPublishController completed: capabilityType=" + mCapabilityType +
-                ", publishState=" + mCurrentPublishState);
+                ", publishState=" + mPublishState);
     }
 
     /**
@@ -211,7 +200,7 @@
 
     private void initDeviceCapabilitiesListener() {
         mDeviceCapListener = mDeviceCapListenerFactory.createDeviceCapListener(mContext, mSubId,
-                mDeviceCapabilityInfo, mPublishControllerCallback, mUceStatsWriter);
+                mDeviceCapabilityInfo, mPublishControllerCallback);
     }
 
     @Override
@@ -239,21 +228,9 @@
     }
 
     @Override
-    public int getUcePublishState(boolean isSupportPublishingState) {
+    public int getUcePublishState() {
         synchronized (mPublishStateLock) {
-            if (mIsDestroyedFlag) {
-                return RcsUceAdapter.PUBLISH_STATE_OTHER_ERROR;
-            }
-            if (isSupportPublishingState) {
-                // in that case, the caller is support Build.VERSION_CODES.S
-                // return the current state that is including newly added publishing state.
-                return mCurrentPublishState;
-            } else {
-                if (mCurrentPublishState == RcsUceAdapter.PUBLISH_STATE_PUBLISHING) {
-                    return mLastPublishState;
-                }
-                return mCurrentPublishState;
-            }
+            return (!mIsDestroyedFlag) ? mPublishState : RcsUceAdapter.PUBLISH_STATE_OTHER_ERROR;
         }
     }
 
@@ -299,16 +276,15 @@
      * Register a {@link PublishStateCallback} to listen to the published state changed.
      */
     @Override
-    public void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c,
-            boolean supportPublishingState) {
+    public void registerPublishStateCallback(@NonNull IRcsUcePublishStateCallback c) {
         synchronized (mPublishStateLock) {
             if (mIsDestroyedFlag) return;
-            mPublishStateCallbacks.register(c, new Boolean(supportPublishingState));
+            mPublishStateCallbacks.register(c);
             logd("registerPublishStateCallback: size="
                     + mPublishStateCallbacks.getRegisteredCallbackCount());
         }
         // Notify the current publish state
-        mPublishHandler.sendNotifyCurrentPublishStateMessage(c, supportPublishingState);
+        mPublishHandler.sendNotifyCurrentPublishStateMessage(c);
     }
 
     /**
@@ -319,8 +295,6 @@
         synchronized (mPublishStateLock) {
             if (mIsDestroyedFlag) return;
             mPublishStateCallbacks.unregister(c);
-            logd("unregisterPublishStateCallback:mPublishStateCallbacks: size="
-                    + mPublishStateCallbacks.getRegisteredCallbackCount());
         }
     }
 
@@ -356,18 +330,8 @@
     public void onUnpublish() {
         logd("onUnpublish");
         if (mIsDestroyedFlag) return;
-        mPublishHandler.sendUnpublishedMessage(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED);
-    }
-
-    /**
-     * Notify that the device's publish status have been changed.
-     */
-    @Override
-    public void onPublishUpdated(int reasonCode, String reasonPhrase,
-            int reasonHeaderCause, String reasonHeaderText) {
-        if (mIsDestroyedFlag) return;
-        mPublishHandler.sendPublishUpdatedMessage(reasonCode, reasonPhrase, reasonHeaderCause,
-                reasonHeaderText);
+        mPublishHandler.sendPublishStateChangedMessage(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED,
+                Instant.now(), null /*pidfXml*/);
     }
 
     @Override
@@ -428,18 +392,6 @@
                     mUceCtrlCallback.refreshDeviceState(sipCode, reason,
                             UceController.REQUEST_TYPE_PUBLISH);
                 }
-
-                @Override
-                public void notifyPendingPublishRequest() {
-                    logd("notifyPendingPublishRequest");
-                    mPublishHandler.sendPublishSentMessage();
-                }
-
-                @Override
-                public void updateImsUnregistered() {
-                    logd("updateImsUnregistered");
-                    mPublishHandler.sendImsUnregisteredMessage();
-                }
             };
 
     /**
@@ -464,10 +416,6 @@
         private static final int MSG_REQUEST_NETWORK_RESPONSE = 10;
         private static final int MSG_REQUEST_CANCELED = 11;
         private static final int MSG_RESET_DEVICE_STATE = 12;
-        private static final int MSG_UNPUBLISHED = 13;
-        private static final int MSG_PUBLISH_SENT = 14;
-        private static final int MSG_PUBLISH_UPDATED = 15;
-        private static final int MSG_IMS_UNREGISTERED = 16;
 
         private final WeakReference<PublishControllerImpl> mPublishControllerRef;
 
@@ -521,11 +469,7 @@
                 }
                 case MSG_NOTIFY_CURRENT_PUBLISH_STATE:
                     IRcsUcePublishStateCallback c = (IRcsUcePublishStateCallback) message.obj;
-                    boolean supportPublishingState = false;
-                    if (message.arg1 == 1) {
-                        supportPublishingState = true;
-                    }
-                    publishCtrl.handleNotifyCurrentPublishStateMessage(c, supportPublishingState);
+                    publishCtrl.handleNotifyCurrentPublishStateMessage(c);
                     break;
 
                 case MSG_REQUEST_PUBLISH:
@@ -552,36 +496,6 @@
                     publishCtrl.handleResetDeviceStateMessage();
                     break;
 
-                case MSG_UNPUBLISHED: {
-                    SomeArgs args = (SomeArgs) message.obj;
-                    int newPublishState = (Integer) args.arg1;
-                    Instant updatedTimestamp = (Instant) args.arg2;
-                    args.recycle();
-                    publishCtrl.handleUnpublishedMessage(newPublishState, updatedTimestamp);
-                    break;
-                }
-
-                case MSG_PUBLISH_SENT:
-                    publishCtrl.handlePublishSentMessage();
-                    break;
-
-                case MSG_PUBLISH_UPDATED: {
-                    SomeArgs args = (SomeArgs) message.obj;
-                    int reasonCode = (Integer) args.arg1;
-                    String reasonPhrase = (String) args.arg2;
-                    int reasonHeaderCause = (Integer) args.arg3;
-                    String reasonHeaderText = (String) args.arg4;
-                    args.recycle();
-                    publishCtrl.handlePublishUpdatedMessage(reasonCode, reasonPhrase,
-                            reasonHeaderCause, reasonHeaderText);
-                    break;
-                }
-
-                case MSG_IMS_UNREGISTERED:
-                    publishCtrl.handleUnpublishedMessage(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED,
-                            Instant.now());
-                    break;
-
                 default:
                     publishCtrl.logd("invalid message: " + message.what);
                     break;
@@ -670,70 +584,20 @@
         }
 
         /**
-         * Send the message to notify the publish state is changed.
-         */
-        public void sendUnpublishedMessage(@PublishState int publishState) {
-            PublishControllerImpl publishCtrl = mPublishControllerRef.get();
-            if (publishCtrl == null) return;
-            if (publishCtrl.mIsDestroyedFlag) return;
-
-            SomeArgs args = SomeArgs.obtain();
-            args.arg1 = publishState;
-            args.arg2 = Instant.now();
-            Message message = obtainMessage();
-            message.what = MSG_UNPUBLISHED;
-            message.obj = args;
-            sendMessage(message);
-        }
-
-        /**
-         * Send the message to notify the publish state is changed.
-         */
-        public void sendPublishUpdatedMessage(int reasonCode, String reasonPhrase,
-                int reasonHeaderCause, String reasonHeaderText) {
-            PublishControllerImpl publishCtrl = mPublishControllerRef.get();
-            if (publishCtrl == null) return;
-            if (publishCtrl.mIsDestroyedFlag) return;
-
-            SomeArgs args = SomeArgs.obtain();
-            args.arg1 = reasonCode;
-            args.arg2 = reasonPhrase;
-            args.arg3 = reasonHeaderCause;
-            args.arg4 = reasonHeaderText;
-            Message message = obtainMessage();
-            message.what = MSG_PUBLISH_UPDATED;
-            message.obj = args;
-            sendMessage(message);
-        }
-
-        /**
          * Send the message to notify the new added callback of the latest publish state.
          */
         public void sendNotifyCurrentPublishStateMessage(
-                IRcsUcePublishStateCallback callback, boolean supportPublishingState) {
+                IRcsUcePublishStateCallback callback) {
             PublishControllerImpl publishCtrl = mPublishControllerRef.get();
             if (publishCtrl == null) return;
             if (publishCtrl.mIsDestroyedFlag) return;
 
             Message message = obtainMessage();
             message.what = MSG_NOTIFY_CURRENT_PUBLISH_STATE;
-            message.arg1 = supportPublishingState ? 1 : 0;
             message.obj = callback;
             sendMessage(message);
         }
 
-        /**
-         * Send the message that the publish request has been sent to the ImsService.
-         */
-        public void sendPublishSentMessage() {
-            PublishControllerImpl publishCtrl = mPublishControllerRef.get();
-            if (publishCtrl == null) return;
-            if (publishCtrl.mIsDestroyedFlag) return;
-            Message message = obtainMessage();
-            message.what = MSG_PUBLISH_SENT;
-            sendMessage(message);
-        }
-
         public void sendPublishMessage(@PublishTriggerType int type) {
             sendPublishMessage(type, 0L);
         }
@@ -825,15 +689,6 @@
             removeMessages(MSG_RESET_DEVICE_STATE);
         }
 
-        public void sendImsUnregisteredMessage() {
-            PublishControllerImpl publishCtrl = mPublishControllerRef.get();
-            if (publishCtrl == null) return;
-            if (publishCtrl.mIsDestroyedFlag) return;
-            Message message = obtainMessage();
-            message.what = MSG_IMS_UNREGISTERED;
-            sendMessage(message);
-        }
-
         private static Map<Integer, String> EVENT_DESCRIPTION = new HashMap<>();
         static {
             EVENT_DESCRIPTION.put(MSG_RCS_CONNECTED, "RCS_CONNECTED");
@@ -848,10 +703,6 @@
             EVENT_DESCRIPTION.put(MSG_REQUEST_NETWORK_RESPONSE, "REQUEST_NETWORK_RESPONSE");
             EVENT_DESCRIPTION.put(MSG_REQUEST_CANCELED, "REQUEST_CANCELED");
             EVENT_DESCRIPTION.put(MSG_RESET_DEVICE_STATE, "RESET_DEVICE_STATE");
-            EVENT_DESCRIPTION.put(MSG_UNPUBLISHED, "MSG_UNPUBLISHED");
-            EVENT_DESCRIPTION.put(MSG_PUBLISH_SENT, "MSG_PUBLISH_SENT");
-            EVENT_DESCRIPTION.put(MSG_PUBLISH_UPDATED, "MSG_PUBLISH_UPDATED");
-            EVENT_DESCRIPTION.put(MSG_IMS_UNREGISTERED, "MSG_IMS_UNREGISTERED");
         }
     }
 
@@ -874,7 +725,7 @@
 
         // Check whether the device state is not allowed to execute the PUBLISH request.
         DeviceStateResult deviceState = mUceCtrlCallback.getDeviceState();
-        if (deviceState.isRequestForbidden() || deviceState.isPublishRequestBlocked()) {
+        if (deviceState.isRequestForbidden()) {
             logd("isPublishRequestAllowed: The device state is disallowed. "
                     + deviceState.getDeviceState());
             return false;
@@ -1050,24 +901,20 @@
                         + ", publishState=" + newPublishState);
                 return;
             }
-            logd("publish state changes from " + mCurrentPublishState + " to " + newPublishState +
+            logd("publish state changes from " + mPublishState + " to " + newPublishState +
                     ", time=" + updatedTimestamp);
             mPublishStateUpdatedTime = updatedTimestamp;
             mPidfXml = pidfXml;
             // Bail early and do not update listeners if the publish state didn't change.
-            if (mCurrentPublishState == newPublishState) return;
-            mLastPublishState = mCurrentPublishState;
-            mCurrentPublishState = newPublishState;
-        }
-        if (newPublishState == RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED) {
-            mUceStatsWriter.setUnPublish(mSubId);
+            if (mPublishState == newPublishState) return;
+            mPublishState = newPublishState;
         }
 
         // Trigger the publish state changed in handler thread since it may take time.
-        logd("Notify publish state changed: " + mCurrentPublishState);
+        logd("Notify publish state changed: " + mPublishState);
         mPublishStateCallbacks.broadcast(c -> {
             try {
-                c.onPublishStateChanged(mCurrentPublishState);
+                c.onPublishStateChanged(mPublishState);
             } catch (RemoteException e) {
                 logw("Notify publish state changed error: " + e);
             }
@@ -1075,11 +922,10 @@
         logd("Notify publish state changed: completed");
     }
 
-    private void handleNotifyCurrentPublishStateMessage(IRcsUcePublishStateCallback callback,
-            boolean supportPublishingState) {
+    private void handleNotifyCurrentPublishStateMessage(IRcsUcePublishStateCallback callback) {
         if (mIsDestroyedFlag || callback == null) return;
         try {
-            callback.onPublishStateChanged(getUcePublishState(supportPublishingState));
+            callback.onPublishStateChanged(getUcePublishState());
         } catch (RemoteException e) {
             logw("handleCurrentPublishStateUpdateMessage exception: " + e);
         }
@@ -1099,7 +945,7 @@
             }
             // Reset device state
             DeviceStateResult deviceState = mUceCtrlCallback.getDeviceState();
-            if (deviceState.isRequestForbidden() || deviceState.isPublishRequestBlocked()) {
+            if (deviceState.isRequestForbidden()) {
                 mUceCtrlCallback.resetDeviceState();
             }
         }
@@ -1142,71 +988,10 @@
         mUceCtrlCallback.resetDeviceState();
     }
 
-    private void handleUnpublishedMessage(@PublishState int newPublishState,
-            Instant updatedTimestamp) {
-        if (mIsDestroyedFlag) return;
-        mPublishProcessor.resetState();
-        handlePublishStateChangedMessage(newPublishState, updatedTimestamp, null);
-    }
-
-    private void handlePublishSentMessage() {
-        synchronized (mPublishStateLock) {
-            if (mIsDestroyedFlag) return;
-            int lastIndex = mPublishStateCallbacks.getRegisteredCallbackCount() - 1;
-            int tempPublishState = mCurrentPublishState;
-            for (int index = lastIndex; index >= 0; index--) {
-                IRcsUcePublishStateCallback callback =
-                        mPublishStateCallbacks.getRegisteredCallbackItem(index);
-                boolean isSupportPublishingState = false;
-                try {
-                    Object object = mPublishStateCallbacks.getRegisteredCallbackCookie(index);
-                    if (object != null) {
-                        isSupportPublishingState = (Boolean) object;
-                    }
-                } catch (Exception e) {
-                    // Do not handle the exception
-                }
-                try {
-                    mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_PUBLISHING;
-                    if (isSupportPublishingState) {
-                        if (callback != null) {
-                            callback.onPublishStateChanged(mCurrentPublishState);
-                        }
-                    } else {
-                        // If it is currently PUBLISH_STATE_OK, the state must not be changed to
-                        // PUBLISH_STATE_NOT_PUBLISHED.
-                        // And in the case of the current PUBLISH_STATE_NOT_PUBLISHED, it is
-                        // necessary to avoid reporting the duplicate state.
-                        if (tempPublishState != RcsUceAdapter.PUBLISH_STATE_OK
-                                && tempPublishState != RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED) {
-                            // set the state to PUBLISH_STATE_NOT_PUBLISHED so that
-                            // getUcePublishState is consistent with the callback
-                            mLastPublishState = RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED;
-                            if (callback != null) {
-                                callback.onPublishStateChanged(mLastPublishState);
-                            }
-                        }
-                    }
-                } catch (RemoteException e) {
-                    logw("Notify publish state changed error: " + e);
-                }
-            }
-        }
-    }
-
-    private void handlePublishUpdatedMessage(int reasonCode, String reasonPhrase,
-            int reasonHeaderCause, String reasonHeaderText) {
-        if (mIsDestroyedFlag) return;
-        PublishRequestResponse updatedPublish = new PublishRequestResponse(getLastPidfXml(),
-                reasonCode, reasonPhrase, reasonHeaderCause, reasonHeaderText);
-        mPublishProcessor.publishUpdated(updatedPublish);
-    }
-
     @VisibleForTesting
     public void setCapabilityType(int type) {
         mCapabilityType = type;
-        mCurrentPublishState = getInitialPublishState(mCapabilityType);
-        mLastPublishState = mCurrentPublishState;
+        mPublishState = getInitialPublishState(mCapabilityType);
     }
 
     @VisibleForTesting
@@ -1259,10 +1044,8 @@
 
         pw.print("isPresenceCapable=");
         pw.println(mDeviceCapabilityInfo.isPresenceCapable());
-        pw.print("mCurrentPublishState=");
-        pw.print(mCurrentPublishState);
-        pw.print("mLastPublishState=");
-        pw.print(mLastPublishState);
+        pw.print("mPublishState=");
+        pw.print(mPublishState);
         pw.print(" at time ");
         pw.println(mPublishStateUpdatedTime);
         pw.println("Last PIDF XML:");
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java
index d87eea9..68aeaa8 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessor.java
@@ -22,15 +22,12 @@
 import android.content.Context;
 import android.os.RemoteException;
 import android.telephony.ims.RcsContactUceCapability;
-import android.telephony.ims.stub.ImsRegistrationImplBase;
-import android.telephony.ims.stub.RcsCapabilityExchangeImplBase;
 import android.text.TextUtils;
 import android.util.IndentingPrintWriter;
 import android.util.LocalLog;
 import android.util.Log;
 
 import com.android.ims.RcsFeatureManager;
-import com.android.ims.rcs.uce.UceStatsWriter;
 import com.android.ims.rcs.uce.presence.pidfparser.PidfParser;
 import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
 import com.android.ims.rcs.uce.presence.publish.PublishController.PublishTriggerType;
@@ -56,8 +53,6 @@
     private volatile boolean mIsDestroyed;
     private volatile RcsFeatureManager mRcsFeatureManager;
 
-    private final UceStatsWriter mUceStatsWriter;
-
     // Manage the state of the publish processor.
     private PublishProcessorState mProcessorState;
 
@@ -79,18 +74,6 @@
         mDeviceCapabilities = capabilityInfo;
         mPublishCtrlCallback = publishCtrlCallback;
         mProcessorState = new PublishProcessorState(subId);
-        mUceStatsWriter = UceStatsWriter.getInstance();
-    }
-
-    @VisibleForTesting
-    public PublishProcessor(Context context, int subId, DeviceCapabilityInfo capabilityInfo,
-            PublishControllerCallback publishCtrlCallback, UceStatsWriter instance) {
-        mSubId = subId;
-        mContext = context;
-        mDeviceCapabilities = capabilityInfo;
-        mPublishCtrlCallback = publishCtrlCallback;
-        mProcessorState = new PublishProcessorState(subId);
-        mUceStatsWriter = instance;
     }
 
     /**
@@ -175,13 +158,6 @@
             return false;
         }
 
-        featureManager.getImsRegistrationTech((tech) -> {
-            int registrationTech = (tech == null)
-                    ? ImsRegistrationImplBase.REGISTRATION_TECH_NONE : tech;
-            mUceStatsWriter.setImsRegistrationServiceDescStats(mSubId,
-                    deviceCapability.getCapabilityTuples(), registrationTech);
-        });
-
         // Publish to the Presence server.
         return publishCapabilities(featureManager, pidfXml);
     }
@@ -199,7 +175,7 @@
 
         // Check if it has provisioned. When the provisioning changes, a new publish request will
         // be triggered.
-        if (!isEabProvisioned()) {
+        if (!UceUtils.isEabProvisioned(mContext, mSubId)) {
             logd("isPublishAllowed: NOT provisioned");
             return false;
         }
@@ -241,9 +217,6 @@
 
             // Send a request canceled timer to avoid waiting too long for the response callback.
             mPublishCtrlCallback.setupRequestCanceledTimer(taskId, RESPONSE_CALLBACK_WAITING_TIME);
-
-            // Inform that the publish request has been sent to the Ims Service.
-            mPublishCtrlCallback.notifyPendingPublishRequest();
             return true;
         } catch (RemoteException e) {
             mLocalLog.log("publish capability exception: " + e.getMessage());
@@ -271,13 +244,6 @@
         mLocalLog.log("Receive command error code=" + requestResponse.getCmdErrorCode());
         logd("onCommandError: " + requestResponse.toString());
 
-        int cmdError = requestResponse.getCmdErrorCode().orElse(0);
-        boolean successful = false;
-        if (cmdError == RcsCapabilityExchangeImplBase.COMMAND_CODE_NO_CHANGE) {
-            successful = true;
-        }
-        mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.PUBLISH_EVENT, successful, cmdError, 0);
-
         if (requestResponse.needRetry() && !mProcessorState.isReachMaximumRetries()) {
             handleRequestRespWithRetry(requestResponse);
         } else {
@@ -301,10 +267,6 @@
         mLocalLog.log("Receive network response code=" + requestResponse.getNetworkRespSipCode());
         logd("onNetworkResponse: " + requestResponse.toString());
 
-        int responseCode = requestResponse.getNetworkRespSipCode().orElse(0);
-        mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.PUBLISH_EVENT, true, 0,
-            responseCode);
-
         if (requestResponse.needRetry() && !mProcessorState.isReachMaximumRetries()) {
             handleRequestRespWithRetry(requestResponse);
         } else {
@@ -362,32 +324,28 @@
      * request response and it does not need to retry.
      */
     private void handleRequestRespWithoutRetry(PublishRequestResponse requestResponse) {
-        updatePublishStateFromResponse(requestResponse);
-        // Finish the request and check if there is pending request.
-        setRequestEnded(requestResponse);
-        checkAndSendPendingRequest();
-    }
-
-    // After checking the response, it handles calling PublishCtrlCallback.
-    private void updatePublishStateFromResponse(PublishRequestResponse response) {
-        Instant responseTime = response.getResponseTimestamp();
+        Instant responseTime = requestResponse.getResponseTimestamp();
 
         // Record the time when the request is successful and reset the retry count.
-        if (response.isRequestSuccess()) {
+        if (requestResponse.isRequestSuccess()) {
             mProcessorState.setLastPublishedTime(responseTime);
             mProcessorState.resetRetryCount();
         }
 
         // Update the publish state after the request has finished.
-        int publishState = response.getPublishState();
-        String pidfXml = response.getPidfXml();
+        int publishState = requestResponse.getPublishState();
+        String pidfXml = requestResponse.getPidfXml();
         mPublishCtrlCallback.updatePublishRequestResult(publishState, responseTime, pidfXml);
 
         // Refresh the device state with the publish request result.
-        response.getResponseSipCode().ifPresent(sipCode -> {
-            String reason = response.getResponseReason().orElse("");
+        requestResponse.getResponseSipCode().ifPresent(sipCode -> {
+            String reason = requestResponse.getResponseReason().orElse("");
             mPublishCtrlCallback.refreshDeviceState(sipCode, reason);
         });
+
+        // Finish the request and check if there is pending request.
+        setRequestEnded(requestResponse);
+        checkAndSendPendingRequest();
     }
 
     /**
@@ -487,33 +445,11 @@
         return mProcessorState.isPublishingNow();
     }
 
-    /**
-     * Reset the retry count and time related publish.
-     */
-    public void resetState() {
-        mProcessorState.resetState();
-    }
-
-    /**
-     * Update publish status after handling on onPublishUpdate case
-     */
-    public void publishUpdated(PublishRequestResponse response) {
-        updatePublishStateFromResponse(response);
-        if (response != null) {
-            response.onDestroy();
-        }
-    }
-
     @VisibleForTesting
     public void setProcessorState(PublishProcessorState processorState) {
         mProcessorState = processorState;
     }
 
-    @VisibleForTesting
-    protected boolean isEabProvisioned() {
-        return UceUtils.isEabProvisioned(mContext, mSubId);
-    }
-
     private void logd(String log) {
        Log.d(LOG_TAG, getLogPrefix().append(log).toString());
     }
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessorState.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessorState.java
index 0e9adfa..40d901f 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessorState.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishProcessorState.java
@@ -348,16 +348,6 @@
         }
     }
 
-    /**
-     * Reset the retry count and related time when the publication status has
-     * changed to not_published.
-     */
-    public void resetState() {
-        synchronized (mLock) {
-            mPublishThrottle.resetState();
-        }
-    }
-
     /*
      * Check if it has reached the maximum retry count.
      */
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java
index 47aa37c..a05a8d3 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishRequestResponse.java
@@ -20,7 +20,6 @@
 import android.telephony.ims.RcsUceAdapter;
 import android.telephony.ims.aidl.IPublishResponseCallback;
 import android.telephony.ims.stub.RcsCapabilityExchangeImplBase;
-import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
@@ -63,29 +62,6 @@
         mReasonHeaderText = Optional.empty();
     }
 
-    public PublishRequestResponse(String pidfXml, int sipCode, String reasonPhrase,
-            int reasonHeaderCause, String reasonHeaderText) {
-        mTaskId = 0L;
-        mPublishCtrlCallback = null;
-        mCmdErrorCode = Optional.empty();
-
-        mPidfXml = pidfXml;
-        mResponseTimestamp = Instant.now();
-        mNetworkRespSipCode = Optional.of(sipCode);
-        mReasonPhrase = Optional.ofNullable(reasonPhrase);
-        if (reasonHeaderCause != 0) {
-            mReasonHeaderCause = Optional.of(reasonHeaderCause);
-        } else {
-            mReasonHeaderCause = Optional.empty();
-        }
-        if (TextUtils.isEmpty(reasonHeaderText)) {
-            mReasonHeaderText = Optional.empty();
-        } else {
-            mReasonHeaderText = Optional.ofNullable(reasonHeaderText);
-        }
-
-    }
-
     // The result callback of the publish capability request.
     private IPublishResponseCallback mResponseCallback = new IPublishResponseCallback.Stub() {
         @Override
@@ -199,13 +175,6 @@
     }
 
     private void onNetworkResponse(int sipCode, String reason) {
-        // When we send a request to PUBLISH and there is no change to the UCE capabilities, we
-        // expected onCommandError() with COMMAND_CODE_NO_CHANGE.
-        // But some of the vendor will instead send SIP code 999.
-        if (sipCode == 999) {
-            onCommandError(RcsCapabilityExchangeImplBase.COMMAND_CODE_NO_CHANGE);
-            return;
-        }
         mResponseTimestamp = Instant.now();
         mNetworkRespSipCode = Optional.of(sipCode);
         mReasonPhrase = Optional.ofNullable(reason);
@@ -221,13 +190,6 @@
 
     private void onNetworkResponse(int sipCode, String reasonPhrase, int reasonHeaderCause,
             String reasonHeaderText) {
-        // When we send a request to PUBLISH and there is no change to the UCE capabilities, we
-        // expected onCommandError() with COMMAND_CODE_NO_CHANGE.
-        // But some of the vendor will instead send SIP code 999.
-        if (sipCode == 999) {
-            onCommandError(RcsCapabilityExchangeImplBase.COMMAND_CODE_NO_CHANGE);
-            return;
-        }
         mResponseTimestamp = Instant.now();
         mNetworkRespSipCode = Optional.of(sipCode);
         mReasonPhrase = Optional.ofNullable(reasonPhrase);
@@ -352,7 +314,6 @@
                 return RcsUceAdapter.PUBLISH_STATE_OK;
             case NetworkSipCode.SIP_CODE_FORBIDDEN:
             case NetworkSipCode.SIP_CODE_NOT_FOUND:
-            case NetworkSipCode.SIP_CODE_SERVER_TIMEOUT:
                 return RcsUceAdapter.PUBLISH_STATE_RCS_PROVISION_ERROR;
             case NetworkSipCode.SIP_CODE_REQUEST_TIMEOUT:
                 return RcsUceAdapter.PUBLISH_STATE_REQUEST_TIMEOUT;
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker.java
index a107b1a..d527e6a 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTracker.java
@@ -53,7 +53,7 @@
      */
     private static final Map<ServiceDescription, Set<String>> DEFAULT_SERVICE_DESCRIPTION_MAP;
     static {
-        ArrayMap<ServiceDescription, Set<String>> map = new ArrayMap<>(21);
+        ArrayMap<ServiceDescription, Set<String>> map = new ArrayMap<>(19);
         map.put(ServiceDescription.SERVICE_DESCRIPTION_CHAT_IM,
                 Collections.singleton(FeatureTags.FEATURE_TAG_CHAT_IM));
         map.put(ServiceDescription.SERVICE_DESCRIPTION_CHAT_SESSION,
@@ -83,32 +83,22 @@
                 Collections.singleton(FeatureTags.FEATURE_TAG_SHARED_MAP));
         map.put(ServiceDescription.SERVICE_DESCRIPTION_SHARED_SKETCH,
                 Collections.singleton(FeatureTags.FEATURE_TAG_SHARED_SKETCH));
-        // A map has one key and one value. And if the same key is used, the value is replaced
-        // with a new one.
-        // The service description between SERVICE_DESCRIPTION_CHATBOT_SESSION and
-        // SERVICE_DESCRIPTION_CHATBOT_SESSION_V1 is the same, but this is for botVersion=#1 .
+        // Feature tags defined twice for chatbot session because we want v1 and v2 based on bot
+        // version
         map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION, new ArraySet<>(
                 Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_SESSION,
                         FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED)));
-        // This is the service description for botVersion=#1,#2 .
-        map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V1, new ArraySet<>(
-                Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_SESSION,
-                        FeatureTags.FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED)));
         map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V2, new ArraySet<>(
                 Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_SESSION,
-                        FeatureTags.FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED)));
-        // The service description between SERVICE_DESCRIPTION_CHATBOT_SA_SESSION and
-        // SERVICE_DESCRIPTION_CHATBOT_SA_SESSION_V1 is the same, but this is for botVersion=#1 .
+                        FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED)));
+        // Feature tags defined twice for chatbot sa session because we want v1 and v2 based on bot
+        // version
         map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SA_SESSION, new ArraySet<>(
                 Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_STANDALONE_MSG,
                         FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED)));
-        // This is the service description for botVersion=#1,#2 .
-        map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SA_SESSION_V1, new ArraySet<>(
-                Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_STANDALONE_MSG,
-                        FeatureTags.FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED)));
         map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SA_SESSION_V2, new ArraySet<>(
                 Arrays.asList(FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_STANDALONE_MSG,
-                        FeatureTags.FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED)));
+                        FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED)));
         map.put(ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_ROLE,
                 Collections.singleton(FeatureTags.FEATURE_TAG_CHATBOT_ROLE));
         DEFAULT_SERVICE_DESCRIPTION_MAP = Collections.unmodifiableMap(map);
@@ -193,6 +183,7 @@
                 .map(PublishServiceDescTracker::parseFeatureTags)
                 // Each entry should only contain one feature tag.
                 .map(s -> s.iterator().next()).collect(Collectors.toSet());
+
         // For aliased service descriptions (service-id && version is the same, but desc is
         // different), Keep a "score" of the number of feature tags that the service description
         // has associated with it. If another is found with a higher score, replace this one.
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/PublishUtils.java b/src/java/com/android/ims/rcs/uce/presence/publish/PublishUtils.java
index 1a67a40..ea1d11b 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/PublishUtils.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/PublishUtils.java
@@ -18,7 +18,6 @@
 
 import android.content.Context;
 import android.net.Uri;
-import android.telecom.PhoneAccount;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
 import android.telephony.ims.feature.RcsFeature.RcsImsCapabilities;
@@ -26,9 +25,6 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import com.android.i18n.phonenumbers.NumberParseException;
-import com.android.i18n.phonenumbers.PhoneNumberUtil;
-import com.android.i18n.phonenumbers.Phonenumber;
 import com.android.ims.rcs.uce.util.UceUtils;
 
 import java.util.Arrays;
@@ -43,49 +39,29 @@
     private static final String SCHEME_TEL = "tel";
     private static final String DOMAIN_SEPARATOR = "@";
 
-    /**
-     * @return the contact URI of this device for either a PRESENCE or OPTIONS capabilities request.
-     * We will first try to use the IMS service associated URIs from the p-associated-uri header
-     * in the IMS registration response. If this is not available, we will fall back to using the
-     * SIM card information to generate the URI.
-     */
     public static Uri getDeviceContactUri(Context context, int subId,
-            DeviceCapabilityInfo deviceCap, boolean isForPresence) {
-        boolean preferTelUri = false;
-        if (isForPresence) {
-            preferTelUri = UceUtils.isTelUriForPidfXmlEnabled(context, subId);
-        }
-        // Get the uri from the IMS p-associated-uri header which is provided by the IMS service.
-        Uri contactUri = deviceCap.getImsAssociatedUri(preferTelUri);
+            DeviceCapabilityInfo deviceCap) {
+        // Get the uri from the IMS associated URI which is provided by the IMS service.
+        Uri contactUri = deviceCap.getImsAssociatedUri();
         if (contactUri != null) {
-            Uri convertedUri = preferTelUri ? getConvertedTelUri(context, contactUri) : contactUri;
-            Log.d(LOG_TAG, "getDeviceContactUri: returning "
-                    + (contactUri.equals(convertedUri) ? "found" : "converted")
-                    + " ims associated uri");
+            Log.d(LOG_TAG, "getDeviceContactUri: ims associated uri");
             return contactUri;
         }
 
-        // No IMS service provided URIs, so generate the contact uri from ISIM.
         TelephonyManager telephonyManager = getTelephonyManager(context, subId);
         if (telephonyManager == null) {
             Log.w(LOG_TAG, "getDeviceContactUri: TelephonyManager is null");
             return null;
         }
+
+        // Get the contact uri from ISIM.
         contactUri = getContactUriFromIsim(telephonyManager);
         if (contactUri != null) {
             Log.d(LOG_TAG, "getDeviceContactUri: impu");
-            if (preferTelUri) {
-                return getConvertedTelUri(context, contactUri);
-            } else {
-                return contactUri;
-            }
+            return contactUri;
         } else {
             Log.d(LOG_TAG, "getDeviceContactUri: line number");
-            if (preferTelUri) {
-                return getConvertedTelUri(context, getContactUriFromLine1Number(telephonyManager));
-            } else {
-                return getContactUriFromLine1Number(telephonyManager);
-            }
+            return getContactUriFromLine1Number(telephonyManager);
         }
     }
 
@@ -160,41 +136,6 @@
         }
     }
 
-    /**
-     * @return a TEL URI version of the contact URI if given a SIP URI. If given a TEL URI, this
-     * method will return the same value given.
-     */
-    private static Uri getConvertedTelUri(Context context, Uri contactUri) {
-        if (contactUri == null) {
-            return null;
-        }
-        if (contactUri.getScheme().equalsIgnoreCase(SCHEME_SIP)) {
-            TelephonyManager manager = context.getSystemService(TelephonyManager.class);
-            if (manager.getIsimDomain() == null) {
-                return contactUri;
-            }
-
-            String numbers = contactUri.getSchemeSpecificPart();
-            String[] numberParts = numbers.split("[@;:]");
-            String number = numberParts[0];
-
-            String simCountryIso = manager.getSimCountryIso();
-            if (!TextUtils.isEmpty(simCountryIso)) {
-                simCountryIso = simCountryIso.toUpperCase();
-                PhoneNumberUtil util = PhoneNumberUtil.getInstance();
-                try {
-                    Phonenumber.PhoneNumber phoneNumber = util.parse(number, simCountryIso);
-                    number = util.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.E164);
-                    String telUri = SCHEME_TEL + ":" + number;
-                    contactUri = Uri.parse(telUri);
-                } catch (NumberParseException e) {
-                    Log.w(LOG_TAG, "formatNumber: could not format " + number + ", error: " + e);
-                }
-            }
-        }
-        return contactUri;
-    }
-
     static @RcsImsCapabilityFlag int getCapabilityType(Context context, int subId) {
         boolean isPresenceSupported = UceUtils.isPresenceSupported(context, subId);
         boolean isSipOptionsSupported = UceUtils.isSipOptionsSupported(context, subId);
diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java b/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java
index 0f271e1..aa08f3a 100644
--- a/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java
+++ b/src/java/com/android/ims/rcs/uce/presence/publish/ServiceDescription.java
@@ -117,8 +117,7 @@
                     "1.0" /*version*/,
                     null /*description*/
     );
-    // this is the same as below but redefined so that it can be a separate key entry
-    // in DEFAULT_SERVICE_DESCRIPTION_MAP
+
     public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SESSION =
             new ServiceDescription(
                     RcsContactPresenceTuple.SERVICE_ID_CHATBOT,
@@ -126,41 +125,26 @@
                     null /*description*/
     );
 
-    public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SESSION_V1 =
-            new ServiceDescription(
-                    RcsContactPresenceTuple.SERVICE_ID_CHATBOT,
-                    "1.0" /*version*/,
-                    "Chatbot Session" /*description*/
-            );
-
     public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SESSION_V2 =
             new ServiceDescription(
                     RcsContactPresenceTuple.SERVICE_ID_CHATBOT,
                     "2.0" /*version*/,
-                    "Chatbot Session" /*description*/
-    );
-    // this is the same as below but redefined so that it can be a separate key entry
-    // in DEFAULT_SERVICE_DESCRIPTION_MAP
+                    null /*description*/
+            );
+
     public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SA_SESSION =
             new ServiceDescription(
                     RcsContactPresenceTuple.SERVICE_ID_CHATBOT_STANDALONE.trim(),
                     "1.0" /*version*/,
                     null /*description*/
-    );
-
-    public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SA_SESSION_V1 =
-            new ServiceDescription(
-                    RcsContactPresenceTuple.SERVICE_ID_CHATBOT_STANDALONE.trim(),
-                    "1.0" /*version*/,
-                    "Chatbot Standalone" /*description*/
-    );
+            );
 
     public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_SA_SESSION_V2 =
             new ServiceDescription(
                     RcsContactPresenceTuple.SERVICE_ID_CHATBOT_STANDALONE.trim(),
                     "2.0" /*version*/,
-                    "Chatbot Standalone" /*description*/
-    );
+                    null /*description*/
+            );
 
     public static final ServiceDescription SERVICE_DESCRIPTION_CHATBOT_ROLE =
             new ServiceDescription(
diff --git a/src/java/com/android/ims/rcs/uce/request/CapabilityRequest.java b/src/java/com/android/ims/rcs/uce/request/CapabilityRequest.java
index 17cec90..f7a4acc 100644
--- a/src/java/com/android/ims/rcs/uce/request/CapabilityRequest.java
+++ b/src/java/com/android/ims/rcs/uce/request/CapabilityRequest.java
@@ -23,7 +23,6 @@
 
 import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult;
 import com.android.ims.rcs.uce.eab.EabCapabilityResult;
-import com.android.ims.rcs.uce.presence.pidfparser.PidfParserUtils;
 import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
 import com.android.ims.rcs.uce.util.UceUtils;
 import com.android.internal.annotations.VisibleForTesting;
@@ -141,36 +140,20 @@
             return;
         }
 
-        // Get the contact capabilities from the cache including the expired capabilities.
-        final List<EabCapabilityResult> eabResultList = getCapabilitiesFromCache();
-
-        // Get all the unexpired capabilities from the EAB result list and add to the response.
-        final List<RcsContactUceCapability> cachedCapList = isSkipGettingFromCache() ?
-                Collections.EMPTY_LIST : getUnexpiredCapabilities(eabResultList);
+        // Get the capabilities from the cache.
+        final List<RcsContactUceCapability> cachedCapList
+                = isSkipGettingFromCache() ? Collections.EMPTY_LIST : getCapabilitiesFromCache();
         mRequestResponse.addCachedCapabilities(cachedCapList);
 
         logd("executeRequest: cached capabilities size=" + cachedCapList.size());
 
-        // Get the rest contacts which are not in the cache or has expired.
-        final List<Uri> expiredUris = getRequestingFromNetworkUris(cachedCapList);
-
-        // For those uris that are not in the cache or have expired, we should request their
-        // capabilities from the network. However, we still need to check whether these contacts
-        // are in the throttling list. If the contact is in the throttling list, even if it has
-        // expired, we will get the cached capabilities.
-        final List<RcsContactUceCapability> throttlingUris =
-                getFromThrottlingList(expiredUris, eabResultList);
-        mRequestResponse.addCachedCapabilities(throttlingUris);
-
-        logd("executeRequest: contacts in throttling list size=" + throttlingUris.size());
-
         // Notify that the cached capabilities are updated.
-        if (!cachedCapList.isEmpty() || !throttlingUris.isEmpty()) {
+        if (!cachedCapList.isEmpty()) {
             mRequestManagerCallback.notifyCachedCapabilitiesUpdated(mCoordinatorId, mTaskId);
         }
 
         // Get the rest contacts which need to request capabilities from the network.
-        List<Uri> requestCapUris = getRequestingFromNetworkUris(cachedCapList, throttlingUris);
+        final List<Uri> requestCapUris = getRequestingFromNetworkUris(cachedCapList);
 
         logd("executeRequest: requestCapUris size=" + requestCapUris.size());
 
@@ -210,30 +193,21 @@
     }
 
     // Get the cached capabilities by the given request type.
-    private List<EabCapabilityResult> getCapabilitiesFromCache() {
+    private List<RcsContactUceCapability> getCapabilitiesFromCache() {
         List<EabCapabilityResult> resultList = null;
         if (mRequestType == REQUEST_TYPE_CAPABILITY) {
-            resultList = mRequestManagerCallback.getCapabilitiesFromCacheIncludingExpired(mUriList);
+            resultList = mRequestManagerCallback.getCapabilitiesFromCache(mUriList);
         } else if (mRequestType == REQUEST_TYPE_AVAILABILITY) {
             // Always get the first element if the request type is availability.
             Uri uri = mUriList.get(0);
-            EabCapabilityResult eabResult =
-                    mRequestManagerCallback.getAvailabilityFromCacheIncludingExpired(uri);
+            EabCapabilityResult eabResult = mRequestManagerCallback.getAvailabilityFromCache(uri);
             resultList = new ArrayList<>();
             resultList.add(eabResult);
         }
         if (resultList == null) {
             return Collections.emptyList();
         }
-        return resultList;
-    }
-
-    /**
-     * Get the unexpired contact capabilities from the given EAB result list.
-     * @param list the query result from the EAB
-     */
-    private List<RcsContactUceCapability> getUnexpiredCapabilities(List<EabCapabilityResult> list) {
-        return list.stream()
+        return resultList.stream()
                 .filter(Objects::nonNull)
                 .filter(result -> result.getStatus() == EabCapabilityResult.EAB_QUERY_SUCCESSFUL)
                 .map(EabCapabilityResult::getContactCapabilities)
@@ -253,67 +227,6 @@
     }
 
     /**
-     * Get the contact uris which cannot retrieve capabilities from the cache.
-     * @param cachedCapList The capabilities which are already stored in the cache.
-     * @param throttlingUris The capabilities which are in the throttling list.
-     */
-    private List<Uri> getRequestingFromNetworkUris(List<RcsContactUceCapability> cachedCapList,
-            List<RcsContactUceCapability> throttlingUris) {
-        // We won't request the network query for those contacts in the cache and in the
-        // throttling list. Merging the two list and get the rest contact uris.
-        List<RcsContactUceCapability> notNetworkQueryList = new ArrayList<>(cachedCapList);
-        notNetworkQueryList.addAll(throttlingUris);
-        return getRequestingFromNetworkUris(notNetworkQueryList);
-    }
-
-    /**
-     * Get the contact capabilities for those uri are in the throttling list. If the contact uri is
-     * in the throttling list, the capabilities will be retrieved from cache even if it has expired.
-     * If the capabilities cannot be found, return the non-RCS contact capabilities instead.
-     * @param expiredUris the expired/unknown uris to check whether are in the throttling list
-     * @return the contact capabilities for the uris are in the throttling list
-     */
-    private List<RcsContactUceCapability> getFromThrottlingList(final List<Uri> expiredUris,
-            final List<EabCapabilityResult> eabResultList) {
-        List<RcsContactUceCapability> resultList = new ArrayList<>();
-        List<RcsContactUceCapability> notFoundFromCacheList = new ArrayList<>();
-
-        // Retrieve the uris put in the throttling list from the expired/unknown contacts.
-        List<Uri> throttlingUris = mRequestManagerCallback.getInThrottlingListUris(expiredUris);
-
-        // For these uris in the throttling list, check whether their capabilities are in the cache.
-        List<EabCapabilityResult> throttlingUriFoundInEab = new ArrayList<>();
-        for (Uri uri : throttlingUris) {
-            for (EabCapabilityResult eabResult : eabResultList) {
-                if (eabResult.getContact().equals(uri)) {
-                    throttlingUriFoundInEab.add(eabResult);
-                    break;
-                }
-            }
-        }
-
-        throttlingUriFoundInEab.forEach(eabResult -> {
-            if (eabResult.getStatus() == EabCapabilityResult.EAB_QUERY_SUCCESSFUL ||
-                eabResult.getStatus() == EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE) {
-                // The capabilities are found, add to the result list
-                resultList.add(eabResult.getContactCapabilities());
-            } else {
-                // Cannot get the capabilities from cache, create the non-RCS capabilities instead.
-                notFoundFromCacheList.add(PidfParserUtils.getNotFoundContactCapabilities(
-                        eabResult.getContact()));
-            }
-        });
-
-        if (!notFoundFromCacheList.isEmpty()) {
-            resultList.addAll(notFoundFromCacheList);
-        }
-
-        logd("getFromThrottlingList: requesting uris in the list size=" + throttlingUris.size() +
-                ", generate non-RCS size=" + notFoundFromCacheList.size());
-        return resultList;
-    }
-
-    /**
      * Set the timeout timer of this request.
      */
     protected void setupRequestTimeoutTimer() {
diff --git a/src/java/com/android/ims/rcs/uce/request/ContactThrottlingList.java b/src/java/com/android/ims/rcs/uce/request/ContactThrottlingList.java
deleted file mode 100644
index da67f6c..0000000
--- a/src/java/com/android/ims/rcs/uce/request/ContactThrottlingList.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce.request;
-
-import android.net.Uri;
-import android.util.Log;
-
-import com.android.ims.rcs.uce.util.UceUtils;
-
-import java.time.Instant;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * The class is used to store when the contact's capabilities request result is inconclusive.
- */
-public class ContactThrottlingList {
-    private static final String LOG_TAG = UceUtils.getLogPrefix() + "ThrottlingList";
-
-    private static class ContactInfo {
-        Uri mContactUri;
-        int mSipCode;
-        Instant mThrottleEndTimestamp;
-
-        public ContactInfo(Uri contactUri, int sipCode, Instant timestamp) {
-            mContactUri = contactUri;
-            mSipCode = sipCode;
-            mThrottleEndTimestamp = timestamp;
-        }
-    }
-
-    private final int mSubId;
-    private final List<ContactInfo> mThrottlingList = new ArrayList<>();
-
-    public ContactThrottlingList(int subId) {
-        mSubId = subId;
-    }
-
-    public synchronized void reset() {
-        mThrottlingList.clear();
-    }
-
-    public synchronized void addToThrottlingList(List<Uri> uriList, int sipCode) {
-        // Clean up the expired contacts before starting.
-        cleanUpExpiredContacts();
-
-        List<Uri> addToThrottlingList = getNotInThrottlingListUris(uriList);
-        long expiration = UceUtils.getAvailabilityCacheExpiration(mSubId);
-        Instant timestamp = Instant.now().plusSeconds(expiration);
-
-        List<ContactInfo> list = addToThrottlingList.stream().map(uri ->
-                new ContactInfo(uri, sipCode, timestamp)).collect(Collectors.toList());
-
-        int previousSize = mThrottlingList.size();
-        mThrottlingList.addAll(list);
-
-        logd("addToThrottlingList: previous size=" + previousSize +
-                ", current size=" + mThrottlingList.size() + ", expired time=" + timestamp);
-    }
-
-    private synchronized List<Uri> getNotInThrottlingListUris(List<Uri> uriList) {
-        List<Uri> throttlingUris = mThrottlingList.stream().map(contactInfo ->
-                contactInfo.mContactUri).collect(Collectors.toList());
-        List<Uri> addToThrottlingUris = new ArrayList<>(uriList);
-        addToThrottlingUris.removeAll(throttlingUris);
-        return addToThrottlingUris;
-    }
-
-    public synchronized List<Uri> getInThrottlingListUris(List<Uri> uriList) {
-        // Clean up the expired contacts before starting.
-        cleanUpExpiredContacts();
-
-        return uriList.stream()
-                .filter(uri -> mThrottlingList.stream()
-                    .anyMatch(contactInfo -> contactInfo.mContactUri.equals(uri)))
-                    .collect(Collectors.toList());
-    }
-
-    /**
-     * Clean up the expired contacts from the throttling list.
-     */
-    private synchronized void cleanUpExpiredContacts() {
-        final int previousSize = mThrottlingList.size();
-        List<ContactInfo> expiredContacts = mThrottlingList.stream()
-                .filter(contactInfo -> Instant.now()
-                        .isAfter(contactInfo.mThrottleEndTimestamp))
-                        .collect(Collectors.toList());
-        mThrottlingList.removeAll(expiredContacts);
-
-        logd("cleanUpExpiredContacts: previous size=" + previousSize +
-                ", current size=" + mThrottlingList.size());
-    }
-
-    private void logd(String log) {
-        Log.d(LOG_TAG, getLogPrefix().append(log).toString());
-    }
-
-    private StringBuilder getLogPrefix() {
-        StringBuilder builder = new StringBuilder("[");
-        builder.append(mSubId);
-        builder.append("] ");
-        return builder;
-    }
-}
diff --git a/src/java/com/android/ims/rcs/uce/request/OptionsRequestCoordinator.java b/src/java/com/android/ims/rcs/uce/request/OptionsRequestCoordinator.java
index a266093..a150dd6 100644
--- a/src/java/com/android/ims/rcs/uce/request/OptionsRequestCoordinator.java
+++ b/src/java/com/android/ims/rcs/uce/request/OptionsRequestCoordinator.java
@@ -24,7 +24,6 @@
 import android.telephony.ims.aidl.IRcsUceControllerCallback;
 
 import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
-import com.android.ims.rcs.uce.UceStatsWriter;
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.util.Collection;
@@ -45,14 +44,7 @@
 
         public Builder(int subId, Collection<UceRequest> requests,
                 RequestManagerCallback callback) {
-            mRequestCoordinator = new OptionsRequestCoordinator(subId, requests, callback,
-                    UceStatsWriter.getInstance());
-        }
-        @VisibleForTesting
-        public Builder(int subId, Collection<UceRequest> requests,
-                RequestManagerCallback callback, UceStatsWriter instance) {
-            mRequestCoordinator = new OptionsRequestCoordinator(subId, requests, callback,
-                    instance);
+            mRequestCoordinator = new OptionsRequestCoordinator(subId, requests, callback);
         }
 
         public Builder setCapabilitiesCallback(IRcsUceControllerCallback callback) {
@@ -113,12 +105,9 @@
     // The callback to notify the result of the capabilities request.
     private IRcsUceControllerCallback mCapabilitiesCallback;
 
-    private final UceStatsWriter mUceStatsWriter;
-
     private OptionsRequestCoordinator(int subId, Collection<UceRequest> requests,
-            RequestManagerCallback requestMgrCallback, UceStatsWriter instance) {
+            RequestManagerCallback requestMgrCallback) {
         super(subId, requests, requestMgrCallback);
-        mUceStatsWriter = instance;
         logd("OptionsRequestCoordinator: created");
     }
 
@@ -200,11 +189,6 @@
         // Finish this request.
         request.onFinish();
 
-        int commandErrorCode = response.getCommandError().orElse(0);
-        mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.OUTGOING_OPTION_EVENT,
-            false, commandErrorCode, 0);
-
-
         // Remove this request from the activated collection and notify RequestManager.
         Long taskId = request.getTaskId();
         RequestResult requestResult = sCommandErrorCreator.createRequestResult(taskId, response);
@@ -219,11 +203,6 @@
         CapabilityRequestResponse response = request.getRequestResponse();
         logd("handleNetworkResponse: " + response.toString());
 
-        int responseCode = response.getNetworkRespSipCode().orElse(0);
-        mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.OUTGOING_OPTION_EVENT, true,
-            0, responseCode);
-
-
         List<RcsContactUceCapability> updatedCapList = response.getUpdatedContactCapability();
         if (!updatedCapList.isEmpty()) {
             // Save the capabilities and trigger the capabilities callback
diff --git a/src/java/com/android/ims/rcs/uce/request/RemoteOptionsCoordinator.java b/src/java/com/android/ims/rcs/uce/request/RemoteOptionsCoordinator.java
index 5a3e33b..c8aa3f7 100644
--- a/src/java/com/android/ims/rcs/uce/request/RemoteOptionsCoordinator.java
+++ b/src/java/com/android/ims/rcs/uce/request/RemoteOptionsCoordinator.java
@@ -25,7 +25,6 @@
 
 import com.android.ims.rcs.uce.request.RemoteOptionsRequest.RemoteOptResponse;
 import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
-import com.android.ims.rcs.uce.UceStatsWriter;
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.util.Collection;
@@ -42,13 +41,7 @@
         RemoteOptionsCoordinator mRemoteOptionsCoordinator;
 
         public Builder(int subId, Collection<UceRequest> requests, RequestManagerCallback c) {
-            mRemoteOptionsCoordinator = new RemoteOptionsCoordinator(subId, requests, c,
-                    UceStatsWriter.getInstance());
-        }
-        @VisibleForTesting
-        public Builder(int subId, Collection<UceRequest> requests, RequestManagerCallback c,
-                UceStatsWriter instance) {
-            mRemoteOptionsCoordinator = new RemoteOptionsCoordinator(subId, requests, c, instance);
+            mRemoteOptionsCoordinator = new RemoteOptionsCoordinator(subId, requests, c);
         }
 
         public Builder setOptionsRequestCallback(IOptionsRequestCallback callback) {
@@ -85,12 +78,9 @@
     // The callback to notify the result of the remote options request.
     private IOptionsRequestCallback mOptionsReqCallback;
 
-    private final UceStatsWriter mUceStatsWriter;
-
     private RemoteOptionsCoordinator(int subId, Collection<UceRequest> requests,
-            RequestManagerCallback requestMgrCallback, UceStatsWriter instance) {
+            RequestManagerCallback requestMgrCallback) {
         super(subId, requests, requestMgrCallback);
-        mUceStatsWriter = instance;
         logd("RemoteOptionsCoordinator: created");
     }
 
@@ -154,9 +144,6 @@
             boolean isRemoteNumberBlocked) {
         try {
             logd("triggerOptionsReqCallback: start");
-            mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.INCOMING_OPTION_EVENT, true, 0,
-                200);
-
             mOptionsReqCallback.respondToCapabilityRequest(deviceCaps, isRemoteNumberBlocked);
         } catch (RemoteException e) {
             logw("triggerOptionsReqCallback exception: " + e);
@@ -168,9 +155,6 @@
     private void triggerOptionsReqWithErrorCallback(int errorCode, String reason) {
         try {
             logd("triggerOptionsReqWithErrorCallback: start");
-            mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.INCOMING_OPTION_EVENT, true, 0,
-                errorCode);
-
             mOptionsReqCallback.respondToCapabilityRequestWithError(errorCode, reason);
         } catch (RemoteException e) {
             logw("triggerOptionsReqWithErrorCallback exception: " + e);
diff --git a/src/java/com/android/ims/rcs/uce/request/SubscribeRequest.java b/src/java/com/android/ims/rcs/uce/request/SubscribeRequest.java
index bee7177..2b5e91a 100644
--- a/src/java/com/android/ims/rcs/uce/request/SubscribeRequest.java
+++ b/src/java/com/android/ims/rcs/uce/request/SubscribeRequest.java
@@ -25,15 +25,12 @@
 import android.telephony.ims.aidl.ISubscribeResponseCallback;
 import android.telephony.ims.stub.RcsCapabilityExchangeImplBase.CommandCode;
 
-import com.android.ims.rcs.uce.eab.EabCapabilityResult;
 import com.android.ims.rcs.uce.presence.pidfparser.PidfParser;
 import com.android.ims.rcs.uce.presence.pidfparser.PidfParserUtils;
-import com.android.ims.rcs.uce.presence.pidfparser.RcsContactUceCapabilityWrapper;
 import com.android.ims.rcs.uce.presence.subscribe.SubscribeController;
 import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
 import com.android.internal.annotations.VisibleForTesting;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -192,59 +189,30 @@
             pidfXml = Collections.EMPTY_LIST;
         }
 
-        // Convert from the pidf xml to the list of RcsContactUceCapabilityWrapper
-        List<RcsContactUceCapabilityWrapper> capabilityList = pidfXml.stream()
-                .map(pidf -> PidfParser.getRcsContactUceCapabilityWrapper(pidf))
+        // Convert from the pidf xml to the list of RcsContactUceCapability
+        List<RcsContactUceCapability> capabilityList = pidfXml.stream()
+                .map(pidf -> PidfParser.getRcsContactUceCapability(pidf))
                 .filter(Objects::nonNull)
                 .collect(Collectors.toList());
 
         // When the given PIDF xml is empty, set the contacts who have not received the
         // capabilities updated as non-RCS user.
-        List<RcsContactUceCapability> notReceivedCapabilityList = new ArrayList<>();
         if (capabilityList.isEmpty()) {
             logd("onCapabilitiesUpdate: The capabilities list is empty, Set to non-RCS user.");
             List<Uri> notReceiveCapUpdatedContactList =
                     mRequestResponse.getNotReceiveCapabilityUpdatedContact();
-            notReceivedCapabilityList = notReceiveCapUpdatedContactList.stream()
+            capabilityList = notReceiveCapUpdatedContactList.stream()
                     .map(PidfParserUtils::getNotFoundContactCapabilities)
                     .filter(Objects::nonNull)
                     .collect(Collectors.toList());
         }
 
-        List<RcsContactUceCapability> updateCapabilityList = new ArrayList<>();
-        List<Uri> malformedListWithEntityURI = new ArrayList<>();
-        for (RcsContactUceCapabilityWrapper capability : capabilityList) {
-            if (!capability.isMalformed()) {
-                updateCapabilityList.add(capability.toRcsContactUceCapability());
-            } else {
-                logw("onCapabilitiesUpdate: malformed capability was found and not saved.");
-                malformedListWithEntityURI.add(capability.getEntityUri());
-            }
-        }
         logd("onCapabilitiesUpdate: PIDF size=" + pidfXml.size()
-                + ", not received capability size=" + notReceivedCapabilityList.size()
-                + ", normal capability size=" + updateCapabilityList.size()
-                + ", malformed but entity uri is valid capability size="
-                + malformedListWithEntityURI.size());
+                + ", contact capability size=" + capabilityList.size());
 
-        for (RcsContactUceCapability emptyCapability : notReceivedCapabilityList) {
-            updateCapabilityList.add(emptyCapability);
-        }
-
-        // All tuples in received xml are malformed but entity uri is valid.
-        // The capability should be get from the DB and report it to callback.
-        List<EabCapabilityResult> cachedCapabilityList =
-                mRequestManagerCallback.getCapabilitiesFromCache(malformedListWithEntityURI);
-        for (EabCapabilityResult cacheEabCapability : cachedCapabilityList) {
-            RcsContactUceCapability cachedCapability = cacheEabCapability.getContactCapabilities();
-            if (cachedCapability != null) {
-                updateCapabilityList.add(cachedCapability);
-            }
-        }
         // Add these updated RcsContactUceCapability into the RequestResponse and notify
         // the RequestManager to process the RcsContactUceCapabilities updated.
-        logd("onCapabilitiesUpdate: updatedCapability size=" + updateCapabilityList.size());
-        mRequestResponse.addUpdatedCapabilities(updateCapabilityList);
+        mRequestResponse.addUpdatedCapabilities(capabilityList);
         mRequestManagerCallback.notifyCapabilitiesUpdated(mCoordinatorId, mTaskId);
     }
 
diff --git a/src/java/com/android/ims/rcs/uce/request/SubscribeRequestCoordinator.java b/src/java/com/android/ims/rcs/uce/request/SubscribeRequestCoordinator.java
index f44686a..ee6bd35 100644
--- a/src/java/com/android/ims/rcs/uce/request/SubscribeRequestCoordinator.java
+++ b/src/java/com/android/ims/rcs/uce/request/SubscribeRequestCoordinator.java
@@ -25,14 +25,11 @@
 import android.telephony.ims.aidl.IRcsUceControllerCallback;
 
 import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult;
-import com.android.ims.rcs.uce.eab.EabCapabilityResult;
 import com.android.ims.rcs.uce.presence.pidfparser.PidfParserUtils;
 import com.android.ims.rcs.uce.request.SubscriptionTerminatedHelper.TerminatedResult;
 import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
-import com.android.ims.rcs.uce.UceStatsWriter;
 import com.android.internal.annotations.VisibleForTesting;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.List;
@@ -54,13 +51,7 @@
          * The builder of the SubscribeRequestCoordinator class.
          */
         public Builder(int subId, Collection<UceRequest> requests, RequestManagerCallback c) {
-            mRequestCoordinator = new SubscribeRequestCoordinator(subId, requests, c,
-                    UceStatsWriter.getInstance());
-        }
-        @VisibleForTesting
-        public Builder(int subId, Collection<UceRequest> requests, RequestManagerCallback c,
-                UceStatsWriter instance) {
-            mRequestCoordinator = new SubscribeRequestCoordinator(subId, requests, c, instance);
+            mRequestCoordinator = new SubscribeRequestCoordinator(subId, requests, c);
         }
 
         /**
@@ -161,12 +152,9 @@
     // The callback to notify the result of the capabilities request.
     private volatile IRcsUceControllerCallback mCapabilitiesCallback;
 
-    private final UceStatsWriter mUceStatsWriter;
-
     private SubscribeRequestCoordinator(int subId, Collection<UceRequest> requests,
-            RequestManagerCallback requestMgrCallback, UceStatsWriter instance) {
+            RequestManagerCallback requestMgrCallback) {
         super(subId, requests, requestMgrCallback);
-        mUceStatsWriter = instance;
         logd("SubscribeRequestCoordinator: created");
     }
 
@@ -258,10 +246,6 @@
         // Finish this request.
         request.onFinish();
 
-        int commandErrorCode = response.getCommandError().orElse(0);
-        mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.SUBSCRIBE_EVENT,
-            false, commandErrorCode, 0);
-
         // Remove this request from the activated collection and notify RequestManager.
         Long taskId = request.getTaskId();
         RequestResult requestResult = sCommandErrorCreator.createRequestResult(taskId, response,
@@ -277,9 +261,6 @@
         CapabilityRequestResponse response = request.getRequestResponse();
         logd("handleNetworkResponse: " + response.toString());
 
-        int respCode = response.getNetworkRespSipCode().orElse(0);
-        mUceStatsWriter.setSubscribeResponse(mSubId, request.getTaskId(), respCode);
-
         // Refresh the device state with the request result.
         response.getResponseSipCode().ifPresent(sipCode -> {
             String reason = response.getResponseReason().orElse("");
@@ -313,7 +294,6 @@
     private RequestResult handleNetworkResponseFailed(SubscribeRequest request) {
         final long taskId = request.getTaskId();
         final CapabilityRequestResponse response = request.getRequestResponse();
-        final List<Uri> requestUris = response.getNotReceiveCapabilityUpdatedContact();
         RequestResult requestResult = null;
 
         if (response.isNotFound()) {
@@ -321,7 +301,8 @@
             // updated callback from the ImsService afterward. Therefore, we create the capabilities
             // with the result REQUEST_RESULT_NOT_FOUND by ourself and will trigger the
             // capabilities received callback to the clients later.
-            List<RcsContactUceCapability> capabilityList = requestUris.stream().map(uri ->
+            List<Uri> uriList = request.getContactUri();
+            List<RcsContactUceCapability> capabilityList = uriList.stream().map(uri ->
                     PidfParserUtils.getNotFoundContactCapabilities(uri))
                     .collect(Collectors.toList());
             response.addUpdatedCapabilities(capabilityList);
@@ -329,18 +310,9 @@
             // We treat the NOT FOUND is a successful result.
             requestResult = sNetworkRespSuccessfulCreator.createRequestResult(taskId, response,
                     mRequestManagerCallback);
-        } else {
-            // The request result is unsuccessful and it's not the NOT FOUND error. we need to get
-            // the capabilities from the cache.
-            List<RcsContactUceCapability> capabilitiesList =
-                    getCapabilitiesFromCacheIncludingExpired(requestUris);
-            response.addUpdatedCapabilities(capabilitiesList);
+        }
 
-            // Add to the throttling list for the inconclusive result of the contacts.
-            mRequestManagerCallback.addToThrottlingList(requestUris,
-                    response.getResponseSipCode().orElse(
-                            com.android.ims.rcs.uce.util.NetworkSipCode.SIP_CODE_REQUEST_TIMEOUT));
-
+        if (requestResult == null) {
             requestResult = sNetworkRespErrorCreator.createRequestResult(taskId, response,
                     mRequestManagerCallback);
         }
@@ -348,41 +320,6 @@
     }
 
     /**
-     * Get the contact capabilities from the cache even if the capabilities have expired. If the
-     * capabilities doesn't exist, create the non-RCS capabilities instead.
-     * @param uris the uris to get the capabilities from cache.
-     * @return The contact capabilities for the given uris.
-     */
-    private List<RcsContactUceCapability> getCapabilitiesFromCacheIncludingExpired(List<Uri> uris) {
-        List<RcsContactUceCapability> resultList = new ArrayList<>();
-        List<RcsContactUceCapability> notFoundFromCacheList = new ArrayList<>();
-
-        // Get the capabilities from the cache.
-        List<EabCapabilityResult> eabResultList =
-                mRequestManagerCallback.getCapabilitiesFromCacheIncludingExpired(uris);
-
-        eabResultList.forEach(eabResult -> {
-            if (eabResult.getStatus() == EabCapabilityResult.EAB_QUERY_SUCCESSFUL ||
-                eabResult.getStatus() == EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE) {
-                // The capabilities are found, add to the result list
-                resultList.add(eabResult.getContactCapabilities());
-            } else {
-                // Cannot get the capabilities from cache, create the non-RCS capabilities instead.
-                notFoundFromCacheList.add(PidfParserUtils.getNotFoundContactCapabilities(
-                        eabResult.getContact()));
-            }
-        });
-
-        if (!notFoundFromCacheList.isEmpty()) {
-            resultList.addAll(notFoundFromCacheList);
-        }
-
-        logd("getCapabilitiesFromCacheIncludingExpired: requesting uris size=" + uris.size() +
-                ", capabilities not found from cache size=" + notFoundFromCacheList.size());
-        return resultList;
-    }
-
-    /**
      * This method is called when the given SubscribeRequest received the onNotifyCapabilitiesUpdate
      * callback from the ImsService.
      */
@@ -396,7 +333,6 @@
             return;
         }
 
-        mUceStatsWriter.setPresenceNotifyEvent(mSubId, taskId, updatedCapList);
         // Save the updated capabilities to the cache.
         mRequestManagerCallback.saveCapabilities(updatedCapList);
 
@@ -420,8 +356,6 @@
             return;
         }
 
-        mUceStatsWriter.setPresenceNotifyEvent(mSubId, taskId, terminatedResources);
-
         // Save the terminated capabilities to the cache.
         mRequestManagerCallback.saveCapabilities(terminatedResources);
 
@@ -462,7 +396,6 @@
 
         // Remove this request from the activated collection and notify RequestManager.
         Long taskId = request.getTaskId();
-        mUceStatsWriter.setSubscribeTerminated(mSubId, taskId, response.getTerminatedReason());
         RequestResult requestResult = sTerminatedCreator.createRequestResult(taskId, response,
                 mRequestManagerCallback);
         moveRequestToFinishedCollection(taskId, requestResult);
@@ -487,39 +420,20 @@
     }
 
     /**
-     * This method is called when the framework did not receive the capabilities request result.
+     * This method is called when the framework does not receive receive the result for
+     * capabilities request.
      */
     private void handleRequestTimeout(SubscribeRequest request) {
         CapabilityRequestResponse response = request.getRequestResponse();
-        List<Uri> requestUris = response.getNotReceiveCapabilityUpdatedContact();
         logd("handleRequestTimeout: " + response);
-        logd("handleRequestTimeout: not received updated uri size=" + requestUris.size());
-
-        // Add to the throttling list for the inconclusive result of the contacts.
-        mRequestManagerCallback.addToThrottlingList(requestUris,
-                com.android.ims.rcs.uce.util.NetworkSipCode.SIP_CODE_REQUEST_TIMEOUT);
-
-        // Get the capabilities from the cache instead and add to the response.
-        List<RcsContactUceCapability> capabilitiesList =
-                getCapabilitiesFromCacheIncludingExpired(requestUris);
-        response.addUpdatedCapabilities(capabilitiesList);
-
-        // Trigger capabilities updated callback if there is any.
-        List<RcsContactUceCapability> updatedCapList = response.getUpdatedContactCapability();
-        if (!updatedCapList.isEmpty()) {
-            triggerCapabilitiesReceivedCallback(updatedCapList);
-            response.removeUpdatedCapabilities(updatedCapList);
-        }
-
-        // Remove this request from the activated collection and notify RequestManager.
-        long taskId = request.getTaskId();
-        RequestResult requestResult = sRequestTimeoutCreator.createRequestResult(taskId,
-                response, mRequestManagerCallback);
 
         // Finish this request
         request.onFinish();
 
         // Remove this request from the activated collection and notify RequestManager.
+        long taskId = request.getTaskId();
+        RequestResult requestResult = sRequestTimeoutCreator.createRequestResult(taskId,
+                response, mRequestManagerCallback);
         moveRequestToFinishedCollection(taskId, requestResult);
     }
 
diff --git a/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java b/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java
index 85908f0..3e12ba3 100644
--- a/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java
+++ b/src/java/com/android/ims/rcs/uce/request/UceRequestManager.java
@@ -22,7 +22,6 @@
 import android.os.Looper;
 import android.os.Message;
 import android.os.RemoteException;
-import android.telephony.TelephonyManager;
 import android.telephony.ims.RcsContactUceCapability;
 import android.telephony.ims.RcsContactUceCapability.CapabilityMechanism;
 import android.telephony.ims.RcsUceAdapter;
@@ -31,9 +30,6 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import com.android.i18n.phonenumbers.NumberParseException;
-import com.android.i18n.phonenumbers.PhoneNumberUtil;
-import com.android.i18n.phonenumbers.Phonenumber;
 import com.android.ims.rcs.uce.UceController;
 import com.android.ims.rcs.uce.UceController.UceControllerCallback;
 import com.android.ims.rcs.uce.UceDeviceState;
@@ -53,7 +49,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
@@ -65,14 +60,6 @@
     private static final String LOG_TAG = UceUtils.getLogPrefix() + "UceRequestManager";
 
     /**
-     * When enabled, skip the request queue for requests that have numbers with valid cached
-     * capabilities and return that cached info directly.
-     * Note: This also has a CTS test associated with it, so this can not be disabled without
-     * disabling the corresponding RcsUceAdapterTest#testCacheQuerySuccessWhenNetworkBlocked test.
-     */
-    private static final boolean FEATURE_SHORTCUT_QUEUE_FOR_CACHED_CAPS = true;
-
-    /**
      * Testing interface used to mock UceUtils in testing.
      */
     @VisibleForTesting
@@ -161,21 +148,11 @@
         List<EabCapabilityResult> getCapabilitiesFromCache(List<Uri> uriList);
 
         /**
-         * Retrieve the contact capabilities from the cache including the expired capabilities.
-         */
-        List<EabCapabilityResult> getCapabilitiesFromCacheIncludingExpired(List<Uri> uriList);
-
-        /**
          * Retrieve the contact availability from the cache.
          */
         EabCapabilityResult getAvailabilityFromCache(Uri uri);
 
         /**
-         * Retrieve the contact availability from the cache including the expired capabilities.
-         */
-        EabCapabilityResult getAvailabilityFromCacheIncludingExpired(Uri uri);
-
-        /**
          * Store the given contact capabilities to the cache.
          */
         void saveCapabilities(List<RcsContactUceCapability> contactCapabilities);
@@ -264,19 +241,6 @@
          * to remove the coordinator from the UceRequestRepository.
          */
         void notifyRequestCoordinatorFinished(long requestCoordinatorId);
-
-        /**
-         * Check whether the given uris are in the throttling list.
-         * @param uriList the uris to check if it is in the throttling list
-         * @return the uris in the throttling list
-         */
-        List<Uri> getInThrottlingListUris(List<Uri> uriList);
-
-        /**
-         * Add the given uris to the throttling list because the capabilities request result
-         * is inconclusive.
-         */
-        void addToThrottlingList(List<Uri> uriList, int sipCode);
     }
 
     private RequestManagerCallback mRequestMgrCallback = new RequestManagerCallback() {
@@ -291,21 +255,11 @@
         }
 
         @Override
-        public List<EabCapabilityResult> getCapabilitiesFromCacheIncludingExpired(List<Uri> uris) {
-            return mControllerCallback.getCapabilitiesFromCacheIncludingExpired(uris);
-        }
-
-        @Override
         public EabCapabilityResult getAvailabilityFromCache(Uri uri) {
             return mControllerCallback.getAvailabilityFromCache(uri);
         }
 
         @Override
-        public EabCapabilityResult getAvailabilityFromCacheIncludingExpired(Uri uri) {
-            return mControllerCallback.getAvailabilityFromCacheIncludingExpired(uri);
-        }
-
-        @Override
         public void saveCapabilities(List<RcsContactUceCapability> contactCapabilities) {
             mControllerCallback.saveCapabilities(contactCapabilities);
         }
@@ -396,23 +350,12 @@
         public void notifyRequestCoordinatorFinished(long requestCoordinatorId) {
             mHandler.sendRequestCoordinatorFinishedMessage(requestCoordinatorId);
         }
-
-        @Override
-        public List<Uri> getInThrottlingListUris(List<Uri> uriList) {
-            return mThrottlingList.getInThrottlingListUris(uriList);
-        }
-
-        @Override
-        public void addToThrottlingList(List<Uri> uriList, int sipCode) {
-            mThrottlingList.addToThrottlingList(uriList, sipCode);
-        }
     };
 
     private final int mSubId;
     private final Context mContext;
     private final UceRequestHandler mHandler;
     private final UceRequestRepository mRequestRepository;
-    private final ContactThrottlingList mThrottlingList;
     private volatile boolean mIsDestroyed;
 
     private OptionsController mOptionsCtrl;
@@ -424,7 +367,6 @@
         mContext = context;
         mControllerCallback = c;
         mHandler = new UceRequestHandler(this, looper);
-        mThrottlingList = new ContactThrottlingList(mSubId);
         mRequestRepository = new UceRequestRepository(subId, mRequestMgrCallback);
         logi("create");
     }
@@ -437,7 +379,6 @@
         mControllerCallback = c;
         mHandler = new UceRequestHandler(this, looper);
         mRequestRepository = requestRepository;
-        mThrottlingList = new ContactThrottlingList(mSubId);
     }
 
     /**
@@ -461,18 +402,10 @@
         logi("onDestroy");
         mIsDestroyed = true;
         mHandler.onDestroy();
-        mThrottlingList.reset();
         mRequestRepository.onDestroy();
     }
 
     /**
-     * Clear the throttling list.
-     */
-    public void resetThrottlingList() {
-        mThrottlingList.reset();
-    }
-
-    /**
      * Send a new capability request. It is called by UceController.
      */
     public void sendCapabilityRequest(List<Uri> uriList, boolean skipFromCache,
@@ -500,27 +433,12 @@
     private void sendRequestInternal(@UceRequestType int type, List<Uri> uriList,
             boolean skipFromCache, IRcsUceControllerCallback callback) throws RemoteException {
         UceRequestCoordinator requestCoordinator = null;
-        List<Uri> nonCachedUris = uriList;
-        if (FEATURE_SHORTCUT_QUEUE_FOR_CACHED_CAPS && !skipFromCache) {
-            nonCachedUris = sendCachedCapInfoToRequester(type, uriList, callback);
-            if (uriList.size() != nonCachedUris.size()) {
-                logd("sendRequestInternal: shortcut queue for caps - request reduced from "
-                        + uriList.size() + " entries to " + nonCachedUris.size() + " entries");
-            } else {
-                logd("sendRequestInternal: shortcut queue for caps - no cached caps.");
-            }
-            if (nonCachedUris.isEmpty()) {
-                logd("sendRequestInternal: shortcut complete, sending success result");
-                callback.onComplete();
-                return;
-            }
-        }
         if (sUceUtilsProxy.isPresenceCapExchangeEnabled(mContext, mSubId) &&
                 sUceUtilsProxy.isPresenceSupported(mContext, mSubId)) {
-            requestCoordinator = createSubscribeRequestCoordinator(type, nonCachedUris,
-                    skipFromCache, callback);
+            requestCoordinator = createSubscribeRequestCoordinator(type, uriList, skipFromCache,
+                    callback);
         } else if (sUceUtilsProxy.isSipOptionsSupported(mContext, mSubId)) {
-            requestCoordinator = createOptionsRequestCoordinator(type, nonCachedUris, callback);
+            requestCoordinator = createOptionsRequestCoordinator(type, uriList, callback);
         }
 
         if (requestCoordinator == null) {
@@ -541,64 +459,6 @@
         addRequestCoordinator(requestCoordinator);
     }
 
-    /**
-     * Try to get the valid capabilities associated with the URI List specified from the EAB cache.
-     * If one or more of the numbers from the URI List have valid cached capabilities, return them
-     * to the requester now and remove them from the returned List of URIs that will require a
-     * network query.
-     * @param type The type of query
-     * @param uriList The List of URIs that we want to send cached capabilities for
-     * @param callback The callback used to communicate with the remote requester
-     * @return The List of URIs that were not found in the capability cache and will require a
-     * network query.
-     */
-    private List<Uri> sendCachedCapInfoToRequester(int type, List<Uri> uriList,
-            IRcsUceControllerCallback callback) {
-        List<Uri> nonCachedUris = new ArrayList<>(uriList);
-        List<RcsContactUceCapability> numbersWithCachedCaps =
-                getCapabilitiesFromCache(type, nonCachedUris);
-        try {
-            if (!numbersWithCachedCaps.isEmpty()) {
-                logd("sendCachedCapInfoToRequester: cached caps found for "
-                        + numbersWithCachedCaps.size() + " entries. Notifying requester.");
-                // Notify caller of the numbers that have cached caps
-                callback.onCapabilitiesReceived(numbersWithCachedCaps);
-            }
-        } catch (RemoteException e) {
-            logw("sendCachedCapInfoToRequester, error sending cap info back to requester: " + e);
-        }
-        // remove these numbers from the numbers pending a cap query from the network.
-        for (RcsContactUceCapability c : numbersWithCachedCaps) {
-            nonCachedUris.removeIf(uri -> c.getContactUri().equals(uri));
-        }
-        return nonCachedUris;
-    }
-
-    /**
-     * Get the capabilities for the List of given URIs
-     * @param requestType The request type, used to determine if the cached info is "fresh" enough.
-     * @param uriList The List of URIs that we will be requesting cached capabilities for.
-     * @return A list of capabilities corresponding to the subset of numbers that still have
-     * valid cache data associated with them.
-     */
-    private List<RcsContactUceCapability> getCapabilitiesFromCache(int requestType,
-            List<Uri> uriList) {
-        List<EabCapabilityResult> resultList = Collections.emptyList();
-        if (requestType == UceRequest.REQUEST_TYPE_CAPABILITY) {
-            resultList = mRequestMgrCallback.getCapabilitiesFromCache(uriList);
-        } else if (requestType == UceRequest.REQUEST_TYPE_AVAILABILITY) {
-            // Always get the first element if the request type is availability.
-            resultList = Collections.singletonList(
-                    mRequestMgrCallback.getAvailabilityFromCache(uriList.get(0)));
-        }
-        // Map from EabCapabilityResult -> RcsContactUceCapability.
-        // Pull out only items that have valid cache data.
-        return resultList.stream().filter(Objects::nonNull)
-                .filter(result -> result.getStatus() == EabCapabilityResult.EAB_QUERY_SUCCESSFUL)
-                .map(EabCapabilityResult::getContactCapabilities)
-                .filter(Objects::nonNull).collect(Collectors.toList());
-    }
-
     private UceRequestCoordinator createSubscribeRequestCoordinator(final @UceRequestType int type,
             final List<Uri> uriList, boolean skipFromCache, IRcsUceControllerCallback callback) {
         SubscribeRequestCoordinator.Builder builder;
@@ -609,25 +469,6 @@
             List<UceRequest> requestList = new ArrayList<>();
             uriList.forEach(uri -> {
                 List<Uri> individualUri = Collections.singletonList(uri);
-                // Entity-uri, which is used as a request-uri, uses only a single subscription case
-                List<RcsContactUceCapability> capabilities =
-                        getCapabilitiesFromCache(type, individualUri);
-                if (!capabilities.isEmpty()) {
-                    RcsContactUceCapability capability = capabilities.get(0);
-                    Uri entityUri = capability.getEntityUri();
-                    if (entityUri != null) {
-                        // The query uri has been replaced by the stored entity uri.
-                        individualUri = Collections.singletonList(entityUri);
-                    } else {
-                        if (UceUtils.isSipUriForPresenceSubscribeEnabled(mContext, mSubId)) {
-                            individualUri = Collections.singletonList(getSipUriFromUri(uri));
-                        }
-                    }
-                } else {
-                    if (UceUtils.isSipUriForPresenceSubscribeEnabled(mContext, mSubId)) {
-                        individualUri = Collections.singletonList(getSipUriFromUri(uri));
-                    }
-                }
                 UceRequest request = createSubscribeRequest(type, individualUri, skipFromCache);
                 requestList.add(request);
             });
@@ -856,7 +697,7 @@
             SomeArgs args = (SomeArgs) msg.obj;
             final Long coordinatorId = (Long) args.arg1;
             final Long taskId = (Long) Optional.ofNullable(args.arg2).orElse(-1L);
-            final Integer requestEvent = Optional.ofNullable(args.argi1).orElse(-1);
+            final Integer requestEvent = Optional.of(args.argi1).orElse(-1);
             args.recycle();
 
             requestManager.logd("handleMessage: " + EVENT_DESCRIPTION.get(msg.what)
@@ -946,33 +787,6 @@
         mRequestRepository.notifyRequestFinished(taskId);
     }
 
-    private Uri getSipUriFromUri(Uri uri) {
-        Uri convertedUri = uri;
-        String number = convertedUri.getSchemeSpecificPart();
-        String[] numberParts = number.split("[@;:]");
-        number = numberParts[0];
-
-        TelephonyManager manager = mContext.getSystemService(TelephonyManager.class);
-        if (manager.getIsimDomain() == null) {
-            return convertedUri;
-        }
-        String simCountryIso = manager.getSimCountryIso();
-        if (TextUtils.isEmpty(simCountryIso)) {
-            return convertedUri;
-        }
-        simCountryIso = simCountryIso.toUpperCase();
-        PhoneNumberUtil util = PhoneNumberUtil.getInstance();
-        try {
-            Phonenumber.PhoneNumber phoneNumber = util.parse(number, simCountryIso);
-            number = util.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.E164);
-            String sipUri = "sip:" + number + "@" + manager.getIsimDomain();
-            convertedUri = Uri.parse(sipUri);
-        } catch (NumberParseException e) {
-            Log.w(LOG_TAG, "formatNumber: could not format " + number + ", error: " + e);
-        }
-        return convertedUri;
-    }
-
     @VisibleForTesting
     public UceRequestHandler getUceRequestHandler() {
         return mHandler;
diff --git a/src/java/com/android/ims/rcs/uce/util/FeatureTags.java b/src/java/com/android/ims/rcs/uce/util/FeatureTags.java
index 8dbceda..bba51fb 100644
--- a/src/java/com/android/ims/rcs/uce/util/FeatureTags.java
+++ b/src/java/com/android/ims/rcs/uce/util/FeatureTags.java
@@ -74,9 +74,6 @@
             "+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.chatbot.sa\"";
 
     public static final String FEATURE_TAG_CHATBOT_VERSION_SUPPORTED =
-            "+g.gsma.rcs.botversion=\"#=1\"";
-
-    public static final String FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED =
             "+g.gsma.rcs.botversion=\"#=1,#=2\"";
 
     public static final String FEATURE_TAG_CHATBOT_ROLE = "+g.gsma.rcs.isbot";
diff --git a/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java b/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java
index 30099f3..a1e35d7 100644
--- a/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java
+++ b/src/java/com/android/ims/rcs/uce/util/NetworkSipCode.java
@@ -32,7 +32,6 @@
     public static final int SIP_CODE_NOT_FOUND = 404;
     public static final int SIP_CODE_METHOD_NOT_ALLOWED = 405;
     public static final int SIP_CODE_REQUEST_TIMEOUT = 408;
-    public static final int SIP_CODE_REQUEST_ENTITY_TOO_LARGE = 413;
     public static final int SIP_CODE_INTERVAL_TOO_BRIEF = 423;
     public static final int SIP_CODE_TEMPORARILY_UNAVAILABLE = 480;
     public static final int SIP_CODE_BAD_EVENT = 489;
@@ -64,7 +63,6 @@
         int uceError;
         switch (sipCode) {
             case NetworkSipCode.SIP_CODE_FORBIDDEN:   // 403
-            case NetworkSipCode.SIP_CODE_SERVER_TIMEOUT:   // 504
                 if(requestType == UceController.REQUEST_TYPE_PUBLISH) {
                     // Not provisioned for PUBLISH request.
                     uceError = RcsUceAdapter.ERROR_NOT_AUTHORIZED;
diff --git a/src/java/com/android/ims/rcs/uce/util/UceUtils.java b/src/java/com/android/ims/rcs/uce/util/UceUtils.java
index c5f2b12..c88de0b 100644
--- a/src/java/com/android/ims/rcs/uce/util/UceUtils.java
+++ b/src/java/com/android/ims/rcs/uce/util/UceUtils.java
@@ -24,9 +24,7 @@
 import android.provider.BlockedNumberContract;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
-import android.telephony.ims.ImsRcsManager;
 import android.telephony.ims.ProvisioningManager;
-import android.telephony.ims.stub.ImsRegistrationImplBase;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -55,9 +53,6 @@
     private static final long DEFAULT_CAP_REQUEST_TIMEOUT_AFTER_MS = TimeUnit.MINUTES.toMillis(3);
     private static Optional<Long> OVERRIDE_CAP_REQUEST_TIMEOUT_AFTER_MS = Optional.empty();
 
-    // The default value of the availability cache expiration.
-    private static final long DEFAULT_AVAILABILITY_CACHE_EXPIRATION_SEC = 60L;   // 60 seconds
-
     // The task ID of the UCE request
     private static long TASK_ID = 0L;
 
@@ -102,9 +97,9 @@
         }
         try {
             ProvisioningManager manager = ProvisioningManager.createForSubscriptionId(subId);
-            isProvisioned = manager.getRcsProvisioningStatusForCapability(
-                    ImsRcsManager.CAPABILITY_TYPE_PRESENCE_UCE,
-                    ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
+            isProvisioned = manager.getProvisioningIntValue(
+                    ProvisioningManager.KEY_EAB_PROVISIONING_STATUS)
+                    == ProvisioningManager.PROVISIONING_VALUE_ENABLED;
         } catch (Exception e) {
             Log.w(LOG_TAG, "isEabProvisioned: exception=" + e.getMessage());
         }
@@ -194,38 +189,6 @@
     }
 
     /**
-     * Check whether sip uri should be used for presence subscribe
-     */
-    public static boolean isSipUriForPresenceSubscribeEnabled(Context context, int subId) {
-        CarrierConfigManager configManager = context.getSystemService(CarrierConfigManager.class);
-        if (configManager == null) {
-            return false;
-        }
-        PersistableBundle config = configManager.getConfigForSubId(subId);
-        if (config == null) {
-            return false;
-        }
-        return config.getBoolean(
-                CarrierConfigManager.Ims.KEY_USE_SIP_URI_FOR_PRESENCE_SUBSCRIBE_BOOL);
-    }
-
-    /**
-     * Check whether tel uri should be used for pidf xml
-     */
-    public static boolean isTelUriForPidfXmlEnabled(Context context, int subId) {
-        CarrierConfigManager configManager = context.getSystemService(CarrierConfigManager.class);
-        if (configManager == null) {
-            return false;
-        }
-        PersistableBundle config = configManager.getConfigForSubId(subId);
-        if (config == null) {
-            return false;
-        }
-        return config.getBoolean(
-                CarrierConfigManager.Ims.KEY_USE_TEL_URI_FOR_PIDF_XML_BOOL);
-    }
-
-    /**
      * Get the minimum time that allow two PUBLISH requests can be executed continuously.
      *
      * @param subId The subscribe ID
@@ -437,26 +400,4 @@
         }
         return numberParts[0];
     }
-
-    /**
-     * Get the availability expiration from provisioning manager.
-     * @param subId The subscription ID
-     * @return the number of seconds for the availability cache expiration.
-     */
-    public static long getAvailabilityCacheExpiration(int subId) {
-        long value = -1;
-        try {
-            ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(subId);
-            value = pm.getProvisioningIntValue(
-                    ProvisioningManager.KEY_RCS_AVAILABILITY_CACHE_EXPIRATION_SEC);
-        } catch (Exception e) {
-            Log.w(LOG_TAG, "Exception in getAvailabilityCacheExpiration: " + e);
-        }
-
-        if (value <= 0) {
-            Log.w(LOG_TAG, "The availability expiration cannot be less than 0.");
-            value = DEFAULT_AVAILABILITY_CACHE_EXPIRATION_SEC;
-        }
-        return value;
-    }
 }
diff --git a/tests/src/com/android/ims/FeatureConnectionTest.java b/tests/src/com/android/ims/FeatureConnectionTest.java
index 532c07b..d7a9134 100644
--- a/tests/src/com/android/ims/FeatureConnectionTest.java
+++ b/tests/src/com/android/ims/FeatureConnectionTest.java
@@ -53,8 +53,8 @@
         public int mNewStatus = ImsFeature.STATE_UNAVAILABLE;
         public long mCapabilities;
 
-        TestFeatureConnection(Context context, int slotId, int subId) {
-            super(context, slotId, subId, mConfigBinder, mRegistrationBinder, mSipTransportBinder);
+        TestFeatureConnection(Context context, int slotId) {
+            super(context, slotId, mConfigBinder, mRegistrationBinder, mSipTransportBinder);
             if (!ImsManager.isImsSupportedOnDevice(context)) {
                 sImsSupportedOnDevice = false;
             }
@@ -87,7 +87,6 @@
     @Mock ISipTransport mSipTransportBinder;
 
     public static final int PHONE_ID = 1;
-    public static final int SUB_ID = 2;
 
     @Before
     public void setUp() throws Exception {
@@ -96,7 +95,7 @@
         doReturn(null).when(mContext).getMainLooper();
         mContextFixture.addSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS);
 
-        mTestFeatureConnection = new TestFeatureConnection(mContext, PHONE_ID, SUB_ID);
+        mTestFeatureConnection = new TestFeatureConnection(mContext, PHONE_ID);
         mTestFeatureConnection.setBinder(mBinder);
     }
 
diff --git a/tests/src/com/android/ims/FeatureConnectorTest.java b/tests/src/com/android/ims/FeatureConnectorTest.java
index c2b0a10..e560ae6 100644
--- a/tests/src/com/android/ims/FeatureConnectorTest.java
+++ b/tests/src/com/android/ims/FeatureConnectorTest.java
@@ -24,7 +24,6 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -58,9 +57,9 @@
 
     private static class TestFeatureConnection extends FeatureConnection {
 
-        public TestFeatureConnection(Context context, int slotId, int subId, IImsConfig c,
+        public TestFeatureConnection(Context context, int slotId, IImsConfig c,
                 IImsRegistration r, ISipTransport s) {
-            super(context, slotId, subId, c, r, s);
+            super(context, slotId, c, r, s);
         }
 
         @Override
@@ -97,8 +96,8 @@
         }
 
         @Override
-        public void associate(ImsFeatureContainer c, int subId) {
-            connection = new TestFeatureConnection(mContext, mPhoneId, subId, c.imsConfig,
+        public void associate(ImsFeatureContainer c) {
+            connection = new TestFeatureConnection(mContext, mPhoneId, c.imsConfig,
                     c.imsRegistration, c.sipTransport);
             connection.setBinder(c.imsFeature);
         }
@@ -129,7 +128,6 @@
     @Mock private ISipTransport transport;
 
     private static final int PHONE_ID = 1;
-    private static final int SUB_ID = 2;
     private static final long TEST_CAPS = ImsService.CAPABILITY_EMERGENCY_OVER_MMTEL;
 
     @Before
@@ -153,15 +151,15 @@
         assertNotNull("connect should trigger the callback registration", mTestManager.callback);
 
         // simulate callback from ImsResolver
-        mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
+        mTestManager.callback.imsFeatureCreated(createContainer());
         assertNotNull(mTestManager.connection);
         assertEquals(TEST_CAPS, mTestManager.connection.getFeatureCapabilties());
-        verify(mListener, never()).connectionReady(any(), eq(SUB_ID));
+        verify(mListener, never()).connectionReady(any());
         verify(mListener, never()).connectionUnavailable(anyInt());
 
         // simulate callback from ImsResolver
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener, never()).connectionUnavailable(anyInt());
     }
 
@@ -186,16 +184,16 @@
         mFeatureConnector.connect();
         assertNotNull("connect should trigger the callback registration", mTestManager.callback);
         // simulate callback from ImsResolver
-        mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        mTestManager.callback.imsFeatureCreated(createContainer());
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener, never()).connectionUnavailable(anyInt());
 
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE, SUB_ID);
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE);
         assertNotNull("When not ready, the callback should still be registered",
                 mTestManager.callback);
         assertNotNull("Do not invalidate the connection if not ready", mTestManager.connection);
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_NOT_READY);
     }
 
@@ -209,23 +207,23 @@
         mFeatureConnector.connect();
         assertNotNull("connect should trigger the callback registration", mTestManager.callback);
         // simulate callback from ImsResolver
-        mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
-        verify(mListener, never()).connectionReady(mTestManager, SUB_ID);
+        mTestManager.callback.imsFeatureCreated(createContainer());
+        verify(mListener, never()).connectionReady(mTestManager);
         verify(mListener, never()).connectionUnavailable(anyInt());
 
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_INITIALIZING, SUB_ID);
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_INITIALIZING);
         assertNotNull("When not ready, the callback should still be registered",
                 mTestManager.callback);
         assertNotNull("Do not invalidate the connection if not ready", mTestManager.connection);
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener, never()).connectionUnavailable(anyInt());
 
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
         assertNotNull("When not ready, the callback should still be registered",
                 mTestManager.callback);
         assertNotNull("Do not invalidate the connection if not ready", mTestManager.connection);
         // Should not notify ready multiple times
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener, never()).connectionUnavailable(anyInt());
     }
 
@@ -240,28 +238,28 @@
         mFeatureConnector.connect();
         assertNotNull("connect should trigger the callback registration", mTestManager.callback);
         // simulate callback from ImsResolver
-        mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        mTestManager.callback.imsFeatureCreated(createContainer());
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener, never()).connectionUnavailable(anyInt());
 
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE, SUB_ID);
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE);
         assertNotNull("When not ready, the callback should still be registered",
                 mTestManager.callback);
         assertNotNull("Do not invalidate the connection if not ready", mTestManager.connection);
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener, never()).connectionUnavailable(anyInt());
 
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_INITIALIZING, SUB_ID);
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_INITIALIZING);
         assertNotNull("When not ready, the callback should still be registered",
                 mTestManager.callback);
         assertNotNull("Do not invalidate the connection if not ready", mTestManager.connection);
         // Should not notify ready multiple times
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener, never()).connectionUnavailable(anyInt());
 
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
         // Should not notify ready multiple times
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener, never()).connectionUnavailable(anyInt());
     }
 
@@ -300,20 +298,20 @@
         mFeatureConnector.connect();
         assertNotNull("connect should trigger the callback registration", mTestManager.callback);
         // simulate callback from ImsResolver
-        mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        mTestManager.callback.imsFeatureCreated(createContainer());
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener, never()).connectionUnavailable(anyInt());
 
         mTestManager.callback.imsFeatureRemoved(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
         assertNotNull("When not ready, the callback should still be registered",
                 mTestManager.callback);
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
 
-        mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
-        verify(mListener, times(2)).connectionReady(mTestManager, SUB_ID);
+        mTestManager.callback.imsFeatureCreated(createContainer());
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
+        verify(mListener, times(2)).connectionReady(mTestManager);
         verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
     }
 
@@ -324,23 +322,23 @@
         mFeatureConnector.connect();
         assertNotNull("connect should trigger the callback registration", mTestManager.callback);
         // simulate callback from ImsResolver
-        mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+        mTestManager.callback.imsFeatureCreated(createContainer());
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
         IImsServiceFeatureCallback oldCb = mTestManager.callback;
         TestFeatureConnection testFc = mTestManager.connection;
 
         mFeatureConnector.disconnect();
         assertNull(mTestManager.callback);
         assertNull(mTestManager.connection);
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
 
         // make sure status/caps updates do not trigger more events after disconnect
-        oldCb.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
-        oldCb.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE, SUB_ID);
+        oldCb.imsStatusChanged(ImsFeature.STATE_READY);
+        oldCb.imsStatusChanged(ImsFeature.STATE_UNAVAILABLE);
         oldCb.updateCapabilities(0);
         assertEquals(TEST_CAPS, testFc.getFeatureCapabilties());
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
     }
 
@@ -351,22 +349,22 @@
         mFeatureConnector.connect();
         assertNotNull("connect should trigger the callback registration", mTestManager.callback);
         // simulate callback from ImsResolver
-        mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+        mTestManager.callback.imsFeatureCreated(createContainer());
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
 
         mFeatureConnector.disconnect();
         assertNull(mTestManager.callback);
         assertNull(mTestManager.connection);
-        verify(mListener).connectionReady(mTestManager, SUB_ID);
+        verify(mListener).connectionReady(mTestManager);
         verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
 
         mFeatureConnector.connect();
         assertNotNull(mTestManager.callback);
         // simulate callback from ImsResolver
-        mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+        mTestManager.callback.imsFeatureCreated(createContainer());
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
         assertNotNull(mTestManager.connection);
-        verify(mListener, times(2)).connectionReady(mTestManager, SUB_ID);
+        verify(mListener, times(2)).connectionReady(mTestManager);
         verify(mListener).connectionUnavailable(FeatureConnector.UNAVAILABLE_REASON_DISCONNECTED);
     }
 
@@ -377,8 +375,8 @@
         mFeatureConnector.connect();
         assertNotNull("connect should trigger the callback registration", mTestManager.callback);
         // simulate callback from ImsResolver
-        mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+        mTestManager.callback.imsFeatureCreated(createContainer());
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
         assertEquals(TEST_CAPS, mTestManager.connection.getFeatureCapabilties());
         mTestManager.callback.updateCapabilities(0);
         assertEquals(0, mTestManager.connection.getFeatureCapabilties());
@@ -391,8 +389,8 @@
         mFeatureConnector.connect();
         assertNotNull("connect should trigger the callback registration", mTestManager.callback);
         // simulate callback from ImsResolver
-        mTestManager.callback.imsFeatureCreated(createContainer(), SUB_ID);
-        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY, SUB_ID);
+        mTestManager.callback.imsFeatureCreated(createContainer());
+        mTestManager.callback.imsStatusChanged(ImsFeature.STATE_READY);
         assertEquals(ImsFeature.STATE_READY, mTestManager.connection.getFeatureState());
     }
 
diff --git a/tests/src/com/android/ims/ImsFeatureBinderRepositoryTest.java b/tests/src/com/android/ims/ImsFeatureBinderRepositoryTest.java
index 6f35e38..273d1dc 100644
--- a/tests/src/com/android/ims/ImsFeatureBinderRepositoryTest.java
+++ b/tests/src/com/android/ims/ImsFeatureBinderRepositoryTest.java
@@ -21,7 +21,6 @@
 import static org.junit.Assert.assertNull;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -51,7 +50,6 @@
 
     private static final int TEST_PHONE_ID_1 = 1;
     private static final int TEST_PHONE_ID_2 = 2;
-    private static final int TEST_SUB_ID_3 = 3;
     private static final long TEST_SERVICE_CAPS = ImsService.CAPABILITY_EMERGENCY_OVER_MMTEL;
 
     @Mock IBinder mMockMmTelFeatureA;
@@ -88,7 +86,7 @@
     public void testGetInterfaceExists() throws Exception {
         ImsFeatureContainer fc =
                 getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fc);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fc);
         ImsFeatureContainer resultFc =
                 mRepository.getIfExists(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL).orElse(null);
         assertNotNull("returned connection should not be null!", resultFc);
@@ -110,8 +108,8 @@
     public void testGetInterfaceRemoveDoesntExist() throws Exception {
         ImsFeatureContainer fc =
                 getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fc);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, null);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fc);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, null);
         ImsFeatureContainer resultFc =
                 mRepository.getIfExists(TEST_PHONE_ID_1,
                 ImsFeature.FEATURE_MMTEL).orElse(null);
@@ -125,8 +123,8 @@
                 getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
         ImsFeatureContainer fcB =
                 getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcB);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcB);
         ImsFeatureContainer resultFc =
                 mRepository.getIfExists(TEST_PHONE_ID_1,
                         ImsFeature.FEATURE_MMTEL).orElse(null);
@@ -142,8 +140,8 @@
                 getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
         ImsFeatureContainer fcB =
                 getFeatureContainer(mMockRcsFeatureA, TEST_SERVICE_CAPS);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_RCS, fcB);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_RCS, fcB);
         ImsFeatureContainer resultFcA =
                 mRepository.getIfExists(TEST_PHONE_ID_1,
                         ImsFeature.FEATURE_MMTEL).orElse(null);
@@ -166,7 +164,7 @@
         mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 mConnectionCallback, Runnable::run);
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
     }
@@ -178,7 +176,7 @@
                 getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
         mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 mConnectionCallback, Runnable::run);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
 
@@ -186,8 +184,7 @@
         // Listener is "dead", so we should not get this update
         mRepository.notifyFeatureStateChanged(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 ImsFeature.STATE_READY);
-        verify(mConnectionCallback, never()).imsStatusChanged(ImsFeature.STATE_READY,
-                TEST_SUB_ID_3);
+        verify(mConnectionCallback, never()).imsStatusChanged(ImsFeature.STATE_READY);
     }
 
     @Test
@@ -197,18 +194,18 @@
                 getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
         mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 mConnectionCallback, Runnable::run);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
         ImsFeatureContainer resultFc =
                 mRepository.getIfExists(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL).orElse(null);
         assertNotNull(resultFc);
         assertEquals(ImsFeature.STATE_UNAVAILABLE, resultFc.getState());
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
-        verify(mConnectionCallback, never()).imsStatusChanged(anyInt(), eq(TEST_SUB_ID_3));
+        verify(mConnectionCallback, never()).imsStatusChanged(anyInt());
 
         mRepository.notifyFeatureStateChanged(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 ImsFeature.STATE_READY);
-        verify(mConnectionCallback).imsStatusChanged(ImsFeature.STATE_READY, TEST_SUB_ID_3);
+        verify(mConnectionCallback).imsStatusChanged(ImsFeature.STATE_READY);
         assertEquals(ImsFeature.STATE_READY, resultFc.getState());
     }
 
@@ -220,10 +217,9 @@
         mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 mConnectionCallback, Runnable::run);
 
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
         ImsFeatureContainer resultFc =
-                mRepository.getIfExists(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL).
-                                orElse(null);
+                mRepository.getIfExists(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL).orElse(null);
         assertNotNull(resultFc);
         assertEquals(TEST_SERVICE_CAPS, resultFc.getCapabilities());
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
@@ -243,10 +239,10 @@
                 getFeatureContainer(mMockMmTelFeatureB, TEST_SERVICE_CAPS);
         mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 mConnectionCallback, Runnable::run);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
         mRepository.unregisterForConnectionUpdates(mConnectionCallback);
 
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcB);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcB);
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
         verifyFeatureCreatedCalled(0 /*times*/, mConnectionCallback, fcB);
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
@@ -261,7 +257,7 @@
                 mConnectionCallback, Runnable::run);
         mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 mConnectionCallback, Runnable::run);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
     }
@@ -271,7 +267,7 @@
     public void testListenAfterUpdate() throws Exception {
         ImsFeatureContainer fcA =
                 getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
         mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 mConnectionCallback, Runnable::run);
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
@@ -283,7 +279,7 @@
     public void testListenNoUpdate() throws Exception {
         mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 mConnectionCallback, Runnable::run);
-        verify(mConnectionCallback, never()).imsFeatureCreated(any(), anyInt());
+        verify(mConnectionCallback, never()).imsFeatureCreated(any());
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
     }
 
@@ -292,7 +288,7 @@
     public void testListenNull() throws Exception {
         ImsFeatureContainer fcA =
                 getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
         mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 mConnectionCallback, Runnable::run);
         mRepository.removeConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL);
@@ -308,7 +304,7 @@
                 getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
         ImsFeatureContainer fcB =
                 getFeatureContainer(mMockRcsFeatureA, TEST_SERVICE_CAPS);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
         mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 mConnectionCallback, Runnable::run);
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
@@ -318,10 +314,10 @@
                 mConnectionCallback2, Runnable::run);
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
-        verify(mConnectionCallback2, never()).imsFeatureCreated(any(), eq(TEST_SUB_ID_3));
+        verify(mConnectionCallback2, never()).imsFeatureCreated(any());
         verify(mConnectionCallback2, never()).imsFeatureRemoved(anyInt());
 
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_RCS, fcB);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_RCS, fcB);
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback2, fcB);
@@ -335,7 +331,7 @@
                 getFeatureContainer(mMockMmTelFeatureA, TEST_SERVICE_CAPS);
         ImsFeatureContainer fcB =
                 getFeatureContainer(mMockRcsFeatureA, TEST_SERVICE_CAPS);
-        mRepository.addConnection(TEST_PHONE_ID_1, TEST_SUB_ID_3, ImsFeature.FEATURE_MMTEL, fcA);
+        mRepository.addConnection(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL, fcA);
         mRepository.registerForConnectionUpdates(TEST_PHONE_ID_1, ImsFeature.FEATURE_MMTEL,
                 mConnectionCallback, Runnable::run);
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
@@ -345,10 +341,10 @@
                 mConnectionCallback2, Runnable::run);
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
-        verify(mConnectionCallback2, never()).imsFeatureCreated(any(), anyInt());
+        verify(mConnectionCallback2, never()).imsFeatureCreated(any());
         verify(mConnectionCallback2, never()).imsFeatureRemoved(anyInt());
 
-        mRepository.addConnection(TEST_PHONE_ID_2, TEST_SUB_ID_3, ImsFeature.FEATURE_RCS, fcB);
+        mRepository.addConnection(TEST_PHONE_ID_2, ImsFeature.FEATURE_RCS, fcB);
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback, fcA);
         verify(mConnectionCallback, never()).imsFeatureRemoved(anyInt());
         verifyFeatureCreatedCalled(1 /*times*/, mConnectionCallback2, fcB);
@@ -357,7 +353,7 @@
 
     private void verifyFeatureCreatedCalled(int timesCalled, IImsServiceFeatureCallback cb,
             ImsFeatureContainer fc) throws Exception {
-        verify(cb, times(timesCalled)).imsFeatureCreated(fc, TEST_SUB_ID_3);
+        verify(cb, times(timesCalled)).imsFeatureCreated(fc);
     }
 
     private ImsFeatureContainer getFeatureContainer(IBinder feature, long caps) {
diff --git a/tests/src/com/android/ims/ImsManagerTest.java b/tests/src/com/android/ims/ImsManagerTest.java
index 0653908..3db8025 100644
--- a/tests/src/com/android/ims/ImsManagerTest.java
+++ b/tests/src/com/android/ims/ImsManagerTest.java
@@ -16,17 +16,11 @@
 
 package com.android.ims;
 
-import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO;
-import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE;
-import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
-import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_LTE;
-
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
@@ -37,27 +31,21 @@
 import android.content.res.Resources;
 import android.os.IBinder;
 import android.os.PersistableBundle;
-import android.os.RemoteException;
-import android.telephony.BinderCacheManager;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
 import android.telephony.ims.ImsMmTelManager;
-import android.telephony.ims.ImsRcsManager;
 import android.telephony.ims.ProvisioningManager;
 import android.telephony.ims.aidl.IImsConfig;
 import android.telephony.ims.aidl.IImsRegistration;
 import android.telephony.ims.aidl.ISipTransport;
 import android.telephony.ims.feature.MmTelFeature;
-import android.telephony.ims.feature.RcsFeature;
 import android.telephony.ims.stub.ImsConfigImplBase;
 import android.telephony.ims.stub.ImsRegistrationImplBase;
 
-import androidx.test.InstrumentationRegistry;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.os.SomeArgs;
-import com.android.internal.telephony.ITelephony;
 
 import org.junit.After;
 import org.junit.Before;
@@ -66,7 +54,6 @@
 import org.mockito.Mock;
 
 import java.util.Hashtable;
-import java.util.concurrent.Executor;
 
 @RunWith(AndroidJUnit4.class)
 public class ImsManagerTest extends ImsTestBase {
@@ -97,15 +84,10 @@
     @Mock ISipTransport mSipTransport;
     @Mock ImsManager.SubscriptionManagerProxy mSubscriptionManagerProxy;
     @Mock ImsManager.SettingsProxy mSettingsProxy;
-    @Mock BinderCacheManager mBinderCacheManager;
-    @Mock ITelephony mITelephony;
 
     private final int[] mSubId = {0};
     private final int mPhoneId = 1;
 
-    private boolean mMmTelProvisioningRequired = false;
-    private boolean mRcsProvisioningRequired = false;
-
     @Before
     public void setUp() throws Exception {
         super.setUp();
@@ -114,32 +96,22 @@
         doReturn(null).when(mContext).getMainLooper();
 
         doReturn(true).when(mMmTelFeatureConnection).isBinderAlive();
-        doReturn(mSubId[0]).when(mMmTelFeatureConnection).getSubId();
         mContextFixture.addSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS);
 
         doReturn(true).when(mSubscriptionManagerProxy).isValidSubscriptionId(anyInt());
+        doReturn(mSubId).when(mSubscriptionManagerProxy).getSubscriptionIds(eq(mPhoneId));
         doReturn(mSubId).when(mSubscriptionManagerProxy).getActiveSubscriptionIdList();
-        doReturn(mSubId).when(mSubscriptionManagerProxy).getSubscriptionIds(anyInt());
         doReturn(mPhoneId).when(mSubscriptionManagerProxy).getDefaultVoicePhoneId();
         doReturn(-1).when(mSubscriptionManagerProxy).getIntegerSubscriptionProperty(anyInt(),
                 anyString(), anyInt());
 
 
         setDefaultValues();
-
-        // allow READ_PRIVILEGED_PHONE_STATE permission
-        InstrumentationRegistry.getInstrumentation().getUiAutomation()
-                .adoptShellPermissionIdentity(
-                        "android.permission.READ_PRIVILEGED_PHONE_STATE");
     }
 
     @After
     public void tearDown() throws Exception {
         super.tearDown();
-
-        // release permission
-        InstrumentationRegistry.getInstrumentation().getUiAutomation()
-                .dropShellPermissionIdentity();
     }
 
     private void setDefaultValues() {
@@ -236,39 +208,6 @@
         args.recycle();
     }
 
-    @SmallTest
-    @Test
-    public void testTtyStats() {
-        setWfcEnabledByUser(true);
-        SomeArgs args = SomeArgs.obtain();
-        ImsManager.setImsStatsCallback(mPhoneId, new ImsManager.ImsStatsCallback() {
-            @Override
-            public void onEnabledMmTelCapabilitiesChanged(int capability, int regTech,
-                    boolean isEnabled) {
-                            if ((capability == MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE)
-                            && (regTech == ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN)) {
-                                    args.arg1 = isEnabled;
-                            }
-            }
-        });
-        //TTY over VoWIFI is not allowed
-        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOWIFI_TTY_SUPPORTED_BOOL, false);
-        ImsManager imsManager = getImsManagerAndInitProvisionedValues();
-        // Assert that the IMS stats callback is called properly when a tty setup changes.
-        try {
-                imsManager.setTtyMode(1);
-        } catch (ImsException e) {}
-        assertEquals(args.arg1, false);
-
-        //TTY over VoWIFI is allowed
-        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOWIFI_TTY_SUPPORTED_BOOL, true);
-        try {
-                imsManager.setTtyMode(1);
-        } catch (ImsException e) {}
-        assertEquals(args.arg1, true);
-        args.recycle();
-}
-
     @Test @SmallTest
     public void testSetValues() {
         setWfcEnabledByUser(true);
@@ -307,116 +246,48 @@
                 eq(SubscriptionManager.WFC_IMS_ENABLED),
                 eq("1"));
     }
-
     @Test
-    public void testGetProvisionedValuesForWfc() throws Exception {
+    public void testGetProvisionedValues() throws Exception {
         ImsManager imsManager = getImsManagerAndInitProvisionedValues();
 
-        mMmTelProvisioningRequired = true;
         assertEquals(true, imsManager.isWfcProvisionedOnDevice());
-        verify(mITelephony, times(1)).
-                isProvisioningRequiredForCapability(anyInt(),
-                        eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
-                        eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
-        verify(mITelephony, times(1)).getImsProvisioningStatusForCapability(
-                anyInt(),
-                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
-        clearInvocations(mITelephony);
+        verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+                eq(ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED));
 
-        mMmTelProvisioningRequired = false;
+        assertEquals(true, imsManager.isVtProvisionedOnDevice());
+        verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+                eq(ImsConfig.ConfigConstants.LVC_SETTING_ENABLED));
+
+        assertEquals(true, imsManager.isVolteProvisionedOnDevice());
+        verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+                eq(ImsConfig.ConfigConstants.VLT_SETTING_ENABLED));
+
+        // If we call get again, times should still be one because the value should be fetched
+        // from cache.
         assertEquals(true, imsManager.isWfcProvisionedOnDevice());
-        verify(mITelephony, times(1)).
-                isProvisioningRequiredForCapability(anyInt(),
-                        eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
-                        eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
-        clearInvocations(mITelephony);
-    }
+        verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+                eq(ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED));
 
-    @Test
-    public void testGetProvisionedValuesForVt() throws Exception {
-        ImsManager imsManager = getImsManagerAndInitProvisionedValues();
-
-        mMmTelProvisioningRequired = true;
         assertEquals(true, imsManager.isVtProvisionedOnDevice());
-        verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
-                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
-        verify(mITelephony, times(1)).getImsProvisioningStatusForCapability(
-                anyInt(),
-                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
-        clearInvocations(mITelephony);
+        verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+                eq(ImsConfig.ConfigConstants.LVC_SETTING_ENABLED));
 
-        mMmTelProvisioningRequired = false;
-        assertEquals(true, imsManager.isVtProvisionedOnDevice());
-        verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
-                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
-        clearInvocations(mITelephony);
-    }
-
-    @Test
-    public void testGetProvisionedValuesForVolte() throws Exception {
-        ImsManager imsManager = getImsManagerAndInitProvisionedValues();
-
-        mMmTelProvisioningRequired = true;
         assertEquals(true, imsManager.isVolteProvisionedOnDevice());
-        verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
-                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
-        verify(mITelephony, times(1)).getImsProvisioningStatusForCapability(
-                anyInt(),
-                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
-        clearInvocations(mITelephony);
+        verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+                eq(ImsConfig.ConfigConstants.VLT_SETTING_ENABLED));
 
-        mMmTelProvisioningRequired = false;
-        assertEquals(true, imsManager.isVolteProvisionedOnDevice());
-        verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
-                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
-        clearInvocations(mITelephony);
-    }
-
-    @Test
-    public void testGetProvisionedValuesForEab() throws Exception {
-        ImsManager imsManager = getImsManagerAndInitProvisionedValues();
-
-        mRcsProvisioningRequired = true;
         assertEquals(true, imsManager.isEabProvisionedOnDevice());
-        verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(),
-                eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
-        verify(mITelephony, times(1)).getRcsProvisioningStatusForCapability(
-                anyInt(),
-                eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
-        clearInvocations(mITelephony);
-
-        mRcsProvisioningRequired = false;
-        assertEquals(true, imsManager.isEabProvisionedOnDevice());
-        verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(),
-                eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
-        clearInvocations(mITelephony);
+        verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+                eq(ImsConfig.ConfigConstants.EAB_SETTING_ENABLED));
     }
 
     @Test
     public void testSetProvisionedValues() throws Exception {
         ImsManager imsManager = getImsManagerAndInitProvisionedValues();
 
-        mMmTelProvisioningRequired = true;
         assertEquals(true, imsManager.isWfcProvisionedOnDevice());
-        verify(mITelephony, times(1)).
-                isProvisioningRequiredForCapability(anyInt(),
-                        eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
-                        eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
-        verify(mITelephony, times(1)).getImsProvisioningStatusForCapability(
-                anyInt(),
-                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
-        clearInvocations(mITelephony);
+        verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+                eq(ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED));
 
         imsManager.getConfigInterface().setProvisionedValue(
                 ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED,
@@ -430,28 +301,17 @@
         verify(mImsConfigImplBaseMock, times(1)).setConfig(
                 eq(ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED),
                 eq(0));
-
-        verify(mITelephony, times(1)).getImsProvisioningStatusForCapability(
-                anyInt(),
-                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
+        verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+                eq(ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED));
     }
 
     @Test
     public void testEabSetProvisionedValues() throws Exception {
         ImsManager imsManager = getImsManagerAndInitProvisionedValues();
 
-        mRcsProvisioningRequired = true;
         assertEquals(true, imsManager.isEabProvisionedOnDevice());
-
-        verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(),
-                eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
-        verify(mITelephony, times(1)).getRcsProvisioningStatusForCapability(
-                anyInt(),
-                eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
-        clearInvocations(mITelephony);
+        verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+                eq(ImsConfig.ConfigConstants.EAB_SETTING_ENABLED));
 
         imsManager.getConfigInterface().setProvisionedValue(
                 ImsConfig.ConfigConstants.EAB_SETTING_ENABLED,
@@ -465,11 +325,8 @@
         verify(mImsConfigImplBaseMock, times(1)).setConfig(
                 eq(ImsConfig.ConfigConstants.EAB_SETTING_ENABLED),
                 eq(0));
-
-        verify(mITelephony, times(1)).getRcsProvisioningStatusForCapability(
-                anyInt(),
-                eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
-                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
+        verify(mImsConfigImplBaseMock, times(1)).getConfigInt(
+                eq(ImsConfig.ConfigConstants.EAB_SETTING_ENABLED));
     }
 
     /**
@@ -969,21 +826,6 @@
                 anyInt());
     }
 
-    @Test @SmallTest
-    public void testShouldProcessCall_ThrowsExceptionIfServiceIsStillInitializing() {
-        ImsManager imsManager = getImsManagerAndInitProvisionedValues();
-        doReturn(-1).when(mMmTelFeatureConnection).getSubId();
-        assertThrows(ImsException.class, () -> imsManager.shouldProcessCall(true, new String[1]));
-    }
-
-    @Test @SmallTest
-    public void testShouldProcessCall_DoesNotThrowExceptionWhenServiceInitialized()
-        throws Exception {
-        ImsManager imsManager = getImsManagerAndInitProvisionedValues();
-        int ret = imsManager.shouldProcessCall(true, new String[1]);
-        assertEquals(MmTelFeature.PROCESS_CALL_IMS, ret);
-    }
-
     /**
      * Tests the operation of setWfcRoamingSetting and ensures that the user setting for WFC roaming
      * and the ImsConfig setting are both called properly.
@@ -1027,51 +869,15 @@
 
 
         // Configure ImsConfigStub
-        mImsConfigStub = new ImsConfigImplBase.ImsConfigStub(mImsConfigImplBaseMock, Runnable::run);
+        mImsConfigStub = new ImsConfigImplBase.ImsConfigStub(mImsConfigImplBaseMock);
         doReturn(mImsConfigStub).when(mMmTelFeatureConnection).getConfig();
 
-        when(mBinderCacheManager.getBinder())
-                .thenReturn(mITelephony);
-
-        try {
-            when(mITelephony.getImsProvisioningInt(anyInt(), anyInt()))
-                    .thenAnswer(invocation -> {
-                        return getProvisionedInt((Integer) (invocation.getArguments()[1]));
-                    });
-            when(mITelephony.setImsProvisioningInt(anyInt(), anyInt(), anyInt()))
-                    .thenAnswer(invocation -> {
-                        mProvisionedIntVals.put((Integer) (invocation.getArguments()[1]),
-                                (Integer) (invocation.getArguments()[2]));
-                        return ImsConfig.OperationStatusConstants.SUCCESS;
-                    });
-            when(mITelephony.isProvisioningRequiredForCapability(anyInt(), anyInt(), anyInt()))
-                    .thenAnswer(invocation -> {
-                        return mMmTelProvisioningRequired;
-                    });
-            when(mITelephony.isRcsProvisioningRequiredForCapability(anyInt(), anyInt(), anyInt()))
-                    .thenAnswer(invocation -> {
-                        return mRcsProvisioningRequired;
-                    });
-            when(mITelephony.getImsProvisioningStatusForCapability(anyInt(), anyInt(), anyInt()))
-                    .thenAnswer(invocation -> {
-                        return getImsProvisioningStatusForCapability(
-                                (Integer) (invocation.getArguments()[1]),
-                                (Integer) (invocation.getArguments()[2]));
-                    });
-            when(mITelephony.getRcsProvisioningStatusForCapability(anyInt(),
-                    eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
-                    eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)))
-                    .thenAnswer(invocation -> {
-                        return getEabProvisioningStatusForCapability();
-                    });
-        } catch (RemoteException e) {}
-
         ImsManager mgr = new ImsManager(mContext, mPhoneId,
-                (context, phoneId, subId, feature, c, r, s) -> mMmTelFeatureConnection,
-                mSubscriptionManagerProxy, mSettingsProxy, mBinderCacheManager);
+                (context, phoneId, feature, c, r, s) -> mMmTelFeatureConnection,
+                mSubscriptionManagerProxy, mSettingsProxy);
         ImsFeatureContainer c = new ImsFeatureContainer(mMmTelFeature, mImsConfig, mImsReg,
                 mSipTransport, 0 /*caps*/);
-        mgr.associate(c, mSubId[0]);
+        mgr.associate(c);
         // Enabled WFC by default
         setWfcEnabledByPlatform(true);
         return mgr;
@@ -1098,30 +904,4 @@
             return ImsConfig.FeatureValueConstants.ON;
         }
     }
-
-    private boolean getImsProvisioningStatusForCapability(int capability, int tech) {
-        int key = getKeyFromCapability(capability, tech);
-        int provisioned = getProvisionedInt(key);
-
-        return (provisioned == ImsConfig.FeatureValueConstants.ON);
-    }
-
-    private boolean getEabProvisioningStatusForCapability() {
-        int provisioned = getProvisionedInt(ProvisioningManager.KEY_EAB_PROVISIONING_STATUS);
-
-        return (provisioned == ImsConfig.FeatureValueConstants.ON);
-    }
-
-    private int getKeyFromCapability(int capability, int tech) {
-        int key = -1; // INVALID_VALUE
-        if (capability == CAPABILITY_TYPE_VOICE && tech == REGISTRATION_TECH_IWLAN) {
-            key = ProvisioningManager.KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE;
-        } else if (capability == CAPABILITY_TYPE_VOICE && tech == REGISTRATION_TECH_LTE) {
-            key = ProvisioningManager.KEY_VOLTE_PROVISIONING_STATUS;
-        } else if (capability == CAPABILITY_TYPE_VIDEO && tech == REGISTRATION_TECH_LTE) {
-            key = ProvisioningManager.KEY_VT_PROVISIONING_STATUS;
-        }
-
-        return key;
-    }
 }
diff --git a/tests/src/com/android/ims/ImsUtTest.java b/tests/src/com/android/ims/ImsUtTest.java
index 71722ce..634b4d9 100644
--- a/tests/src/com/android/ims/ImsUtTest.java
+++ b/tests/src/com/android/ims/ImsUtTest.java
@@ -97,7 +97,7 @@
     public void testClirConversionCompat() throws Exception {
         ArgumentCaptor<ImsUt.IImsUtListenerProxy> captor =
                 ArgumentCaptor.forClass(ImsUt.IImsUtListenerProxy.class);
-        ImsUt mImsUt = new ImsUt(mImsUtBinder, Runnable::run);
+        ImsUt mImsUt = new ImsUt(mImsUtBinder);
         verify(mImsUtBinder).setListener(captor.capture());
         ImsUt.IImsUtListenerProxy proxy = captor.getValue();
         assertNotNull(proxy);
@@ -125,7 +125,7 @@
     public void testClipConversionCompat() throws Exception {
         ArgumentCaptor<ImsUt.IImsUtListenerProxy> captor =
                 ArgumentCaptor.forClass(ImsUt.IImsUtListenerProxy.class);
-        ImsUt mImsUt = new ImsUt(mImsUtBinder, Runnable::run);
+        ImsUt mImsUt = new ImsUt(mImsUtBinder);
         verify(mImsUtBinder).setListener(captor.capture());
         ImsUt.IImsUtListenerProxy proxy = captor.getValue();
         assertNotNull(proxy);
diff --git a/tests/src/com/android/ims/MmTelFeatureConnectionTest.java b/tests/src/com/android/ims/MmTelFeatureConnectionTest.java
index f114838..620fa23 100644
--- a/tests/src/com/android/ims/MmTelFeatureConnectionTest.java
+++ b/tests/src/com/android/ims/MmTelFeatureConnectionTest.java
@@ -18,13 +18,19 @@
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.when;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 
 import android.content.Context;
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.IInterface;
-import android.telephony.ims.feature.ImsFeature;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
@@ -33,7 +39,6 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -53,56 +58,33 @@
             ImsCallbackAdapterManager<TestCallback> {
 
         List<TestCallback> mCallbacks = new ArrayList<>();
-        FeatureConnection mFeatureConnection;
 
-        CallbackManagerTest(Context context, Object lock, FeatureConnection featureConnection) {
-            super(context, lock, SLOT_ID, SUB_ID);
-            mFeatureConnection = featureConnection;
+        CallbackManagerTest(Context context, Object lock) {
+            super(context, lock, 0 /*slotId*/);
         }
 
         // A callback has been registered. Register that callback with the MmTelFeature.
         @Override
         public void registerCallback(TestCallback localCallback) {
-            if (!isBinderReady()) {
-                return;
-            }
             mCallbacks.add(localCallback);
         }
 
         // A callback has been removed, unregister that callback with the MmTelFeature.
         @Override
         public void unregisterCallback(TestCallback localCallback) {
-            if (!mFeatureConnection.isBinderAlive()) {
-                return;
-            }
             mCallbacks.remove(localCallback);
         }
 
         public boolean doesCallbackExist(TestCallback callback) {
             return mCallbacks.contains(callback);
         }
-
-        public boolean isBinderReady() {
-            return mFeatureConnection.isBinderAlive()
-                    && mFeatureConnection.getFeatureState() == ImsFeature.STATE_READY;
-        }
     }
-
     private CallbackManagerTest mCallbackManagerUT;
 
-    @Mock
-    FeatureConnection mFeatureConnection;
-
-    public static final int SUB_ID = 1;
-    public static final int SLOT_ID = 0;
-
     @Before
     public void setUp() throws Exception {
         super.setUp();
-
-        when(mFeatureConnection.isBinderAlive()).thenReturn(true);
-        when(mFeatureConnection.getFeatureState()).thenReturn(ImsFeature.STATE_READY);
-        mCallbackManagerUT = new CallbackManagerTest(mContext, this, mFeatureConnection);
+        mCallbackManagerUT = new CallbackManagerTest(mContext, this);
     }
 
     @After
@@ -121,47 +103,160 @@
         TestCallback testCallback = new TestCallback();
         mCallbackManagerUT.addCallback(testCallback);
         assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback));
+        // The subscriptions changed listener should only be added for callbacks that are being
+        // linked to a subscription.
+        verify(mSubscriptionManager, never()).addOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
 
         mCallbackManagerUT.removeCallback(testCallback);
         assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback));
+        // The subscriptions changed listener should only be removed for callbacks that are
+        // linked to a subscription.
+        verify(mSubscriptionManager, never()).removeOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
     }
 
     /**
      * Ensure that adding the callback and linking subId triggers the appropriate registerCallback
-     * and unregisterCallback calls.
+     * and unregisterCallback calls as well as the subscriptionChanged listener.
      */
     @Test
     @SmallTest
-    public void testCallbackAdapter_addCallbackForSubAndRemove() throws Exception {
+    public void testCallbackAdapter_addAndRemoveCallbackForSub() throws Exception {
         TestCallback testCallback = new TestCallback();
         int testSub = 1;
         mCallbackManagerUT.addCallbackForSubscription(testCallback, testSub);
         assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback));
+        verify(mSubscriptionManager, times(1)).addOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
 
-        mCallbackManagerUT.removeCallback(testCallback);
+        mCallbackManagerUT.removeCallbackForSubscription(testCallback, testSub);
         assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback));
+        verify(mSubscriptionManager, times(1)).removeOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
     }
 
     /**
-     * The close() method has been called, so all callbacks should be cleaned up and notified
-     * that they have been removed.
+     * Ensure that adding the callback and linking multiple subIds trigger the appropriate
+     * registerCallback and unregisterCallback calls as well as the subscriptionChanged listener.
+     * When removing the callbacks, the subscriptionChanged listener shoud only be removed when all
+     * callbacks have been removed.
      */
     @Test
     @SmallTest
-    public void testCallbackAdapter_closeSub() throws Exception {
+    public void testCallbackAdapter_addAndRemoveCallbackForMultipleSubs() throws Exception {
         TestCallback testCallback1 = new TestCallback();
+        TestCallback testCallback2 = new TestCallback();
         int testSub1 = 1;
-
+        int testSub2 = 2;
         mCallbackManagerUT.addCallbackForSubscription(testCallback1, testSub1);
         assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
+        mCallbackManagerUT.addCallbackForSubscription(testCallback2, testSub2);
+        assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback2));
+        // This should only happen once.
+        verify(mSubscriptionManager, times(1)).addOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
 
-        // Close the manager, ensure subscription callback are removed
-        mCallbackManagerUT.close();
+        mCallbackManagerUT.removeCallbackForSubscription(testCallback1, testSub1);
         assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
+        // removing the listener should not happen until the second callback is removed.
+        verify(mSubscriptionManager, never()).removeOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
+
+        mCallbackManagerUT.removeCallbackForSubscription(testCallback2, testSub2);
+        assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback2));
+        verify(mSubscriptionManager, times(1)).removeOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
     }
 
     /**
-     * The close() method has been called, so all callbacks should be cleaned up.
+     * The subscriptions have changed, ensure that the callbacks registered to the original
+     * subscription testSub1 are removed, while keeping the callbacks for testSub2, since it was not
+     * removed.
+     */
+    @Test
+    @SmallTest
+    public void testCallbackAdapter_onSubscriptionsChangedMultipleSubs() throws Exception {
+        TestCallback testCallback1 = new TestCallback();
+        TestCallback testCallback2 = new TestCallback();
+        int testSub1 = 1;
+        int testSub2 = 2;
+        int testSub3 = 3;
+        mCallbackManagerUT.addCallbackForSubscription(testCallback1, testSub1);
+        assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
+        mCallbackManagerUT.addCallbackForSubscription(testCallback2, testSub2);
+        assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback2));
+        verify(mSubscriptionManager, times(1)).addOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
+
+        // Simulate subscriptions changed, where testSub1 is no longer active
+        doReturn(createSubscriptionInfoList(new int[] {testSub2, testSub3}))
+                .when(mSubscriptionManager).getActiveSubscriptionInfoList(anyBoolean());
+        mCallbackManagerUT.mSubChangedListener.onSubscriptionsChanged();
+        assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
+        // verify that the subscription changed listener is not removed, since we still have a
+        // callback on testSub2
+        verify(mSubscriptionManager, never()).removeOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
+    }
+
+    /**
+     * The active subscription has changed, ensure that the callback registered to the original
+     * subscription testSub1 are removed as well as the subscription changed listener, since
+     * there are mo more active callbacks.
+     */
+    @Test
+    @SmallTest
+    public void testCallbackAdapter_onSubscriptionsChangedOneSub() throws Exception {
+        TestCallback testCallback1 = new TestCallback();
+        int testSub1 = 1;
+        int testSub2 = 2;
+        mCallbackManagerUT.addCallbackForSubscription(testCallback1, testSub1);
+        assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
+        verify(mSubscriptionManager, times(1)).addOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
+
+        // Simulate subscriptions changed, where testSub1 is no longer active
+        doReturn(createSubscriptionInfoList(new int[] {testSub2}))
+                .when(mSubscriptionManager).getActiveSubscriptionInfoList(anyBoolean());
+        mCallbackManagerUT.mSubChangedListener.onSubscriptionsChanged();
+        assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
+        // verify that the subscription listener is removed, since the only active callback has been
+        // removed.
+        verify(mSubscriptionManager, times(1)).removeOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
+    }
+
+    /**
+     * The close() method has been called, so al callbacks should be cleaned up and notified
+     * that they have been removed. The subscriptions changed listener should also be removed.
+     */
+    @Test
+    @SmallTest
+    public void testCallbackAdapter_closeMultipleSubs() throws Exception {
+        TestCallback testCallback1 = new TestCallback();
+        TestCallback testCallback2 = new TestCallback();
+        int testSub1 = 1;
+        int testSub2 = 2;
+        mCallbackManagerUT.addCallbackForSubscription(testCallback1, testSub1);
+        assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
+        mCallbackManagerUT.addCallbackForSubscription(testCallback2, testSub2);
+        assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback2));
+        verify(mSubscriptionManager, times(1)).addOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
+
+        // Close the manager, ensure all subscription callbacks are removed
+        mCallbackManagerUT.close();
+        assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
+        assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback2));
+        // verify that the subscription changed listener is removed.
+        verify(mSubscriptionManager, times(1)).removeOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
+    }
+
+    /**
+     * The close() method has been called, so all callbacks should be cleaned up. Since they are
+     * not associated with any subscriptions, no subscription based logic should be called.
      */
     @Test
     @SmallTest
@@ -172,68 +267,27 @@
         assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
         mCallbackManagerUT.addCallback(testCallback2);
         assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback2));
+        // verify that the subscription changed listener is never called for these callbacks
+        // because they are not associated with any subscriptions.
+        verify(mSubscriptionManager, never()).addOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
 
         // Close the manager, ensure all subscription callbacks are removed
         mCallbackManagerUT.close();
         assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
         assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback2));
+        // verify that the subscription changed removed method is never called
+        verify(mSubscriptionManager, never()).removeOnSubscriptionsChangedListener(
+                any(SubscriptionManager.OnSubscriptionsChangedListener.class));
     }
 
-
-    /**
-     * UnregisterCallback is success After ImsFeatureState changed to STATE_UNAVAILABLE.
-     */
-    @Test
-    @SmallTest
-    public void testCallbackAdapter_removeCallbackSuccessAfterImsFeatureStateChangeToUnavailable()
-            throws Exception {
-        TestCallback testCallback1 = new TestCallback();
-        mCallbackManagerUT.addCallback(testCallback1);
-        assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
-        mCallbackManagerUT.removeCallback(testCallback1);
-        assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
-
-        TestCallback testCallback2 = new TestCallback();
-        mCallbackManagerUT.addCallback(testCallback2);
-        assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback2));
-        assertTrue(mCallbackManagerUT.isBinderReady());
-        when(mFeatureConnection.getFeatureState()).thenReturn(ImsFeature.STATE_UNAVAILABLE);
-        assertFalse(mCallbackManagerUT.isBinderReady());
-        mCallbackManagerUT.removeCallback(testCallback2);
-        assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback2));
-    }
-
-    /**
-     * UnregisterCallback is failed After binder isn't alive.
-     */
-    @Test
-    @SmallTest
-    public void testCallbackAdapter_removeCallbackFailedAfterBinderIsNotAlive() throws Exception {
-        TestCallback testCallback1 = new TestCallback();
-        mCallbackManagerUT.addCallback(testCallback1);
-        assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
-
-        when(mFeatureConnection.isBinderAlive()).thenReturn(false);
-        mCallbackManagerUT.removeCallback(testCallback1);
-        assertTrue(mCallbackManagerUT.doesCallbackExist(testCallback1));
-    }
-
-    /**
-     * RegisterCallback is failed After binder isn't ready.
-     */
-    @Test
-    @SmallTest
-    public void testCallbackAdapter_addCallbackFailedAfterBinderIsNotReady() throws Exception {
-        when(mFeatureConnection.isBinderAlive()).thenReturn(false);
-        assertFalse(mCallbackManagerUT.isBinderReady());
-        TestCallback testCallback1 = new TestCallback();
-        mCallbackManagerUT.addCallback(testCallback1);
-        assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
-
-        when(mFeatureConnection.isBinderAlive()).thenReturn(true);
-        when(mFeatureConnection.getFeatureState()).thenReturn(ImsFeature.STATE_UNAVAILABLE);
-        assertFalse(mCallbackManagerUT.isBinderReady());
-        mCallbackManagerUT.addCallback(testCallback1);
-        assertFalse(mCallbackManagerUT.doesCallbackExist(testCallback1));
+    private List<SubscriptionInfo> createSubscriptionInfoList(int[] subIds) {
+        List<SubscriptionInfo> infos = new ArrayList<>();
+        for (int i = 0; i < subIds.length; i++) {
+            SubscriptionInfo info = new SubscriptionInfo(subIds[i], null, -1, null, null, -1, -1,
+                    null, -1, null, null, null, null, false, null, null);
+            infos.add(info);
+        }
+        return infos;
     }
 }
diff --git a/tests/src/com/android/ims/rcs/uce/UceControllerTest.java b/tests/src/com/android/ims/rcs/uce/UceControllerTest.java
index 021a7c1..69d5281 100644
--- a/tests/src/com/android/ims/rcs/uce/UceControllerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/UceControllerTest.java
@@ -19,7 +19,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
@@ -174,9 +173,6 @@
         UceController uceController = createUceController();
         uceController.onRcsConnected(mFeatureManager);
         doReturn(false).when(mDeviceStateResult).isRequestForbidden();
-        // This API should only be applied to PUBLISH.
-        // Even if the return value is true, the capabilities request must be processed.
-        doReturn(true).when(mDeviceStateResult).isPublishRequestBlocked();
 
         List<Uri> uriList = new ArrayList<>();
         uriList.add(Uri.fromParts("sip", "test", null));
@@ -253,9 +249,9 @@
     public void testRegisterPublishStateCallback() {
         UceController uceController = createUceController();
 
-        uceController.registerPublishStateCallback(any(), anyBoolean());
+        uceController.registerPublishStateCallback(any());
 
-        verify(mPublishController).registerPublishStateCallback(any(), anyBoolean());
+        verify(mPublishController).registerPublishStateCallback(any());
     }
 
     @Test
@@ -273,9 +269,9 @@
     public void testGetUcePublishState() {
         UceController uceController = createUceController();
 
-        uceController.getUcePublishState(anyBoolean());
+        uceController.getUcePublishState();
 
-        verify(mPublishController).getUcePublishState(anyBoolean());
+        verify(mPublishController).getUcePublishState();
     }
 
     private UceController createUceController() {
diff --git a/tests/src/com/android/ims/rcs/uce/UceStatsWriterTest.java b/tests/src/com/android/ims/rcs/uce/UceStatsWriterTest.java
deleted file mode 100644
index 49edf19..0000000
--- a/tests/src/com/android/ims/rcs/uce/UceStatsWriterTest.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import android.telephony.ims.RcsContactPresenceTuple;
-import android.telephony.ims.RcsContactUceCapability;
-
-import com.android.ims.rcs.uce.UceStatsWriter;
-import com.android.ims.rcs.uce.UceStatsWriter.UceStatsCallback;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class UceStatsWriterTest {
-    private int mSubId = 3;
-    private long mTaskId = 5;
-    private int mRegistrationTech = 3;
-    private int mType = 2;
-    private boolean mSuccessful = true;
-    private int mCommandCode = 4;
-    private int mNetworkResponse = 200;
-    private String mReason = "noresource";
-
-    private Callback mCallback;
-    private TestableUceStatsWriter mWrite;
-
-    class Callback implements UceStatsCallback {
-        int subId;
-        List<String> featureTagList;
-        List<String> serviceIdList;
-        List<String> versions;
-        int registrationTech;
-        int type;
-        boolean successful;
-        int commandCode;
-        int networkResponse;
-        long taskId;
-        List<RcsContactUceCapability> updatedCapList;
-        String reason;
-
-        Callback() {
-        }
-
-        public void onImsRegistrationFeatureTagStats(int subId, List<String> featureTagList,
-            int registrationTech) {
-            this.subId = subId;
-            this.featureTagList = featureTagList;
-            this.registrationTech = registrationTech;
-        }
-
-        public void onStoreCompleteImsRegistrationFeatureTagStats(int subId) {}
-
-        public void onImsRegistrationServiceDescStats(int subId, List<String> serviceIdList,
-            List<String> serviceIdVersionList, int registrationTech) {
-            this.subId = subId;
-            this.serviceIdList = serviceIdList;
-            this.versions = serviceIdVersionList;
-            this.registrationTech = registrationTech;
-        }
-
-        public void onSubscribeResponse(int subId, long taskId, int networkResponse) {
-            this.subId = subId;
-            this.taskId = taskId;
-            this.successful = true;
-            this.commandCode = 0;
-            this.networkResponse = networkResponse;
-        }
-
-        public void onUceEvent(int subId, int type, boolean successful, int commandCode,
-            int networkResponse) {
-            this.subId = subId;
-            this.type = type;
-            this.successful = successful;
-            this.commandCode = commandCode;
-            this.networkResponse = networkResponse;
-        }
-
-        public void onSubscribeTerminated(int subId, long taskId, String reason) {
-            this.subId = subId;
-            this.taskId = taskId;
-            this.reason = reason;
-        }
-
-        public void onPresenceNotifyEvent(int subId, long taskId,
-            List<RcsContactUceCapability> updatedCapList) {
-            this.subId = subId;
-            this.taskId = taskId;
-            this.updatedCapList = updatedCapList;
-        }
-
-        public void onStoreCompleteImsRegistrationServiceDescStats(int subId) {
-            this.subId = subId;
-        }
-    }
-
-    private class TestableUceStatsWriter extends UceStatsWriter {
-        public TestableUceStatsWriter(UceStatsCallback callback) {
-            super(callback);
-        }
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        mCallback = new Callback();
-        mWrite = new TestableUceStatsWriter(mCallback);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-    }
-
-    @Test
-    @SmallTest
-    public void setImsRegistrationFeatureTagStats() throws Exception {
-        List<String> featureTags = new ArrayList<>();
-        featureTags.add("+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.im\"");
-        featureTags.add("+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gpp-service.ims.icsi.oma.cpm.session\"");
-        featureTags.add("+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.ftsms\"");
-        mWrite.setImsRegistrationFeatureTagStats(mSubId, featureTags, mRegistrationTech);
-        assertEquals(mSubId, mCallback.subId);
-        for (int index = 0; index < featureTags.size(); index++) {
-            assertEquals(featureTags.get(index), mCallback.featureTagList.get(index));
-        }
-        assertEquals(mRegistrationTech, mCallback.registrationTech);
-    }
-
-    @Test
-    @SmallTest
-    public void setImsRegistrationServiceDescStats() throws Exception {
-        List<RcsContactPresenceTuple> tupleList = new ArrayList<>();
-        tupleList.add(getContactChatTuple());
-        tupleList.add(getContactFtTuple());
-        tupleList.add(getContactUnknown1Tuple());
-        tupleList.add(getContactUnknown2Tuple());
-        mWrite.setImsRegistrationServiceDescStats(mSubId, tupleList, mRegistrationTech);
-        assertEquals(mSubId, mCallback.subId);
-        for (int index = 0; index < tupleList.size(); index++) {
-            assertEquals(tupleList.get(index).getServiceId(), mCallback.serviceIdList.get(index));
-            assertEquals(tupleList.get(index).getServiceVersion(), mCallback.versions.get(index));
-        }
-        assertEquals(mRegistrationTech, mCallback.registrationTech);
-    }
-
-    @Test
-    @SmallTest
-    public void setSubscribeEvent() throws Exception {
-        mWrite.setSubscribeResponse(mSubId, mTaskId, mNetworkResponse);
-        assertEquals(mSubId, mCallback.subId);
-        assertEquals(mTaskId, mCallback.taskId);
-        assertTrue(mCallback.successful);
-        assertEquals(0, mCallback.commandCode);
-        assertEquals(mNetworkResponse, mCallback.networkResponse);
-    }
-
-    @Test
-    @SmallTest
-    public void setSubscribeTerminated() throws Exception {
-        mWrite.setSubscribeResponse(mSubId, mTaskId, mNetworkResponse);
-        mWrite.setSubscribeTerminated(mSubId, mTaskId, mReason);
-        assertEquals(mSubId, mCallback.subId);
-        assertEquals(mTaskId, mCallback.taskId);
-        assertEquals(mReason, mCallback.reason);
-    }
-
-    @Test
-    @SmallTest
-    public void setUceEvent() throws Exception {
-        mWrite.setUceEvent(mSubId, mType, mSuccessful, mCommandCode, mNetworkResponse);
-        assertEquals(mSubId, mCallback.subId);
-        assertEquals(mType, mCallback.type);
-        assertEquals(mSuccessful, mCallback.successful);
-        assertEquals(mCommandCode, mCallback.commandCode);
-        assertEquals(mNetworkResponse, mCallback.networkResponse);
-    }
-
-    @Test
-    @SmallTest
-    public void setPresenceNotifyEvent() throws Exception {
-        List<RcsContactUceCapability> updatedCapList = new ArrayList<>();
-        RcsContactUceCapability.PresenceBuilder builder =
-            new RcsContactUceCapability.PresenceBuilder(null, 0, 2);
-        builder.addCapabilityTuple(getContactChatTuple());
-        builder.addCapabilityTuple(getContactCallComposer2Tuple());
-        builder.addCapabilityTuple(getContactUnknown1Tuple());
-        updatedCapList.add(builder.build());
-
-        mWrite.setPresenceNotifyEvent(mSubId, mTaskId, updatedCapList);
-        assertEquals(mSubId, mCallback.subId);
-        assertEquals(mTaskId, mCallback.taskId);
-        assertEquals(updatedCapList.size(), mCallback.updatedCapList.size());
-        for (int index = 0; index < updatedCapList.size(); index++) {
-            RcsContactUceCapability input = updatedCapList.get(index);
-            RcsContactUceCapability output = mCallback.updatedCapList.get(index);
-            assertEquals(input.getCapabilityTuples().size(), output.getCapabilityTuples().size());
-        }
-    }
-
-    @Test
-    @SmallTest
-    public void setPresenceNotifyEvent_withCallComposer2Caps() throws Exception {
-        RcsContactPresenceTuple tuple = getContactCallComposer2Tuple();
-        List<RcsContactUceCapability> updatedCapList = new ArrayList<>();
-        RcsContactUceCapability.PresenceBuilder builder =
-            new RcsContactUceCapability.PresenceBuilder(null, 0, 2);
-        builder.addCapabilityTuple(getContactCallComposer2Tuple());
-        updatedCapList.add(builder.build());
-
-        mWrite.setPresenceNotifyEvent(mSubId, mTaskId, updatedCapList);
-        assertEquals(mSubId, mCallback.subId);
-        assertEquals(mTaskId, mCallback.taskId);
-        assertEquals(updatedCapList.size(), mCallback.updatedCapList.size());
-    }
-
-    @Test
-    @SmallTest
-    public void setUnPublish() throws Exception {
-        mWrite.setUnPublish(mSubId);
-        assertEquals(mSubId, mCallback.subId);
-    }
-
-    private RcsContactPresenceTuple getContactChatTuple() {
-        RcsContactPresenceTuple.Builder builder =
-            new RcsContactPresenceTuple.Builder("open", RcsContactPresenceTuple.SERVICE_ID_CHAT_V1,
-                "1.0");
-        return builder.build();
-    }
-
-    private RcsContactPresenceTuple getContactMmtelTuple() {
-        RcsContactPresenceTuple.Builder builder =
-            new RcsContactPresenceTuple.Builder("open", RcsContactPresenceTuple.SERVICE_ID_MMTEL,
-                "1.0");
-        return builder.build();
-    }
-
-    private RcsContactPresenceTuple getContactFtTuple() {
-        RcsContactPresenceTuple.Builder builder =
-            new RcsContactPresenceTuple.Builder("open", RcsContactPresenceTuple.SERVICE_ID_FT,
-                "1.0");
-        return builder.build();
-    }
-
-    private RcsContactPresenceTuple getContactCallComposer2Tuple() {
-        RcsContactPresenceTuple.Builder builder =
-            new RcsContactPresenceTuple.Builder("open",
-                RcsContactPresenceTuple.SERVICE_ID_CALL_COMPOSER,
-                "2.0");
-        return builder.build();
-    }
-
-    private RcsContactPresenceTuple getContactUnknown1Tuple() {
-        RcsContactPresenceTuple.Builder builder =
-            new RcsContactPresenceTuple.Builder("open", "Unknown1",
-                "8.0");
-        return builder.build();
-    }
-
-    private RcsContactPresenceTuple getContactUnknown2Tuple() {
-        RcsContactPresenceTuple.Builder builder =
-            new RcsContactPresenceTuple.Builder("open", "Unknown2",
-                "9.0");
-        return builder.build();
-    }
-}
diff --git a/tests/src/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdaterTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdaterTest.java
index 5c2a04b..61b0431 100644
--- a/tests/src/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdaterTest.java
+++ b/tests/src/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdaterTest.java
@@ -173,35 +173,6 @@
                 any(IRcsUceControllerCallback.class));
     }
 
-    @Test
-    public void testCarrierConfigEnabled() throws Exception {
-        // mock user settings
-        mockUceUserSettings(true);
-        mockBulkCapabilityCarrierConfig(false);
-        // mock expired contact list
-        List<Uri> expiredContactList = new ArrayList<>();
-        expiredContactList.add(Uri.parse("test"));
-        doReturn(expiredContactList)
-                .when(mEabContactSyncController)
-                .syncContactToEabProvider(any());
-
-        EabBulkCapabilityUpdater mEabBulkCapabilityUpdater = new EabBulkCapabilityUpdater(
-                mContext,
-                mSubId,
-                mMockEabControllerImpl,
-                mEabContactSyncController,
-                mMockUceControllerCallback,
-                mHandler);
-
-        mockBulkCapabilityCarrierConfig(true);
-        mEabBulkCapabilityUpdater.onCarrierConfigChanged();
-        waitHandlerThreadFinish();
-
-        verify(mMockUceControllerCallback).refreshCapabilities(
-                anyList(),
-                any(IRcsUceControllerCallback.class));
-    }
-
     private void mockBulkCapabilityCarrierConfig(boolean isEnabled) {
         PersistableBundle persistableBundle = new PersistableBundle();
         persistableBundle.putBoolean(
diff --git a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
index 0040dc9..96147b4 100644
--- a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
@@ -35,6 +35,7 @@
 import android.net.Uri;
 import android.os.Looper;
 import android.os.PersistableBundle;
+import android.telephony.ims.ProvisioningManager;
 import android.telephony.ims.RcsContactPresenceTuple;
 import android.telephony.ims.RcsContactUceCapability;
 import android.test.mock.MockContentResolver;
@@ -125,8 +126,6 @@
         Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL, result.getStatus());
         Assert.assertEquals(TEST_CONTACT_URI,
                 result.getContactCapabilities().getContactUri());
-        Assert.assertEquals(TEST_CONTACT_URI,
-                result.getContactCapabilities().getEntityUri());
     }
 
     @Test
@@ -143,8 +142,6 @@
                 mEabControllerSub1.getCapabilities(contactUriList).size());
         Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
                 mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
-        Assert.assertEquals(TEST_CONTACT_URI, mEabControllerSub1.getCapabilities(contactUriList).
-                get(0).getContactCapabilities().getEntityUri());
     }
 
     @Test
@@ -210,34 +207,6 @@
 
     @Test
     @SmallTest
-    public void testSaveCapabilityAndCleanupInvalidDataInCommonTable() throws InterruptedException {
-        // Insert invalid data in common table
-        ContentValues data = new ContentValues();
-        data.put(EabProvider.EabCommonColumns.EAB_CONTACT_ID, -1);
-        data.put(EabProvider.EabCommonColumns.MECHANISM, CAPABILITY_MECHANISM_PRESENCE);
-        data.put(EabProvider.EabCommonColumns.REQUEST_RESULT, REQUEST_RESULT_FOUND);
-        data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, -1);
-        mContext.getContentResolver().insert(COMMON_URI, data);
-
-        List<RcsContactUceCapability> contactList = new ArrayList<>();
-        contactList.add(createPresenceCapability());
-        mEabControllerSub1.saveCapabilities(contactList);
-
-        mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);
-
-        // Verify the entry that cannot map to presence/option table has been removed
-        Cursor cursor = mContext.getContentResolver().query(COMMON_URI, null, null, null, null);
-        while(cursor.moveToNext()) {
-            int contactId = cursor.getInt(
-                    cursor.getColumnIndex(EabProvider.EabCommonColumns.EAB_CONTACT_ID));
-            if (contactId == -1) {
-                fail("Invalid data didn't been cleared");
-            }
-        }
-    }
-
-    @Test
-    @SmallTest
     public void testCleanupInvalidDataInCommonTable() throws InterruptedException {
         // Insert invalid data in common table
         ContentValues data = new ContentValues();
@@ -247,7 +216,6 @@
         data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, -1);
         mContext.getContentResolver().insert(COMMON_URI, data);
 
-        mEabControllerSub1.cleanupOrphanedRows();
         mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
         mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);
 
@@ -281,7 +249,6 @@
                 expiredDate.getTime().getTime() / 1000);
         mContext.getContentResolver().insert(PRESENCE_URI, data);
 
-        mEabControllerSub1.cleanupOrphanedRows();
         mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
         mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);
 
@@ -315,7 +282,6 @@
                 expiredDate.getTime().getTime() / 1000);
         mContext.getContentResolver().insert(OPTIONS_URI, data);
 
-        mEabControllerSub1.cleanupOrphanedRows();
         mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
         mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);
 
@@ -347,59 +313,6 @@
                 mEabControllerSub2.getCapabilities(contactUriList).size());
     }
 
-    @Test
-    @SmallTest
-    public void testSaveCapabilityWithEmptyTuple() {
-        List<RcsContactUceCapability> contactList = new ArrayList<>();
-        contactList.add(createEmptyTuplePresenceCapability());
-
-        mEabControllerSub1.saveCapabilities(contactList);
-
-        List<Uri> contactUriList = new ArrayList<>();
-        contactUriList.add(TEST_CONTACT_URI);
-        List<EabCapabilityResult> capabilityResults =
-                mEabControllerSub1.getCapabilities(contactUriList);
-        Assert.assertEquals(1, capabilityResults.size());
-        Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
-                capabilityResults.get(0).getStatus());
-        Assert.assertEquals(0,
-                capabilityResults.get(0).getContactCapabilities().getCapabilityTuples().size());
-    }
-
-    @Test
-    @SmallTest
-    public void testGetCapabilityWithEmptyTuple() {
-        List<RcsContactUceCapability> contactList = new ArrayList<>();
-        contactList.add(createEmptyTuplePresenceCapability());
-
-        mEabControllerSub1.saveCapabilities(contactList);
-
-        List<Uri> contactUriList = new ArrayList<>();
-        contactUriList.add(TEST_CONTACT_URI);
-        Assert.assertEquals(1,
-                mEabControllerSub1.getCapabilities(contactUriList).size());
-        Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
-                mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
-    }
-
-    @Test
-    @SmallTest
-    public void testGetExpiredCapabilityWithEmptyTuple() {
-        List<RcsContactUceCapability> contactList = new ArrayList<>();
-        doReturn(0L).when(mExpirationTimeFactory).getExpirationTime();
-
-        contactList.add(createEmptyTuplePresenceCapability());
-
-        mEabControllerSub1.saveCapabilities(contactList);
-
-        List<Uri> contactUriList = new ArrayList<>();
-        contactUriList.add(TEST_CONTACT_URI);
-        Assert.assertEquals(1,
-                mEabControllerSub1.getCapabilities(contactUriList).size());
-        Assert.assertEquals(EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE,
-                mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
-    }
-
     private RcsContactUceCapability createPresenceCapability() {
         RcsContactPresenceTuple.ServiceCapabilities.Builder serviceCapabilitiesBuilder =
                 new RcsContactPresenceTuple.ServiceCapabilities.Builder(TEST_AUDIO_CAPABLE,
@@ -424,7 +337,6 @@
                         TEST_CONTACT_URI, SOURCE_TYPE_NETWORK, REQUEST_RESULT_FOUND);
         builder.addCapabilityTuple(tupleWithServiceCapabilities);
         builder.addCapabilityTuple(tupleWithEmptyServiceCapabilities);
-        builder.setEntityUri(TEST_CONTACT_URI);
         return builder.build();
     }
 
@@ -446,13 +358,6 @@
         return builder.build();
     }
 
-    private RcsContactUceCapability createEmptyTuplePresenceCapability() {
-        RcsContactUceCapability.PresenceBuilder builder =
-                new RcsContactUceCapability.PresenceBuilder(
-                        TEST_CONTACT_URI, SOURCE_TYPE_NETWORK, REQUEST_RESULT_FOUND);
-        return builder.build();
-    }
-
     private void insertContactInfoToDB() {
         ContentValues data = new ContentValues();
         data.put(EabProvider.ContactColumns.PHONE_NUMBER, TEST_PHONE_NUMBER);
diff --git a/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java
index 46171d0..6d09ebf 100644
--- a/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java
+++ b/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java
@@ -272,7 +272,6 @@
         data.put(EabProvider.EabCommonColumns.MECHANISM, CAPABILITY_MECHANISM_PRESENCE);
         data.put(EabProvider.EabCommonColumns.REQUEST_RESULT, REQUEST_RESULT_FOUND);
         data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, subid);
-        data.put(EabProvider.EabCommonColumns.ENTITY_URI, "sip:456789@test.com");
         mContext.getContentResolver().insert(COMMON_URI, data);
 
         data = new ContentValues();
@@ -312,8 +311,6 @@
         cursor.moveToFirst();
         assertEquals(1, cursor.getInt(cursor.getColumnIndex(
                 EabProvider.PresenceTupleColumns.VIDEO_CAPABLE)));
-        assertEquals("sip:456789@test.com", cursor.getString(cursor.getColumnIndex(
-                EabProvider.EabCommonColumns.ENTITY_URI)));
     }
 
     @Test
diff --git a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java
index fd29d5b..be92ce3 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/PidfParserTest.java
@@ -93,13 +93,9 @@
                 isVideoSupported);
 
         // Convert to the class RcsContactUceCapability
-        RcsContactUceCapabilityWrapper capabilitiesWrapper =
-                PidfParser.getRcsContactUceCapabilityWrapper(pidfData);
-        assertNotNull(capabilitiesWrapper);
-        RcsContactUceCapability capabilities = capabilitiesWrapper.toRcsContactUceCapability();
+        RcsContactUceCapability capabilities = PidfParser.getRcsContactUceCapability(pidfData);
         assertNotNull(capabilities);
         assertEquals(Uri.parse(contact), capabilities.getContactUri());
-        assertEquals(Uri.parse(contact), capabilities.getEntityUri());
         assertEquals(RcsContactUceCapability.SOURCE_TYPE_NETWORK, capabilities.getSourceType());
         assertEquals(RcsContactUceCapability.CAPABILITY_MECHANISM_PRESENCE,
                 capabilities.getCapabilityMechanism());
@@ -171,14 +167,10 @@
         String pidfData = getPidfDataWithNewlineAndWhitespaceCharacters();
 
         // Convert to the class RcsContactUceCapability
-        RcsContactUceCapabilityWrapper capabilitiesWrapper =
-                PidfParser.getRcsContactUceCapabilityWrapper(pidfData);
-        assertNotNull(capabilitiesWrapper);
-        RcsContactUceCapability capabilities = capabilitiesWrapper.toRcsContactUceCapability();
+        RcsContactUceCapability capabilities = PidfParser.getRcsContactUceCapability(pidfData);
 
         assertNotNull(capabilities);
         assertEquals(Uri.parse(contact), capabilities.getContactUri());
-        assertEquals(Uri.parse(contact), capabilities.getEntityUri());
         assertEquals(RcsContactUceCapability.SOURCE_TYPE_NETWORK, capabilities.getSourceType());
         assertEquals(RcsContactUceCapability.CAPABILITY_MECHANISM_PRESENCE,
                 capabilities.getCapabilityMechanism());
@@ -241,10 +233,7 @@
                 serviceId2, serviceDescription2, isAudioSupported, isVideoSupported);
 
         // Convert to the class RcsContactUceCapability
-        RcsContactUceCapabilityWrapper capabilitiesWrapper =
-                PidfParser.getRcsContactUceCapabilityWrapper(pidfData);
-        assertNotNull(capabilitiesWrapper);
-        RcsContactUceCapability capabilities = capabilitiesWrapper.toRcsContactUceCapability();
+        RcsContactUceCapability capabilities = PidfParser.getRcsContactUceCapability(pidfData);
 
         assertNotNull(capabilities);
         assertEquals(Uri.parse(contact), capabilities.getContactUri());
@@ -286,11 +275,8 @@
         final String pidf = PidfParser.convertToPidf(capability);
 
         // Restore to the RcsContactUceCapability from the pidf
-        RcsContactUceCapabilityWrapper capabilitiesWrapper =
-                PidfParser.getRcsContactUceCapabilityWrapper(pidf);
-        assertNotNull(capabilitiesWrapper);
         final RcsContactUceCapability restoredCapability =
-                capabilitiesWrapper.toRcsContactUceCapability();
+                PidfParser.getRcsContactUceCapability(pidf);
 
         assertEquals(capability.getContactUri(), restoredCapability.getContactUri());
         assertEquals(capability.getCapabilityMechanism(),
diff --git a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapperTest.java b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapperTest.java
deleted file mode 100644
index 9497e19..0000000
--- a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/RcsContactUceCapabilityWrapperTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce.presence.pidfparser;
-
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.net.Uri;
-import android.telephony.ims.RcsContactPresenceTuple;
-import android.telephony.ims.RcsContactUceCapability;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.ims.ImsTestBase;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class RcsContactUceCapabilityWrapperTest extends ImsTestBase {
-
-
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    @Test
-    @SmallTest
-    public void testMalformedStatus() throws Exception {
-        RcsContactUceCapabilityWrapper capabilityWrapper = getRcsContactUceCapabilityWrapper();
-        capabilityWrapper.setMalformedContents();
-
-        assertTrue(capabilityWrapper.isMalformed());
-
-        RcsContactPresenceTuple.Builder tupleBuilder = new RcsContactPresenceTuple.Builder(
-                "open", "test", "1.0");
-
-        capabilityWrapper.addCapabilityTuple(tupleBuilder.build());
-        assertFalse(capabilityWrapper.isMalformed());
-    }
-
-    private RcsContactUceCapabilityWrapper getRcsContactUceCapabilityWrapper() {
-        final Uri contact = Uri.fromParts("sip", "test", null);
-        RcsContactUceCapabilityWrapper wrapper = new RcsContactUceCapabilityWrapper(contact,
-                RcsContactUceCapability.SOURCE_TYPE_NETWORK,
-                RcsContactUceCapability.REQUEST_RESULT_FOUND);
-
-        return wrapper;
-    }
-}
diff --git a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/PresenceTest.java b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/PresenceTest.java
index 3a4c9f9..99606f9 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/PresenceTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/PresenceTest.java
@@ -49,6 +49,7 @@
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlPullParserFactory;
 import org.xmlpull.v1.XmlSerializer;
+
 @RunWith(AndroidJUnit4.class)
 public class PresenceTest extends ImsTestBase {
 
@@ -170,95 +171,6 @@
         assertEquals(contact, PidfParserUtils.getTupleContact(tuple));
     }
 
-    @Test
-    @SmallTest
-    public void testMalformedParsing() throws Exception {
-        final String contact = Uri.fromParts("sip", "test", null).toString();
-        final String serviceId = "service_id_01";
-        final String version = "1.0";
-        final String description = "description_test";
-        final String serviceId2 = "service_id_02";
-        final String version2 = "2.0";
-        final String description2 = "description_test2";
-        final String serviceId3 = "service_id_03";
-        final String version3 = "3.0";
-        final String description3 = "description_test3";
-
-        StringBuilder presenceExample = new StringBuilder();
-        presenceExample.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>")
-                .append("<presence entity=\"").append(contact).append("\"")
-                .append(" xmlns=\"urn:ietf:params:xml:ns:pidf\"")
-                .append(" xmlns:op=\"urn:oma:xml:prs:pidf:oma-pres\"")
-                .append(" xmlns:caps=\"urn:ietf:params:xml:ns:pidf:caps\">")
-                .append("<tuple id=\"tid0\"><status><basic>open</basic></status>")
-                .append("<op:service-description>")
-                .append("<op:service-id>").append(serviceId).append("</op:service-id>")
-                .append("<op:version>").append(version).append("</op:version>")
-                .append("<op:description>").append(description).append("</op:description>")
-                .append("</op:service-description>")
-                .append("<contact>sip:test</contact></tuple>")
-                .append("<tuple id=\"tid1\"><status><basic>open</basic></status>")
-                .append("<op:service-ddescription>")
-                .append("<op:service-id>").append(serviceId2).append("</op:service-id>")
-                .append("<op:version>").append(version2).append("</op:version>")
-                .append("<op:description>").append(description2).append("</op:description>")
-                .append("</op:service-description>")
-                .append("<contact>sip:test</contact></tuple>")
-                .append("<tuple id=\"tid3\"><status><basic>open</basic></status>")
-                .append("<op:service-description>")
-                .append("<op:service-id>").append(serviceId3).append("</op:service-id>")
-                .append("<op:version>").append(version3).append("</op:version>")
-                .append("<op:description>").append(description3).append("</op:description>")
-                .append("</op:service-description>")
-                .append("<contact>sip:test</contact></tuple></presence>");
-
-        XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
-        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
-        Reader reader = new StringReader(presenceExample.toString());
-        parser.setInput(reader);
-
-        Presence presence = null;
-        int nextType = parser.next();
-
-        // Find the start tag
-        do {
-            if (nextType == XmlPullParser.START_TAG
-                    && Presence.ELEMENT_NAME.equals(parser.getName())) {
-                presence = new Presence();
-                presence.parse(parser);
-                break;
-            }
-            nextType = parser.next();
-        } while(nextType != XmlPullParser.END_DOCUMENT);
-
-        reader.close();
-
-        assertNotNull(presence);
-        assertEquals(contact, presence.getEntity());
-
-        List<Tuple> tupleList = presence.getTupleList();
-        assertNotNull(tupleList);
-        assertEquals(3, tupleList.size());
-        assertNotNull(tupleList.get(0)); // tuple of tid0
-        assertNotNull(tupleList.get(1)); // tuple of tid1. tid1 is a tuple that failed to parse.
-        assertNotNull(tupleList.get(2)); // tuple of tid2.
-
-        Tuple tuple = tupleList.get(0);
-        assertEquals(contact, PidfParserUtils.getTupleContact(tuple));
-
-        assertEquals(serviceId, PidfParserUtils.getTupleServiceId(tuple));
-        assertEquals(version, PidfParserUtils.getTupleServiceVersion(tuple));
-        assertEquals(description, PidfParserUtils.getTupleServiceDescription(tuple));
-
-        Tuple tuple1 = tupleList.get(1);
-        assertTrue(PidfParserUtils.getTupleMalformedStatus(tuple1));
-
-        Tuple tuple3 = tupleList.get(2);
-        assertEquals(serviceId3, PidfParserUtils.getTupleServiceId(tuple3));
-        assertEquals(version3, PidfParserUtils.getTupleServiceVersion(tuple3));
-        assertEquals(description3, PidfParserUtils.getTupleServiceDescription(tuple3));
-    }
-
     private Tuple getTuple(String statusValue, String serviceIdValue, String descValue,
             String contactValue) {
         Basic basic = new Basic(statusValue);
diff --git a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/TupleTest.java b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/TupleTest.java
index dc5edaa..3c44bd2 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/TupleTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/pidfparser/pidf/TupleTest.java
@@ -218,10 +218,7 @@
         String resultNote = null;
         List<Note> noteList = tuple.getNoteList();
         if (noteList != null && !noteList.isEmpty()) {
-            Note eachNote = noteList.get(0);
-            if (eachNote != null) {
-                resultNote = eachNote.getNote();
-            }
+            resultNote = noteList.get(0).getNote();
         }
 
         assertTrue(note.equals(resultNote));
diff --git a/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfoTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfoTest.java
deleted file mode 100644
index c977a08..0000000
--- a/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityInfoTest.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ims.rcs.uce.presence.publish;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import android.net.Uri;
-import android.telecom.PhoneAccount;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.ims.ImsTestBase;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-
-@RunWith(AndroidJUnit4.class)
-public class DeviceCapabilityInfoTest extends ImsTestBase {
-
-    int mSubId = 1;
-
-    String sipNumber = "123456789";
-    String telNumber = "987654321";
-
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    @Test
-    @SmallTest
-    public void testGetImsAssociatedUriWithoutPreferTelUri() throws Exception {
-        DeviceCapabilityInfo deviceCapInfo = createDeviceCapabilityInfo();
-
-        Uri[] uris = new Uri[2];
-        uris[0] = Uri.fromParts(PhoneAccount.SCHEME_SIP, sipNumber, null);
-        uris[1] = Uri.fromParts(PhoneAccount.SCHEME_TEL, telNumber, null);
-
-        // When stored in the order of SIP, TEL URI, check whether the SIP URI saved at
-        // the beginning is retrieved.
-        deviceCapInfo.updateRcsAssociatedUri(uris);
-        Uri outUri = deviceCapInfo.getImsAssociatedUri(false);
-
-        String numbers = outUri.getSchemeSpecificPart();
-        String[] numberParts = numbers.split("[@;:]");
-        String number = numberParts[0];
-
-        assertEquals(number, sipNumber);
-
-        // When stored in the order of TEL, SIP URI, check whether the TEL URI saved at
-        // the beginning is retrieved.
-        deviceCapInfo = createDeviceCapabilityInfo();
-
-        uris[0] = Uri.fromParts(PhoneAccount.SCHEME_TEL, telNumber, null);
-        uris[1] = Uri.fromParts(PhoneAccount.SCHEME_SIP, sipNumber, null);
-
-        deviceCapInfo.updateRcsAssociatedUri(uris);
-        outUri = deviceCapInfo.getImsAssociatedUri(false);
-
-        numbers = outUri.getSchemeSpecificPart();
-        numberParts = numbers.split("[@;:]");
-        number = numberParts[0];
-
-        assertEquals(number, telNumber);
-    }
-
-    @Test
-    @SmallTest
-    public void testGetImsAssociatedUriWithPreferTelUri() throws Exception {
-        DeviceCapabilityInfo deviceCapInfo = createDeviceCapabilityInfo();
-
-        Uri[] uris = new Uri[2];
-        uris[0] = Uri.fromParts(PhoneAccount.SCHEME_SIP, sipNumber, null);
-        uris[1] = Uri.fromParts(PhoneAccount.SCHEME_TEL, telNumber, null);
-
-        // Check whether TEL URI is returned when preferTelUri is true even if SIP and TEL URI
-        // are in the order.
-        deviceCapInfo.updateRcsAssociatedUri(uris);
-        Uri outUri = deviceCapInfo.getImsAssociatedUri(true);
-
-        String numbers = outUri.getSchemeSpecificPart();
-        String[] numberParts = numbers.split("[@;:]");
-        String number = numberParts[0];
-
-        assertEquals(number, telNumber);
-
-        // If preferTelUri is true, check if a TEL URI is returned.
-        deviceCapInfo = createDeviceCapabilityInfo();
-
-        uris[0] = Uri.fromParts(PhoneAccount.SCHEME_TEL, telNumber, null);
-        uris[1] = Uri.fromParts(PhoneAccount.SCHEME_SIP, sipNumber, null);
-
-        deviceCapInfo.updateRcsAssociatedUri(uris);
-        outUri = deviceCapInfo.getImsAssociatedUri(true);
-
-        numbers = outUri.getSchemeSpecificPart();
-        numberParts = numbers.split("[@;:]");
-        number = numberParts[0];
-
-        assertEquals(number, telNumber);
-
-        // If there is only SIP URI, this method will still return a SIP URI, since there are no TEL
-        // URIs found in the list.
-        deviceCapInfo = createDeviceCapabilityInfo();
-
-        uris[0] = Uri.fromParts(PhoneAccount.SCHEME_SIP, telNumber, null);
-        uris[1] = Uri.fromParts(PhoneAccount.SCHEME_SIP, sipNumber, null);
-
-        deviceCapInfo.updateRcsAssociatedUri(uris);
-        outUri = deviceCapInfo.getImsAssociatedUri(true);
-
-        numbers = outUri.getSchemeSpecificPart();
-        numberParts = numbers.split("[@;:]");
-        number = numberParts[0];
-
-        assertEquals(number, telNumber);
-
-    }
-
-    private DeviceCapabilityInfo createDeviceCapabilityInfo() {
-        DeviceCapabilityInfo deviceCapInfo = new DeviceCapabilityInfo(mSubId, null);
-        return deviceCapInfo;
-    }
-
-}
\ No newline at end of file
diff --git a/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java
index 2d170ab..bf33103 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListenerTest.java
@@ -19,12 +19,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyList;
-import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.refEq;
 import static org.mockito.Mockito.verify;
 
 import android.content.BroadcastReceiver;
@@ -44,18 +39,12 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.ims.ImsTestBase;
-import com.android.ims.rcs.uce.UceStatsWriter;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 
 @RunWith(AndroidJUnit4.class)
 public class DeviceCapabilityListenerTest extends ImsTestBase {
@@ -71,7 +60,6 @@
     @Mock DeviceCapabilityListener.ImsMmTelManagerFactory mImsMmTelMgrFactory;
     @Mock DeviceCapabilityListener.ImsRcsManagerFactory mImsRcsMgrFactory;
     @Mock DeviceCapabilityListener.ProvisioningManagerFactory mProvisioningMgrFactory;
-    @Mock UceStatsWriter mUceStatsWriter;
 
     int mSubId = 1;
 
@@ -89,10 +77,6 @@
         doReturn(true).when(mDeviceCapability).updateVtSetting(anyBoolean());
         doReturn(true).when(mDeviceCapability).updateVtSetting(anyBoolean());
         doReturn(true).when(mDeviceCapability).updateMmtelCapabilitiesChanged(any());
-
-        doNothing().when(mUceStatsWriter).setImsRegistrationFeatureTagStats(
-                anyInt(), anyList(), anyInt());
-        doNothing().when(mUceStatsWriter).setStoreCompleteImsRegistrationFeatureTagStats(anyInt());
     }
 
     @After
@@ -177,22 +161,30 @@
 
     @Test
     @SmallTest
+    public void testMmTelUnregistration() throws Exception {
+        DeviceCapabilityListener deviceCapListener = createDeviceCapabilityListener();
+        deviceCapListener.setImsCallbackRegistered(true);
+        RegistrationCallback registrationCallback = deviceCapListener.mMmtelRegistrationCallback;
+
+        ImsReasonInfo info = new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, -1, "");
+        registrationCallback.onUnregistered(info);
+
+        Handler handler = deviceCapListener.getHandler();
+        waitForHandlerActionDelayed(handler, HANDLER_WAIT_TIMEOUT_MS, HANDLER_SENT_DELAY_MS);
+
+        verify(mDeviceCapability).updateImsMmtelUnregistered();
+        verify(mCallback).requestPublishFromInternal(
+                PublishController.PUBLISH_TRIGGER_MMTEL_UNREGISTERED);
+    }
+
+    @Test
+    @SmallTest
     public void testRcsRegistration() throws Exception {
         DeviceCapabilityListener deviceCapListener = createDeviceCapabilityListener();
         deviceCapListener.setImsCallbackRegistered(true);
         RegistrationCallback registrationCallback = deviceCapListener.mRcsRegistrationCallback;
-
-        List<String> list = new ArrayList<>();
-        list.add("+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.im\"");
-        list.add("+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gpp-service.ims.icsi.oma.cpm.session\"");
-        list.add("+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.ftsms\"");
-        Set<String> featureTags = new HashSet<String>(list);
-
         ImsRegistrationAttributes attr = new ImsRegistrationAttributes.Builder(
-                ImsRegistrationImplBase.REGISTRATION_TECH_LTE)
-                .setFeatureTags(featureTags)
-                .build();
-
+                ImsRegistrationImplBase.REGISTRATION_TECH_LTE).build();
         // Notify DeviceCapabilityListener that registered has caused a change and requires publish
         doReturn(true).when(mDeviceCapability).updateImsRcsRegistered(attr);
 
@@ -203,8 +195,27 @@
         verify(mDeviceCapability).updateImsRcsRegistered(attr);
         verify(mCallback).requestPublishFromInternal(
                 PublishController.PUBLISH_TRIGGER_RCS_REGISTERED);
-        verify(mUceStatsWriter).setImsRegistrationFeatureTagStats(anyInt(),
-            refEq(list), eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
+    }
+
+    @Test
+    @SmallTest
+    public void testRcsUnregistration() throws Exception {
+        DeviceCapabilityListener deviceCapListener = createDeviceCapabilityListener();
+        deviceCapListener.setImsCallbackRegistered(true);
+        RegistrationCallback registrationCallback = deviceCapListener.mRcsRegistrationCallback;
+        // Notify DeviceCapabilityListener that unregistered has caused a change and requires
+        // publish.
+        doReturn(true).when(mDeviceCapability).updateImsRcsUnregistered();
+
+        ImsReasonInfo info = new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, -1, "");
+        registrationCallback.onUnregistered(info);
+
+        Handler handler = deviceCapListener.getHandler();
+        waitForHandlerActionDelayed(handler, HANDLER_WAIT_TIMEOUT_MS, HANDLER_SENT_DELAY_MS);
+
+        verify(mDeviceCapability).updateImsRcsUnregistered();
+        verify(mCallback).requestPublishFromInternal(
+                PublishController.PUBLISH_TRIGGER_RCS_UNREGISTERED);
     }
 
     @Test
@@ -224,51 +235,9 @@
                 PublishController.PUBLISH_TRIGGER_MMTEL_CAPABILITY_CHANGE);
     }
 
-    @Test
-    @SmallTest
-    public void testImsUnregistration() throws Exception {
-        DeviceCapabilityListener deviceCapListener = createDeviceCapabilityListener();
-        deviceCapListener.setImsCallbackRegistered(true);
-
-        // set the Ims is registered
-        doReturn(true).when(mDeviceCapability).isImsRegistered();
-        // MMTEL unregistered
-        RegistrationCallback mmtelRegiCallback = deviceCapListener.mMmtelRegistrationCallback;
-
-        ImsReasonInfo info = new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, -1, "");
-        mmtelRegiCallback.onUnregistered(info);
-
-        Handler handler = deviceCapListener.getHandler();
-        waitForHandlerActionDelayed(handler, HANDLER_WAIT_TIMEOUT_MS, HANDLER_SENT_DELAY_MS);
-
-        verify(mDeviceCapability).updateImsMmtelUnregistered();
-
-        // Do not send internal publish trigger
-        verify(mCallback, never()).requestPublishFromInternal(anyInt());
-        // Only MMTEL unregistered. Verify do not send ImsUnregistered.
-        verify(mCallback, never()).updateImsUnregistered();
-
-        // set the Ims Unregistered
-        doReturn(false).when(mDeviceCapability).isImsRegistered();
-        // RCS unregistered
-        RegistrationCallback rcsRegiCallback = deviceCapListener.mRcsRegistrationCallback;
-        doReturn(true).when(mDeviceCapability).updateImsRcsUnregistered();
-
-        rcsRegiCallback.onUnregistered(info);
-
-        waitForHandlerActionDelayed(handler, HANDLER_WAIT_TIMEOUT_MS, HANDLER_SENT_DELAY_MS);
-
-        verify(mDeviceCapability).updateImsRcsUnregistered();
-        // Do not send internal publish trigger
-        verify(mCallback, never()).requestPublishFromInternal(anyInt());
-        verify(mUceStatsWriter).setStoreCompleteImsRegistrationFeatureTagStats(anyInt());
-
-        verify(mCallback).updateImsUnregistered();
-    }
-
     private DeviceCapabilityListener createDeviceCapabilityListener() {
         DeviceCapabilityListener deviceCapListener = new DeviceCapabilityListener(mContext,
-                mSubId, mDeviceCapability, mCallback, mUceStatsWriter);
+                mSubId, mDeviceCapability, mCallback);
         deviceCapListener.setImsMmTelManagerFactory(mImsMmTelMgrFactory);
         deviceCapListener.setImsRcsManagerFactory(mImsRcsMgrFactory);
         deviceCapListener.setProvisioningMgrFactory(mProvisioningMgrFactory);
diff --git a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishControllerImplTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishControllerImplTest.java
index a7e0bbb..b4c9b87 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishControllerImplTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishControllerImplTest.java
@@ -23,7 +23,6 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
@@ -44,7 +43,6 @@
 import com.android.ims.RcsFeatureManager;
 import com.android.ims.rcs.uce.UceController;
 import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult;
-import com.android.ims.rcs.uce.UceStatsWriter;
 import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
 import com.android.ims.rcs.uce.presence.publish.PublishControllerImpl.DeviceCapListenerFactory;
 import com.android.ims.rcs.uce.presence.publish.PublishControllerImpl.PublishProcessorFactory;
@@ -57,8 +55,6 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
 import org.mockito.Mock;
 
 @RunWith(AndroidJUnit4.class)
@@ -72,8 +68,6 @@
     @Mock UceController.UceControllerCallback mUceCtrlCallback;
     @Mock RemoteCallbackList<IRcsUcePublishStateCallback> mPublishStateCallbacks;
     @Mock DeviceStateResult mDeviceStateResult;
-    @Mock IRcsUcePublishStateCallback mIRcsUcePublishStateCallback;
-    @Mock UceStatsWriter mUceStatsWriter;
 
     private int mSubId = 1;
 
@@ -83,10 +77,9 @@
         doReturn(mPublishProcessor).when(mPublishProcessorFactory).createPublishProcessor(any(),
                 eq(mSubId), any(), any());
         doReturn(mDeviceCapListener).when(mDeviceCapListenerFactory).createDeviceCapListener(any(),
-                eq(mSubId), any(), any(), any());
+                eq(mSubId), any(), any());
         doReturn(mDeviceStateResult).when(mUceCtrlCallback).getDeviceState();
         doReturn(false).when(mDeviceStateResult).isRequestForbidden();
-        doReturn(false).when(mDeviceStateResult).isPublishRequestBlocked();
     }
 
     @After
@@ -130,10 +123,10 @@
 
     @Test
     @SmallTest
-    public void testGetPublishStateWithNotSupportPublishingState() throws Exception {
+    public void testGetPublishState() throws Exception {
         PublishControllerImpl publishController = createPublishController();
 
-        int initState = publishController.getUcePublishState(false);
+        int initState = publishController.getUcePublishState();
         assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, initState);
 
         publishController.getPublishControllerCallback().updatePublishRequestResult(
@@ -141,43 +134,26 @@
         Handler handler = publishController.getPublishHandler();
         waitForHandlerAction(handler, 1000);
 
-        int latestState = publishController.getUcePublishState(false);
+        int latestState = publishController.getUcePublishState();
         assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, latestState);
     }
 
     @Test
     @SmallTest
-    public void testGetPublishStateWithSupportPublishingState() throws Exception {
-        PublishControllerImpl publishController = createPublishController();
-
-        int initState = publishController.getUcePublishState(true);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, initState);
-
-        publishController.getPublishControllerCallback().updatePublishRequestResult(
-                RcsUceAdapter.PUBLISH_STATE_PUBLISHING, Instant.now(), null);
-        Handler handler = publishController.getPublishHandler();
-        waitForHandlerAction(handler, 1000);
-
-        int latestState = publishController.getUcePublishState(true);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_PUBLISHING, latestState);
-    }
-
-    @Test
-    @SmallTest
     public void testRegisterPublishStateCallback() throws Exception {
         PublishControllerImpl publishController = createPublishController();
 
-        publishController.registerPublishStateCallback(mIRcsUcePublishStateCallback, true);
+        publishController.registerPublishStateCallback(any());
 
-        verify(mPublishStateCallbacks).register(any(), any());
+        verify(mPublishStateCallbacks).register(any());
     }
 
     @Test
     @SmallTest
-    public void testUnregisterPublishStateCallback() throws Exception {
+    public void unregisterPublishStateCallback() throws Exception {
         PublishControllerImpl publishController = createPublishController();
 
-        publishController.unregisterPublishStateCallback(mIRcsUcePublishStateCallback);
+        publishController.unregisterPublishStateCallback(any());
 
         verify(mPublishStateCallbacks).unregister(any());
     }
@@ -186,152 +162,13 @@
     @SmallTest
     public void testUnpublish() throws Exception {
         PublishControllerImpl publishController = createPublishController();
-        //To initialize the public state to publish_ok.
-        publishController.setCapabilityType(RcsImsCapabilities.CAPABILITY_TYPE_OPTIONS_UCE);
 
         publishController.onUnpublish();
 
         Handler handler = publishController.getPublishHandler();
         waitForHandlerAction(handler, 1000);
-        int publishState = publishController.getUcePublishState(false);
+        int publishState = publishController.getUcePublishState();
         assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, publishState);
-        verify(mPublishProcessor).resetState();
-        verify(mUceStatsWriter).setUnPublish(eq(mSubId));
-    }
-
-    @Test
-    @SmallTest
-    public void testImsUnregistered() throws Exception {
-        PublishControllerImpl publishController = createPublishController();
-        //To initialize the public state to publish_ok.
-        publishController.setCapabilityType(RcsImsCapabilities.CAPABILITY_TYPE_OPTIONS_UCE);
-
-        // Trigger a ims unregistered
-        PublishControllerCallback callback = publishController.getPublishControllerCallback();
-        callback.updateImsUnregistered();
-
-        Handler handler = publishController.getPublishHandler();
-        waitForHandlerAction(handler, 1000);
-        int publishState = publishController.getUcePublishState(false);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, publishState);
-        verify(mPublishProcessor).resetState();
-        verify(mUceStatsWriter).setUnPublish(eq(mSubId));
-    }
-
-    @Test
-    @SmallTest
-    public void testPublishUpdated() throws Exception {
-        PublishControllerImpl publishController = createPublishController();
-        int responseCode = 200;
-
-        publishController.onPublishUpdated(responseCode, "", 0, "");
-
-        Handler handler = publishController.getPublishHandler();
-        waitForHandlerAction(handler, 1000);
-
-        ArgumentCaptor<PublishRequestResponse> captor =
-                ArgumentCaptor.forClass(PublishRequestResponse.class);
-
-        verify(mPublishProcessor).publishUpdated(captor.capture());
-        PublishRequestResponse response = captor.getValue();
-        int expectedCode = response.getNetworkRespSipCode().orElse(-1);
-        assertEquals(responseCode, expectedCode);
-    }
-
-    @Test
-    @SmallTest
-    public void testPublishingStateTargetingEnable() throws Exception {
-        doReturn(1).when(mPublishStateCallbacks).getRegisteredCallbackCount();
-        Boolean boolObj = new Boolean(true);
-        Object uid1 = (Object)boolObj;
-        doReturn(uid1).when(mPublishStateCallbacks).getRegisteredCallbackCookie(anyInt());
-
-        PublishControllerImpl publishController = createPublishController();
-
-        //To initialize the public state to publish_ok.
-        publishController.mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
-
-        // send publish request.
-        PublishControllerCallback callback = publishController.getPublishControllerCallback();
-        callback.notifyPendingPublishRequest();
-
-        Handler handler = publishController.getPublishHandler();
-        waitForHandlerAction(handler, 1000);
-        int publishState = publishController.mCurrentPublishState;
-        int publishStateFromGetUcePublishState = publishController.getUcePublishState(true);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_PUBLISHING, publishState);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_PUBLISHING, publishStateFromGetUcePublishState);
-
-        // Set the state to OK as if got a 200 OK response to publish request
-        publishController.mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
-
-        publishStateFromGetUcePublishState = publishController.getUcePublishState(true);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishStateFromGetUcePublishState);
-
-        // send publish request again.
-        callback.notifyPendingPublishRequest();
-        handler = publishController.getPublishHandler();
-        waitForHandlerAction(handler, 1000);
-        publishState = publishController.mCurrentPublishState;
-        publishStateFromGetUcePublishState = publishController.getUcePublishState(true);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_PUBLISHING, publishState);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_PUBLISHING, publishStateFromGetUcePublishState);
-    }
-
-    @Test
-    @SmallTest
-    public void testPublishingStateTargetingDisable() throws Exception {
-        doReturn(1).when(mPublishStateCallbacks).getRegisteredCallbackCount();
-        Boolean boolObj = new Boolean(false);
-        Object uid1 = (Object)boolObj;
-        doReturn(uid1).when(mPublishStateCallbacks).getRegisteredCallbackCookie(anyInt());
-
-        PublishControllerImpl publishController = createPublishController();
-        //To initialize the public state to publish_ok.
-        publishController.mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
-        publishController.mLastPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
-
-        // send publish request
-        PublishControllerCallback callback = publishController.getPublishControllerCallback();
-        callback.notifyPendingPublishRequest();
-
-        //current state is pubilsh_ok. so the state didn`t chaged.
-        Handler handler = publishController.getPublishHandler();
-        waitForHandlerAction(handler, 1000);
-        int publishState = publishController.mLastPublishState;
-        int publishStateFromGetUcePublishState = publishController.getUcePublishState(false);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishState);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishStateFromGetUcePublishState);
-
-        // set the state to error.
-        publishController.mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_OTHER_ERROR;
-        // send publish request again.
-        callback.notifyPendingPublishRequest();
-        handler = publishController.getPublishHandler();
-        waitForHandlerAction(handler, 1000);
-
-        // the state must be changed to not published.
-        publishState = publishController.mLastPublishState;
-        publishStateFromGetUcePublishState = publishController.getUcePublishState(false);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, publishState);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, publishStateFromGetUcePublishState);
-
-        // Set the state to OK as if got a 200 OK response to publish request
-        publishController.mLastPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
-        publishController.mCurrentPublishState = RcsUceAdapter.PUBLISH_STATE_OK;
-
-        publishStateFromGetUcePublishState = publishController.getUcePublishState(false);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishStateFromGetUcePublishState);
-
-        // send publish request again.
-        callback.notifyPendingPublishRequest();
-        handler = publishController.getPublishHandler();
-        waitForHandlerAction(handler, 1000);
-        // current state is ok so the state didn`t changed.
-        publishState = publishController.mLastPublishState;
-        publishStateFromGetUcePublishState = publishController.getUcePublishState(false);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishState);
-        assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishStateFromGetUcePublishState);
     }
 
     @Test
@@ -375,32 +212,6 @@
 
     @Test
     @SmallTest
-    public void testRequestPublishFromServiceWhenDeviceNoRetry() throws Exception {
-        doReturn(true).when(mDeviceStateResult).isPublishRequestBlocked();
-
-        PublishControllerImpl publishController = createPublishController();
-        doReturn(Optional.of(0L)).when(mPublishProcessor).getPublishingDelayTime();
-
-        // Set the PRESENCE is capable
-        IImsCapabilityCallback RcsCapCallback = publishController.getRcsCapabilitiesCallback();
-        RcsCapCallback.onCapabilitiesStatusChanged(RcsUceAdapter.CAPABILITY_TYPE_PRESENCE_UCE);
-
-        // Trigger the PUBLISH request from the service.
-        publishController.requestPublishCapabilitiesFromService(
-                RcsUceAdapter.CAPABILITY_UPDATE_TRIGGER_MOVE_TO_IWLAN);
-
-        Handler handler = publishController.getPublishHandler();
-        waitForHandlerAction(handler, 1000);
-
-        // Reset device state because isPublishRequestBlocked() is true when Ims Service
-        // requests PUBLISH.
-        verify(mUceCtrlCallback).resetDeviceState();
-        // The PUBLISH request must be pending because the current device state is no_retry.
-        verify(mPublishProcessor).setPendingRequest(anyInt());
-    }
-
-    @Test
-    @SmallTest
     public void testFirstRequestPublishIsTriggeredFromService() throws Exception {
         PublishControllerImpl publishController = createPublishController();
         doReturn(Optional.of(0L)).when(mPublishProcessor).getPublishingDelayTime();
@@ -538,7 +349,7 @@
     private PublishControllerImpl createPublishController() {
         PublishControllerImpl publishController = new PublishControllerImpl(mContext, mSubId,
                 mUceCtrlCallback, Looper.getMainLooper(), mDeviceCapListenerFactory,
-                mPublishProcessorFactory, mUceStatsWriter);
+                mPublishProcessorFactory);
         publishController.setPublishStateCallback(mPublishStateCallbacks);
         publishController.setCapabilityType(RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE);
         return publishController;
diff --git a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishProcessorTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishProcessorTest.java
index 4e8cdfd..d83158f 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishProcessorTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishProcessorTest.java
@@ -17,7 +17,6 @@
 package com.android.ims.rcs.uce.presence.publish;
 
 import static android.telephony.ims.RcsContactPresenceTuple.TUPLE_BASIC_STATUS_OPEN;
-
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
@@ -26,7 +25,6 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
-import android.content.Context;
 import android.net.Uri;
 import android.telephony.ims.RcsContactPresenceTuple;
 import android.telephony.ims.RcsContactUceCapability;
@@ -36,7 +34,6 @@
 
 import com.android.ims.ImsTestBase;
 import com.android.ims.RcsFeatureManager;
-import com.android.ims.rcs.uce.UceStatsWriter;
 import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
 
 import org.junit.After;
@@ -45,8 +42,6 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 
-import java.time.Instant;
-import java.util.Optional;
 @RunWith(AndroidJUnit4.class)
 public class PublishProcessorTest extends ImsTestBase {
 
@@ -55,25 +50,10 @@
     @Mock PublishControllerCallback mPublishCtrlCallback;
     @Mock PublishProcessorState mProcessorState;
     @Mock PublishRequestResponse mResponseCallback;
-    @Mock UceStatsWriter mUceStatsWriter;
 
     private int mSub = 1;
     private long mTaskId = 1L;
 
-    public static class TestPublishProcessor extends PublishProcessor {
-        public TestPublishProcessor(Context context, int subId,
-                DeviceCapabilityInfo capabilityInfo,
-                PublishControllerCallback publishCtrlCallback,
-                UceStatsWriter instance) {
-            super(context, subId, capabilityInfo, publishCtrlCallback, instance);
-        }
-
-        @Override
-        protected boolean isEabProvisioned() {
-            return true;
-        }
-    }
-
     @Before
     public void setUp() throws Exception {
         super.setUp();
@@ -103,7 +83,6 @@
         verify(mProcessorState).setPublishingFlag(true);
         verify(mRcsFeatureManager).requestPublication(any(), any());
         verify(mPublishCtrlCallback).setupRequestCanceledTimer(anyLong(), anyLong());
-        verify(mPublishCtrlCallback).notifyPendingPublishRequest();
     }
 
     @Test
@@ -165,8 +144,6 @@
         doReturn(mTaskId).when(mProcessorState).getCurrentTaskId();
         doReturn(mTaskId).when(mResponseCallback).getTaskId();
         doReturn(true).when(mResponseCallback).needRetry();
-        doReturn(Optional.of(10)).when(mResponseCallback).getCmdErrorCode();
-
         PublishProcessor publishProcessor = getPublishProcessor();
 
         publishProcessor.onCommandError(mResponseCallback);
@@ -177,8 +154,6 @@
         verify(mResponseCallback).onDestroy();
         verify(mProcessorState).setPublishingFlag(false);
         verify(mPublishCtrlCallback).clearRequestCanceledTimer();
-        verify(mUceStatsWriter).setUceEvent(eq(mSub), eq(UceStatsWriter.PUBLISH_EVENT), eq(true),
-                eq(10), eq(0));
     }
 
     @Test
@@ -225,7 +200,6 @@
         doReturn(mTaskId).when(mResponseCallback).getTaskId();
         doReturn(false).when(mResponseCallback).needRetry();
         doReturn(true).when(mResponseCallback).isRequestSuccess();
-        doReturn(Optional.of(200)).when(mResponseCallback).getNetworkRespSipCode();
         PublishProcessor publishProcessor = getPublishProcessor();
 
         publishProcessor.onNetworkResponse(mResponseCallback);
@@ -234,9 +208,6 @@
         verify(mResponseCallback).onDestroy();
         verify(mProcessorState).setPublishingFlag(false);
         verify(mPublishCtrlCallback).clearRequestCanceledTimer();
-
-        verify(mUceStatsWriter).setUceEvent(eq(mSub), eq(UceStatsWriter.PUBLISH_EVENT), eq(true),
-                eq(0), eq(200));
     }
 
     @Test
@@ -250,28 +221,9 @@
         verify(mPublishCtrlCallback).clearRequestCanceledTimer();
     }
 
-    @Test
-    @SmallTest
-    public void testPublishUpdated() throws Exception {
-        Instant responseTime = Instant.now();
-        doReturn(responseTime).when(mResponseCallback).getResponseTimestamp();
-        doReturn(true).when(mResponseCallback).isRequestSuccess();
-
-        doReturn(0).when(mResponseCallback).getPublishState();
-        doReturn("").when(mResponseCallback).getPidfXml();
-
-        PublishProcessor publishProcessor = getPublishProcessor();
-
-        publishProcessor.publishUpdated(mResponseCallback);
-
-        verify(mProcessorState).setLastPublishedTime(any());
-        verify(mProcessorState).resetRetryCount();
-        verify(mPublishCtrlCallback).updatePublishRequestResult(anyInt(), any(), any());
-    }
-
     private PublishProcessor getPublishProcessor() {
-        PublishProcessor publishProcessor = new TestPublishProcessor(mContext, mSub,
-                mDeviceCapabilities, mPublishCtrlCallback, mUceStatsWriter);
+        PublishProcessor publishProcessor = new PublishProcessor(mContext, mSub,
+                mDeviceCapabilities, mPublishCtrlCallback);
         publishProcessor.setProcessorState(mProcessorState);
         publishProcessor.onRcsConnected(mRcsFeatureManager);
         return publishProcessor;
diff --git a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTrackerTest.java b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTrackerTest.java
index 5500629..6d15946 100644
--- a/tests/src/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTrackerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/presence/publish/PublishServiceDescTrackerTest.java
@@ -20,7 +20,6 @@
 
 import android.telephony.ims.RcsContactPresenceTuple;
 import android.util.ArraySet;
-import android.util.Log;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
@@ -32,7 +31,6 @@
 
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Map;
 import java.util.Set;
 
 @RunWith(AndroidJUnit4.class)
@@ -67,11 +65,8 @@
     public static final String TEST_FEATURE_TAG_CHATBOT_FORMAT =
             " +g.3gpp.iari-ref=  \" Urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.chatbot \"";
 
-    public static final String TEST_FEATURE_TAG_BOTVERSION_V2_FORMAT =
-            "+g.gsma.rcs.botVersion =\" #=1  , #=2 \"    ";
-
     public static final String TEST_FEATURE_TAG_BOTVERSION_FORMAT =
-            "+g.gsma.rcs.botVersion =\" #=1   \"    ";
+            "+g.gsma.rcs.botVersion =\" #=1  , #=2 \"    ";
 
     public static final String TEST_FEATURE_TAG_MMTEL_FORMAT =
             "  +g.3gpp.icsi-ref =    \"urn%3Aurn-7%3A3gpp-servIce.ims.icsi.mmtel \"   ";
@@ -107,22 +102,13 @@
         t1.updateImsRegistration(imsReg);
         assertEquals(expectedSet, t1.copyRegistrationCapabilities());
 
-
-        expectedSet = Collections.singleton(
-                ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION);
-        imsReg = createImsRegistration(
-                FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_SESSION,
-                FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED);
-        t1.updateImsRegistration(imsReg);
-        assertEquals(expectedSet, t1.copyRegistrationCapabilities());
-
         // Should see chatbot v1 and v2 pop up in this case (same FTs)
         expectedSet = new ArraySet<>(Arrays.asList(
-                ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V1,
+                ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION,
                 ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V2));
         imsReg = createImsRegistration(
                 FeatureTags.FEATURE_TAG_CHATBOT_COMMUNICATION_USING_SESSION,
-                FeatureTags.FEATURE_TAG_CHATBOT_VERSION_V2_SUPPORTED);
+                FeatureTags.FEATURE_TAG_CHATBOT_VERSION_SUPPORTED);
         t1.updateImsRegistration(imsReg);
         assertEquals(expectedSet, t1.copyRegistrationCapabilities());
 
@@ -199,24 +185,13 @@
         t1.updateImsRegistration(imsReg);
         assertEquals(expectedSet, t1.copyRegistrationCapabilities());
 
-        // The registered tag is botVersion=#1,
-        // so check if the service description of chatbot version 1.0 should be set.
-        expectedSet = Collections.singleton(
-                ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION);
-        imsReg = createImsRegistration(
-                TEST_FEATURE_TAG_CHATBOT_FORMAT,
-                TEST_FEATURE_TAG_BOTVERSION_FORMAT);
-        t1.updateImsRegistration(imsReg);
-        assertEquals(expectedSet, t1.copyRegistrationCapabilities());
-
-        // The registered tag is botVersion=#1,#2,
-        // so check if the service description of chatbot version 1.0 and 2.0 should be set.
+        // Should see chatbot v1 and v2 pop up in this case (same FTs)
         expectedSet = new ArraySet<>(Arrays.asList(
-                ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V1,
+                ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION,
                 ServiceDescription.SERVICE_DESCRIPTION_CHATBOT_SESSION_V2));
         imsReg = createImsRegistration(
                 TEST_FEATURE_TAG_CHATBOT_FORMAT,
-                TEST_FEATURE_TAG_BOTVERSION_V2_FORMAT);
+                TEST_FEATURE_TAG_BOTVERSION_FORMAT);
         t1.updateImsRegistration(imsReg);
         assertEquals(expectedSet, t1.copyRegistrationCapabilities());
 
diff --git a/tests/src/com/android/ims/rcs/uce/request/CapabilityRequestTest.java b/tests/src/com/android/ims/rcs/uce/request/CapabilityRequestTest.java
index bfeb55a..4aef42e 100644
--- a/tests/src/com/android/ims/rcs/uce/request/CapabilityRequestTest.java
+++ b/tests/src/com/android/ims/rcs/uce/request/CapabilityRequestTest.java
@@ -95,8 +95,7 @@
         eabResultList.add(eabResult2);
 
         doReturn(false).when(mDeviceStateResult).isRequestForbidden();
-        doReturn(eabResultList).when(mReqMgrCallback)
-                .getCapabilitiesFromCacheIncludingExpired(any());
+        doReturn(eabResultList).when(mReqMgrCallback).getCapabilitiesFromCache(any());
 
         // Execute the request.
         request.executeRequest();
@@ -162,11 +161,7 @@
         eabResultList.add(eabResult);
 
         doReturn(false).when(mDeviceStateResult).isRequestForbidden();
-        doReturn(eabResultList).when(mReqMgrCallback)
-                .getCapabilitiesFromCacheIncludingExpired(any());
-        // This API should only be applied to PUBLISH.
-        // Even if the return value is true, the capabilities request must be processed.
-        doReturn(true).when(mDeviceStateResult).isPublishRequestBlocked();
+        doReturn(eabResultList).when(mReqMgrCallback).getCapabilitiesFromCache(any());
 
         // Execute the request.
         request.executeRequest();
diff --git a/tests/src/com/android/ims/rcs/uce/request/OptionsCoordinatorTest.java b/tests/src/com/android/ims/rcs/uce/request/OptionsCoordinatorTest.java
index 1759de5..9c270fb 100644
--- a/tests/src/com/android/ims/rcs/uce/request/OptionsCoordinatorTest.java
+++ b/tests/src/com/android/ims/rcs/uce/request/OptionsCoordinatorTest.java
@@ -38,13 +38,11 @@
 import com.android.ims.ImsTestBase;
 import com.android.ims.rcs.uce.request.UceRequestCoordinator.RequestResult;
 import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
-import com.android.ims.rcs.uce.UceStatsWriter;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.Optional;
 
 import org.junit.After;
 import org.junit.Before;
@@ -59,7 +57,6 @@
     @Mock CapabilityRequestResponse mResponse;
     @Mock RequestManagerCallback mRequestMgrCallback;
     @Mock IRcsUceControllerCallback mUceCallback;
-    @Mock UceStatsWriter mUceStatsWriter;
 
     private int mSubId = 1;
     private long mTaskId = 1L;
@@ -96,14 +93,11 @@
     @Test
     @SmallTest
     public void testRequestCommandError() throws Exception {
-        doReturn(Optional.of(3)).when(mResponse).getCommandError();
         OptionsRequestCoordinator coordinator = getOptionsCoordinator();
 
         coordinator.onRequestUpdated(mTaskId, REQUEST_UPDATE_COMMAND_ERROR);
 
         verify(mRequest).onFinish();
-        verify(mUceStatsWriter).setUceEvent(eq(mSubId), eq(UceStatsWriter.OUTGOING_OPTION_EVENT),
-            eq(false), eq(3), eq(0));
 
         Collection<UceRequest> requestList = coordinator.getActivatedRequest();
         Collection<RequestResult> resultList = coordinator.getFinishedRequest();
@@ -117,7 +111,6 @@
     public void testRequestNetworkResponse() throws Exception {
         OptionsRequestCoordinator coordinator = getOptionsCoordinator();
         doReturn(true).when(mResponse).isNetworkResponseOK();
-        doReturn(Optional.of(200)).when(mResponse).getNetworkRespSipCode();
 
         final List<RcsContactUceCapability> updatedCapList = new ArrayList<>();
         RcsContactUceCapability updatedCapability = getContactUceCapability();
@@ -131,8 +124,6 @@
         verify(mResponse).removeUpdatedCapabilities(updatedCapList);
 
         verify(mRequest).onFinish();
-        verify(mUceStatsWriter).setUceEvent(eq(mSubId), eq(UceStatsWriter.OUTGOING_OPTION_EVENT),
-            eq(true), eq(0), eq(200));
 
         Collection<UceRequest> requestList = coordinator.getActivatedRequest();
         Collection<RequestResult> resultList = coordinator.getFinishedRequest();
@@ -143,10 +134,9 @@
 
     private OptionsRequestCoordinator getOptionsCoordinator() {
         OptionsRequestCoordinator.Builder builder = new OptionsRequestCoordinator.Builder(
-                mSubId, Collections.singletonList(mRequest), mRequestMgrCallback, mUceStatsWriter);
+                mSubId, Collections.singletonList(mRequest), mRequestMgrCallback);
         builder.setCapabilitiesCallback(mUceCallback);
-        OptionsRequestCoordinator coordinator = builder.build();
-        return coordinator;
+        return builder.build();
     }
 
     private RcsContactUceCapability getContactUceCapability() {
diff --git a/tests/src/com/android/ims/rcs/uce/request/RemoteOptionsCoordinatorTest.java b/tests/src/com/android/ims/rcs/uce/request/RemoteOptionsCoordinatorTest.java
index 8007711..1a6ed4a 100644
--- a/tests/src/com/android/ims/rcs/uce/request/RemoteOptionsCoordinatorTest.java
+++ b/tests/src/com/android/ims/rcs/uce/request/RemoteOptionsCoordinatorTest.java
@@ -37,7 +37,6 @@
 import com.android.ims.rcs.uce.request.RemoteOptionsRequest.RemoteOptResponse;
 import com.android.ims.rcs.uce.request.UceRequestCoordinator.RequestResult;
 import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
-import com.android.ims.rcs.uce.UceStatsWriter;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -55,7 +54,6 @@
     @Mock RemoteOptResponse mResponse;
     @Mock RequestManagerCallback mRequestMgrCallback;
     @Mock IOptionsRequestCallback mOptRequestCallback;
-    @Mock UceStatsWriter mUceStatsWriter;
 
     private int mSubId = 1;
     private long mTaskId = 1L;
@@ -86,8 +84,6 @@
         verify(mOptRequestCallback).respondToCapabilityRequest(updatedCapability, true);
 
         verify(mRequest).onFinish();
-        verify(mUceStatsWriter).setUceEvent(eq(mSubId), eq(UceStatsWriter.INCOMING_OPTION_EVENT),
-            eq(true), eq(0), eq(200));
 
         Collection<UceRequest> requestList = coordinator.getActivatedRequest();
         Collection<RequestResult> resultList = coordinator.getFinishedRequest();
@@ -98,7 +94,7 @@
 
     private RemoteOptionsCoordinator getRemoteOptCoordinator() {
         RemoteOptionsCoordinator.Builder builder = new RemoteOptionsCoordinator.Builder(
-                mSubId, Collections.singletonList(mRequest), mRequestMgrCallback, mUceStatsWriter);
+                mSubId, Collections.singletonList(mRequest), mRequestMgrCallback);
         builder.setOptionsRequestCallback(mOptRequestCallback);
         return builder.build();
     }
diff --git a/tests/src/com/android/ims/rcs/uce/request/SubscribeCoordinatorTest.java b/tests/src/com/android/ims/rcs/uce/request/SubscribeCoordinatorTest.java
index bcd3c98..137b4ac 100644
--- a/tests/src/com/android/ims/rcs/uce/request/SubscribeCoordinatorTest.java
+++ b/tests/src/com/android/ims/rcs/uce/request/SubscribeCoordinatorTest.java
@@ -39,7 +39,6 @@
 import static org.mockito.Mockito.verify;
 
 import android.net.Uri;
-import android.telephony.ims.RcsContactPresenceTuple;
 import android.telephony.ims.RcsContactUceCapability;
 import android.telephony.ims.aidl.IRcsUceControllerCallback;
 
@@ -48,7 +47,6 @@
 
 import com.android.ims.ImsTestBase;
 import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult;
-import com.android.ims.rcs.uce.UceStatsWriter;
 import com.android.ims.rcs.uce.request.UceRequestCoordinator.RequestResult;
 import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
 
@@ -72,7 +70,6 @@
     @Mock RequestManagerCallback mRequestMgrCallback;
     @Mock IRcsUceControllerCallback mUceCallback;
     @Mock DeviceStateResult mDeviceStateResult;
-    @Mock UceStatsWriter mUceStatsWriter;
 
     private int mSubId = 1;
     private long mTaskId = 1L;
@@ -109,7 +106,6 @@
     @Test
     @SmallTest
     public void testRequestCommandError() throws Exception {
-        doReturn(Optional.of(3)).when(mResponse).getCommandError();
         SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
 
         coordinator.onRequestUpdated(mTaskId, REQUEST_UPDATE_COMMAND_ERROR);
@@ -118,9 +114,6 @@
         Collection<RequestResult> resultList = coordinator.getFinishedRequest();
         assertTrue(requestList.isEmpty());
         assertEquals(1, resultList.size());
-
-        verify(mUceStatsWriter).setUceEvent(eq(mSubId), eq(UceStatsWriter.SUBSCRIBE_EVENT),
-            eq(false), eq(3), eq(0));
         verify(mRequest).onFinish();
     }
 
@@ -129,7 +122,6 @@
     public void testRequestNetworkRespSuccess() throws Exception {
         SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
         doReturn(true).when(mResponse).isNetworkResponseOK();
-        doReturn(Optional.of(200)).when(mResponse).getNetworkRespSipCode();
 
         coordinator.onRequestUpdated(mTaskId, REQUEST_UPDATE_NETWORK_RESPONSE);
 
@@ -137,28 +129,11 @@
         Collection<RequestResult> resultList = coordinator.getFinishedRequest();
         assertEquals(1, requestList.size());
         assertTrue(resultList.isEmpty());
-
-        verify(mUceStatsWriter).setSubscribeResponse(eq(mSubId), eq(mTaskId), eq(200));
-
         verify(mRequest, never()).onFinish();
     }
 
     @Test
     @SmallTest
-    public void testRequestNetworkRespFailure() throws Exception {
-        doReturn(Optional.of(400)).when(mResponse).getNetworkRespSipCode();
-
-        SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
-
-        coordinator.onRequestUpdated(mTaskId, REQUEST_UPDATE_NETWORK_RESPONSE);
-
-        verify(mUceStatsWriter).setSubscribeResponse(eq(mSubId), eq(mTaskId), eq(400));
-
-        verify(mRequest).onFinish();
-    }
-
-    @Test
-    @SmallTest
     public void testRequestNetworkRespError() throws Exception {
         SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
         doReturn(false).when(mResponse).isNetworkResponseOK();
@@ -187,8 +162,7 @@
         SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
 
         final List<RcsContactUceCapability> updatedCapList = new ArrayList<>();
-        RcsContactPresenceTuple tuple = getContactPresenceTuple();
-        RcsContactUceCapability updatedCapability = getContactUceCapability(tuple);
+        RcsContactUceCapability updatedCapability = getContactUceCapability();
         updatedCapList.add(updatedCapability);
         doReturn(updatedCapList).when(mResponse).getUpdatedContactCapability();
 
@@ -197,8 +171,6 @@
         verify(mRequestMgrCallback).saveCapabilities(updatedCapList);
         verify(mUceCallback).onCapabilitiesReceived(updatedCapList);
         verify(mResponse).removeUpdatedCapabilities(updatedCapList);
-
-        verify(mUceStatsWriter).setPresenceNotifyEvent(eq(mSubId), eq(mTaskId), any());
     }
 
     @Test
@@ -216,8 +188,6 @@
         verify(mRequestMgrCallback).saveCapabilities(updatedCapList);
         verify(mUceCallback).onCapabilitiesReceived(updatedCapList);
         verify(mResponse).removeTerminatedResources(updatedCapList);
-
-        verify(mUceStatsWriter).setPresenceNotifyEvent(eq(mSubId), eq(mTaskId), any());
     }
 
     @Test
@@ -241,16 +211,12 @@
     public void testRequestTerminated() throws Exception {
         SubscribeRequestCoordinator coordinator = getSubscribeCoordinator();
 
-        doReturn("noresource").when(mResponse).getTerminatedReason();
-
         coordinator.onRequestUpdated(mTaskId, REQUEST_UPDATE_TERMINATED);
 
         Collection<UceRequest> requestList = coordinator.getActivatedRequest();
         Collection<RequestResult> resultList = coordinator.getFinishedRequest();
         assertTrue(requestList.isEmpty());
         assertEquals(1, resultList.size());
-
-        verify(mUceStatsWriter).setSubscribeTerminated(eq(mSubId), eq(mTaskId), eq("noresource"));
     }
 
     @Test
@@ -268,18 +234,8 @@
 
     private SubscribeRequestCoordinator getSubscribeCoordinator() {
         SubscribeRequestCoordinator.Builder builder = new SubscribeRequestCoordinator.Builder(
-                mSubId, Collections.singletonList(mRequest), mRequestMgrCallback, mUceStatsWriter);
+                mSubId, Collections.singletonList(mRequest), mRequestMgrCallback);
         builder.setCapabilitiesCallback(mUceCallback);
-        SubscribeRequestCoordinator subCoor = builder.build();
-        return subCoor;
-    }
-
-    private RcsContactUceCapability getContactUceCapability(RcsContactPresenceTuple tuple) {
-        int requestResult = RcsContactUceCapability.REQUEST_RESULT_FOUND;
-        RcsContactUceCapability.PresenceBuilder builder =
-                new RcsContactUceCapability.PresenceBuilder(
-                        mContact, RcsContactUceCapability.SOURCE_TYPE_NETWORK, requestResult);
-        builder.addCapabilityTuple(tuple);
         return builder.build();
     }
 
@@ -290,12 +246,4 @@
                         mContact, RcsContactUceCapability.SOURCE_TYPE_NETWORK, requestResult);
         return builder.build();
     }
-
-    private RcsContactPresenceTuple getContactPresenceTuple() {
-        RcsContactPresenceTuple.Builder builder =
-            new RcsContactPresenceTuple.Builder("open", RcsContactPresenceTuple.SERVICE_ID_CHAT_V1,
-                "1.0");
-        return builder.build();
-
-    }
 }
diff --git a/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java b/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java
index b380eac..4a99dd1 100644
--- a/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/request/UceRequestManagerTest.java
@@ -17,7 +17,6 @@
 package com.android.ims.rcs.uce.request;
 
 import static android.telephony.ims.RcsContactUceCapability.CAPABILITY_MECHANISM_PRESENCE;
-import static android.telephony.ims.RcsContactUceCapability.SOURCE_TYPE_CACHED;
 
 import static com.android.ims.rcs.uce.request.UceRequestCoordinator.REQUEST_UPDATE_CACHED_CAPABILITY_UPDATE;
 import static com.android.ims.rcs.uce.request.UceRequestCoordinator.REQUEST_UPDATE_CAPABILITY_UPDATE;
@@ -50,15 +49,12 @@
 import com.android.ims.ImsTestBase;
 import com.android.ims.rcs.uce.UceController;
 import com.android.ims.rcs.uce.UceController.UceControllerCallback;
-import com.android.ims.rcs.uce.eab.EabCapabilityResult;
 import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
 import com.android.ims.rcs.uce.request.UceRequestManager.UceUtilsProxy;
 import com.android.ims.rcs.uce.util.FeatureTags;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
-import java.util.stream.Collectors;
 
 import org.junit.After;
 import org.junit.Before;
@@ -136,116 +132,6 @@
         verify(mCapabilitiesCallback).onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L);
     }
 
-    /**
-     * Test cache hit shortcut, where we return valid cache results when they exist before adding
-     * the request to the queue.
-     */
-    @Test
-    @SmallTest
-    public void testCacheHitShortcut() throws Exception {
-        UceRequestManager requestManager = getUceRequestManager();
-        requestManager.setsUceUtilsProxy(getUceUtilsProxy(true, true, true, false, true, 10));
-        Handler handler = requestManager.getUceRequestHandler();
-
-        List<Uri> uriList = new ArrayList<>();
-        uriList.add(Uri.fromParts("sip", "test", null));
-
-        // Simulate a cache entry for each item in the uriList
-        List<EabCapabilityResult> cachedNumbers = uriList.stream().map(uri ->
-                        new EabCapabilityResult(uri, EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
-                                new RcsContactUceCapability.PresenceBuilder(uri,
-                                        CAPABILITY_MECHANISM_PRESENCE, SOURCE_TYPE_CACHED).build()))
-                .collect(Collectors.toList());
-        doReturn(cachedNumbers).when(mCallback).getCapabilitiesFromCache(uriList);
-
-        requestManager.sendCapabilityRequest(uriList, false, mCapabilitiesCallback);
-        waitForHandlerAction(handler, 500L);
-        // Extract caps from EabCapabilityResult and ensure the Lists match.
-        verify(mCapabilitiesCallback).onCapabilitiesReceived(
-                cachedNumbers.stream().map(EabCapabilityResult::getContactCapabilities).collect(
-                Collectors.toList()));
-        verify(mCapabilitiesCallback).onComplete();
-        // The cache should have been hit, so no network requests should have been generated.
-        verify(mRequestRepository, never()).addRequestCoordinator(any());
-    }
-
-    /**
-     * Test cache hit shortcut, but in this case the cache result was expired. This should generate
-     * a network request.
-     */
-    @Test
-    @SmallTest
-    public void testCacheExpiredShortcut() throws Exception {
-        UceRequestManager requestManager = getUceRequestManager();
-        requestManager.setsUceUtilsProxy(getUceUtilsProxy(true, true, true, false, true, 10));
-        Handler handler = requestManager.getUceRequestHandler();
-
-        List<Uri> uriList = new ArrayList<>();
-        uriList.add(Uri.fromParts("sip", "test", null));
-
-        // Simulate a cache entry for each item in the uriList
-        List<EabCapabilityResult> cachedNumbers = uriList.stream().map(uri ->
-                        new EabCapabilityResult(uri,
-                                EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE,
-                                new RcsContactUceCapability.PresenceBuilder(uri,
-                                        CAPABILITY_MECHANISM_PRESENCE, SOURCE_TYPE_CACHED).build()))
-                .collect(Collectors.toList());
-        doReturn(cachedNumbers).when(mCallback).getCapabilitiesFromCache(uriList);
-
-        requestManager.sendCapabilityRequest(uriList, false, mCapabilitiesCallback);
-        waitForHandlerAction(handler, 500L);
-        // Extract caps from EabCapabilityResult and ensure the Lists match.
-        verify(mCapabilitiesCallback, never()).onCapabilitiesReceived(any());
-        verify(mCapabilitiesCallback, never()).onComplete();
-        // A network request should have been generated for the expired contact.
-        verify(mRequestRepository).addRequestCoordinator(any());
-    }
-
-    /**
-     * Test cache hit shortcut, where we return valid cache results when they exist before adding
-     * the request to the queue. This case also tests the case where one entry of requested caps is
-     * in the cache and the other isn't. We should receive a response for cached caps immediately
-     * and generate a network request for the one that isnt.
-     */
-    @Test
-    @SmallTest
-    public void testCacheHitShortcutForSubsetOfCaps() throws Exception {
-        UceRequestManager requestManager = getUceRequestManager();
-        requestManager.setsUceUtilsProxy(getUceUtilsProxy(true, true, true, false, true, 10));
-        Handler handler = requestManager.getUceRequestHandler();
-
-        List<Uri> uriList = new ArrayList<>();
-        Uri uri1 = Uri.fromParts("sip", "cachetest", null);
-        uriList.add(uri1);
-
-        // Simulate a cache entry for each item in the uriList
-        List<EabCapabilityResult> cachedNumbers = new ArrayList<>();
-        EabCapabilityResult cachedItem = new EabCapabilityResult(uri1,
-                EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
-                new RcsContactUceCapability.PresenceBuilder(uri1, CAPABILITY_MECHANISM_PRESENCE,
-                        SOURCE_TYPE_CACHED).build());
-        cachedNumbers.add(cachedItem);
-
-        // Add an entry that is not part of cache
-        Uri uri2 = Uri.fromParts("sip", "nettest", null);
-        uriList.add(uri2);
-        cachedNumbers.add(new EabCapabilityResult(uri2,
-                EabCapabilityResult.EAB_CONTACT_NOT_FOUND_FAILURE,
-                new RcsContactUceCapability.PresenceBuilder(uri2, CAPABILITY_MECHANISM_PRESENCE,
-                        SOURCE_TYPE_CACHED).build()));
-        doReturn(cachedNumbers).when(mCallback).getCapabilitiesFromCache(uriList);
-
-        requestManager.sendCapabilityRequest(uriList, false, mCapabilitiesCallback);
-        waitForHandlerAction(handler, 500L);
-        // Extract caps from EabCapabilityResult and ensure the Lists match.
-        verify(mCapabilitiesCallback).onCapabilitiesReceived(
-                Collections.singletonList(cachedItem.getContactCapabilities()));
-        verify(mCapabilitiesCallback, never()).onComplete();
-        // The cache should have been hit, but there was also entry that was not in the cache, so
-        // ensure that is requested.
-        verify(mRequestRepository).addRequestCoordinator(any());
-    }
-
     @Test
     @SmallTest
     public void testRequestManagerCallback() throws Exception {