diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 8afe14f..b5b4bb6 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -93,11 +93,10 @@
 import com.android.internal.telephony.uicc.UiccCard;
 import com.android.internal.telephony.uicc.UiccCardApplication;
 import com.android.internal.telephony.uicc.UiccController;
+import com.android.internal.telephony.util.VoicemailNotificationSettingsUtil;
 import com.android.internal.util.HexDump;
-import com.android.phone.settings.VoicemailNotificationSettingsUtil;
 import com.android.phone.vvm.PhoneAccountHandleConverter;
 import com.android.phone.vvm.RemoteVvmTaskManager;
-import com.android.phone.vvm.VisualVoicemailPreferences;
 import com.android.phone.vvm.VisualVoicemailSettingsUtil;
 import com.android.phone.vvm.VisualVoicemailSmsFilterConfig;
 
@@ -3437,7 +3436,7 @@
             phone = mPhone;
         }
 
-        return VoicemailNotificationSettingsUtil.getRingtoneUri(phone);
+        return VoicemailNotificationSettingsUtil.getRingtoneUri(phone.getContext());
     }
 
     /**
@@ -3464,7 +3463,7 @@
         if (phone == null){
            phone = mPhone;
         }
-        VoicemailNotificationSettingsUtil.setRingtoneUri(phone, uri);
+        VoicemailNotificationSettingsUtil.setRingtoneUri(phone.getContext(), uri);
     }
 
     /**
@@ -3481,7 +3480,7 @@
             phone = mPhone;
         }
 
-        return VoicemailNotificationSettingsUtil.isVibrationEnabled(phone);
+        return VoicemailNotificationSettingsUtil.isVibrationEnabled(phone.getContext());
     }
 
     /**
@@ -3509,7 +3508,7 @@
         if (phone == null){
             phone = mPhone;
         }
-        VoicemailNotificationSettingsUtil.setVibrationEnabled(phone, enabled);
+        VoicemailNotificationSettingsUtil.setVibrationEnabled(phone.getContext(), enabled);
     }
 
     /**
diff --git a/src/com/android/phone/settings/VoicemailNotificationSettingsUtil.java b/src/com/android/phone/settings/VoicemailNotificationSettingsUtil.java
deleted file mode 100644
index fb7baf5..0000000
--- a/src/com/android/phone/settings/VoicemailNotificationSettingsUtil.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.phone.settings;
-
-import android.app.NotificationChannel;
-import android.content.SharedPreferences;
-import android.net.Uri;
-import android.preference.PreferenceManager;
-import android.telephony.TelephonyManager;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.util.NotificationChannelController;
-import com.android.phone.R;
-
-public class VoicemailNotificationSettingsUtil {
-    private static final String VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY_PREFIX =
-            "voicemail_notification_ringtone_";
-    private static final String VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY_PREFIX =
-            "voicemail_notification_vibrate_";
-
-    // Old voicemail notification vibration string constants used for migration.
-    private static final String OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY =
-            "button_voicemail_notification_ringtone_key";
-    private static final String OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY =
-            "button_voicemail_notification_vibrate_key";
-    private static final String OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY =
-            "button_voicemail_notification_vibrate_when_key";
-    private static final String OLD_VOICEMAIL_RINGTONE_SHARED_PREFS_KEY =
-            "button_voicemail_notification_ringtone_key";
-    private static final String OLD_VOICEMAIL_VIBRATION_ALWAYS = "always";
-    private static final String OLD_VOICEMAIL_VIBRATION_NEVER = "never";
-
-    public static void setVibrationEnabled(Phone phone, boolean isEnabled) {
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
-        SharedPreferences.Editor editor = prefs.edit();
-        editor.putBoolean(getVoicemailVibrationSharedPrefsKey(phone), isEnabled);
-        editor.commit();
-    }
-
-    public static boolean isVibrationEnabled(Phone phone) {
-        final NotificationChannel channel = NotificationChannelController.getChannel(
-                NotificationChannelController.CHANNEL_ID_VOICE_MAIL, phone.getContext());
-        return (channel != null) ? channel.shouldVibrate() : false;
-    }
-
-   public static void setRingtoneUri(Phone phone, Uri ringtoneUri) {
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
-        String ringtoneUriStr = ringtoneUri != null ? ringtoneUri.toString() : "";
-
-        SharedPreferences.Editor editor = prefs.edit();
-        editor.putString(getVoicemailRingtoneSharedPrefsKey(phone), ringtoneUriStr);
-        editor.commit();
-    }
-
-    public static Uri getRingtoneUri(Phone phone) {
-        final NotificationChannel channel = NotificationChannelController.getChannel(
-                NotificationChannelController.CHANNEL_ID_VOICE_MAIL, phone.getContext());
-        return (channel != null) ? channel.getSound() : null;
-    }
-
-    /**
-     * Migrate voicemail settings from {@link #OLD_VIBRATE_WHEN_KEY} or
-     * {@link #OLD_VOICEMAIL_NOTIFICATION_VIBRATE_KEY}.
-     *
-     * TODO: Add helper which migrates settings from old version to new version.
-     */
-    private static void migrateVoicemailVibrationSettingsIfNeeded(
-            Phone phone, SharedPreferences prefs) {
-        String key = getVoicemailVibrationSharedPrefsKey(phone);
-        TelephonyManager telephonyManager = TelephonyManager.from(phone.getContext());
-
-        // Skip if a preference exists, or if phone is MSIM.
-        if (prefs.contains(key) || telephonyManager.getPhoneCount() != 1) {
-            return;
-        }
-
-        if (prefs.contains(OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY)) {
-            boolean voicemailVibrate = prefs.getBoolean(
-                    OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY, false /* defValue */);
-
-            SharedPreferences.Editor editor = prefs.edit();
-            editor.putBoolean(key, voicemailVibrate)
-                    .remove(OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY)
-                    .commit();
-        }
-
-        if (prefs.contains(OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY)) {
-            // If vibrateWhen is always, then voicemailVibrate should be true.
-            // If it is "only in silent mode", or "never", then voicemailVibrate should be false.
-            String vibrateWhen = prefs.getString(
-                    OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY, OLD_VOICEMAIL_VIBRATION_NEVER);
-            boolean voicemailVibrate = vibrateWhen.equals(OLD_VOICEMAIL_VIBRATION_ALWAYS);
-
-            SharedPreferences.Editor editor = prefs.edit();
-            editor.putBoolean(key, voicemailVibrate)
-                    .remove(OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY)
-                    .commit();
-        }
-    }
-
-    /**
-     * Migrate voicemail settings from OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY.
-     *
-     * TODO: Add helper which migrates settings from old version to new version.
-     */
-    private static void migrateVoicemailRingtoneSettingsIfNeeded(
-            Phone phone, SharedPreferences prefs) {
-        String key = getVoicemailRingtoneSharedPrefsKey(phone);
-        TelephonyManager telephonyManager = TelephonyManager.from(phone.getContext());
-
-        // Skip if a preference exists, or if phone is MSIM.
-        if (prefs.contains(key) || telephonyManager.getPhoneCount() != 1) {
-            return;
-        }
-
-        if (prefs.contains(OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY)) {
-            String uriString = prefs.getString(
-                    OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY, null /* defValue */);
-
-            SharedPreferences.Editor editor = prefs.edit();
-            editor.putString(key, uriString)
-                    .remove(OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY)
-                    .commit();
-        }
-    }
-
-    private static String getVoicemailVibrationSharedPrefsKey(Phone phone) {
-        return VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY_PREFIX + phone.getSubId();
-    }
-
-    public static String getVoicemailRingtoneSharedPrefsKey(Phone phone) {
-        return VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY_PREFIX + phone.getSubId();
-    }
-}
