diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 6ad1b9c..3aee293 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -1134,7 +1134,7 @@
         final SubInfoRecord nextSir = SubscriptionManager.getSubInfoForSubscriber(
                 SubscriptionManager.getDefaultDataSubId());
 
-        if (currentSir.subId == nextSir.subId) {
+        if (currentSir.getSubscriptionId() == nextSir.getSubscriptionId()) {
             setMobileDataEnabled(true);
             updateBody();
             return;
@@ -1144,12 +1144,12 @@
 
         builder.setTitle(R.string.sim_change_data_title);
         builder.setMessage(getActivity().getResources().getString(R.string.sim_change_data_message,
-                    currentSir.displayName, nextSir.displayName));
+                    currentSir.getDisplayName(), nextSir.getDisplayName()));
 
         builder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int id) {
-                SubscriptionManager.setDefaultDataSubId(currentSir.subId);
+                SubscriptionManager.setDefaultDataSubId(currentSir.getSubscriptionId());
                 setMobileDataEnabled(true);
                 updateBody();
             }
@@ -2347,7 +2347,7 @@
         // require both supported network and ready SIM
         boolean isReady = true;
         for (SubInfoRecord subInfo : subInfoList) {
-            isReady = isReady & tele.getSimState(subInfo.slotId) == SIM_STATE_READY;
+            isReady = isReady & tele.getSimState(subInfo.getSimSlotIndex()) == SIM_STATE_READY;
         }
         return conn.isNetworkSupported(TYPE_MOBILE) && isReady;
     }
@@ -2588,9 +2588,9 @@
         private void addMobileTab(Context context, List<SubInfoRecord> subInfoList) {
             if (subInfoList != null) {
                 for (SubInfoRecord subInfo : mSubInfoList) {
-                    if (hasReadyMobileRadio(context, subInfo.subId)) {
-                        mTabHost.addTab(buildTabSpec(mMobileTagMap.get(subInfo.subId),
-                                subInfo.displayName));
+                    if (hasReadyMobileRadio(context, subInfo.getSubscriptionId())) {
+                        mTabHost.addTab(buildTabSpec(mMobileTagMap.get(subInfo.getSubscriptionId()),
+                                subInfo.getDisplayName().toString()));
                     }
                 }
             }
@@ -2601,7 +2601,7 @@
                 final int currentTagIndex = mTabHost.getCurrentTab();
                 int i = 0;
                 for (SubInfoRecord subInfo : mSubInfoList) {
-                    if (hasReadyMobileRadio(context, subInfo.subId)) {
+                    if (hasReadyMobileRadio(context, subInfo.getSubscriptionId())) {
                         if (i++ == currentTagIndex) {
                             return subInfo;
                         }
@@ -2622,8 +2622,8 @@
                 String mobileTag;
                 map = new HashMap<Integer, String>();
                 for (SubInfoRecord subInfo : subInfoList) {
-                    mobileTag = TAB_MOBILE + String.valueOf(subInfo.subId);
-                    map.put(subInfo.subId,mobileTag);
+                    mobileTag = TAB_MOBILE + String.valueOf(subInfo.getSubscriptionId());
+                    map.put(subInfo.getSubscriptionId(), mobileTag);
                 }
             }
             return map;
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 6576163..aa27e3b 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -374,7 +374,7 @@
         final List<SubInfoRecord> subInfoList = SubscriptionManager.getActiveSubInfoList();
         if (subInfoList != null) {
             for (SubInfoRecord subInfo : subInfoList) {
-                simState = TelephonyManager.getDefault().getSimState(subInfo.slotId);
+                simState = TelephonyManager.getDefault().getSimState(subInfo.getSimSlotIndex());
                 if((simState != TelephonyManager.SIM_STATE_ABSENT) &&
                             (simState != TelephonyManager.SIM_STATE_UNKNOWN)){
                     return true;
diff --git a/src/com/android/settings/deviceinfo/ImeiInformation.java b/src/com/android/settings/deviceinfo/ImeiInformation.java
index 9ac2eac..4a3cef3 100644
--- a/src/com/android/settings/deviceinfo/ImeiInformation.java
+++ b/src/com/android/settings/deviceinfo/ImeiInformation.java
@@ -110,7 +110,7 @@
         final Phone[] phones = PhoneFactory.getPhones();
         for (int i = 0; i < phones.length; i++) {
             // Currently we only operate with the first subscription of a SIM.
-            if (phones[i].getSubId() == subInfos.get(0).subId) {
+            if (phones[i].getSubId() == subInfos.get(0).getSubscriptionId()) {
                 return phones[i];
             }
         }
diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java
index 4e90b4f..706e0f3 100644
--- a/src/com/android/settings/sim/SimSettings.java
+++ b/src/com/android/settings/sim/SimSettings.java
@@ -232,7 +232,7 @@
 
         for (int i = 0; i < availableSubInfoLength; ++i) {
             final SubInfoRecord sir = mAvailableSubInfos.get(i);
-            if (sir != null && sir.subId == subId) {
+            if (sir != null && sir.getSubscriptionId() == subId) {
                 return sir;
             }
         }
@@ -250,7 +250,7 @@
 
             for (int i = 0; i < availableSubInfoLength; ++i) {
                 final SubInfoRecord sir = mSubInfoList.get(i);
-                if (sir.slotId == slotId) {
+                if (sir.getSimSlotIndex() == slotId) {
                     //Right now we take the first subscription on a SIM.
                     return sir;
                 }
@@ -265,9 +265,9 @@
         final SubInfoRecord sir = findRecordBySubId(SubscriptionManager.getDefaultSmsSubId());
         simPref.setTitle(R.string.sms_messages_title);
         if (mSubInfoList.size() == 1) {
-            simPref.setSummary(mSubInfoList.get(0).displayName);
+            simPref.setSummary(mSubInfoList.get(0).getDisplayName());
         } else if (sir != null) {
-            simPref.setSummary(sir.displayName);
+            simPref.setSummary(sir.getDisplayName());
         } else if (sir == null) {
             simPref.setSummary(R.string.sim_selection_required_pref);
         }
@@ -279,9 +279,9 @@
         final SubInfoRecord sir = findRecordBySubId(SubscriptionManager.getDefaultDataSubId());
         simPref.setTitle(R.string.cellular_data_title);
         if (mSubInfoList.size() == 1) {
-            simPref.setSummary(mSubInfoList.get(0).displayName);
+            simPref.setSummary(mSubInfoList.get(0).getDisplayName());
         } else if (sir != null) {
-            simPref.setSummary(sir.displayName);
+            simPref.setSummary(sir.getDisplayName());
         } else if (sir == null) {
             simPref.setSummary(R.string.sim_selection_required_pref);
         }
@@ -339,7 +339,7 @@
 
                         if (id == DATA_PICK) {
                             sir = mSelectableSubInfos.get(value);
-                            SubscriptionManager.setDefaultDataSubId(sir.subId);
+                            SubscriptionManager.setDefaultDataSubId(sir.getSubscriptionId());
                         } else if (id == CALLS_PICK) {
                             final TelecomManager telecomManager =
                                     TelecomManager.from(getActivity());
@@ -349,7 +349,7 @@
                                     value < 1 ? null : phoneAccountsList.get(value - 1));
                         } else if (id == SMS_PICK) {
                             sir = mSelectableSubInfos.get(value);
-                            SubscriptionManager.setDefaultSmsSubId(sir.subId);
+                            SubscriptionManager.setDefaultSmsSubId(sir.getSubscriptionId());
                         }
 
                         updateActivitesCategory();
@@ -370,7 +370,7 @@
         } else {
             for (int i = 0; i < selectableSubInfoLength; ++i) {
                 final SubInfoRecord sir = mSelectableSubInfos.get(i);
-                list.add(sir.displayName);
+                list.add(sir.getDisplayName().toString());
             }
         }
 
@@ -472,14 +472,16 @@
             final Resources res = getResources();
 
             if (mSubInfoRecord != null) {
-                if(TextUtils.isEmpty(mSubInfoRecord.displayName)) {
+                if(TextUtils.isEmpty(mSubInfoRecord.getDisplayName())) {
                     setTitle(getCarrierName());
-                    mSubInfoRecord.displayName = getCarrierName();
-                    SubscriptionManager.setDisplayName(getCarrierName(), mSubInfoRecord.subId);
+                    String displayName = getCarrierName();
+                    mSubInfoRecord.setDisplayName(displayName);
+                    SubscriptionManager.setDisplayName(displayName,
+                            mSubInfoRecord.getSubscriptionId());
                 } else {
-                    setTitle(mSubInfoRecord.displayName);
+                    setTitle(mSubInfoRecord.getDisplayName());
                 }
-                setSummary(mSubInfoRecord.number.toString());
+                setSummary(mSubInfoRecord.getNumber().toString());
                 setEnabled(true);
             } else {
                 setSummary(R.string.sim_slot_empty);
@@ -489,7 +491,8 @@
         }
 
         public String getCarrierName() {
-            Uri mUri = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI, mSubInfoRecord.subId);
+            Uri mUri = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI,
+                    mSubInfoRecord.getSubscriptionId());
             Cursor mCursor = getActivity().managedQuery(mUri, sProjection, null, null);
             mCursor.moveToFirst();
             return mCursor.getString(1);
@@ -523,7 +526,7 @@
             builder.setView(dialogLayout);
 
             EditText nameText = (EditText)dialogLayout.findViewById(R.id.sim_name);
-            nameText.setText(mSubInfoRecord.displayName);
+            nameText.setText(mSubInfoRecord.getDisplayName());
 
             final Spinner colorSpinner = (Spinner) dialogLayout.findViewById(R.id.spinner);
             ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getContext(),
@@ -532,7 +535,7 @@
             colorSpinner.setAdapter(adapter);
 
             for (int i = 0; i < colorArr.length; i++) {
-                if (colorArr[i] == mSubInfoRecord.color) {
+                if (colorArr[i] == mSubInfoRecord.getColor()) {
                     colorSpinner.setSelection(i);
                     break;
                 }
@@ -557,23 +560,25 @@
             carrierView.setText(getCarrierName());
 
             builder.setTitle(String.format(res.getString(R.string.sim_editor_title),
-                    (mSubInfoRecord.slotId + 1)));
+                    (mSubInfoRecord.getSimSlotIndex() + 1)));
 
             builder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() {
                 @Override
                 public void onClick(DialogInterface dialog, int whichButton) {
                     final EditText nameText = (EditText)dialogLayout.findViewById(R.id.sim_name);
 
-                    mSubInfoRecord.displayName = nameText.getText().toString();
-                    SubscriptionManager.setDisplayName(mSubInfoRecord.displayName,
-                        mSubInfoRecord.subId);
-                    findRecordBySubId(mSubInfoRecord.subId).displayName =
-                        nameText.getText().toString();
+                    String displayName = nameText.getText().toString();
+                    int subId = mSubInfoRecord.getSubscriptionId();
+                    mSubInfoRecord.setDisplayName(displayName);
+                    SubscriptionManager.setDisplayName(displayName, subId);
+                    findRecordBySubId(subId).setDisplayName(displayName);
 
                     final int colorSelected = colorSpinner.getSelectedItemPosition();
-                    mSubInfoRecord.color = colorArr[colorSelected];
-                    SubscriptionManager.setColor(colorArr[colorSelected], mSubInfoRecord.subId);
-                    findRecordBySubId(mSubInfoRecord.subId).color = colorArr[colorSelected];
+                    int subscriptionId = mSubInfoRecord.getSubscriptionId();
+                    int color = colorArr[colorSelected];
+                    mSubInfoRecord.setColor(color);
+                    SubscriptionManager.setColor(color, subscriptionId);
+                    findRecordBySubId(subscriptionId).setColor(color);
 
                     updateAllOptions();
                     update();
@@ -603,9 +608,9 @@
 
                 @Override
                 public int compare(SubInfoRecord arg0, SubInfoRecord arg1) {
-                    int flag = arg0.slotId - arg1.slotId;
+                    int flag = arg0.getSimSlotIndex() - arg1.getSimSlotIndex();
                     if (flag == 0) {
-                        return (int) (arg0.subId - arg1.subId);
+                        return (int) (arg0.getSubscriptionId() - arg1.getSubscriptionId());
                     }
                     return flag;
                 }
