diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 7207fa2..e67071a 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -179,7 +179,6 @@
 
     private Phone mPhone;
     private AudioManager mAudioManager;
-    private VoicemailProviderSettingsUtil mVmProviderSettingsUtil;
 
     private SubscriptionInfoHelper mSubscriptionInfoHelper;
 
@@ -403,7 +402,7 @@
             updateVMPreferenceWidgets(newProviderKey);
 
             final VoicemailProviderSettings newProviderSettings =
-                    mVmProviderSettingsUtil.load(newProviderKey);
+                    VoicemailProviderSettingsUtil.load(this, newProviderKey);
 
             // If the user switches to a voice mail provider and we have numbers stored for it we
             // will automatically change the phone's voice mail and forwarding number to the stored
@@ -503,7 +502,7 @@
         if (mVMChangeCompletedSuccessfully || mFwdChangesRequireRollback) {
             showDialogIfForeground(VoicemailDialogUtil.VM_REVERTING_DIALOG);
             final VoicemailProviderSettings prevSettings =
-                    mVmProviderSettingsUtil.load(mPreviousVMProviderKey);
+                    VoicemailProviderSettingsUtil.load(this, mPreviousVMProviderKey);
             if (prevSettings == null) {
                 Log.e(LOG_TAG, "VoicemailProviderSettings for the key \""
                         + mPreviousVMProviderKey + "\" is null but should be loaded.");
@@ -716,7 +715,7 @@
             return;
         }
 
-        mVmProviderSettingsUtil.save(key, newSettings);
+        VoicemailProviderSettingsUtil.save(this, key, newSettings);
         mVMChangeCompletedSuccessfully = false;
         mFwdChangesRequireRollback = false;
         mVMOrFwdSetError = 0;
@@ -796,7 +795,7 @@
             dismissDialogSafely(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
 
             if (mReadingSettingsForDefaultProvider) {
-                mVmProviderSettingsUtil.save(DEFAULT_VM_PROVIDER_KEY,
+                VoicemailProviderSettingsUtil.save(this, DEFAULT_VM_PROVIDER_KEY,
                         new VoicemailProviderSettings(this.mOldVmNumber, mForwardingReadResults));
                 mReadingSettingsForDefaultProvider = false;
             }
@@ -1123,7 +1122,6 @@
         }
 
         mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
-        mVmProviderSettingsUtil = new VoicemailProviderSettingsUtil(getApplicationContext());
 
         // Show the voicemail preference in onResume if the calling intent specifies the
         // ACTION_ADD_VOICEMAIL action.
@@ -1410,7 +1408,7 @@
             // Remove this provider from the list.
             if (!TextUtils.isEmpty(providerToIgnore)) {
                 if (DBG) log("Found ACTION_ADD_VOICEMAIL. providerToIgnore= " + providerToIgnore);
-                mVmProviderSettingsUtil.delete(providerToIgnore);
+                VoicemailProviderSettingsUtil.delete(this, providerToIgnore);
             }
         }
 
diff --git a/src/com/android/phone/settings/VoicemailProviderSettingsUtil.java b/src/com/android/phone/settings/VoicemailProviderSettingsUtil.java
index 20fd05a..62e4798 100644
--- a/src/com/android/phone/settings/VoicemailProviderSettingsUtil.java
+++ b/src/com/android/phone/settings/VoicemailProviderSettingsUtil.java
@@ -18,7 +18,6 @@
 
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
 import android.telephony.PhoneNumberUtils;
 import android.util.Log;
 
@@ -47,19 +46,14 @@
     private static final String FWD_SETTING_NUMBER = "#Number";
     private static final String FWD_SETTING_TIME = "#Time";
 
-    private SharedPreferences mVmProviderPrefs;
-
-    public VoicemailProviderSettingsUtil(Context context) {
-        mVmProviderPrefs = context.getSharedPreferences(
-                VM_NUMBERS_SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
-    }
-
     /**
      * Returns settings previously stored for the currently selected voice mail provider. If no
      * setting is stored for the voice mail provider, return null.
      */
-    public VoicemailProviderSettings load(String key) {
-        String vmNumberSetting = mVmProviderPrefs.getString(key + VM_NUMBER_TAG, null);
+    public static VoicemailProviderSettings load(Context context, String key) {
+        SharedPreferences prefs = getPrefs(context);
+
+        String vmNumberSetting = prefs.getString(key + VM_NUMBER_TAG, null);
         if (vmNumberSetting == null) {
             Log.w(LOG_TAG, "VoiceMailProvider settings for the key \"" + key + "\""
                     + " were not found. Returning null.");
@@ -68,20 +62,20 @@
 
         CallForwardInfo[] cfi = VoicemailProviderSettings.NO_FORWARDING;
         String fwdKey = key + FWD_SETTINGS_TAG;
-        int fwdLen = mVmProviderPrefs.getInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
+        int fwdLen = prefs.getInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
         if (fwdLen > 0) {
             cfi = new CallForwardInfo[fwdLen];
             for (int i = 0; i < cfi.length; i++) {
                 String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
                 cfi[i] = new CallForwardInfo();
-                cfi[i].status = mVmProviderPrefs.getInt(settingKey + FWD_SETTING_STATUS, 0);
-                cfi[i].reason = mVmProviderPrefs.getInt(
+                cfi[i].status = prefs.getInt(settingKey + FWD_SETTING_STATUS, 0);
+                cfi[i].reason = prefs.getInt(
                         settingKey + FWD_SETTING_REASON,
                         CommandsInterface.CF_REASON_ALL_CONDITIONAL);
                 cfi[i].serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
                 cfi[i].toa = PhoneNumberUtils.TOA_International;
-                cfi[i].number = mVmProviderPrefs.getString(settingKey + FWD_SETTING_NUMBER, "");
-                cfi[i].timeSeconds = mVmProviderPrefs.getInt(settingKey + FWD_SETTING_TIME, 20);
+                cfi[i].number = prefs.getString(settingKey + FWD_SETTING_NUMBER, "");
+                cfi[i].timeSeconds = prefs.getInt(settingKey + FWD_SETTING_TIME, 20);
             }
         }
 
@@ -96,8 +90,8 @@
      *
      * These will be used later when the user switches a provider.
      */
-    public void save(String key, VoicemailProviderSettings newSettings) {
-        VoicemailProviderSettings curSettings = load(key);
+    public static void save(Context context, String key, VoicemailProviderSettings newSettings) {
+        VoicemailProviderSettings curSettings = load(context, key);
         if (newSettings.equals(curSettings)) {
             if (DBG) log("save: Not saving setting for " + key + " since they have not changed");
             return;
@@ -105,7 +99,8 @@
 
         if (DBG) log("Saving settings for " + key + ": " + newSettings.toString());
 
-        Editor editor = mVmProviderPrefs.edit();
+        SharedPreferences prefs = getPrefs(context);
+        SharedPreferences.Editor editor = prefs.edit();
         editor.putString(key + VM_NUMBER_TAG, newSettings.getVoicemailNumber());
         String fwdKey = key + FWD_SETTINGS_TAG;
 
@@ -130,16 +125,22 @@
     /**
      * Deletes settings for the provider identified by this key.
      */
-    public void delete(String key) {
+    public static void delete(Context context, String key) {
         if (DBG) log("Deleting settings for" + key);
 
-        mVmProviderPrefs.edit()
+        SharedPreferences prefs = getPrefs(context);
+        prefs.edit()
                 .putString(key + VM_NUMBER_TAG, null)
                 .putInt(key + FWD_SETTINGS_TAG + FWD_SETTINGS_LENGTH_TAG, 0)
                 .commit();
     }
 
-    private void log(String msg) {
+    private static SharedPreferences getPrefs(Context context) {
+        return context.getSharedPreferences(
+                VM_NUMBERS_SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
+    }
+
+    private static void log(String msg) {
         Log.d(LOG_TAG, msg);
     }
 }
