diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 2bad86e..352029d 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -532,23 +532,6 @@
             " SET " + RawContacts.DIRTY + "=1" +
             " WHERE " + RawContacts._ID + " IN (";
 
-    /** Sql for updating METADATA_DIRTY flag on multiple raw contacts */
-    private static final String UPDATE_RAW_CONTACT_SET_METADATA_DIRTY_SQL =
-            "UPDATE " + Tables.RAW_CONTACTS +
-                    " SET " + RawContacts.METADATA_DIRTY + "=1" +
-                    " WHERE " + RawContacts._ID + " IN (";
-
-    // Sql for updating MetadataSync.DELETED flag on multiple raw contacts.
-    // When using this sql, add comma separated raw contacts ids and "))".
-    private static final String UPDATE_METADATASYNC_SET_DELETED_SQL =
-            "UPDATE " + Tables.METADATA_SYNC
-                    + " SET " + MetadataSync.DELETED + "=1"
-                    + " WHERE " + MetadataSync._ID + " IN "
-                            + "(SELECT " + MetadataSyncColumns.CONCRETE_ID
-                            + " FROM " + Tables.RAW_CONTACTS_JOIN_METADATA_SYNC
-                            + " WHERE " + RawContactsColumns.CONCRETE_DELETED + "=1 AND "
-                            + RawContactsColumns.CONCRETE_ID + " IN (";
-
     /** Sql for updating VERSION on multiple raw contacts */
     private static final String UPDATE_RAW_CONTACT_SET_VERSION_SQL =
             "UPDATE " + Tables.RAW_CONTACTS +
@@ -2433,14 +2416,6 @@
         for (long rawContactId : mTransactionContext.get().getInsertedRawContactIds()) {
             mDbHelper.get().updateRawContactDisplayName(db, rawContactId);
             mAggregator.get().onRawContactInsert(mTransactionContext.get(), db, rawContactId);
-            if (mMetadataSyncEnabled) {
-                updateMetadataOnRawContactInsert(db, rawContactId);
-            }
-        }
-        if (mMetadataSyncEnabled) {
-            for (long rawContactId : mTransactionContext.get().getBackupIdChangedRawContacts()) {
-                updateMetadataOnRawContactInsert(db, rawContactId);
-            }
         }
 
         final Set<Long> dirtyRawContacts = mTransactionContext.get().getDirtyRawContactIds();
@@ -2461,29 +2436,8 @@
             db.execSQL(mSb.toString());
         }
 
-        final Set<Long> metadataDirtyRawContacts =
-                mTransactionContext.get().getMetadataDirtyRawContactIds();
-        if (!metadataDirtyRawContacts.isEmpty() && mMetadataSyncEnabled) {
-            mSb.setLength(0);
-            mSb.append(UPDATE_RAW_CONTACT_SET_METADATA_DIRTY_SQL);
-            appendIds(mSb, metadataDirtyRawContacts);
-            mSb.append(")");
-            db.execSQL(mSb.toString());
-            mSyncToMetadataNetWork = true;
-        }
-
         final Set<Long> changedRawContacts = mTransactionContext.get().getChangedRawContactIds();
         ContactsTableUtil.updateContactLastUpdateByRawContactId(db, changedRawContacts);
-        if (!changedRawContacts.isEmpty() && mMetadataSyncEnabled) {
-            // For the deleted raw contact, set related metadata as deleted
-            // if metadata flag is enabled.
-            mSb.setLength(0);
-            mSb.append(UPDATE_METADATASYNC_SET_DELETED_SQL);
-            appendIds(mSb, changedRawContacts);
-            mSb.append("))");
-            db.execSQL(mSb.toString());
-            mSyncToMetadataNetWork = true;
-        }
 
         // Update sync states.
         for (Map.Entry<Long, Object> entry : mTransactionContext.get().getUpdatedSyncStates()) {
@@ -2502,49 +2456,6 @@
         mMetadataSyncEnabled = enabled;
     }
 
-    interface MetadataSyncQuery {
-        String TABLE = Tables.RAW_CONTACTS_JOIN_METADATA_SYNC;
-        String[] COLUMNS = new String[] {
-                MetadataSyncColumns.CONCRETE_ID,
-                MetadataSync.DATA
-        };
-        int METADATA_SYNC_ID = 0;
-        int METADATA_SYNC_DATA = 1;
-        String SELECTION = MetadataSyncColumns.CONCRETE_DELETED + "=0 AND " +
-                RawContactsColumns.CONCRETE_ID + "=?";
-    }
-
-    /**
-     * Fetch the related metadataSync data column for the raw contact id.
-     * Returns null if there's no metadata for the raw contact.
-     */
-    private String queryMetadataSyncData(SQLiteDatabase db, long rawContactId) {
-        String metadataSyncData = null;
-        mSelectionArgs1[0] = String.valueOf(rawContactId);
-        final Cursor cursor = db.query(MetadataSyncQuery.TABLE,
-                MetadataSyncQuery.COLUMNS, MetadataSyncQuery.SELECTION,
-                mSelectionArgs1, null, null, null);
-        try {
-            if (cursor.moveToFirst()) {
-                metadataSyncData = cursor.getString(MetadataSyncQuery.METADATA_SYNC_DATA);
-            }
-        } finally {
-            cursor.close();
-        }
-        return metadataSyncData;
-    }
-
-    private void updateMetadataOnRawContactInsert(SQLiteDatabase db, long rawContactId) {
-        // Read metadata from MetadataSync table for the raw contact, and update.
-        final String metadataSyncData = queryMetadataSyncData(db, rawContactId);
-        if (TextUtils.isEmpty(metadataSyncData)) {
-            return;
-        }
-        final MetadataEntry metadataEntry = MetadataEntryParser.parseDataToMetaDataEntry(
-                metadataSyncData);
-        updateFromMetaDataEntry(db, metadataEntry);
-    }
-
     /**
      * Appends comma separated IDs.
      * @param ids Should not be empty
@@ -2566,10 +2477,7 @@
 
     protected void notifyChange(boolean syncToNetwork, boolean syncToMetadataNetwork) {
         getContext().getContentResolver().notifyChange(ContactsContract.AUTHORITY_URI, null,
-                syncToNetwork || syncToMetadataNetwork);
-
-        getContext().getContentResolver().notifyChange(MetadataSync.METADATA_AUTHORITY_URI,
-                null, syncToMetadataNetwork);
+                syncToNetwork);
     }
 
     protected void setProviderStatus(int status) {
@@ -2837,7 +2745,6 @@
             values.put(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED);
         }
 
-        final boolean needToUpdateMetadata = shouldMarkMetadataDirtyForRawContact(values);
         // Databases that were created prior to the 906 upgrade have a default of Int.MAX_VALUE
         // for RawContacts.PINNED. Manually set the value to the correct default (0) if it is not
         // set.
@@ -2849,14 +2756,6 @@
         final SQLiteDatabase db = mDbHelper.get().getWritableDatabase();
         final long rawContactId = db.insert(Tables.RAW_CONTACTS, RawContacts.CONTACT_ID, values);
 
-        if (needToUpdateMetadata) {
-            mTransactionContext.get().markRawContactMetadataDirty(rawContactId,
-                    /* isMetadataSyncAdapter =*/false);
-        }
-        // If the new raw contact is inserted by a sync adapter, mark mSyncToMetadataNetWork as true
-        // so that it can trigger the metadata syncing from the server.
-        mSyncToMetadataNetWork |= callerIsSyncAdapter;
-
         final int aggregationMode = getIntValue(values, RawContacts.AGGREGATION_MODE,
                 RawContacts.AGGREGATION_MODE_DEFAULT);
         mAggregator.get().markNewForAggregation(rawContactId, aggregationMode);
@@ -4552,7 +4451,6 @@
         final boolean isDataSetChanging = values.containsKey(RawContacts.DATA_SET);
         final boolean isAccountChanging =
                 isAccountNameChanging || isAccountTypeChanging || isDataSetChanging;
-        final boolean isBackupIdChanging = values.containsKey(RawContacts.BACKUP_ID);
 
         int previousDeleted = 0;
         long accountId = 0;
@@ -4615,32 +4513,6 @@
             if (aggregationMode != RawContacts.AGGREGATION_MODE_DEFAULT) {
                 aggregator.markForAggregation(rawContactId, aggregationMode, false);
             }
-            if (shouldMarkMetadataDirtyForRawContact(values)) {
-                mTransactionContext.get().markRawContactMetadataDirty(
-                        rawContactId, callerIsMetadataSyncAdapter);
-            }
-            if (isBackupIdChanging) {
-                Cursor cursor = db.query(Tables.RAW_CONTACTS,
-                        new String[] {RawContactsColumns.CONCRETE_METADATA_DIRTY},
-                        selection, mSelectionArgs1, null, null, null);
-                int metadataDirty = 0;
-                try {
-                    if (cursor.moveToFirst()) {
-                        metadataDirty = cursor.getInt(0);
-                    }
-                } finally {
-                    cursor.close();
-                }
-
-                if (metadataDirty == 1) {
-                    // Re-notify metadata network if backup_id is updated and metadata is dirty.
-                    mTransactionContext.get().markRawContactMetadataDirty(
-                            rawContactId, callerIsMetadataSyncAdapter);
-                } else {
-                    // Merge from metadata sync table if backup_id is updated and no dirty change.
-                    mTransactionContext.get().markBackupIdChangedRawContact(rawContactId);
-                }
-            }
             if (flagExists(values, RawContacts.STARRED)) {
                 if (!callerIsSyncAdapter) {
                     updateFavoritesMembership(rawContactId, flagIsSet(values, RawContacts.STARRED));
@@ -4814,10 +4686,6 @@
             // Mark dirty when changing starred to trigger sync.
             values.put(RawContacts.DIRTY, 1);
         }
-        if (mMetadataSyncEnabled && (hasStarredValue || hasPinnedValue || hasVoiceMailValue)) {
-            // Mark dirty to trigger metadata syncing.
-            values.put(RawContacts.METADATA_DIRTY, 1);
-        }
 
         mSelectionArgs1[0] = String.valueOf(contactId);
         db.update(Tables.RAW_CONTACTS, values, RawContacts.CONTACT_ID + "=?"
@@ -4835,11 +4703,6 @@
                                 flagIsSet(values, RawContacts.STARRED));
                         mSyncToNetwork |= !callerIsSyncAdapter;
                     }
-
-                    if (hasStarredValue || hasPinnedValue || hasVoiceMailValue) {
-                        mTransactionContext.get().markRawContactMetadataDirty(rawContactId,
-                                false /*callerIsMetadataSyncAdapter*/);
-                    }
                 }
             } finally {
                 cursor.close();
@@ -4917,21 +4780,12 @@
 
         aggregator.aggregateContact(mTransactionContext.get(), db, rawContactId1);
         aggregator.aggregateContact(mTransactionContext.get(), db, rawContactId2);
-        mTransactionContext.get().markRawContactMetadataDirty(rawContactId1,
-                callerIsMetadataSyncAdapter);
-        mTransactionContext.get().markRawContactMetadataDirty(rawContactId2,
-                callerIsMetadataSyncAdapter);
 
         // The return value is fake - we just confirm that we made a change, not count actual
         // rows changed.
         return 1;
     }
 
-    private boolean shouldMarkMetadataDirtyForRawContact(ContentValues values) {
-        return (flagExists(values, RawContacts.STARRED) || flagExists(values, RawContacts.PINNED)
-                || flagExists(values, RawContacts.SEND_TO_VOICEMAIL));
-    }
-
     @Override
     public void onAccountsUpdated(Account[] accounts) {
         scheduleBackgroundTask(BACKGROUND_TASK_UPDATE_ACCOUNTS);
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index 0ad1da6..d5643d2 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -3061,16 +3061,16 @@
         long rawContactId = RawContactUtil.createRawContactWithBackupId(mResolver, backupId,
                 account);
         Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
-        // Check if the raw contact is updated.
+        // Check if the raw contact is not updated since Lychee is removed.
         assertStoredValue(rawContactUri, RawContacts._ID, rawContactId);
         assertStoredValue(rawContactUri, RawContacts.ACCOUNT_TYPE, accountType);
         assertStoredValue(rawContactUri, RawContacts.ACCOUNT_NAME, accountName);
         assertStoredValue(rawContactUri, RawContacts.BACKUP_ID, backupId);
-        assertStoredValue(rawContactUri, RawContacts.SEND_TO_VOICEMAIL, "1");
-        assertStoredValue(rawContactUri, RawContacts.STARRED, "1");
-        assertStoredValue(rawContactUri, RawContacts.PINNED, "1");
-        // Notify metadata network on raw contact insertion
-        assertMetadataNetworkNotified(true);
+        assertStoredValue(rawContactUri, RawContacts.SEND_TO_VOICEMAIL, "0");
+        assertStoredValue(rawContactUri, RawContacts.STARRED, "0");
+        assertStoredValue(rawContactUri, RawContacts.PINNED, "0");
+        // No metadata network notify.
+        assertMetadataNetworkNotified(false);
     }
 
     public void testUpdateMetadataOnRawContactBackupIdChange() throws Exception {
@@ -3128,15 +3128,15 @@
         ContentValues updatedValues = new ContentValues();
         updatedValues.put(RawContacts.BACKUP_ID, backupId);
         mResolver.update(RawContacts.CONTENT_URI, updatedValues, null, null);
-        // Check if the raw contact is updated because of backup_id change.
+        // Check if the raw contact is still not updated.
         assertStoredValue(rawContactUri, RawContacts._ID, rawContactId);
         assertStoredValue(rawContactUri, RawContacts.ACCOUNT_TYPE, accountType);
         assertStoredValue(rawContactUri, RawContacts.ACCOUNT_NAME, accountName);
-        assertStoredValue(rawContactUri, RawContacts.SEND_TO_VOICEMAIL, "1");
-        assertStoredValue(rawContactUri, RawContacts.STARRED, "1");
-        assertStoredValue(rawContactUri, RawContacts.PINNED, "1");
-        // Notify metadata network because of the changed raw contact.
-        assertMetadataNetworkNotified(true);
+        assertStoredValue(rawContactUri, RawContacts.SEND_TO_VOICEMAIL, "0");
+        assertStoredValue(rawContactUri, RawContacts.STARRED, "0");
+        assertStoredValue(rawContactUri, RawContacts.PINNED, "0");
+        // No metadata network notify.
+        assertMetadataNetworkNotified(false);
     }
 
     public void testDeleteMetadataOnRawContactDelete() throws Exception {
@@ -3186,12 +3186,12 @@
 
         // Delete raw contact.
         mResolver.delete(rawContactUri, null, null);
-        // Check if the metadata is deleted.
-        assertStoredValue(metadataUri, MetadataSync.DELETED, "1");
+        // Check if the metadata is not deleted.
+        assertStoredValue(metadataUri, MetadataSync.DELETED, "0");
         // check raw contact metadata_dirty column is not changed on raw contact deletion
         assertMetadataDirty(rawContactUri, false);
-        // Notify metadata network on raw contact deletion
-        assertMetadataNetworkNotified(true);
+        // Lychee removed. Will not notify it.
+        assertMetadataNetworkNotified(false);
 
         // Add another rawcontact and metadata, and don't delete them.
         // Insert a raw contact.
@@ -3215,10 +3215,10 @@
 
         // Check if the metadata is not marked as deleted.
         assertStoredValue(metadataUri2, MetadataSync.DELETED, "0");
-        // check raw contact metadata_dirty column is changed on raw contact update
-        assertMetadataDirty(rawContactUri2, true);
-        // Notify metadata network on raw contact update
-        assertMetadataNetworkNotified(true);
+        // Will not set metadata_dirty since Lychee is removed.
+        assertMetadataDirty(rawContactUri2, false);
+        // Will not notify Lychee since it's removed.
+        assertMetadataNetworkNotified(false);
     }
 
     public void testPostalsQuery() {
@@ -5210,16 +5210,16 @@
         updateSendToVoicemailAndRingtone(contactId, true, "foo");
         assertSendToVoicemailAndRingtone(contactId, true, "foo");
         assertNetworkNotified(false);
-        assertMetadataNetworkNotified(true);
+        assertMetadataNetworkNotified(false);
         assertDirty(rawContactUri, false);
-        assertMetadataDirty(rawContactUri, true);
+        assertMetadataDirty(rawContactUri, false);
 
         updateSendToVoicemailAndRingtoneWithSelection(contactId, false, "bar");
         assertSendToVoicemailAndRingtone(contactId, false, "bar");
         assertNetworkNotified(false);
-        assertMetadataNetworkNotified(true);
+        assertMetadataNetworkNotified(false);
         assertDirty(rawContactUri, false);
-        assertMetadataDirty(rawContactUri, true);
+        assertMetadataDirty(rawContactUri, false);
     }
 
     public void testSendToVoicemailAndRingtoneAfterAggregation() {
@@ -5297,10 +5297,10 @@
 
         assertDirty(rawContactUri1, false);
         assertDirty(rawContactUri2, false);
-        assertMetadataDirty(rawContactUri1, true);
-        assertMetadataDirty(rawContactUri2, true);
+        assertMetadataDirty(rawContactUri1, false);
+        assertMetadataDirty(rawContactUri2, false);
         assertNetworkNotified(false);
-        assertMetadataNetworkNotified(true);
+        assertMetadataNetworkNotified(false);
     }
 
     public void testStatusUpdateInsert() {
@@ -6901,7 +6901,7 @@
         assertDirty(rawContactUri, false);
         assertMetadataDirty(rawContactUri, false);
         assertNetworkNotified(true);
-        assertMetadataNetworkNotified(true);
+        assertMetadataNetworkNotified(false);
 
         // When inserting a rawcontact with metadata.
         ContentValues values = new ContentValues();
@@ -6910,9 +6910,9 @@
         values.put(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccount.type);
         Uri rawContactId2Uri = mResolver.insert(RawContacts.CONTENT_URI, values);
         assertDirty(rawContactId2Uri, false);
-        assertMetadataDirty(rawContactId2Uri, true);
+        assertMetadataDirty(rawContactId2Uri, false);
         assertNetworkNotified(true);
-        assertMetadataNetworkNotified(true);
+        assertMetadataNetworkNotified(false);
     }
 
     public void testRawContactDirtyAndVersion() {
@@ -6934,8 +6934,8 @@
 
         assertDirty(uri, false);
         assertNetworkNotified(false);
-        assertMetadataDirty(uri, true);
-        assertMetadataNetworkNotified(true);
+        assertMetadataDirty(uri, false);
+        assertMetadataNetworkNotified(false);
 
         Uri emailUri = insertEmail(rawContactId, "goo@woo.com");
         assertDirty(uri, true);
@@ -7005,9 +7005,8 @@
         long rawContactId = ContentUris.parseId(mResolver.insert(uri, new ContentValues()));
         Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
         assertMetadataDirty(rawContactUri, false);
-        // If the raw contact is inserted by sync adapter, it will notify metadata change no matter
-        // if there is any metadata change.
-        assertMetadataNetworkNotified(true);
+        // Will not notify Lychee since it's removed.
+        assertMetadataNetworkNotified(false);
     }
 
     public void testMarkAsMetadataDirtyForRawContactMetadataChange() {
@@ -7025,8 +7024,8 @@
         assertStoredValue(contactUri, Contacts.STARRED, 1);
 
         Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
-        assertMetadataDirty(rawContactUri, true);
-        assertMetadataNetworkNotified(true);
+        assertMetadataDirty(rawContactUri, false);
+        assertMetadataNetworkNotified(false);
 
         clearMetadataDirty(rawContactUri);
         values = new ContentValues();
@@ -7034,8 +7033,8 @@
         mResolver.update(contactUri, values, null, null);
         assertStoredValue(contactUri, Contacts.PINNED, 1);
 
-        assertMetadataDirty(rawContactUri, true);
-        assertMetadataNetworkNotified(true);
+        assertMetadataDirty(rawContactUri, false);
+        assertMetadataNetworkNotified(false);
 
         clearMetadataDirty(rawContactUri);
         values = new ContentValues();
@@ -7043,8 +7042,8 @@
         mResolver.update(contactUri, values, null, null);
         assertStoredValue(contactUri, Contacts.SEND_TO_VOICEMAIL, 1);
 
-        assertMetadataDirty(rawContactUri, true);
-        assertMetadataNetworkNotified(true);
+        assertMetadataDirty(rawContactUri, false);
+        assertMetadataNetworkNotified(false);
     }
 
     public void testMarkAsMetadataDirtyForRawContactBackupIdChange() {
@@ -7059,15 +7058,15 @@
         ContentValues values = new ContentValues();
         values.put(RawContacts.SEND_TO_VOICEMAIL, "1");
         mResolver.update(rawContactUri, values, null, null);
-        assertMetadataDirty(rawContactUri, true);
+        assertMetadataDirty(rawContactUri, false);
 
         // Update the backup_id and check metadata network should be notified.
         values = new ContentValues();
         values.put(RawContacts.BACKUP_ID, "newBackupId");
         mResolver.update(rawContactUri, values, null, null);
         assertStoredValue(rawContactUri, RawContacts.BACKUP_ID, "newBackupId");
-        assertMetadataDirty(rawContactUri, true);
-        assertMetadataNetworkNotified(true);
+        assertMetadataDirty(rawContactUri, false);
+        assertMetadataNetworkNotified(false);
     }
 
     public void testMarkAsMetadataDirtyForAggregationExceptionChange() {
@@ -7082,10 +7081,10 @@
                 rawContactId1, rawContactId2);
 
         assertMetadataDirty(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1),
-                true);
+                false);
         assertMetadataDirty(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2),
-                true);
-        assertMetadataNetworkNotified(true);
+                false);
+        assertMetadataNetworkNotified(false);
     }
 
     public void testMarkAsMetadataNotDirtyForUsageStatsChange() {
@@ -7113,8 +7112,8 @@
         assertStoredValue(mailUri11, Data.IS_PRIMARY, 1);
         assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 1);
         assertMetadataDirty(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1),
-                true);
-        assertMetadataNetworkNotified(true);
+                false);
+        assertMetadataNetworkNotified(false);
     }
 
     public void testMarkAsMetadataDirtyForDataPrimarySettingUpdate() {
@@ -7133,8 +7132,8 @@
         mResolver.update(mailUri1, values, null, null);
 
         assertMetadataDirty(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
-                true);
-        assertMetadataNetworkNotified(true);
+                false);
+        assertMetadataNetworkNotified(false);
     }
 
     public void testMarkAsMetadataDirtyForDataDelete() {
@@ -7148,8 +7147,8 @@
         mResolver.delete(mailUri1, null, null);
 
         assertMetadataDirty(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
-                true);
-        assertMetadataNetworkNotified(true);
+                false);
+        assertMetadataNetworkNotified(false);
     }
 
     public void testDeleteContactWithoutName() {
@@ -9021,9 +9020,9 @@
 
         ContactUtil.update(mResolver, ids.mContactId, values);
         assertDirty(rawContactUri, false);
-        assertMetadataDirty(rawContactUri, true);
+        assertMetadataDirty(rawContactUri, false);
         assertNetworkNotified(false);
-        assertMetadataNetworkNotified(true);
+        assertMetadataNetworkNotified(false);
     }
 
     public void testContactUpdate_updatesContactUpdatedTimestamp() {
