diff --git a/src/com/android/car/messenger/MessengerDelegate.java b/src/com/android/car/messenger/MessengerDelegate.java
index b2a5cda..6328905 100644
--- a/src/com/android/car/messenger/MessengerDelegate.java
+++ b/src/com/android/car/messenger/MessengerDelegate.java
@@ -218,6 +218,11 @@
 
     /** Removes all messages related to the inputted predicate, and cancels their notifications. **/
     private void cleanupMessagesAndNotifications(Predicate<CompositeKey> predicate) {
+        for (MessageKey key : mMessages.keySet()) {
+            if (predicate.test(key)) {
+                mSmsDatabaseHandler.removeMessagesForDevice(key.getDeviceAddress());
+            }
+        }
         mMessages.entrySet().removeIf(
                 messageKeyMapMessageEntry -> predicate.test(messageKeyMapMessageEntry.getKey()));
         clearNotifications(predicate);
@@ -231,7 +236,7 @@
             return;
         }
 
-        SmsReceiver.readDatabase(mContext);
+        SmsDatabaseHandler.readDatabase(mContext);
         SenderKey senderKey = new SenderKey(mapMessage);
         if (!mNotificationInfos.containsKey(senderKey)) {
             mNotificationInfos.put(senderKey, new NotificationInfo(mapMessage.getSenderName(),
@@ -293,9 +298,7 @@
     }
 
     protected void cleanup() {
-        for (String address : mBTDeviceAddressToConnectionTimestamp.keySet()) {
-            mSmsDatabaseHandler.removeMessagesForDevice(address);
-        }
+        cleanupMessagesAndNotifications(key -> true);
         if (mBluetoothMapClient != null) {
             mBluetoothMapClient.close();
         }
diff --git a/src/com/android/car/messenger/MmsReceiver.java b/src/com/android/car/messenger/MmsReceiver.java
index d9b9fd4..37cc5ef 100644
--- a/src/com/android/car/messenger/MmsReceiver.java
+++ b/src/com/android/car/messenger/MmsReceiver.java
@@ -19,8 +19,6 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.util.Log;
-
 
 /**
  * No-op Receiver that only exists in order to be eligible to be the default SMS app.
diff --git a/src/com/android/car/messenger/SmsDatabaseHandler.java b/src/com/android/car/messenger/SmsDatabaseHandler.java
index 36f4cec..b672354 100644
--- a/src/com/android/car/messenger/SmsDatabaseHandler.java
+++ b/src/com/android/car/messenger/SmsDatabaseHandler.java
@@ -14,11 +14,15 @@
 import android.net.Uri;
 import android.provider.BaseColumns;
 import android.provider.Telephony;
+import android.util.Log;
 
 import androidx.core.content.ContextCompat;
 
 import com.android.car.messenger.log.L;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 /**
  * Reads and writes SMS Messages into the Telephony.SMS Database.
  */
@@ -31,6 +35,8 @@
     private static final String SMS_SELECTION = Telephony.Sms.ADDRESS + "=? AND "
             + Telephony.Sms.BODY + "=? AND (" + Telephony.Sms.DATE + ">=? OR " + Telephony.Sms.DATE
             + "<=?)";
+    private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat(
+            "MMM dd,yyyy HH:mm");
 
     private final ContentResolver mContentResolver;
     private final boolean mCanWriteToDatabase;
@@ -38,7 +44,7 @@
     protected SmsDatabaseHandler(Context context) {
         mCanWriteToDatabase = canWriteToDatabase(context);
         mContentResolver = context.getContentResolver();
-        SmsReceiver.readDatabase(context);
+        readDatabase(context);
     }
 
     protected void addOrUpdate(MapMessage message) {
@@ -73,6 +79,42 @@
         mContentResolver.delete(SMS_URI, smsSelection, smsSelectionArgs);
     }
 
+    /**
+     * Reads the Telephony SMS Database, and logs all of the SMS messages that have been received
+     * in the last five minutes.
+     * @param context
+     */
+    protected static void readDatabase(Context context) {
+        if (!Log.isLoggable(TAG, Log.DEBUG)) {
+            return;
+        }
+
+        Long beginningTimeStamp = System.currentTimeMillis() - 300000;
+        String timeStamp = DATE_FORMATTER.format(new Date(beginningTimeStamp));
+        Log.d(TAG,
+                " ------ printing SMSs received after " + timeStamp + "-------- ");
+
+        String smsSelection = Telephony.Sms.DATE + ">=?";
+        String[] smsSelectionArgs = {Long.toString(beginningTimeStamp)};
+        Cursor cursor = context.getContentResolver().query(SMS_URI, null,
+                smsSelection,
+                smsSelectionArgs, null /* sortOrder */);
+        if (cursor != null) {
+            while (cursor.moveToNext()) {
+                String body = cursor.getString(12);
+
+                Date date = new Date(cursor.getLong(4));
+                Log.d(TAG,
+                        "_id " + cursor.getInt(0) + " person: " + cursor.getInt(3) + " body: "
+                                + body.substring(0, Math.min(body.length(), 17)) + " address: "
+                                + cursor.getString(2) + " date: " + DATE_FORMATTER.format(
+                                date) + " longDate " + cursor.getLong(4) + " read: "
+                                + cursor.getInt(7));
+            }
+        }
+        Log.d(TAG, " ------ end read table --------");
+    }
+
     /** Removes multiple previous copies, and inserts the new message. **/
     private void removePreviousAndInsert(MapMessage message) {
         String[] smsSelectionArgs = createSmsSelectionArgs(message);
diff --git a/src/com/android/car/messenger/SmsReceiver.java b/src/com/android/car/messenger/SmsReceiver.java
index bbcc60c..25dbf89 100644
--- a/src/com/android/car/messenger/SmsReceiver.java
+++ b/src/com/android/car/messenger/SmsReceiver.java
@@ -17,118 +17,18 @@
 package com.android.car.messenger;
 
 import android.content.BroadcastReceiver;
-import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.Telephony;
-import android.telephony.SmsMessage;
-import android.util.Log;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
 
 /**
- * Receiver that listens for Telephony broadcasts when an SMS is received.
+ *  No-op Receiver that only exists in order to be eligible to be the default SMS app.
  */
 public class SmsReceiver extends BroadcastReceiver {
-    private static final String TAG = "CM.SmsReceiver";
-    private static final Uri SMS_URI = Telephony.Sms.CONTENT_URI;
-    private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat(
-            "MMM dd,yyyy HH:mm");
 
     @Override
     public void onReceive(Context context, Intent intent) {
         Intent startIntent = new Intent(context, MessengerService.class)
                 .setAction(MessengerService.ACTION_RECEIVED_SMS);
         context.startForegroundService(startIntent);
-
-        // If we are the default SMS app, we only care about the
-        // Telephony.Sms.Intents.SMS_DELIVER_ACTION
-        if (isDefaultSmsApp(context) && Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(
-                intent.getAction())) {
-            return;
-        }
-
-        if (isDefaultSmsApp(context)) parseSmsMessage(context, intent);
-        readDatabase(context);
-    }
-
-    /**
-     * Parses the {@link SmsMessage} from the intent to be inputted into the Telephony Database.
-     */
-    private void parseSmsMessage(Context context, Intent intent) {
-        SmsMessage[] messages = Telephony.Sms.Intents.getMessagesFromIntent(intent);
-        if (messages == null) {
-            Log.w(TAG, "No sms messages found in the intent");
-            return;
-        }
-
-        for (SmsMessage sms : messages) {
-            insertMessageToTelephonyDb(sms, context, intent);
-        }
-    }
-
-    private void insertMessageToTelephonyDb(SmsMessage sms, Context context, Intent intent) {
-        ContentValues values = new ContentValues();
-        values.put(Telephony.Sms.READ, 0);
-        values.put(Telephony.Sms.ADDRESS, sms.getDisplayOriginatingAddress());
-        values.put(Telephony.Sms.BODY, sms.getMessageBody());
-        values.put(Telephony.Sms.DATE, sms.getTimestampMillis());
-        values.put(Telephony.Sms.SUBSCRIPTION_ID, sms.getSubId());
-        if (sms.getPseudoSubject().length() > 0) {
-            values.put(Telephony.Sms.SUBJECT, sms.getPseudoSubject());
-        }
-        values.put(Telephony.Sms.PROTOCOL, sms.getProtocolIdentifier());
-        values.put(Telephony.Sms.REPLY_PATH_PRESENT, sms.isReplyPathPresent() ? 1 : 0);
-        values.put(Telephony.Sms.SERVICE_CENTER, sms.getServiceCenterAddress());
-        values.put(Telephony.Sms.ERROR_CODE, intent.getIntExtra("errorCode", 0));
-        values.put(Telephony.Sms.STATUS, sms.getStatus());
-
-        Uri uri = context.getApplicationContext().getContentResolver().insert(SMS_URI, values);
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Finished inserting latest SMS: " + uri);
-        }
-    }
-
-    /**
-     * Reads the Telephony SMS Database, and logs all of the SMS messages that have been received
-     * in the last five minutes.
-     * @param context
-     */
-    public static void readDatabase(Context context) {
-        if (!Log.isLoggable(TAG, Log.DEBUG)) {
-            return;
-        }
-
-        Long beginningTimeStamp = System.currentTimeMillis() - 300000;
-        String timeStamp = DATE_FORMATTER.format(new Date(beginningTimeStamp));
-        Log.d(TAG,
-                " ------ printing SMSs received after " + timeStamp + "-------- ");
-
-        String smsSelection = Telephony.Sms.DATE + ">=?";
-        String[] smsSelectionArgs = {Long.toString(beginningTimeStamp)};
-        Cursor cursor = context.getContentResolver().query(SMS_URI, null,
-                smsSelection,
-                smsSelectionArgs, null /* sortOrder */);
-        if (cursor != null) {
-            while (cursor.moveToNext()) {
-                String body = cursor.getString(12);
-
-                Date date = new Date(cursor.getLong(4));
-                Log.d(TAG,
-                        "_id " + cursor.getInt(0) + " person: " + cursor.getInt(3) + " body: "
-                                + body.substring(0, Math.min(body.length(), 17)) + " address: "
-                                + cursor.getString(2) + " date: " + DATE_FORMATTER.format(
-                                date) + " longDate " + cursor.getLong(4) + " read: "
-                                + cursor.getInt(7));
-            }
-        }
-        Log.d(TAG, " ------ end read table --------");
-    }
-
-    private boolean isDefaultSmsApp(Context context) {
-        return Telephony.Sms.getDefaultSmsPackage(context).equals(context.getPackageName());
     }
 }
