diff --git a/src/com/android/providers/telephony/TelephonyBackupAgent.java b/src/com/android/providers/telephony/TelephonyBackupAgent.java
index c803b4f..e860332 100644
--- a/src/com/android/providers/telephony/TelephonyBackupAgent.java
+++ b/src/com/android/providers/telephony/TelephonyBackupAgent.java
@@ -125,8 +125,8 @@
     private static final String SELF_PHONE_KEY = "self_phone";
     // JSON key for list of addresses of MMS message.
     private static final String MMS_ADDRESSES_KEY = "mms_addresses";
-    // JSON key for list of recipients of sms message.
-    private static final String SMS_RECIPIENTS = "sms_recipients";
+    // JSON key for list of recipients of the message.
+    private static final String RECIPIENTS = "recipients";
     // JSON key for MMS body.
     private static final String MMS_BODY_KEY = "mms_body";
     // JSON key for MMS charset.
@@ -180,7 +180,8 @@
             Telephony.Mms.MMS_VERSION,
             Telephony.Mms.TEXT_ONLY,
             Telephony.Mms.MESSAGE_BOX,
-            Telephony.Mms.CONTENT_LOCATION
+            Telephony.Mms.CONTENT_LOCATION,
+            Telephony.Mms.THREAD_ID
     };
 
     // Columns from addr database for backup/restore. This database is used for fetching addresses
@@ -324,8 +325,8 @@
             if (cursor != null) {
                 while (!cursor.isLast() && !cursor.isAfterLast()) {
                     try (JsonWriter jsonWriter = getJsonWriter(MMS_BACKUP_FILE)) {
-                        putMmsMessagesToJson(cursor, mMmsProvider, subId2phone, jsonWriter,
-                                MAX_MSG_PER_FILE);
+                        putMmsMessagesToJson(cursor, mMmsProvider, mMmsSmsProvider, subId2phone,
+                                jsonWriter, MAX_MSG_PER_FILE);
                     }
                     backupFile(MMS_BACKUP_FILE, data);
                 }
@@ -335,11 +336,13 @@
 
     @VisibleForTesting
     static void putMmsMessagesToJson(Cursor cursor, ContentProvider mmsProvider,
+                                     ContentProvider threadProvider,
                                      SparseArray<String> subId2phone, JsonWriter jsonWriter,
                                      int maxMsgPerFile) throws IOException {
         jsonWriter.beginArray();
         for (int msgCount=0; msgCount<maxMsgPerFile && cursor.moveToNext();) {
-            msgCount += writeMmsToWriter(jsonWriter, cursor, subId2phone, mmsProvider);
+            msgCount +=
+                    writeMmsToWriter(cursor, mmsProvider, threadProvider, subId2phone, jsonWriter);
         }
         jsonWriter.endArray();
     }
@@ -495,7 +498,7 @@
                     break;
                 case Telephony.Sms.THREAD_ID:
                     final long threadId = cursor.getLong(i);
-                    writeSmsRecipientsToWriter(jsonWriter.name(SMS_RECIPIENTS),
+                    writeRecipientsToWriter(jsonWriter.name(RECIPIENTS),
                             getRecipientsByThread(threadProvider, threadId));
                     break;
                 case Telephony.Sms._ID:
@@ -509,7 +512,7 @@
 
     }
 
-    private static void writeSmsRecipientsToWriter(JsonWriter jsonWriter, List<String> recipients)
+    private static void writeRecipientsToWriter(JsonWriter jsonWriter, List<String> recipients)
             throws IOException {
         jsonWriter.beginArray();
         if (recipients != null) {
@@ -540,9 +543,9 @@
                 case Telephony.Sms.ADDRESS:
                     values.put(name, jsonReader.nextString());
                     break;
-                case SMS_RECIPIENTS:
+                case RECIPIENTS:
                     values.put(Telephony.Sms.THREAD_ID,
-                            getOrCreateThreadId(threadProvider, getSmsRecipients(jsonReader)));
+                            getOrCreateThreadId(threadProvider, getRecipients(jsonReader)));
                     break;
                 case SELF_PHONE_KEY:
                     final String selfPhone = jsonReader.nextString();
@@ -562,7 +565,7 @@
         return values;
     }
 
-    private static Set<String> getSmsRecipients(JsonReader jsonReader) throws IOException {
+    private static Set<String> getRecipients(JsonReader jsonReader) throws IOException {
         Set<String> recipients = new ArraySet<String>();
         jsonReader.beginArray();
         while (jsonReader.hasNext()) {
@@ -572,9 +575,10 @@
         return recipients;
     }
 
-    private static int writeMmsToWriter(JsonWriter jsonWriter, Cursor cursor,
+    private static int writeMmsToWriter(Cursor cursor, ContentProvider mmsProvider,
+                                        ContentProvider threadProvider,
                                         SparseArray<String> subId2phone,
-                                        ContentProvider mmsProvider) throws IOException {
+                                        JsonWriter jsonWriter) throws IOException {
         // Do not backup non text-only MMS's.
         if (cursor.getInt(cursor.getColumnIndex(Telephony.Mms.TEXT_ONLY)) != 1) {
             return 0;
@@ -594,13 +598,18 @@
                 continue;
             }
             switch (name) {
-                case Telephony.Sms.SUBSCRIPTION_ID:
+                case Telephony.Mms.SUBSCRIPTION_ID:
                     final int subId = cursor.getInt(i);
                     final String selfNumber = subId2phone.get(subId);
                     if (selfNumber != null) {
                         jsonWriter.name(SELF_PHONE_KEY).value(selfNumber);
                     }
                     break;
+                case Telephony.Mms.THREAD_ID:
+                    final long threadId = cursor.getLong(i);
+                    writeRecipientsToWriter(jsonWriter.name(RECIPIENTS),
+                            getRecipientsByThread(threadProvider, threadId));
+                    break;
                 case Telephony.Mms._ID:
                 case Telephony.Mms.TEXT_ONLY:
                 case Telephony.Mms.SUBJECT_CHARSET:
@@ -633,14 +642,13 @@
         mms.values = new ContentValues(6+defaultValuesMms.size());
         mms.values.putAll(defaultValuesMms);
         jsonReader.beginObject();
-        String selfPhone = null;
         String bodyText = null;
         int bodyCharset = CharacterSets.DEFAULT_CHARSET;
         while (jsonReader.hasNext()) {
             String name = jsonReader.nextName();
             switch (name) {
                 case SELF_PHONE_KEY:
-                    selfPhone = jsonReader.nextString();
+                    final String selfPhone = jsonReader.nextString();
                     if (phone2id.containsKey(selfPhone)) {
                         mms.values.put(Telephony.Mms.SUBSCRIPTION_ID, phone2id.get(selfPhone));
                     }
@@ -654,6 +662,10 @@
                 case MMS_BODY_CHARSET_KEY:
                     bodyCharset = jsonReader.nextInt();
                     break;
+                case RECIPIENTS:
+                    mms.values.put(Telephony.Sms.THREAD_ID,
+                            getOrCreateThreadId(threadProvider, getRecipients(jsonReader)));
+                    break;
                 case Telephony.Mms.SUBJECT:
                 case Telephony.Mms.SUBJECT_CHARSET:
                 case Telephony.Mms.DATE:
@@ -678,21 +690,6 @@
             mms.body = new MmsBody(bodyText, bodyCharset);
         }
 
-        { // Get ThreadId.
-            Set<String> recipients = new ArraySet<String>();
-            for (ContentValues mmsAddress : mms.addresses) {
-                String address = getDecodedString(
-                        getStringBytes(mmsAddress.getAsString(Telephony.Mms.Addr.ADDRESS),
-                                CharacterSets.ISO_8859_1),
-                        mmsAddress.getAsInteger(Telephony.Mms.Addr.CHARSET));
-                if (selfPhone != null && selfPhone.equals(address))
-                    continue;
-                recipients.add(address);
-            }
-            mms.values.put(Telephony.Mms.THREAD_ID,
-                    getOrCreateThreadId(threadProvider, recipients));
-        }
-
         // Set default charset for subject.
         if (mms.values.get(Telephony.Mms.SUBJECT) != null &&
                 mms.values.get(Telephony.Mms.SUBJECT_CHARSET) == null) {
diff --git a/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
index e5ce2fb..1dcb3db 100644
--- a/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
@@ -77,9 +77,10 @@
     private Map<Uri, FakeCursor> mCursors;
     /* Content provider passed to the backupAgent */
     private MockContentProvider mContentProvider;
+    /* Content provider with threadIds.*/
+    private ThreadProvider mThreadProvider = new ThreadProvider();
 
     private static final String EMPTY_JSON_ARRAY = "[]";
-
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -109,13 +110,14 @@
         mSmsJson[0] = "{\"self_phone\":\"+111111111111111\",\"address\":" +
                 "\"+1232132214124\",\"body\":\"sms 1\",\"subject\":\"sms subject\",\"date\":" +
                 "\"9087978987\",\"date_sent\":\"999999999\",\"status\":\"3\",\"type\":\"44\"," +
-                "\"sms_recipients\":[\"+123 (213) 2214124\"]}";
+                "\"recipients\":[\"+123 (213) 2214124\"]}";
+        mThreadProvider.getOrCreateThreadId(new String[]{"+123 (213) 2214124"});
 
         mSmsRows[1] = createSmsRow(2, 2, "+1232132214124", "sms 2", null, 9087978987l, 999999999,
                 0, 4, 1);
         mSmsJson[1] = "{\"address\":\"+1232132214124\",\"body\":\"sms 2\",\"date\":" +
                 "\"9087978987\",\"date_sent\":\"999999999\",\"status\":\"0\",\"type\":\"4\"," +
-                "\"sms_recipients\":[\"+123 (213) 2214124\"]}";
+                "\"recipients\":[\"+123 (213) 2214124\"]}";
 
         mSmsRows[2] = createSmsRow(4, 3, "+1232221412433 +1232221412444", "sms 3", null,
                 111111111111l, 999999999, 2, 3, 2);
@@ -123,7 +125,8 @@
                 "\"+1232221412433 +1232221412444\",\"body\":\"sms 3\",\"date\":\"111111111111\"," +
                 "\"date_sent\":" +
                 "\"999999999\",\"status\":\"2\",\"type\":\"3\"," +
-                "\"sms_recipients\":[\"+1232221412433\",\"+1232221412444\"]}";
+                "\"recipients\":[\"+1232221412433\",\"+1232221412444\"]}";
+        mThreadProvider.getOrCreateThreadId(new String[]{"+1232221412433", "+1232221412444"});
 
         mAllSmsJson = makeJsonArray(mSmsJson);
 
@@ -136,39 +139,55 @@
                 17 /*version*/, 1 /*textonly*/,
                 11 /*msgBox*/, "location 1" /*contentLocation*/, "MMs body 1" /*body*/,
                 111 /*body charset*/,
-                new String[]{"+11121212", "example@example.com", "+999999999"} /*addresses*/,
-                1 /*threadId*/);
+                new String[]{"+111 (111) 11111111", "+11121212", "example@example.com",
+                        "+999999999"} /*addresses*/,
+                3 /*threadId*/);
 
         mMmsJson[0] = "{\"self_phone\":\"+111111111111111\",\"sub\":\"Subject 1\"," +
                 "\"date\":\"111111\",\"date_sent\":\"111112\",\"m_type\":\"3\",\"v\":\"17\"," +
-                "\"msg_box\":\"11\",\"ct_l\":\"location 1\",\"mms_addresses\":[{\"type\":10," +
-                "\"address\":\"+11121212\",\"charset\":100},{\"type\":11,\"address\":" +
-                "\"example@example.com\",\"charset\":101},{\"type\":12,\"address\":\"+999999999\"" +
-                ",\"charset\":102}],\"mms_body\":\"MMs body 1\",\"mms_charset\":111,\"" +
+                "\"msg_box\":\"11\",\"ct_l\":\"location 1\"," +
+                "\"recipients\":[\"+11121212\",\"example@example.com\",\"+999999999\"]," +
+                "\"mms_addresses\":" +
+                "[{\"type\":10,\"address\":\"+111 (111) 11111111\",\"charset\":100}," +
+                "{\"type\":11,\"address\":\"+11121212\",\"charset\":101},{\"type\":12,\"address\":"+
+                "\"example@example.com\",\"charset\":102},{\"type\":13,\"address\":\"+999999999\"" +
+                ",\"charset\":103}],\"mms_body\":\"MMs body 1\",\"mms_charset\":111,\"" +
                 "sub_cs\":\"100\"}";
+        mThreadProvider.getOrCreateThreadId(new String[]{"+11121212", "example@example.com",
+                "+999999999"});
 
         mMmsRows[1] = createMmsRow(2 /*id*/, 2 /*subid*/, null /*subject*/, 100 /*subcharset*/,
                 111122 /*date*/, 1111112 /*datesent*/, 4 /*type*/, 18 /*version*/, 1 /*textonly*/,
                 222 /*msgBox*/, "location 2" /*contentLocation*/, "MMs body 2" /*body*/,
                 121 /*body charset*/,
-                new String[]{"example@example.com", "+999999999"} /*addresses*/, 2 /*threadId*/);
-
+                new String[]{"+7 (333) ", "example@example.com", "+999999999"} /*addresses*/,
+                4 /*threadId*/);
         mMmsJson[1] = "{\"date\":\"111122\",\"date_sent\":\"1111112\",\"m_type\":\"4\"," +
-                "\"v\":\"18\",\"msg_box\":\"222\",\"ct_l\":\"location 2\",\"mms_addresses\":" +
-                "[{\"type\":10,\"address\":\"example@example.com\",\"charset\":100}," +
-                "{\"type\":11,\"address\":\"+999999999\",\"charset\":101}]," +
+                "\"v\":\"18\",\"msg_box\":\"222\",\"ct_l\":\"location 2\"," +
+                "\"recipients\":[\"example@example.com\",\"+999999999\"]," +
+                "\"mms_addresses\":" +
+                "[{\"type\":10,\"address\":\"+7 (333) \",\"charset\":100}," +
+                "{\"type\":11,\"address\":\"example@example.com\",\"charset\":101}," +
+                "{\"type\":12,\"address\":\"+999999999\",\"charset\":102}]," +
                 "\"mms_body\":\"MMs body 2\",\"mms_charset\":121}";
+        mThreadProvider.getOrCreateThreadId(new String[]{"example@example.com", "+999999999"});
 
-        mMmsRows[2] = createMmsRow(10 /*id*/, 3 /*subid*/, "Subject 10" /*subject*/,
+        mMmsRows[2] = createMmsRow(9 /*id*/, 3 /*subid*/, "Subject 10" /*subject*/,
                 10 /*subcharset*/, 111133 /*date*/, 1111132 /*datesent*/, 5 /*type*/,
                 19 /*version*/, 1 /*textonly*/,
                 333 /*msgBox*/, null /*contentLocation*/, "MMs body 3" /*body*/,
-                131 /*body charset*/, new String[]{"+8888888888"} /*addresses*/, 3 /*threadId*/);
+                131 /*body charset*/,
+                new String[]{"333 333333333333", "+1232132214124"} /*addresses*/,
+                1 /*threadId*/);
 
         mMmsJson[2] = "{\"self_phone\":\"+333333333333333\",\"sub\":\"Subject 10\"," +
                 "\"date\":\"111133\",\"date_sent\":\"1111132\",\"m_type\":\"5\",\"v\":\"19\"," +
-                "\"msg_box\":\"333\",\"mms_addresses\":[{\"type\":10,\"address\":\"+8888888888\"," +
-                "\"charset\":100}],\"mms_body\":\"MMs body 3\",\"mms_charset\":131," +
+                "\"msg_box\":\"333\"," +
+                "\"recipients\":[\"+123 (213) 2214124\"]," +
+                "\"mms_addresses\":" +
+                "[{\"type\":10,\"address\":\"333 333333333333\",\"charset\":100}," +
+                "{\"type\":11,\"address\":\"+1232132214124\",\"charset\":101}]," +
+                "\"mms_body\":\"MMs body 3\",\"mms_charset\":131," +
                 "\"sub_cs\":\"10\"}";
         mAllMmsJson = makeJsonArray(mMmsJson);
 
@@ -334,7 +353,7 @@
     public void testBackupSms_AllSms() throws Exception {
         mSmsTable.addAll(Arrays.asList(mSmsRows));
         TelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, mSubId2Phone,
-                new JsonWriter(mStringWriter), getThreadProviderForSmsBackup(), 4);
+                new JsonWriter(mStringWriter), mThreadProvider, 4);
         assertEquals(mAllSmsJson, mStringWriter.toString());
     }
 
@@ -345,7 +364,7 @@
     public void testBackupSms_AllSmsWithExactFileLimit() throws Exception {
         mSmsTable.addAll(Arrays.asList(mSmsRows));
         TelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, mSubId2Phone,
-                new JsonWriter(mStringWriter), getThreadProviderForSmsBackup(), 3);
+                new JsonWriter(mStringWriter), mThreadProvider, 3);
         assertEquals(mAllSmsJson, mStringWriter.toString());
     }
 
@@ -356,20 +375,18 @@
     public void testBackupSms_AllSmsOneMessagePerFile() throws Exception {
         mSmsTable.addAll(Arrays.asList(mSmsRows));
 
-        ThreadProvider threadProvider = getThreadProviderForSmsBackup();
-
         TelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, mSubId2Phone,
-                new JsonWriter(mStringWriter), threadProvider, 1);
+                new JsonWriter(mStringWriter), mThreadProvider, 1);
         assertEquals("[" + mSmsJson[0] + "]", mStringWriter.toString());
 
         mStringWriter = new StringWriter();
         TelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, mSubId2Phone,
-                new JsonWriter(mStringWriter), threadProvider, 1);
+                new JsonWriter(mStringWriter), mThreadProvider, 1);
         assertEquals("[" + mSmsJson[1] + "]", mStringWriter.toString());
 
         mStringWriter = new StringWriter();
         TelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, mSubId2Phone,
-                new JsonWriter(mStringWriter), threadProvider, 1);
+                new JsonWriter(mStringWriter), mThreadProvider, 1);
         assertEquals("[" + mSmsJson[2] + "]", mStringWriter.toString());
     }
 
@@ -378,8 +395,8 @@
      * @throws Exception
      */
     public void testBackupMms_NoMms() throws Exception {
-        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
-                new JsonWriter(mStringWriter), 4);
+        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider,
+                mThreadProvider, mSubId2Phone, new JsonWriter(mStringWriter), 4);
         assertEquals(EMPTY_JSON_ARRAY, mStringWriter.toString());
     }
 
@@ -390,8 +407,8 @@
     public void testBackupMms_AllMms() throws Exception {
         mMmsTable.addAll(Arrays.asList(mMmsRows));
         mMmsTable.add(mMmsNonText);
-        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
-                new JsonWriter(mStringWriter), 4);
+        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider,
+                mThreadProvider, mSubId2Phone, new JsonWriter(mStringWriter), 4);
         assertEquals(mAllMmsJson, mStringWriter.toString());
     }
 
@@ -401,18 +418,18 @@
      */
     public void testBackupMms_OneMessagePerFile() throws Exception {
         mMmsTable.addAll(Arrays.asList(mMmsRows));
-        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
-                new JsonWriter(mStringWriter), 1);
+        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider,
+                mThreadProvider, mSubId2Phone, new JsonWriter(mStringWriter), 1);
         assertEquals("[" + mMmsJson[0] + "]", mStringWriter.toString());
 
         mStringWriter = new StringWriter();
-        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
-                new JsonWriter(mStringWriter), 1);
+        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider,
+                mThreadProvider, mSubId2Phone, new JsonWriter(mStringWriter), 1);
         assertEquals("[" + mMmsJson[1] + "]", mStringWriter.toString());
 
         mStringWriter = new StringWriter();
-        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
-                new JsonWriter(mStringWriter), 2);
+        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider,
+                mThreadProvider, mSubId2Phone, new JsonWriter(mStringWriter), 1);
         assertEquals("[" + mMmsJson[2] + "]", mStringWriter.toString());
     }
 
@@ -422,8 +439,8 @@
      */
     public void testBackupMms_WithExactFileLimit() throws Exception {
         mMmsTable.addAll(Arrays.asList(mMmsRows));
-        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
-                new JsonWriter(mStringWriter), 3);
+        TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider,
+                mThreadProvider, mSubId2Phone, new JsonWriter(mStringWriter), 3);
         assertEquals(mAllMmsJson, mStringWriter.toString());
     }
 
@@ -471,15 +488,8 @@
         JsonReader jsonReader = new JsonReader(new StringReader(mAllMmsJson));
         FakeMmsProvider mmsProvider = new FakeMmsProvider(mMmsAllContentValues);
         TelephonyBackupAgent.putMmsMessagesToProvider(jsonReader, mmsProvider,
-                new ThreadProvider(), mPhone2SubId);
-        assertEquals(15, mmsProvider.getRowsAdded());
-    }
-
-    private ThreadProvider getThreadProviderForSmsBackup() {
-        ThreadProvider threadProvider = new ThreadProvider();
-        threadProvider.getOrCreateThreadId(new String[]{"+123 (213) 2214124"});
-        threadProvider.getOrCreateThreadId(new String[]{"+1232221412433", "+1232221412444"});
-        return threadProvider;
+                mThreadProvider, mPhone2SubId);
+        assertEquals(18, mmsProvider.getRowsAdded());
     }
 
     /**
@@ -584,7 +594,7 @@
             }
 
             for (String key : modifiedValues.keySet()) {
-                assertEquals(modifiedValues.get(key), values.get(key));
+                assertEquals("Key:"+key, modifiedValues.get(key), values.get(key));
             }
             assertEquals(modifiedValues.size(), values.size());
             return retUri;
