diff --git a/src/com/android/settings/network/MobileNetworkRepository.java b/src/com/android/settings/network/MobileNetworkRepository.java
index 42f15c8..0c150af 100644
--- a/src/com/android/settings/network/MobileNetworkRepository.java
+++ b/src/com/android/settings/network/MobileNetworkRepository.java
@@ -15,6 +15,7 @@
  */
 package com.android.settings.network;
 
+import static android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING;
 import static android.telephony.UiccSlotInfo.CARD_STATE_INFO_PRESENT;
 
 import static com.android.internal.telephony.TelephonyIntents.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED;
@@ -265,7 +266,7 @@
                         mPortIndex = portInfo.getPortIndex();
                     } else if (DEBUG) {
                         Log.d(TAG, "Can not get port index and physicalSlotIndex for subId "
-                                        + mSubId);
+                                + mSubId);
                     }
                 });
                 if (mPhysicalSlotIndex != SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
@@ -324,7 +325,12 @@
             SubscriptionInfoEntity subInfoEntity =
                     convertToSubscriptionInfoEntity(context, info);
             if (subInfoEntity != null) {
-                mSubscriptionInfoMap.put(info.getSubscriptionId(), info);
+                int subId = info.getSubscriptionId();
+                mSubscriptionInfoMap.put(subId, info);
+                if (DEBUG) {
+                    Log.d(TAG, "convert subId " + subId + "to SubscriptionInfoEntity: "
+                            + subInfoEntity);
+                }
                 mMobileNetworkDatabase.insertSubsInfo(subInfoEntity);
                 mMetricsFeatureProvider.action(mContext,
                         SettingsEnums.ACTION_MOBILE_NETWORK_DB_INSERT_SUB_INFO);
@@ -401,13 +407,21 @@
     }
 
     public void insertUiccInfo() {
-        mMobileNetworkDatabase.insertUiccInfo(convertToUiccInfoEntity());
+        UiccInfoEntity uiccInfoEntity = convertToUiccInfoEntity();
+        if (DEBUG) {
+            Log.d(TAG, "uiccInfoEntity = " + uiccInfoEntity);
+        }
+        mMobileNetworkDatabase.insertUiccInfo(uiccInfoEntity);
         mMetricsFeatureProvider.action(mContext,
                 SettingsEnums.ACTION_MOBILE_NETWORK_DB_INSERT_UICC_INFO);
     }
 
     public void insertMobileNetworkInfo(Context context) {
-        mMobileNetworkDatabase.insertMobileNetworkInfo(convertToMobileNetworkInfoEntity(context));
+        MobileNetworkInfoEntity mobileNetworkInfoEntity = convertToMobileNetworkInfoEntity(context);
+        if (DEBUG) {
+            Log.d(TAG, "mobileNetworkInfoEntity = " + mobileNetworkInfoEntity);
+        }
+        mMobileNetworkDatabase.insertMobileNetworkInfo(mobileNetworkInfoEntity);
         mMetricsFeatureProvider.action(mContext,
                 SettingsEnums.ACTION_MOBILE_NETWORK_DB_INSERT_MOBILE_NETWORK_INFO);
     }
@@ -449,7 +463,8 @@
 
     @Override
     public void onSubscriptionsChanged() {
-        insertAvailableSubInfoToEntity(mSubscriptionManager.getAvailableSubscriptionInfoList());
+        insertAvailableSubInfoToEntity(
+                SubscriptionUtil.getSelectableSubscriptionInfoList(mContext));
     }
 
     private void insertAvailableSubInfoToEntity(List<SubscriptionInfo> availableInfoList) {
@@ -470,8 +485,14 @@
             for (SubscriptionInfo subInfo : infoArray) {
                 mSubscriptionInfoMap.remove(subInfo.getSubscriptionId());
                 if (DEBUG) {
-                    Log.d(TAG,
-                            "insert sudInfo " + subInfo.getSubscriptionId() + " to subInfoEntity");
+                    Log.d(TAG, "insert subInfo to subInfoEntity, subInfo = " + subInfo);
+                }
+                if (subInfo.isEmbedded()
+                        && subInfo.getProfileClass() == PROFILE_CLASS_PROVISIONING) {
+                    if (DEBUG) {
+                        Log.d(TAG, "Do not insert the provision eSIM");
+                    }
+                    continue;
                 }
                 insertSubInfo(mContext, subInfo);
             }
