diff --git a/src/com/android/providers/telephony/TelephonyBackupAgent.java b/src/com/android/providers/telephony/TelephonyBackupAgent.java
index 748a703..61796a2 100644
--- a/src/com/android/providers/telephony/TelephonyBackupAgent.java
+++ b/src/com/android/providers/telephony/TelephonyBackupAgent.java
@@ -194,7 +194,8 @@
             Telephony.Mms.MMS_VERSION,
             Telephony.Mms.MESSAGE_BOX,
             Telephony.Mms.CONTENT_LOCATION,
-            Telephony.Mms.THREAD_ID
+            Telephony.Mms.THREAD_ID,
+            Telephony.Mms.TRANSACTION_ID
     };
 
     // Columns from addr database for backup/restore. This database is used for fetching addresses
@@ -267,6 +268,7 @@
 
     private SparseArray<String> mSubId2phone = new SparseArray<String>();
     private Map<String, Integer> mPhone2subId = new ArrayMap<String, Integer>();
+    private Map<Long, Boolean> mThreadArchived = new HashMap<>();
 
     private ContentResolver mContentResolver;
     // How many bytes we can backup to fit into quota.
@@ -360,6 +362,8 @@
                 backupAll(data, mmsCursor, String.format(MMS_BACKUP_FILE_FORMAT, fileNum++));
             }
         }
+
+        mThreadArchived = new HashMap<>();
     }
 
     @VisibleForTesting
@@ -654,8 +658,7 @@
                     break;
                 case Telephony.Sms.THREAD_ID:
                     final long threadId = cursor.getLong(i);
-                    writeRecipientsToWriter(jsonWriter.name(RECIPIENTS),
-                            getRecipientsByThread(threadId));
+                    handleThreadId(jsonWriter, threadId);
                     break;
                 case Telephony.Sms._ID:
                     break;
@@ -668,6 +671,36 @@
 
     }
 
+    private void handleThreadId(JsonWriter jsonWriter, long threadId) throws IOException {
+        writeRecipientsToWriter(jsonWriter.name(RECIPIENTS),
+                getRecipientsByThread(threadId));
+        if (!mThreadArchived.containsKey(threadId)) {
+            boolean isArchived = isThreadArchived(threadId);
+            if (isArchived) {
+                jsonWriter.name(Telephony.Threads.ARCHIVED).value(true);
+            }
+            mThreadArchived.put(threadId, isArchived);
+        }
+    }
+
+    private static String[] THREAD_ARCHIVED_PROJECTION =
+            new String[] { Telephony.Threads.ARCHIVED };
+    private static int THREAD_ARCHIVED_IDX = 0;
+
+    private boolean isThreadArchived(long threadId) {
+        Uri.Builder builder = Telephony.Threads.CONTENT_URI.buildUpon();
+        builder.appendPath(String.valueOf(threadId)).appendPath("recipients");
+        Uri uri = builder.build();
+
+        try (Cursor cursor = getContentResolver().query(uri, THREAD_ARCHIVED_PROJECTION, null, null,
+                null)) {
+            if (cursor.moveToFirst()) {
+                return cursor.getInt(THREAD_ARCHIVED_IDX) == 1;
+            }
+        }
+        return false;
+    }
+
     private static void writeRecipientsToWriter(JsonWriter jsonWriter, List<String> recipients)
             throws IOException {
         jsonWriter.beginArray();
@@ -683,6 +716,8 @@
             throws IOException {
         ContentValues values = new ContentValues(8+sDefaultValuesSms.size());
         values.putAll(sDefaultValuesSms);
+        long threadId = -1;
+        boolean isArchived = false;
         jsonReader.beginObject();
         while (jsonReader.hasNext()) {
             String name = jsonReader.nextName();
@@ -697,8 +732,11 @@
                     values.put(name, jsonReader.nextString());
                     break;
                 case RECIPIENTS:
-                    values.put(Telephony.Sms.THREAD_ID,
-                            getOrCreateThreadId(getRecipients(jsonReader)));
+                    threadId = getOrCreateThreadId(getRecipients(jsonReader));
+                    values.put(Telephony.Sms.THREAD_ID, threadId);
+                    break;
+                case Telephony.Threads.ARCHIVED:
+                    isArchived = jsonReader.nextBoolean();
                     break;
                 case SELF_PHONE_KEY:
                     final String selfPhone = jsonReader.nextString();
@@ -715,6 +753,7 @@
             }
         }
         jsonReader.endObject();
+        archiveThread(threadId, isArchived);
         return values;
     }
 
@@ -753,8 +792,7 @@
                     break;
                 case Telephony.Mms.THREAD_ID:
                     final long threadId = cursor.getLong(i);
-                    writeRecipientsToWriter(jsonWriter.name(RECIPIENTS),
-                            getRecipientsByThread(threadId));
+                    handleThreadId(jsonWriter, threadId);
                     break;
                 case Telephony.Mms._ID:
                 case Telephony.Mms.SUBJECT_CHARSET:
@@ -787,6 +825,8 @@
         mms.values.putAll(sDefaultValuesMms);
         jsonReader.beginObject();
         String bodyText = null;
+        long threadId = -1;
+        boolean isArchived = false;
         int bodyCharset = CharacterSets.DEFAULT_CHARSET;
         while (jsonReader.hasNext()) {
             String name = jsonReader.nextName();
@@ -807,8 +847,11 @@
                     bodyCharset = jsonReader.nextInt();
                     break;
                 case RECIPIENTS:
-                    mms.values.put(Telephony.Sms.THREAD_ID,
-                            getOrCreateThreadId(getRecipients(jsonReader)));
+                    threadId = getOrCreateThreadId(getRecipients(jsonReader));
+                    mms.values.put(Telephony.Sms.THREAD_ID, threadId);
+                    break;
+                case Telephony.Threads.ARCHIVED:
+                    isArchived = jsonReader.nextBoolean();
                     break;
                 case Telephony.Mms.SUBJECT:
                 case Telephony.Mms.SUBJECT_CHARSET:
@@ -818,6 +861,7 @@
                 case Telephony.Mms.MMS_VERSION:
                 case Telephony.Mms.MESSAGE_BOX:
                 case Telephony.Mms.CONTENT_LOCATION:
+                case Telephony.Mms.TRANSACTION_ID:
                     mms.values.put(name, jsonReader.nextString());
                     break;
                 default:
@@ -840,9 +884,30 @@
             mms.values.put(Telephony.Mms.SUBJECT_CHARSET, CharacterSets.DEFAULT_CHARSET);
         }
 
+        archiveThread(threadId, isArchived);
+
         return mms;
     }
 
+    private static final String ARCHIVE_THREAD_SELECTION = Telephony.Threads._ID + "=?";
+
+    private void archiveThread(long threadId, boolean isArchived) {
+        if (threadId < 0 || !isArchived) {
+            return;
+        }
+        final ContentValues values = new ContentValues(1);
+        values.put(Telephony.Threads.ARCHIVED, 1);
+        if (mContentResolver.update(
+                Telephony.Threads.CONTENT_URI,
+                values,
+                ARCHIVE_THREAD_SELECTION,
+                new String[] { Long.toString(threadId)}) != 1) {
+            if (DEBUG) {
+                Log.e(TAG, "archiveThread: failed to update database");
+            }
+        }
+    }
+
     private MmsBody getMmsBody(int mmsId) {
         Uri MMS_PART_CONTENT_URI = Telephony.Mms.CONTENT_URI.buildUpon()
                 .appendPath(String.valueOf(mmsId)).appendPath("part").build();
diff --git a/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
index 8bf45c9..5869a84 100644
--- a/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
@@ -48,6 +48,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -125,8 +126,9 @@
         mSmsJson[0] = "{\"self_phone\":\"+111111111111111\",\"address\":" +
                 "\"+1232132214124\",\"body\":\"sms 1\",\"subject\":\"sms subject\",\"date\":" +
                 "\"9087978987\",\"date_sent\":\"999999999\",\"status\":\"3\",\"type\":\"44\"," +
-                "\"recipients\":[\"+123 (213) 2214124\"]}";
-        mThreadProvider.getOrCreateThreadId(new String[]{"+123 (213) 2214124"});
+                "\"recipients\":[\"+123 (213) 2214124\"],\"archived\":true}";
+        mThreadProvider.setArchived(
+                mThreadProvider.getOrCreateThreadId(new String[]{"+123 (213) 2214124"}));
 
         mSmsRows[1] = createSmsRow(2, 2, "+1232132214124", "sms 2", null, 9087978987l, 999999999,
                 0, 4, 1);
@@ -198,7 +200,7 @@
         mMmsJson[2] = "{\"self_phone\":\"+333333333333333\",\"sub\":\"Subject 10\"," +
                 "\"date\":\"111133\",\"date_sent\":\"1111132\",\"m_type\":\"5\",\"v\":\"19\"," +
                 "\"msg_box\":\"333\"," +
-                "\"recipients\":[\"+123 (213) 2214124\"]," +
+                "\"recipients\":[\"+123 (213) 2214124\"],\"archived\":true," +
                 "\"mms_addresses\":" +
                 "[{\"type\":10,\"address\":\"333 333333333333\",\"charset\":100}," +
                 "{\"type\":11,\"address\":\"+1232132214124\",\"charset\":101}]," +
@@ -488,6 +490,7 @@
         mMockContentResolver.addProvider("sms", smsProvider);
         mTelephonyBackupAgent.putSmsMessagesToProvider(jsonReader);
         assertEquals(mSmsRows.length, smsProvider.getRowsAdded());
+        assertEquals(mThreadProvider.mIsThreadArchived, mThreadProvider.mUpdateThreadsArchived);
     }
 
     /**
@@ -512,6 +515,7 @@
         mMockContentResolver.addProvider("mms", mmsProvider);
         mTelephonyBackupAgent.putMmsMessagesToProvider(jsonReader);
         assertEquals(18, mmsProvider.getRowsAdded());
+        assertEquals(mThreadProvider.mIsThreadArchived, mThreadProvider.mUpdateThreadsArchived);
     }
 
     /**
@@ -703,6 +707,9 @@
     private static class ThreadProvider extends MockContentProvider {
         ArrayList<Set<Integer> > id2Thread = new ArrayList<>();
         ArrayList<String> id2Recipient = new ArrayList<>();
+        Set<Integer> mIsThreadArchived = new HashSet<>();
+        Set<Integer> mUpdateThreadsArchived = new HashSet<>();
+
 
         public int getOrCreateThreadId(final String[] recipients) {
             Set<Integer> ids = new ArraySet<>();
@@ -718,6 +725,10 @@
             return id2Thread.indexOf(ids)+1;
         }
 
+        public void setArchived(int threadId) {
+            mIsThreadArchived.add(threadId);
+        }
+
         private String getSpaceSepIds(int threadId) {
             String spaceSepIds = null;
             for (Integer id : id2Thread.get(threadId-1)) {
@@ -741,6 +752,16 @@
                 row.put(Telephony.Threads.RECIPIENT_IDS, spaceSepIds);
                 table.add(row);
                 return new FakeCursor(table, projection);
+            } else if (uri.toString().startsWith(Telephony.Threads.CONTENT_URI.toString())) {
+                assertEquals(1, projection.length);
+                assertEquals(Telephony.Threads.ARCHIVED, projection[0]);
+                List<String> segments = uri.getPathSegments();
+                final int threadId = Integer.parseInt(segments.get(segments.size() - 2));
+                List<ContentValues> table = new ArrayList<>();
+                ContentValues row = new ContentValues();
+                row.put(Telephony.Threads.ARCHIVED, mIsThreadArchived.contains(threadId) ? 1 : 0);
+                table.add(row);
+                return new FakeCursor(table, projection);
             } else if (uri.toString().startsWith(
                     TelephonyBackupAgent.SINGLE_CANONICAL_ADDRESS_URI.toString())) {
                 final int recipientId = (int)ContentUris.parseId(uri);
@@ -765,9 +786,20 @@
                 row.put(BaseColumns._ID, String.valueOf(threadId));
                 table.add(row);
                 return new FakeCursor(table, projection);
-            };
+            } else {
+                fail("Unknown URI");
+            }
             return null;
         }
+
+        @Override
+        public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+            assertEquals(uri, Telephony.Threads.CONTENT_URI);
+            assertEquals(values.getAsInteger(Telephony.Threads.ARCHIVED).intValue(), 1);
+            final int threadId = Integer.parseInt(selectionArgs[0]);
+            mUpdateThreadsArchived.add(threadId);
+            return 1;
+        }
     }
 
     /**
