Merge "remove orientation from voicemail settings activity"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9a3afdb..32733cc 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -199,6 +199,7 @@
             android:label="@string/emergencyDialerIconLabel"
             android:theme="@style/EmergencyDialerTheme"
             android:screenOrientation="portrait"
+            android:showWhenLocked="true"
             android:exported="true"
             android:resizeableActivity="false">
             <intent-filter>
diff --git a/ecc/input/eccdata.txt b/ecc/input/eccdata.txt
index f3f088b..ddf3505 100644
--- a/ecc/input/eccdata.txt
+++ b/ecc/input/eccdata.txt
@@ -627,6 +627,7 @@
     types: POLICE
     types: AMBULANCE
     types: FIRE
+    routing: EMERGENCY
   }
   ecc_fallback: "112"
 }
@@ -739,6 +740,7 @@
     types: POLICE
     types: AMBULANCE
     types: FIRE
+    routing: EMERGENCY
   }
   ecc_fallback: "112"
 }
@@ -1259,11 +1261,18 @@
   eccs {
     phone_number: "110"
     types: POLICE
+    routing: EMERGENCY
+  }
+  eccs {
+    phone_number: "118"
+    types: MARINE_GUARD
+    routing: EMERGENCY
   }
   eccs {
     phone_number: "119"
     types: AMBULANCE
     types: FIRE
+    routing: EMERGENCY
   }
   ecc_fallback: "112"
 }
@@ -1962,6 +1971,21 @@
     types: POLICE
     types: AMBULANCE
     types: FIRE
+    routing: EMERGENCY
+  }
+  eccs {
+    phone_number: "112"
+    types: POLICE
+    types: AMBULANCE
+    types: FIRE
+    routing: EMERGENCY
+  }
+  eccs {
+    phone_number: "911"
+    types: POLICE
+    types: AMBULANCE
+    types: FIRE
+    routing: EMERGENCY
   }
   ecc_fallback: "112"
 }
@@ -2121,6 +2145,14 @@
     types: POLICE
     types: AMBULANCE
     types: FIRE
+    routing: EMERGENCY
+  }
+  eccs {
+    phone_number: "911"
+    types: POLICE
+    types: AMBULANCE
+    types: FIRE
+    routing: EMERGENCY
   }
   ecc_fallback: "112"
 }
@@ -2281,6 +2313,7 @@
     types: POLICE
     types: AMBULANCE
     types: FIRE
+    routing: EMERGENCY
   }
   ecc_fallback: "112"
 }
@@ -2701,6 +2734,7 @@
     types: POLICE
     types: AMBULANCE
     types: FIRE
+    routing: EMERGENCY
   }
   ecc_fallback: "911"
 }
diff --git a/ecc/output/OWNERS b/ecc/output/OWNERS
index d9ecbb7..5685875 100644
--- a/ecc/output/OWNERS
+++ b/ecc/output/OWNERS
@@ -1,5 +1,4 @@
 set noparent
 
-djkrause@google.com
-satk@google.com
-somakala@google.com
\ No newline at end of file
+tgunn@google.com
+chinmayd@google.com
\ No newline at end of file
diff --git a/ecc/output/eccdata b/ecc/output/eccdata
index 4a3a2c8..c916c77 100644
--- a/ecc/output/eccdata
+++ b/ecc/output/eccdata
Binary files differ
diff --git a/src/com/android/phone/CallNotifier.java b/src/com/android/phone/CallNotifier.java
index 7f61f78..14db930 100644
--- a/src/com/android/phone/CallNotifier.java
+++ b/src/com/android/phone/CallNotifier.java
@@ -40,10 +40,12 @@
 import com.android.internal.telephony.CallManager;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.SubscriptionController;
 import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaDisplayInfoRec;
 import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaSignalInfoRec;
 import com.android.internal.telephony.cdma.SignalToneUtil;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -487,9 +489,16 @@
     }
 
     public void updatePhoneStateListeners(boolean isRefresh, int updateType, int subIdToUpdate) {
-        List<SubscriptionInfo> subInfos = SubscriptionController.getInstance()
-                .getActiveSubscriptionInfoList(mApplication.getOpPackageName(),
-                        mApplication.getAttributionTag());
+        List<SubscriptionInfo> subInfos;
+        if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+            subInfos = SubscriptionManagerService.getInstance()
+                    .getActiveSubscriptionInfoList(mApplication.getOpPackageName(),
+                            mApplication.getAttributionTag());
+        } else {
+            subInfos = SubscriptionController.getInstance()
+                    .getActiveSubscriptionInfoList(mApplication.getOpPackageName(),
+                            mApplication.getAttributionTag());
+        }
 
         // Sort sub id list based on slot id, so that CFI/MWI notifications will be updated for
         // slot 0 first then slot 1. This is needed to ensure that when CFI or MWI is enabled for
@@ -498,8 +507,8 @@
         List<Integer> subIdList = new ArrayList<Integer>(mTelephonyCallback.keySet());
         Collections.sort(subIdList, new Comparator<Integer>() {
             public int compare(Integer sub1, Integer sub2) {
-                int slotId1 = SubscriptionController.getInstance().getSlotIndex(sub1);
-                int slotId2 = SubscriptionController.getInstance().getSlotIndex(sub2);
+                int slotId1 = SubscriptionManager.getSlotIndex(sub1);
+                int slotId2 = SubscriptionManager.getSlotIndex(sub2);
                 return slotId1 > slotId2 ? 0 : -1;
             }
         });
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index a270e07..397ed35 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -80,6 +80,7 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -194,6 +195,14 @@
     // requested the dump.
     private static final String DUMP_ARG_REQUESTING_PACKAGE = "--requesting-package";
 
+    // Configs that should always be included when clients calls getConfig[ForSubId] with specified
+    // keys (even configs are not explicitly specified). Those configs have special purpose for the
+    // carrier config APIs to work correctly.
+    private static final String[] CONFIG_SUBSET_METADATA_KEYS = new String[] {
+            CarrierConfigManager.KEY_CARRIER_CONFIG_VERSION_STRING,
+            CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL
+    };
+
     // Handler to process various events.
     //
     // For each phoneId, the event sequence should be:
@@ -978,7 +987,7 @@
         if (isNoSimConfig) {
             fileName = getFilenameForNoSimConfig(packageName);
         } else {
-            if (SubscriptionManager.getSimStateForSlotIndex(phoneId)
+            if (TelephonyManager.getSimStateForSlotIndex(phoneId)
                     != TelephonyManager.SIM_STATE_LOADED) {
                 loge("Skip save config because SIM records are not loaded.");
                 return;
@@ -1069,7 +1078,7 @@
         if (isNoSimConfig) {
             fileName = getFilenameForNoSimConfig(packageName);
         } else {
-            if (SubscriptionManager.getSimStateForSlotIndex(phoneId)
+            if (TelephonyManager.getSimStateForSlotIndex(phoneId)
                     != TelephonyManager.SIM_STATE_LOADED) {
                 loge("Skip restore config because SIM records are not loaded.");
                 return null;
@@ -1329,6 +1338,52 @@
     }
 
     @Override
+    @NonNull
+    public PersistableBundle getConfigSubsetForSubIdWithFeature(int subscriptionId,
+            @NonNull String callingPackage, @Nullable String callingFeatureId,
+            @NonNull String[] keys) {
+        Objects.requireNonNull(callingPackage, "Calling package must be non-null");
+        Objects.requireNonNull(keys, "Config keys must be non-null");
+        enforceCallerIsSystemOrRequestingPackage(callingPackage);
+
+        // Permission check is performed inside and an empty bundle will return on failure.
+        // No SecurityException thrown here since most clients expect to retrieve the overridden
+        // value if present or use default one if not
+        PersistableBundle allConfigs = getConfigForSubIdWithFeature(subscriptionId, callingPackage,
+                callingFeatureId);
+        if (allConfigs.isEmpty()) {
+            return allConfigs;
+        }
+        for (String key : keys) {
+            Objects.requireNonNull(key, "Config key must be non-null");
+            // TODO(b/261776046): validate provided key which may has no default value.
+            // For now, return empty bundle if any required key is not supported
+            if (!allConfigs.containsKey(key)) {
+                return new PersistableBundle();
+            }
+        }
+
+        PersistableBundle configSubset = new PersistableBundle(
+                keys.length + CONFIG_SUBSET_METADATA_KEYS.length);
+        for (String carrierConfigKey : keys) {
+            Object value = allConfigs.get(carrierConfigKey);
+            // Config value itself could be PersistableBundle which requires different API to put
+            if (value instanceof PersistableBundle) {
+                configSubset.putPersistableBundle(carrierConfigKey, (PersistableBundle) value);
+            } else {
+                configSubset.putObject(carrierConfigKey, value);
+            }
+        }
+
+        // Configs in CONFIG_SUBSET_ALWAYS_INCLUDED_KEYS should always be included
+        for (String generalKey : CONFIG_SUBSET_METADATA_KEYS) {
+            configSubset.putObject(generalKey, allConfigs.get(generalKey));
+        }
+
+        return configSubset;
+    }
+
+    @Override
     public void overrideConfig(int subscriptionId, @Nullable PersistableBundle overrides,
             boolean persistent) {
         mContext.enforceCallingOrSelfPermission(
diff --git a/src/com/android/phone/EmergencyDialer.java b/src/com/android/phone/EmergencyDialer.java
index 9b7a43e..5fe8708 100644
--- a/src/com/android/phone/EmergencyDialer.java
+++ b/src/com/android/phone/EmergencyDialer.java
@@ -259,8 +259,6 @@
         mEntryType = getIntent().getIntExtra(EXTRA_ENTRY_TYPE, ENTRY_TYPE_UNKNOWN);
         Log.d(LOG_TAG, "Launched from " + entryTypeToString(mEntryType));
 
-        // Allow this activity to be displayed in front of the keyguard / lockscreen.
-        setShowWhenLocked(true);
         // Allow turning screen on
         setTurnScreenOn(true);
 
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index abbd816..bc6a7ae 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -17,6 +17,7 @@
 package com.android.phone;
 
 import android.annotation.IntDef;
+import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.KeyguardManager;
 import android.app.ProgressDialog;
@@ -49,6 +50,7 @@
 import android.telephony.TelephonyCallback;
 import android.telephony.TelephonyLocalConnection;
 import android.telephony.TelephonyManager;
+import android.util.ArraySet;
 import android.util.LocalLog;
 import android.util.Log;
 import android.widget.Toast;
@@ -188,6 +190,9 @@
     @RoamingNotification
     private int mPrevRoamingNotification = ROAMING_NOTIFICATION_NO_NOTIFICATION;
 
+    /** Operator numerics for which we've shown is-roaming notifications. **/
+    private ArraySet<String> mPrevRoamingOperatorNumerics = new ArraySet<>();
+
     private WakeState mWakeState = WakeState.SLEEP;
 
     private PowerManager mPowerManager;
@@ -375,7 +380,7 @@
                                 .unregisterTelephonyCallback(callback);
                         callback = new PhoneAppCallback(subId);
                         tm.createForSubscriptionId(subId).registerTelephonyCallback(
-                                TelephonyManager.INCLUDE_LOCATION_DATA_NONE, mHandler::post,
+                                TelephonyManager.INCLUDE_LOCATION_DATA_COARSE, mHandler::post,
                                 callback);
                         mTelephonyCallbacks[phone.getPhoneId()] = callback;
                     }
@@ -736,6 +741,13 @@
         Settings.Global.putInt(getContentResolver(), Settings.Global.ENABLE_CELLULAR_ON_BOOT, 0);
         TelephonyProperties.airplane_mode_on(true); // true means int value 1
         PhoneUtils.setRadioPower(false);
+        clearCacheOnRadioOff();
+    }
+
+    /** Clear fields on power off radio **/
+    private void clearCacheOnRadioOff() {
+        // Re-show is-roaming notifications after APM mode
+        mPrevRoamingOperatorNumerics.clear();
     }
 
     private void setRadioPowerOn() {
@@ -859,26 +871,27 @@
                     + mDefaultDataSubId + ", ss roaming=" + serviceState.getDataRoaming());
         }
         if (subId == mDefaultDataSubId) {
-            updateDataRoamingStatus();
+            updateDataRoamingStatus(serviceState.getOperatorNumeric());
         }
     }
 
     /**
-     * @return whether or not we should show a notification when connecting to data roaming if the
-     * user has data roaming enabled
-     */
-    private boolean shouldShowDataConnectedRoaming(int subId) {
-        PersistableBundle config = getCarrierConfigForSubId(subId);
-        return config.getBoolean(CarrierConfigManager
-                .KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL);
-    }
-
-    /**
      * When roaming, if mobile data cannot be established due to data roaming not enabled, we need
      * to notify the user so they can enable it through settings. Vise versa if the condition
      * changes, we need to dismiss the notification.
      */
     private void updateDataRoamingStatus() {
+        updateDataRoamingStatus(null /*roamingOperatorNumeric*/);
+    }
+
+    /**
+     * When roaming, if mobile data cannot be established due to data roaming not enabled, we need
+     * to notify the user so they can enable it through settings. Vise versa if the condition
+     * changes, we need to dismiss the notification.
+     * @param roamingOperatorNumeric The operator numeric for the current roaming. {@code null} if
+     *                               the current roaming operator numeric didn't change.
+     */
+    private void updateDataRoamingStatus(@Nullable String roamingOperatorNumeric) {
         if (VDBG) Log.v(LOG_TAG, "updateDataRoamingStatus");
         Phone phone = getPhone(mDefaultDataSubId);
         if (phone == null) {
@@ -893,10 +906,21 @@
         dataAllowed = reasons.isEmpty();
         notAllowedDueToRoamingOff = (reasons.size() == 1
                 && reasons.contains(DataDisallowedReason.ROAMING_DISABLED));
-        mDataRoamingNotifLog.log("dataAllowed=" + dataAllowed + ", reasons=" + reasons);
-        if (VDBG) Log.v(LOG_TAG, "dataAllowed=" + dataAllowed + ", reasons=" + reasons);
+        mDataRoamingNotifLog.log("dataAllowed=" + dataAllowed + ", reasons=" + reasons
+                + ", roamingOperatorNumeric=" + roamingOperatorNumeric);
+        if (VDBG) {
+            Log.v(LOG_TAG, "dataAllowed=" + dataAllowed + ", reasons=" + reasons
+                    + ", roamingOperatorNumeric=" + roamingOperatorNumeric);
+        }
 
         if (!dataAllowed && notAllowedDueToRoamingOff) {
+            // Don't show roaming notification if we've already shown for this MccMnc
+            if (roamingOperatorNumeric != null
+                    && !mPrevRoamingOperatorNumerics.add(roamingOperatorNumeric)) {
+                Log.d(LOG_TAG, "Skip roaming disconnected notification since already shown in "
+                        + "MccMnc " + roamingOperatorNumeric);
+                return;
+            }
             // No need to show it again if we never cancelled it explicitly.
             if (mPrevRoamingNotification == ROAMING_NOTIFICATION_DISCONNECTED) return;
             // If the only reason of no data is data roaming disabled, then we notify the user
@@ -907,8 +931,18 @@
             Message msg = mHandler.obtainMessage(EVENT_DATA_ROAMING_DISCONNECTED);
             msg.arg1 = mDefaultDataSubId;
             msg.sendToTarget();
-        } else if (dataAllowed && dataIsNowRoaming(mDefaultDataSubId)
-                && shouldShowDataConnectedRoaming(mDefaultDataSubId)) {
+        } else if (dataAllowed && dataIsNowRoaming(mDefaultDataSubId)) {
+            boolean isShowRoamingNotificationEnabled = getCarrierConfigForSubId(mDefaultDataSubId)
+                    .getBoolean(CarrierConfigManager
+                            .KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL);
+            if (!isShowRoamingNotificationEnabled) return;
+            // Don't show roaming notification if we've already shown for this MccMnc
+            if (roamingOperatorNumeric != null
+                    && !mPrevRoamingOperatorNumerics.add(roamingOperatorNumeric)) {
+                Log.d(LOG_TAG, "Skip roaming connected notification since already shown in "
+                        + "MccMnc " + roamingOperatorNumeric);
+                return;
+            }
             // No need to show it again if we never cancelled it explicitly, or carrier config
             // indicates this is not needed.
             if (mPrevRoamingNotification == ROAMING_NOTIFICATION_CONNECTED) return;
@@ -1053,6 +1087,7 @@
             e.printStackTrace();
         }
         pw.decreaseIndent();
+        pw.println("mPrevRoamingOperatorNumerics:" + mPrevRoamingOperatorNumerics);
         pw.println("------- End PhoneGlobals -------");
     }
 }
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 865a948..0124ee1 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -17,6 +17,7 @@
 package com.android.phone;
 
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.telephony.TelephonyManager.HAL_SERVICE_NETWORK;
 import static android.telephony.TelephonyManager.HAL_SERVICE_RADIO;
 
 import static com.android.internal.telephony.PhoneConstants.PHONE_TYPE_CDMA;
@@ -111,6 +112,7 @@
 import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.TelephonyHistogram;
 import android.telephony.TelephonyManager;
+import android.telephony.TelephonyManager.SimState;
 import android.telephony.TelephonyScanManager;
 import android.telephony.ThermalMitigationRequest;
 import android.telephony.UiccCardInfo;
@@ -167,6 +169,7 @@
 import com.android.internal.telephony.INumberVerificationCallback;
 import com.android.internal.telephony.ITelephony;
 import com.android.internal.telephony.IccCard;
+import com.android.internal.telephony.IccCardConstants;
 import com.android.internal.telephony.IccLogicalChannelRequest;
 import com.android.internal.telephony.LocaleTracker;
 import com.android.internal.telephony.NetworkScanRequestTracker;
@@ -181,6 +184,7 @@
 import com.android.internal.telephony.RILConstants;
 import com.android.internal.telephony.RadioInterfaceCapabilityController;
 import com.android.internal.telephony.ServiceStateTracker;
+import com.android.internal.telephony.SmsApplication;
 import com.android.internal.telephony.SmsController;
 import com.android.internal.telephony.SmsPermissions;
 import com.android.internal.telephony.SubscriptionController;
@@ -194,6 +198,8 @@
 import com.android.internal.telephony.imsphone.ImsPhoneCallTracker;
 import com.android.internal.telephony.metrics.RcsStats;
 import com.android.internal.telephony.metrics.TelephonyMetrics;
+import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
 import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType;
 import com.android.internal.telephony.uicc.IccIoResult;
 import com.android.internal.telephony.uicc.IccUtils;
@@ -205,6 +211,7 @@
 import com.android.internal.telephony.uicc.UiccProfile;
 import com.android.internal.telephony.uicc.UiccSlot;
 import com.android.internal.telephony.util.LocaleUtils;
+import com.android.internal.telephony.util.TelephonyUtils;
 import com.android.internal.telephony.util.VoicemailNotificationSettingsUtil;
 import com.android.internal.util.FunctionalUtils;
 import com.android.internal.util.HexDump;
@@ -371,6 +378,9 @@
     private static final int SELECT_P2 = 0;
     private static final int SELECT_P3 = 0x10;
 
+    // Toggling null cipher and integrity support was added in IRadioNetwork 2.1
+    private static final int MIN_NULL_CIPHER_AND_INTEGRITY_VERSION = 201;
+
     /** The singleton instance. */
     private static PhoneInterfaceManager sInstance;
     private static List<String> sThermalMitigationAllowlistedPackages = new ArrayList<>();
@@ -1437,6 +1447,7 @@
                     request = (MainThreadRequest) ar.userObj;
                     ResultReceiver result = (ResultReceiver) request.argument;
                     int error = 0;
+                    ModemActivityInfo ret = null;
                     if (mLastModemActivityInfo == null) {
                         mLastModemActivitySpecificInfo = new ActivityStatsTechSpecificInfo[1];
                         mLastModemActivitySpecificInfo[0] =
@@ -1455,12 +1466,14 @@
                         if (isModemActivityInfoValid(info)) {
                             mergeModemActivityInfo(info);
                         }
-                        mLastModemActivityInfo =
-                                new ModemActivityInfo(
-                                        mLastModemActivityInfo.getTimestampMillis(),
-                                        mLastModemActivityInfo.getSleepTimeMillis(),
-                                        mLastModemActivityInfo.getIdleTimeMillis(),
-                                        mLastModemActivitySpecificInfo);
+                        // This is needed to decouple ret from mLastModemActivityInfo
+                        // We don't want to return mLastModemActivityInfo which is updated
+                        // inside mergeModemActivityInfo()
+                        ret = new ModemActivityInfo(
+                                mLastModemActivityInfo.getTimestampMillis(),
+                                mLastModemActivityInfo.getSleepTimeMillis(),
+                                mLastModemActivityInfo.getIdleTimeMillis(),
+                                deepCopyModemActivitySpecificInfo(mLastModemActivitySpecificInfo));
 
                     } else {
                         if (ar.result == null) {
@@ -1478,10 +1491,10 @@
                         }
                     }
                     Bundle bundle = new Bundle();
-                    if (mLastModemActivityInfo != null) {
+                    if (ret != null) {
                         bundle.putParcelable(
                                 TelephonyManager.MODEM_ACTIVITY_RESULT_KEY,
-                                mLastModemActivityInfo);
+                                ret);
                     } else {
                         bundle.putInt(TelephonyManager.EXCEPTION_RESULT_KEY, error);
                     }
@@ -2409,6 +2422,11 @@
         publish();
     }
 
+    @VisibleForTesting
+    public SharedPreferences getSharedPreferences() {
+        return mTelephonySharedPreferences;
+    }
+
     private Phone getDefaultPhone() {
         Phone thePhone = getPhone(getDefaultSubscription());
         return (thePhone != null) ? thePhone : PhoneFactory.getDefaultPhone();
@@ -2445,7 +2463,7 @@
 
     // returns phone associated with the subId.
     private Phone getPhone(int subId) {
-        return PhoneFactory.getPhone(mSubscriptionController.getPhoneId(subId));
+        return PhoneFactory.getPhone(SubscriptionManager.getPhoneId(subId));
     }
 
     private void sendEraseModemConfig(@NonNull Phone phone) {
@@ -3006,7 +3024,7 @@
 
         final long identity = Binder.clearCallingIdentity();
         try {
-            int subId = mSubscriptionController.getDefaultDataSubId();
+            int subId = SubscriptionManager.getDefaultDataSubscriptionId();
             final Phone phone = getPhone(subId);
             if (phone != null) {
                 phone.getDataSettingsManager().setDataEnabled(
@@ -3027,7 +3045,7 @@
 
         final long identity = Binder.clearCallingIdentity();
         try {
-            int subId = mSubscriptionController.getDefaultDataSubId();
+            int subId = SubscriptionManager.getDefaultDataSubscriptionId();
             final Phone phone = getPhone(subId);
             if (phone != null) {
                 phone.getDataSettingsManager().setDataEnabled(
@@ -3138,7 +3156,7 @@
 
     @Override
     public int getDataState() {
-        return getDataStateForSubId(mSubscriptionController.getDefaultDataSubId());
+        return getDataStateForSubId(SubscriptionManager.getDefaultDataSubscriptionId());
     }
 
     @Override
@@ -3159,7 +3177,7 @@
 
     @Override
     public @DataActivityType int getDataActivity() {
-        return getDataActivityForSubId(mSubscriptionController.getDefaultDataSubId());
+        return getDataActivityForSubId(SubscriptionManager.getDefaultDataSubscriptionId());
     }
 
     @Override
@@ -3205,7 +3223,7 @@
         final long identity = Binder.clearCallingIdentity();
         try {
             if (DBG_LOC) log("getCellLocation: is active user");
-            int subId = mSubscriptionController.getDefaultDataSubId();
+            int subId = SubscriptionManager.getDefaultDataSubscriptionId();
             return (CellIdentity) sendRequest(CMD_GET_CELL_LOCATION, workSource, subId);
         } finally {
             Binder.restoreCallingIdentity(identity);
@@ -3222,7 +3240,7 @@
                 // Get default phone in this case.
                 phoneId = SubscriptionManager.DEFAULT_PHONE_INDEX;
             }
-            final int subId = mSubscriptionController.getSubId(phoneId);
+            final int subId = SubscriptionManager.getSubscriptionId(phoneId);
             Phone phone = PhoneFactory.getPhone(phoneId);
             if (phone == null) return "";
             ServiceStateTracker sst = phone.getServiceStateTracker();
@@ -3625,10 +3643,21 @@
      *
      * @throws SecurityException if the caller does not have the required permission
      */
-    private void enforceModifyPermission() {
+    @VisibleForTesting
+    public void enforceModifyPermission() {
         mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null);
     }
 
+    /**
+     * Make sure the caller has the MODIFY_PHONE_STATE permission.
+     *
+     * @throws SecurityException if the caller does not have the required permission
+     */
+    @VisibleForTesting
+    public void enforceReadPermission() {
+        mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE, null);
+    }
+
     private void enforceActiveEmergencySessionPermission() {
         mApp.enforceCallingOrSelfPermission(
                 android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION, null);
@@ -5169,7 +5198,7 @@
      */
     @Override
     public int getDataNetworkType(String callingPackage, String callingFeatureId) {
-        return getDataNetworkTypeForSubscriber(mSubscriptionController.getDefaultDataSubId(),
+        return getDataNetworkTypeForSubscriber(SubscriptionManager.getDefaultDataSubscriptionId(),
                 callingPackage, callingFeatureId);
     }
 
@@ -5234,7 +5263,7 @@
      */
     public boolean hasIccCard() {
         // FIXME Make changes to pass defaultSimId of type int
-        return hasIccCardUsingSlotIndex(mSubscriptionController.getSlotIndex(
+        return hasIccCardUsingSlotIndex(SubscriptionManager.getSlotIndex(
                 getDefaultSubscription()));
     }
 
@@ -5299,18 +5328,22 @@
      * Returns Default subId, 0 in the case of single standby.
      */
     private int getDefaultSubscription() {
-        return mSubscriptionController.getDefaultSubId();
+        return SubscriptionManager.getDefaultSubscriptionId();
     }
 
     private int getSlotForDefaultSubscription() {
-        return mSubscriptionController.getPhoneId(getDefaultSubscription());
+        return SubscriptionManager.getPhoneId(getDefaultSubscription());
     }
 
     private int getPreferredVoiceSubscription() {
-        return mSubscriptionController.getDefaultVoiceSubId();
+        return SubscriptionManager.getDefaultVoiceSubscriptionId();
     }
 
     private boolean isActiveSubscription(int subId) {
+        if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+            return SubscriptionManagerService.getInstance().isActiveSubId(subId,
+                    mApp.getOpPackageName(), mApp.getFeatureId());
+        }
         return mSubscriptionController.isActiveSubId(subId);
     }
 
@@ -6149,11 +6182,11 @@
         TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
                 mApp, subId, "setNetworkSelectionModeManual");
 
+        final long identity = Binder.clearCallingIdentity();
         if (!isActiveSubscription(subId)) {
             return false;
         }
 
-        final long identity = Binder.clearCallingIdentity();
         try {
             ManualNetworkSelectionArgument arg = new ManualNetworkSelectionArgument(operatorInfo,
                     persistSelection);
@@ -6764,7 +6797,7 @@
 
         final long identity = Binder.clearCallingIdentity();
         try {
-            int phoneId = mSubscriptionController.getPhoneId(subId);
+            int phoneId = SubscriptionManager.getPhoneId(subId);
             if (DBG) log("isUserDataEnabled: subId=" + subId + " phoneId=" + phoneId);
             Phone phone = PhoneFactory.getPhone(phoneId);
             if (phone != null) {
@@ -6811,7 +6844,7 @@
 
         final long identity = Binder.clearCallingIdentity();
         try {
-            int phoneId = mSubscriptionController.getPhoneId(subId);
+            int phoneId = SubscriptionManager.getPhoneId(subId);
             Phone phone = PhoneFactory.getPhone(phoneId);
             if (phone != null) {
                 boolean retVal = phone.getDataSettingsManager().isDataEnabled();
@@ -6858,7 +6891,7 @@
 
         final long identity = Binder.clearCallingIdentity();
         try {
-            int phoneId = mSubscriptionController.getPhoneId(subId);
+            int phoneId = SubscriptionManager.getPhoneId(subId);
             if (DBG) {
                 log("isDataEnabledForReason: subId=" + subId + " phoneId=" + phoneId
                         + " reason=" + reason);
@@ -7270,9 +7303,16 @@
                 return null;
             }
 
-            final SubscriptionInfo info = SubscriptionController.getInstance()
-                    .getSubscriptionInfo(subId);
-            final ParcelUuid groupUuid = info.getGroupUuid();
+            ParcelUuid groupUuid;
+            if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+                final SubscriptionInfo info = SubscriptionManagerService.getInstance()
+                        .getSubscriptionInfo(subId);
+                groupUuid = info.getGroupUuid();
+            } else {
+                final SubscriptionInfo info = mSubscriptionController
+                        .getSubscriptionInfo(subId);
+                groupUuid = info.getGroupUuid();
+            }
             // If it doesn't belong to any group, return just subscriberId of itself.
             if (groupUuid == null) {
                 return new String[]{subscriberId};
@@ -7280,9 +7320,16 @@
 
             // Get all subscriberIds from the group.
             final List<String> mergedSubscriberIds = new ArrayList<>();
-            final List<SubscriptionInfo> groupInfos = SubscriptionController.getInstance()
-                    .getSubscriptionsInGroup(groupUuid, mApp.getOpPackageName(),
-                            mApp.getAttributionTag());
+            List<SubscriptionInfo> groupInfos;
+            if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+                groupInfos = SubscriptionManagerService.getInstance()
+                        .getSubscriptionsInGroup(groupUuid, mApp.getOpPackageName(),
+                                mApp.getAttributionTag());
+            } else {
+                groupInfos = mSubscriptionController
+                        .getSubscriptionsInGroup(groupUuid, mApp.getOpPackageName(),
+                                mApp.getAttributionTag());
+            }
             for (SubscriptionInfo subInfo : groupInfos) {
                 subscriberId = telephonyManager.getSubscriberId(subInfo.getSubscriptionId());
                 if (subscriberId != null) {
@@ -7842,11 +7889,23 @@
         }
         final long identity = Binder.clearCallingIdentity();
         try {
-            final SubscriptionInfo info = mSubscriptionController.getActiveSubscriptionInfo(subId,
-                    phone.getContext().getOpPackageName(), phone.getContext().getAttributionTag());
-            if (info == null) {
-                log("getSimLocaleForSubscriber, inactive subId: " + subId);
-                return null;
+            SubscriptionInfo info;
+            if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+                info = SubscriptionManagerService.getInstance().getActiveSubscriptionInfo(subId,
+                        phone.getContext().getOpPackageName(),
+                        phone.getContext().getAttributionTag());
+                if (info == null) {
+                    log("getSimLocaleForSubscriber, inactive subId: " + subId);
+                    return null;
+                }
+            } else {
+                info = mSubscriptionController.getActiveSubscriptionInfo(subId,
+                        phone.getContext().getOpPackageName(),
+                        phone.getContext().getAttributionTag());
+                if (info == null) {
+                    log("getSimLocaleForSubscriber, inactive subId: " + subId);
+                    return null;
+                }
             }
             // Try and fetch the locale from the carrier properties or from the SIM language
             // preferences (EF-PL and EF-LI)...
@@ -7894,15 +7953,14 @@
         return inputLocale.toLanguageTag();
     }
 
-    private List<SubscriptionInfo> getAllSubscriptionInfoList() {
-        return mSubscriptionController.getAllSubInfoList(mApp.getOpPackageName(),
-                mApp.getAttributionTag());
-    }
-
     /**
      * NOTE: this method assumes permission checks are done and caller identity has been cleared.
      */
     private List<SubscriptionInfo> getActiveSubscriptionInfoListPrivileged() {
+        if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+            return SubscriptionManagerService.getInstance().getActiveSubscriptionInfoList(
+                    mApp.getOpPackageName(), mApp.getAttributionTag());
+        }
         return mSubscriptionController.getActiveSubscriptionInfoList(mApp.getOpPackageName(),
                 mApp.getAttributionTag());
     }
@@ -7985,7 +8043,7 @@
     */
     private void mergeModemActivityInfo(ModemActivityInfo info) {
         List<ActivityStatsTechSpecificInfo> merged = new ArrayList<>();
-        ActivityStatsTechSpecificInfo mDeltaSpecificInfo;
+        ActivityStatsTechSpecificInfo deltaSpecificInfo;
         boolean matched;
         for (int i = 0; i < info.getSpecificInfoLength(); i++) {
             matched = false;
@@ -8010,13 +8068,13 @@
             }
 
             if (!matched) {
-                mDeltaSpecificInfo =
+                deltaSpecificInfo =
                         new ActivityStatsTechSpecificInfo(
                                 rat,
                                 freq,
                                 info.getTransmitTimeMillis(rat, freq),
                                 (int) info.getReceiveTimeMillis(rat, freq));
-                merged.addAll(Arrays.asList(mDeltaSpecificInfo));
+                merged.addAll(Arrays.asList(deltaSpecificInfo));
             }
         }
         merged.addAll(Arrays.asList(mLastModemActivitySpecificInfo));
@@ -8031,6 +8089,26 @@
         mLastModemActivityInfo.setIdleTimeMillis(
                 info.getIdleTimeMillis()
                 + mLastModemActivityInfo.getIdleTimeMillis());
+
+        mLastModemActivityInfo =
+                 new ModemActivityInfo(
+                         mLastModemActivityInfo.getTimestampMillis(),
+                         mLastModemActivityInfo.getSleepTimeMillis(),
+                         mLastModemActivityInfo.getIdleTimeMillis(),
+                         mLastModemActivitySpecificInfo);
+    }
+
+    private ActivityStatsTechSpecificInfo[] deepCopyModemActivitySpecificInfo(
+            ActivityStatsTechSpecificInfo[] info) {
+        int infoSize = info.length;
+        ActivityStatsTechSpecificInfo[] ret = new ActivityStatsTechSpecificInfo[infoSize];
+        for (int i = 0; i < infoSize; i++) {
+            ret[i] = new ActivityStatsTechSpecificInfo(
+                    info[i].getRat(), info[i].getFrequencyRange(),
+                    info[i].getTransmitTimeMillis(),
+                    (int) info[i].getReceiveTimeMillis());
+        }
+        return ret;
     }
 
     /**
@@ -8094,10 +8172,21 @@
                 .contains(callingPackage);
         try {
             // isActiveSubId requires READ_PHONE_STATE, which we already check for above
-            if (!mSubscriptionController.isActiveSubId(subId, callingPackage, callingFeatureId)) {
-                Rlog.d(LOG_TAG,
-                        "getServiceStateForSubscriber returning null for inactive subId=" + subId);
-                return null;
+            if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+                SubscriptionInfoInternal subInfo = SubscriptionManagerService.getInstance()
+                        .getSubscriptionInfoInternal(subId);
+                if (subInfo == null || !subInfo.isActive()) {
+                    Rlog.d(LOG_TAG, "getServiceStateForSubscriber returning null for inactive "
+                            + "subId=" + subId);
+                    return null;
+                }
+            } else {
+                if (!mSubscriptionController.isActiveSubId(subId, callingPackage,
+                        callingFeatureId)) {
+                    Rlog.d(LOG_TAG, "getServiceStateForSubscriber returning null for inactive "
+                            + "subId=" + subId);
+                    return null;
+                }
             }
 
             ServiceState ss = phone.getServiceState();
@@ -8248,6 +8337,16 @@
     }
 
     /**
+     * Make sure either called from same process as self (phone) or IPC caller has interact across
+     * users permission.
+     *
+     * @throws SecurityException if the caller does not have the required permission
+     */
+    private void enforceInteractAcrossUsersPermission(String message) {
+        mApp.enforceCallingOrSelfPermission(permission.INTERACT_ACROSS_USERS, message);
+    }
+
+    /**
      * Make sure called from the package in charge of visual voicemail.
      *
      * @throws SecurityException if the caller is not the visual voicemail package.
@@ -9236,7 +9335,7 @@
      */
     private int getDefaultNetworkType(int subId) {
         List<Integer> list = TelephonyProperties.default_network();
-        int phoneId = mSubscriptionController.getPhoneId(subId);
+        int phoneId = SubscriptionManager.getPhoneId(subId);
         if (phoneId >= 0 && phoneId < list.size() && list.get(phoneId) != null) {
             return list.get(phoneId);
         }
@@ -11282,6 +11381,10 @@
         }
 
         Phone phone = getPhone(subId);
+        if (phone == null) {
+            loge("isPremiumCapabilityAvailableForPurchase: phone is null, subId=" + subId);
+            return false;
+        }
         final long identity = Binder.clearCallingIdentity();
         try {
             return SlicePurchaseController.getInstance(phone)
@@ -11314,6 +11417,21 @@
         }
 
         Phone phone = getPhone(subId);
+        if (phone == null) {
+            try {
+                int result = TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED;
+                callback.accept(result);
+                loge("purchasePremiumCapability: phone is null, subId=" + subId);
+            } catch (RemoteException e) {
+                String logStr = "Purchase premium capability "
+                        + TelephonyManager.convertPremiumCapabilityToString(capability)
+                        + " failed due to RemoteException handling null phone: " + e;
+                if (DBG) log(logStr);
+                AnomalyReporter.reportAnomaly(
+                        UUID.fromString(PURCHASE_PREMIUM_CAPABILITY_ERROR_UUID), logStr);
+            }
+            return;
+        }
         String appName;
         try {
             appName = mApp.getPackageManager().getApplicationLabel(mApp.getPackageManager()
@@ -11530,5 +11648,112 @@
         }
     }
 
+    /**
+     * Get the component name of the default app to direct respond-via-message intent for the
+     * user associated with this subscription, update the cache if there is no respond-via-message
+     * application currently configured for this user.
+     * @return component name of the app and class to direct Respond Via Message intent to, or
+     * {@code null} if the functionality is not supported.
+     * @hide
+     */
+    @Override
+    public @Nullable ComponentName getDefaultRespondViaMessageApplication(int subId,
+            boolean updateIfNeeded) {
+        enforceInteractAcrossUsersPermission("getDefaultRespondViaMessageApplication");
 
-}
+        Context context = getPhone(subId).getContext();
+        UserHandle userHandle = null;
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            userHandle = TelephonyUtils.getSubscriptionUserHandle(context, subId);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+        return SmsApplication.getDefaultRespondViaMessageApplicationAsUser(context,
+                updateIfNeeded, userHandle);
+    }
+
+    /**
+     * Set whether the device is able to connect with null ciphering or integrity
+     * algorithms. This is a global setting and will apply to all active subscriptions
+     * and all new subscriptions after this.
+     *
+     * @param enabled when true, null  cipher and integrity algorithms are allowed.
+     * @hide
+     */
+    @Override
+    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+    public void setNullCipherAndIntegrityEnabled(boolean enabled) {
+        enforceModifyPermission();
+        checkForNullCipherAndIntegritySupport();
+
+        // Persist the state of our preference. Each GsmCdmaPhone instance is responsible
+        // for listening to these preference changes and applying them immediately.
+        SharedPreferences.Editor editor = mTelephonySharedPreferences.edit();
+        editor.putBoolean(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED, enabled);
+        editor.apply();
+
+        for (Phone phone: PhoneFactory.getPhones()) {
+            phone.handleNullCipherEnabledChange();
+        }
+    }
+
+
+    /**
+     * Get whether the device is able to connect with null ciphering or integrity
+     * algorithms. Note that this retrieves the phone-global preference and not
+     * the state of the radio.
+     *
+     * @throws SecurityException if {@link permission#MODIFY_PHONE_STATE} is not satisfied
+     * @throws UnsupportedOperationException if the device does not support the minimum HAL
+     * version for this feature.
+     * @hide
+     */
+    @Override
+    @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+    public boolean isNullCipherAndIntegrityPreferenceEnabled() {
+        enforceReadPermission();
+        checkForNullCipherAndIntegritySupport();
+        return getDefaultPhone().getNullCipherAndIntegrityEnabledPreference();
+    }
+
+    private void checkForNullCipherAndIntegritySupport() {
+        if (getHalVersion(HAL_SERVICE_NETWORK) < MIN_NULL_CIPHER_AND_INTEGRITY_VERSION) {
+            throw new UnsupportedOperationException(
+                    "Null cipher and integrity operations require HAL 2.1 or above");
+        }
+    }
+
+    /**
+     * Get the SIM state for the slot index.
+     * For Remote-SIMs, this method returns {@link IccCardConstants.State#UNKNOWN}
+     *
+     * @return SIM state as the ordinal of {@link IccCardConstants.State}
+     */
+    @Override
+    @SimState
+    public int getSimStateForSlotIndex(int slotIndex) {
+        IccCardConstants.State simState;
+        if (slotIndex < 0) {
+            simState = IccCardConstants.State.UNKNOWN;
+        } else {
+            Phone phone = null;
+            try {
+                phone = PhoneFactory.getPhone(slotIndex);
+            } catch (IllegalStateException e) {
+                // ignore
+            }
+            if (phone == null) {
+                simState = IccCardConstants.State.UNKNOWN;
+            } else {
+                IccCard icc = phone.getIccCard();
+                if (icc == null) {
+                    simState = IccCardConstants.State.UNKNOWN;
+                } else {
+                    simState = icc.getState();
+                }
+            }
+        }
+        return simState.ordinal();
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/phone/settings/AccessibilitySettingsFragment.java b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
index 475d878..4c29e65 100644
--- a/src/com/android/phone/settings/AccessibilitySettingsFragment.java
+++ b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
@@ -40,6 +40,7 @@
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.SubscriptionController;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
 import com.android.phone.PhoneGlobals;
 import com.android.phone.R;
 
@@ -183,10 +184,16 @@
             // Update RTT config with IMS Manager if the always-on carrier config isn't set to true.
             CarrierConfigManager configManager = (CarrierConfigManager) mContext.getSystemService(
                             Context.CARRIER_CONFIG_SERVICE);
-            for (int subId : SubscriptionController.getInstance().getActiveSubIdList(true)) {
+            int[] activeSubIds;
+            if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+                activeSubIds = SubscriptionManagerService.getInstance().getActiveSubIdList(true);
+            } else {
+                activeSubIds = SubscriptionController.getInstance().getActiveSubIdList(true);
+            }
+            for (int subId : activeSubIds) {
                 if (!configManager.getConfigForSubId(subId).getBoolean(
                         CarrierConfigManager.KEY_IGNORE_RTT_MODE_SETTING_BOOL, false)) {
-                    int phoneId = SubscriptionController.getInstance().getPhoneId(subId);
+                    int phoneId = SubscriptionManager.getPhoneId(subId);
                     ImsManager imsManager = ImsManager.getInstance(getContext(), phoneId);
                     imsManager.setRttEnabled(mButtonRtt.isChecked());
                 }
@@ -264,6 +271,14 @@
     private boolean shouldShowRttSetting() {
         // Go through all the subs -- if we want to display the RTT setting for any of them, do
         // display it.
+        if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+            for (int subId : SubscriptionManagerService.getInstance().getActiveSubIdList(true)) {
+                if (PhoneGlobals.getInstance().phoneMgr.isRttSupported(subId)) {
+                    return true;
+                }
+            }
+            return false;
+        }
         for (int subId : SubscriptionController.getInstance().getActiveSubIdList(true)) {
             if (PhoneGlobals.getInstance().phoneMgr.isRttSupported(subId)) {
                 return true;
diff --git a/src/com/android/phone/slice/PremiumNetworkEntitlementApi.java b/src/com/android/phone/slice/PremiumNetworkEntitlementApi.java
index 3fa64df..2546023 100644
--- a/src/com/android/phone/slice/PremiumNetworkEntitlementApi.java
+++ b/src/com/android/phone/slice/PremiumNetworkEntitlementApi.java
@@ -43,7 +43,7 @@
 public class PremiumNetworkEntitlementApi {
     private static final String TAG = "PremiumNwEntitlementApi";
     private static final String ENTITLEMENT_STATUS_KEY = "EntitlementStatus";
-    private static final String PROVISION_STATUS_KEY = "ProvisionStatus";
+    private static final String PROVISION_STATUS_KEY = "ProvStatus";
     private static final String SERVICE_FLOW_URL_KEY = "ServiceFlow_URL";
     private static final String PROVISION_TIME_LEFT_KEY = "ProvisionTimeLeft";
     private static final String DEFAULT_EAP_AKA_RESPONSE = "Default EAP AKA response";
@@ -145,16 +145,11 @@
                 if (jsonToken.has(PROVISION_TIME_LEFT_KEY)) {
                     provisionTimeLeft = jsonToken.getString(PROVISION_TIME_LEFT_KEY);
                     if (provisionTimeLeft != null) {
-                        premiumNetworkEntitlementResponse.mEntitlementStatus =
+                        premiumNetworkEntitlementResponse.mProvisionTimeLeft =
                                 Integer.parseInt(provisionTimeLeft);
                     }
                 }
                 if (jsonToken.has(SERVICE_FLOW_URL_KEY)) {
-                    provisionStatus = jsonToken.getString(SERVICE_FLOW_URL_KEY);
-                    if (provisionStatus != null) {
-                        premiumNetworkEntitlementResponse.mProvisionStatus =
-                                Integer.parseInt(provisionStatus);
-                    }
                     premiumNetworkEntitlementResponse.mServiceFlowURL =
                             jsonToken.getString(SERVICE_FLOW_URL_KEY);
                 }
diff --git a/src/com/android/phone/slice/PremiumNetworkEntitlementResponse.java b/src/com/android/phone/slice/PremiumNetworkEntitlementResponse.java
index d852a69..4e63e35 100644
--- a/src/com/android/phone/slice/PremiumNetworkEntitlementResponse.java
+++ b/src/com/android/phone/slice/PremiumNetworkEntitlementResponse.java
@@ -56,6 +56,7 @@
 
     @PremiumNetworkEntitlementStatus public int mEntitlementStatus;
     @PremiumNetworkProvisionStatus public int mProvisionStatus;
+    public int mProvisionTimeLeft;
     @NonNull public String mServiceFlowURL;
 
     /**
diff --git a/src/com/android/phone/slice/SlicePurchaseController.java b/src/com/android/phone/slice/SlicePurchaseController.java
index ead6b8c..f258e2c 100644
--- a/src/com/android/phone/slice/SlicePurchaseController.java
+++ b/src/com/android/phone/slice/SlicePurchaseController.java
@@ -31,6 +31,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.SharedPreferences;
 import android.net.ConnectivityManager;
 import android.os.AsyncResult;
 import android.os.Handler;
@@ -57,6 +58,9 @@
 import java.net.MalformedURLException;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeParseException;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -115,8 +119,8 @@
     private static final int EVENT_PURCHASE_UNTHROTTLED = 1;
     /** Slicing config changed. */
     private static final int EVENT_SLICING_CONFIG_CHANGED = 2;
-    /** Display booster notification. */
-    private static final int EVENT_DISPLAY_BOOSTER_NOTIFICATION = 3;
+    /** Start slice purchase application. */
+    private static final int EVENT_START_SLICE_PURCHASE_APP = 3;
     /**
      * Premium capability was not purchased within the timeout specified by
      * {@link CarrierConfigManager#KEY_PREMIUM_CAPABILITY_NOTIFICATION_DISPLAY_TIMEOUT_MILLIS_LONG}.
@@ -170,6 +174,9 @@
     /** Action indicating the purchase request was successful. */
     private static final String ACTION_SLICE_PURCHASE_APP_RESPONSE_SUCCESS =
             "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_SUCCESS";
+    /** Action indicating the slice purchase application showed the network boost notification. */
+    private static final String ACTION_SLICE_PURCHASE_APP_RESPONSE_NOTIFICATION_SHOWN =
+            "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_NOTIFICATION_SHOWN";
 
     /** Extra for the phone index to send to the slice purchase application. */
     public static final String EXTRA_PHONE_ID = "com.android.phone.slice.extra.PHONE_ID";
@@ -235,12 +242,35 @@
      */
     public static final String EXTRA_INTENT_SUCCESS =
             "com.android.phone.slice.extra.INTENT_SUCCESS";
+    /**
+     * Extra for the PendingIntent that the slice purchase application can send to indicate
+     * that it displayed the network boost notification to the user.
+     * Sends {@link #ACTION_SLICE_PURCHASE_APP_RESPONSE_NOTIFICATION_SHOWN}.
+     */
+    public static final String EXTRA_INTENT_NOTIFICATION_SHOWN =
+            "com.android.phone.slice.extra.NOTIFICATION_SHOWN";
 
-    /** Component name to send an explicit broadcast to SlicePurchaseBroadcastReceiver. */
+    /** Component name for the SlicePurchaseBroadcastReceiver. */
     private static final ComponentName SLICE_PURCHASE_APP_COMPONENT_NAME =
             ComponentName.unflattenFromString(
                     "com.android.carrierdefaultapp/.SlicePurchaseBroadcastReceiver");
 
+    /** Shared preference name for network boost notification preferences. */
+    private static final String NETWORK_BOOST_NOTIFICATION_PREFERENCES =
+            "network_boost_notification_preferences";
+    /** Shared preference key for daily count of network boost notifications. */
+    private static final String KEY_DAILY_NOTIFICATION_COUNT = "daily_notification_count";
+    /** Shared preference key for monthly count of network boost notifications. */
+    private static final String KEY_MONTHLY_NOTIFICATION_COUNT = "monthly_notification_count";
+    /**
+     * Shared preference key for the date the daily or monthly counts of network boost notifications
+     * were last reset.
+     * A String with ISO-8601 format {@code YYYY-MM-DD}, from {@link LocalDate#toString}.
+     * For example, if the count was last updated on December 25, 2020, this would be `2020-12-25`.
+     */
+    private static final String KEY_NOTIFICATION_COUNT_LAST_RESET_DATE =
+            "notification_count_last_reset_date";
+
     /** Map of phone ID -> SlicePurchaseController instances. */
     @NonNull private static final Map<Integer, SlicePurchaseController> sInstances =
             new HashMap<>();
@@ -261,21 +291,37 @@
             mSlicePurchaseControllerBroadcastReceivers = new HashMap<>();
     /** The current network slicing configuration. */
     @Nullable private NetworkSlicingConfig mSlicingConfig;
-    /** Premium network entitlement query API */
+    /** Premium network entitlement query API. */
     @NonNull private final PremiumNetworkEntitlementApi mPremiumNetworkEntitlementApi;
+    /** LocalDate to use when resetting notification counts. {@code null} except when testing. */
+    @Nullable private LocalDate mLocalDate;
+    /** The number of times the network boost notification has been shown today. */
+    private int mDailyCount;
+    /** The number of times the network boost notification has been shown this month. */
+    private int mMonthlyCount;
 
     /**
      * BroadcastReceiver to receive responses from the slice purchase application.
      */
-    @VisibleForTesting
-    public class SlicePurchaseControllerBroadcastReceiver extends BroadcastReceiver {
+    private class SlicePurchaseControllerBroadcastReceiver extends BroadcastReceiver {
         @TelephonyManager.PremiumCapability private final int mCapability;
 
+        /**
+         * Create a SlicePurchaseControllerBroadcastReceiver for the given capability
+         *
+         * @param capability The requested capability to listen to response for.
+         */
         SlicePurchaseControllerBroadcastReceiver(
                 @TelephonyManager.PremiumCapability int capability) {
             mCapability = capability;
         }
 
+        /**
+         * Process responses from the slice purchase application.
+         *
+         * @param context The Context in which the receiver is running.
+         * @param intent The Intent being received.
+         */
         @Override
         public void onReceive(@NonNull Context context, @NonNull Intent intent) {
             String action = intent.getAction();
@@ -340,6 +386,10 @@
                             capability, duration);
                     break;
                 }
+                case ACTION_SLICE_PURCHASE_APP_RESPONSE_NOTIFICATION_SHOWN: {
+                    SlicePurchaseController.getInstance(phoneId).onNotificationShown();
+                    break;
+                }
                 default:
                     reportAnomaly(UUID_UNKNOWN_ACTION, "SlicePurchaseControllerBroadcastReceiver("
                             + TelephonyManager.convertPremiumCapabilityToString(mCapability)
@@ -381,6 +431,7 @@
 
     /**
      * Create a SlicePurchaseController for the given phone on the given looper.
+     *
      * @param phone The Phone to create the SlicePurchaseController for.
      * @param looper The Looper to run the SlicePurchaseController on.
      */
@@ -390,8 +441,19 @@
         mPhone = phone;
         // TODO: Create a cached value for slicing config in DataIndication and initialize here
         mPhone.mCi.registerForSlicingConfigChanged(this, EVENT_SLICING_CONFIG_CHANGED, null);
-        mPremiumNetworkEntitlementApi = new PremiumNetworkEntitlementApi(mPhone,
-                getCarrierConfigs());
+        mPremiumNetworkEntitlementApi =
+                new PremiumNetworkEntitlementApi(mPhone, getCarrierConfigs());
+        updateNotificationCounts();
+    }
+
+    /**
+     * Set the LocalDate to use for resetting daily and monthly notification counts.
+     *
+     * @param localDate The LocalDate instance to use.
+     */
+    @VisibleForTesting
+    public void setLocalDate(@NonNull LocalDate localDate) {
+        mLocalDate = localDate;
     }
 
     @Override
@@ -412,12 +474,12 @@
                 onSlicingConfigChanged();
                 break;
             }
-            case EVENT_DISPLAY_BOOSTER_NOTIFICATION: {
+            case EVENT_START_SLICE_PURCHASE_APP: {
                 int capability = msg.arg1;
                 String appName = (String) msg.obj;
-                logd("EVENT_DISPLAY_BOOSTER_NOTIFICATION: " + appName + " requests capability "
+                logd("EVENT_START_SLICE_PURCHASE_APP: " + appName + " requests capability "
                         + TelephonyManager.convertPremiumCapabilityToString(capability));
-                onDisplayBoosterNotification(capability, appName);
+                onStartSlicePurchaseApplication(capability, appName);
                 break;
             }
             case EVENT_PURCHASE_TIMEOUT: {
@@ -531,10 +593,10 @@
             return;
         }
 
-        // All state checks passed. Mark purchase pending and display the booster notification to
-        // prompt user purchase. Process through the handler since this method is synchronized.
+        // All state checks passed. Mark purchase pending and start the slice purchase application.
+        // Process through the handler since this method is synchronized.
         mPendingPurchaseCapabilities.put(capability, onComplete);
-        sendMessage(obtainMessage(EVENT_DISPLAY_BOOSTER_NOTIFICATION, capability, 0 /* unused */,
+        sendMessage(obtainMessage(EVENT_START_SLICE_PURCHASE_APP, capability, 0 /* unused */,
                 appName));
     }
 
@@ -594,7 +656,7 @@
         }
     }
 
-    private void onDisplayBoosterNotification(@TelephonyManager.PremiumCapability int capability,
+    private void onStartSlicePurchaseApplication(@TelephonyManager.PremiumCapability int capability,
             @NonNull String appName) {
         PremiumNetworkEntitlementResponse premiumNetworkEntitlementResponse =
                 mPremiumNetworkEntitlementApi.checkEntitlementStatus(capability);
@@ -627,6 +689,17 @@
             return;
         }
 
+        updateNotificationCounts();
+        if (mMonthlyCount >= getCarrierConfigs().getInt(
+                CarrierConfigManager.KEY_PREMIUM_CAPABILITY_MAXIMUM_MONTHLY_NOTIFICATION_COUNT_INT)
+                || mDailyCount >= getCarrierConfigs().getInt(
+                CarrierConfigManager.KEY_PREMIUM_CAPABILITY_MAXIMUM_DAILY_NOTIFICATION_COUNT_INT)) {
+            logd("Reached maximum number of network boost notifications.");
+            handlePurchaseResult(capability,
+                    TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED, false);
+            return;
+        }
+
         // Start timeout for purchase completion.
         long timeout = getCarrierConfigs().getLong(CarrierConfigManager
                 .KEY_PREMIUM_CAPABILITY_NOTIFICATION_DISPLAY_TIMEOUT_MILLIS_LONG);
@@ -653,6 +726,8 @@
                 false));
         intent.putExtra(EXTRA_INTENT_SUCCESS, createPendingIntent(
                 ACTION_SLICE_PURCHASE_APP_RESPONSE_SUCCESS, capability, true));
+        intent.putExtra(EXTRA_INTENT_NOTIFICATION_SHOWN, createPendingIntent(
+                ACTION_SLICE_PURCHASE_APP_RESPONSE_NOTIFICATION_SHOWN, capability, false));
         logd("Broadcasting start intent to SlicePurchaseBroadcastReceiver.");
         mPhone.getContext().sendBroadcast(intent);
 
@@ -665,6 +740,7 @@
         filter.addAction(ACTION_SLICE_PURCHASE_APP_RESPONSE_REQUEST_FAILED);
         filter.addAction(ACTION_SLICE_PURCHASE_APP_RESPONSE_NOT_DEFAULT_DATA_SUBSCRIPTION);
         filter.addAction(ACTION_SLICE_PURCHASE_APP_RESPONSE_SUCCESS);
+        filter.addAction(ACTION_SLICE_PURCHASE_APP_RESPONSE_NOTIFICATION_SHOWN);
         mPhone.getContext().registerReceiver(
                 mSlicePurchaseControllerBroadcastReceivers.get(capability), filter);
     }
@@ -742,6 +818,73 @@
         }
     }
 
+    private void onNotificationShown() {
+        SharedPreferences sp =
+                mPhone.getContext().getSharedPreferences(NETWORK_BOOST_NOTIFICATION_PREFERENCES, 0);
+        mDailyCount = sp.getInt((KEY_DAILY_NOTIFICATION_COUNT + mPhone.getPhoneId()), 0) + 1;
+        mMonthlyCount = sp.getInt((KEY_MONTHLY_NOTIFICATION_COUNT + mPhone.getPhoneId()), 0) + 1;
+        logd("Network boost notification was shown " + mDailyCount + " times today and "
+                + mMonthlyCount + " times this month.");
+
+        SharedPreferences.Editor editor = sp.edit();
+        editor.putInt((KEY_DAILY_NOTIFICATION_COUNT + mPhone.getPhoneId()), mDailyCount);
+        editor.putInt((KEY_MONTHLY_NOTIFICATION_COUNT + mPhone.getPhoneId()), mMonthlyCount);
+        editor.apply();
+
+        // Don't call updateNotificationCounts here because it will be called whenever a new
+        // purchase request comes in or when SlicePurchaseController is initialized.
+    }
+
+    /**
+     * Update the current daily and monthly network boost notification counts.
+     * If it has been at least a day since the last daily reset or at least a month since the last
+     * monthly reset, reset the current daily or monthly notification counts.
+     */
+    @VisibleForTesting
+    public void updateNotificationCounts() {
+        SharedPreferences sp =
+                mPhone.getContext().getSharedPreferences(NETWORK_BOOST_NOTIFICATION_PREFERENCES, 0);
+        mDailyCount = sp.getInt((KEY_DAILY_NOTIFICATION_COUNT + mPhone.getPhoneId()), 0);
+        mMonthlyCount = sp.getInt((KEY_MONTHLY_NOTIFICATION_COUNT + mPhone.getPhoneId()), 0);
+
+        if (mLocalDate == null) {
+            // Standardize to UTC to prevent default time zone dependency
+            mLocalDate = LocalDate.now(ZoneId.of("UTC"));
+        }
+        LocalDate lastLocalDate = LocalDate.of(1, 1, 1);
+        String lastLocalDateString = sp.getString(
+                (KEY_NOTIFICATION_COUNT_LAST_RESET_DATE + mPhone.getPhoneId()), "");
+        if (!TextUtils.isEmpty(lastLocalDateString)) {
+            try {
+                lastLocalDate = LocalDate.parse(lastLocalDateString);
+            } catch (DateTimeParseException e) {
+                loge("Error parsing LocalDate from SharedPreferences: " + e);
+            }
+        }
+        logd("updateNotificationCounts: mDailyCount=" + mDailyCount + ", mMonthlyCount="
+                + mMonthlyCount + ", mLocalDate=" + mLocalDate + ", lastLocalDate="
+                + lastLocalDate);
+
+        boolean resetMonthly = lastLocalDate.getYear() != mLocalDate.getYear()
+                || lastLocalDate.getMonthValue() != mLocalDate.getMonthValue();
+        boolean resetDaily = resetMonthly
+                || lastLocalDate.getDayOfMonth() != mLocalDate.getDayOfMonth();
+        if (resetDaily) {
+            logd("Resetting daily" + (resetMonthly ? " and monthly" : "") + " notification count.");
+            SharedPreferences.Editor editor = sp.edit();
+            if (resetMonthly) {
+                mMonthlyCount = 0;
+                editor.putInt((KEY_MONTHLY_NOTIFICATION_COUNT + mPhone.getPhoneId()),
+                        mMonthlyCount);
+            }
+            mDailyCount = 0;
+            editor.putInt((KEY_DAILY_NOTIFICATION_COUNT + mPhone.getPhoneId()), mDailyCount);
+            editor.putString((KEY_NOTIFICATION_COUNT_LAST_RESET_DATE + mPhone.getPhoneId()),
+                    mLocalDate.toString());
+            editor.apply();
+        }
+    }
+
     @Nullable private PersistableBundle getCarrierConfigs() {
         return mPhone.getContext().getSystemService(CarrierConfigManager.class)
                 .getConfigForSubId(mPhone.getSubId());
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 10f1f86..d92b136 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -64,6 +64,7 @@
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.SubscriptionController;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
 import com.android.phone.PhoneGlobals;
 import com.android.phone.PhoneUtils;
 import com.android.phone.R;
@@ -547,18 +548,37 @@
                 return false;
             }
 
-            SubscriptionController controller = SubscriptionController.getInstance();
-            if (controller == null) {
-                Log.d(this, "isEmergencyPreferredAccount: SubscriptionController not available.");
-                return false;
-            }
-            // Only set an emergency preference on devices with multiple active subscriptions
-            // (include opportunistic subscriptions) in this check.
-            // API says never null, but this can return null in testing.
-            int[] activeSubIds = controller.getActiveSubIdList(false);
-            if (activeSubIds == null || activeSubIds.length <= 1) {
-                Log.d(this, "isEmergencyPreferredAccount: one or less active subscriptions.");
-                return false;
+            if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+                if (SubscriptionManagerService.getInstance() == null) {
+                    Log.d(this,
+                            "isEmergencyPreferredAccount: SubscriptionManagerService not "
+                                    + "available.");
+                    return false;
+                }
+                // Only set an emergency preference on devices with multiple active subscriptions
+                // (include opportunistic subscriptions) in this check.
+                // API says never null, but this can return null in testing.
+                int[] activeSubIds = SubscriptionManagerService.getInstance()
+                        .getActiveSubIdList(false);
+                if (activeSubIds == null || activeSubIds.length <= 1) {
+                    Log.d(this, "isEmergencyPreferredAccount: one or less active subscriptions.");
+                    return false;
+                }
+            } else {
+                SubscriptionController controller = SubscriptionController.getInstance();
+                if (controller == null) {
+                    Log.d(this,
+                            "isEmergencyPreferredAccount: SubscriptionController not available.");
+                    return false;
+                }
+                // Only set an emergency preference on devices with multiple active subscriptions
+                // (include opportunistic subscriptions) in this check.
+                // API says never null, but this can return null in testing.
+                int[] activeSubIds = controller.getActiveSubIdList(false);
+                if (activeSubIds == null || activeSubIds.length <= 1) {
+                    Log.d(this, "isEmergencyPreferredAccount: one or less active subscriptions.");
+                    return false;
+                }
             }
             // Check to see if this PhoneAccount is associated with the default Data subscription.
             if (!SubscriptionManager.isValidSubscriptionId(subId)) {
@@ -566,10 +586,21 @@
                         + "valid.");
                 return false;
             }
-            int userDefaultData = controller.getDefaultDataSubId();
+            int userDefaultData = SubscriptionManager.getDefaultDataSubscriptionId();
             boolean isActiveDataValid = SubscriptionManager.isValidSubscriptionId(activeDataSubId);
-            boolean isActiveDataOpportunistic = isActiveDataValid
-                    && controller.isOpportunistic(activeDataSubId);
+
+            boolean isActiveDataOpportunistic;
+            if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+                SubscriptionInfo subInfo;
+                subInfo = SubscriptionManagerService.getInstance()
+                        .getSubscriptionInfo(activeDataSubId);
+                isActiveDataOpportunistic = isActiveDataValid && subInfo != null
+                        && subInfo.isOpportunistic();
+            } else {
+                isActiveDataOpportunistic = isActiveDataValid
+                        && SubscriptionController.getInstance().isOpportunistic(activeDataSubId);
+            }
+
             // compare the activeDataSubId to the subId specified only if it is valid and not an
             // opportunistic subscription (only supports data). If not, use the current default
             // defined by the user.
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 962053c..fd3fd5b 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -53,6 +53,7 @@
 import android.telephony.ims.ImsStreamMediaProfile;
 import android.telephony.ims.RtpHeaderExtension;
 import android.telephony.ims.RtpHeaderExtensionType;
+import android.telephony.ims.feature.MmTelFeature;
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.util.Pair;
@@ -801,6 +802,13 @@
             Log.i(this, "onReceivedDtmfDigit: digit=%c", digit);
             mDtmfTransport.onDtmfReceived(digit);
         }
+
+        @Override
+        public void onAudioModeIsVoipChanged(int imsAudioHandler) {
+            boolean isVoip = imsAudioHandler == MmTelFeature.AUDIO_HANDLER_ANDROID;
+            Log.i(this, "onAudioModeIsVoipChanged isVoip =" + isVoip);
+            setAudioModeIsVoip(isVoip);
+        }
     };
 
     private TelephonyConnectionService mTelephonyConnectionService;
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index ef77483..e86a1ae 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -67,6 +67,8 @@
 import com.android.internal.telephony.imsphone.ImsExternalCallTracker;
 import com.android.internal.telephony.imsphone.ImsPhone;
 import com.android.internal.telephony.imsphone.ImsPhoneConnection;
+import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
 import com.android.phone.FrameworksUtils;
 import com.android.phone.MMIDialogActivity;
 import com.android.phone.PhoneUtils;
@@ -231,7 +233,7 @@
 
         @Override
         public int getSimStateForSlotIdx(int slotId) {
-            return SubscriptionManager.getSimStateForSlotIndex(slotId);
+            return TelephonyManager.getSimStateForSlotIndex(slotId);
         }
 
         @Override
@@ -842,6 +844,19 @@
                         return (phone.getState() == PhoneConstants.State.OFFHOOK)
                             || phone.getServiceStateTracker().isRadioOn();
                     } else {
+                        if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+                            SubscriptionInfoInternal subInfo = SubscriptionManagerService
+                                    .getInstance().getSubscriptionInfoInternal(phone.getSubId());
+                            // Wait until we are in service and ready to make calls. This can happen
+                            // when we power down the radio on bluetooth to save power on watches or
+                            // if it is a test emergency number and we have to wait for the device
+                            // to move IN_SERVICE before the call can take place over normal
+                            // routing.
+                            return (phone.getState() == PhoneConstants.State.OFFHOOK)
+                                    // Do not wait for voice in service on opportunistic SIMs.
+                                    || (subInfo != null && subInfo.isOpportunistic())
+                                    || serviceState == ServiceState.STATE_IN_SERVICE;
+                        }
                         // Wait until we are in service and ready to make calls. This can happen
                         // when we power down the radio on bluetooth to save power on watches or if
                         // it is a test emergency number and we have to wait for the device to move
@@ -1002,9 +1017,16 @@
             // Notify Telecom of the new Connection type.
             // TODO: Switch out the underlying connection instead of creating a new
             // one and causing UI Jank.
-            boolean noActiveSimCard = SubscriptionController.getInstance()
-                    .getActiveSubInfoCount(phone.getContext().getOpPackageName(),
-                            phone.getContext().getAttributionTag()) == 0;
+            boolean noActiveSimCard;
+            if (PhoneFactory.isSubscriptionManagerServiceEnabled()) {
+                noActiveSimCard = SubscriptionManagerService.getInstance()
+                        .getActiveSubInfoCount(phone.getContext().getOpPackageName(),
+                                phone.getContext().getAttributionTag()) == 0;
+            } else {
+                noActiveSimCard = SubscriptionController.getInstance()
+                        .getActiveSubInfoCount(phone.getContext().getOpPackageName(),
+                                phone.getContext().getAttributionTag()) == 0;
+            }
             // If there's no active sim card and the device is in emergency mode, use E account.
             addExistingConnection(mPhoneUtilsProxy.makePstnPhoneAccountHandleWithPrefix(
                     phone, "", isEmergencyNumber && noActiveSimCard), repConnection);
@@ -1747,9 +1769,8 @@
         final com.android.internal.telephony.Connection originalConnection;
         try {
             if (phone != null) {
-                EmergencyNumber emergencyNumber =
-                        phone.getEmergencyNumberTracker().getEmergencyNumber(number);
-                if (emergencyNumber != null) {
+                boolean isEmergency = mTelephonyManagerProxy.isCurrentEmergencyNumber(number);
+                if (isEmergency) {
                     if (!getAllConnections().isEmpty()) {
                         if (!shouldHoldForEmergencyCall(phone)) {
                             // If we do not support holding ongoing calls for an outgoing
diff --git a/src/com/android/services/telephony/rcs/RcsFeatureController.java b/src/com/android/services/telephony/rcs/RcsFeatureController.java
index 48c84b1..b292c35 100644
--- a/src/com/android/services/telephony/rcs/RcsFeatureController.java
+++ b/src/com/android/services/telephony/rcs/RcsFeatureController.java
@@ -17,11 +17,13 @@
 package com.android.services.telephony.rcs;
 
 import android.annotation.AnyThread;
+import android.annotation.NonNull;
 import android.content.Context;
 import android.net.Uri;
 import android.telephony.SubscriptionManager;
 import android.telephony.ims.ImsException;
 import android.telephony.ims.ImsReasonInfo;
+import android.telephony.ims.ImsRegistrationAttributes;
 import android.telephony.ims.aidl.IImsCapabilityCallback;
 import android.telephony.ims.aidl.IImsRegistrationCallback;
 import android.telephony.ims.stub.ImsRegistrationImplBase;
@@ -166,7 +168,7 @@
     private ImsRegistrationCallbackHelper.ImsRegistrationUpdate mRcsRegistrationUpdate = new
             ImsRegistrationCallbackHelper.ImsRegistrationUpdate() {
                 @Override
-                public void handleImsRegistered(int imsRadioTech) {
+                public void handleImsRegistered(@NonNull ImsRegistrationAttributes attributes) {
                 }
 
                 @Override
@@ -174,7 +176,8 @@
                 }
 
                 @Override
-                public void handleImsUnregistered(ImsReasonInfo imsReasonInfo) {
+                public void handleImsUnregistered(ImsReasonInfo imsReasonInfo,
+                        int suggestedAction) {
                 }
 
                 @Override
diff --git a/testapps/TestRcsApp/OWNERS b/testapps/TestRcsApp/OWNERS
index 1d0d52b..4261109 100644
--- a/testapps/TestRcsApp/OWNERS
+++ b/testapps/TestRcsApp/OWNERS
@@ -1,3 +1,5 @@
-allenwtsu@google.com
-calvinpan@google.com
-jamescflin@google.com
+breadley@google.com
+joonhunshin@google.com
+donaldahn@google.com
+hhshin@google.com
+schie@google.com
diff --git a/testapps/TestServerApp/.gitignore b/testapps/TestServerApp/.gitignore
deleted file mode 100644
index aa724b7..0000000
--- a/testapps/TestServerApp/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-*.iml
-.gradle
-/local.properties
-/.idea/caches
-/.idea/libraries
-/.idea/modules.xml
-/.idea/workspace.xml
-/.idea/navEditor.xml
-/.idea/assetWizardSettings.xml
-.DS_Store
-/build
-/captures
-.externalNativeBuild
-.cxx
-local.properties
diff --git a/testapps/TestServerApp/.idea/.gitignore b/testapps/TestServerApp/.idea/.gitignore
deleted file mode 100644
index 26d3352..0000000
--- a/testapps/TestServerApp/.idea/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
diff --git a/testapps/TestServerApp/.idea/compiler.xml b/testapps/TestServerApp/.idea/compiler.xml
deleted file mode 100644
index fb7f4a8..0000000
--- a/testapps/TestServerApp/.idea/compiler.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="CompilerConfiguration">
-    <bytecodeTargetLevel target="11" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/testapps/TestServerApp/.idea/gradle.xml b/testapps/TestServerApp/.idea/gradle.xml
deleted file mode 100644
index a2d7c21..0000000
--- a/testapps/TestServerApp/.idea/gradle.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="GradleMigrationSettings" migrationVersion="1" />
-  <component name="GradleSettings">
-    <option name="linkedExternalProjectsSettings">
-      <GradleProjectSettings>
-        <option name="testRunner" value="GRADLE" />
-        <option name="distributionType" value="DEFAULT_WRAPPED" />
-        <option name="externalProjectPath" value="$PROJECT_DIR$" />
-        <option name="modules">
-          <set>
-            <option value="$PROJECT_DIR$" />
-            <option value="$PROJECT_DIR$/app" />
-          </set>
-        </option>
-      </GradleProjectSettings>
-    </option>
-  </component>
-</project>
\ No newline at end of file
diff --git a/testapps/TestServerApp/.idea/misc.xml b/testapps/TestServerApp/.idea/misc.xml
deleted file mode 100644
index 7c85865..0000000
--- a/testapps/TestServerApp/.idea/misc.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ExternalStorageConfigurationManager" enabled="true" />
-  <component name="NullableNotNullManager">
-    <option name="myDefaultNullable" value="androidx.annotation.Nullable" />
-    <option name="myDefaultNotNull" value="androidx.annotation.NonNull" />
-    <option name="myNullables">
-      <value>
-        <list size="15">
-          <item index="0" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
-          <item index="1" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
-          <item index="2" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
-          <item index="3" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
-          <item index="4" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
-          <item index="5" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
-          <item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
-          <item index="7" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
-          <item index="8" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
-          <item index="9" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
-          <item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
-          <item index="11" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
-          <item index="12" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
-          <item index="13" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
-          <item index="14" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
-        </list>
-      </value>
-    </option>
-    <option name="myNotNulls">
-      <value>
-        <list size="14">
-          <item index="0" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
-          <item index="1" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
-          <item index="2" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
-          <item index="3" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
-          <item index="4" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
-          <item index="5" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
-          <item index="6" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
-          <item index="7" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
-          <item index="8" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
-          <item index="9" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
-          <item index="10" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
-          <item index="11" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
-          <item index="12" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
-          <item index="13" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
-        </list>
-      </value>
-    </option>
-  </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="JDK" project-jdk-type="JavaSDK">
-    <output url="file://$PROJECT_DIR$/build/classes" />
-  </component>
-  <component name="ProjectType">
-    <option name="id" value="Android" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/testapps/TestServerApp/.idea/vcs.xml b/testapps/TestServerApp/.idea/vcs.xml
deleted file mode 100644
index 47fe944..0000000
--- a/testapps/TestServerApp/.idea/vcs.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="IssueNavigationConfiguration">
-    <option name="links">
-      <list>
-        <IssueNavigationLink>
-          <option name="issueRegexp" value="\bb/(\d+)(#\w+)?\b" />
-          <option name="linkRegexp" value="https://buganizer.corp.google.com/issues/$1$2" />
-        </IssueNavigationLink>
-        <IssueNavigationLink>
-          <option name="issueRegexp" value="\b(?:BUG=|FIXED=)(\d+)\b" />
-          <option name="linkRegexp" value="https://buganizer.corp.google.com/issues/$1" />
-        </IssueNavigationLink>
-        <IssueNavigationLink>
-          <option name="issueRegexp" value="\b(?:cl/|cr/|OCL=|DIFFBASE=|ROLLBACK_OF=)(\d+)\b" />
-          <option name="linkRegexp" value="https://critique.corp.google.com/$1" />
-        </IssueNavigationLink>
-        <IssueNavigationLink>
-          <option name="issueRegexp" value="\bomg/(\d+)\b" />
-          <option name="linkRegexp" value="https://omg.corp.google.com/$1" />
-        </IssueNavigationLink>
-        <IssueNavigationLink>
-          <option name="issueRegexp" value="\b(?:go/|goto/)([^,.&lt;&gt;()&quot;\s]+(?:[.,][^,.&lt;&gt;()&quot;\s]+)*)" />
-          <option name="linkRegexp" value="https://goto.google.com/$1" />
-        </IssueNavigationLink>
-        <IssueNavigationLink>
-          <option name="issueRegexp" value="\bcs/([^\s]+[\w$])" />
-          <option name="linkRegexp" value="https://cs.corp.google.com/search/?q=$1" />
-        </IssueNavigationLink>
-        <IssueNavigationLink>
-          <option name="issueRegexp" value="(LINT\.IfChange)|(LINT\.ThenChange)" />
-          <option name="linkRegexp" value="https://goto.google.com/ifthisthenthatlint" />
-        </IssueNavigationLink>
-      </list>
-    </option>
-  </component>
-</project>
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/.gitignore b/testapps/TestServerApp/app/.gitignore
deleted file mode 100644
index 42afabf..0000000
--- a/testapps/TestServerApp/app/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/build.gradle b/testapps/TestServerApp/app/build.gradle
deleted file mode 100644
index 64a8ed9..0000000
--- a/testapps/TestServerApp/app/build.gradle
+++ /dev/null
@@ -1,40 +0,0 @@
-plugins {
-    id 'com.android.application'
-}
-
-android {
-    compileSdkPreview "android-Tiramisu"
-
-    defaultConfig {
-        applicationId "com.google.android.testserverapp"
-        minSdkPreview "Tiramisu"
-        targetSdkPreview "Tiramisu"
-        versionCode 1
-        versionName "1.0"
-
-        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
-    }
-
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
-        }
-    }
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_8
-        targetCompatibility JavaVersion.VERSION_1_8
-    }
-}
-
-dependencies {
-
-    implementation 'androidx.appcompat:appcompat:1.4.1'
-    implementation 'com.google.android.material:material:1.5.0'
-    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
-    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
-    testImplementation 'junit:junit:4.+'
-    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
-    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
-    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
-}
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/proguard-rules.pro b/testapps/TestServerApp/app/proguard-rules.pro
deleted file mode 100644
index 481bb43..0000000
--- a/testapps/TestServerApp/app/proguard-rules.pro
+++ /dev/null
@@ -1,21 +0,0 @@
-# Add project specific ProGuard rules here.
-# You can control the set of applied configuration files using the
-# proguardFiles setting in build.gradle.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
-
-# Uncomment this to preserve the line number information for
-# debugging stack traces.
-#-keepattributes SourceFile,LineNumberTable
-
-# If you keep the line number information, uncomment this to
-# hide the original source file name.
-#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/androidTest/java/com/google/android/testserverapp/ExampleInstrumentedTest.java b/testapps/TestServerApp/app/src/androidTest/java/com/google/android/testserverapp/ExampleInstrumentedTest.java
deleted file mode 100644
index 555bec9..0000000
--- a/testapps/TestServerApp/app/src/androidTest/java/com/google/android/testserverapp/ExampleInstrumentedTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.google.android.testserverapp;
-
-import android.content.Context;
-import androidx.test.platform.app.InstrumentationRegistry;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.*;
-
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
- */
-@RunWith(AndroidJUnit4.class)
-public class ExampleInstrumentedTest {
-
-  @Test
-  public void useAppContext() {
-    // Context of the app under test.
-    Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
-    assertEquals("com.google.android.testserverapp", appContext.getPackageName());
-  }
-}
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/main/Android.bp b/testapps/TestServerApp/app/src/main/Android.bp
deleted file mode 100644
index 1605962..0000000
--- a/testapps/TestServerApp/app/src/main/Android.bp
+++ /dev/null
@@ -1,30 +0,0 @@
-package {
-    // See: http://go/android-license-faq
-    default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-java_import {
-    name: "sun-http-server",
-    jars: ["libs/http-2.2.1.jar", "libs/sun-common-server.jar"],
-}
-
-android_app {
-    name: "TestServerApp",
-    srcs: [
-        "java/com/google/android/testserverapp/*.java",
-    ],
-    static_libs: [
-        "androidx-constraintlayout_constraintlayout",
-        "androidx.appcompat_appcompat",
-        "sun-http-server",
-    ],
-    libs: ["org.apache.http.legacy"],
-    certificate: "platform",
-    privileged: true,
-    product_specific: true,
-    sdk_version: "system_current",
-    min_sdk_version: "30",
-    optimize: {
-        proguard_flags_files: ["proguard.flags"],
-    },
-}
diff --git a/testapps/TestServerApp/app/src/main/AndroidManifest.xml b/testapps/TestServerApp/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 3c91a82..0000000
--- a/testapps/TestServerApp/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.google.android.testserverapp">
-
-  <uses-permission android:name="android.permission.INTERNET"/>
-
-  <application
-      android:allowBackup="true"
-      android:dataExtractionRules="@xml/data_extraction_rules"
-      android:fullBackupContent="@xml/backup_rules"
-      android:icon="@mipmap/ic_launcher"
-      android:label="@string/app_name"
-      android:roundIcon="@mipmap/ic_launcher_round"
-      android:supportsRtl="true"
-      android:theme="@style/Theme.AppCompat"
-      android:versionCode="34">
-    <activity
-        android:name=".MainActivity"
-        android:exported="true">
-      <intent-filter>
-        <action android:name="android.intent.action.MAIN" />
-
-        <category android:name="android.intent.category.LAUNCHER" />
-      </intent-filter>
-
-      <meta-data
-          android:name="android.app.lib_name"
-          android:value="" />
-    </activity>
-  </application>
-
-</manifest>
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/main/java/com/google/android/testserverapp/MainActivity.java b/testapps/TestServerApp/app/src/main/java/com/google/android/testserverapp/MainActivity.java
deleted file mode 100644
index b0d49ef..0000000
--- a/testapps/TestServerApp/app/src/main/java/com/google/android/testserverapp/MainActivity.java
+++ /dev/null
@@ -1,245 +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.google.android.testserverapp;
-
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemSelectedListener;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.TextView;
-import androidx.appcompat.app.AppCompatActivity;
-import com.sun.net.httpserver.Headers;
-import com.sun.net.httpserver.HttpExchange;
-import com.sun.net.httpserver.HttpHandler;
-import com.sun.net.httpserver.HttpServer;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.concurrent.Executors;
-
-public class MainActivity extends AppCompatActivity {
-  private static final String TAG = "TestServerApp";
-  private static final int SERVER_PORT = 5555;
-
-  private HttpServer mHttpServer = null;
-  private boolean mIsServerUp = false;
-  private int mEntitlementStatus = 1;
-  private int mProvisionStatus = 1;
-  private int mResponseCount = 0;
-
-  private Button mServerButton;
-  private TextView mServerStatusTextView, mClientRequestTextView;
-  private AdapterView mEntitlementStatusSpinner, mProvisionStatusSpinner;
-
-  private HttpHandler mHttpHandler = new HttpHandler() {
-    @Override
-    public void handle(HttpExchange httpExchange) throws IOException {
-      String method = httpExchange.getRequestMethod();
-      switch (method) {
-        case "GET":
-        case "POST":
-          updateClientRequestTextView("Client Request: received a request from client");
-          Log.d(TAG, "Client Request: received a request from client, requestHeaders = "
-              + httpHeadersToString(httpExchange.getRequestHeaders()));
-
-          sendResponseToClient(httpExchange, getTS43Response(), 200);
-          break;
-        default:
-          Log.d(TAG, "Request method = " + method);
-      }
-    }
-  };
-
-  @Override
-  protected void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    setContentView(R.layout.activity_main);
-
-    mServerStatusTextView = findViewById(R.id.serverStatusTextView);
-    mClientRequestTextView = findViewById(R.id.clientRequestTextView);
-    mServerButton = findViewById(R.id.serverButton);
-    mServerButton.setOnClickListener(new OnClickListener() {
-      @Override
-      public void onClick(View view) {
-        if (mIsServerUp) {
-          stopServer();
-          mIsServerUp = false;
-        } else {
-          startServer(SERVER_PORT);
-          mIsServerUp = true;
-        }
-      }
-    });
-
-    mEntitlementStatusSpinner = findViewById(R.id.entitlementStatusSpinner);
-    ArrayAdapter<CharSequence> entitlementArrayAdapter = ArrayAdapter.createFromResource(this,
-        R.array.entitlement_status, android.R.layout.simple_spinner_item);
-    entitlementArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
-    mEntitlementStatusSpinner.setAdapter(entitlementArrayAdapter);
-    mEntitlementStatusSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
-      @Override
-      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-        updateEntitlementStatus(parent.getItemAtPosition(position).toString());
-      }
-
-      @Override
-      public void onNothingSelected(AdapterView<?> parent) {}
-    });
-
-    mProvisionStatusSpinner = findViewById(R.id.provisionStatusSpinner);
-    ArrayAdapter<CharSequence> provisionArrayAdapter = ArrayAdapter.createFromResource(this,
-        R.array.provision_status, android.R.layout.simple_spinner_item);
-    entitlementArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
-    mProvisionStatusSpinner.setAdapter(provisionArrayAdapter);
-    mProvisionStatusSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
-      @Override
-      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-        updateProvisionStatus(parent.getItemAtPosition(position).toString());
-      }
-
-      @Override
-      public void onNothingSelected(AdapterView<?> parent) {}
-    });
-  }
-
-  private void startServer(int port) {
-    try {
-      mHttpServer = HttpServer.create(new InetSocketAddress(port), 0);
-      mHttpServer.setExecutor(Executors.newCachedThreadPool());
-
-      mHttpServer.createContext("/", mHttpHandler);
-      mHttpServer.createContext("/index", mHttpHandler);
-
-      mHttpServer.start();
-
-      mServerStatusTextView.setText(R.string.server_running);
-      mServerButton.setText(R.string.stop_server);
-    } catch (IOException e) {
-      Log.d(TAG, "Exception in startServer, e = " + e);
-    }
-  }
-
-  private void stopServer() {
-    if (mHttpServer != null) {
-      mHttpServer.stop(0);
-
-      mServerStatusTextView.setText(R.string.server_down);
-      mServerButton.setText(R.string.start_server);
-    }
-  }
-
-  private void sendResponseToClient(HttpExchange httpExchange, String message, int responseCode) {
-    try {
-      httpExchange.sendResponseHeaders(responseCode, message.length());
-      OutputStream os = httpExchange.getResponseBody();
-      os.write(message.getBytes());
-      os.close();
-
-      Log.d(TAG, "Sent a response to client, message = " + message);
-      updateClientRequestTextView("Client Request: Sent " + ++mResponseCount
-          + " responses to the clients");
-    } catch (IOException e) {
-      Log.d(TAG, "Exception in sendResponseToClient, e = " + e);
-      updateClientRequestTextView("Client Request: Exception in sendResponseToClient!!!");
-    }
-  }
-
-  private String httpHeadersToString(Headers headers) {
-    StringBuilder sb = new StringBuilder();
-    for (Entry<String, List<String>> entry : headers.entrySet()) {
-      sb.append("{" + entry.getKey() + ":");
-      for (String str : entry.getValue()) {
-        sb.append(str + ",");
-      }
-      sb.append("}");
-    }
-    return sb.toString();
-  }
-
-  private String getTS43Response() {
-    return "{"
-        + "  \"Vers\":{"
-        + "    \"version\": \"1\","
-        + "    \"validity\": \"1728000\""
-        + "  },"
-        + "  \"Token\":{"
-        + "    \"token\": \"kZYfCEpSsMr88KZVmab5UsZVzl+nWSsX\""
-        + "  },"
-        + "  \"ap2012\":{"
-        + "    \"EntitlementStatus\": " + mEntitlementStatus + ","
-        + "    \"ServiceFlow_URL\": \"file:///android_asset/slice_purchase_test.html\","
-        + "    \"ServiceFlow_UserData\": \"PostData=U6%2FbQ%2BEP&amp;amp;l=en_US\","
-        + "    \"ProvStatus\": "+ mProvisionStatus + ","
-        + "    \"ProvTimeLeft\": 0"
-        + "  },"
-        + "  \"eap-relay-packet\":\"EapAkaChallengeRequest\""
-        + "}";
-  }
-
-  private void updateClientRequestTextView(String status) {
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        mClientRequestTextView.setText(status);
-      }
-    });
-  }
-
-  private void updateEntitlementStatus(String status) {
-    switch (status) {
-      case "Disabled":
-        mEntitlementStatus = 0;
-        break;
-      case "Enabled":
-        mEntitlementStatus = 1;
-        break;
-      case "Incompatible":
-        mEntitlementStatus = 2;
-        break;
-      case "Provisioning":
-        mEntitlementStatus = 3;
-        break;
-      case "Included":
-        mEntitlementStatus = 4;
-        break;
-    }
-    mClientRequestTextView.setText("Entitlement Status is set to  \"" + status + "\"");
-  }
-
-  private void updateProvisionStatus(String status) {
-    switch (status) {
-      case "Not Provisioned":
-        mProvisionStatus = 0;
-        break;
-      case "Provisioned":
-        mProvisionStatus = 1;
-        break;
-      case "Not Required":
-        mProvisionStatus = 2;
-        break;
-      case "In Progress":
-        mProvisionStatus = 3;
-        break;
-    }
-    mClientRequestTextView.setText("Provision Status is set to \"" + status + "\"");
-  }
-}
diff --git a/testapps/TestServerApp/app/src/main/libs/LICENSE b/testapps/TestServerApp/app/src/main/libs/LICENSE
deleted file mode 100644
index 3d33284..0000000
--- a/testapps/TestServerApp/app/src/main/libs/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   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.
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/main/libs/http-2.2.1.jar b/testapps/TestServerApp/app/src/main/libs/http-2.2.1.jar
deleted file mode 100644
index 6e2b44e..0000000
--- a/testapps/TestServerApp/app/src/main/libs/http-2.2.1.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/libs/sun-common-server.jar b/testapps/TestServerApp/app/src/main/libs/sun-common-server.jar
deleted file mode 100644
index ca7127f..0000000
--- a/testapps/TestServerApp/app/src/main/libs/sun-common-server.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/proguard.flags b/testapps/TestServerApp/app/src/main/proguard.flags
deleted file mode 100644
index 4eefde6..0000000
--- a/testapps/TestServerApp/app/src/main/proguard.flags
+++ /dev/null
@@ -1,4 +0,0 @@
--dontobfuscate
--dontoptimize
-
--keep class com.google.android.testserverapp.*
diff --git a/testapps/TestServerApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/testapps/TestServerApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
deleted file mode 100644
index 966abaf..0000000
--- a/testapps/TestServerApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt"
-    android:width="108dp"
-    android:height="108dp"
-    android:viewportHeight="108"
-    android:viewportWidth="108">
-  <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
-    <aapt:attr name="android:fillColor">
-      <gradient
-          android:endX="85.84757"
-          android:endY="92.4963"
-          android:startX="42.9492"
-          android:startY="49.59793"
-          android:type="linear">
-        <item
-            android:color="#44000000"
-            android:offset="0.0" />
-        <item
-            android:color="#00000000"
-            android:offset="1.0" />
-      </gradient>
-    </aapt:attr>
-  </path>
-  <path
-      android:fillColor="#FFFFFF"
-      android:fillType="nonZero"
-      android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
-      android:strokeColor="#00000000"
-      android:strokeWidth="1" />
-</vector>
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/main/res/drawable/ic_launcher_background.xml b/testapps/TestServerApp/app/src/main/res/drawable/ic_launcher_background.xml
deleted file mode 100644
index 61bb79e..0000000
--- a/testapps/TestServerApp/app/src/main/res/drawable/ic_launcher_background.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="108dp"
-    android:height="108dp"
-    android:viewportHeight="108"
-    android:viewportWidth="108">
-  <path
-      android:fillColor="#3DDC84"
-      android:pathData="M0,0h108v108h-108z" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M9,0L9,108"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M19,0L19,108"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M29,0L29,108"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M39,0L39,108"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M49,0L49,108"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M59,0L59,108"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M69,0L69,108"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M79,0L79,108"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M89,0L89,108"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M99,0L99,108"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M0,9L108,9"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M0,19L108,19"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M0,29L108,29"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M0,39L108,39"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M0,49L108,49"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M0,59L108,59"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M0,69L108,69"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M0,79L108,79"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M0,89L108,89"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M0,99L108,99"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M19,29L89,29"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M19,39L89,39"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M19,49L89,49"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M19,59L89,59"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M19,69L89,69"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M19,79L89,79"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M29,19L29,89"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M39,19L39,89"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M49,19L49,89"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M59,19L59,89"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M69,19L69,89"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-  <path
-      android:fillColor="#00000000"
-      android:pathData="M79,19L79,89"
-      android:strokeColor="#33FFFFFF"
-      android:strokeWidth="0.8" />
-</vector>
diff --git a/testapps/TestServerApp/app/src/main/res/layout/activity_main.xml b/testapps/TestServerApp/app/src/main/res/layout/activity_main.xml
deleted file mode 100644
index a4ca45a..0000000
--- a/testapps/TestServerApp/app/src/main/res/layout/activity_main.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-
-    android:layout_height="match_parent"
-    tools:context=".MainActivity">
-
-  <Button
-      android:id="@+id/serverButton"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:gravity="center|center_horizontal"
-      android:text="@string/start_server"
-      tools:layout_editor_absoluteX="124dp"
-      tools:layout_editor_absoluteY="55dp" />
-  <TextView
-      android:id="@+id/serverStatusTextView"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:layout_marginTop="10dp"
-      android:gravity="center"
-      android:text="@string/server_down"
-      android:textColor="#4CAF50"
-      android:textSize="20sp"
-      app:layout_constraintTop_toBottomOf="@id/serverButton"
-      tools:layout_editor_absoluteX="0dp" />
-  <TextView
-      android:id="@+id/entitlementStatus"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:layout_marginTop="20dp"
-      android:gravity="left"
-      android:text="Entitlement Status:"
-      android:textColor="#4CAF50"
-      android:textSize="20sp"
-      app:layout_constraintTop_toBottomOf="@id/serverStatusTextView"
-      tools:layout_editor_absoluteX="0dp" />
-  <Spinner
-      android:id="@+id/entitlementStatusSpinner"
-      android:layout_width="232dp"
-      android:layout_height="wrap_content"
-      android:layout_marginTop="15dp"
-      android:gravity="left"
-      android:textColor="#4CAF50"
-      android:textSize="20sp"
-      app:layout_constraintTop_toBottomOf="@id/entitlementStatus"
-      tools:layout_editor_absoluteX="-195dp" />
-  <TextView
-      android:id="@+id/provisionStatus"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:layout_marginTop="20dp"
-      android:gravity="left"
-      android:text="Provision Status:"
-      android:textColor="#4CAF50"
-      android:textSize="20sp"
-      app:layout_constraintTop_toBottomOf="@id/entitlementStatusSpinner"
-      tools:layout_editor_absoluteX="0dp" />
-  <Spinner
-      android:id="@+id/provisionStatusSpinner"
-      android:layout_width="233dp"
-      android:layout_height="wrap_content"
-      android:layout_marginTop="15dp"
-      android:gravity="center"
-      android:textColor="#4CAF50"
-      android:textSize="20sp"
-      app:layout_constraintTop_toBottomOf="@id/provisionStatus"
-      tools:layout_editor_absoluteX="-195dp" />
-  <TextView
-      android:id="@+id/clientRequestTextView"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:layout_marginTop="20dp"
-      android:gravity="center"
-      android:text="Client Request:"
-      android:textColor="#4CAF50"
-      android:textSize="20sp"
-      app:layout_constraintTop_toBottomOf="@id/provisionStatusSpinner"
-      tools:layout_editor_absoluteX="0dp" />
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/testapps/TestServerApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
deleted file mode 100644
index 03eed25..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
-  <background android:drawable="@drawable/ic_launcher_background" />
-  <foreground android:drawable="@drawable/ic_launcher_foreground" />
-</adaptive-icon>
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/testapps/TestServerApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
deleted file mode 100644
index 03eed25..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
-  <background android:drawable="@drawable/ic_launcher_background" />
-  <foreground android:drawable="@drawable/ic_launcher_foreground" />
-</adaptive-icon>
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/testapps/TestServerApp/app/src/main/res/mipmap-hdpi/ic_launcher.webp
deleted file mode 100644
index c209e78..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-hdpi/ic_launcher.webp
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/testapps/TestServerApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
deleted file mode 100644
index b2dfe3d..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/testapps/TestServerApp/app/src/main/res/mipmap-mdpi/ic_launcher.webp
deleted file mode 100644
index 4f0f1d6..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-mdpi/ic_launcher.webp
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/testapps/TestServerApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
deleted file mode 100644
index 62b611d..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/testapps/TestServerApp/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
deleted file mode 100644
index 948a307..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/testapps/TestServerApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
deleted file mode 100644
index 1b9a695..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/testapps/TestServerApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
deleted file mode 100644
index 28d4b77..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/testapps/TestServerApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
deleted file mode 100644
index 9287f50..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/testapps/TestServerApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
deleted file mode 100644
index aa7d642..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/testapps/TestServerApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
deleted file mode 100644
index 9126ae3..0000000
--- a/testapps/TestServerApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/app/src/main/res/values-af/strings.xml b/testapps/TestServerApp/app/src/main/res/values-af/strings.xml
deleted file mode 100644
index d9a3978..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-af/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"Toetsbediener-app"</string>
-    <string name="action_settings" msgid="1335152369747372374">"Instellings"</string>
-    <string name="server_running" msgid="2780193626090379172">"Bediener werk tans …"</string>
-    <string name="stop_server" msgid="6192029827529013598">"Stop bediener"</string>
-    <string name="server_down" msgid="1030249207496490556">"Bediener is af"</string>
-    <string name="start_server" msgid="3878573341408591975">"Begin bediener"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"Gedeaktiveer"</item>
-    <item msgid="3193389681837907872">"Geaktiveer"</item>
-    <item msgid="3124590179479393815">"Onversoenbaar"</item>
-    <item msgid="1606753456265236910">"Stel tans op"</item>
-    <item msgid="3930807209231347454">"Ingesluit"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"Nie opgestel nie"</item>
-    <item msgid="7598231293776486217">"Opgestel"</item>
-    <item msgid="3720547957514534185">"Nie vereis nie"</item>
-    <item msgid="1264673582354896949">"Tans besig"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-am/strings.xml b/testapps/TestServerApp/app/src/main/res/values-am/strings.xml
new file mode 100644
index 0000000..8ec544c
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-am/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"ቅንብሮች"</string>
+    <string name="server_running" msgid="2780193626090379172">"አገልጋይ እያሄደ ነው..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"አገልጋይን አቁም"</string>
+    <string name="server_down" msgid="1030249207496490556">"አገልጋይ አይሰራም"</string>
+    <string name="start_server" msgid="3878573341408591975">"አገልጋይን አስጀምር"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"ተሰናክሏል"</item>
+    <item msgid="3193389681837907872">"ነቅቷል"</item>
+    <item msgid="3124590179479393815">"ተኳሃኝ አይደለም"</item>
+    <item msgid="1606753456265236910">"በማቅረብ ላይ"</item>
+    <item msgid="3930807209231347454">"ተካትቷል"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"አልቀረበም"</item>
+    <item msgid="7598231293776486217">"ቀርቧል"</item>
+    <item msgid="3720547957514534185">"አያስፈልግም"</item>
+    <item msgid="1264673582354896949">"በሂደት ላይ"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ar/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ar/strings.xml
new file mode 100644
index 0000000..c901917
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ar/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"الإعدادات"</string>
+    <string name="server_running" msgid="2780193626090379172">"الخادم قيد التشغيل…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"إيقاف الخادم"</string>
+    <string name="server_down" msgid="1030249207496490556">"الخادم معطّل"</string>
+    <string name="start_server" msgid="3878573341408591975">"بدء الخادم"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"غير مفعَّلة"</item>
+    <item msgid="3193389681837907872">"مفعّلة"</item>
+    <item msgid="3124590179479393815">"غير متوافق"</item>
+    <item msgid="1606753456265236910">"جارٍ توفير المتطلبات اللازمة"</item>
+    <item msgid="3930807209231347454">"متاحة"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"لم يتم توفير المتطلبات اللازمة"</item>
+    <item msgid="7598231293776486217">"توفير المتطلبات اللازمة"</item>
+    <item msgid="3720547957514534185">"غير مطلوب"</item>
+    <item msgid="1264673582354896949">"قيد التقدم"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-as/strings.xml b/testapps/TestServerApp/app/src/main/res/values-as/strings.xml
new file mode 100644
index 0000000..46ee915
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-as/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"ছেটিং"</string>
+    <string name="server_running" msgid="2780193626090379172">"ছাৰ্ভাৰটো চলি আছে..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"ছাৰ্ভাৰ বন্ধ কৰক"</string>
+    <string name="server_down" msgid="1030249207496490556">"ছাৰ্ভাৰটো কাৰ্যক্ষম হৈ থকা নাই"</string>
+    <string name="start_server" msgid="3878573341408591975">"ছাৰ্ভাৰ আৰম্ভ কৰক"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"অক্ষম কৰা আছে"</item>
+    <item msgid="3193389681837907872">"সক্ষম কৰা আছে"</item>
+    <item msgid="3124590179479393815">"অমিল"</item>
+    <item msgid="1606753456265236910">"প্ৰ’ভিজনিং"</item>
+    <item msgid="3930807209231347454">"অন্তৰ্ভুক্ত কৰা হ’ল"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"প্ৰ’ভিজন কৰা নাই"</item>
+    <item msgid="7598231293776486217">"প্ৰ’ভিজন কৰা হৈছে"</item>
+    <item msgid="3720547957514534185">"প্ৰয়োজনীয় নহয়"</item>
+    <item msgid="1264673582354896949">"চলি আছে"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-az/strings.xml b/testapps/TestServerApp/app/src/main/res/values-az/strings.xml
new file mode 100644
index 0000000..c7bdb24
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-az/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Ayarlar"</string>
+    <string name="server_running" msgid="2780193626090379172">"Server işləyir..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Serveri dayandırın"</string>
+    <string name="server_down" msgid="1030249207496490556">"Server işləmir"</string>
+    <string name="start_server" msgid="3878573341408591975">"Serveri başladın"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Deaktiv"</item>
+    <item msgid="3193389681837907872">"Aktiv"</item>
+    <item msgid="3124590179479393815">"Uyğun deyil"</item>
+    <item msgid="1606753456265236910">"Təmin edilir"</item>
+    <item msgid="3930807209231347454">"Daxildir"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Təmin edilmir"</item>
+    <item msgid="7598231293776486217">"Təmin edilib"</item>
+    <item msgid="3720547957514534185">"Tələb olunmur"</item>
+    <item msgid="1264673582354896949">"Davam edir"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-bs/strings.xml b/testapps/TestServerApp/app/src/main/res/values-b+sr+Latn/strings.xml
similarity index 72%
rename from testapps/TestServerApp/app/src/main/res/values-bs/strings.xml
rename to testapps/TestServerApp/app/src/main/res/values-b+sr+Latn/strings.xml
index f143153..62aeff1 100644
--- a/testapps/TestServerApp/app/src/main/res/values-bs/strings.xml
+++ b/testapps/TestServerApp/app/src/main/res/values-b+sr+Latn/strings.xml
@@ -2,22 +2,22 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"Postavke"</string>
-    <string name="server_running" msgid="2780193626090379172">"Server radi…"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Podešavanja"</string>
+    <string name="server_running" msgid="2780193626090379172">"Server je pokrenut…"</string>
     <string name="stop_server" msgid="6192029827529013598">"Zaustavi server"</string>
-    <string name="server_down" msgid="1030249207496490556">"Server ne radi"</string>
+    <string name="server_down" msgid="1030249207496490556">"Server je pao"</string>
     <string name="start_server" msgid="3878573341408591975">"Pokreni server"</string>
   <string-array name="entitlement_status">
     <item msgid="5560300387618996934">"Onemogućeno"</item>
     <item msgid="3193389681837907872">"Omogućeno"</item>
     <item msgid="3124590179479393815">"Nekompatibilno"</item>
-    <item msgid="1606753456265236910">"Dodjeljivanje"</item>
-    <item msgid="3930807209231347454">"Uključeno"</item>
+    <item msgid="1606753456265236910">"Dodeljuje se"</item>
+    <item msgid="3930807209231347454">"Uvršteno"</item>
   </string-array>
   <string-array name="provision_status">
-    <item msgid="3486273747926710021">"Nije dodijeljeno"</item>
-    <item msgid="7598231293776486217">"Dodijeljeno"</item>
-    <item msgid="3720547957514534185">"Nije potrebno"</item>
+    <item msgid="3486273747926710021">"Nije dodeljeno"</item>
+    <item msgid="7598231293776486217">"Dodeljeno"</item>
+    <item msgid="3720547957514534185">"Nije obavezno"</item>
     <item msgid="1264673582354896949">"U toku"</item>
   </string-array>
 </resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-be/strings.xml b/testapps/TestServerApp/app/src/main/res/values-be/strings.xml
new file mode 100644
index 0000000..5f1f581
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-be/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Налады"</string>
+    <string name="server_running" msgid="2780193626090379172">"Сервер працуе..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Спыніць сервер"</string>
+    <string name="server_down" msgid="1030249207496490556">"Сервер не працуе"</string>
+    <string name="start_server" msgid="3878573341408591975">"Запусціць сервер"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Адключана"</item>
+    <item msgid="3193389681837907872">"Уключана"</item>
+    <item msgid="3124590179479393815">"Адсутнічае сумяшчальнасць"</item>
+    <item msgid="1606753456265236910">"Ініцыялізацыя"</item>
+    <item msgid="3930807209231347454">"Уключана"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Не ініцыялізавана"</item>
+    <item msgid="7598231293776486217">"Ініцыялізавана"</item>
+    <item msgid="3720547957514534185">"Не патрабуецца"</item>
+    <item msgid="1264673582354896949">"Выконваецца"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-bg/strings.xml b/testapps/TestServerApp/app/src/main/res/values-bg/strings.xml
new file mode 100644
index 0000000..542d0f7
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-bg/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Настройки"</string>
+    <string name="server_running" msgid="2780193626090379172">"Сървърът работи..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Спиране на сървъра"</string>
+    <string name="server_down" msgid="1030249207496490556">"Сървърът не работи"</string>
+    <string name="start_server" msgid="3878573341408591975">"Стартиране на сървъра"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Деактивирано"</item>
+    <item msgid="3193389681837907872">"Активирано"</item>
+    <item msgid="3124590179479393815">"Несъвместимо"</item>
+    <item msgid="1606753456265236910">"Обезпечава се"</item>
+    <item msgid="3930807209231347454">"Включено"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Не е обезпечено"</item>
+    <item msgid="7598231293776486217">"Обезпечено"</item>
+    <item msgid="3720547957514534185">"Не е задължително"</item>
+    <item msgid="1264673582354896949">"В ход"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-bn/strings.xml b/testapps/TestServerApp/app/src/main/res/values-bn/strings.xml
new file mode 100644
index 0000000..7244308
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-bn/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"সেটিংস"</string>
+    <string name="server_running" msgid="2780193626090379172">"সার্ভার রান করছে..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"সার্ভার বন্ধ করুন"</string>
+    <string name="server_down" msgid="1030249207496490556">"সার্ভার কাজ করছে না"</string>
+    <string name="start_server" msgid="3878573341408591975">"সার্ভার চালু করুন"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"বন্ধ আছে"</item>
+    <item msgid="3193389681837907872">"চালু আছে"</item>
+    <item msgid="3124590179479393815">"মানানসই নয়"</item>
+    <item msgid="1606753456265236910">"প্রস্তুতি চলছে"</item>
+    <item msgid="3930807209231347454">"অন্তর্ভুক্ত আছে"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"প্রস্তুত নেই"</item>
+    <item msgid="7598231293776486217">"প্রস্তুত আছে"</item>
+    <item msgid="3720547957514534185">"প্রয়োজন নেই"</item>
+    <item msgid="1264673582354896949">"কাজ চলছে"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ca/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ca/strings.xml
deleted file mode 100644
index 7b7a999..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-ca/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"Configuració"</string>
-    <string name="server_running" msgid="2780193626090379172">"El servidor s\'està executant..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"Atura el servidor"</string>
-    <string name="server_down" msgid="1030249207496490556">"El servidor no funciona"</string>
-    <string name="start_server" msgid="3878573341408591975">"Inicia el servidor"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"Desactivat"</item>
-    <item msgid="3193389681837907872">"Activat"</item>
-    <item msgid="3124590179479393815">"Incompatible"</item>
-    <item msgid="1606753456265236910">"S\'està proporcionant"</item>
-    <item msgid="3930807209231347454">"Inclòs"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"No proporcionat"</item>
-    <item msgid="7598231293776486217">"Proporcionat"</item>
-    <item msgid="3720547957514534185">"No obligatori"</item>
-    <item msgid="1264673582354896949">"En curs"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-cs/strings.xml b/testapps/TestServerApp/app/src/main/res/values-cs/strings.xml
new file mode 100644
index 0000000..c8dfd8d
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-cs/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Nastavení"</string>
+    <string name="server_running" msgid="2780193626090379172">"Server běží…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Zastavit server"</string>
+    <string name="server_down" msgid="1030249207496490556">"Server je nedostupný"</string>
+    <string name="start_server" msgid="3878573341408591975">"Spustit server"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Vypnuto"</item>
+    <item msgid="3193389681837907872">"Zapnuto"</item>
+    <item msgid="3124590179479393815">"Nekompatibilní"</item>
+    <item msgid="1606753456265236910">"Zajišťování"</item>
+    <item msgid="3930807209231347454">"Zahrnuto"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Nezajištěno"</item>
+    <item msgid="7598231293776486217">"Zajištěno"</item>
+    <item msgid="3720547957514534185">"Nepovinné"</item>
+    <item msgid="1264673582354896949">"Probíhá"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-da/strings.xml b/testapps/TestServerApp/app/src/main/res/values-da/strings.xml
new file mode 100644
index 0000000..1d8e029
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-da/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"Testserverapp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Indstillinger"</string>
+    <string name="server_running" msgid="2780193626090379172">"Serveren kører…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Stop server"</string>
+    <string name="server_down" msgid="1030249207496490556">"Serveren er nede"</string>
+    <string name="start_server" msgid="3878573341408591975">"Start server"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Deaktiveret"</item>
+    <item msgid="3193389681837907872">"Aktiveret"</item>
+    <item msgid="3124590179479393815">"Ikke kompatibel"</item>
+    <item msgid="1606753456265236910">"Provisionerer"</item>
+    <item msgid="3930807209231347454">"Inkluderet"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Ikke provisioneret"</item>
+    <item msgid="7598231293776486217">"Provisioneret"</item>
+    <item msgid="3720547957514534185">"Ikke påkrævet"</item>
+    <item msgid="1264673582354896949">"I gang"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-de/strings.xml b/testapps/TestServerApp/app/src/main/res/values-de/strings.xml
new file mode 100644
index 0000000..4adc332
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-de/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Einstellungen"</string>
+    <string name="server_running" msgid="2780193626090379172">"Server ist in Betrieb…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Server anhalten"</string>
+    <string name="server_down" msgid="1030249207496490556">"Server ist ausgefallen"</string>
+    <string name="start_server" msgid="3878573341408591975">"Server starten"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Deaktiviert"</item>
+    <item msgid="3193389681837907872">"Aktiviert"</item>
+    <item msgid="3124590179479393815">"Nicht kompatibel"</item>
+    <item msgid="1606753456265236910">"Nutzerverwaltung"</item>
+    <item msgid="3930807209231347454">"Enthalten"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Noch nicht von einem Nutzer verwaltet"</item>
+    <item msgid="7598231293776486217">"Von einem Nutzer verwaltet"</item>
+    <item msgid="3720547957514534185">"Nicht erforderlich"</item>
+    <item msgid="1264673582354896949">"In Bearbeitung"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-el/strings.xml b/testapps/TestServerApp/app/src/main/res/values-el/strings.xml
new file mode 100644
index 0000000..540500d
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-el/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Ρυθμίσεις"</string>
+    <string name="server_running" msgid="2780193626090379172">"Ο διακομιστής λειτουργεί…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Διακοπή διακομιστή"</string>
+    <string name="server_down" msgid="1030249207496490556">"Ο διακομιστής είναι εκτός λειτουργίας"</string>
+    <string name="start_server" msgid="3878573341408591975">"Έναρξη διακομιστή"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Ανενεργό"</item>
+    <item msgid="3193389681837907872">"Ενεργό"</item>
+    <item msgid="3124590179479393815">"Μη συμβατό"</item>
+    <item msgid="1606753456265236910">"Παροχή"</item>
+    <item msgid="3930807209231347454">"Περιλαμβάνεται"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Χωρίς παροχή"</item>
+    <item msgid="7598231293776486217">"Παρέχεται"</item>
+    <item msgid="3720547957514534185">"Δεν απαιτείται"</item>
+    <item msgid="1264673582354896949">"Σε εξέλιξη"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-en-rAU/strings.xml b/testapps/TestServerApp/app/src/main/res/values-en-rAU/strings.xml
deleted file mode 100644
index 9a8beab..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"Settings"</string>
-    <string name="server_running" msgid="2780193626090379172">"Server is running..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"Stop server"</string>
-    <string name="server_down" msgid="1030249207496490556">"Server is down"</string>
-    <string name="start_server" msgid="3878573341408591975">"Start server"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"Disabled"</item>
-    <item msgid="3193389681837907872">"Enabled"</item>
-    <item msgid="3124590179479393815">"Incompatible"</item>
-    <item msgid="1606753456265236910">"Provisioning"</item>
-    <item msgid="3930807209231347454">"Included"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"Not provisioned"</item>
-    <item msgid="7598231293776486217">"Provisioned"</item>
-    <item msgid="3720547957514534185">"Not required"</item>
-    <item msgid="1264673582354896949">"In progress"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-en-rGB/strings.xml b/testapps/TestServerApp/app/src/main/res/values-en-rGB/strings.xml
deleted file mode 100644
index 9a8beab..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"Settings"</string>
-    <string name="server_running" msgid="2780193626090379172">"Server is running..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"Stop server"</string>
-    <string name="server_down" msgid="1030249207496490556">"Server is down"</string>
-    <string name="start_server" msgid="3878573341408591975">"Start server"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"Disabled"</item>
-    <item msgid="3193389681837907872">"Enabled"</item>
-    <item msgid="3124590179479393815">"Incompatible"</item>
-    <item msgid="1606753456265236910">"Provisioning"</item>
-    <item msgid="3930807209231347454">"Included"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"Not provisioned"</item>
-    <item msgid="7598231293776486217">"Provisioned"</item>
-    <item msgid="3720547957514534185">"Not required"</item>
-    <item msgid="1264673582354896949">"In progress"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-en-rIN/strings.xml b/testapps/TestServerApp/app/src/main/res/values-en-rIN/strings.xml
deleted file mode 100644
index 9a8beab..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"Settings"</string>
-    <string name="server_running" msgid="2780193626090379172">"Server is running..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"Stop server"</string>
-    <string name="server_down" msgid="1030249207496490556">"Server is down"</string>
-    <string name="start_server" msgid="3878573341408591975">"Start server"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"Disabled"</item>
-    <item msgid="3193389681837907872">"Enabled"</item>
-    <item msgid="3124590179479393815">"Incompatible"</item>
-    <item msgid="1606753456265236910">"Provisioning"</item>
-    <item msgid="3930807209231347454">"Included"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"Not provisioned"</item>
-    <item msgid="7598231293776486217">"Provisioned"</item>
-    <item msgid="3720547957514534185">"Not required"</item>
-    <item msgid="1264673582354896949">"In progress"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-en-rXC/strings.xml b/testapps/TestServerApp/app/src/main/res/values-en-rXC/strings.xml
deleted file mode 100644
index c6f5304..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎‎TestServerApp‎‏‎‎‏‎"</string>
-    <string name="action_settings" msgid="1335152369747372374">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎‏‏‎‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‎‏‎‎‏‎‏‎‏‎‏‏‎‎Settings‎‏‎‎‏‎"</string>
-    <string name="server_running" msgid="2780193626090379172">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‏‏‎‏‏‎‏‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‎‏‎‎‎Server is running...‎‏‎‎‏‎"</string>
-    <string name="stop_server" msgid="6192029827529013598">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‏‎‎Stop Server‎‏‎‎‏‎"</string>
-    <string name="server_down" msgid="1030249207496490556">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‎‎‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎Server is down‎‏‎‎‏‎"</string>
-    <string name="start_server" msgid="3878573341408591975">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‏‎‎‏‏‏‎Start Server‎‏‎‎‏‎"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‎‎‏‏‎‎Disabled‎‏‎‎‏‎"</item>
-    <item msgid="3193389681837907872">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎Enabled‎‏‎‎‏‎"</item>
-    <item msgid="3124590179479393815">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‎‎‏‏‎‎‎‏‏‎‎‎‏‏‎‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‏‏‎Incompatible‎‏‎‎‏‎"</item>
-    <item msgid="1606753456265236910">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‏‏‏‎‎Provisioning‎‏‎‎‏‎"</item>
-    <item msgid="3930807209231347454">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‎‎‏‏‎‏‎‏‏‎‎‎‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎Included‎‏‎‎‏‎"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‎Not Provisioned‎‏‎‎‏‎"</item>
-    <item msgid="7598231293776486217">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‎‏‎‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎‎‏‎‎‏‎Provisioned‎‏‎‎‏‎"</item>
-    <item msgid="3720547957514534185">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‎‎‏‎‎‎‎‎‏‎‏‎‏‎‏‎‎‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎Not Required‎‏‎‎‏‎"</item>
-    <item msgid="1264673582354896949">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‎‎‎‏‏‎‎‎‏‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‎‎‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‎In Progress‎‏‎‎‏‎"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-es-rUS/strings.xml b/testapps/TestServerApp/app/src/main/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..50c9ff2
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-es-rUS/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Configuración"</string>
+    <string name="server_running" msgid="2780193626090379172">"El servidor se está ejecutando…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Detener el servidor"</string>
+    <string name="server_down" msgid="1030249207496490556">"El servidor se encuentra inactivo"</string>
+    <string name="start_server" msgid="3878573341408591975">"Iniciar el servidor"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Inhabilitado"</item>
+    <item msgid="3193389681837907872">"Habilitado"</item>
+    <item msgid="3124590179479393815">"Incompatible"</item>
+    <item msgid="1606753456265236910">"Aprovisionando"</item>
+    <item msgid="3930807209231347454">"Incluido"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"No aprovisionado"</item>
+    <item msgid="7598231293776486217">"Aprovisionado"</item>
+    <item msgid="3720547957514534185">"No se necesita"</item>
+    <item msgid="1264673582354896949">"En curso"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-es/strings.xml b/testapps/TestServerApp/app/src/main/res/values-es/strings.xml
new file mode 100644
index 0000000..002fca7
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-es/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Ajustes"</string>
+    <string name="server_running" msgid="2780193626090379172">"El servidor se está ejecutando..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Detener servidor"</string>
+    <string name="server_down" msgid="1030249207496490556">"El servidor no está operativo"</string>
+    <string name="start_server" msgid="3878573341408591975">"Iniciar servidor"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Inhabilitado"</item>
+    <item msgid="3193389681837907872">"Habilitado"</item>
+    <item msgid="3124590179479393815">"No compatible"</item>
+    <item msgid="1606753456265236910">"En aprovisionamiento"</item>
+    <item msgid="3930807209231347454">"Incluido"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"No aprovisionado"</item>
+    <item msgid="7598231293776486217">"Aprovisionado"</item>
+    <item msgid="3720547957514534185">"No se requiere"</item>
+    <item msgid="1264673582354896949">"En curso"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-et/strings.xml b/testapps/TestServerApp/app/src/main/res/values-et/strings.xml
new file mode 100644
index 0000000..49c3209
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-et/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Seaded"</string>
+    <string name="server_running" msgid="2780193626090379172">"Server töötab ..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Peata server"</string>
+    <string name="server_down" msgid="1030249207496490556">"Serveris on katkestus"</string>
+    <string name="start_server" msgid="3878573341408591975">"Käivita server"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Keelatud"</item>
+    <item msgid="3193389681837907872">"Lubatud"</item>
+    <item msgid="3124590179479393815">"Ühildumatu"</item>
+    <item msgid="1606753456265236910">"Ettevalmistamine"</item>
+    <item msgid="3930807209231347454">"Kaasas"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Ettevalmistamata"</item>
+    <item msgid="7598231293776486217">"Ettevalmistatud"</item>
+    <item msgid="3720547957514534185">"Pole nõutav"</item>
+    <item msgid="1264673582354896949">"Töötluses"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-eu/strings.xml b/testapps/TestServerApp/app/src/main/res/values-eu/strings.xml
new file mode 100644
index 0000000..70f5423
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-eu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Ezarpenak"</string>
+    <string name="server_running" msgid="2780193626090379172">"Zerbitzaria abian da…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Gelditu zerbitzaria"</string>
+    <string name="server_down" msgid="1030249207496490556">"Zerbitzaria ez dabil"</string>
+    <string name="start_server" msgid="3878573341408591975">"Abiarazi zerbitzaria"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Desgaituta"</item>
+    <item msgid="3193389681837907872">"Gaituta"</item>
+    <item msgid="3124590179479393815">"Bateraezina"</item>
+    <item msgid="1606753456265236910">"Hornitzen"</item>
+    <item msgid="3930807209231347454">"Barne"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Hornitu gabe"</item>
+    <item msgid="7598231293776486217">"Hornituta"</item>
+    <item msgid="3720547957514534185">"Ez da beharrezkoa"</item>
+    <item msgid="1264673582354896949">"Abian"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-fa/strings.xml b/testapps/TestServerApp/app/src/main/res/values-fa/strings.xml
deleted file mode 100644
index 17b4d08..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-fa/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"تنظیمات"</string>
-    <string name="server_running" msgid="2780193626090379172">"سرور درحال اجرا است…"</string>
-    <string name="stop_server" msgid="6192029827529013598">"توقف سرور"</string>
-    <string name="server_down" msgid="1030249207496490556">"سرور ازکار افتاده است"</string>
-    <string name="start_server" msgid="3878573341408591975">"شروع سرور"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"غیرفعال"</item>
-    <item msgid="3193389681837907872">"فعال"</item>
-    <item msgid="3124590179479393815">"ناسازگار"</item>
-    <item msgid="1606753456265236910">"درحال ارائه دسترسی"</item>
-    <item msgid="3930807209231347454">"لحاظ‌شده"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"ارائه‌نشده"</item>
-    <item msgid="7598231293776486217">"ارائه‌شده"</item>
-    <item msgid="3720547957514534185">"الزامی نیست"</item>
-    <item msgid="1264673582354896949">"درحال انجام"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-fi/strings.xml b/testapps/TestServerApp/app/src/main/res/values-fi/strings.xml
new file mode 100644
index 0000000..9117e0c
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-fi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Asetukset"</string>
+    <string name="server_running" msgid="2780193626090379172">"Palvelin on käytössä..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Keskeytä palvelin"</string>
+    <string name="server_down" msgid="1030249207496490556">"Palvelin on poissa käytöstä"</string>
+    <string name="start_server" msgid="3878573341408591975">"Käynnistä palvelin"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Ei käytössä"</item>
+    <item msgid="3193389681837907872">"Käytössä"</item>
+    <item msgid="3124590179479393815">"Yhteensopimaton"</item>
+    <item msgid="1606753456265236910">"Käsitellään"</item>
+    <item msgid="3930807209231347454">"Sisältyy"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Ei käsitelty"</item>
+    <item msgid="7598231293776486217">"Käsitelty"</item>
+    <item msgid="3720547957514534185">"Valinnainen"</item>
+    <item msgid="1264673582354896949">"Käynnissä"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-fr-rCA/strings.xml b/testapps/TestServerApp/app/src/main/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..97fd06a
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-fr-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Paramètres"</string>
+    <string name="server_running" msgid="2780193626090379172">"Le serveur est en cours d\'exécution…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Arrêter le serveur"</string>
+    <string name="server_down" msgid="1030249207496490556">"Le serveur est en panne"</string>
+    <string name="start_server" msgid="3878573341408591975">"Démarrer le serveur"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Désactivé"</item>
+    <item msgid="3193389681837907872">"Activé"</item>
+    <item msgid="3124590179479393815">"Incompatible"</item>
+    <item msgid="1606753456265236910">"Approvisionnement en cours…"</item>
+    <item msgid="3930807209231347454">"Inclus"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Non approvisionné"</item>
+    <item msgid="7598231293776486217">"Approvisionné"</item>
+    <item msgid="3720547957514534185">"Facultatif"</item>
+    <item msgid="1264673582354896949">"En cours de traitement"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-fr/strings.xml b/testapps/TestServerApp/app/src/main/res/values-fr/strings.xml
new file mode 100644
index 0000000..be70c79
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-fr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Paramètres"</string>
+    <string name="server_running" msgid="2780193626090379172">"Serveur en cours d\'exécution…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Arrêter le serveur"</string>
+    <string name="server_down" msgid="1030249207496490556">"Serveur en panne"</string>
+    <string name="start_server" msgid="3878573341408591975">"Démarrer le serveur"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Désactivé"</item>
+    <item msgid="3193389681837907872">"Activé"</item>
+    <item msgid="3124590179479393815">"Incompatible"</item>
+    <item msgid="1606753456265236910">"Provisionnement…"</item>
+    <item msgid="3930807209231347454">"Inclus"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Non provisionné"</item>
+    <item msgid="7598231293776486217">"Provisionné"</item>
+    <item msgid="3720547957514534185">"Facultatif"</item>
+    <item msgid="1264673582354896949">"En cours"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-gl/strings.xml b/testapps/TestServerApp/app/src/main/res/values-gl/strings.xml
new file mode 100644
index 0000000..9de1ceb
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-gl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Configuración"</string>
+    <string name="server_running" msgid="2780193626090379172">"O servidor está executándose…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Deter servidor"</string>
+    <string name="server_down" msgid="1030249207496490556">"O servidor non está operativo"</string>
+    <string name="start_server" msgid="3878573341408591975">"Iniciar servidor"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Desactivado"</item>
+    <item msgid="3193389681837907872">"Activado"</item>
+    <item msgid="3124590179479393815">"Incompatible"</item>
+    <item msgid="1606753456265236910">"En aprovisionamento"</item>
+    <item msgid="3930807209231347454">"Incluído"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Non aprovisionado"</item>
+    <item msgid="7598231293776486217">"Aprovisionado"</item>
+    <item msgid="3720547957514534185">"Non obrigatorio"</item>
+    <item msgid="1264673582354896949">"En curso"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-gu/strings.xml b/testapps/TestServerApp/app/src/main/res/values-gu/strings.xml
new file mode 100644
index 0000000..d2fc1d0
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-gu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"સેટિંગ"</string>
+    <string name="server_running" msgid="2780193626090379172">"સર્વર ચાલુ છે..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"સર્વર રોકો"</string>
+    <string name="server_down" msgid="1030249207496490556">"સર્વર ડાઉન છે"</string>
+    <string name="start_server" msgid="3878573341408591975">"સર્વર શરૂ કરો"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"બંધ છે"</item>
+    <item msgid="3193389681837907872">"ચાલુ છે"</item>
+    <item msgid="3124590179479393815">"અસંગત છે"</item>
+    <item msgid="1606753456265236910">"જોગવાઈ કરી રહ્યું છે"</item>
+    <item msgid="3930807209231347454">"શામેલ છે"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"કોઈ જોગવાઈ કરેલી નથી"</item>
+    <item msgid="7598231293776486217">"જોગવાઈ કરેલી છે"</item>
+    <item msgid="3720547957514534185">"આવશ્યક નથી"</item>
+    <item msgid="1264673582354896949">"પ્રક્રિયા ચાલુ છે"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-hi/strings.xml b/testapps/TestServerApp/app/src/main/res/values-hi/strings.xml
new file mode 100644
index 0000000..d5be924
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-hi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"सेटिंग"</string>
+    <string name="server_running" msgid="2780193626090379172">"सर्वर काम कर रहा है..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"सर्वर बंद करें"</string>
+    <string name="server_down" msgid="1030249207496490556">"सर्वर काम नहीं कर रहा है"</string>
+    <string name="start_server" msgid="3878573341408591975">"सर्वर चालू करें"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"बंद है"</item>
+    <item msgid="3193389681837907872">"चालू है"</item>
+    <item msgid="3124590179479393815">"काम नहीं करता"</item>
+    <item msgid="1606753456265236910">"प्रावधान"</item>
+    <item msgid="3930807209231347454">"पहले से मौजूद है"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"प्रावधान नहीं किया गया है"</item>
+    <item msgid="7598231293776486217">"प्रावधान किया गया है"</item>
+    <item msgid="3720547957514534185">"ज़रूरी नहीं है"</item>
+    <item msgid="1264673582354896949">"प्रावधान किया जा रहा है"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-hr/strings.xml b/testapps/TestServerApp/app/src/main/res/values-hr/strings.xml
new file mode 100644
index 0000000..492f2cc
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-hr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Postavke"</string>
+    <string name="server_running" msgid="2780193626090379172">"Poslužitelj je aktivan..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Zaustavljanje poslužitelja"</string>
+    <string name="server_down" msgid="1030249207496490556">"Poslužitelj nije aktivan"</string>
+    <string name="start_server" msgid="3878573341408591975">"Pokretanje poslužitelja"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Onemogućeno"</item>
+    <item msgid="3193389681837907872">"Omogućeno"</item>
+    <item msgid="3124590179479393815">"Nije kompatibilno"</item>
+    <item msgid="1606753456265236910">"Omogućivanje"</item>
+    <item msgid="3930807209231347454">"Uključeno"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Nije omogućeno"</item>
+    <item msgid="7598231293776486217">"Omogućeno"</item>
+    <item msgid="3720547957514534185">"Nije obavezno"</item>
+    <item msgid="1264673582354896949">"U tijeku"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-hu/strings.xml b/testapps/TestServerApp/app/src/main/res/values-hu/strings.xml
new file mode 100644
index 0000000..286fae3
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-hu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Beállítások"</string>
+    <string name="server_running" msgid="2780193626090379172">"A szerver fut..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Szerver leállítása"</string>
+    <string name="server_down" msgid="1030249207496490556">"A szerver leállt"</string>
+    <string name="start_server" msgid="3878573341408591975">"Szerver indítása"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Kikapcsolva"</item>
+    <item msgid="3193389681837907872">"Engedélyezve"</item>
+    <item msgid="3124590179479393815">"Nem kompatibilis"</item>
+    <item msgid="1606753456265236910">"Kiépítés"</item>
+    <item msgid="3930807209231347454">"Tartalmazza"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Nincs kiépítve"</item>
+    <item msgid="7598231293776486217">"Kiépítve"</item>
+    <item msgid="3720547957514534185">"Nem kötelező"</item>
+    <item msgid="1264673582354896949">"Folyamatban"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-hy/strings.xml b/testapps/TestServerApp/app/src/main/res/values-hy/strings.xml
new file mode 100644
index 0000000..03a382b
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-hy/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Կարգավորումներ"</string>
+    <string name="server_running" msgid="2780193626090379172">"Սերվերն աշխատում է..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Կանգնեցնել սերվերը"</string>
+    <string name="server_down" msgid="1030249207496490556">"Սերվերն անջատված է"</string>
+    <string name="start_server" msgid="3878573341408591975">"Գործարկել սերվերը"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Անջատված է"</item>
+    <item msgid="3193389681837907872">"Միացված է"</item>
+    <item msgid="3124590179479393815">"Անհամատեղելիություն"</item>
+    <item msgid="1606753456265236910">"Նախապատրաստում"</item>
+    <item msgid="3930807209231347454">"Ներառված է"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Նախապատրաստված չէ"</item>
+    <item msgid="7598231293776486217">"Նախապատրաստված է"</item>
+    <item msgid="3720547957514534185">"Ոչ պարտադիր"</item>
+    <item msgid="1264673582354896949">"Ընթացքում է"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-in/strings.xml b/testapps/TestServerApp/app/src/main/res/values-in/strings.xml
new file mode 100644
index 0000000..b918582
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-in/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Setelan"</string>
+    <string name="server_running" msgid="2780193626090379172">"Server sedang berjalan..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Hentikan Server"</string>
+    <string name="server_down" msgid="1030249207496490556">"Server tidak berfungsi"</string>
+    <string name="start_server" msgid="3878573341408591975">"Mulai Server"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Nonaktif"</item>
+    <item msgid="3193389681837907872">"Aktif"</item>
+    <item msgid="3124590179479393815">"Tidak kompatibel"</item>
+    <item msgid="1606753456265236910">"Penyediaan"</item>
+    <item msgid="3930807209231347454">"Disertakan"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Tidak Disediakan"</item>
+    <item msgid="7598231293776486217">"Disediakan"</item>
+    <item msgid="3720547957514534185">"Tidak Wajib"</item>
+    <item msgid="1264673582354896949">"Dalam Proses"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-is/strings.xml b/testapps/TestServerApp/app/src/main/res/values-is/strings.xml
new file mode 100644
index 0000000..610755a
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-is/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Stillingar"</string>
+    <string name="server_running" msgid="2780193626090379172">"Þjónn er í gangi..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Stöðva þjón"</string>
+    <string name="server_down" msgid="1030249207496490556">"Þjónn liggur niðri"</string>
+    <string name="start_server" msgid="3878573341408591975">"Ræsa þjón"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Slökkt"</item>
+    <item msgid="3193389681837907872">"Kveikt"</item>
+    <item msgid="3124590179479393815">"Ósamhæft"</item>
+    <item msgid="1606753456265236910">"Úthlutun"</item>
+    <item msgid="3930807209231347454">"Innifalið"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Ekki úthlutað"</item>
+    <item msgid="7598231293776486217">"Úthlutað"</item>
+    <item msgid="3720547957514534185">"Ekki áskilið"</item>
+    <item msgid="1264673582354896949">"Í vinnslu"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-en-rCA/strings.xml b/testapps/TestServerApp/app/src/main/res/values-it/strings.xml
similarity index 100%
rename from testapps/TestServerApp/app/src/main/res/values-en-rCA/strings.xml
rename to testapps/TestServerApp/app/src/main/res/values-it/strings.xml
diff --git a/testapps/TestServerApp/app/src/main/res/values-iw/strings.xml b/testapps/TestServerApp/app/src/main/res/values-iw/strings.xml
deleted file mode 100644
index 701edba..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-iw/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"‏אפליקציית TestServer"</string>
-    <string name="action_settings" msgid="1335152369747372374">"הגדרות"</string>
-    <string name="server_running" msgid="2780193626090379172">"השרת פועל…"</string>
-    <string name="stop_server" msgid="6192029827529013598">"הפסקת השרת"</string>
-    <string name="server_down" msgid="1030249207496490556">"תקלה בשרת"</string>
-    <string name="start_server" msgid="3878573341408591975">"הפעלת השרת"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"מושבת"</item>
-    <item msgid="3193389681837907872">"פועל"</item>
-    <item msgid="3124590179479393815">"לא תואם"</item>
-    <item msgid="1606753456265236910">"הקצאה"</item>
-    <item msgid="3930807209231347454">"כלול"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"לא מוקצה"</item>
-    <item msgid="7598231293776486217">"מוקצה"</item>
-    <item msgid="3720547957514534185">"לא נדרש"</item>
-    <item msgid="1264673582354896949">"בתהליך"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ja/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ja/strings.xml
new file mode 100644
index 0000000..1b962e4
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ja/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"設定"</string>
+    <string name="server_running" msgid="2780193626090379172">"サーバーが実行中です..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"サーバーを停止"</string>
+    <string name="server_down" msgid="1030249207496490556">"サーバーがダウンしています"</string>
+    <string name="start_server" msgid="3878573341408591975">"サーバーを起動"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"無効"</item>
+    <item msgid="3193389681837907872">"有効"</item>
+    <item msgid="3124590179479393815">"非対応"</item>
+    <item msgid="1606753456265236910">"プロビジョニング"</item>
+    <item msgid="3930807209231347454">"必須"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"未プロビジョニング"</item>
+    <item msgid="7598231293776486217">"プロビジョニング済み"</item>
+    <item msgid="3720547957514534185">"任意"</item>
+    <item msgid="1264673582354896949">"処理中"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ka/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ka/strings.xml
deleted file mode 100644
index fc17ddd..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-ka/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"პარამეტრები"</string>
-    <string name="server_running" msgid="2780193626090379172">"სერვერი მუშაობს..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"სერვერის გაჩერება"</string>
-    <string name="server_down" msgid="1030249207496490556">"სერვერი გათიშულია"</string>
-    <string name="start_server" msgid="3878573341408591975">"სერვერის დაწყება"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"გათიშულია"</item>
-    <item msgid="3193389681837907872">"ჩართულია"</item>
-    <item msgid="3124590179479393815">"არათავსებადი"</item>
-    <item msgid="1606753456265236910">"დანერგვა"</item>
-    <item msgid="3930807209231347454">"შედის"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"არ არის გათვალისწინებული"</item>
-    <item msgid="7598231293776486217">"უზრუნველყოფილი"</item>
-    <item msgid="3720547957514534185">"არასავალდებულო"</item>
-    <item msgid="1264673582354896949">"მიმდინარე"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-kk/strings.xml b/testapps/TestServerApp/app/src/main/res/values-kk/strings.xml
new file mode 100644
index 0000000..8a93c31
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-kk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Параметрлер"</string>
+    <string name="server_running" msgid="2780193626090379172">"Сервер істеп тұр…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Серверді тоқтату"</string>
+    <string name="server_down" msgid="1030249207496490556">"Сервер істемей тұр"</string>
+    <string name="start_server" msgid="3878573341408591975">"Серверді іске қосу"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Өшірулі"</item>
+    <item msgid="3193389681837907872">"Қосулы"</item>
+    <item msgid="3124590179479393815">"Үйлеспейді"</item>
+    <item msgid="1606753456265236910">"Дайындау"</item>
+    <item msgid="3930807209231347454">"Қамтылды"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Дайындалмады"</item>
+    <item msgid="7598231293776486217">"Дайындалды"</item>
+    <item msgid="3720547957514534185">"Міндетті емес"</item>
+    <item msgid="1264673582354896949">"Орындалып жатыр"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-km/strings.xml b/testapps/TestServerApp/app/src/main/res/values-km/strings.xml
deleted file mode 100644
index 888db64..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-km/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"ការកំណត់"</string>
-    <string name="server_running" msgid="2780193626090379172">"ម៉ាស៊ីន​មេ​កំពុង​ដំណើរការ..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"បញ្ឈប់​ម៉ាស៊ីន​មេ"</string>
-    <string name="server_down" msgid="1030249207496490556">"ម៉ាស៊ីន​មេ​មិនដំណើរការ"</string>
-    <string name="start_server" msgid="3878573341408591975">"ចាប់ផ្ដើម​ម៉ាស៊ីនមេ"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"បានបិទ"</item>
-    <item msgid="3193389681837907872">"បាន​បើក"</item>
-    <item msgid="3124590179479393815">"មិនត្រូវគ្នា"</item>
-    <item msgid="1606753456265236910">"ការផ្តល់"</item>
-    <item msgid="3930807209231347454">"បាន​រួមបញ្ចូល"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"មិន​បាន​ផ្ដល់"</item>
-    <item msgid="7598231293776486217">"បាន​ផ្ដល់"</item>
-    <item msgid="3720547957514534185">"មិន​តម្រូវ"</item>
-    <item msgid="1264673582354896949">"កំពុង​ដំណើរការ"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-kn/strings.xml b/testapps/TestServerApp/app/src/main/res/values-kn/strings.xml
new file mode 100644
index 0000000..227d44b
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-kn/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
+    <string name="server_running" msgid="2780193626090379172">"ಸರ್ವರ್ ರನ್ ಆಗುತ್ತಿದೆ..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"ಸರ್ವರ್ ನಿಲ್ಲಿಸಿ"</string>
+    <string name="server_down" msgid="1030249207496490556">"ಸರ್ವರ್ ಡೌನ್ ಆಗಿದೆ"</string>
+    <string name="start_server" msgid="3878573341408591975">"ಸರ್ವರ್ ಪ್ರಾರಂಭಿಸಿ"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</item>
+    <item msgid="3193389681837907872">"ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</item>
+    <item msgid="3124590179479393815">"ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ"</item>
+    <item msgid="1606753456265236910">"ಒದಗಿಸಲಾಗುತ್ತಿದೆ"</item>
+    <item msgid="3930807209231347454">"ಒಳಗೊಂಡಿದೆ"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"ಒದಗಿಸಲಾಗಿಲ್ಲ"</item>
+    <item msgid="7598231293776486217">"ಒದಗಿಸಲಾಗಿದೆ"</item>
+    <item msgid="3720547957514534185">"ಅಗತ್ಯವಿಲ್ಲ"</item>
+    <item msgid="1264673582354896949">"ಪ್ರಗತಿಯಲ್ಲಿದೆ"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ko/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ko/strings.xml
new file mode 100644
index 0000000..ca9b15a
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ko/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"설정"</string>
+    <string name="server_running" msgid="2780193626090379172">"서버 실행 중…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"서버를 중지하시겠습니까?"</string>
+    <string name="server_down" msgid="1030249207496490556">"서버가 다운됨"</string>
+    <string name="start_server" msgid="3878573341408591975">"서버를 시작하시겠습니까?"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"사용 안함"</item>
+    <item msgid="3193389681837907872">"사용 설정됨"</item>
+    <item msgid="3124590179479393815">"호환되지 않음"</item>
+    <item msgid="1606753456265236910">"프로비저닝"</item>
+    <item msgid="3930807209231347454">"포함됨"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"프로비저닝되지 않음"</item>
+    <item msgid="7598231293776486217">"프로비저닝됨"</item>
+    <item msgid="3720547957514534185">"필요 없음"</item>
+    <item msgid="1264673582354896949">"진행 중"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ky/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ky/strings.xml
new file mode 100644
index 0000000..3d6c36f
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ky/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Параметрлер"</string>
+    <string name="server_running" msgid="2780193626090379172">"Сервер иштеп жатат..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Серверди токтотуу"</string>
+    <string name="server_down" msgid="1030249207496490556">"Сервер иштебей калды"</string>
+    <string name="start_server" msgid="3878573341408591975">"Серверди иштетип баштоо"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Өчүрүлдү"</item>
+    <item msgid="3193389681837907872">"Иштетилди"</item>
+    <item msgid="3124590179479393815">"Ылайык келбейт"</item>
+    <item msgid="1606753456265236910">"Камсыз кылууда"</item>
+    <item msgid="3930807209231347454">"Камтылган"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Камсыздалган эмес"</item>
+    <item msgid="7598231293776486217">"Камсыздалган"</item>
+    <item msgid="3720547957514534185">"Талап кылынбайт"</item>
+    <item msgid="1264673582354896949">"Аткарылууда"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-lo/strings.xml b/testapps/TestServerApp/app/src/main/res/values-lo/strings.xml
deleted file mode 100644
index eb725cf..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-lo/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"ການຕັ້ງຄ່າ"</string>
-    <string name="server_running" msgid="2780193626090379172">"ເຊີບເວີກຳລັງເຮັດວຽກ..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"ຢຸດການເຮັດວຽກຂອງເຊີບເວີ"</string>
-    <string name="server_down" msgid="1030249207496490556">"ເຊີບເວີຢຸດໃຫ້ບໍລິການ"</string>
-    <string name="start_server" msgid="3878573341408591975">"ເລີ່ມການເຮັດວຽກຂອງເຊີບເວີ"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"ປິດການນຳໃຊ້ແລ້ວ"</item>
-    <item msgid="3193389681837907872">"ເປີດການນຳໃຊ້ແລ້ວ"</item>
-    <item msgid="3124590179479393815">"ໃຊ້ຮ່ວມກັນບໍ່ໄດ້"</item>
-    <item msgid="1606753456265236910">"ກຳລັງຈັດກຽມ"</item>
-    <item msgid="3930807209231347454">"ຮວມເຂົ້າແລ້ວ"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"ບໍ່ໄດ້ຈັດກຽມ"</item>
-    <item msgid="7598231293776486217">"ຈັດກຽມໃຫ້ແລ້ວ"</item>
-    <item msgid="3720547957514534185">"ບໍ່ຈຳເປັນ"</item>
-    <item msgid="1264673582354896949">"ກຳລັງດຳເນີນການ"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-lt/strings.xml b/testapps/TestServerApp/app/src/main/res/values-lt/strings.xml
new file mode 100644
index 0000000..a7e79e9
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-lt/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Nustatymai"</string>
+    <string name="server_running" msgid="2780193626090379172">"Serveris veikia..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Sustabdyti serverį"</string>
+    <string name="server_down" msgid="1030249207496490556">"Serveris neveikia"</string>
+    <string name="start_server" msgid="3878573341408591975">"Paleisti serverį"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Išjungta"</item>
+    <item msgid="3193389681837907872">"Įgalinta"</item>
+    <item msgid="3124590179479393815">"Nesuderinama"</item>
+    <item msgid="1606753456265236910">"Parengiama"</item>
+    <item msgid="3930807209231347454">"Įtraukta"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Neparengta"</item>
+    <item msgid="7598231293776486217">"Parengta"</item>
+    <item msgid="3720547957514534185">"Nebūtina"</item>
+    <item msgid="1264673582354896949">"Vykdoma"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-lv/strings.xml b/testapps/TestServerApp/app/src/main/res/values-lv/strings.xml
new file mode 100644
index 0000000..a7bff51
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-lv/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"ServeraLietotneTestēšanai"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Iestatījumi"</string>
+    <string name="server_running" msgid="2780193626090379172">"Serveris darbojas…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Apturēt servera darbību"</string>
+    <string name="server_down" msgid="1030249207496490556">"Serveris nedarbojas"</string>
+    <string name="start_server" msgid="3878573341408591975">"Palaist serveri"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Atspējots"</item>
+    <item msgid="3193389681837907872">"Iespējots"</item>
+    <item msgid="3124590179479393815">"Nav saderīgs"</item>
+    <item msgid="1606753456265236910">"Notiek nodrošināšana"</item>
+    <item msgid="3930807209231347454">"Iekļauts"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Nav nodrošināts"</item>
+    <item msgid="7598231293776486217">"Nodrošināts"</item>
+    <item msgid="3720547957514534185">"Nav nepieciešams"</item>
+    <item msgid="1264673582354896949">"Notiek apstrāde"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-mk/strings.xml b/testapps/TestServerApp/app/src/main/res/values-mk/strings.xml
new file mode 100644
index 0000000..44a255c
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-mk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Поставки"</string>
+    <string name="server_running" msgid="2780193626090379172">"Серверот се извршува…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Сопри го серверот"</string>
+    <string name="server_down" msgid="1030249207496490556">"Серверот е паднат"</string>
+    <string name="start_server" msgid="3878573341408591975">"Стартувај го серверот"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Оневозможено"</item>
+    <item msgid="3193389681837907872">"Овозможено"</item>
+    <item msgid="3124590179479393815">"Некомпатибилно"</item>
+    <item msgid="1606753456265236910">"Се обезбедува"</item>
+    <item msgid="3930807209231347454">"Опфатено"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Необезбедено"</item>
+    <item msgid="7598231293776486217">"Обезбедено"</item>
+    <item msgid="3720547957514534185">"Незадолжително"</item>
+    <item msgid="1264673582354896949">"Во тек"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ml/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ml/strings.xml
new file mode 100644
index 0000000..32b305a
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ml/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"ക്രമീകരണം"</string>
+    <string name="server_running" msgid="2780193626090379172">"സെർവർ പ്രവർത്തിക്കുന്നുണ്ട്..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"സെർവർ നിർത്തുക"</string>
+    <string name="server_down" msgid="1030249207496490556">"സെർവർ ലഭ്യമല്ല"</string>
+    <string name="start_server" msgid="3878573341408591975">"സെർവർ ആരംഭിക്കുക"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"പ്രവർത്തനരഹിതമാക്കി"</item>
+    <item msgid="3193389681837907872">"പ്രവർത്തനക്ഷമമാക്കി"</item>
+    <item msgid="3124590179479393815">"അനുയോജ്യമല്ല"</item>
+    <item msgid="1606753456265236910">"പ്രൊവിഷനിംഗ്"</item>
+    <item msgid="3930807209231347454">"ഉൾപ്പെടുത്തി"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"പ്രൊവിഷൻ ചെയ്തിട്ടില്ല"</item>
+    <item msgid="7598231293776486217">"പ്രൊവിഷൻ ചെയ്തു"</item>
+    <item msgid="3720547957514534185">"ആവശ്യമില്ല"</item>
+    <item msgid="1264673582354896949">"പുരോഗമിക്കുന്നു"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-mn/strings.xml b/testapps/TestServerApp/app/src/main/res/values-mn/strings.xml
new file mode 100644
index 0000000..6c131e2
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-mn/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Тохиргоо"</string>
+    <string name="server_running" msgid="2780193626090379172">"Сервер ажиллаж байна..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Серверийг зогсоох"</string>
+    <string name="server_down" msgid="1030249207496490556">"Сервер унтарсан байна"</string>
+    <string name="start_server" msgid="3878573341408591975">"Серверийг эхлүүлэх"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Идэвхгүй болгосон"</item>
+    <item msgid="3193389681837907872">"Идэвхжүүлсэн"</item>
+    <item msgid="3124590179479393815">"Тохирохгүй"</item>
+    <item msgid="1606753456265236910">"Бэлтгэж байна"</item>
+    <item msgid="3930807209231347454">"Багтсан"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Бэлтгээгүй"</item>
+    <item msgid="7598231293776486217">"Бэлтгэсэн"</item>
+    <item msgid="3720547957514534185">"Заавал биш"</item>
+    <item msgid="1264673582354896949">"Үргэлжилж байна"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-mr/strings.xml b/testapps/TestServerApp/app/src/main/res/values-mr/strings.xml
new file mode 100644
index 0000000..74a0f56
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-mr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"सेटिंग्ज"</string>
+    <string name="server_running" msgid="2780193626090379172">"सर्व्हर रन होत आहे..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"सर्व्हर थांबवा"</string>
+    <string name="server_down" msgid="1030249207496490556">"सर्व्हर बंद आहे"</string>
+    <string name="start_server" msgid="3878573341408591975">"सर्व्हर सुरू करा"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"बंद आहे"</item>
+    <item msgid="3193389681837907872">"सुरू आहे"</item>
+    <item msgid="3124590179479393815">"कंपॅटिबल नाही"</item>
+    <item msgid="1606753456265236910">"तरतूद"</item>
+    <item msgid="3930807209231347454">"समावेश आहे"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"तरतूद केलेली नाही"</item>
+    <item msgid="7598231293776486217">"तरतूद केली आहे"</item>
+    <item msgid="3720547957514534185">"आवश्यक नाही"</item>
+    <item msgid="1264673582354896949">"प्रगतीपथावर आहे"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ms/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ms/strings.xml
deleted file mode 100644
index 8d60ad4..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-ms/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"Tetapan"</string>
-    <string name="server_running" msgid="2780193626090379172">"Pelayan sedang dijalankan..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"Hentikan Pelayan"</string>
-    <string name="server_down" msgid="1030249207496490556">"Pelayan tergendala"</string>
-    <string name="start_server" msgid="3878573341408591975">"Mulakan Pelayan"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"Dilumpuhkan"</item>
-    <item msgid="3193389681837907872">"Didayakan"</item>
-    <item msgid="3124590179479393815">"Tidak serasi"</item>
-    <item msgid="1606753456265236910">"Peruntukan"</item>
-    <item msgid="3930807209231347454">"Disertakan"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"Tidak Diperuntukkan"</item>
-    <item msgid="7598231293776486217">"Diperuntukkan"</item>
-    <item msgid="3720547957514534185">"Tidak Diperlukan"</item>
-    <item msgid="1264673582354896949">"Sedang Berlangsung"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-my/strings.xml b/testapps/TestServerApp/app/src/main/res/values-my/strings.xml
new file mode 100644
index 0000000..9a0dcdf
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-my/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"ဆက်တင်များ"</string>
+    <string name="server_running" msgid="2780193626090379172">"ဆာဗာ လုပ်ဆောင်နေသည်…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"ဆာဗာ ရပ်ရန်"</string>
+    <string name="server_down" msgid="1030249207496490556">"ဆာဗာကျနေသည်"</string>
+    <string name="start_server" msgid="3878573341408591975">"ဆာဗာ စတင်ရန်"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"ပိတ်ထားသည်"</item>
+    <item msgid="3193389681837907872">"ဖွင့်ထားသည်"</item>
+    <item msgid="3124590179479393815">"တွဲဖက်မသုံးနိုင်ပါ"</item>
+    <item msgid="1606753456265236910">"ပံ့ပိုးပေးခြင်း"</item>
+    <item msgid="3930807209231347454">"ပါဝင်သည်"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"ပံ့ပိုးမထားပါ"</item>
+    <item msgid="7598231293776486217">"ပံ့ပိုးပေးထားသည်"</item>
+    <item msgid="3720547957514534185">"မလိုအပ်ပါ"</item>
+    <item msgid="1264673582354896949">"ဆောင်ရွက်နေဆဲ"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-nb/strings.xml b/testapps/TestServerApp/app/src/main/res/values-nb/strings.xml
new file mode 100644
index 0000000..d28a197
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-nb/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Innstillinger"</string>
+    <string name="server_running" msgid="2780193626090379172">"Tjeneren kjører …"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Stopp tjeneren"</string>
+    <string name="server_down" msgid="1030249207496490556">"Tjeneren er nede"</string>
+    <string name="start_server" msgid="3878573341408591975">"Start tjeneren"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Slått av"</item>
+    <item msgid="3193389681837907872">"Slått på"</item>
+    <item msgid="3124590179479393815">"Inkompatibel"</item>
+    <item msgid="1606753456265236910">"Klargjøring"</item>
+    <item msgid="3930807209231347454">"Inkludert"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Ikke klargjort"</item>
+    <item msgid="7598231293776486217">"Klargjort"</item>
+    <item msgid="3720547957514534185">"Ikke obligatorisk"</item>
+    <item msgid="1264673582354896949">"Under behandling"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ne/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ne/strings.xml
new file mode 100644
index 0000000..fe1f119
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ne/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"सेटिङ"</string>
+    <string name="server_running" msgid="2780193626090379172">"सर्भर चल्दै छ..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"सर्भर बन्द गर्नुहोस्"</string>
+    <string name="server_down" msgid="1030249207496490556">"सर्भर डाउन छ"</string>
+    <string name="start_server" msgid="3878573341408591975">"सर्भर प्रयोग गर्न थाल्नुहोस्"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"अफ गरिएको छ"</item>
+    <item msgid="3193389681837907872">"अन गरिएको छ"</item>
+    <item msgid="3124590179479393815">"नमिल्दो"</item>
+    <item msgid="1606753456265236910">"प्रावधान मिलाइँदै छ"</item>
+    <item msgid="3930807209231347454">"समावेश गरिएको छ"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"प्रावधान मिलाइएको छैन"</item>
+    <item msgid="7598231293776486217">"प्रावधान मिलाइएको छ"</item>
+    <item msgid="3720547957514534185">"आवश्यक छैन"</item>
+    <item msgid="1264673582354896949">"प्रक्रियामा छ"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-nl/strings.xml b/testapps/TestServerApp/app/src/main/res/values-nl/strings.xml
new file mode 100644
index 0000000..847dfca
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-nl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Instellingen"</string>
+    <string name="server_running" msgid="2780193626090379172">"Server actief..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Server stoppen"</string>
+    <string name="server_down" msgid="1030249207496490556">"Server offline"</string>
+    <string name="start_server" msgid="3878573341408591975">"Server starten"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Uit"</item>
+    <item msgid="3193389681837907872">"Aan"</item>
+    <item msgid="3124590179479393815">"Niet geschikt"</item>
+    <item msgid="1606753456265236910">"Registratie"</item>
+    <item msgid="3930807209231347454">"Opgenomen"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Niet geregistreerd"</item>
+    <item msgid="7598231293776486217">"Geregistreerd"</item>
+    <item msgid="3720547957514534185">"Niet vereist"</item>
+    <item msgid="1264673582354896949">"In behandeling"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-or/strings.xml b/testapps/TestServerApp/app/src/main/res/values-or/strings.xml
deleted file mode 100644
index 3f951e7..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-or/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"ସେଟିଂସ"</string>
-    <string name="server_running" msgid="2780193626090379172">"ସର୍ଭର ଚାଲୁଛି..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"ସର୍ଭର ବନ୍ଦ କରନ୍ତୁ"</string>
-    <string name="server_down" msgid="1030249207496490556">"ସର୍ଭର ଡାଉନ ଅଛି"</string>
-    <string name="start_server" msgid="3878573341408591975">"ସର୍ଭର ଆରମ୍ଭ କରନ୍ତୁ"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"ଅକ୍ଷମ କରାଯାଇଛି"</item>
-    <item msgid="3193389681837907872">"ସକ୍ଷମ କରାଯାଇଛି"</item>
-    <item msgid="3124590179479393815">"ଇନକମ୍ପାଟିବଲ"</item>
-    <item msgid="1606753456265236910">"ପ୍ରୋଭିଜନ କରାଯାଉଛି"</item>
-    <item msgid="3930807209231347454">"ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"ପ୍ରୋଭିଜନ କରାଯାଇନାହିଁ"</item>
-    <item msgid="7598231293776486217">"ପ୍ରୋଭିଜନ କରାଯାଇଛି"</item>
-    <item msgid="3720547957514534185">"ଆବଶ୍ୟକ ନୁହେଁ"</item>
-    <item msgid="1264673582354896949">"ଚାଲୁଛି"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-pa/strings.xml b/testapps/TestServerApp/app/src/main/res/values-pa/strings.xml
new file mode 100644
index 0000000..f4509fc
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-pa/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"ਸੈਟਿੰਗਾਂ"</string>
+    <string name="server_running" msgid="2780193626090379172">"ਸਰਵਰ ਚੱਲ ਰਿਹਾ ਹੈ..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"ਸਰਵਰ ਬੰਦ ਕਰੋ"</string>
+    <string name="server_down" msgid="1030249207496490556">"ਸਰਵਰ ਨਹੀਂ ਚੱਲ ਰਿਹਾ"</string>
+    <string name="start_server" msgid="3878573341408591975">"ਸਰਵਰ ਚਾਲੂ ਕਰੋ"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"ਬੰਦ"</item>
+    <item msgid="3193389681837907872">"ਚਾਲੂ"</item>
+    <item msgid="3124590179479393815">"ਗੈਰ-ਅਨੁਰੂਪ"</item>
+    <item msgid="1606753456265236910">"ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</item>
+    <item msgid="3930807209231347454">"ਸ਼ਾਮਲ"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"ਪ੍ਰਬੰਧਿਤ ਨਹੀਂ ਹੈ"</item>
+    <item msgid="7598231293776486217">"ਪ੍ਰਬੰਧਿਤ ਹੈ"</item>
+    <item msgid="3720547957514534185">"ਲੋੜੀਂਦਾ ਨਹੀਂ"</item>
+    <item msgid="1264673582354896949">"ਜਾਰੀ ਹੈ"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-pl/strings.xml b/testapps/TestServerApp/app/src/main/res/values-pl/strings.xml
new file mode 100644
index 0000000..4a13003
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-pl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Ustawienia"</string>
+    <string name="server_running" msgid="2780193626090379172">"Serwer działa…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"ZatrzymaJ serwer"</string>
+    <string name="server_down" msgid="1030249207496490556">"Serwer nie działa"</string>
+    <string name="start_server" msgid="3878573341408591975">"Uruchom serwer"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Wyłączono"</item>
+    <item msgid="3193389681837907872">"Włączono"</item>
+    <item msgid="3124590179479393815">"Brak zgodności"</item>
+    <item msgid="1606753456265236910">"Obsługa administracyjna"</item>
+    <item msgid="3930807209231347454">"Dostępne"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Nieobsługiwane"</item>
+    <item msgid="7598231293776486217">"Obsługiwane"</item>
+    <item msgid="3720547957514534185">"Niewymagane"</item>
+    <item msgid="1264673582354896949">"W toku"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-pt-rPT/strings.xml b/testapps/TestServerApp/app/src/main/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..e61c84d
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-pt-rPT/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Definições"</string>
+    <string name="server_running" msgid="2780193626090379172">"O servidor está em execução…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Parar servidor"</string>
+    <string name="server_down" msgid="1030249207496490556">"O servidor está indisponível"</string>
+    <string name="start_server" msgid="3878573341408591975">"Iniciar servidor"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Desativado"</item>
+    <item msgid="3193389681837907872">"Ativado"</item>
+    <item msgid="3124590179479393815">"Incompatível"</item>
+    <item msgid="1606753456265236910">"A aprovisionar"</item>
+    <item msgid="3930807209231347454">"Incluído"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Não aprovisionado"</item>
+    <item msgid="7598231293776486217">"Aprovisionado"</item>
+    <item msgid="3720547957514534185">"Não obrigatório"</item>
+    <item msgid="1264673582354896949">"Em curso"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-pt/strings.xml b/testapps/TestServerApp/app/src/main/res/values-pt/strings.xml
new file mode 100644
index 0000000..1d2310d
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-pt/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Configurações"</string>
+    <string name="server_running" msgid="2780193626090379172">"O servidor está em execução..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Interromper servidor"</string>
+    <string name="server_down" msgid="1030249207496490556">"O servidor está fora do ar."</string>
+    <string name="start_server" msgid="3878573341408591975">"Iniciar servidor"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Desativado"</item>
+    <item msgid="3193389681837907872">"Ativado"</item>
+    <item msgid="3124590179479393815">"Incompatível"</item>
+    <item msgid="1606753456265236910">"Provisionando"</item>
+    <item msgid="3930807209231347454">"Incluso"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Não provisionado"</item>
+    <item msgid="7598231293776486217">"Provisionado"</item>
+    <item msgid="3720547957514534185">"Não obrigatório"</item>
+    <item msgid="1264673582354896949">"Em andamento"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ro/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ro/strings.xml
new file mode 100644
index 0000000..a84085a
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ro/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Setări"</string>
+    <string name="server_running" msgid="2780193626090379172">"Serverul rulează..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Oprește serverul"</string>
+    <string name="server_down" msgid="1030249207496490556">"Serverul nu funcționează"</string>
+    <string name="start_server" msgid="3878573341408591975">"Pornește serverul"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Dezactivat"</item>
+    <item msgid="3193389681837907872">"Activat"</item>
+    <item msgid="3124590179479393815">"Incompatibil"</item>
+    <item msgid="1606753456265236910">"Configurarea accesului pentru utilizatori"</item>
+    <item msgid="3930807209231347454">"Inclus"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Nu a fost configurat accesul"</item>
+    <item msgid="7598231293776486217">"A fost configurat accesul"</item>
+    <item msgid="3720547957514534185">"Nu este obligatoriu"</item>
+    <item msgid="1264673582354896949">"În desfășurare"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ru/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ru/strings.xml
new file mode 100644
index 0000000..1242f96
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ru/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Настройки"</string>
+    <string name="server_running" msgid="2780193626090379172">"Сервер работает…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Остановить сервер"</string>
+    <string name="server_down" msgid="1030249207496490556">"Сервер не работает"</string>
+    <string name="start_server" msgid="3878573341408591975">"Запустить сервер"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Неактивно"</item>
+    <item msgid="3193389681837907872">"Активно"</item>
+    <item msgid="3124590179479393815">"Несовместимо"</item>
+    <item msgid="1606753456265236910">"Инициализация"</item>
+    <item msgid="3930807209231347454">"Включено"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Не подготовлено"</item>
+    <item msgid="7598231293776486217">"Подготовлено"</item>
+    <item msgid="3720547957514534185">"Необязательно"</item>
+    <item msgid="1264673582354896949">"На рассмотрении"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-si/strings.xml b/testapps/TestServerApp/app/src/main/res/values-si/strings.xml
new file mode 100644
index 0000000..47dba95
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-si/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"සැකසීම්"</string>
+    <string name="server_running" msgid="2780193626090379172">"සේවාදායකය ධාවනය වේ..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"සේවාදායකය නවත්වන්න"</string>
+    <string name="server_down" msgid="1030249207496490556">"සේවාදායකය බිඳ වැටී ඇත"</string>
+    <string name="start_server" msgid="3878573341408591975">"සේවාදායකය අරඹන්න"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"අබලයි"</item>
+    <item msgid="3193389681837907872">"සබලයි"</item>
+    <item msgid="3124590179479393815">"නොගැළපෙන"</item>
+    <item msgid="1606753456265236910">"ප්‍රතිපාදනය කරමින්"</item>
+    <item msgid="3930807209231347454">"ඇතුළත් වේ"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"ප්‍රතිපාදනය කර නැත"</item>
+    <item msgid="7598231293776486217">"ප්‍රතිපාදන ලත්"</item>
+    <item msgid="3720547957514534185">"අවශ්‍ය නැත"</item>
+    <item msgid="1264673582354896949">"ප්‍රගතියේ පවතී"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sk/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sk/strings.xml
new file mode 100644
index 0000000..ca4bd55
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Nastavenia"</string>
+    <string name="server_running" msgid="2780193626090379172">"Server je spustený…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Zastaviť server"</string>
+    <string name="server_down" msgid="1030249207496490556">"Server je nedostupný"</string>
+    <string name="start_server" msgid="3878573341408591975">"Spustiť server"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Vypnuté"</item>
+    <item msgid="3193389681837907872">"Zapnuté"</item>
+    <item msgid="3124590179479393815">"Nekompatibilné"</item>
+    <item msgid="1606753456265236910">"Poskytovanie"</item>
+    <item msgid="3930807209231347454">"Zahrnuté"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Neposkytuje sa"</item>
+    <item msgid="7598231293776486217">"Poskytuje sa"</item>
+    <item msgid="3720547957514534185">"Nepovinné"</item>
+    <item msgid="1264673582354896949">"Spracúva sa"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sl/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sl/strings.xml
new file mode 100644
index 0000000..570e6e2
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Nastavitve"</string>
+    <string name="server_running" msgid="2780193626090379172">"Strežnik se izvaja ..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Ustavi strežnik"</string>
+    <string name="server_down" msgid="1030249207496490556">"Strežnik ne deluje"</string>
+    <string name="start_server" msgid="3878573341408591975">"Zaženi strežnik"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Onemogočeno"</item>
+    <item msgid="3193389681837907872">"Omogočeno"</item>
+    <item msgid="3124590179479393815">"Nezdružljivo"</item>
+    <item msgid="1606753456265236910">"Omogočanje uporabe"</item>
+    <item msgid="3930807209231347454">"Vključeno"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Uporaba ni omogočena"</item>
+    <item msgid="7598231293776486217">"Omogočeno"</item>
+    <item msgid="3720547957514534185">"Ni zahtevano"</item>
+    <item msgid="1264673582354896949">"Poteka"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sq/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sq/strings.xml
new file mode 100644
index 0000000..fbcd4da
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sq/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Cilësimet"</string>
+    <string name="server_running" msgid="2780193626090379172">"Serveri është në ekzekutim..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Ndalo serverin"</string>
+    <string name="server_down" msgid="1030249207496490556">"Serveri nuk po funksionon"</string>
+    <string name="start_server" msgid="3878573341408591975">"Nis serverin"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Çaktivizuar"</item>
+    <item msgid="3193389681837907872">"Aktivizuar"</item>
+    <item msgid="3124590179479393815">"I papërputhshëm"</item>
+    <item msgid="1606753456265236910">"Po përgatitet"</item>
+    <item msgid="3930807209231347454">"Përfshirë"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Nuk është përgatitur"</item>
+    <item msgid="7598231293776486217">"Përgatitur"</item>
+    <item msgid="3720547957514534185">"Nuk kërkohet"</item>
+    <item msgid="1264673582354896949">"Në vazhdim"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sr/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sr/strings.xml
new file mode 100644
index 0000000..e8fc322
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Подешавања"</string>
+    <string name="server_running" msgid="2780193626090379172">"Сервер је покренут…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Заустави сервер"</string>
+    <string name="server_down" msgid="1030249207496490556">"Сервер је пао"</string>
+    <string name="start_server" msgid="3878573341408591975">"Покрени сервер"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Онемогућено"</item>
+    <item msgid="3193389681837907872">"Омогућено"</item>
+    <item msgid="3124590179479393815">"Некомпатибилно"</item>
+    <item msgid="1606753456265236910">"Додељује се"</item>
+    <item msgid="3930807209231347454">"Уврштено"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Није додељено"</item>
+    <item msgid="7598231293776486217">"Додељено"</item>
+    <item msgid="3720547957514534185">"Није обавезно"</item>
+    <item msgid="1264673582354896949">"У току"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sv/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sv/strings.xml
new file mode 100644
index 0000000..8470695
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sv/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Inställningar"</string>
+    <string name="server_running" msgid="2780193626090379172">"Servern körs …"</string>
+    <string name="stop_server" msgid="6192029827529013598">"Stoppa servern"</string>
+    <string name="server_down" msgid="1030249207496490556">"Servern ligger nere"</string>
+    <string name="start_server" msgid="3878573341408591975">"Starta servern"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Inaktiverad"</item>
+    <item msgid="3193389681837907872">"Aktiverad"</item>
+    <item msgid="3124590179479393815">"Ej kompatibel"</item>
+    <item msgid="1606753456265236910">"Certifikaten installeras"</item>
+    <item msgid="3930807209231347454">"Inkluderat"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Ej administrerad"</item>
+    <item msgid="7598231293776486217">"Administrerad"</item>
+    <item msgid="3720547957514534185">"Ej obligatorisk"</item>
+    <item msgid="1264673582354896949">"Pågår"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-sw/strings.xml b/testapps/TestServerApp/app/src/main/res/values-sw/strings.xml
new file mode 100644
index 0000000..c1155b8
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-sw/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Mipangilio"</string>
+    <string name="server_running" msgid="2780193626090379172">"Seva inatekeleza..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Sitisha Seva"</string>
+    <string name="server_down" msgid="1030249207496490556">"Seva iko chini"</string>
+    <string name="start_server" msgid="3878573341408591975">"Washa Seva"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Imezimwa"</item>
+    <item msgid="3193389681837907872">"Imewashwa"</item>
+    <item msgid="3124590179479393815">"Haioani"</item>
+    <item msgid="1606753456265236910">"Inaandaa"</item>
+    <item msgid="3930807209231347454">"Imejumuishwa"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Haijatolewa"</item>
+    <item msgid="7598231293776486217">"Imetolewa"</item>
+    <item msgid="3720547957514534185">"Haihitajiki"</item>
+    <item msgid="1264673582354896949">"Inaendelea"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ta/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ta/strings.xml
new file mode 100644
index 0000000..adad427
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ta/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"அமைப்புகள்"</string>
+    <string name="server_running" msgid="2780193626090379172">"சேவையகம் இயக்கத்தில் உள்ளது..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"சேவையகத்தை நிறுத்து"</string>
+    <string name="server_down" msgid="1030249207496490556">"சேவையகம் இயங்கவில்லை"</string>
+    <string name="start_server" msgid="3878573341408591975">"சேவையகத்தைத் தொடங்கு"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"முடக்கப்பட்டது"</item>
+    <item msgid="3193389681837907872">"இயக்கப்பட்டது"</item>
+    <item msgid="3124590179479393815">"இணக்கமற்றது"</item>
+    <item msgid="1606753456265236910">"அமைக்கிறது"</item>
+    <item msgid="3930807209231347454">"சேர்க்கப்பட்டது"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"அமைக்கப்படவில்லை"</item>
+    <item msgid="7598231293776486217">"அமைக்கப்பட்டது"</item>
+    <item msgid="3720547957514534185">"அவசியமில்லை"</item>
+    <item msgid="1264673582354896949">"செயலிலுள்ளது"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-te/strings.xml b/testapps/TestServerApp/app/src/main/res/values-te/strings.xml
new file mode 100644
index 0000000..39cc2fe
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-te/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"టెస్ట్‌సర్వర్‌యాప్"</string>
+    <string name="action_settings" msgid="1335152369747372374">"సెట్టింగ్‌లు"</string>
+    <string name="server_running" msgid="2780193626090379172">"సర్వర్ రన్ అవుతోంది..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"సర్వర్‌ను ఆపివేయండి"</string>
+    <string name="server_down" msgid="1030249207496490556">"సర్వర్ డౌన్ అయింది"</string>
+    <string name="start_server" msgid="3878573341408591975">"సర్వర్‌ను ప్రారంభించండి"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"డిజేబుల్ చేయబడింది"</item>
+    <item msgid="3193389681837907872">"ఎనేబుల్ చేయబడింది"</item>
+    <item msgid="3124590179479393815">"అనుకూలంగా లేదు"</item>
+    <item msgid="1606753456265236910">"కేటాయిస్తోంది"</item>
+    <item msgid="3930807209231347454">"చేర్చబడింది"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"కేటాయించలేదు"</item>
+    <item msgid="7598231293776486217">"కేటాయించబడింది"</item>
+    <item msgid="3720547957514534185">"అవసరం లేదు"</item>
+    <item msgid="1264673582354896949">"ప్రోగ్రెస్‌లో ఉంది"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-th/strings.xml b/testapps/TestServerApp/app/src/main/res/values-th/strings.xml
new file mode 100644
index 0000000..78232ca
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-th/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"แอปเซิร์ฟเวอร์ทดสอบ"</string>
+    <string name="action_settings" msgid="1335152369747372374">"การตั้งค่า"</string>
+    <string name="server_running" msgid="2780193626090379172">"เซิร์ฟเวอร์กำลังทำงาน..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"หยุดเซิร์ฟเวอร์"</string>
+    <string name="server_down" msgid="1030249207496490556">"เซิร์ฟเวอร์ขัดข้อง"</string>
+    <string name="start_server" msgid="3878573341408591975">"เริ่มต้นเซิร์ฟเวอร์"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"ปิดใช้อยู่"</item>
+    <item msgid="3193389681837907872">"เปิดใช้อยู่"</item>
+    <item msgid="3124590179479393815">"ใช้งานร่วมกันไม่ได้"</item>
+    <item msgid="1606753456265236910">"การจัดสรร"</item>
+    <item msgid="3930807209231347454">"รวมอยู่ด้วย"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"ยังไม่ได้จัดสรร"</item>
+    <item msgid="7598231293776486217">"จัดสรรแล้ว"</item>
+    <item msgid="3720547957514534185">"ไม่บังคับ"</item>
+    <item msgid="1264673582354896949">"อยู่ในระหว่างดำเนินการ"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-tl/strings.xml b/testapps/TestServerApp/app/src/main/res/values-tl/strings.xml
deleted file mode 100644
index 0133ed5..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-tl/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"Mga Setting"</string>
-    <string name="server_running" msgid="2780193626090379172">"Gumagana ang server..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"Patigilin ang Server"</string>
-    <string name="server_down" msgid="1030249207496490556">"Down ang server"</string>
-    <string name="start_server" msgid="3878573341408591975">"Simulan ang Server"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"Naka-disable"</item>
-    <item msgid="3193389681837907872">"Naka-enable"</item>
-    <item msgid="3124590179479393815">"Hindi Compatible"</item>
-    <item msgid="1606753456265236910">"Provisioning"</item>
-    <item msgid="3930807209231347454">"Kasama"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"Hindi Naka-provision"</item>
-    <item msgid="7598231293776486217">"Naka-provision"</item>
-    <item msgid="3720547957514534185">"Hindi Kinakailangan"</item>
-    <item msgid="1264673582354896949">"Isinasagawa"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-tr/strings.xml b/testapps/TestServerApp/app/src/main/res/values-tr/strings.xml
deleted file mode 100644
index d5950a1..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-tr/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"Ayarlar"</string>
-    <string name="server_running" msgid="2780193626090379172">"Sunucu çalışıyor..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"Sunucuyu Durdur"</string>
-    <string name="server_down" msgid="1030249207496490556">"Sunucu kapalı"</string>
-    <string name="start_server" msgid="3878573341408591975">"Sunucuyu Başlat"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"Devre dışı"</item>
-    <item msgid="3193389681837907872">"Etkin"</item>
-    <item msgid="3124590179479393815">"Uyumsuz"</item>
-    <item msgid="1606753456265236910">"Temel Hazırlık Yapılıyor"</item>
-    <item msgid="3930807209231347454">"Dahil"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"Temel Hazırlığı Yapılmadı"</item>
-    <item msgid="7598231293776486217">"Temel Hazırlığı Yapıldı"</item>
-    <item msgid="3720547957514534185">"Gerekli Değil"</item>
-    <item msgid="1264673582354896949">"Devam Ediyor"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-uk/strings.xml b/testapps/TestServerApp/app/src/main/res/values-uk/strings.xml
deleted file mode 100644
index 0899971..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-uk/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"Налаштування"</string>
-    <string name="server_running" msgid="2780193626090379172">"Сервер працює…"</string>
-    <string name="stop_server" msgid="6192029827529013598">"Зупинити сервер"</string>
-    <string name="server_down" msgid="1030249207496490556">"Сервер не працює"</string>
-    <string name="start_server" msgid="3878573341408591975">"Запустити сервер"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"Вимкнено"</item>
-    <item msgid="3193389681837907872">"Увімкнено"</item>
-    <item msgid="3124590179479393815">"Несумісні"</item>
-    <item msgid="1606753456265236910">"Надання"</item>
-    <item msgid="3930807209231347454">"Включено"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"Не надано"</item>
-    <item msgid="7598231293776486217">"Надано"</item>
-    <item msgid="3720547957514534185">"Необов’язково"</item>
-    <item msgid="1264673582354896949">"Виконується"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-ur/strings.xml b/testapps/TestServerApp/app/src/main/res/values-ur/strings.xml
new file mode 100644
index 0000000..5df75a7
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-ur/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"ترتیبات"</string>
+    <string name="server_running" msgid="2780193626090379172">"سرور چل رہا ہے..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"سرور روکیں"</string>
+    <string name="server_down" msgid="1030249207496490556">"سرور ڈاؤن ہے"</string>
+    <string name="start_server" msgid="3878573341408591975">"سرور شروع کریں"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"غیر فعال ہے"</item>
+    <item msgid="3193389681837907872">"فعال ہے"</item>
+    <item msgid="3124590179479393815">"غیر مطابقت پذیر"</item>
+    <item msgid="1606753456265236910">"فراہمی"</item>
+    <item msgid="3930807209231347454">"شامل ہے"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"فراہم نہیں کیا گا"</item>
+    <item msgid="7598231293776486217">"فراہم کیا گیا"</item>
+    <item msgid="3720547957514534185">"غیر مطلوب"</item>
+    <item msgid="1264673582354896949">"پیشرفت میں ہے"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-uz/strings.xml b/testapps/TestServerApp/app/src/main/res/values-uz/strings.xml
deleted file mode 100644
index bed928c..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-uz/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"Sozlamalar"</string>
-    <string name="server_running" msgid="2780193626090379172">"Server ishlayapti..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"Serverni to‘xtatish"</string>
-    <string name="server_down" msgid="1030249207496490556">"Server ishlamayapti"</string>
-    <string name="start_server" msgid="3878573341408591975">"Serverni ishga tushirish"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"Yoqilmagan"</item>
-    <item msgid="3193389681837907872">"Yoqilgan"</item>
-    <item msgid="3124590179479393815">"Mos emas"</item>
-    <item msgid="1606753456265236910">"Sinxronlanmoqda"</item>
-    <item msgid="3930807209231347454">"Kiritilgan"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"Taqdim etilmagan"</item>
-    <item msgid="7598231293776486217">"Taqdim etilgan"</item>
-    <item msgid="3720547957514534185">"Majburiy emas"</item>
-    <item msgid="1264673582354896949">"Bajarilmoqda"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-vi/strings.xml b/testapps/TestServerApp/app/src/main/res/values-vi/strings.xml
new file mode 100644
index 0000000..78bd3d8
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-vi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Cài đặt"</string>
+    <string name="server_running" msgid="2780193626090379172">"Máy chủ đang chạy..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Dừng máy chủ"</string>
+    <string name="server_down" msgid="1030249207496490556">"Máy chủ không hoạt động"</string>
+    <string name="start_server" msgid="3878573341408591975">"Khởi động máy chủ"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Đã tắt"</item>
+    <item msgid="3193389681837907872">"Đã bật"</item>
+    <item msgid="3124590179479393815">"Không tương thích"</item>
+    <item msgid="1606753456265236910">"Đang cung cấp"</item>
+    <item msgid="3930807209231347454">"Đã bao gồm"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Chưa được cung cấp"</item>
+    <item msgid="7598231293776486217">"Đã cung cấp"</item>
+    <item msgid="3720547957514534185">"Không bắt buộc"</item>
+    <item msgid="1264673582354896949">"Đang xử lý"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-zh-rCN/strings.xml b/testapps/TestServerApp/app/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..6e26819
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"设置"</string>
+    <string name="server_running" msgid="2780193626090379172">"服务器正在运行…"</string>
+    <string name="stop_server" msgid="6192029827529013598">"停止服务器"</string>
+    <string name="server_down" msgid="1030249207496490556">"服务器出现故障"</string>
+    <string name="start_server" msgid="3878573341408591975">"启动服务器"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"已停用"</item>
+    <item msgid="3193389681837907872">"已启用"</item>
+    <item msgid="3124590179479393815">"不兼容"</item>
+    <item msgid="1606753456265236910">"正在配置"</item>
+    <item msgid="3930807209231347454">"已包含"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"未配置"</item>
+    <item msgid="7598231293776486217">"已配置"</item>
+    <item msgid="3720547957514534185">"不需要"</item>
+    <item msgid="1264673582354896949">"进行中"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-zh-rHK/strings.xml b/testapps/TestServerApp/app/src/main/res/values-zh-rHK/strings.xml
deleted file mode 100644
index a9ab91c..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"設定"</string>
-    <string name="server_running" msgid="2780193626090379172">"伺服器運作中…"</string>
-    <string name="stop_server" msgid="6192029827529013598">"停止伺服器"</string>
-    <string name="server_down" msgid="1030249207496490556">"伺服器故障"</string>
-    <string name="start_server" msgid="3878573341408591975">"啟動伺服器"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"已停用"</item>
-    <item msgid="3193389681837907872">"已啟用"</item>
-    <item msgid="3124590179479393815">"不兼容"</item>
-    <item msgid="1606753456265236910">"正在佈建"</item>
-    <item msgid="3930807209231347454">"已包括"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"未佈建"</item>
-    <item msgid="7598231293776486217">"已佈建"</item>
-    <item msgid="3720547957514534185">"非必填"</item>
-    <item msgid="1264673582354896949">"進行中"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-zh-rTW/strings.xml b/testapps/TestServerApp/app/src/main/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 8b32974..0000000
--- a/testapps/TestServerApp/app/src/main/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2894617184221823208">"TestServerApp"</string>
-    <string name="action_settings" msgid="1335152369747372374">"設定"</string>
-    <string name="server_running" msgid="2780193626090379172">"伺服器正在運作中..."</string>
-    <string name="stop_server" msgid="6192029827529013598">"停止伺服器"</string>
-    <string name="server_down" msgid="1030249207496490556">"伺服器發生問題"</string>
-    <string name="start_server" msgid="3878573341408591975">"啟動伺服器"</string>
-  <string-array name="entitlement_status">
-    <item msgid="5560300387618996934">"已停用"</item>
-    <item msgid="3193389681837907872">"已啟用"</item>
-    <item msgid="3124590179479393815">"不相容"</item>
-    <item msgid="1606753456265236910">"佈建中"</item>
-    <item msgid="3930807209231347454">"已納入"</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item msgid="3486273747926710021">"尚未佈建"</item>
-    <item msgid="7598231293776486217">"已佈建"</item>
-    <item msgid="3720547957514534185">"非必要"</item>
-    <item msgid="1264673582354896949">"進行中"</item>
-  </string-array>
-</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values-zu/strings.xml b/testapps/TestServerApp/app/src/main/res/values-zu/strings.xml
new file mode 100644
index 0000000..fbb6262
--- /dev/null
+++ b/testapps/TestServerApp/app/src/main/res/values-zu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name" msgid="2894617184221823208">"I-TestServerApp"</string>
+    <string name="action_settings" msgid="1335152369747372374">"Amasethingi"</string>
+    <string name="server_running" msgid="2780193626090379172">"Iseva iyaqhubeka..."</string>
+    <string name="stop_server" msgid="6192029827529013598">"Misa Iseva"</string>
+    <string name="server_down" msgid="1030249207496490556">"Iseva iphansi"</string>
+    <string name="start_server" msgid="3878573341408591975">"Qalisa Iseva"</string>
+  <string-array name="entitlement_status">
+    <item msgid="5560300387618996934">"Kukhutshaziwe"</item>
+    <item msgid="3193389681837907872">"Kunikwe amandla"</item>
+    <item msgid="3124590179479393815">"Ayisebenzisani"</item>
+    <item msgid="1606753456265236910">"Iyahlinzeka"</item>
+    <item msgid="3930807209231347454">"Kuhlanganisiwe"</item>
+  </string-array>
+  <string-array name="provision_status">
+    <item msgid="3486273747926710021">"Akulungiselelwanga"</item>
+    <item msgid="7598231293776486217">"Kulungiselelwe"</item>
+    <item msgid="3720547957514534185">"Akudingekile"</item>
+    <item msgid="1264673582354896949">"Kuyaqhubeka"</item>
+  </string-array>
+</resources>
diff --git a/testapps/TestServerApp/app/src/main/res/values/colors.xml b/testapps/TestServerApp/app/src/main/res/values/colors.xml
deleted file mode 100644
index 09837df..0000000
--- a/testapps/TestServerApp/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-  <color name="purple_200">#FFBB86FC</color>
-  <color name="purple_500">#FF6200EE</color>
-  <color name="purple_700">#FF3700B3</color>
-  <color name="teal_200">#FF03DAC5</color>
-  <color name="teal_700">#FF018786</color>
-  <color name="black">#FF000000</color>
-  <color name="white">#FFFFFFFF</color>
-</resources>
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/main/res/values/strings.xml b/testapps/TestServerApp/app/src/main/res/values/strings.xml
deleted file mode 100644
index 0d1efa8..0000000
--- a/testapps/TestServerApp/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<resources>
-  <string name="app_name">TestServerApp</string>
-  <string name="action_settings">Settings</string>
-  <string name="server_running">Server is running...</string>
-  <string name="stop_server">Stop Server</string>
-  <string name="server_down">Server is down</string>
-  <string name="start_server">Start Server</string>
-  <string-array name="entitlement_status">
-    <item>Disabled</item>
-    <item>Enabled</item>
-    <item>Incompatible</item>
-    <item>Provisioning</item>
-    <item>Included</item>
-  </string-array>
-  <string-array name="provision_status">
-    <item>Not Provisioned</item>
-    <item>Provisioned</item>
-    <item>Not Required</item>
-    <item>In Progress</item>
-  </string-array>
-</resources>
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/main/res/xml/backup_rules.xml b/testapps/TestServerApp/app/src/main/res/xml/backup_rules.xml
deleted file mode 100644
index 9b42d90..0000000
--- a/testapps/TestServerApp/app/src/main/res/xml/backup_rules.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-   Sample backup rules file; uncomment and customize as necessary.
-   See https://developer.android.com/guide/topics/data/autobackup
-   for details.
-   Note: This file is ignored for devices older that API 31
-   See https://developer.android.com/about/versions/12/backup-restore
--->
-<full-backup-content>
-  <!--
-   <include domain="sharedpref" path="."/>
-   <exclude domain="sharedpref" path="device.xml"/>
--->
-</full-backup-content>
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/main/res/xml/data_extraction_rules.xml b/testapps/TestServerApp/app/src/main/res/xml/data_extraction_rules.xml
deleted file mode 100644
index c6c3bb0..0000000
--- a/testapps/TestServerApp/app/src/main/res/xml/data_extraction_rules.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-   Sample data extraction rules file; uncomment and customize as necessary.
-   See https://developer.android.com/about/versions/12/backup-restore#xml-changes
-   for details.
--->
-<data-extraction-rules>
-  <cloud-backup>
-    <!-- TODO: Use <include> and <exclude> to control what is backed up.
-        <include .../>
-        <exclude .../>
-        -->
-  </cloud-backup>
-  <!--
-    <device-transfer>
-        <include .../>
-        <exclude .../>
-    </device-transfer>
-    -->
-</data-extraction-rules>
\ No newline at end of file
diff --git a/testapps/TestServerApp/app/src/test/java/com/google/android/testserverapp/ExampleUnitTest.java b/testapps/TestServerApp/app/src/test/java/com/google/android/testserverapp/ExampleUnitTest.java
deleted file mode 100644
index 88a8c5a..0000000
--- a/testapps/TestServerApp/app/src/test/java/com/google/android/testserverapp/ExampleUnitTest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.google.android.testserverapp;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
- */
-public class ExampleUnitTest {
-
-  @Test
-  public void addition_isCorrect() {
-    assertEquals(4, 2 + 2);
-  }
-}
\ No newline at end of file
diff --git a/testapps/TestServerApp/build.gradle b/testapps/TestServerApp/build.gradle
deleted file mode 100644
index 90f9008..0000000
--- a/testapps/TestServerApp/build.gradle
+++ /dev/null
@@ -1,5 +0,0 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-plugins {
-    id 'com.android.application' version '7.3.0' apply false
-    id 'com.android.library' version '7.3.0' apply false
-}
\ No newline at end of file
diff --git a/testapps/TestServerApp/gradle.properties b/testapps/TestServerApp/gradle.properties
deleted file mode 100644
index 3e927b1..0000000
--- a/testapps/TestServerApp/gradle.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-# Project-wide Gradle settings.
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
-# AndroidX package structure to make it clearer which packages are bundled with the
-# Android operating system, and which are packaged with your app's APK
-# https://developer.android.com/topic/libraries/support-library/androidx-rn
-android.useAndroidX=true
-# Enables namespacing of each library's R class so that its R class includes only the
-# resources declared in the library itself and none from the library's dependencies,
-# thereby reducing the size of the R class for that library
-android.nonTransitiveRClass=true
\ No newline at end of file
diff --git a/testapps/TestServerApp/gradle/wrapper/gradle-wrapper.jar b/testapps/TestServerApp/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index e708b1c..0000000
--- a/testapps/TestServerApp/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/TestServerApp/gradle/wrapper/gradle-wrapper.properties b/testapps/TestServerApp/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index e12f4cd..0000000
--- a/testapps/TestServerApp/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Sat Nov 05 01:06:49 UTC 2022
-distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
-distributionPath=wrapper/dists
-zipStorePath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
diff --git a/testapps/TestServerApp/gradlew b/testapps/TestServerApp/gradlew
deleted file mode 100755
index 4f906e0..0000000
--- a/testapps/TestServerApp/gradlew
+++ /dev/null
@@ -1,185 +0,0 @@
-#!/usr/bin/env sh
-
-#
-# Copyright 2015 the original author or authors.
-#
-# 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
-#
-#      https://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.
-#
-
-##############################################################################
-##
-##  Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn () {
-    echo "$*"
-}
-
-die () {
-    echo
-    echo "$*"
-    echo
-    exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "`uname`" in
-  CYGWIN* )
-    cygwin=true
-    ;;
-  Darwin* )
-    darwin=true
-    ;;
-  MINGW* )
-    msys=true
-    ;;
-  NONSTOP* )
-    nonstop=true
-    ;;
-esac
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-        # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-        JAVACMD="$JAVA_HOME/bin/java"
-    fi
-    if [ ! -x "$JAVACMD" ] ; then
-        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-    fi
-else
-    JAVACMD="java"
-    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
-    MAX_FD_LIMIT=`ulimit -H -n`
-    if [ $? -eq 0 ] ; then
-        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
-            MAX_FD="$MAX_FD_LIMIT"
-        fi
-        ulimit -n $MAX_FD
-        if [ $? -ne 0 ] ; then
-            warn "Could not set maximum file descriptor limit: $MAX_FD"
-        fi
-    else
-        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
-    fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
-    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin or MSYS, switch paths to Windows format before running java
-if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
-    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
-    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
-    JAVACMD=`cygpath --unix "$JAVACMD"`
-
-    # We build the pattern for arguments to be converted via cygpath
-    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
-    SEP=""
-    for dir in $ROOTDIRSRAW ; do
-        ROOTDIRS="$ROOTDIRS$SEP$dir"
-        SEP="|"
-    done
-    OURCYGPATTERN="(^($ROOTDIRS))"
-    # Add a user-defined pattern to the cygpath arguments
-    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
-        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
-    fi
-    # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    i=0
-    for arg in "$@" ; do
-        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
-        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
-
-        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
-            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
-        else
-            eval `echo args$i`="\"$arg\""
-        fi
-        i=`expr $i + 1`
-    done
-    case $i in
-        0) set -- ;;
-        1) set -- "$args0" ;;
-        2) set -- "$args0" "$args1" ;;
-        3) set -- "$args0" "$args1" "$args2" ;;
-        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
-    esac
-fi
-
-# Escape application args
-save () {
-    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
-    echo " "
-}
-APP_ARGS=`save "$@"`
-
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-
-exec "$JAVACMD" "$@"
diff --git a/testapps/TestServerApp/gradlew.bat b/testapps/TestServerApp/gradlew.bat
deleted file mode 100644
index ac1b06f..0000000
--- a/testapps/TestServerApp/gradlew.bat
+++ /dev/null
@@ -1,89 +0,0 @@
-@rem

-@rem Copyright 2015 the original author or authors.

-@rem

-@rem Licensed under the Apache License, Version 2.0 (the "License");

-@rem you may not use this file except in compliance with the License.

-@rem You may obtain a copy of the License at

-@rem

-@rem      https://www.apache.org/licenses/LICENSE-2.0

-@rem

-@rem Unless required by applicable law or agreed to in writing, software

-@rem distributed under the License is distributed on an "AS IS" BASIS,

-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@rem See the License for the specific language governing permissions and

-@rem limitations under the License.

-@rem

-

-@if "%DEBUG%" == "" @echo off

-@rem ##########################################################################

-@rem

-@rem  Gradle startup script for Windows

-@rem

-@rem ##########################################################################

-

-@rem Set local scope for the variables with windows NT shell

-if "%OS%"=="Windows_NT" setlocal

-

-set DIRNAME=%~dp0

-if "%DIRNAME%" == "" set DIRNAME=.

-set APP_BASE_NAME=%~n0

-set APP_HOME=%DIRNAME%

-

-@rem Resolve any "." and ".." in APP_HOME to make it shorter.

-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi

-

-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"

-

-@rem Find java.exe

-if defined JAVA_HOME goto findJavaFromJavaHome

-

-set JAVA_EXE=java.exe

-%JAVA_EXE% -version >NUL 2>&1

-if "%ERRORLEVEL%" == "0" goto execute

-

-echo.

-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

-echo.

-echo Please set the JAVA_HOME variable in your environment to match the

-echo location of your Java installation.

-

-goto fail

-

-:findJavaFromJavaHome

-set JAVA_HOME=%JAVA_HOME:"=%

-set JAVA_EXE=%JAVA_HOME%/bin/java.exe

-

-if exist "%JAVA_EXE%" goto execute

-

-echo.

-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%

-echo.

-echo Please set the JAVA_HOME variable in your environment to match the

-echo location of your Java installation.

-

-goto fail

-

-:execute

-@rem Setup the command line

-

-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

-

-

-@rem Execute Gradle

-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*

-

-:end

-@rem End local scope for the variables with windows NT shell

-if "%ERRORLEVEL%"=="0" goto mainEnd

-

-:fail

-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of

-rem the _cmd.exe /c_ return code!

-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1

-exit /b 1

-

-:mainEnd

-if "%OS%"=="Windows_NT" endlocal

-

-:omega

diff --git a/testapps/TestServerApp/settings.gradle b/testapps/TestServerApp/settings.gradle
deleted file mode 100644
index a6a2846..0000000
--- a/testapps/TestServerApp/settings.gradle
+++ /dev/null
@@ -1,16 +0,0 @@
-pluginManagement {
-    repositories {
-        gradlePluginPortal()
-        google()
-        mavenCentral()
-    }
-}
-dependencyResolutionManagement {
-    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
-    repositories {
-        google()
-        mavenCentral()
-    }
-}
-rootProject.name = "TestServerApp"
-include ':app'
diff --git a/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/PrioritizeLatency.java b/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/PrioritizeLatency.java
index 9dc4732..0f120f4 100644
--- a/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/PrioritizeLatency.java
+++ b/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/PrioritizeLatency.java
@@ -130,12 +130,18 @@
         mPing.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View view) {
+                Log.d(LOG_TAG, "Clicking Ping button");
                 if (mNetwork != null) {
-                    try {
-                        new RequestTask().ping(mNetwork);
-                    } catch (Exception e) {
-                        Log.e(LOG_TAG, "Exception at ping: " + e);
-                    }
+                    mFixedThreadPool.execute(() -> {
+                        try {
+                            RequestTask requestTask = new RequestTask();
+                            requestTask.ping(mNetwork);
+                            updateResultTextView("Result: Ping is done successfully!");
+                        } catch (Exception e) {
+                            Log.e(LOG_TAG, "Exception at ping: " + e);
+                            updateResultTextView("Result: Got exception with ping!!!");
+                        }
+                    });
                 }
             }
         });
@@ -149,9 +155,7 @@
                 public void onAvailable(final Network network) {
                     Log.d(LOG_TAG, "onAvailable + " + network);
                     mNetwork = network;
-                    mPing.setEnabled(true);
-                    mNetworkRequestRelease.setText(R.string.release_network);
-                    mResultTextView.setText(R.string.network_available);
+                    updateUIOnNetworkAvailable();
                 }
             };
             NetworkRequest.Builder builder = new NetworkRequest.Builder();
@@ -246,6 +250,17 @@
         });
     }
 
+    private void updateUIOnNetworkAvailable() {
+        getActivity().runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mPing.setEnabled(true);
+                mNetworkRequestRelease.setText(R.string.release_network);
+                mResultTextView.setText(R.string.network_available);
+            }
+        });
+    }
+
     private String purchasePremiumResultToText(int result) {
         switch (result) {
             case PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS:
diff --git a/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/RequestTask.java b/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/RequestTask.java
index 1521a14..569c066 100644
--- a/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/RequestTask.java
+++ b/testapps/TestSliceApp/app/src/main/java/com/google/android/sample/testsliceapp/RequestTask.java
@@ -19,11 +19,11 @@
 import android.os.AsyncTask;
 import android.util.Log;
 
-import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.util.Scanner;
 
 class RequestTask extends AsyncTask<Network, Integer, Integer> {
     protected Integer doInBackground(Network... network) {
@@ -59,7 +59,8 @@
         try {
             InputStream inputStream = connection.getInputStream();
             Log.d("httpGet", "httpUrl + " + httpUrl);
-            return new BufferedInputStream(inputStream).toString();
+            Scanner scanner = new Scanner(inputStream).useDelimiter("\\A");
+            return scanner.hasNext() ? scanner.next() : "";
         } finally {
             connection.disconnect();
         }
diff --git a/testapps/TestSliceApp/app/src/main/res/values-sw/strings.xml b/testapps/TestSliceApp/app/src/main/res/values-sw/strings.xml
index f79ee6f..c01aa3a 100644
--- a/testapps/TestSliceApp/app/src/main/res/values-sw/strings.xml
+++ b/testapps/TestSliceApp/app/src/main/res/values-sw/strings.xml
@@ -3,36 +3,20 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_name" msgid="1265450418387661962">"TestSliceApp"</string>
     <string name="hello_blank_fragment" msgid="1245093642770491175">"Kipande cha salamu kisichokuwa na kitu"</string>
-    <!-- no translation found for request_network (8945235490804849914) -->
-    <skip />
-    <!-- no translation found for release_network (174252378593535238) -->
-    <skip />
-    <!-- no translation found for ping (7890607576220714932) -->
-    <skip />
-    <!-- no translation found for result_prefix (3522796186427501399) -->
-    <skip />
-    <!-- no translation found for latency_title (963052613947017009) -->
-    <skip />
-    <!-- no translation found for bw_title (3902162973688221344) -->
-    <skip />
-    <!-- no translation found for cbs_title (5234410535569935600) -->
-    <skip />
-    <!-- no translation found for purchase (7843181995697372128) -->
-    <skip />
-    <!-- no translation found for network_available (4780293262690730734) -->
-    <skip />
-    <!-- no translation found for network_requested (5646123922691865991) -->
-    <skip />
-    <!-- no translation found for network_released (2992280481133877025) -->
-    <skip />
-    <!-- no translation found for network_release_failed (256471231420029151) -->
-    <skip />
-    <!-- no translation found for purchase_exception (8876841120055716671) -->
-    <skip />
-    <!-- no translation found for purchase_empty_result (7497824191649973928) -->
-    <skip />
-    <!-- no translation found for premium_not_available (7346368693802644748) -->
-    <skip />
-    <!-- no translation found for purchase_in_progress (5450288183685032424) -->
-    <skip />
+    <string name="request_network" msgid="8945235490804849914">"Request Network"</string>
+    <string name="release_network" msgid="174252378593535238">"Release Network"</string>
+    <string name="ping" msgid="7890607576220714932">"Ping"</string>
+    <string name="result_prefix" msgid="3522796186427501399">"Result:"</string>
+    <string name="latency_title" msgid="963052613947017009">"Prioritize Latency"</string>
+    <string name="bw_title" msgid="3902162973688221344">"Prioritize Bandwidth"</string>
+    <string name="cbs_title" msgid="5234410535569935600">"CBS"</string>
+    <string name="purchase" msgid="7843181995697372128">"Purchase Network Premium"</string>
+    <string name="network_available" msgid="4780293262690730734">"Result: The requested network is available now!"</string>
+    <string name="network_requested" msgid="5646123922691865991">"Result: The network has been requested!"</string>
+    <string name="network_released" msgid="2992280481133877025">"Result: The network has been released!"</string>
+    <string name="network_release_failed" msgid="256471231420029151">"Result: Failed to release the network!!!"</string>
+    <string name="purchase_exception" msgid="8876841120055716671">"Result: Exception when purchasing network premium!!!"</string>
+    <string name="purchase_empty_result" msgid="7497824191649973928">"Result: Got empty result when purchasing network premium!!!"</string>
+    <string name="premium_not_available" msgid="7346368693802644748">"Result: The network premium is not available for purchase!!!"</string>
+    <string name="purchase_in_progress" msgid="5450288183685032424">"Result: The network premium purchase is in progress ..."</string>
 </resources>
diff --git a/tests/src/com/android/TestContext.java b/tests/src/com/android/TestContext.java
index 7c3a842..720d235 100644
--- a/tests/src/com/android/TestContext.java
+++ b/tests/src/com/android/TestContext.java
@@ -61,7 +61,11 @@
     @Mock ImsManager mMockImsManager;
     @Mock UserManager mMockUserManager;
 
-    private SparseArray<PersistableBundle> mCarrierConfigs = new SparseArray<>();
+    private final SparseArray<PersistableBundle> mCarrierConfigs = new SparseArray<>();
+
+    private Intent mIntent;
+
+    private BroadcastReceiver mReceiver;
 
     private final HashSet<String> mPermissionTable = new HashSet<>();
 
@@ -105,28 +109,42 @@
     }
 
     @Override
+    public void sendBroadcast(Intent intent) {
+        mIntent = intent;
+    }
+
+    @Override
     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
+        mReceiver = receiver;
         return null;
     }
 
     @Override
     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) {
+        mReceiver = receiver;
         return null;
     }
 
     @Override
     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
             String broadcastPermission, Handler scheduler) {
+        mReceiver = receiver;
         return null;
     }
 
     @Override
     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
             String broadcastPermission, Handler scheduler, int flags) {
+        mReceiver = receiver;
         return null;
     }
 
     @Override
+    public void unregisterReceiver(BroadcastReceiver receiver) {
+        mReceiver = null;
+    }
+
+    @Override
     public ContentResolver getContentResolver() {
         return null;
     }
@@ -134,22 +152,22 @@
     @Override
     public Object getSystemService(String name) {
         switch (name) {
-            case (Context.CARRIER_CONFIG_SERVICE) : {
+            case Context.CARRIER_CONFIG_SERVICE: {
                 return mMockCarrierConfigManager;
             }
-            case (Context.TELECOM_SERVICE) : {
+            case Context.TELECOM_SERVICE: {
                 return mMockTelecomManager;
             }
-            case (Context.TELEPHONY_SERVICE) : {
+            case Context.TELEPHONY_SERVICE: {
                 return mMockTelephonyManager;
             }
-            case (Context.TELEPHONY_SUBSCRIPTION_SERVICE) : {
+            case Context.TELEPHONY_SUBSCRIPTION_SERVICE: {
                 return mMockSubscriptionManager;
             }
-            case(Context.TELEPHONY_IMS_SERVICE) : {
+            case Context.TELEPHONY_IMS_SERVICE: {
                 return mMockImsManager;
             }
-            case(Context.USER_SERVICE) : {
+            case Context.USER_SERVICE: {
                 return mMockUserManager;
             }
         }
@@ -170,6 +188,9 @@
         if (serviceClass == SubscriptionManager.class) {
             return Context.TELEPHONY_SUBSCRIPTION_SERVICE;
         }
+        if (serviceClass == ImsManager.class) {
+            return Context.TELEPHONY_IMS_SERVICE;
+        }
         if (serviceClass == UserManager.class) {
             return Context.USER_SERVICE;
         }
@@ -252,6 +273,14 @@
         }
     }
 
+    public Intent getBroadcast() {
+        return mIntent;
+    }
+
+    public BroadcastReceiver getBroadcastReceiver() {
+        return mReceiver;
+    }
+
     private static void logd(String s) {
         Log.d(TAG, s);
     }
diff --git a/tests/src/com/android/phone/PhoneInterfaceManagerTest.java b/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
index 3b6d5ee..6e4a65f 100644
--- a/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
+++ b/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
@@ -17,15 +17,21 @@
 package com.android.phone;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
-import android.content.pm.PackageManager;
+import android.content.SharedPreferences;
 import android.content.res.Resources;
 import android.telephony.RadioAccessFamily;
 import android.telephony.TelephonyManager;
@@ -50,22 +56,24 @@
 @RunWith(AndroidJUnit4.class)
 public class PhoneInterfaceManagerTest extends TelephonyTestBase {
     private PhoneInterfaceManager mPhoneInterfaceManager;
+    private SharedPreferences mSharedPreferences;
 
     @Mock
     PhoneGlobals mPhoneGlobals;
     @Mock
     Phone mPhone;
-    @Mock
-    PackageManager mPackageManager;
 
     @Before
     @UiThreadTest
     public void setUp() throws Exception {
         super.setUp();
-        doReturn(mPackageManager).when(mPhoneGlobals).getPackageManager();
-        doReturn(false).when(mPackageManager).hasSystemFeature(
-                PackageManager.FEATURE_TELEPHONY_IMS);
-        mPhoneInterfaceManager = PhoneInterfaceManager.init(mPhoneGlobals);
+        // Note that PhoneInterfaceManager is a singleton. Calling init gives us a handle to the
+        // global singleton, but the context that is passed in is unused if the phone app is already
+        // alive on a test devices. You must use the spy to mock behavior. Mocks stemming from the
+        // passed context will remain unused.
+        mPhoneInterfaceManager = spy(PhoneInterfaceManager.init(mPhoneGlobals));
+        mSharedPreferences = mPhoneInterfaceManager.getSharedPreferences();
+        mSharedPreferences.edit().remove(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED).commit();
     }
 
     @Test
@@ -138,4 +146,81 @@
 
         assertEquals("ff-Latn-BF", resultFfBf);
     }
+
+    @Test
+    public void setNullCipherAndIntegrityEnabled_successfullyEnable() {
+        doReturn(201).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+        doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
+        assertFalse(mSharedPreferences.contains(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED));
+
+        mPhoneInterfaceManager.setNullCipherAndIntegrityEnabled(true);
+
+        assertTrue(
+                mSharedPreferences.getBoolean(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED, false));
+    }
+
+    @Test
+    public void setNullCipherAndIntegrityEnabled_successfullyDisable() {
+        doReturn(201).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+        doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
+        assertFalse(mSharedPreferences.contains(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED));
+
+        mPhoneInterfaceManager.setNullCipherAndIntegrityEnabled(false);
+
+        assertFalse(
+                mSharedPreferences.getBoolean(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED, true));
+    }
+
+    @Test
+    public void setNullCipherAndIntegrityEnabled_lackingNecessaryHal() {
+        doReturn(101).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+        doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
+
+        assertThrows(UnsupportedOperationException.class, () -> {
+            mPhoneInterfaceManager.setNullCipherAndIntegrityEnabled(true);
+        });
+
+    }
+
+    @Test
+    public void setNullCipherAndIntegrityEnabled_lackingPermissions() {
+        doReturn(201).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+        doThrow(SecurityException.class).when(mPhoneInterfaceManager).enforceModifyPermission();
+
+        assertThrows(SecurityException.class, () -> {
+            mPhoneInterfaceManager.setNullCipherAndIntegrityEnabled(true);
+        });
+    }
+
+    @Test
+    public void isNullCipherAndIntegrityPreferenceEnabled() {
+        doReturn(201).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+        doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
+
+        assertTrue(mPhoneInterfaceManager.isNullCipherAndIntegrityPreferenceEnabled());
+        mPhoneInterfaceManager.setNullCipherAndIntegrityEnabled(false);
+        assertFalse(
+                mSharedPreferences.getBoolean(Phone.PREF_NULL_CIPHER_AND_INTEGRITY_ENABLED, true));
+    }
+
+    @Test
+    public void isNullCipherAndIntegrityPreferenceEnabled_lackingNecessaryHal() {
+        doReturn(101).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+        doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
+
+        assertThrows(UnsupportedOperationException.class, () -> {
+            mPhoneInterfaceManager.isNullCipherAndIntegrityPreferenceEnabled();
+        });
+
+    }
+
+    @Test
+    public void isNullCipherAndIntegrityPreferenceEnabled_lackingPermissions() {
+        doReturn(201).when(mPhoneInterfaceManager).getHalVersion(anyInt());
+        doThrow(SecurityException.class).when(mPhoneInterfaceManager).enforceReadPermission();
+
+        assertThrows(SecurityException.class, () -> {
+            mPhoneInterfaceManager.isNullCipherAndIntegrityPreferenceEnabled();
+        });
+    }
 }
diff --git a/tests/src/com/android/phone/SlicePurchaseControllerTest.java b/tests/src/com/android/phone/slice/SlicePurchaseControllerTest.java
similarity index 75%
rename from tests/src/com/android/phone/SlicePurchaseControllerTest.java
rename to tests/src/com/android/phone/slice/SlicePurchaseControllerTest.java
index ebcf15d..e9e23f3 100644
--- a/tests/src/com/android/phone/SlicePurchaseControllerTest.java
+++ b/tests/src/com/android/phone/slice/SlicePurchaseControllerTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.phone;
+package com.android.phone.slice;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -26,15 +26,19 @@
 import static org.mockito.Mockito.anyInt;
 import static org.mockito.Mockito.anyString;
 import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.SharedPreferences;
 import android.os.AsyncResult;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -53,38 +57,42 @@
 import com.android.TelephonyTestBase;
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.Phone;
-import com.android.phone.slice.PremiumNetworkEntitlementApi;
-import com.android.phone.slice.PremiumNetworkEntitlementResponse;
-import com.android.phone.slice.SlicePurchaseController;
-import com.android.phone.slice.SlicePurchaseController.SlicePurchaseControllerBroadcastReceiver;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 
+import java.time.LocalDate;
 import java.util.Collections;
 import java.util.Map;
 
 @RunWith(AndroidJUnit4.class)
 public class SlicePurchaseControllerTest extends TelephonyTestBase {
     private static final String TAG = "SlicePurchaseControllerTest";
+    private static final String DAILY_NOTIFICATION_COUNT_KEY = "daily_notification_count0";
+    private static final String MONTHLY_NOTIFICATION_COUNT_KEY = "monthly_notification_count0";
+    private static final int YEAR = 2000;
+    private static final int MONTH = 6;
+    private static final int DATE = 1;
     private static final int PHONE_ID = 0;
+    private static final int DAILY_NOTIFICATION_MAX = 3;
+    private static final int MONTHLY_NOTIFICATION_MAX = 5;
     private static final long NOTIFICATION_TIMEOUT = 1000;
     private static final long PURCHASE_CONDITION_TIMEOUT = 2000;
     private static final long NETWORK_SETUP_TIMEOUT = 3000;
     private static final long THROTTLE_TIMEOUT = 4000;
 
     @Mock Phone mPhone;
-    @Mock Context mMockedContext;
     @Mock CarrierConfigManager mCarrierConfigManager;
     @Mock CommandsInterface mCommandsInterface;
     @Mock ServiceState mServiceState;
     @Mock PremiumNetworkEntitlementApi mPremiumNetworkEntitlementApi;
+    @Mock SharedPreferences mSharedPreferences;
+    @Mock SharedPreferences.Editor mEditor;
 
     private SlicePurchaseController mSlicePurchaseController;
-    private SlicePurchaseControllerBroadcastReceiver mBroadcastReceiver;
     private PersistableBundle mBundle;
     private PremiumNetworkEntitlementResponse mEntitlementResponse;
     private Handler mHandler;
@@ -106,17 +114,34 @@
         mTestableLooper = new TestableLooper(mHandler.getLooper());
 
         doReturn(PHONE_ID).when(mPhone).getPhoneId();
-        doReturn(mMockedContext).when(mPhone).getContext();
+        doReturn(mContext).when(mPhone).getContext();
         doReturn(mServiceState).when(mPhone).getServiceState();
         mPhone.mCi = mCommandsInterface;
 
-        doReturn(Context.CARRIER_CONFIG_SERVICE).when(mMockedContext)
-                .getSystemServiceName(eq(CarrierConfigManager.class));
-        doReturn(mCarrierConfigManager).when(mMockedContext)
-                .getSystemService(eq(Context.CARRIER_CONFIG_SERVICE));
+        doReturn(mCarrierConfigManager).when(mContext)
+                .getSystemService(Context.CARRIER_CONFIG_SERVICE);
         mBundle = new PersistableBundle();
+        mBundle.putInt(
+                CarrierConfigManager.KEY_PREMIUM_CAPABILITY_MAXIMUM_DAILY_NOTIFICATION_COUNT_INT,
+                DAILY_NOTIFICATION_MAX);
+        mBundle.putInt(
+                CarrierConfigManager.KEY_PREMIUM_CAPABILITY_MAXIMUM_MONTHLY_NOTIFICATION_COUNT_INT,
+                MONTHLY_NOTIFICATION_MAX);
         doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
 
+        doReturn(mSharedPreferences).when(mContext).getSharedPreferences(anyString(), anyInt());
+        doReturn(mEditor).when(mSharedPreferences).edit();
+        doAnswer(invocation -> {
+            doReturn(invocation.getArgument(1)).when(mSharedPreferences)
+                    .getInt(eq(invocation.getArgument(0)), anyInt());
+            return null;
+        }).when(mEditor).putInt(anyString(), anyInt());
+        doAnswer(invocation -> {
+            doReturn(invocation.getArgument(1)).when(mSharedPreferences)
+                    .getString(eq(invocation.getArgument(0)), anyString());
+            return null;
+        }).when(mEditor).putString(anyString(), anyString());
+
         // create a spy to mock final PendingIntent methods
         SlicePurchaseController slicePurchaseController =
                 new SlicePurchaseController(mPhone, mHandler.getLooper());
@@ -159,7 +184,6 @@
                 new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
         mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
                 SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
-        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
         doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
 
         // retry to verify available
@@ -188,19 +212,65 @@
         };
         for (String url : invalidUrls) {
             mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING, url);
-            doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
             assertFalse(mSlicePurchaseController.isPremiumCapabilityAvailableForPurchase(
                     TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY));
         }
 
         mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
                 SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
-        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
         assertTrue(mSlicePurchaseController.isPremiumCapabilityAvailableForPurchase(
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY));
     }
 
     @Test
+    public void testUpdateNotificationCounts() {
+        mSlicePurchaseController.setLocalDate(LocalDate.of(YEAR, MONTH, DATE));
+        mSlicePurchaseController.updateNotificationCounts();
+
+        // change only date, month and year remain the same
+        Mockito.clearInvocations(mEditor);
+        mSlicePurchaseController.setLocalDate(LocalDate.of(YEAR, MONTH, DATE + 1));
+        mSlicePurchaseController.updateNotificationCounts();
+        verify(mEditor).putInt(eq(DAILY_NOTIFICATION_COUNT_KEY), eq(0));
+        verify(mEditor, never()).putInt(eq(MONTHLY_NOTIFICATION_COUNT_KEY), eq(0));
+
+        // change only month, date and year remain the same
+        Mockito.clearInvocations(mEditor);
+        mSlicePurchaseController.setLocalDate(LocalDate.of(YEAR, MONTH + 1, DATE + 1));
+        mSlicePurchaseController.updateNotificationCounts();
+        verify(mEditor).putInt(eq(DAILY_NOTIFICATION_COUNT_KEY), eq(0));
+        verify(mEditor).putInt(eq(MONTHLY_NOTIFICATION_COUNT_KEY), eq(0));
+
+        // change only year, date and month remain the same
+        Mockito.clearInvocations(mEditor);
+        mSlicePurchaseController.setLocalDate(LocalDate.of(YEAR + 1, MONTH + 1, DATE + 1));
+        mSlicePurchaseController.updateNotificationCounts();
+        verify(mEditor).putInt(eq(DAILY_NOTIFICATION_COUNT_KEY), eq(0));
+        verify(mEditor).putInt(eq(MONTHLY_NOTIFICATION_COUNT_KEY), eq(0));
+
+        // change only month and year, date remains the same
+        Mockito.clearInvocations(mEditor);
+        mSlicePurchaseController.setLocalDate(LocalDate.of(YEAR + 2, MONTH + 2, DATE + 1));
+        mSlicePurchaseController.updateNotificationCounts();
+        verify(mEditor).putInt(eq(DAILY_NOTIFICATION_COUNT_KEY), eq(0));
+        verify(mEditor).putInt(eq(MONTHLY_NOTIFICATION_COUNT_KEY), eq(0));
+
+        // change only date and year, month remains the same
+        Mockito.clearInvocations(mEditor);
+        mSlicePurchaseController.setLocalDate(LocalDate.of(YEAR + 3, MONTH + 2, DATE + 2));
+        mSlicePurchaseController.updateNotificationCounts();
+        verify(mEditor).putInt(eq(DAILY_NOTIFICATION_COUNT_KEY), eq(0));
+        verify(mEditor).putInt(eq(MONTHLY_NOTIFICATION_COUNT_KEY), eq(0));
+
+        // change only date and month, year remains the same
+        Mockito.clearInvocations(mEditor);
+        mSlicePurchaseController.setLocalDate(LocalDate.of(YEAR + 3, MONTH + 3, DATE + 3));
+        mSlicePurchaseController.updateNotificationCounts();
+        verify(mEditor).putInt(eq(DAILY_NOTIFICATION_COUNT_KEY), eq(0));
+        verify(mEditor).putInt(eq(MONTHLY_NOTIFICATION_COUNT_KEY), eq(0));
+    }
+
+    @Test
     public void testPurchasePremiumCapabilityResultFeatureNotSupported() {
         mSlicePurchaseController.purchasePremiumCapability(
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
@@ -237,7 +307,6 @@
                 new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
         mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
                 SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
-        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
 
         mSlicePurchaseController.purchasePremiumCapability(
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
@@ -255,7 +324,6 @@
                 new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
         mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
                 SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
-        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
 
         mSlicePurchaseController.purchasePremiumCapability(
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
@@ -285,7 +353,6 @@
                 new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
         mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
                 SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
-        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
         doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
 
         mSlicePurchaseController.purchasePremiumCapability(
@@ -314,7 +381,6 @@
                 new int[]{TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY});
         mBundle.putString(CarrierConfigManager.KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING,
                 SlicePurchaseController.SLICE_PURCHASE_TEST_FILE);
-        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
         doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
         doReturn(TelephonyManager.NETWORK_TYPE_NR).when(mServiceState).getDataNetworkType();
         doReturn(null).when(mPremiumNetworkEntitlementApi).checkEntitlementStatus(anyInt());
@@ -342,8 +408,6 @@
         // retry with provisioning response
         mEntitlementResponse.mProvisionStatus =
                 PremiumNetworkEntitlementResponse.PREMIUM_NETWORK_PROVISION_STATUS_IN_PROGRESS;
-        doReturn(mEntitlementResponse).when(mPremiumNetworkEntitlementApi)
-                .checkEntitlementStatus(anyInt());
 
         mSlicePurchaseController.purchasePremiumCapability(
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
@@ -357,12 +421,9 @@
                 PremiumNetworkEntitlementResponse.PREMIUM_NETWORK_PROVISION_STATUS_NOT_PROVISIONED;
         mEntitlementResponse.mEntitlementStatus =
                 PremiumNetworkEntitlementResponse.PREMIUM_NETWORK_ENTITLEMENT_STATUS_INCOMPATIBLE;
-        doReturn(mEntitlementResponse).when(mPremiumNetworkEntitlementApi)
-                .checkEntitlementStatus(anyInt());
         mBundle.putLong(CarrierConfigManager
                 .KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG,
                 PURCHASE_CONDITION_TIMEOUT);
-        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
 
         mSlicePurchaseController.purchasePremiumCapability(
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
@@ -409,12 +470,13 @@
     public void testPurchasePremiumCapabilityResultSuccess() {
         sendValidPurchaseRequest();
 
+        // broadcast SUCCESS response from slice purchase application
         Intent intent = new Intent();
         intent.setAction("com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_SUCCESS");
         intent.putExtra(SlicePurchaseController.EXTRA_PHONE_ID, PHONE_ID);
         intent.putExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
-        mBroadcastReceiver.onReceive(mMockedContext, intent);
+        mContext.getBroadcastReceiver().onReceive(mContext, intent);
         mTestableLooper.processAllMessages();
         assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS, mResult);
 
@@ -443,13 +505,7 @@
     public void testPurchasePremiumCapabilityResultAlreadyPurchased() {
         testPurchasePremiumCapabilityResultSuccess();
 
-        // TODO: implement slicing config logic properly
-        NetworkSlicingConfig slicingConfig = new NetworkSlicingConfig(Collections.emptyList(),
-                Collections.singletonList(new NetworkSliceInfo.Builder()
-                        .setStatus(NetworkSliceInfo.SLICE_STATUS_ALLOWED).build()));
-        mSlicePurchaseController.obtainMessage(2 /* EVENT_SLICING_CONFIG_CHANGED */,
-                new AsyncResult(null, slicingConfig, null)).sendToTarget();
-        mTestableLooper.processAllMessages();
+        sendNetworkSlicingConfig(true);
 
         mSlicePurchaseController.purchasePremiumCapability(
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
@@ -467,10 +523,7 @@
                 mResult);
 
         // retry to verify purchase expired
-        slicingConfig = new NetworkSlicingConfig(Collections.emptyList(), Collections.emptyList());
-        mSlicePurchaseController.obtainMessage(2 /* EVENT_SLICING_CONFIG_CHANGED */,
-                new AsyncResult(null, slicingConfig, null)).sendToTarget();
-        mTestableLooper.processAllMessages();
+        sendNetworkSlicingConfig(false);
 
         testPurchasePremiumCapabilityResultSuccess();
     }
@@ -501,12 +554,13 @@
     public void testPurchasePremiumCapabilityResultUserCanceled() {
         sendValidPurchaseRequest();
 
+        // broadcast CANCELED response from slice purchase application
         Intent intent = new Intent();
         intent.setAction("com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_CANCELED");
         intent.putExtra(SlicePurchaseController.EXTRA_PHONE_ID, PHONE_ID);
         intent.putExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
-        mBroadcastReceiver.onReceive(mMockedContext, intent);
+        mContext.getBroadcastReceiver().onReceive(mContext, intent);
         mTestableLooper.processAllMessages();
         assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED, mResult);
 
@@ -528,6 +582,7 @@
     public void testPurchasePremiumCapabilityResultCarrierError() {
         sendValidPurchaseRequest();
 
+        // broadcast CARRIER_ERROR response from slice purchase application
         Intent intent = new Intent();
         intent.setAction(
                 "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_CARRIER_ERROR");
@@ -536,7 +591,7 @@
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
         intent.putExtra(SlicePurchaseController.EXTRA_FAILURE_CODE,
                 SlicePurchaseController.FAILURE_CODE_SERVER_UNREACHABLE);
-        mBroadcastReceiver.onReceive(mMockedContext, intent);
+        mContext.getBroadcastReceiver().onReceive(mContext, intent);
         mTestableLooper.processAllMessages();
         assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR, mResult);
 
@@ -558,13 +613,14 @@
     public void testPurchasePremiumCapabilityResultRequestFailed() {
         sendValidPurchaseRequest();
 
+        // broadcast REQUEST_FAILED response from slice purchase application
         Intent intent = new Intent();
         intent.setAction(
                 "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_REQUEST_FAILED");
         intent.putExtra(SlicePurchaseController.EXTRA_PHONE_ID, PHONE_ID);
         intent.putExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
-        mBroadcastReceiver.onReceive(mMockedContext, intent);
+        mContext.getBroadcastReceiver().onReceive(mContext, intent);
         mTestableLooper.processAllMessages();
         assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED, mResult);
 
@@ -582,7 +638,7 @@
         intent.putExtra(SlicePurchaseController.EXTRA_PHONE_ID, PHONE_ID);
         intent.putExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
-        mBroadcastReceiver.onReceive(mMockedContext, intent);
+        mContext.getBroadcastReceiver().onReceive(mContext, intent);
         mTestableLooper.processAllMessages();
         assertEquals(
                 TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA_SUBSCRIPTION,
@@ -592,8 +648,70 @@
         testPurchasePremiumCapabilityResultSuccess();
     }
 
+    @Test
+    public void testPurchasePremiumCapabilityResultNotificationThrottled() {
+        mSlicePurchaseController.setLocalDate(LocalDate.of(YEAR, MONTH, DATE));
+        mSlicePurchaseController.updateNotificationCounts();
+
+        for (int count = 1; count <= DAILY_NOTIFICATION_MAX; count++) {
+            completeSuccessfulPurchase();
+            verify(mEditor).putInt(eq(DAILY_NOTIFICATION_COUNT_KEY), eq(count));
+            verify(mEditor).putInt(eq(MONTHLY_NOTIFICATION_COUNT_KEY), eq(count));
+        }
+
+        // retry to verify throttled
+        mSlicePurchaseController.purchasePremiumCapability(
+                TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+                mHandler.obtainMessage());
+        mTestableLooper.processAllMessages();
+        assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED, mResult);
+
+        // change the date to trigger daily reset
+        mSlicePurchaseController.setLocalDate(LocalDate.of(YEAR, MONTH, DATE + 1));
+        Mockito.clearInvocations(mEditor);
+
+        for (int count = 1; count <= (MONTHLY_NOTIFICATION_MAX - DAILY_NOTIFICATION_MAX); count++) {
+            completeSuccessfulPurchase();
+            verify(mEditor).putInt(eq(DAILY_NOTIFICATION_COUNT_KEY), eq(count));
+            verify(mEditor).putInt(eq(MONTHLY_NOTIFICATION_COUNT_KEY),
+                    eq(count + DAILY_NOTIFICATION_MAX));
+        }
+
+        // retry to verify throttled
+        mSlicePurchaseController.purchasePremiumCapability(
+                TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY, TAG,
+                mHandler.obtainMessage());
+        mTestableLooper.processAllMessages();
+        assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED, mResult);
+    }
+
+    private void completeSuccessfulPurchase() {
+        sendValidPurchaseRequest();
+
+        // broadcast NOTIFICATION_SHOWN response from slice purchase application
+        Intent intent = new Intent();
+        intent.setAction(
+                "com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_NOTIFICATION_SHOWN");
+        intent.putExtra(SlicePurchaseController.EXTRA_PHONE_ID, PHONE_ID);
+        intent.putExtra(SlicePurchaseController.EXTRA_PREMIUM_CAPABILITY,
+                TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY);
+        mContext.getBroadcastReceiver().onReceive(mContext, intent);
+        mTestableLooper.processAllMessages();
+
+        // broadcast SUCCESS response from slice purchase application
+        intent.setAction("com.android.phone.slice.action.SLICE_PURCHASE_APP_RESPONSE_SUCCESS");
+        mContext.getBroadcastReceiver().onReceive(mContext, intent);
+        mTestableLooper.processAllMessages();
+        assertEquals(TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS, mResult);
+
+        // complete network setup
+        sendNetworkSlicingConfig(true);
+        // purchase expired
+        sendNetworkSlicingConfig(false);
+    }
+
     private void sendValidPurchaseRequest() {
-        clearInvocations(mMockedContext);
+        clearInvocations(mContext);
 
         // feature supported
         doReturn((int) TelephonyManager.NETWORK_TYPE_BITMASK_NR).when(mPhone)
@@ -614,7 +732,6 @@
         mBundle.putLong(CarrierConfigManager
                 .KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG,
                 PURCHASE_CONDITION_TIMEOUT);
-        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
         // default data subscription
         doReturn(SubscriptionManager.getDefaultDataSubscriptionId()).when(mPhone).getSubId();
         // network available
@@ -622,8 +739,6 @@
         // entitlement check passed
         mEntitlementResponse.mEntitlementStatus =
                 PremiumNetworkEntitlementResponse.PREMIUM_NETWORK_ENTITLEMENT_STATUS_ENABLED;
-        doReturn(mEntitlementResponse).when(mPremiumNetworkEntitlementApi)
-                .checkEntitlementStatus(anyInt());
 
         // send purchase request
         mSlicePurchaseController.purchasePremiumCapability(
@@ -632,18 +747,23 @@
         mTestableLooper.processAllMessages();
 
         // verify that the purchase request was sent successfully
-        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
-        verify(mMockedContext).sendBroadcast(intentCaptor.capture());
-        Intent intent = intentCaptor.getValue();
-        assertEquals(SlicePurchaseController.ACTION_START_SLICE_PURCHASE_APP, intent.getAction());
+        verify(mContext).sendBroadcast(any(Intent.class));
+        assertEquals(SlicePurchaseController.ACTION_START_SLICE_PURCHASE_APP,
+                mContext.getBroadcast().getAction());
         assertTrue(mSlicePurchaseController.hasMessages(4 /* EVENT_PURCHASE_TIMEOUT */,
                 TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY));
+        verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
+    }
 
-        // capture the broadcast receiver to fake responses from the slice purchase application
-        ArgumentCaptor<SlicePurchaseControllerBroadcastReceiver> broadcastReceiverCaptor =
-                ArgumentCaptor.forClass(SlicePurchaseControllerBroadcastReceiver.class);
-        verify(mMockedContext).registerReceiver(
-                broadcastReceiverCaptor.capture(), any(IntentFilter.class));
-        mBroadcastReceiver = broadcastReceiverCaptor.getValue();
+    private void sendNetworkSlicingConfig(boolean configExists) {
+        // TODO: implement slicing config logic properly
+        NetworkSlicingConfig slicingConfig = new NetworkSlicingConfig(Collections.emptyList(),
+                configExists
+                        ? Collections.singletonList(new NetworkSliceInfo.Builder()
+                                .setStatus(NetworkSliceInfo.SLICE_STATUS_ALLOWED).build())
+                        : Collections.emptyList());
+        mSlicePurchaseController.obtainMessage(2 /* EVENT_SLICING_CONFIG_CHANGED */,
+                new AsyncResult(null, slicingConfig, null)).sendToTarget();
+        mTestableLooper.processAllMessages();
     }
 }
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index 553dbc9..85be48d 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -1527,6 +1527,24 @@
         assertFalse(tc1.wasDisconnected);
     }
 
+    /**
+     * Verifies that TelephonyManager is used to determine whether a connection is Emergency when
+     * creating an outgoing connection.
+     */
+    @Test
+    @SmallTest
+    public void testIsEmergencyDeterminedByTelephonyManager() {
+        ConnectionRequest connectionRequest = new ConnectionRequest.Builder()
+                .setAccountHandle(PHONE_ACCOUNT_HANDLE_1)
+                .setAddress(TEST_ADDRESS)
+                .build();
+        mConnection = mTestConnectionService.onCreateOutgoingConnection(
+                PHONE_ACCOUNT_HANDLE_1, connectionRequest);
+
+        verify(mTelephonyManagerProxy)
+                .isCurrentEmergencyNumber(TEST_ADDRESS.getSchemeSpecificPart());
+    }
+
     private SimpleTelephonyConnection createTestConnection(PhoneAccountHandle handle,
             int properties, boolean isEmergency) {
         SimpleTelephonyConnection connection = new SimpleTelephonyConnection();
diff --git a/tests/src/com/android/services/telephony/rcs/RcsFeatureControllerTest.java b/tests/src/com/android/services/telephony/rcs/RcsFeatureControllerTest.java
index 2a30e1a..7cf0852 100644
--- a/tests/src/com/android/services/telephony/rcs/RcsFeatureControllerTest.java
+++ b/tests/src/com/android/services/telephony/rcs/RcsFeatureControllerTest.java
@@ -22,6 +22,7 @@
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
@@ -171,12 +172,12 @@
         verify(mFeatureManager).registerImsRegistrationCallback(captor.capture());
         assertNotNull(captor.getValue());
 
-        captor.getValue().onDeregistered(REASON_DISCONNECTED);
+        captor.getValue().onDeregistered(REASON_DISCONNECTED, 0);
         controller.getRegistrationState(result -> {
             assertNotNull(result);
             assertEquals(RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED, result.intValue());
         });
-        verify(mRegistrationCallback).handleImsUnregistered(REASON_DISCONNECTED);
+        verify(mRegistrationCallback).handleImsUnregistered(eq(REASON_DISCONNECTED), anyInt());
 
         ImsRegistrationAttributes attr = new ImsRegistrationAttributes.Builder(
                 ImsRegistrationImplBase.REGISTRATION_TECH_LTE).build();
@@ -193,8 +194,7 @@
             assertNotNull(result);
             assertEquals(RegistrationManager.REGISTRATION_STATE_REGISTERED, result.intValue());
         });
-        verify(mRegistrationCallback).handleImsRegistered(
-                AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+        verify(mRegistrationCallback).handleImsRegistered(attr);
     }
 
     @Test