diff --git a/res/xml/respond_via_sms_settings.xml b/res/xml/respond_via_sms_settings.xml
index 7f79a5c..3c658ef 100644
--- a/res/xml/respond_via_sms_settings.xml
+++ b/res/xml/respond_via_sms_settings.xml
@@ -35,24 +35,32 @@
          EditTextPreference here, to allow the preference "title" to wrap
          onto multiple lines if the customized messages are long enough. -->
 
+    <!-- These preferences are not persisted, so that they will update
+         when the localization is changed. RespondViaSmsSettings handles
+         the logic of storing user-specified preference changes. -->
+
     <com.android.server.telecom.MultiLineTitleEditTextPreference
         android:key="canned_response_pref_1"
         android:defaultValue="@string/respond_via_sms_canned_response_1"
-        android:dialogTitle="@string/respond_via_sms_edittext_dialog_title" />
+        android:dialogTitle="@string/respond_via_sms_edittext_dialog_title"
+        android:persistent="false" />
 
     <com.android.server.telecom.MultiLineTitleEditTextPreference
         android:key="canned_response_pref_2"
         android:defaultValue="@string/respond_via_sms_canned_response_2"
-        android:dialogTitle="@string/respond_via_sms_edittext_dialog_title" />
+        android:dialogTitle="@string/respond_via_sms_edittext_dialog_title"
+        android:persistent="false" />
 
     <com.android.server.telecom.MultiLineTitleEditTextPreference
         android:key="canned_response_pref_3"
         android:defaultValue="@string/respond_via_sms_canned_response_3"
-        android:dialogTitle="@string/respond_via_sms_edittext_dialog_title" />
+        android:dialogTitle="@string/respond_via_sms_edittext_dialog_title"
+        android:persistent="false" />
 
     <com.android.server.telecom.MultiLineTitleEditTextPreference
         android:key="canned_response_pref_4"
         android:defaultValue="@string/respond_via_sms_canned_response_4"
-        android:dialogTitle="@string/respond_via_sms_edittext_dialog_title" />
+        android:dialogTitle="@string/respond_via_sms_edittext_dialog_title"
+        android:persistent="false" />
 
 </PreferenceScreen>
diff --git a/src/com/android/server/telecom/QuickResponseUtils.java b/src/com/android/server/telecom/QuickResponseUtils.java
index ec77b33..fd0dbd2 100644
--- a/src/com/android/server/telecom/QuickResponseUtils.java
+++ b/src/com/android/server/telecom/QuickResponseUtils.java
@@ -64,19 +64,16 @@
                 SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
         final Resources res = context.getResources();
 
-        final boolean responsesExist = prefs.contains(KEY_CANNED_RESPONSE_PREF_1);
+        final boolean responsesExist = prefs.contains(KEY_CANNED_RESPONSE_PREF_1)
+                || prefs.contains(KEY_CANNED_RESPONSE_PREF_2)
+                || prefs.contains(KEY_CANNED_RESPONSE_PREF_3)
+                || prefs.contains(KEY_CANNED_RESPONSE_PREF_4);
         if (responsesExist) {
-            // If one QuickResponse exists, they all exist.
+            // Skip if the user has set any canned responses.
             Log.d(LOG_TAG, "maybeMigrateLegacyQuickResponses() - Telecom QuickResponses exist");
             return;
         }
 
-        // Grab the all the default QuickResponses from our resources.
-        String cannedResponse1 = res.getString(R.string.respond_via_sms_canned_response_1);
-        String cannedResponse2 = res.getString(R.string.respond_via_sms_canned_response_2);
-        String cannedResponse3 = res.getString(R.string.respond_via_sms_canned_response_3);
-        String cannedResponse4 = res.getString(R.string.respond_via_sms_canned_response_4);
-
         Log.d(LOG_TAG, "maybeMigrateLegacyQuickResponses() - No local QuickResponses");
 
         // We don't have local QuickResponses, let's see if they live in
@@ -90,24 +87,31 @@
 
         // Read the old canned responses from the Telephony SharedPreference if possible.
         if (telephonyContext != null) {
-            // Note that if any one QuickResponse does not exist, we'll use the default
-            // value to populate it.
             Log.d(LOG_TAG, "maybeMigrateLegacyQuickResponses() - Using Telephony QuickResponses.");
             final SharedPreferences oldPrefs = telephonyContext.getSharedPreferences(
                     SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
-            cannedResponse1 = oldPrefs.getString(KEY_CANNED_RESPONSE_PREF_1, cannedResponse1);
-            cannedResponse2 = oldPrefs.getString(KEY_CANNED_RESPONSE_PREF_2, cannedResponse2);
-            cannedResponse3 = oldPrefs.getString(KEY_CANNED_RESPONSE_PREF_3, cannedResponse3);
-            cannedResponse4 = oldPrefs.getString(KEY_CANNED_RESPONSE_PREF_4, cannedResponse4);
-        }
+            if (!oldPrefs.contains(KEY_CANNED_RESPONSE_PREF_1)) {
+                // Skip migration if old responses don't exist.
+                // If they exist, the first canned response should be present.
+                return;
+            }
+            String cannedResponse1 = oldPrefs.getString(KEY_CANNED_RESPONSE_PREF_1,
+                    res.getString(R.string.respond_via_sms_canned_response_1));
+            String cannedResponse2 = oldPrefs.getString(KEY_CANNED_RESPONSE_PREF_2,
+                    res.getString(R.string.respond_via_sms_canned_response_2));
+            String cannedResponse3 = oldPrefs.getString(KEY_CANNED_RESPONSE_PREF_3,
+                    res.getString(R.string.respond_via_sms_canned_response_3));
+            String cannedResponse4 = oldPrefs.getString(KEY_CANNED_RESPONSE_PREF_4,
+                    res.getString(R.string.respond_via_sms_canned_response_4));
 
-        // Either way, write them back into Telecom SharedPreferences.
-        final SharedPreferences.Editor editor = prefs.edit();
-        editor.putString(KEY_CANNED_RESPONSE_PREF_1, cannedResponse1);
-        editor.putString(KEY_CANNED_RESPONSE_PREF_2, cannedResponse2);
-        editor.putString(KEY_CANNED_RESPONSE_PREF_3, cannedResponse3);
-        editor.putString(KEY_CANNED_RESPONSE_PREF_4, cannedResponse4);
-        editor.commit();
+            // Write them into Telecom SharedPreferences.
+            final SharedPreferences.Editor editor = prefs.edit();
+            editor.putString(KEY_CANNED_RESPONSE_PREF_1, cannedResponse1);
+            editor.putString(KEY_CANNED_RESPONSE_PREF_2, cannedResponse2);
+            editor.putString(KEY_CANNED_RESPONSE_PREF_3, cannedResponse3);
+            editor.putString(KEY_CANNED_RESPONSE_PREF_4, cannedResponse4);
+            editor.commit();
+        }
 
         Log.d(LOG_TAG, "maybeMigrateLegacyQuickResponses() - Done.");
         return;
diff --git a/src/com/android/server/telecom/RespondViaSmsSettings.java b/src/com/android/server/telecom/RespondViaSmsSettings.java
index 2283a88..f8aa568 100644
--- a/src/com/android/server/telecom/RespondViaSmsSettings.java
+++ b/src/com/android/server/telecom/RespondViaSmsSettings.java
@@ -24,6 +24,7 @@
 import android.preference.EditTextPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
 import android.view.Menu;
 import android.view.MenuItem;
 
@@ -37,6 +38,9 @@
  */
 public class RespondViaSmsSettings extends PreferenceActivity
         implements Preference.OnPreferenceChangeListener {
+
+    private SharedPreferences mPrefs;
+
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -47,8 +51,18 @@
         // old QuickResponses in Telephony pre L.
         QuickResponseUtils.maybeMigrateLegacyQuickResponses(this);
 
-        getPreferenceManager().setSharedPreferencesName(
-                QuickResponseUtils.SHARED_PREFERENCES_NAME);
+        getPreferenceManager().setSharedPreferencesName(QuickResponseUtils.SHARED_PREFERENCES_NAME);
+        mPrefs = getPreferenceManager().getSharedPreferences();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        PreferenceScreen preferenceScreen = getPreferenceScreen();
+        if (preferenceScreen != null) {
+            preferenceScreen.removeAll();
+        }
 
         // This preference screen is ultra-simple; it's just 4 plain
         // <EditTextPreference>s, one for each of the 4 "canned responses".
@@ -62,27 +76,10 @@
         // title any time the user edits one of the strings.)
 
         addPreferencesFromResource(R.xml.respond_via_sms_settings);
-
-        EditTextPreference pref;
-        pref = (EditTextPreference) findPreference(
-                QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_1);
-        pref.setTitle(pref.getText());
-        pref.setOnPreferenceChangeListener(this);
-
-        pref = (EditTextPreference) findPreference(
-                QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_2);
-        pref.setTitle(pref.getText());
-        pref.setOnPreferenceChangeListener(this);
-
-        pref = (EditTextPreference) findPreference(
-                QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_3);
-        pref.setTitle(pref.getText());
-        pref.setOnPreferenceChangeListener(this);
-
-        pref = (EditTextPreference) findPreference(
-                QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_4);
-        pref.setTitle(pref.getText());
-        pref.setOnPreferenceChangeListener(this);
+        initPref(findPreference(QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_1));
+        initPref(findPreference(QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_2));
+        initPref(findPreference(QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_3));
+        initPref(findPreference(QuickResponseUtils.KEY_CANNED_RESPONSE_PREF_4));
 
         ActionBar actionBar = getActionBar();
         if (actionBar != null) {
@@ -106,6 +103,10 @@
         // rather than pref.getText().)
         pref.setTitle((String) newValue);
 
+        // Save the new preference value.
+        SharedPreferences.Editor editor = mPrefs.edit();
+        editor.putString(pref.getKey(), (String) newValue).commit();
+
         return true;  // means it's OK to update the state of the Preference with the new value
     }
 
@@ -126,5 +127,15 @@
      */
     public static void goUpToTopLevelSetting(Activity activity) {
         activity.finish();
-     }
+    }
+
+    /**
+     * Initialize the preference to the persisted preference value or default text.
+     */
+    private void initPref(Preference preference) {
+        EditTextPreference pref = (EditTextPreference) preference;
+        pref.setText(mPrefs.getString(pref.getKey(), pref.getText()));
+        pref.setTitle(pref.getText());
+        pref.setOnPreferenceChangeListener(this);
+    }
 }
