diff --git a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
index e722697..5376a7d 100644
--- a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
+++ b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
@@ -290,7 +290,8 @@
         }
     }
 
-    private MmsSmsDatabaseHelper(Context context, MmsSmsDatabaseErrorHandler dbErrorHandler) {
+    @VisibleForTesting
+    MmsSmsDatabaseHelper(Context context, MmsSmsDatabaseErrorHandler dbErrorHandler) {
         super(context, DATABASE_NAME, null, DATABASE_VERSION, dbErrorHandler);
         mContext = context;
         // Memory optimization - close idle connections after 30s of inactivity
@@ -530,7 +531,7 @@
         localLog("onCreate: Creating all SMS-MMS tables.");
         // if FBE is not supported, or if this onCreate is for CE partition database
         if (!StorageManager.isFileEncryptedNativeOrEmulated()
-                || mContext.isCredentialProtectedStorage()) {
+                || (mContext != null && mContext.isCredentialProtectedStorage())) {
             localLog("onCreate: broadcasting ACTION_SMS_MMS_DB_CREATED");
             // Broadcast ACTION_SMS_MMS_DB_CREATED
             Intent intent = new Intent(Sms.Intents.ACTION_SMS_MMS_DB_CREATED);
@@ -556,6 +557,8 @@
         if (IS_RCS_TABLE_SCHEMA_CODE_COMPLETE) {
             RcsProviderThreadHelper.createThreadTables(db);
             RcsProviderParticipantHelper.createParticipantTables(db);
+            RcsProviderMessageHelper.createRcsMessageTables(db);
+            RcsProviderEventHelper.createRcsEventTables(db);
         }
 
         createCommonTriggers(db);
@@ -721,7 +724,8 @@
         }
     }
 
-    private void createMmsTables(SQLiteDatabase db) {
+    @VisibleForTesting
+    void createMmsTables(SQLiteDatabase db) {
         // N.B.: Whenever the columns here are changed, the columns in
         // {@ref MmsSmsProvider} must be changed to match.
         db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PDU + " (" +
@@ -1043,7 +1047,8 @@
             "message_body TEXT," + // message body
             "display_originating_addr TEXT);";
     // email address if from an email gateway, otherwise same as address
-    private void createSmsTables(SQLiteDatabase db) {
+    @VisibleForTesting
+    void createSmsTables(SQLiteDatabase db) {
         // N.B.: Whenever the columns here are changed, the columns in
         // {@ref MmsSmsProvider} must be changed to match.
         db.execSQL(CREATE_SMS_TABLE_STRING);
@@ -1092,7 +1097,8 @@
         }
     }
 
-    private void createCommonTables(SQLiteDatabase db) {
+    @VisibleForTesting
+    void createCommonTables(SQLiteDatabase db) {
         // TODO Ensure that each entry is removed when the last use of
         // any address equivalent to its address is removed.
 
@@ -1668,6 +1674,8 @@
             }
             RcsProviderThreadHelper.createThreadTables(db);
             RcsProviderParticipantHelper.createParticipantTables(db);
+            RcsProviderMessageHelper.createRcsMessageTables(db);
+            RcsProviderEventHelper.createRcsEventTables(db);
             return;
         }
 
diff --git a/src/com/android/providers/telephony/RcsProvider.java b/src/com/android/providers/telephony/RcsProvider.java
index af9212e..db45402 100644
--- a/src/com/android/providers/telephony/RcsProvider.java
+++ b/src/com/android/providers/telephony/RcsProvider.java
@@ -15,40 +15,285 @@
  */
 package com.android.providers.telephony;
 
+import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
+
+import static com.android.providers.telephony.RcsProviderUtil.buildUriWithRowIdAppended;
+import static com.android.providers.telephony.RcsProviderUtil.returnUriAsIsIfSuccessful;
+
 import android.app.AppOpsManager;
 import android.content.ContentProvider;
+import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.UriMatcher;
 import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
-import android.database.sqlite.SQLiteQueryBuilder;
 import android.net.Uri;
+import android.os.Bundle;
+import android.os.CancellationSignal;
 import android.util.Log;
 
+import com.android.internal.annotations.VisibleForTesting;
+
 /**
  * Content provider to handle RCS messages. The functionality here is similar to SmsProvider,
- * MmsProvider etc. This is not meant to be public.
+ * MmsProvider etc.
+ *
+ * The provider has constraints around inserting, updating and deleting - the user needs to know
+ * whether they are inserting a message that is incoming/outgoing, or the thread they are inserting
+ * is a group or p2p etc. This is in order to keep the implementation simple and avoid complex
+ * queries.
  *
  * @hide
  */
 public class RcsProvider extends ContentProvider {
     static final String TAG = "RcsProvider";
     static final String AUTHORITY = "rcs";
+    private static final String CONTENT_AUTHORITY = "content://" + AUTHORITY;
 
-    private static final Uri THREAD_URI_PREFIX = Uri.parse("content://" + AUTHORITY + "/thread");
-    private static final Uri PARTICIPANT_URI_PREFIX = Uri.parse(
-            "content://" + AUTHORITY + "/participant");
+    private static final Uri PARTICIPANT_URI_PREFIX =
+            Uri.parse(CONTENT_AUTHORITY + "/participant/");
+    private static final Uri P2P_THREAD_URI_PREFIX = Uri.parse(CONTENT_AUTHORITY + "/p2p_thread/");
+    private static final Uri FILE_TRANSFER_PREFIX = Uri.parse(
+            CONTENT_AUTHORITY + "/file_transfer/");
+    static final Uri GROUP_THREAD_URI_PREFIX = Uri.parse(CONTENT_AUTHORITY + "/group_thread/");
+
+    // Rcs table names
+    static final String RCS_THREAD_TABLE = "rcs_thread";
+    static final String RCS_1_TO_1_THREAD_TABLE = "rcs_1_to_1_thread";
+    static final String RCS_GROUP_THREAD_TABLE = "rcs_group_thread";
+    static final String UNIFIED_RCS_THREAD_VIEW = "rcs_unified_rcs_thread_view";
+    static final String RCS_PARTICIPANT_TABLE = "rcs_participant";
+    static final String RCS_PARTICIPANT_THREAD_JUNCTION_TABLE = "rcs_thread_participant";
+    static final String RCS_MESSAGE_TABLE = "rcs_message";
+    static final String RCS_INCOMING_MESSAGE_TABLE = "rcs_incoming_message";
+    static final String RCS_OUTGOING_MESSAGE_TABLE = "rcs_outgoing_message";
+    static final String RCS_MESSAGE_DELIVERY_TABLE = "rcs_message_delivery";
+    static final String UNIFIED_MESSAGE_VIEW = "rcs_unified_message_view";
+    static final String RCS_FILE_TRANSFER_TABLE = "rcs_file_transfer";
+    static final String RCS_THREAD_EVENT_TABLE = "rcs_thread_event";
+    static final String RCS_PARTICIPANT_EVENT_TABLE = "rcs_participant_event";
+    static final String RCS_UNIFIED_EVENT_VIEW = "rcs_unified_event_view";
 
     private static final UriMatcher URL_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
-    private static final int THREAD = 1;
-    private static final int PARTICIPANT = 2;
+
+    private static final int UNIFIED_RCS_THREAD = 1;
+    private static final int UNIFIED_RCS_THREAD_WITH_ID = 2;
+    private static final int PARTICIPANT = 3;
+    private static final int PARTICIPANT_WITH_ID = 4;
+    private static final int PARTICIPANT_ALIAS_CHANGE_EVENT = 5;
+    private static final int PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID = 6;
+    private static final int P2P_THREAD = 7;
+    private static final int P2P_THREAD_WITH_ID = 8;
+    private static final int P2P_THREAD_PARTICIPANT = 9;
+    private static final int P2P_THREAD_PARTICIPANT_WITH_ID = 10;
+    private static final int GROUP_THREAD = 11;
+    private static final int GROUP_THREAD_WITH_ID = 12;
+    private static final int GROUP_THREAD_PARTICIPANT = 13;
+    private static final int GROUP_THREAD_PARTICIPANT_WITH_ID = 14;
+    private static final int GROUP_THREAD_PARTICIPANT_JOINED_EVENT = 15;
+    private static final int GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID = 16;
+    private static final int GROUP_THREAD_PARTICIPANT_LEFT_EVENT = 17;
+    private static final int GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID = 18;
+    private static final int GROUP_THREAD_NAME_CHANGE_EVENT = 19;
+    private static final int GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID = 20;
+    private static final int GROUP_THREAD_ICON_CHANGE_EVENT = 21;
+    private static final int GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID = 22;
+    private static final int UNIFIED_MESSAGE = 23;
+    private static final int UNIFIED_MESSAGE_WITH_ID = 24;
+    private static final int UNIFIED_MESSAGE_WITH_FILE_TRANSFER = 25;
+    private static final int INCOMING_MESSAGE = 26;
+    private static final int INCOMING_MESSAGE_WITH_ID = 27;
+    private static final int OUTGOING_MESSAGE = 28;
+    private static final int OUTGOING_MESSAGE_WITH_ID = 29;
+    private static final int OUTGOING_MESSAGE_DELIVERY = 30;
+    private static final int OUTGOING_MESSAGE_DELIVERY_WITH_ID = 31;
+    private static final int UNIFIED_MESSAGE_ON_THREAD = 32;
+    private static final int UNIFIED_MESSAGE_ON_THREAD_WITH_ID = 33;
+    private static final int INCOMING_MESSAGE_ON_P2P_THREAD = 34;
+    private static final int INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID = 35;
+    private static final int OUTGOING_MESSAGE_ON_P2P_THREAD = 36;
+    private static final int OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID = 37;
+    private static final int INCOMING_MESSAGE_ON_GROUP_THREAD = 38;
+    private static final int INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID = 39;
+    private static final int OUTGOING_MESSAGE_ON_GROUP_THREAD = 40;
+    private static final int OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID = 41;
+    private static final int FILE_TRANSFER_WITH_ID = 42;
+    private static final int EVENT = 43;
 
     SQLiteOpenHelper mDbOpenHelper;
 
+    @VisibleForTesting
+    RcsProviderThreadHelper mThreadHelper;
+    @VisibleForTesting
+    RcsProviderParticipantHelper mParticipantHelper;
+    @VisibleForTesting
+    RcsProviderMessageHelper mMessageHelper;
+    @VisibleForTesting
+    RcsProviderEventHelper mEventHelper;
+
     static {
-        URL_MATCHER.addURI(AUTHORITY, "thread", THREAD);
+        // example URI: content://rcs/thread
+        URL_MATCHER.addURI(AUTHORITY, "thread", UNIFIED_RCS_THREAD);
+
+        // example URI: content://rcs/thread/4, where 4 is the thread id.
+        URL_MATCHER.addURI(AUTHORITY, "thread/#", UNIFIED_RCS_THREAD_WITH_ID);
+
+        // example URI: content://rcs/participant
         URL_MATCHER.addURI(AUTHORITY, "participant", PARTICIPANT);
+
+        // example URI: content://rcs/participant/12, where 12 is the participant id
+        URL_MATCHER.addURI(AUTHORITY, "participant/#", PARTICIPANT_WITH_ID);
+
+        // example URI: content://rcs/participant/12/alias_change_event, where 12 is the participant
+        // id.
+        URL_MATCHER.addURI(AUTHORITY, "participant/#/alias_change_event",
+                PARTICIPANT_ALIAS_CHANGE_EVENT);
+
+        // example URI: content://rcs/participant/12/alias_change_event/4, where 12 is the
+        // participant id, and 4 is the event id
+        URL_MATCHER.addURI(AUTHORITY, "participant/#/alias_change_event/#",
+                PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID);
+
+        // example URI: content://rcs/p2p_thread
+        URL_MATCHER.addURI(AUTHORITY, "p2p_thread", P2P_THREAD);
+
+        // example URI: content://rcs/p2p_thread/4, where 4 is the thread id
+        URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#", P2P_THREAD_WITH_ID);
+
+        // example URI: content://rcs/p2p_thread/4/participant, where 4 is the thread id
+        URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/participant", P2P_THREAD_PARTICIPANT);
+
+        // example URI: content://rcs/p2p_thread/9/participant/3", only supports a 1 time insert.
+        // 9 is the thread ID, 3 is the participant ID.
+        URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/participant/#", P2P_THREAD_PARTICIPANT_WITH_ID);
+
+        // example URI: content://rcs/group_thread
+        URL_MATCHER.addURI(AUTHORITY, "group_thread", GROUP_THREAD);
+
+        // example URI: content://rcs/group_thread/13, where 13 is the _id in rcs_threads table.
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#", GROUP_THREAD_WITH_ID);
+
+        // example URI: content://rcs/group_thread/13/participant_joined_event. Supports
+        // queries and inserts
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant_joined_event",
+                GROUP_THREAD_PARTICIPANT_JOINED_EVENT);
+
+        // example URI: content://rcs/group_thread/13/participant_joined_event/3. Supports deletes.
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant_joined_event/#",
+                GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID);
+
+        // example URI: content://rcs/group_thread/13/participant_left_event. Supports queries
+        // and inserts
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant_left_event",
+                GROUP_THREAD_PARTICIPANT_LEFT_EVENT);
+
+        // example URI: content://rcs/group_thread/13/participant_left_event/5. Supports deletes
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant_left_event/#",
+                GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID);
+
+        // example URI: content://rcs/group_thread/13/name_changed_event. Supports queries and
+        // inserts
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/name_changed_event",
+                GROUP_THREAD_NAME_CHANGE_EVENT);
+
+        // example URI: content://rcs/group_thread/13/name_changed_event/7. Supports deletes
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/name_changed_event/#",
+                GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID);
+
+        // example URI: content://rcs/group_thread/13/icon_changed_event. Supports queries and
+        // inserts
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/icon_changed_event",
+                GROUP_THREAD_ICON_CHANGE_EVENT);
+
+        // example URI: content://rcs/group_thread/13/icon_changed_event/9. Supports deletes
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/icon_changed_event/#",
+                GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID);
+
+        // example URI: content://rcs/group_thread/18/participant
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant",
+                GROUP_THREAD_PARTICIPANT);
+
+        // example URI: content://rcs/group_thread/21/participant/4, only supports inserts and
+        // deletes
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/participant/#",
+                GROUP_THREAD_PARTICIPANT_WITH_ID);
+
+        // example URI: content://rcs/message
+        URL_MATCHER.addURI(AUTHORITY, "message", UNIFIED_MESSAGE);
+
+        // example URI: content://rcs/message/4, where 4 is the message id.
+        URL_MATCHER.addURI(AUTHORITY, "message/#", UNIFIED_MESSAGE_WITH_ID);
+
+        // example URI: content://rcs/message/4/file_transfer, only supports inserts
+        URL_MATCHER.addURI(AUTHORITY, "message/#/file_transfer",
+                UNIFIED_MESSAGE_WITH_FILE_TRANSFER);
+
+        // example URI: content://rcs/incoming_message
+        URL_MATCHER.addURI(AUTHORITY, "incoming_message", INCOMING_MESSAGE);
+
+        // example URI: content://rcs/incoming_message/45
+        URL_MATCHER.addURI(AUTHORITY, "incoming_message/#", INCOMING_MESSAGE_WITH_ID);
+
+        // example URI: content://rcs/outgoing_message
+        URL_MATCHER.addURI(AUTHORITY, "outgoing_message", OUTGOING_MESSAGE);
+
+        // example URI: content://rcs/outgoing_message/54
+        URL_MATCHER.addURI(AUTHORITY, "outgoing_message/#", OUTGOING_MESSAGE_WITH_ID);
+
+        // example URI: content://rcs/outgoing_message/54/delivery. Only supports queries
+        URL_MATCHER.addURI(AUTHORITY, "outgoing_message/#/delivery", OUTGOING_MESSAGE_DELIVERY);
+
+        // example URI: content://rcs/outgoing_message/9/delivery/4. Does not support queries
+        URL_MATCHER.addURI(AUTHORITY, "outgoing_message/#/delivery/#",
+                OUTGOING_MESSAGE_DELIVERY_WITH_ID);
+
+        // example URI: content://rcs/thread/5/message, only supports querying.
+        URL_MATCHER.addURI(AUTHORITY, "thread/#/message", UNIFIED_MESSAGE_ON_THREAD);
+
+        // example URI: content://rcs/thread/5/message/40, only supports querying.
+        URL_MATCHER.addURI(AUTHORITY, "thread/#/message/#", UNIFIED_MESSAGE_ON_THREAD_WITH_ID);
+
+        // example URI: content://rcs/p2p_thread/3/incoming_message. Only available for inserting
+        // incoming messages onto a 1 to 1 thread.
+        URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/incoming_message",
+                INCOMING_MESSAGE_ON_P2P_THREAD);
+
+        // example URI: content://rcs/p2p_thread/11/incoming_message/45. Only supports querying
+        URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/incoming_message/#",
+                INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID);
+
+        // example URI: content://rcs/p2p_thread/3/outgoing_message. Only available for inserting
+        // outgoing messages onto a 1 to 1 thread.
+        URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/outgoing_message",
+                OUTGOING_MESSAGE_ON_P2P_THREAD);
+
+        // example URI: content://rcs/p2p_thread/11/outgoing_message/46. Only supports querying
+        URL_MATCHER.addURI(AUTHORITY, "p2p_thread/#/outgoing_message/#",
+                OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID);
+
+        // example URI: content://rcs/group_thread/3/incoming_message. Only available for inserting
+        // incoming messages onto a group thread.
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/incoming_message",
+                INCOMING_MESSAGE_ON_GROUP_THREAD);
+
+        // example URI: content://rcs/group_thread/3/incoming_message/71. Only supports querying
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/incoming_message/#",
+                INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID);
+
+        // example URI: content://rcs/group_thread/3/outgoing_message. Only available for inserting
+        // outgoing messages onto a group thread.
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/outgoing_message",
+                OUTGOING_MESSAGE_ON_GROUP_THREAD);
+
+        // example URI: content://rcs/group_thread/13/outgoing_message/72. Only supports querying
+        URL_MATCHER.addURI(AUTHORITY, "group_thread/#/outgoing_message/#",
+                OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID);
+
+        // example URI: content://rcs/file_transfer/1. Does not support insertion
+        URL_MATCHER.addURI(AUTHORITY, "file_transfer/#", FILE_TRANSFER_WITH_ID);
+
+        // example URI: content://rcs/event
+        URL_MATCHER.addURI(AUTHORITY, "event", EVENT);
     }
 
     @Override
@@ -56,29 +301,157 @@
         setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
         // Use the credential encrypted mmssms.db for RCS messages.
         mDbOpenHelper = MmsSmsDatabaseHelper.getInstanceForCe(getContext());
+        mParticipantHelper = new RcsProviderParticipantHelper(mDbOpenHelper);
+        mThreadHelper = new RcsProviderThreadHelper(mDbOpenHelper);
+        mMessageHelper = new RcsProviderMessageHelper(mDbOpenHelper);
+        mEventHelper = new RcsProviderEventHelper(mDbOpenHelper);
         return true;
     }
 
+    /**
+     * ContentResolver has a weird bug that if both query methods are overridden, it will always
+     * pick the bundle one to call, but will still require us to override this one as it is
+     * abstract. Work around by putting parameters in a bundle.
+     */
     @Override
-    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
-            String sortOrder) {
+    public synchronized Cursor query(Uri uri, String[] projection, String selection,
+            String[] selectionArgs, String sortOrder) {
+        Bundle bundle = new Bundle();
+        bundle.putString(ContentResolver.QUERY_ARG_SQL_SELECTION, selection);
+        bundle.putStringArray(ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, selectionArgs);
+        bundle.putString(ContentResolver.QUERY_ARG_SQL_SORT_ORDER, sortOrder);
+        return query(uri, projection, bundle, null);
+    }
+
+    @Override
+    public synchronized Cursor query(Uri uri, String[] projection, Bundle queryArgs,
+            CancellationSignal unused) {
         int match = URL_MATCHER.match(uri);
-        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
-        SQLiteDatabase readableDatabase = mDbOpenHelper.getReadableDatabase();
+
+        String selection = null;
+        String[] selectionArgs = null;
+        String sortOrder = null;
+
+        if (queryArgs != null) {
+            selection = queryArgs.getString(ContentResolver.QUERY_ARG_SQL_SELECTION);
+            selectionArgs = queryArgs.getStringArray(
+                    ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS);
+            sortOrder = queryArgs.getString(ContentResolver.QUERY_ARG_SQL_SORT_ORDER);
+        }
 
         switch (match) {
-            case THREAD:
-                RcsProviderThreadHelper.buildThreadQuery(qb);
-                break;
+            case UNIFIED_RCS_THREAD:
+                return mThreadHelper.queryUnifiedThread(queryArgs);
+            case UNIFIED_RCS_THREAD_WITH_ID:
+                return mThreadHelper.queryUnifiedThreadUsingId(uri, projection);
             case PARTICIPANT:
-                RcsProviderParticipantHelper.buildParticipantsQuery(qb);
+                return mParticipantHelper.queryParticipant(queryArgs);
+            case PARTICIPANT_WITH_ID:
+                return mParticipantHelper.queryParticipantWithId(uri, projection);
+            case PARTICIPANT_ALIAS_CHANGE_EVENT:
+                Log.e(TAG, "Querying individual event types is not supported, uri: " + uri);
                 break;
+            case PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID:
+                Log.e(TAG, "Querying participant events with id's is not supported, uri: " + uri);
+                break;
+            case P2P_THREAD:
+                return mThreadHelper.query1to1Thread(projection, selection,
+                        selectionArgs, sortOrder);
+            case P2P_THREAD_WITH_ID:
+                return mThreadHelper.query1To1ThreadUsingId(uri, projection);
+            case P2P_THREAD_PARTICIPANT:
+                return mParticipantHelper.queryParticipantIn1To1Thread(uri);
+            case P2P_THREAD_PARTICIPANT_WITH_ID:
+                Log.e(TAG,
+                        "Querying participants in 1 to 1 threads via id's is not supported, uri: "
+                                + uri);
+                break;
+            case GROUP_THREAD:
+                return mThreadHelper.queryGroupThread(projection, selection,
+                        selectionArgs, sortOrder);
+            case GROUP_THREAD_WITH_ID:
+                return mThreadHelper.queryGroupThreadUsingId(uri, projection);
+            case GROUP_THREAD_PARTICIPANT:
+                return mParticipantHelper.queryParticipantsInGroupThread(uri);
+            case GROUP_THREAD_PARTICIPANT_WITH_ID:
+                return mParticipantHelper.queryParticipantInGroupThreadWithId(uri);
+            case GROUP_THREAD_PARTICIPANT_JOINED_EVENT:
+            case GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID:
+            case GROUP_THREAD_PARTICIPANT_LEFT_EVENT:
+            case GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID:
+            case GROUP_THREAD_NAME_CHANGE_EVENT:
+            case GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID:
+            case GROUP_THREAD_ICON_CHANGE_EVENT:
+            case GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID:
+                Log.e(TAG, "Querying individual event types is not supported, uri: " + uri);
+                break;
+            case UNIFIED_MESSAGE:
+                return mMessageHelper.queryMessages(queryArgs);
+            case UNIFIED_MESSAGE_WITH_ID:
+                return mMessageHelper.queryUnifiedMessageWithId(uri);
+            case UNIFIED_MESSAGE_WITH_FILE_TRANSFER:
+                Log.e(TAG,
+                        "Querying file transfers through messages is not supported, uri: " + uri);
+            case INCOMING_MESSAGE:
+                return mMessageHelper.queryIncomingMessageWithSelection(selection, selectionArgs);
+            case INCOMING_MESSAGE_WITH_ID:
+                return mMessageHelper.queryIncomingMessageWithId(uri);
+            case OUTGOING_MESSAGE:
+                return mMessageHelper.queryOutgoingMessageWithSelection(selection, selectionArgs);
+            case OUTGOING_MESSAGE_WITH_ID:
+                return mMessageHelper.queryOutgoingMessageWithId(uri);
+            case OUTGOING_MESSAGE_DELIVERY:
+                return mMessageHelper.queryOutgoingMessageDeliveries(uri);
+            case OUTGOING_MESSAGE_DELIVERY_WITH_ID:
+                Log.e(TAG,
+                        "Querying deliveries with message and participant ids is not supported, "
+                                + "uri: "
+                                + uri);
+            case UNIFIED_MESSAGE_ON_THREAD:
+                return mMessageHelper.queryAllMessagesOnThread(uri, selection, selectionArgs);
+            case UNIFIED_MESSAGE_ON_THREAD_WITH_ID:
+                return mMessageHelper.queryUnifiedMessageWithIdInThread(uri);
+            case INCOMING_MESSAGE_ON_P2P_THREAD:
+                Log.e(TAG,
+                        "Querying incoming messages on P2P thread with selection is not "
+                                + "supported, uri: "
+                                + uri);
+                break;
+            case INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID:
+                return mMessageHelper.queryUnifiedMessageWithIdInThread(uri);
+            case OUTGOING_MESSAGE_ON_P2P_THREAD:
+                Log.e(TAG,
+                        "Querying outgoing messages on P2P thread with selection is not "
+                                + "supported, uri: "
+                                + uri);
+                break;
+            case OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID:
+                return mMessageHelper.queryUnifiedMessageWithIdInThread(uri);
+            case INCOMING_MESSAGE_ON_GROUP_THREAD:
+                Log.e(TAG,
+                        "Querying incoming messages on group thread with selection is not "
+                                + "supported, uri: "
+                                + uri);
+                break;
+            case INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
+                return mMessageHelper.queryUnifiedMessageWithIdInThread(uri);
+            case OUTGOING_MESSAGE_ON_GROUP_THREAD:
+                Log.e(TAG,
+                        "Querying outgoing messages on group thread with selection is not "
+                                + "supported, uri: "
+                                + uri);
+                break;
+            case OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
+                return mMessageHelper.queryUnifiedMessageWithIdInThread(uri);
+            case FILE_TRANSFER_WITH_ID:
+                return mMessageHelper.queryFileTransfer(uri);
+            case EVENT:
+                return mEventHelper.queryEvents(queryArgs);
             default:
                 Log.e(TAG, "Invalid query: " + uri);
         }
 
-        return qb.query(
-                readableDatabase, projection, selection, selectionArgs, null, null, sortOrder);
+        return null;
     }
 
     @Override
@@ -87,86 +460,334 @@
     }
 
     @Override
-    public Uri insert(Uri uri, ContentValues values) {
+    public synchronized Uri insert(Uri uri, ContentValues values) {
         int match = URL_MATCHER.match(uri);
-        SQLiteDatabase writableDatabase = mDbOpenHelper.getWritableDatabase();
-        writableDatabase.beginTransaction();
-
-        Uri returnUri = null;
         long rowId;
 
-        try {
-            switch (match) {
-                case THREAD:
-                    rowId = RcsProviderThreadHelper.insert(writableDatabase, values);
-                    returnUri = THREAD_URI_PREFIX.buildUpon().appendPath(
-                            Long.toString(rowId)).build();
-                    break;
-                case PARTICIPANT:
-                    rowId = RcsProviderParticipantHelper.insert(writableDatabase, values);
-                    returnUri = PARTICIPANT_URI_PREFIX.buildUpon().appendPath(
-                            Long.toString(rowId)).build();
-                    break;
-                default:
-                    Log.e(TAG, "Invalid insert: " + uri);
-            }
-        } finally {
-            writableDatabase.endTransaction();
+        switch (match) {
+            case UNIFIED_RCS_THREAD:
+            case UNIFIED_RCS_THREAD_WITH_ID:
+                Log.e(TAG, "Inserting into unified thread view is not supported, uri: " + uri);
+                break;
+            case PARTICIPANT:
+                return buildUriWithRowIdAppended(PARTICIPANT_URI_PREFIX,
+                        mParticipantHelper.insertParticipant(values));
+            case PARTICIPANT_WITH_ID:
+                Log.e(TAG, "Inserting participant with a specified ID is not supported, uri: "
+                        + uri);
+                break;
+            case PARTICIPANT_ALIAS_CHANGE_EVENT:
+                return buildUriWithRowIdAppended(uri,
+                        mEventHelper.insertParticipantEvent(uri, values));
+            case PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID:
+                Log.e(TAG, "Inserting participant events with id's is not supported, uri: " + uri);
+                break;
+            case P2P_THREAD:
+                return buildUriWithRowIdAppended(P2P_THREAD_URI_PREFIX,
+                        mThreadHelper.insert1To1Thread(values));
+            case P2P_THREAD_WITH_ID:
+                Log.e(TAG, "Inserting a thread with a specified ID is not supported, uri: " + uri);
+                break;
+            case P2P_THREAD_PARTICIPANT:
+                Log.e(TAG,
+                        "Inserting a participant into a thread via content values is not "
+                                + "supported, uri: "
+                                + uri);
+                break;
+            case P2P_THREAD_PARTICIPANT_WITH_ID:
+                return returnUriAsIsIfSuccessful(uri,
+                        mParticipantHelper.insertParticipantIntoP2pThread(uri));
+            case GROUP_THREAD:
+                return buildUriWithRowIdAppended(GROUP_THREAD_URI_PREFIX,
+                        mThreadHelper.insertGroupThread(values));
+            case GROUP_THREAD_WITH_ID:
+                Log.e(TAG, "Inserting a thread with a specified ID is not supported, uri: " + uri);
+                break;
+            case GROUP_THREAD_PARTICIPANT_JOINED_EVENT:
+                return buildUriWithRowIdAppended(uri,
+                        mEventHelper.insertParticipantJoinedEvent(uri, values));
+            case GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID:
+                Log.e(TAG, "Inserting thread events with id's is not supported, uri: " + uri);
+                break;
+            case GROUP_THREAD_PARTICIPANT_LEFT_EVENT:
+                return buildUriWithRowIdAppended(uri,
+                        mEventHelper.insertParticipantLeftEvent(uri, values));
+            case GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID:
+                Log.e(TAG, "Inserting thread events with id's is not supported, uri: " + uri);
+                break;
+            case GROUP_THREAD_NAME_CHANGE_EVENT:
+                return buildUriWithRowIdAppended(uri,
+                        mEventHelper.insertThreadNameChangeEvent(uri, values));
+            case GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID:
+                Log.e(TAG, "Inserting thread events with id's is not supported, uri: " + uri);
+                break;
+            case GROUP_THREAD_ICON_CHANGE_EVENT:
+                return buildUriWithRowIdAppended(uri,
+                        mEventHelper.insertThreadIconChangeEvent(uri, values));
+            case GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID:
+                Log.e(TAG, "Inserting thread events with id's is not supported, uri: " + uri);
+                break;
+            case GROUP_THREAD_PARTICIPANT:
+                rowId = mParticipantHelper.insertParticipantIntoGroupThread(values);
+                if (rowId == TRANSACTION_FAILED) {
+                    return null;
+                }
+                return mParticipantHelper.getParticipantInThreadUri(values, rowId);
+            case GROUP_THREAD_PARTICIPANT_WITH_ID:
+                return returnUriAsIsIfSuccessful(uri,
+                        mParticipantHelper.insertParticipantIntoGroupThreadWithId(uri));
+            case UNIFIED_MESSAGE:
+            case UNIFIED_MESSAGE_WITH_ID:
+                Log.e(TAG, "Inserting into unified message view is not supported, uri: " + uri);
+                break;
+            case UNIFIED_MESSAGE_WITH_FILE_TRANSFER:
+                return buildUriWithRowIdAppended(FILE_TRANSFER_PREFIX,
+                        mMessageHelper.insertFileTransferToMessage(uri, values));
+            case INCOMING_MESSAGE:
+            case INCOMING_MESSAGE_WITH_ID:
+            case OUTGOING_MESSAGE:
+            case OUTGOING_MESSAGE_WITH_ID:
+                Log.e(TAG, "Inserting a message without a thread is not supported, uri: "
+                        + uri);
+                break;
+            case OUTGOING_MESSAGE_DELIVERY:
+                Log.e(TAG,
+                        "Inserting an outgoing message delivery without a participant is not "
+                                + "supported, uri: "
+                                + uri);
+                break;
+            case OUTGOING_MESSAGE_DELIVERY_WITH_ID:
+                return returnUriAsIsIfSuccessful(uri,
+                        mMessageHelper.insertMessageDelivery(uri, values));
+            case UNIFIED_MESSAGE_ON_THREAD:
+            case UNIFIED_MESSAGE_ON_THREAD_WITH_ID:
+                Log.e(TAG,
+                        "Inserting a message on unified thread view is not supported, uri: " + uri);
+                break;
+            case INCOMING_MESSAGE_ON_P2P_THREAD:
+                return mMessageHelper.insertMessageOnThread(uri, values, /* isIncoming= */
+                        true, /* is1To1 */ true);
+            case OUTGOING_MESSAGE_ON_P2P_THREAD:
+                return mMessageHelper.insertMessageOnThread(uri, values, /* isIncoming= */
+                        false, /* is1To1 */ true);
+            case INCOMING_MESSAGE_ON_GROUP_THREAD:
+                return mMessageHelper.insertMessageOnThread(uri, values, /* isIncoming= */
+                        true, /* is1To1 */ false);
+            case OUTGOING_MESSAGE_ON_GROUP_THREAD:
+                return mMessageHelper.insertMessageOnThread(uri, values, /* isIncoming= */
+                        false, /* is1To1 */ false);
+            case INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID:
+            case OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID:
+            case INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
+            case OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
+                Log.e(TAG, "Inserting a message with a specific id is not supported, uri: " + uri);
+                break;
+            case FILE_TRANSFER_WITH_ID:
+                Log.e(TAG, "Inserting a file transfer without a message is not supported, uri: "
+                        + uri);
+                break;
+            case EVENT:
+                Log.e(TAG,
+                        "Inserting event using unified event query is not supported, uri: " + uri);
+                break;
+            default:
+                Log.e(TAG, "Invalid insert: " + uri);
         }
 
-        return returnUri;
+        return null;
     }
 
     @Override
-    public int delete(Uri uri, String selection, String[] selectionArgs) {
+    public synchronized int delete(Uri uri, String selection, String[] selectionArgs) {
         int match = URL_MATCHER.match(uri);
         int deletedCount = 0;
-        SQLiteDatabase writableDatabase = mDbOpenHelper.getWritableDatabase();
-        writableDatabase.beginTransaction();
 
-        try {
-            switch (match) {
-                case THREAD:
-                    deletedCount = RcsProviderThreadHelper.delete(writableDatabase, selection,
-                            selectionArgs);
-                    break;
-                case PARTICIPANT:
-                    deletedCount = RcsProviderParticipantHelper.delete(writableDatabase, selection,
-                            selectionArgs);
-                    break;
-                default:
-                    Log.e(TAG, "Invalid delete: " + uri);
-            }
-        } finally {
-            writableDatabase.endTransaction();
+        switch (match) {
+            case UNIFIED_RCS_THREAD:
+            case UNIFIED_RCS_THREAD_WITH_ID:
+                Log.e(TAG, "Deleting entries from unified view is not allowed: " + uri);
+                break;
+            case PARTICIPANT:
+                Log.e(TAG, "Deleting participant with selection is not allowed: " + uri);
+                break;
+            case PARTICIPANT_WITH_ID:
+                return mParticipantHelper.deleteParticipantWithId(uri);
+            case PARTICIPANT_ALIAS_CHANGE_EVENT:
+                Log.e(TAG, "Deleting participant events without id is not allowed: " + uri);
+                break;
+            case PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID:
+                return mEventHelper.deleteParticipantEvent(uri);
+            case P2P_THREAD:
+                return mThreadHelper.delete1To1Thread(selection, selectionArgs);
+            case P2P_THREAD_WITH_ID:
+                return mThreadHelper.delete1To1ThreadWithId(uri);
+            case P2P_THREAD_PARTICIPANT:
+                Log.e(TAG, "Removing participant from 1 to 1 thread is not allowed, uri: " + uri);
+                break;
+            case GROUP_THREAD:
+                return mThreadHelper.deleteGroupThread(selection, selectionArgs);
+            case GROUP_THREAD_WITH_ID:
+                return mThreadHelper.deleteGroupThreadWithId(uri);
+            case GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID:
+                return mEventHelper.deleteGroupThreadEvent(uri);
+            case GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID:
+                return mEventHelper.deleteGroupThreadEvent(uri);
+            case GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID:
+                return mEventHelper.deleteGroupThreadEvent(uri);
+            case GROUP_THREAD_PARTICIPANT_JOINED_EVENT:
+            case GROUP_THREAD_PARTICIPANT_LEFT_EVENT:
+            case GROUP_THREAD_NAME_CHANGE_EVENT:
+            case GROUP_THREAD_ICON_CHANGE_EVENT:
+                Log.e(TAG, "Deleting thread events via selection is not allowed, uri: " + uri);
+                break;
+            case GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID:
+                return mEventHelper.deleteGroupThreadEvent(uri);
+            case GROUP_THREAD_PARTICIPANT:
+                Log.e(TAG,
+                        "Deleting a participant from group thread via selection is not allowed, "
+                                + "uri: "
+                                + uri);
+                break;
+            case GROUP_THREAD_PARTICIPANT_WITH_ID:
+                return mParticipantHelper.deleteParticipantFromGroupThread(uri);
+            case UNIFIED_MESSAGE:
+                Log.e(TAG,
+                        "Deleting message from unified view with selection is not allowed: " + uri);
+                break;
+            case UNIFIED_MESSAGE_WITH_ID:
+                Log.e(TAG, "Deleting message from unified view with id is not allowed: " + uri);
+                break;
+            case UNIFIED_MESSAGE_WITH_FILE_TRANSFER:
+                Log.e(TAG, "Deleting file transfer using message uri is not allowed, uri: " + uri);
+                break;
+            case INCOMING_MESSAGE:
+                return mMessageHelper.deleteIncomingMessageWithSelection(selection, selectionArgs);
+            case INCOMING_MESSAGE_WITH_ID:
+                return mMessageHelper.deleteIncomingMessageWithId(uri);
+            case OUTGOING_MESSAGE:
+                return mMessageHelper.deleteOutgoingMessageWithSelection(selection, selectionArgs);
+            case OUTGOING_MESSAGE_WITH_ID:
+                return mMessageHelper.deleteOutgoingMessageWithId(uri);
+            case OUTGOING_MESSAGE_DELIVERY:
+            case OUTGOING_MESSAGE_DELIVERY_WITH_ID:
+                Log.e(TAG, "Deleting message deliveries is not supported, uri: " + uri);
+                break;
+            case UNIFIED_MESSAGE_ON_THREAD:
+            case UNIFIED_MESSAGE_ON_THREAD_WITH_ID:
+            case INCOMING_MESSAGE_ON_P2P_THREAD:
+            case INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID:
+            case OUTGOING_MESSAGE_ON_P2P_THREAD:
+            case OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID:
+            case INCOMING_MESSAGE_ON_GROUP_THREAD:
+            case INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
+            case OUTGOING_MESSAGE_ON_GROUP_THREAD:
+            case OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
+                Log.e(TAG, "Deleting messages using thread uris is not supported, uri: " + uri);
+                break;
+            case FILE_TRANSFER_WITH_ID:
+                return mMessageHelper.deleteFileTransfer(uri);
+            case EVENT:
+                Log.e(TAG, "Deleting events using unified event uri is not supported, uri: " + uri);
+                break;
+            default:
+                Log.e(TAG, "Invalid delete: " + uri);
         }
 
         return deletedCount;
     }
 
     @Override
-    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+    public synchronized int update(Uri uri, ContentValues values, String selection,
+            String[] selectionArgs) {
         int match = URL_MATCHER.match(uri);
         int updatedCount = 0;
-        SQLiteDatabase writableDatabase = mDbOpenHelper.getWritableDatabase();
 
-        writableDatabase.beginTransaction();
-        try {
-            switch (match) {
-                case THREAD:
-                    updatedCount = RcsProviderThreadHelper.update(
-                            writableDatabase, values, selection, selectionArgs);
-                    break;
-                case PARTICIPANT:
-                    updatedCount = RcsProviderParticipantHelper.update(
-                            writableDatabase, values, selection, selectionArgs);
-                    break;
-                default:
-                    Log.e(TAG, "Invalid update: " + uri);
-            }
-        } finally {
-            writableDatabase.endTransaction();
+        switch (match) {
+            case UNIFIED_RCS_THREAD:
+            case UNIFIED_RCS_THREAD_WITH_ID:
+                Log.e(TAG, "Updating unified thread view is not supported, uri: " + uri);
+                break;
+            case PARTICIPANT:
+                Log.e(TAG, "Updating participants with selection is not supported, uri: " + uri);
+                break;
+            case PARTICIPANT_WITH_ID:
+                return mParticipantHelper.updateParticipantWithId(values, uri);
+            case PARTICIPANT_ALIAS_CHANGE_EVENT:
+            case PARTICIPANT_ALIAS_CHANGE_EVENT_WITH_ID:
+                Log.e(TAG, "Updating events is not supported, uri: " + uri);
+                break;
+            case P2P_THREAD:
+                return mThreadHelper.update1To1Thread(values, selection, selectionArgs);
+            case P2P_THREAD_WITH_ID:
+                return mThreadHelper.update1To1ThreadWithId(values, uri);
+            case P2P_THREAD_PARTICIPANT:
+                Log.e(TAG, "Updating junction table entries is not supported, uri: " + uri);
+                break;
+            case GROUP_THREAD:
+                return mThreadHelper.updateGroupThread(values, selection, selectionArgs);
+            case GROUP_THREAD_WITH_ID:
+                return mThreadHelper.updateGroupThreadWithId(values, uri);
+            case GROUP_THREAD_PARTICIPANT_JOINED_EVENT:
+            case GROUP_THREAD_PARTICIPANT_JOINED_EVENT_WITH_ID:
+            case GROUP_THREAD_PARTICIPANT_LEFT_EVENT:
+            case GROUP_THREAD_PARTICIPANT_LEFT_EVENT_WITH_ID:
+            case GROUP_THREAD_NAME_CHANGE_EVENT:
+            case GROUP_THREAD_NAME_CHANGE_EVENT_WITH_ID:
+            case GROUP_THREAD_ICON_CHANGE_EVENT:
+            case GROUP_THREAD_ICON_CHANGE_EVENT_WITH_ID:
+                Log.e(TAG, "Updating thread events is not supported, uri: " + uri);
+                break;
+            case GROUP_THREAD_PARTICIPANT:
+            case GROUP_THREAD_PARTICIPANT_WITH_ID:
+                Log.e(TAG, "Updating junction table entries is not supported, uri: " + uri);
+                break;
+            case UNIFIED_MESSAGE:
+            case UNIFIED_MESSAGE_WITH_ID:
+                Log.e(TAG, "Updating unified message view is not supported, uri: " + uri);
+                break;
+            case UNIFIED_MESSAGE_WITH_FILE_TRANSFER:
+                Log.e(TAG,
+                        "Updating file transfer using unified message uri is not supported, uri: "
+                                + uri);
+            case INCOMING_MESSAGE:
+                Log.e(TAG,
+                        "Updating an incoming message via selection is not supported, uri: " + uri);
+                break;
+            case INCOMING_MESSAGE_WITH_ID:
+                return mMessageHelper.updateIncomingMessage(uri, values);
+            case OUTGOING_MESSAGE:
+                Log.e(TAG,
+                        "Updating an outgoing message via selection is not supported, uri: " + uri);
+                break;
+            case OUTGOING_MESSAGE_WITH_ID:
+                return mMessageHelper.updateOutgoingMessage(uri, values);
+            case OUTGOING_MESSAGE_DELIVERY:
+                Log.e(TAG, "Updating message deliveries using message uris is not supported, uri: "
+                        + uri);
+                break;
+            case OUTGOING_MESSAGE_DELIVERY_WITH_ID:
+                return mMessageHelper.updateDelivery(uri, values);
+            case UNIFIED_MESSAGE_ON_THREAD:
+            case UNIFIED_MESSAGE_ON_THREAD_WITH_ID:
+            case INCOMING_MESSAGE_ON_P2P_THREAD:
+            case INCOMING_MESSAGE_ON_P2P_THREAD_WITH_ID:
+            case OUTGOING_MESSAGE_ON_P2P_THREAD:
+            case OUTGOING_MESSAGE_ON_P2P_THREAD_WITH_ID:
+            case INCOMING_MESSAGE_ON_GROUP_THREAD:
+            case INCOMING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
+            case OUTGOING_MESSAGE_ON_GROUP_THREAD:
+            case OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID:
+                Log.e(TAG, "Updating messages using threads uris is not supported, uri: " + uri);
+                break;
+            case FILE_TRANSFER_WITH_ID:
+                return mMessageHelper.updateFileTransfer(uri, values);
+            case EVENT:
+                Log.e(TAG, "Updating events is not supported, uri: " + uri);
+                break;
+            default:
+                Log.e(TAG, "Invalid update: " + uri);
         }
+
         return updatedCount;
     }
 }
diff --git a/src/com/android/providers/telephony/RcsProviderEventHelper.java b/src/com/android/providers/telephony/RcsProviderEventHelper.java
new file mode 100644
index 0000000..9d89e28
--- /dev/null
+++ b/src/com/android/providers/telephony/RcsProviderEventHelper.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.providers.telephony;
+
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantEventColumns.NEW_ALIAS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsEventTypes.ICON_CHANGED_EVENT_TYPE;
+import static android.provider.Telephony.RcsColumns.RcsEventTypes.NAME_CHANGED_EVENT_TYPE;
+import static android.provider.Telephony.RcsColumns.RcsEventTypes.PARTICIPANT_JOINED_EVENT_TYPE;
+import static android.provider.Telephony.RcsColumns.RcsEventTypes.PARTICIPANT_LEFT_EVENT_TYPE;
+import static android.provider.Telephony.RcsColumns.RcsThreadColumns.RCS_THREAD_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.DESTINATION_PARTICIPANT_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.EVENT_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.EVENT_TYPE_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_ICON_URI_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_NAME_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.SOURCE_PARTICIPANT_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.TIMESTAMP_COLUMN;
+import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
+import static android.telephony.ims.RcsEventQueryParameters.ALL_EVENTS;
+import static android.telephony.ims.RcsEventQueryParameters.ALL_GROUP_THREAD_EVENTS;
+import static android.telephony.ims.RcsEventQueryParameters.EVENT_QUERY_PARAMETERS_KEY;
+
+import static android.telephony.ims.RcsQueryContinuationToken.EVENT_QUERY_CONTINUATION_TOKEN_TYPE;
+import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
+import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_EVENT_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_THREAD_EVENT_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_THREAD_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_UNIFIED_EVENT_VIEW;
+import static com.android.providers.telephony.RcsProvider.TAG;
+import static com.android.providers.telephony.RcsProviderThreadHelper.getThreadIdFromUri;
+import static com.android.providers.telephony.RcsProviderUtil.INSERTION_FAILED;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.net.Uri;
+import android.os.Bundle;
+import android.telephony.ims.RcsEventQueryParameters;
+import android.telephony.ims.RcsQueryContinuationToken;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+/**
+ * Constants and helpers related to events for {@link RcsProvider} to keep the code clean.
+ *
+ * @hide
+ */
+class RcsProviderEventHelper {
+    private static final int PARTICIPANT_INDEX_IN_EVENT_URI = 1;
+    private static final int EVENT_INDEX_IN_EVENT_URI = 3;
+
+    @VisibleForTesting
+    public static void createRcsEventTables(SQLiteDatabase db) {
+        Log.d(TAG, "Creating event tables");
+
+        // Add the event tables
+        db.execSQL("CREATE TABLE " + RCS_THREAD_EVENT_TABLE + "(" + EVENT_ID_COLUMN
+                + " INTEGER PRIMARY KEY AUTOINCREMENT, " + RCS_THREAD_ID_COLUMN + " INTEGER, "
+                + SOURCE_PARTICIPANT_ID_COLUMN + " INTEGER, " + EVENT_TYPE_COLUMN + " INTEGER, "
+                + TIMESTAMP_COLUMN + " INTEGER, " + DESTINATION_PARTICIPANT_ID_COLUMN + " INTEGER, "
+                + NEW_ICON_URI_COLUMN + " TEXT, " + NEW_NAME_COLUMN + " TEXT, " + " FOREIGN KEY ("
+                + RCS_THREAD_ID_COLUMN + ") REFERENCES " + RCS_THREAD_TABLE + " ("
+                + RCS_THREAD_ID_COLUMN + "), FOREIGN KEY (" + SOURCE_PARTICIPANT_ID_COLUMN
+                + ") REFERENCES " + RCS_PARTICIPANT_TABLE + " (" + RCS_PARTICIPANT_ID_COLUMN
+                + "))");
+
+        db.execSQL("CREATE TABLE " + RCS_PARTICIPANT_EVENT_TABLE + "(" + EVENT_ID_COLUMN
+                + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SOURCE_PARTICIPANT_ID_COLUMN +
+                " INTEGER, " + TIMESTAMP_COLUMN + " INTEGER, "
+                + NEW_ALIAS_COLUMN + " TEXT," + " FOREIGN KEY (" + SOURCE_PARTICIPANT_ID_COLUMN
+                + ") REFERENCES " + RCS_PARTICIPANT_TABLE + " (" + RCS_PARTICIPANT_ID_COLUMN
+                + "))");
+
+        // Add the views
+
+        // The following is a unified event view that puts every entry in both tables into one query
+        db.execSQL("CREATE VIEW " + RCS_UNIFIED_EVENT_VIEW + " AS "
+                + "SELECT 1 AS event_type, event_id, originating_participant, "
+                + "origination_timestamp, old_alias, new_alias, NULL as rcs_thread_id, NULL as "
+                + "destination_participant, NULL as old_icon_uri, NULL as new_icon_uri, NULL as "
+                + "old_name, NULL as new_name "
+                + "FROM rcs_participant_event"
+                + " UNION "
+                + "SELECT event_type, event_id, originating_participant, origination_timestamp, "
+                + "NULL as old_alias, NULL as new_alias, rcs_thread_id, destination_participant, "
+                + "old_icon_uri, new_icon_uri, old_name, new_name "
+                + "FROM rcs_thread_event");
+    }
+
+    private final SQLiteOpenHelper mSqLiteOpenHelper;
+
+    Cursor queryEvents(Bundle bundle) {
+        RcsEventQueryParameters queryParameters = null;
+        RcsQueryContinuationToken continuationToken = null;
+
+        if (bundle != null) {
+            queryParameters = bundle.getParcelable(EVENT_QUERY_PARAMETERS_KEY);
+            continuationToken = bundle.getParcelable(QUERY_CONTINUATION_TOKEN);
+        }
+
+        if (continuationToken != null) {
+            return RcsProviderUtil.performContinuationQuery(mSqLiteOpenHelper.getReadableDatabase(),
+                    continuationToken);
+        }
+
+        // if no query parameters were entered, build an empty query parameters object
+        if (queryParameters == null) {
+            queryParameters = new RcsEventQueryParameters.Builder().build();
+        }
+
+        return performInitialQuery(queryParameters);
+    }
+
+    private Cursor performInitialQuery(RcsEventQueryParameters queryParameters) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+        StringBuilder rawQuery = new StringBuilder("SELECT * FROM ").append(RCS_UNIFIED_EVENT_VIEW);
+
+        int eventType = queryParameters.getEventType();
+        if (eventType != ALL_EVENTS) {
+            rawQuery.append(" WHERE ").append(EVENT_TYPE_COLUMN);
+            if (eventType == ALL_GROUP_THREAD_EVENTS) {
+                rawQuery.append(" IN (").append(
+                        PARTICIPANT_JOINED_EVENT_TYPE).append(", ").append(
+                        PARTICIPANT_LEFT_EVENT_TYPE).append(", ").append(
+                        ICON_CHANGED_EVENT_TYPE).append(", ").append(
+                        NAME_CHANGED_EVENT_TYPE).append(
+                        ")");
+            } else {
+                rawQuery.append("=").append(eventType);
+            }
+        }
+
+        rawQuery.append(" ORDER BY ");
+
+        int sortingProperty = queryParameters.getSortingProperty();
+        if (sortingProperty == RcsEventQueryParameters.SORT_BY_TIMESTAMP) {
+            rawQuery.append(TIMESTAMP_COLUMN);
+        } else {
+            rawQuery.append(EVENT_ID_COLUMN);
+        }
+
+        rawQuery.append(queryParameters.getSortDirection() ? " ASC " : " DESC ");
+
+        RcsProviderUtil.appendLimit(rawQuery, queryParameters.getLimit());
+        String rawQueryAsString = rawQuery.toString();
+        Cursor cursor = db.rawQuery(rawQueryAsString, null);
+
+        // if the query was paginated, build the next query
+        int limit = queryParameters.getLimit();
+        if (limit > 0) {
+            RcsProviderUtil.createContinuationTokenBundle(cursor,
+                    new RcsQueryContinuationToken(EVENT_QUERY_CONTINUATION_TOKEN_TYPE,
+                        rawQueryAsString, limit, limit), QUERY_CONTINUATION_TOKEN);
+        }
+
+        return cursor;
+    }
+
+    RcsProviderEventHelper(SQLiteOpenHelper sqLiteOpenHelper) {
+        mSqLiteOpenHelper = sqLiteOpenHelper;
+    }
+
+    long insertParticipantEvent(Uri uri, ContentValues values) {
+        String participantId = getParticipantIdFromUri(uri);
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        values.put(SOURCE_PARTICIPANT_ID_COLUMN, participantId);
+        long rowId = db.insert(RCS_PARTICIPANT_EVENT_TABLE, SOURCE_PARTICIPANT_ID_COLUMN, values);
+        values.remove(SOURCE_PARTICIPANT_ID_COLUMN);
+
+        if (rowId == INSERTION_FAILED) {
+            return TRANSACTION_FAILED;
+        }
+
+        return rowId;
+    }
+
+    long insertParticipantJoinedEvent(Uri uri, ContentValues values) {
+        return insertGroupThreadEvent(uri, values, PARTICIPANT_JOINED_EVENT_TYPE);
+    }
+
+    long insertParticipantLeftEvent(Uri uri, ContentValues values) {
+        return insertGroupThreadEvent(uri, values, PARTICIPANT_LEFT_EVENT_TYPE);
+    }
+
+    long insertThreadNameChangeEvent(Uri uri, ContentValues values) {
+        return insertGroupThreadEvent(uri, values, NAME_CHANGED_EVENT_TYPE);
+    }
+
+    long insertThreadIconChangeEvent(Uri uri, ContentValues values) {
+        return insertGroupThreadEvent(uri, values, ICON_CHANGED_EVENT_TYPE);
+    }
+
+    private long insertGroupThreadEvent(Uri uri, ContentValues valuesParameter,
+            int eventType) {
+        String threadId = getThreadIdFromUri(uri);
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        ContentValues values = new ContentValues(valuesParameter);
+        values.put(EVENT_TYPE_COLUMN, eventType);
+        values.put(RCS_THREAD_ID_COLUMN, threadId);
+        long rowId = db.insert(RCS_THREAD_EVENT_TABLE, EVENT_ID_COLUMN, values);
+
+        if (rowId == INSERTION_FAILED) {
+            return TRANSACTION_FAILED;
+        }
+
+        return rowId;
+    }
+
+    int deleteParticipantEvent(Uri uri) {
+        String eventId = getEventIdFromEventUri(uri);
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+
+        return db.delete(RCS_PARTICIPANT_EVENT_TABLE, EVENT_ID_COLUMN + "=?",
+                new String[]{eventId});
+    }
+
+    int deleteGroupThreadEvent(Uri uri) {
+        String eventId = getEventIdFromEventUri(uri);
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+
+        return db.delete(RCS_THREAD_EVENT_TABLE, EVENT_ID_COLUMN + "=?", new String[]{eventId});
+    }
+
+    private String getEventIdFromEventUri(Uri uri) {
+        return uri.getPathSegments().get(EVENT_INDEX_IN_EVENT_URI);
+    }
+
+    private String getParticipantIdFromUri(Uri uri) {
+        return uri.getPathSegments().get(PARTICIPANT_INDEX_IN_EVENT_URI);
+    }
+}
diff --git a/src/com/android/providers/telephony/RcsProviderMessageHelper.java b/src/com/android/providers/telephony/RcsProviderMessageHelper.java
new file mode 100644
index 0000000..ba89e8c
--- /dev/null
+++ b/src/com/android/providers/telephony/RcsProviderMessageHelper.java
@@ -0,0 +1,707 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.providers.telephony;
+
+import static android.provider.Telephony.RcsColumns.CONTENT_AND_AUTHORITY;
+import static android.provider.Telephony.RcsColumns.Rcs1To1ThreadColumns.RCS_1_TO_1_THREAD_URI_PART;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.CONTENT_TYPE_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.CONTENT_URI_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.FILE_SIZE_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.FILE_TRANSFER_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.HEIGHT_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.DURATION_MILLIS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.PREVIEW_TYPE_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.PREVIEW_URI_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.SESSION_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.SUCCESSFULLY_TRANSFERRED_BYTES;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.TRANSFER_STATUS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.WIDTH_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.RCS_GROUP_THREAD_URI_PART;
+import static android.provider.Telephony.RcsColumns.RcsIncomingMessageColumns.ARRIVAL_TIMESTAMP_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsIncomingMessageColumns.INCOMING_MESSAGE_URI_PART;
+import static android.provider.Telephony.RcsColumns.RcsIncomingMessageColumns.SENDER_PARTICIPANT_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.GLOBAL_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.LATITUDE_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.LONGITUDE_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.MESSAGE_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.MESSAGE_TEXT_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.ORIGINATION_TIMESTAMP_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.STATUS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.SUB_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageDeliveryColumns.DELIVERED_TIMESTAMP_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsOutgoingMessageColumns.OUTGOING_MESSAGE_URI_PART;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadColumns.RCS_THREAD_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsUnifiedMessageColumns.MESSAGE_TYPE_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsUnifiedMessageColumns.MESSAGE_TYPE_INCOMING;
+import static android.provider.Telephony.RcsColumns.RcsUnifiedMessageColumns.MESSAGE_TYPE_OUTGOING;
+import static android.provider.Telephony.RcsColumns.RcsUnifiedMessageColumns.UNIFIED_INCOMING_MESSAGE_VIEW;
+import static android.provider.Telephony.RcsColumns.RcsUnifiedMessageColumns.UNIFIED_OUTGOING_MESSAGE_VIEW;
+import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
+import static android.telephony.ims.RcsMessageQueryParameters.MESSAGE_QUERY_PARAMETERS_KEY;
+import static android.telephony.ims.RcsMessageQueryParameters.THREAD_ID_NOT_SET;
+
+import static android.telephony.ims.RcsQueryContinuationToken.MESSAGE_QUERY_CONTINUATION_TOKEN_TYPE;
+import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
+import static com.android.providers.telephony.RcsProvider.RCS_FILE_TRANSFER_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_INCOMING_MESSAGE_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_MESSAGE_DELIVERY_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_MESSAGE_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_OUTGOING_MESSAGE_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_THREAD_JUNCTION_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_THREAD_TABLE;
+import static com.android.providers.telephony.RcsProvider.TAG;
+import static com.android.providers.telephony.RcsProvider.UNIFIED_MESSAGE_VIEW;
+import static com.android.providers.telephony.RcsProviderThreadHelper.getThreadIdFromUri;
+import static com.android.providers.telephony.RcsProviderUtil.INSERTION_FAILED;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Telephony.RcsColumns.RcsIncomingMessageColumns;
+import android.provider.Telephony.RcsColumns.RcsMessageDeliveryColumns;
+import android.telephony.ims.RcsMessageQueryParameters;
+import android.telephony.ims.RcsQueryContinuationToken;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+/**
+ * Constants and helpers related to messages for {@link RcsProvider} to keep the code clean.
+ *
+ * @hide
+ */
+public class RcsProviderMessageHelper {
+    private static final int MESSAGE_ID_INDEX_IN_URI = 1;
+    private static final int MESSAGE_ID_INDEX_IN_THREAD_URI = 3;
+
+    private final SQLiteOpenHelper mSqLiteOpenHelper;
+
+    @VisibleForTesting
+    public static void createRcsMessageTables(SQLiteDatabase db) {
+        Log.d(TAG, "Creating message tables");
+
+        // Add the message tables
+        db.execSQL("CREATE TABLE " + RCS_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN
+                + " INTEGER PRIMARY KEY AUTOINCREMENT, " + RCS_THREAD_ID_COLUMN + " INTEGER, "
+                + GLOBAL_ID_COLUMN + " TEXT, " + SUB_ID_COLUMN + " INTEGER, " + MESSAGE_TEXT_COLUMN
+                + " TEXT," + LATITUDE_COLUMN + " REAL, " + LONGITUDE_COLUMN + " REAL, "
+                + STATUS_COLUMN + " INTEGER, " + ORIGINATION_TIMESTAMP_COLUMN
+                + " INTEGER, FOREIGN KEY(" + RCS_THREAD_ID_COLUMN + ") REFERENCES "
+                + RCS_THREAD_TABLE + "(" + RCS_THREAD_ID_COLUMN + "))");
+
+        db.execSQL("CREATE TABLE " + RCS_INCOMING_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN
+                + " INTEGER PRIMARY KEY, " + SENDER_PARTICIPANT_ID_COLUMN + " INTEGER, "
+                + ARRIVAL_TIMESTAMP_COLUMN + " INTEGER, "
+                + RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN + " INTEGER, FOREIGN KEY ("
+                + MESSAGE_ID_COLUMN + ") REFERENCES " + RCS_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN
+                + "))");
+
+        db.execSQL("CREATE TABLE " + RCS_OUTGOING_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN
+                + " INTEGER PRIMARY KEY, FOREIGN KEY (" + MESSAGE_ID_COLUMN + ") REFERENCES "
+                + RCS_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN + "))");
+
+        db.execSQL("CREATE TABLE " + RCS_MESSAGE_DELIVERY_TABLE + "(" + MESSAGE_ID_COLUMN
+                + " INTEGER, " + RCS_PARTICIPANT_ID_COLUMN + " INTEGER, "
+                + DELIVERED_TIMESTAMP_COLUMN + " INTEGER, "
+                + RcsMessageDeliveryColumns.SEEN_TIMESTAMP_COLUMN + " INTEGER, "
+                + "CONSTRAINT message_delivery PRIMARY KEY (" + MESSAGE_ID_COLUMN + ", "
+                + RCS_PARTICIPANT_ID_COLUMN + "), FOREIGN KEY (" + MESSAGE_ID_COLUMN
+                + ") REFERENCES " + RCS_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN + "), FOREIGN KEY ("
+                + RCS_PARTICIPANT_ID_COLUMN + ") REFERENCES " + RCS_PARTICIPANT_TABLE + "("
+                + RCS_PARTICIPANT_ID_COLUMN + "))");
+
+        db.execSQL("CREATE TABLE " + RCS_FILE_TRANSFER_TABLE + " (" + FILE_TRANSFER_ID_COLUMN
+                + " INTEGER PRIMARY KEY AUTOINCREMENT, " + MESSAGE_ID_COLUMN + " INTEGER, "
+                + SESSION_ID_COLUMN + " TEXT, " + CONTENT_URI_COLUMN + " TEXT, "
+                + CONTENT_TYPE_COLUMN + " TEXT, " + FILE_SIZE_COLUMN + " INTEGER, "
+                + SUCCESSFULLY_TRANSFERRED_BYTES + " INTEGER, " + TRANSFER_STATUS_COLUMN +
+                " INTEGER, " + WIDTH_COLUMN + " INTEGER, " + HEIGHT_COLUMN + " INTEGER, "
+                + DURATION_MILLIS_COLUMN + " INTEGER, " + PREVIEW_URI_COLUMN + " TEXT, "
+                + PREVIEW_TYPE_COLUMN + " TEXT, FOREIGN KEY (" + MESSAGE_ID_COLUMN + ") REFERENCES "
+                + RCS_MESSAGE_TABLE + "(" + MESSAGE_ID_COLUMN + "))");
+
+        // Add the views
+        //
+        // The following view inner joins incoming messages with all messages, inner joins outgoing
+        // messages with all messages, and unions them together, while also adding an is_incoming
+        // column for easily telling where the record came from. This may have been achieved with
+        // an outer join but SQLite doesn't support them.
+        //
+        // CREATE VIEW unified_message_view AS
+        //
+        // SELECT rcs_message.rcs_message_row_id,
+        //        rcs_message.rcs_thread_id,
+        //        rcs_message.rcs_message_global_id,
+        //        rcs_message.sub_id,
+        //        rcs_message.status,
+        //        rcs_message.origination_timestamp,
+        //        rcs_message.rcs_text,
+        //        rcs_message.latitude,
+        //        rcs_message.longitude,
+        //        0 AS sender_participant,
+        //        0 AS arrival_timestamp,
+        //        0 AS seen_timestamp,
+        //        outgoing AS message_type
+        //
+        // FROM rcs_message INNER JOIN rcs_outgoing_message
+        //          ON rcs_message.rcs_message_row_id=rcs_outgoing_message.rcs_message_row_id
+        //
+        // UNION
+        //
+        // SELECT rcs_message.rcs_message_row_id,
+        //        rcs_message.rcs_thread_id,
+        //        rcs_message.rcs_message_global_id,
+        //        rcs_message.sub_id,
+        //        rcs_message.status,
+        //        rcs_message.origination_timestamp,
+        //        rcs_message.rcs_text,
+        //        rcs_message.latitude,
+        //        rcs_message.longitude,
+        //        rcs_incoming_message.sender_participant,
+        //        rcs_incoming_message.arrival_timestamp,
+        //        rcs_incoming_message.seen_timestamp,
+        //        incoming AS message_type
+        //
+        // FROM rcs_message INNER JOIN rcs_incoming_message
+        //          ON rcs_message.rcs_message_row_id=rcs_incoming_message.rcs_message_row_id
+        //
+        db.execSQL("CREATE VIEW " + UNIFIED_MESSAGE_VIEW + " AS SELECT "
+                + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + GLOBAL_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + SUB_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + STATUS_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + ORIGINATION_TIMESTAMP_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + MESSAGE_TEXT_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + LATITUDE_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + LONGITUDE_COLUMN + ", "
+                + "0 AS " + SENDER_PARTICIPANT_ID_COLUMN + ", "
+                + "0 AS " + ARRIVAL_TIMESTAMP_COLUMN + ", "
+                + "0 AS " + RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN + ", "
+                + MESSAGE_TYPE_OUTGOING + " AS " + MESSAGE_TYPE_COLUMN
+                + " FROM " + RCS_MESSAGE_TABLE + " INNER JOIN " + RCS_OUTGOING_MESSAGE_TABLE
+                + " ON " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "="
+                + RCS_OUTGOING_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN
+                + " UNION SELECT "
+                + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + GLOBAL_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + SUB_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + STATUS_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + ORIGINATION_TIMESTAMP_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + MESSAGE_TEXT_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + LATITUDE_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + LONGITUDE_COLUMN + ", "
+                + RCS_INCOMING_MESSAGE_TABLE + "." + SENDER_PARTICIPANT_ID_COLUMN + ", "
+                + RCS_INCOMING_MESSAGE_TABLE + "." + ARRIVAL_TIMESTAMP_COLUMN + ", "
+                + RCS_INCOMING_MESSAGE_TABLE + "." + RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN
+                + ", "
+                + MESSAGE_TYPE_INCOMING + " AS " + MESSAGE_TYPE_COLUMN
+                + " FROM " + RCS_MESSAGE_TABLE + " INNER JOIN " + RCS_INCOMING_MESSAGE_TABLE
+                + " ON " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "="
+                + RCS_INCOMING_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN);
+
+        // The following view inner joins incoming messages with all messages
+        //
+        // CREATE VIEW unified_incoming_message_view AS
+        //
+        // SELECT rcs_message.rcs_message_row_id,
+        //        rcs_message.rcs_thread_id,
+        //        rcs_message.rcs_message_global_id,
+        //        rcs_message.sub_id,
+        //        rcs_message.status,
+        //        rcs_message.origination_timestamp,
+        //        rcs_message.rcs_text,
+        //        rcs_message.latitude,
+        //        rcs_message.longitude,
+        //        rcs_incoming_message.sender_participant,
+        //        rcs_incoming_message.arrival_timestamp,
+        //        rcs_incoming_message.seen_timestamp,
+        //
+        // FROM rcs_message INNER JOIN rcs_incoming_message
+        //          ON rcs_message.rcs_message_row_id=rcs_incoming_message.rcs_message_row_id
+
+        db.execSQL("CREATE VIEW " + UNIFIED_INCOMING_MESSAGE_VIEW + " AS SELECT "
+                + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + GLOBAL_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + SUB_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + STATUS_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + ORIGINATION_TIMESTAMP_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + MESSAGE_TEXT_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + LATITUDE_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + LONGITUDE_COLUMN + ", "
+                + RCS_INCOMING_MESSAGE_TABLE + "." + SENDER_PARTICIPANT_ID_COLUMN + ", "
+                + RCS_INCOMING_MESSAGE_TABLE + "." + ARRIVAL_TIMESTAMP_COLUMN + ", "
+                + RCS_INCOMING_MESSAGE_TABLE + "." + RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN
+                + " FROM " + RCS_MESSAGE_TABLE + " INNER JOIN " + RCS_INCOMING_MESSAGE_TABLE
+                + " ON " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "="
+                + RCS_INCOMING_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN);
+
+        // The following view inner joins outgoing messages with all messages.
+        //
+        // CREATE VIEW unified_outgoing_message AS
+        //
+        // SELECT rcs_message.rcs_message_row_id,
+        //        rcs_message.rcs_thread_id,
+        //        rcs_message.rcs_message_global_id,
+        //        rcs_message.sub_id,
+        //        rcs_message.status,
+        //        rcs_message.origination_timestamp
+        //        rcs_message.rcs_text,
+        //        rcs_message.latitude,
+        //        rcs_message.longitude,
+        //
+        // FROM rcs_message INNER JOIN rcs_outgoing_message
+        //          ON rcs_message.rcs_message_row_id=rcs_outgoing_message.rcs_message_row_id
+
+        db.execSQL("CREATE VIEW " + UNIFIED_OUTGOING_MESSAGE_VIEW + " AS SELECT "
+                + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + GLOBAL_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + SUB_ID_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + STATUS_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + ORIGINATION_TIMESTAMP_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + MESSAGE_TEXT_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + LATITUDE_COLUMN + ", "
+                + RCS_MESSAGE_TABLE + "." + LONGITUDE_COLUMN
+                + " FROM " + RCS_MESSAGE_TABLE + " INNER JOIN " + RCS_OUTGOING_MESSAGE_TABLE
+                + " ON " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "="
+                + RCS_OUTGOING_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN);
+
+        // Add triggers
+
+        // Delete the corresponding rcs_message row upon deleting a row in rcs_incoming_message
+        //
+        // CREATE TRIGGER delete_common_message_after_incoming
+        //  AFTER DELETE ON rcs_incoming_message
+        // BEGIN
+        //  DELETE FROM rcs_message WHERE rcs_message.rcs_message_row_id=OLD.rcs_message_row_id;
+        // END
+        db.execSQL("CREATE TRIGGER deleteCommonMessageAfterIncoming AFTER DELETE ON "
+                + RCS_INCOMING_MESSAGE_TABLE + " BEGIN DELETE FROM " + RCS_MESSAGE_TABLE
+                + " WHERE " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "=OLD."
+                + MESSAGE_ID_COLUMN + "; END");
+
+        // Delete the corresponding rcs_message row upon deleting a row in rcs_outgoing_message
+        //
+        // CREATE TRIGGER delete_common_message_after_outgoing
+        //  AFTER DELETE ON rcs_outgoing_message
+        // BEGIN
+        //  DELETE FROM rcs_message WHERE rcs_message.rcs_message_row_id=OLD.rcs_message_row_id;
+        // END
+        db.execSQL("CREATE TRIGGER deleteCommonMessageAfterOutgoing AFTER DELETE ON "
+                + RCS_OUTGOING_MESSAGE_TABLE + " BEGIN DELETE FROM " + RCS_MESSAGE_TABLE
+                + " WHERE " + RCS_MESSAGE_TABLE + "." + MESSAGE_ID_COLUMN + "=OLD."
+                + MESSAGE_ID_COLUMN + "; END");
+    }
+
+    RcsProviderMessageHelper(SQLiteOpenHelper sqLiteOpenHelper) {
+        mSqLiteOpenHelper = sqLiteOpenHelper;
+    }
+
+    Cursor queryMessages(Bundle bundle) {
+        RcsMessageQueryParameters queryParameters = null;
+        RcsQueryContinuationToken continuationToken = null;
+
+        if (bundle != null) {
+            queryParameters = bundle.getParcelable(MESSAGE_QUERY_PARAMETERS_KEY);
+            continuationToken = bundle.getParcelable(QUERY_CONTINUATION_TOKEN);
+        }
+
+        if (continuationToken != null) {
+            return RcsProviderUtil.performContinuationQuery(mSqLiteOpenHelper.getReadableDatabase(),
+                    continuationToken);
+        }
+
+        // if no parameters were entered, build an empty query parameters object
+        if (queryParameters == null) {
+            queryParameters = new RcsMessageQueryParameters.Builder().build();
+        }
+
+        return performInitialQuery(queryParameters);
+    }
+
+    private Cursor performInitialQuery(RcsMessageQueryParameters queryParameters) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+
+        StringBuilder rawQuery = new StringBuilder("SELECT * FROM ").append(UNIFIED_MESSAGE_VIEW);
+
+        int messageType = queryParameters.getMessageType();
+        String messageLike = queryParameters.getMessageLike();
+        int threadId = queryParameters.getThreadId();
+
+        boolean isMessageLikePresent = !TextUtils.isEmpty(messageLike);
+        boolean isMessageTypeFiltered = (messageType == MESSAGE_TYPE_INCOMING)
+                || (messageType == MESSAGE_TYPE_OUTGOING);
+        boolean isThreadFiltered = threadId != THREAD_ID_NOT_SET;
+
+        if (isMessageLikePresent || isMessageTypeFiltered || isThreadFiltered) {
+            rawQuery.append(" WHERE ");
+        }
+
+        if (messageType == MESSAGE_TYPE_INCOMING) {
+            rawQuery.append(MESSAGE_TYPE_COLUMN).append("=").append(MESSAGE_TYPE_INCOMING);
+        } else if (messageType == MESSAGE_TYPE_OUTGOING) {
+            rawQuery.append(MESSAGE_TYPE_COLUMN).append("=").append(MESSAGE_TYPE_OUTGOING);
+        }
+
+        if (isMessageLikePresent) {
+            if (isMessageTypeFiltered) {
+                rawQuery.append(" AND ");
+            }
+            rawQuery.append(MESSAGE_TEXT_COLUMN).append(" LIKE \"").append(messageLike)
+                    .append("\"");
+        }
+
+        if (isThreadFiltered) {
+            if (isMessageLikePresent || isMessageTypeFiltered) {
+                rawQuery.append(" AND ");
+            }
+            rawQuery.append(RCS_THREAD_ID_COLUMN).append("=").append(threadId);
+        }
+
+        // TODO - figure out a way to see if this message has file transfer or not. Ideally we
+        // should join the unified table with file transfer table, but using a trigger to change a
+        // flag on rcs_message would also work
+
+        rawQuery.append(" ORDER BY ");
+
+        int sortingProperty = queryParameters.getSortingProperty();
+        if (sortingProperty == RcsMessageQueryParameters.SORT_BY_TIMESTAMP) {
+            rawQuery.append(ORIGINATION_TIMESTAMP_COLUMN);
+        } else {
+            rawQuery.append(MESSAGE_ID_COLUMN);
+        }
+
+        rawQuery.append(queryParameters.getSortDirection() ? " ASC " : " DESC ");
+
+        RcsProviderUtil.appendLimit(rawQuery, queryParameters.getLimit());
+        String rawQueryAsString = rawQuery.toString();
+        Cursor cursor = db.rawQuery(rawQueryAsString, null);
+
+        // If the query was paginated, build the next query
+        int limit = queryParameters.getLimit();
+        if (limit > 0) {
+            RcsProviderUtil.createContinuationTokenBundle(cursor,
+                    new RcsQueryContinuationToken(MESSAGE_QUERY_CONTINUATION_TOKEN_TYPE,
+                            rawQueryAsString, limit, limit), QUERY_CONTINUATION_TOKEN);
+        }
+
+        return cursor;
+    }
+
+    Cursor queryUnifiedMessageWithId(Uri uri) {
+        return queryUnifiedMessageWithSelection(getMessageIdSelection(uri), null);
+    }
+
+    Cursor queryUnifiedMessageWithIdInThread(Uri uri) {
+        return queryUnifiedMessageWithSelection(getMessageIdSelectionInThreadUri(uri), null);
+    }
+
+    Cursor queryUnifiedMessageWithSelection(String selection, String[] selectionArgs) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+        return db.query(UNIFIED_MESSAGE_VIEW, null, selection, selectionArgs, null, null, null,
+                null);
+    }
+
+    Cursor queryIncomingMessageWithId(Uri uri) {
+        return queryIncomingMessageWithSelection(getMessageIdSelection(uri), null);
+    }
+
+    Cursor queryIncomingMessageWithSelection(String selection, String[] selectionArgs) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+        return db.query(UNIFIED_INCOMING_MESSAGE_VIEW, null, selection, selectionArgs, null, null,
+                null, null);
+    }
+
+    Cursor queryOutgoingMessageWithId(Uri uri) {
+        return queryOutgoingMessageWithSelection(getMessageIdSelection(uri), null);
+    }
+
+    Cursor queryOutgoingMessageWithSelection(String selection, String[] selectionArgs) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+        return db.query(UNIFIED_OUTGOING_MESSAGE_VIEW, null, selection, selectionArgs, null, null,
+                null, null);
+    }
+
+    Cursor queryAllMessagesOnThread(Uri uri, String selection, String[] selectionArgs) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+
+        String appendedSelection = appendThreadIdToSelection(uri, selection);
+        return db.query(UNIFIED_MESSAGE_VIEW, null, appendedSelection, null, null, null, null);
+    }
+
+    Uri insertMessageOnThread(Uri uri, ContentValues valuesParameter, boolean isIncoming,
+            boolean is1To1) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+
+        String threadId = RcsProviderThreadHelper.getThreadIdFromUri(uri);
+        ContentValues values = new ContentValues(valuesParameter);
+        values.put(RCS_THREAD_ID_COLUMN, Integer.parseInt(threadId));
+
+        db.beginTransaction();
+
+        ContentValues subMessageTableValues = new ContentValues();
+        if (isIncoming) {
+            subMessageTableValues = getIncomingMessageValues(values);
+        }
+
+        long rowId;
+        try {
+            rowId = db.insert(RCS_MESSAGE_TABLE, MESSAGE_ID_COLUMN, values);
+            if (rowId == INSERTION_FAILED) {
+                return null;
+            }
+
+            subMessageTableValues.put(MESSAGE_ID_COLUMN, rowId);
+            long tempId = db.insert(
+                    isIncoming ? RCS_INCOMING_MESSAGE_TABLE : RCS_OUTGOING_MESSAGE_TABLE,
+                    MESSAGE_ID_COLUMN, subMessageTableValues);
+            if (tempId == INSERTION_FAILED) {
+                return null;
+            }
+
+            // if the thread is outgoing, insert message deliveries
+            if (!isIncoming && !insertMessageDeliveriesForOutgoingMessageCreation(db, tempId,
+                    threadId)) {
+                return null;
+            }
+
+            db.setTransactionSuccessful();
+        } finally {
+            db.endTransaction();
+        }
+
+        values.remove(RCS_THREAD_ID_COLUMN);
+
+        String threadPart =  is1To1 ? RCS_1_TO_1_THREAD_URI_PART : RCS_GROUP_THREAD_URI_PART;
+        String messagePart = isIncoming ? INCOMING_MESSAGE_URI_PART : OUTGOING_MESSAGE_URI_PART;
+
+        return CONTENT_AND_AUTHORITY.buildUpon().appendPath(threadPart).appendPath(threadId).
+                appendPath(messagePart).appendPath(Long.toString(rowId)).build();
+    }
+
+    // Tries to insert deliveries for outgoing message, returns false if it fails.
+    private boolean insertMessageDeliveriesForOutgoingMessageCreation(
+            SQLiteDatabase dbInTransaction, long messageId, String threadId) {
+        try (Cursor participantsInThreadCursor = dbInTransaction.query(
+                RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, null, RCS_THREAD_ID_COLUMN + "=?",
+                new String[]{threadId}, null, null, null)) {
+            if (participantsInThreadCursor == null) {
+                return false;
+            }
+
+            while (participantsInThreadCursor.moveToNext()) {
+                String participantId = participantsInThreadCursor.getString(
+                        participantsInThreadCursor.getColumnIndex(
+                                RCS_PARTICIPANT_ID_COLUMN));
+
+                long insertionRow = insertMessageDelivery(Long.toString(messageId), participantId,
+                        new ContentValues());
+
+                if (insertionRow == INSERTION_FAILED) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    long insertMessageDelivery(Uri uri, ContentValues values) {
+        String messageId = getMessageIdFromUri(uri);
+        String participantId = getParticipantIdFromDeliveryUri(uri);
+        return insertMessageDelivery(messageId, participantId, values);
+    }
+
+    private long insertMessageDelivery(String messageId, String participantId,
+            ContentValues valuesParameter) {
+        ContentValues values = new ContentValues(valuesParameter);
+        values.put(MESSAGE_ID_COLUMN, messageId);
+        values.put(RCS_PARTICIPANT_ID_COLUMN, participantId);
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.insert(RCS_MESSAGE_DELIVERY_TABLE, MESSAGE_ID_COLUMN, values);
+    }
+
+    int updateDelivery(Uri uri, ContentValues contentValues) {
+        String messageId = getMessageIdFromUri(uri);
+        String participantId = getParticipantIdFromDeliveryUri(uri);
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.update(RCS_MESSAGE_DELIVERY_TABLE, contentValues,
+                MESSAGE_ID_COLUMN + "=? AND " + RCS_PARTICIPANT_ID_COLUMN + "=?",
+                new String[]{messageId, participantId});
+    }
+
+    int deleteIncomingMessageWithId(Uri uri) {
+        return deleteIncomingMessageWithSelection(getMessageIdSelection(uri), null);
+    }
+
+    int deleteIncomingMessageWithSelection(String selection, String[] selectionArgs) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.delete(RCS_INCOMING_MESSAGE_TABLE, selection, selectionArgs);
+    }
+
+    int deleteOutgoingMessageWithId(Uri uri) {
+        return deleteOutgoingMessageWithSelection(getMessageIdSelection(uri), null);
+    }
+
+    int deleteOutgoingMessageWithSelection(String selection, String[] selectionArgs) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.delete(RCS_OUTGOING_MESSAGE_TABLE, selection, selectionArgs);
+    }
+
+    int updateIncomingMessage(Uri uri, ContentValues values) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+
+        ContentValues incomingMessageValues = getIncomingMessageValues(values);
+
+        int updateCountInIncoming = 0;
+        int updateCountInCommon = 0;
+        db.beginTransaction();
+        if (!incomingMessageValues.isEmpty()) {
+            updateCountInIncoming = db.update(RCS_INCOMING_MESSAGE_TABLE, incomingMessageValues,
+                    getMessageIdSelection(uri), null);
+        }
+        if (!values.isEmpty()) {
+            updateCountInCommon = db.update(RCS_MESSAGE_TABLE, values, getMessageIdSelection(uri),
+                    null);
+        }
+        db.setTransactionSuccessful();
+        db.endTransaction();
+
+        return Math.max(updateCountInIncoming, updateCountInCommon);
+    }
+
+    int updateOutgoingMessage(Uri uri, ContentValues values) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.update(RCS_MESSAGE_TABLE, values, getMessageIdSelection(uri), null);
+    }
+
+    Cursor queryOutgoingMessageDeliveries(Uri uri) {
+        String messageId = getMessageIdFromUri(uri);
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+        return db.query(RCS_MESSAGE_DELIVERY_TABLE, null, MESSAGE_ID_COLUMN + "=?",
+                new String[]{messageId}, null, null, null);
+    }
+
+    Cursor queryFileTransfer(Uri uri) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+        return db.query(RCS_FILE_TRANSFER_TABLE, null, FILE_TRANSFER_ID_COLUMN + "=?",
+                new String[]{getFileTransferIdFromUri(uri)}, null, null, null, null);
+    }
+
+    long insertFileTransferToMessage(Uri uri, ContentValues values) {
+        String messageId = getMessageIdFromUri(uri);
+        values.put(MESSAGE_ID_COLUMN, messageId);
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        long rowId = db.insert(RCS_FILE_TRANSFER_TABLE, MESSAGE_ID_COLUMN, values);
+        values.remove(MESSAGE_ID_COLUMN);
+
+        if (rowId == INSERTION_FAILED) {
+            rowId = TRANSACTION_FAILED;
+        }
+
+        return rowId;
+    }
+
+    int deleteFileTransfer(Uri uri) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.delete(RCS_FILE_TRANSFER_TABLE, FILE_TRANSFER_ID_COLUMN + "=?",
+                new String[]{getFileTransferIdFromUri(uri)});
+    }
+
+    int updateFileTransfer(Uri uri, ContentValues values) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.update(RCS_FILE_TRANSFER_TABLE, values,
+                FILE_TRANSFER_ID_COLUMN + "=?", new String[]{getFileTransferIdFromUri(uri)});
+    }
+
+    /**
+     * Removes the incoming message values out of all values and returns as a separate content
+     * values object.
+     */
+    private ContentValues getIncomingMessageValues(ContentValues allValues) {
+        ContentValues incomingMessageValues = new ContentValues();
+
+        if (allValues.containsKey(SENDER_PARTICIPANT_ID_COLUMN)) {
+            incomingMessageValues.put(SENDER_PARTICIPANT_ID_COLUMN,
+                    allValues.getAsInteger(SENDER_PARTICIPANT_ID_COLUMN));
+            allValues.remove(SENDER_PARTICIPANT_ID_COLUMN);
+        }
+
+        if (allValues.containsKey(ARRIVAL_TIMESTAMP_COLUMN)) {
+            incomingMessageValues.put(
+                    ARRIVAL_TIMESTAMP_COLUMN, allValues.getAsLong(ARRIVAL_TIMESTAMP_COLUMN));
+            allValues.remove(ARRIVAL_TIMESTAMP_COLUMN);
+        }
+
+        if (allValues.containsKey(RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN)) {
+            incomingMessageValues.put(
+                    RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN,
+                    allValues.getAsLong(RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN));
+            allValues.remove(RcsIncomingMessageColumns.SEEN_TIMESTAMP_COLUMN);
+        }
+
+        return incomingMessageValues;
+    }
+
+    private String appendThreadIdToSelection(Uri uri, String selection) {
+        String threadIdSelection = RCS_THREAD_ID_COLUMN + "=" + getThreadIdFromUri(uri);
+
+        if (TextUtils.isEmpty(selection)) {
+            return threadIdSelection;
+        }
+
+        return "(" + selection + ") AND " + threadIdSelection;
+    }
+
+    private String getMessageIdSelection(Uri uri) {
+        return MESSAGE_ID_COLUMN + "=" + getMessageIdFromUri(uri);
+    }
+
+    private String getMessageIdSelectionInThreadUri(Uri uri) {
+        return MESSAGE_ID_COLUMN + "=" + getMessageIdFromThreadUri(uri);
+    }
+
+    private String getMessageIdFromUri(Uri uri) {
+        return uri.getPathSegments().get(MESSAGE_ID_INDEX_IN_URI);
+    }
+
+    private String getFileTransferIdFromUri(Uri uri) {
+        // this works because messages and file transfer uri's have the same indices.
+        return getMessageIdFromUri(uri);
+    }
+
+    private String getParticipantIdFromDeliveryUri(Uri uri) {
+        // this works because messages in threads and participants in deliveries have the same
+        // indices.
+        return getMessageIdFromThreadUri(uri);
+    }
+
+    private String getMessageIdFromThreadUri(Uri uri) {
+        return uri.getPathSegments().get(MESSAGE_ID_INDEX_IN_THREAD_URI);
+    }
+}
diff --git a/src/com/android/providers/telephony/RcsProviderParticipantHelper.java b/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
index d6ae4f7..dc107a8 100644
--- a/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
+++ b/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
@@ -15,12 +15,37 @@
  */
 package com.android.providers.telephony;
 
-import static com.android.providers.telephony.RcsProviderThreadHelper.RCS_THREAD_ID_COLUMN;
-import static com.android.providers.telephony.RcsProviderThreadHelper.THREAD_TABLE;
+import static android.provider.Telephony.CanonicalAddressesColumns.ADDRESS;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.CANONICAL_ADDRESS_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_ALIAS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_URI_PART;
+import static android.provider.Telephony.RcsColumns.RcsParticipantHelpers.RCS_PARTICIPANT_WITH_ADDRESS_VIEW;
+import static android.provider.Telephony.RcsColumns.RcsParticipantHelpers.RCS_PARTICIPANT_WITH_THREAD_VIEW;
+import static android.provider.Telephony.RcsColumns.RcsThreadColumns.RCS_THREAD_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
+import static android.telephony.ims.RcsParticipantQueryParameters.PARTICIPANT_QUERY_PARAMETERS_KEY;
+
+import static android.telephony.ims.RcsQueryContinuationToken.PARTICIPANT_QUERY_CONTINUATION_TOKEN_TYPE;
+import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
+import static com.android.providers.telephony.RcsProvider.GROUP_THREAD_URI_PREFIX;
+import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_THREAD_JUNCTION_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_THREAD_TABLE;
+import static com.android.providers.telephony.RcsProvider.TAG;
+import static com.android.providers.telephony.RcsProviderThreadHelper.getThreadIdFromUri;
+import static com.android.providers.telephony.RcsProviderUtil.INSERTION_FAILED;
 
 import android.content.ContentValues;
+import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteQueryBuilder;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.net.Uri;
+import android.os.Bundle;
+import android.telephony.ims.RcsParticipantQueryParameters;
+import android.telephony.ims.RcsQueryContinuationToken;
+import android.text.TextUtils;
+import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 
@@ -29,57 +54,361 @@
  *
  * @hide
  */
-public class RcsProviderParticipantHelper {
-    static final String ID_COLUMN = "_id";
-    static final String PARTICIPANT_TABLE = "rcs_participant";
-    static final String CANONICAL_ADDRESS_ID_COLUMN = "canonical_address_id";
-    static final String RCS_ALIAS_COLUMN = "rcs_alias";
-
-    static final String PARTICIPANT_THREAD_JUNCTION_TABLE = "rcs_thread_participant";
-    static final String RCS_PARTICIPANT_ID_COLUMN = "rcs_participant_id";
+class RcsProviderParticipantHelper {
+    private static final int PARTICIPANT_ID_INDEX_IN_URI = 1;
+    private static final int PARTICIPANT_ID_INDEX_IN_THREAD_URI = 3;
 
     @VisibleForTesting
     public static void createParticipantTables(SQLiteDatabase db) {
-        db.execSQL("CREATE TABLE " + PARTICIPANT_TABLE + " (" +
-                ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
+        Log.d(TAG, "Creating participant tables");
+
+        // create participant tables
+        db.execSQL("CREATE TABLE " + RCS_PARTICIPANT_TABLE + " (" +
+                RCS_PARTICIPANT_ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                 CANONICAL_ADDRESS_ID_COLUMN + " INTEGER ," +
                 RCS_ALIAS_COLUMN + " TEXT, " +
                 "FOREIGN KEY(" + CANONICAL_ADDRESS_ID_COLUMN + ") "
-                + "REFERENCES canonical_addresses(address)" +
+                + "REFERENCES canonical_addresses(_id)" +
                 ");");
 
-        db.execSQL("CREATE TABLE " + PARTICIPANT_THREAD_JUNCTION_TABLE + " (" +
+        db.execSQL("CREATE TABLE " + RCS_PARTICIPANT_THREAD_JUNCTION_TABLE + " (" +
                 RCS_THREAD_ID_COLUMN + " INTEGER, " +
                 RCS_PARTICIPANT_ID_COLUMN + " INTEGER, " +
                 "CONSTRAINT thread_participant PRIMARY KEY("
                 + RCS_THREAD_ID_COLUMN + ", " + RCS_PARTICIPANT_ID_COLUMN + "), " +
                 "FOREIGN KEY(" + RCS_THREAD_ID_COLUMN
-                + ") REFERENCES " + THREAD_TABLE + "(" + ID_COLUMN + "), " +
+                + ") REFERENCES " + RCS_THREAD_TABLE + "(" + RCS_THREAD_ID_COLUMN + "), " +
                 "FOREIGN KEY(" + RCS_PARTICIPANT_ID_COLUMN
-                + ") REFERENCES " + PARTICIPANT_TABLE + "(" + ID_COLUMN + "))");
+                + ") REFERENCES " + RCS_PARTICIPANT_TABLE + "(" + RCS_PARTICIPANT_ID_COLUMN + "))");
+
+        // create views
+
+        // The following view joins rcs_participant table with canonical_addresses table to add the
+        // actual address of a participant in the result.
+        db.execSQL("CREATE VIEW " + RCS_PARTICIPANT_WITH_ADDRESS_VIEW + " AS SELECT "
+                + "rcs_participant.rcs_participant_id, rcs_participant.canonical_address_id, "
+                + "rcs_participant.rcs_alias, canonical_addresses.address FROM rcs_participant "
+                + "LEFT JOIN canonical_addresses ON "
+                + "rcs_participant.canonical_address_id=canonical_addresses._id");
+
+        // The following view is the rcs_participant_with_address_view above, plus the information
+        // on which threads this participant contributes to, to enable getting participants of a
+        // thread
+        db.execSQL("CREATE VIEW " + RCS_PARTICIPANT_WITH_THREAD_VIEW + " AS SELECT "
+                + "rcs_participant.rcs_participant_id, rcs_participant.canonical_address_id, "
+                + "rcs_participant.rcs_alias, canonical_addresses.address, rcs_thread_participant"
+                + ".rcs_thread_id FROM rcs_participant LEFT JOIN canonical_addresses ON "
+                + "rcs_participant.canonical_address_id=canonical_addresses._id LEFT JOIN "
+                + "rcs_thread_participant ON rcs_participant.rcs_participant_id="
+                + "rcs_thread_participant.rcs_participant_id");
+
+        // TODO - create indexes for faster querying
     }
 
-    static void buildParticipantsQuery(SQLiteQueryBuilder qb) {
-        qb.setTables(PARTICIPANT_TABLE);
+    private final SQLiteOpenHelper mSqLiteOpenHelper;
+
+    RcsProviderParticipantHelper(SQLiteOpenHelper sqLiteOpenHelper) {
+        mSqLiteOpenHelper = sqLiteOpenHelper;
     }
 
-    static long insert(SQLiteDatabase db, ContentValues values) {
-        long rowId = db.insert(PARTICIPANT_TABLE, ID_COLUMN, values);
-        db.setTransactionSuccessful();
-        return rowId;
+    Cursor queryParticipant(Bundle bundle) {
+        RcsParticipantQueryParameters queryParameters = null;
+        RcsQueryContinuationToken continuationToken = null;
+
+        if (bundle != null) {
+            queryParameters = bundle.getParcelable(PARTICIPANT_QUERY_PARAMETERS_KEY);
+            continuationToken = bundle.getParcelable(QUERY_CONTINUATION_TOKEN);
+        }
+
+        if (continuationToken != null) {
+            return RcsProviderUtil.performContinuationQuery(mSqLiteOpenHelper.getReadableDatabase(),
+                    continuationToken);
+        }
+
+        if (queryParameters == null) {
+            queryParameters = new RcsParticipantQueryParameters.Builder().build();
+        }
+
+        return performInitialQuery(queryParameters);
     }
 
-    static int delete(SQLiteDatabase db, String selection,
-            String[] selectionArgs) {
-        int deletedRows = db.delete(PARTICIPANT_TABLE, selection, selectionArgs);
-        db.setTransactionSuccessful();
-        return deletedRows;
+    private Cursor performInitialQuery(RcsParticipantQueryParameters queryParameters) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+
+        StringBuilder rawQuery = buildInitialRawQuery(queryParameters);
+        RcsProviderUtil.appendLimit(rawQuery, queryParameters.getLimit());
+        String rawQueryAsString = rawQuery.toString();
+        Cursor cursor = db.rawQuery(rawQueryAsString, null);
+
+        // If the query was paginated, build the next query
+        int limit = queryParameters.getLimit();
+        if (limit > 0) {
+            RcsProviderUtil.createContinuationTokenBundle(cursor,
+                    new RcsQueryContinuationToken(PARTICIPANT_QUERY_CONTINUATION_TOKEN_TYPE,
+                            rawQueryAsString, limit, limit), QUERY_CONTINUATION_TOKEN);
+        }
+
+        return cursor;
     }
 
-    static int update(SQLiteDatabase db, ContentValues values,
-            String selection, String[] selectionArgs) {
-        int updatedRows = db.update(PARTICIPANT_TABLE, values, selection, selectionArgs);
-        db.setTransactionSuccessful();
-        return updatedRows;
+    private StringBuilder buildInitialRawQuery(RcsParticipantQueryParameters queryParameters) {
+        StringBuilder rawQuery = new StringBuilder("SELECT * FROM ");
+
+        boolean isThreadFiltered = queryParameters.getThreadId() > 0;
+
+        if (isThreadFiltered) {
+            rawQuery.append(RCS_PARTICIPANT_WITH_THREAD_VIEW);
+        } else {
+            rawQuery.append(RCS_PARTICIPANT_WITH_ADDRESS_VIEW);
+        }
+
+        boolean isAliasFiltered = !TextUtils.isEmpty(queryParameters.getAliasLike());
+        boolean isCanonicalAddressFiltered = !TextUtils.isEmpty(
+                queryParameters.getCanonicalAddressLike());
+
+        if (isAliasFiltered || isCanonicalAddressFiltered || isThreadFiltered) {
+            rawQuery.append(" WHERE ");
+        }
+
+        if (isAliasFiltered) {
+            rawQuery.append(RCS_ALIAS_COLUMN).append(" LIKE \"").append(
+                    queryParameters.getAliasLike()).append("\"");
+        }
+
+        if (isCanonicalAddressFiltered) {
+            if (isAliasFiltered) {
+                rawQuery.append(" AND ");
+            }
+            rawQuery.append(ADDRESS).append(" LIKE \"").append(
+                    queryParameters.getCanonicalAddressLike()).append("\"");
+        }
+
+        if (isThreadFiltered) {
+            if (isAliasFiltered || isCanonicalAddressFiltered) {
+                rawQuery.append(" AND ");
+            }
+            rawQuery.append(RCS_THREAD_ID_COLUMN).append("=").append(queryParameters.getThreadId());
+        }
+
+        rawQuery.append(" ORDER BY ");
+
+        int sortingProperty = queryParameters.getSortingProperty();
+        if (sortingProperty == RcsParticipantQueryParameters.SORT_BY_ALIAS) {
+            rawQuery.append(RCS_ALIAS_COLUMN);
+        } else if (sortingProperty == RcsParticipantQueryParameters.SORT_BY_CANONICAL_ADDRESS) {
+            rawQuery.append(ADDRESS);
+        } else {
+            rawQuery.append(RCS_PARTICIPANT_ID_COLUMN);
+        }
+        rawQuery.append(queryParameters.getSortDirection() ? " ASC " : " DESC ");
+
+        return rawQuery;
+    }
+
+    Cursor queryParticipantWithId(Uri uri, String[] projection) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+        return db.query(RCS_PARTICIPANT_WITH_ADDRESS_VIEW, projection,
+                getParticipantIdSelection(uri), null, null, null, null);
+    }
+
+    Cursor queryParticipantIn1To1Thread(Uri uri) {
+        String threadId = getThreadIdFromUri(uri);
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+
+        return db.rawQuery(
+                "  SELECT * "
+                        + "FROM rcs_participant "
+                        + "WHERE rcs_participant.rcs_participant_id = ("
+                        + "  SELECT rcs_thread_participant.rcs_participant_id "
+                        + "  FROM rcs_thread_participant "
+                        + "  WHERE rcs_thread_participant.rcs_thread_id=" + threadId + ")", null);
+    }
+
+    Cursor queryParticipantsInGroupThread(Uri uri) {
+        String threadId = getThreadIdFromUri(uri);
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+
+        return db.rawQuery("  SELECT * "
+                + "FROM rcs_participant "
+                + "WHERE rcs_participant.rcs_participant_id = ("
+                + "  SELECT rcs_participant_id "
+                + "  FROM rcs_thread_participant "
+                + "  WHERE rcs_thread_id= " + threadId + ")", null);
+    }
+
+    Cursor queryParticipantInGroupThreadWithId(Uri uri) {
+        String threadId = getThreadIdFromUri(uri);
+        String participantId = getParticipantIdFromUri(uri);
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+
+        return db.rawQuery("  SELECT * "
+                        + "FROM rcs_participant "
+                        + "WHERE rcs_participant.rcs_participant_id = ("
+                        + "  SELECT rcs_participant_id "
+                        + "  FROM rcs_thread_participant "
+                        + "  WHERE rcs_thread_id=? AND rcs_participant_id=?)",
+                new String[]{threadId, participantId});
+    }
+
+    long insertParticipant(ContentValues contentValues) {
+        if (!contentValues.containsKey(CANONICAL_ADDRESS_ID_COLUMN) || TextUtils.isEmpty(
+                contentValues.getAsString(CANONICAL_ADDRESS_ID_COLUMN))) {
+            Log.e(TAG,
+                    "RcsProviderParticipantHelper: Inserting participants without canonical "
+                            + "address is not supported");
+            return TRANSACTION_FAILED;
+        }
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.insert(RCS_PARTICIPANT_TABLE, RCS_PARTICIPANT_ID_COLUMN, contentValues);
+    }
+
+    long insertParticipantIntoP2pThread(Uri uri) {
+        String threadId = getThreadIdFromUri(uri);
+        String participantId = getParticipantIdFromUri(uri);
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+
+        Cursor cursor = db.query(RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, null,
+                RCS_THREAD_ID_COLUMN + "=? AND " + RCS_PARTICIPANT_ID_COLUMN + "=?",
+                new String[]{threadId, participantId}, null, null, null);
+
+        int existingEntryCount = 0;
+        if (cursor != null) {
+            existingEntryCount = cursor.getCount();
+            cursor.close();
+        }
+
+        // if this 1 to 1 thread already has a participant, fail the transaction.
+        if (existingEntryCount > 0) {
+            return TRANSACTION_FAILED;
+        }
+
+        ContentValues contentValues = new ContentValues(2);
+        contentValues.put(RCS_THREAD_ID_COLUMN, threadId);
+        contentValues.put(RCS_PARTICIPANT_ID_COLUMN, participantId);
+        long rowId = db.insert(RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, RCS_PARTICIPANT_ID_COLUMN,
+                contentValues);
+
+        if (rowId == INSERTION_FAILED) {
+            return TRANSACTION_FAILED;
+        }
+        return Long.parseLong(participantId);
+    }
+
+    /**
+     * Inserts a participant into group thread. This function returns the participant ID instead of
+     * the row id in the junction table
+     */
+    long insertParticipantIntoGroupThread(ContentValues values) {
+        if (!values.containsKey(RCS_THREAD_ID_COLUMN) || !values.containsKey(
+                RCS_PARTICIPANT_ID_COLUMN)) {
+            Log.e(TAG, "RcsProviderParticipantHelper: Cannot insert participant into group.");
+            return TRANSACTION_FAILED;
+        }
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        long insertedRowId = db.insert(RCS_PARTICIPANT_THREAD_JUNCTION_TABLE,
+                RCS_PARTICIPANT_ID_COLUMN,
+                values);
+
+        if (insertedRowId == INSERTION_FAILED) {
+            return TRANSACTION_FAILED;
+        }
+
+        return values.getAsLong(RCS_PARTICIPANT_ID_COLUMN);
+    }
+
+    /**
+     * Inserts a participant into group thread. This function returns the participant ID instead of
+     * the row id in the junction table
+     */
+    long insertParticipantIntoGroupThreadWithId(Uri uri) {
+        String threadId = getThreadIdFromUri(uri);
+        String participantId = getParticipantIdFromUri(uri);
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+
+        ContentValues contentValues = new ContentValues(2);
+        contentValues.put(RCS_THREAD_ID_COLUMN, threadId);
+        contentValues.put(RCS_PARTICIPANT_ID_COLUMN, participantId);
+
+        long insertedRowId = db.insert(
+                RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, RCS_PARTICIPANT_ID_COLUMN, contentValues);
+
+        if (insertedRowId == INSERTION_FAILED) {
+            return TRANSACTION_FAILED;
+        }
+
+        return Long.parseLong(participantId);
+    }
+
+    int deleteParticipantWithId(Uri uri) {
+        String participantId = uri.getPathSegments().get(PARTICIPANT_ID_INDEX_IN_URI);
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+
+        // See if this participant is involved in any threads
+        Cursor cursor = db.query(RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, null,
+                RCS_PARTICIPANT_ID_COLUMN + "=?", new String[]{participantId}, null, null, null);
+
+        int participatingThreadCount = 0;
+        if (cursor != null) {
+            participatingThreadCount = cursor.getCount();
+            cursor.close();
+        }
+
+        if (participatingThreadCount > 0) {
+            Log.e(TAG,
+                    "RcsProviderParticipantHelper: Can't delete participant while it is still in "
+                            + "RCS threads, uri:"
+                            + uri);
+            return 0;
+        }
+
+        return db.delete(RCS_PARTICIPANT_TABLE, RCS_PARTICIPANT_ID_COLUMN + "=?",
+                new String[]{participantId});
+    }
+
+    int deleteParticipantFromGroupThread(Uri uri) {
+        String threadId = getThreadIdFromUri(uri);
+        String participantId = getParticipantIdFromUri(uri);
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        // TODO check to remove owner
+        return db.delete(RCS_PARTICIPANT_THREAD_JUNCTION_TABLE,
+                RCS_THREAD_ID_COLUMN + "=? AND " + RCS_PARTICIPANT_ID_COLUMN + "=?",
+                new String[]{threadId, participantId});
+    }
+
+    int updateParticipant(ContentValues contentValues, String selection, String[] selectionArgs) {
+        if (contentValues.containsKey(RCS_PARTICIPANT_ID_COLUMN)) {
+            Log.e(TAG, "RcsProviderParticipantHelper: Updating participant id is not supported");
+            return 0;
+        }
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.update(RCS_PARTICIPANT_TABLE, contentValues, selection, selectionArgs);
+    }
+
+    int updateParticipantWithId(ContentValues contentValues, Uri uri) {
+        return updateParticipant(contentValues, getParticipantIdSelection(uri), null);
+    }
+
+    private String getParticipantIdSelection(Uri uri) {
+        return RCS_PARTICIPANT_ID_COLUMN + "=" + uri.getPathSegments().get(
+                PARTICIPANT_ID_INDEX_IN_URI);
+    }
+
+    Uri getParticipantInThreadUri(ContentValues values, long rowId) {
+        if (values == null) {
+            return null;
+        }
+        Integer threadId = values.getAsInteger(RCS_THREAD_ID_COLUMN);
+        if (threadId == null) {
+            return null;
+        }
+
+        return GROUP_THREAD_URI_PREFIX.buildUpon().appendPath(
+                Integer.toString(threadId)).appendPath(RCS_PARTICIPANT_URI_PART).appendPath(
+                Long.toString(rowId)).build();
+    }
+
+    private String getParticipantIdFromUri(Uri uri) {
+        return uri.getPathSegments().get(PARTICIPANT_ID_INDEX_IN_THREAD_URI);
     }
 }
diff --git a/src/com/android/providers/telephony/RcsProviderThreadHelper.java b/src/com/android/providers/telephony/RcsProviderThreadHelper.java
index e643136..9b9947b 100644
--- a/src/com/android/providers/telephony/RcsProviderThreadHelper.java
+++ b/src/com/android/providers/telephony/RcsProviderThreadHelper.java
@@ -15,9 +15,40 @@
  */
 package com.android.providers.telephony;
 
+import static android.provider.Telephony.RcsColumns.Rcs1To1ThreadColumns.FALLBACK_THREAD_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.CONFERENCE_URI_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_ICON_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_NAME_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.OWNER_PARTICIPANT_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.MESSAGE_TEXT_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.ORIGINATION_TIMESTAMP_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.STATUS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadColumns.RCS_THREAD_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsUnifiedThreadColumns.THREAD_TYPE_COLUMN;
+import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
+import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
+import static android.telephony.ims.RcsQueryContinuationToken.THREAD_QUERY_CONTINUATION_TOKEN_TYPE;
+import static android.telephony.ims.RcsThreadQueryParameters.THREAD_QUERY_PARAMETERS_KEY;
+
+import static com.android.providers.telephony.RcsProvider.RCS_1_TO_1_THREAD_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_GROUP_THREAD_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_MESSAGE_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_PARTICIPANT_THREAD_JUNCTION_TABLE;
+import static com.android.providers.telephony.RcsProvider.RCS_THREAD_TABLE;
+import static com.android.providers.telephony.RcsProvider.TAG;
+import static com.android.providers.telephony.RcsProvider.UNIFIED_RCS_THREAD_VIEW;
+import static com.android.providers.telephony.RcsProviderUtil.INSERTION_FAILED;
+
 import android.content.ContentValues;
+import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteQueryBuilder;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.BaseColumns;
+import android.telephony.ims.RcsQueryContinuationToken;
+import android.telephony.ims.RcsThreadQueryParameters;
+import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 
@@ -27,64 +58,383 @@
  * @hide
  */
 class RcsProviderThreadHelper {
-    static final String ID_COLUMN = "_id";
-    static final String THREAD_TABLE = "rcs_thread";
-    static final String OWNER_PARTICIPANT = "owner_participant";
-
-    static final String RCS_1_TO_1_THREAD_TABLE = "rcs_1_to_1_thread";
-    static final String RCS_THREAD_ID_COLUMN = "rcs_thread_id";
-    static final String FALLBACK_THREAD_ID_COLUMN = "rcs_fallback_thread_id";
-
-    static final String RCS_GROUP_THREAD_TABLE = "rcs_group_thread";
-    static final String GROUP_NAME_COLUMN = "group_name";
-    static final String ICON_COLUMN = "icon";
-    static final String CONFERENCE_URI_COLUMN = "conference_uri";
+    private static final int THREAD_ID_INDEX_IN_URI = 1;
 
     @VisibleForTesting
     public static void createThreadTables(SQLiteDatabase db) {
-        db.execSQL("CREATE TABLE " + THREAD_TABLE + " (" +
-                ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
-                OWNER_PARTICIPANT + " INTEGER " +
-                ");");
+        Log.d(TAG, "Creating thread tables");
+
+        // Add the thread tables
+        db.execSQL("CREATE TABLE " + RCS_THREAD_TABLE + " (" +
+                RCS_THREAD_ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT);");
 
         db.execSQL("CREATE TABLE " + RCS_1_TO_1_THREAD_TABLE + " (" +
                 RCS_THREAD_ID_COLUMN + " INTEGER PRIMARY KEY, " +
                 FALLBACK_THREAD_ID_COLUMN + " INTEGER, " +
                 "FOREIGN KEY(" + RCS_THREAD_ID_COLUMN
-                    + ") REFERENCES " + THREAD_TABLE + "(" + ID_COLUMN + ")," +
+                + ") REFERENCES " + RCS_THREAD_TABLE + "(" + RCS_THREAD_ID_COLUMN + ")," +
                 "FOREIGN KEY(" + FALLBACK_THREAD_ID_COLUMN
-                    + ") REFERENCES threads( " + ID_COLUMN + "))" );
+                + ") REFERENCES threads( " + BaseColumns._ID + "))");
 
         db.execSQL("CREATE TABLE " + RCS_GROUP_THREAD_TABLE + " (" +
                 RCS_THREAD_ID_COLUMN + " INTEGER PRIMARY KEY, " +
+                OWNER_PARTICIPANT_COLUMN + " INTEGER, " +
                 GROUP_NAME_COLUMN + " TEXT, " +
-                ICON_COLUMN + " TEXT, " +
+                GROUP_ICON_COLUMN + " TEXT, " +
                 CONFERENCE_URI_COLUMN + " TEXT, " +
                 "FOREIGN KEY(" + RCS_THREAD_ID_COLUMN
-                    + ") REFERENCES " + THREAD_TABLE + "(" + ID_COLUMN + "))" );
+                + ") REFERENCES " + RCS_THREAD_TABLE + "(" + RCS_THREAD_ID_COLUMN + "))");
 
+        // Add the views
+
+        // The following is a unified thread view. Since SQLite does not support right or full
+        // joins, we are using a union with null values for unused variables for each thread type.
+        // The thread_type column is an easy way to figure out whether the entry came from a 1 to 1
+        // thread or a group thread. The last message in each thread is appended to the table
+        // entries to figure out the latest threads and snippet text. We use COALESCE so that MAX()
+        // can take null values into account in order to have threads with no messages still
+        // represented here
+        //
+        // SELECT <1 to 1 thread and first message>
+        // FROM (
+        //     SELECT *
+        //     FROM rcs_1_to_1_thread LEFT JOIN rcs_message
+        //         ON rcs_1_to_1_thread.rcs_thread_id=rcs_message.rcs_thread_id)
+        // GROUP BY rcs_thread_id
+        // HAVING MAX(COALESCE(origination_timestamp,1))
+        //
+        // UNION
+        // SELECT <group thread and first message>
+        // FROM (
+        //     SELECT *
+        //     FROM rcs_group_thread LEFT JOIN rcs_message
+        //         ON rcs_group_thread.rcs_thread_id=rcs_message.rcs_thread_id)
+        // GROUP BY rcs_thread_id
+        // HAVING MAX(COALESCE(origination_timestamp,1))
+
+        db.execSQL("CREATE VIEW " + UNIFIED_RCS_THREAD_VIEW + " AS "
+                + "SELECT "
+                + RCS_THREAD_ID_COLUMN + ", "
+                + FALLBACK_THREAD_ID_COLUMN + ", "
+                + "null AS " + OWNER_PARTICIPANT_COLUMN + ", "
+                + "null AS " + GROUP_NAME_COLUMN + ", "
+                + "null AS " + GROUP_ICON_COLUMN + ", "
+                + "null AS " + CONFERENCE_URI_COLUMN + ", "
+                + "0 AS " + THREAD_TYPE_COLUMN + ", "
+                + ORIGINATION_TIMESTAMP_COLUMN + ", "
+                + MESSAGE_TEXT_COLUMN + ", "
+                + STATUS_COLUMN
+                + " FROM (SELECT * FROM "
+                + RCS_1_TO_1_THREAD_TABLE + " LEFT JOIN " + RCS_MESSAGE_TABLE
+                + " ON "
+                + RCS_1_TO_1_THREAD_TABLE + "." + RCS_THREAD_ID_COLUMN + "="
+                + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ")"
+                + " GROUP BY " + RCS_THREAD_ID_COLUMN
+                + " HAVING MAX(COALESCE("
+                + ORIGINATION_TIMESTAMP_COLUMN + ", 1))"
+                + " UNION SELECT "
+                + RCS_THREAD_ID_COLUMN + ", "
+                + "null AS " + FALLBACK_THREAD_ID_COLUMN + ", "
+                + OWNER_PARTICIPANT_COLUMN + ", "
+                + GROUP_NAME_COLUMN + ", "
+                + GROUP_ICON_COLUMN + ", "
+                + CONFERENCE_URI_COLUMN + ", "
+                + "1 AS " + THREAD_TYPE_COLUMN + ", "
+                + ORIGINATION_TIMESTAMP_COLUMN + ", "
+                + MESSAGE_TEXT_COLUMN + ", "
+                + STATUS_COLUMN
+                + " FROM (SELECT * FROM "
+                + RCS_GROUP_THREAD_TABLE + " LEFT JOIN " + RCS_MESSAGE_TABLE
+                + " ON "
+                + RCS_GROUP_THREAD_TABLE + "." + RCS_THREAD_ID_COLUMN + "="
+                + RCS_MESSAGE_TABLE + "." + RCS_THREAD_ID_COLUMN + ")"
+                + " GROUP BY " + RCS_THREAD_ID_COLUMN
+                + " HAVING MAX(COALESCE("
+                + ORIGINATION_TIMESTAMP_COLUMN + ", 1))");
+
+        // Add the triggers
+
+        // Delete the corresponding rcs_thread row upon deleting a row in rcs_1_to_1_thread
+        //
+        // CREATE TRIGGER deleteRcsThreadAfter1to1
+        //  AFTER DELETE ON rcs_1_to_1_thread
+        // BEGIN
+        //	DELETE FROM rcs_thread WHERE rcs_thread._id=OLD.rcs_thread_id;
+        // END
+        db.execSQL("CREATE TRIGGER deleteRcsThreadAfter1to1 AFTER DELETE ON "
+                + RCS_1_TO_1_THREAD_TABLE + " BEGIN DELETE FROM " + RCS_THREAD_TABLE + " WHERE "
+                + RCS_THREAD_TABLE + "." + RCS_THREAD_ID_COLUMN + "=OLD." + RCS_THREAD_ID_COLUMN
+                + "; END");
+
+        // Delete the corresponding rcs_thread row upon deleting a row in rcs_group_thread
+        //
+        // CREATE TRIGGER deleteRcsThreadAfter1to1
+        //  AFTER DELETE ON rcs_1_to_1_thread
+        // BEGIN
+        //	DELETE FROM rcs_thread WHERE rcs_thread._id=OLD.rcs_thread_id;
+        // END
+        db.execSQL("CREATE TRIGGER deleteRcsThreadAfterGroup AFTER DELETE ON "
+                + RCS_GROUP_THREAD_TABLE + " BEGIN DELETE FROM " + RCS_THREAD_TABLE + " WHERE "
+                + RCS_THREAD_TABLE + "." + RCS_THREAD_ID_COLUMN + "=OLD." + RCS_THREAD_ID_COLUMN
+                + "; END");
+
+        // Delete the junction table entries upon deleting a 1 to 1 thread
+        //
+        // CREATE TRIGGER delete1To1JunctionEntries
+        // AFTER
+        //  DELETE ON rcs_1_to_1_thread
+        // BEGIN
+        //  DELETE FROM
+        //   rcs_thread_participant
+        //  WHERE
+        //   rcs_thread_participant.rcs_thread_id = OLD.rcs_thread_id;
+        // END
+        db.execSQL("CREATE TRIGGER delete1To1JunctionEntries AFTER DELETE ON "
+                + RCS_1_TO_1_THREAD_TABLE + " BEGIN DELETE FROM "
+                + RCS_PARTICIPANT_THREAD_JUNCTION_TABLE + " WHERE "
+                + RCS_PARTICIPANT_THREAD_JUNCTION_TABLE + "." + RCS_THREAD_ID_COLUMN + "=OLD."
+                + RCS_THREAD_ID_COLUMN + "; END");
+
+        // Delete the junction table entries upon deleting a group thread
+        //
+        // CREATE TRIGGER delete1To1JunctionEntries
+        // AFTER
+        //  DELETE ON rcs_1_to_1_thread
+        // BEGIN
+        //  DELETE FROM
+        //   rcs_thread_participant
+        //  WHERE
+        //   rcs_thread_participant.rcs_thread_id = OLD.rcs_thread_id;
+        // END
+        db.execSQL("CREATE TRIGGER deleteGroupJunctionEntries AFTER DELETE ON "
+                + RCS_GROUP_THREAD_TABLE + " BEGIN DELETE FROM "
+                + RCS_PARTICIPANT_THREAD_JUNCTION_TABLE + " WHERE "
+                + RCS_PARTICIPANT_THREAD_JUNCTION_TABLE + "." + RCS_THREAD_ID_COLUMN + "=OLD."
+                +RCS_THREAD_ID_COLUMN + "; END");
+
+        // TODO - delete all messages in a thread after deleting a thread
+
+        // TODO - create indexes for faster querying
     }
 
-    static void buildThreadQuery(SQLiteQueryBuilder qb) {
-        qb.setTables(THREAD_TABLE);
+    private final SQLiteOpenHelper mSqLiteOpenHelper;
+
+    RcsProviderThreadHelper(SQLiteOpenHelper sqLiteOpenHelper) {
+        mSqLiteOpenHelper = sqLiteOpenHelper;
     }
 
-    static long insert(SQLiteDatabase db, ContentValues values) {
-        long rowId = db.insert(THREAD_TABLE, OWNER_PARTICIPANT, values);
-        db.setTransactionSuccessful();
-        return rowId;
+    Cursor queryUnifiedThread(Bundle bundle) {
+        RcsThreadQueryParameters queryParameters = null;
+        RcsQueryContinuationToken continuationToken = null;
+        if (bundle != null) {
+            queryParameters = bundle.getParcelable(
+                    THREAD_QUERY_PARAMETERS_KEY);
+            continuationToken = bundle.getParcelable(QUERY_CONTINUATION_TOKEN);
+        }
+
+        if (continuationToken != null) {
+            return RcsProviderUtil.performContinuationQuery(mSqLiteOpenHelper.getReadableDatabase(),
+                    continuationToken);
+        }
+
+        if (queryParameters == null) {
+            queryParameters = new RcsThreadQueryParameters.Builder().build();
+        }
+
+        return performInitialQuery(queryParameters);
     }
 
-    static int delete(SQLiteDatabase db, String selection, String[] selectionArgs) {
-        int deletedRowCount = db.delete(THREAD_TABLE, selection, selectionArgs);
-        db.setTransactionSuccessful();
-        return deletedRowCount;
+    private Cursor performInitialQuery(RcsThreadQueryParameters queryParameters) {
+        if (queryParameters == null) {
+            // return everything for test purposes
+            queryParameters = new RcsThreadQueryParameters.Builder().build();
+        }
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+        StringBuilder rawQuery = new StringBuilder("SELECT * FROM ").append(
+                UNIFIED_RCS_THREAD_VIEW);
+
+        if (queryParameters.getThreadType() == RcsThreadQueryParameters.THREAD_TYPE_1_TO_1) {
+            rawQuery.append(" WHERE ").append(THREAD_TYPE_COLUMN).append("=0");
+        } else if (queryParameters.getThreadType() == RcsThreadQueryParameters.THREAD_TYPE_GROUP) {
+            rawQuery.append(" WHERE ").append(THREAD_TYPE_COLUMN).append("=1");
+        }
+
+        rawQuery.append(" ORDER BY ");
+
+        if (queryParameters.getSortingProperty() == RcsThreadQueryParameters.SORT_BY_TIMESTAMP) {
+            rawQuery.append(ORIGINATION_TIMESTAMP_COLUMN);
+        } else {
+            rawQuery.append(RCS_THREAD_ID_COLUMN);
+        }
+
+        rawQuery.append(queryParameters.getSortDirection() ? " ASC " : " DESC ");
+        RcsProviderUtil.appendLimit(rawQuery, queryParameters.getLimit());
+
+        String rawQueryAsString = rawQuery.toString();
+        Cursor cursor = db.rawQuery(rawQueryAsString, null);
+
+        // If this is a paginated query, build the next query and return as a Cursor extra. Only do
+        // this if the current query returned a result.
+        int limit = queryParameters.getLimit();
+        if (limit > 0) {
+            RcsProviderUtil.createContinuationTokenBundle(cursor,
+                    new RcsQueryContinuationToken(THREAD_QUERY_CONTINUATION_TOKEN_TYPE,
+                            rawQueryAsString, limit, limit), QUERY_CONTINUATION_TOKEN);
+        }
+
+        return cursor;
     }
 
-    static int update(SQLiteDatabase db, ContentValues values, String selection,
-            String[] selectionArgs) {
-        int updatedRowCount = db.update(THREAD_TABLE, values, selection, selectionArgs);
-        db.setTransactionSuccessful();
-        return updatedRowCount;
+    Cursor queryUnifiedThreadUsingId(Uri uri, String[] projection) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+        String threadId = getThreadIdFromUri(uri);
+
+        return db.query(UNIFIED_RCS_THREAD_VIEW, projection, RCS_THREAD_ID_COLUMN + "=?",
+                new String[]{threadId},
+                null, null, null);
+    }
+
+    Cursor query1to1Thread(String[] projection, String selection, String[] selectionArgs,
+            String sortOrder) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+        return db.query(RCS_1_TO_1_THREAD_TABLE, projection, selection, selectionArgs, null,
+                null, sortOrder);
+    }
+
+    Cursor query1To1ThreadUsingId(Uri uri, String[] projection) {
+        return query1to1Thread(projection, getThreadIdSelection(uri), null, null);
+    }
+
+    Cursor queryGroupThread(String[] projection, String selection, String[] selectionArgs,
+            String sortOrder) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getReadableDatabase();
+        return db.query(RCS_GROUP_THREAD_TABLE, projection, selection, selectionArgs, null,
+                null, sortOrder);
+    }
+
+    Cursor queryGroupThreadUsingId(Uri uri, String[] projection) {
+        return queryGroupThread(projection, getThreadIdSelection(uri), null, null);
+    }
+
+    long insert1To1Thread(ContentValues contentValues) {
+        long returnValue = TRANSACTION_FAILED;
+        if (contentValues.containsKey(RCS_THREAD_ID_COLUMN)) {
+            Log.e(RcsProvider.TAG,
+                    "RcsProviderThreadHelper: inserting threads with IDs is not supported");
+            return returnValue;
+        }
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        try {
+            db.beginTransaction();
+
+            // Insert into the common rcs_threads table
+            long rowId = insertIntoCommonRcsThreads(db);
+
+            // Add the rowId in rcs_threads table as a foreign key in rcs_1_to_1_table
+            contentValues.put(RCS_THREAD_ID_COLUMN, rowId);
+            db.insert(RCS_1_TO_1_THREAD_TABLE, RCS_THREAD_ID_COLUMN, contentValues);
+            contentValues.remove(RCS_THREAD_ID_COLUMN);
+
+            db.setTransactionSuccessful();
+            returnValue = rowId;
+        } finally {
+            db.endTransaction();
+        }
+        return returnValue;
+    }
+
+    long insertGroupThread(ContentValues contentValues) {
+        long returnValue = TRANSACTION_FAILED;
+        if (contentValues.containsKey(RCS_THREAD_ID_COLUMN)) {
+            Log.e(RcsProvider.TAG,
+                    "RcsProviderThreadHelper: inserting threads with IDs is not supported");
+            return returnValue;
+        }
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        try {
+            db.beginTransaction();
+
+            // Insert into the common rcs_threads table
+            long rowId = insertIntoCommonRcsThreads(db);
+            if (rowId == INSERTION_FAILED) {
+                return returnValue;
+            }
+
+            // Add the rowId in rcs_threads table as a foreign key in rcs_group_table
+            contentValues.put(RCS_THREAD_ID_COLUMN, rowId);
+            db.insert(RCS_GROUP_THREAD_TABLE, RCS_THREAD_ID_COLUMN, contentValues);
+            contentValues.remove(RCS_THREAD_ID_COLUMN);
+
+            db.setTransactionSuccessful();
+            returnValue = rowId;
+        } finally {
+            db.endTransaction();
+        }
+        return returnValue;
+    }
+
+    private long insertIntoCommonRcsThreads(SQLiteDatabase db) {
+        return db.insert(RCS_THREAD_TABLE, RCS_THREAD_ID_COLUMN, new ContentValues());
+    }
+
+    int delete1To1Thread(String selection, String[] selectionArgs) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.delete(RCS_1_TO_1_THREAD_TABLE, selection, selectionArgs);
+    }
+
+    int delete1To1ThreadWithId(Uri uri) {
+        return delete1To1Thread(getThreadIdSelection(uri), null);
+    }
+
+    int deleteGroupThread(String selection, String[] selectionArgs) {
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.delete(RCS_GROUP_THREAD_TABLE, selection, selectionArgs);
+    }
+
+    int deleteGroupThreadWithId(Uri uri) {
+        return deleteGroupThread(getThreadIdSelection(uri), null);
+    }
+
+    int update1To1Thread(ContentValues values, String selection, String[] selectionArgs) {
+        if (values.containsKey(RCS_THREAD_ID_COLUMN)) {
+            Log.e(TAG,
+                    "RcsProviderThreadHelper: updating thread id for 1 to 1 threads is not "
+                            + "allowed");
+            return 0;
+        }
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.update(RCS_1_TO_1_THREAD_TABLE, values, selection, selectionArgs);
+    }
+
+    int update1To1ThreadWithId(ContentValues values, Uri uri) {
+        return update1To1Thread(values, getThreadIdSelection(uri), null);
+    }
+
+    int updateGroupThread(ContentValues values, String selection, String[] selectionArgs) {
+        if (values.containsKey(RCS_THREAD_ID_COLUMN)) {
+            Log.e(TAG,
+                    "RcsProviderThreadHelper: updating thread id for group threads is not "
+                            + "allowed");
+            return 0;
+        }
+
+        SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
+        return db.update(RCS_GROUP_THREAD_TABLE, values, selection, selectionArgs);
+    }
+
+    int updateGroupThreadWithId(ContentValues values, Uri uri) {
+        return updateGroupThread(values, getThreadIdSelection(uri), null);
+    }
+
+    private String getThreadIdSelection(Uri uri) {
+        return RCS_THREAD_ID_COLUMN + "=" + getThreadIdFromUri(uri);
+    }
+
+    static String getThreadIdFromUri(Uri uri) {
+        return uri.getPathSegments().get(THREAD_ID_INDEX_IN_URI);
     }
 }
diff --git a/src/com/android/providers/telephony/RcsProviderUtil.java b/src/com/android/providers/telephony/RcsProviderUtil.java
new file mode 100644
index 0000000..38f7be1
--- /dev/null
+++ b/src/com/android/providers/telephony/RcsProviderUtil.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.providers.telephony;
+
+import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
+
+import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
+import static com.android.providers.telephony.RcsProvider.TAG;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.telephony.ims.RcsQueryContinuationToken;
+import android.text.TextUtils;
+import android.util.Log;
+
+class RcsProviderUtil {
+    /**
+     * The value returned when database insertion fails,
+     * @see SQLiteDatabase#insert(String, String, ContentValues)
+     */
+    static final int INSERTION_FAILED = -1;
+
+    static void appendLimit(StringBuilder stringBuilder, int limit) {
+        if (limit > 0) {
+            stringBuilder.append(" LIMIT ").append(limit);
+        }
+    }
+
+    static void createContinuationTokenBundle(Cursor cursor, Parcelable continuationToken,
+            String tokenKey) {
+        if (cursor.getCount() > 0) {
+            Bundle bundle = new Bundle();
+            bundle.putParcelable(tokenKey, continuationToken);
+            cursor.setExtras(bundle);
+        }
+    }
+
+    /**
+     * This method gets a token with raw query, performs the query, increments the token's offset
+     * and returns it as a cursor extra
+     */
+    static Cursor performContinuationQuery(SQLiteDatabase db,
+            RcsQueryContinuationToken continuationToken) {
+        String rawQuery = continuationToken.getRawQuery();
+        int offset = continuationToken.getOffset();
+
+        if (offset <= 0 || TextUtils.isEmpty(rawQuery)) {
+            Log.e(TAG, "RcsProviderUtil: Invalid continuation token");
+            return null;
+        }
+
+        String continuationQuery = rawQuery + " OFFSET " + offset;
+
+        Cursor cursor = db.rawQuery(continuationQuery, null);
+        if (cursor.getCount() > 0) {
+            continuationToken.incrementOffset();
+            Bundle bundle = new Bundle();
+            bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
+            cursor.setExtras(bundle);
+        }
+
+        return cursor;
+    }
+
+    static Uri buildUriWithRowIdAppended(Uri prefix, long rowId) {
+        if (rowId == TRANSACTION_FAILED) {
+            return null;
+        }
+        return Uri.withAppendedPath(prefix, Long.toString(rowId));
+    }
+
+    static Uri returnUriAsIsIfSuccessful(Uri uri, long rowId) {
+        if (rowId == TRANSACTION_FAILED) {
+            return null;
+        }
+        return uri;
+    }
+}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java b/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java
new file mode 100644
index 0000000..61e9713
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.providers.telephony;
+
+import static android.provider.Telephony.RcsColumns.Rcs1To1ThreadColumns.FALLBACK_THREAD_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_NAME_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.OWNER_PARTICIPANT_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.CANONICAL_ADDRESS_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_ALIAS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantEventColumns.NEW_ALIAS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_NAME_COLUMN;
+
+import static com.android.providers.telephony.RcsProvider.RCS_MESSAGE_TABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.net.Uri;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.mock.MockContentResolver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class RcsProviderDeleteTest {
+    private MockContentResolver mContentResolver;
+    private RcsProviderTestable mRcsProvider;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mRcsProvider = new RcsProviderTestable();
+        RcsProviderTestable.MockContextWithProvider
+                context = new RcsProviderTestable.MockContextWithProvider(mRcsProvider);
+        mContentResolver = context.getContentResolver();
+
+        // insert a participant
+        //  first into the MmsSmsProvider
+        mRcsProvider.getWritableDatabase().execSQL(
+                "INSERT INTO canonical_addresses VALUES (1, \"+15551234567\")");
+
+        //  then into the RcsProvider
+        ContentValues participantValues = new ContentValues();
+        participantValues.put(RCS_ALIAS_COLUMN, "Bob");
+        participantValues.put(CANONICAL_ADDRESS_ID_COLUMN, 1);
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/participant"),
+                participantValues)).isEqualTo(Uri.parse("content://rcs/participant/1"));
+
+        // insert one 1 to 1 thread
+        ContentValues p2pContentValues = new ContentValues();
+        Uri p2pThreadUri = Uri.parse("content://rcs/p2p_thread");
+        p2pContentValues.put(FALLBACK_THREAD_ID_COLUMN, 1);
+        assertThat(mContentResolver.insert(p2pThreadUri, p2pContentValues)).isEqualTo(
+                Uri.parse("content://rcs/p2p_thread/1"));
+
+        // insert one group thread
+        ContentValues groupContentValues = new ContentValues();
+        groupContentValues.put(OWNER_PARTICIPANT_COLUMN, 1);
+        groupContentValues.put(GROUP_NAME_COLUMN, "name");
+        Uri groupThreadUri = Uri.parse("content://rcs/group_thread");
+        assertThat(mContentResolver.insert(groupThreadUri, groupContentValues)).isEqualTo(
+                Uri.parse("content://rcs/group_thread/2"));
+
+        // add the participant into both threads
+        Uri addParticipantTo1To1Thread = Uri.parse("content://rcs/p2p_thread/1/participant/1");
+        assertThat(mContentResolver.insert(addParticipantTo1To1Thread, null)).isEqualTo(
+                addParticipantTo1To1Thread);
+
+        Uri addParticipantToGroupThread = Uri.parse("content://rcs/group_thread/2/participant/1");
+        assertThat(mContentResolver.insert(addParticipantToGroupThread, null)).isEqualTo(
+                addParticipantToGroupThread);
+
+        // add incoming and outgoing messages to both threads
+        ContentValues messageValues = new ContentValues();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/incoming_message"),
+                messageValues)).isEqualTo(
+                Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"));
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
+                messageValues)).isEqualTo(
+                Uri.parse("content://rcs/p2p_thread/1/outgoing_message/2"));
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/incoming_message"),
+                        messageValues)).isEqualTo(
+                Uri.parse("content://rcs/group_thread/2/incoming_message/3"));
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/outgoing_message"),
+                        messageValues)).isEqualTo(
+                Uri.parse("content://rcs/group_thread/2/outgoing_message/4"));
+
+        // add a file transfer to a message
+        ContentValues fileTransferValues = new ContentValues();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/message/3/file_transfer"),
+                fileTransferValues)).isEqualTo(Uri.parse("content://rcs/file_transfer/1"));
+
+        // insert an alias change event
+        ContentValues eventValues = new ContentValues();
+        eventValues.put(NEW_ALIAS_COLUMN, "new alias");
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/participant/1/alias_change_event"),
+                        eventValues)).isEqualTo(Uri.parse(
+                "content://rcs/participant/1/alias_change_event/1"));
+
+        // create a group name change event
+        eventValues.clear();
+        eventValues.put(NEW_NAME_COLUMN, "new name");
+        assertThat(mContentResolver.insert(
+                Uri.parse("content://rcs/group_thread/2/name_changed_event"),
+                eventValues)).isEqualTo(Uri.parse(
+                "content://rcs/group_thread/2/name_changed_event/1"));
+    }
+
+    @After
+    public void tearDown() {
+        mRcsProvider.tearDown();
+    }
+
+    @Test
+    public void testDelete1To1ThreadWithId() {
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/p2p_thread/1"), null,
+                null)).isEqualTo(1);
+        assertDeletionViaQuery("content://rcs/p2p_thread/1");
+    }
+
+    @Test
+    public void testDelete1To1ThreadWithSelection() {
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/p2p_thread"),
+                "rcs_fallback_thread_id=1", null)).isEqualTo(1);
+        assertDeletionViaQuery("content://rcs/p2p_thread/1");
+    }
+
+    @Test
+    public void testDeleteGroupThreadWithId() {
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/group_thread/2"), null,
+                null)).isEqualTo(1);
+        assertDeletionViaQuery("content://rcs/group_thread/2");
+    }
+
+    @Test
+    public void testDeleteGroupThreadWithSelection() {
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/group_thread"),
+                "group_name=\"name\"", null)).isEqualTo(1);
+        assertDeletionViaQuery("content://rcs/group_thread/1");
+    }
+
+    @Test
+    public void testDeleteParticipantWithIdWhileParticipatingInAThread() {
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/participant/1"), null,
+                null)).isEqualTo(0);
+    }
+
+    @Test
+    public void testDeleteParticipantAfterLeavingThreads() {
+        // leave the first thread
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/group_thread/2/participant/1"),
+                null, null)).isEqualTo(1);
+
+        // try deleting the participant. It should fail
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/participant/1"), null,
+                null)).isEqualTo(0);
+
+        // delete the p2p thread
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/p2p_thread/1"), null,
+                null)).isEqualTo(1);
+
+        // try deleting the participant. It should succeed
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/participant/1"), null,
+                null)).isEqualTo(1);
+        assertDeletionViaQuery("content://rcs/participant/1");
+    }
+
+    @Test
+    public void testDeleteParticipantWithSelectionFails() {
+        assertThat(
+                mContentResolver.delete(Uri.parse("content://rcs/participant"), "rcs_alias=\"Bob\"",
+                        null)).isEqualTo(0);
+    }
+
+    @Test
+    public void testDeleteParticipantFrom1To1ThreadFails() {
+        assertThat(
+                mContentResolver.delete(Uri.parse("content://rcs/p2p_thread/1/participant/1"), null,
+                        null)).isEqualTo(0);
+    }
+
+    @Test
+    public void testDeleteParticipantFromGroupThread() {
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/group_thread/2/participant/1"),
+                null, null)).isEqualTo(1);
+        assertDeletionViaQuery("content://rcs/group_thread/2/participant");
+    }
+
+    @Test
+    public void testDeleteParticipantFromGroupThreadWithSelectionFails() {
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/group_thread/2/participant"),
+                "rcs_alias=?", new String[]{"Bob"})).isEqualTo(0);
+    }
+
+    @Test
+    public void testDeleteMessagesUsingUnifiedMessageViewFails() {
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/message/1"), null,
+                null)).isEqualTo(0);
+    }
+
+    @Test
+    public void testDeleteMessagesUsingThreadUrisFails() {
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/p2p_thread/1/message/1"), null,
+                null)).isEqualTo(0);
+        assertThat(
+                mContentResolver.delete(Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"),
+                        null, null)).isEqualTo(0);
+    }
+
+    @Test
+    @Ignore // TODO: fix and un-ignore
+    public void testDeleteMessage() {
+        // verify there exists 4 messages
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, null,
+                null);
+        assertThat(cursor.getCount()).isEqualTo(4);
+        cursor.close();
+
+        // delete 2 of them
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/incoming_message/1"), null,
+                null)).isEqualTo(1);
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/outgoing_message/4"), null,
+                null)).isEqualTo(1);
+
+        // verify that only 2 messages are left
+        cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(2);
+        cursor.close();
+
+        // verify that entries in common table is deleted and only messages with id's 2 and 3 remain
+        SQLiteDatabase db = mRcsProvider.getWritableDatabase();
+        cursor = db.query(RCS_MESSAGE_TABLE, null, null, null, null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(2);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(0)).isEqualTo(2);
+        cursor.moveToNext();
+        assertThat(cursor.getInt(0)).isEqualTo(3);
+        cursor.close();
+    }
+
+    @Test
+    public void testDeleteFileTransfer() {
+        assertThat(mContentResolver.delete(Uri.parse("content://rcs/file_transfer/1"), null,
+                null)).isEqualTo(1);
+        assertDeletionViaQuery("content://rcs/file_transfer/1");
+    }
+
+    @Test
+    public void testDeleteParticipantEvent() {
+        assertThat(mContentResolver.delete(Uri.parse(
+                "content://rcs/participant/1/alias_change_event/1"), null, null)).isEqualTo(1);
+
+        // try deleting again and verify nothing is deleted
+        // TODO - convert to query once querying is in place
+        assertThat(mContentResolver.delete(Uri.parse(
+                "content://rcs/participant/1/alias_change_event/1"), null, null)).isEqualTo(0);
+    }
+
+    @Test
+    public void testDeleteGroupThreadEvent() {
+        assertThat(mContentResolver.delete(Uri.parse(
+                "content://rcs/group_thread/2/name_changed_event/1"), null, null)).isEqualTo(1);
+
+        // try deleting again and verify nothing is deleted
+        // TODO - convert to query once querying is in place
+        assertThat(mContentResolver.delete(Uri.parse(
+                "content://rcs/group_thread/2/name_changed_event/1"), null, null)).isEqualTo(0);
+    }
+
+    private void assertDeletionViaQuery(String queryUri) {
+        Cursor cursor = mContentResolver.query(Uri.parse(queryUri), null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(0);
+        cursor.close();
+    }
+}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java b/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java
new file mode 100644
index 0000000..b893341
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.providers.telephony;
+
+import static android.provider.Telephony.RcsColumns.Rcs1To1ThreadColumns.FALLBACK_THREAD_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.CONFERENCE_URI_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_ICON_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_NAME_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.GLOBAL_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.CANONICAL_ADDRESS_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_ALIAS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantEventColumns.NEW_ALIAS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_NAME_COLUMN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.mock.MockContentResolver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class RcsProviderInsertTest {
+    private MockContentResolver mContentResolver;
+    private RcsProviderTestable mRcsProvider;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mRcsProvider = new RcsProviderTestable();
+        RcsProviderTestable.MockContextWithProvider
+                context = new RcsProviderTestable.MockContextWithProvider(mRcsProvider);
+        mContentResolver = context.getContentResolver();
+    }
+
+    @After
+    public void tearDown() {
+        mRcsProvider.tearDown();
+    }
+
+    @Test
+    public void testInsertUnifiedThreadFails() {
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/thread"), null)).isNull();
+    }
+
+    @Test
+    public void testInsert1To1Thread() {
+        ContentValues values = new ContentValues(1);
+        values.put(FALLBACK_THREAD_ID_COLUMN, 445);
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/p2p_thread"), values)).isEqualTo(
+                Uri.parse("content://rcs/p2p_thread/1"));
+    }
+
+    @Test
+    public void testInsertGroupThread() {
+        ContentValues contentValues = new ContentValues(3);
+        contentValues.put(CONFERENCE_URI_COLUMN, "conference uri");
+        contentValues.put(GROUP_NAME_COLUMN, "group name");
+        contentValues.put(GROUP_ICON_COLUMN, "groupIcon");
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/group_thread"),
+                contentValues)).isEqualTo(Uri.parse("content://rcs/group_thread/1"));
+    }
+
+    @Test
+    public void testInsertParticipant() {
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 6);
+        contentValues.put(RCS_ALIAS_COLUMN, "Alias");
+
+        Uri uri = mContentResolver.insert(Uri.parse("content://rcs/participant"), contentValues);
+        assertThat(uri).isEqualTo(Uri.parse("content://rcs/participant/1"));
+    }
+
+    @Test
+    public void testInsertParticipantInto1To1Thread() {
+        // create a participant
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 15);
+        contentValues.put(RCS_ALIAS_COLUMN, "Alias");
+        mContentResolver.insert(Uri.parse("content://rcs/participant"), contentValues);
+
+        // create a thread
+        ContentValues values = new ContentValues(1);
+        values.put(FALLBACK_THREAD_ID_COLUMN, 699);
+        mContentResolver.insert(Uri.parse("content://rcs/p2p_thread"), values);
+
+        // add participant to the thread
+        Uri uri = Uri.parse("content://rcs/p2p_thread/1/participant/1");
+        assertThat(mContentResolver.insert(uri, null)).isEqualTo(uri);
+
+        // assert that adding again fails
+        assertThat(mContentResolver.insert(uri, null)).isNull();
+    }
+
+    @Test
+    public void testInsertParticipantIntoGroupThread() {
+        // create a participant
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 23);
+        mContentResolver.insert(Uri.parse("content://rcs/participant"), contentValues);
+
+        // create a thread
+        ContentValues values = new ContentValues(1);
+        values.put(GROUP_NAME_COLUMN, "Group");
+        mContentResolver.insert(Uri.parse("content://rcs/group_thread"), values);
+
+        // add participant to the thread
+        Uri uri = Uri.parse("content://rcs/group_thread/1/participant/1");
+        assertThat(mContentResolver.insert(uri, null)).isEqualTo(uri);
+
+        // assert that adding again fails
+        assertThat(mContentResolver.insert(uri, null)).isNull();
+    }
+
+    @Test
+    public void testInsertMessageFails() {
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(GLOBAL_ID_COLUMN, "global RCS id");
+
+        // try inserting messages without threads
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/message"),
+                contentValues)).isNull();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/message/6"),
+                contentValues)).isNull();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/incoming_message"),
+                contentValues)).isNull();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/incoming_message/12"),
+                contentValues)).isNull();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/outgoing_message"),
+                contentValues)).isNull();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/outgoing_message/18"),
+                contentValues)).isNull();
+
+        // try inserting into unified thread view
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/thread/5/incoming_message"),
+                contentValues)).isNull();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/thread/5/outgoing_message"),
+                contentValues)).isNull();
+    }
+
+    @Test
+    @Ignore // TODO: fix and un-ignore
+    public void testInsertMessageIntoThread() {
+        // create two threads
+        ContentValues values = new ContentValues();
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/p2p_thread"), values)).isNotNull();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/group_thread"),
+                values)).isNotNull();
+
+        // add messages to threads
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/incoming_message"),
+                values)).isEqualTo(Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"));
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
+                values)).isEqualTo(Uri.parse("content://rcs/p2p_thread/1/outgoing_message/2"));
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/incoming_message"),
+                        values)).isEqualTo(
+                Uri.parse("content://rcs/group_thread/2/incoming_message/3"));
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/outgoing_message"),
+                        values)).isEqualTo(
+                Uri.parse("content://rcs/group_thread/2/outgoing_message/4"));
+
+        // assert that they are accessible in messages table
+        Cursor messageCursor = mContentResolver.query(Uri.parse("content://rcs/message"), null,
+                null, null, null);
+        assertThat(messageCursor.getCount()).isEqualTo(4);
+    }
+
+    @Test
+    public void testInsertMessageDelivery() {
+        // create a thread
+        ContentValues values = new ContentValues();
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/p2p_thread"), values)).isNotNull();
+
+        // add an outgoing message to the thread
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
+                values)).isEqualTo(Uri.parse("content://rcs/p2p_thread/1/outgoing_message/1"));
+
+        // add a delivery to the outgoing message
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/outgoing_message/1/delivery/1"),
+                values)).isEqualTo(Uri.parse("content://rcs/outgoing_message/1/delivery/1"));
+    }
+
+    @Test
+    public void testInsertFileTransfer() {
+        // create a thread
+        ContentValues values = new ContentValues();
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/p2p_thread"), values)).isNotNull();
+
+        // add an outgoing message to the thread
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
+                values)).isEqualTo(Uri.parse("content://rcs/p2p_thread/1/outgoing_message/1"));
+
+        // add a file transfer to the message
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/message/1/file_transfer"),
+                values)).isEqualTo(Uri.parse("content://rcs/file_transfer/1"));
+    }
+
+    @Test
+    public void testInsertParticipantEvent() {
+        // create a participant
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 23);
+        mContentResolver.insert(Uri.parse("content://rcs/participant"), contentValues);
+
+        // insert an alias change event
+        ContentValues eventValues = new ContentValues();
+        eventValues.put(NEW_ALIAS_COLUMN, "new alias");
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/participant/1/alias_change_event"),
+                        eventValues)).isEqualTo(Uri.parse(
+                "content://rcs/participant/1/alias_change_event/1"));
+    }
+
+    @Test
+    public void testInsertGroupThreadEvent() {
+        // create a group thread
+        ContentValues contentValues = new ContentValues();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/group_thread"),
+                contentValues)).isEqualTo(Uri.parse("content://rcs/group_thread/1"));
+
+        // create a group name change event
+        ContentValues eventValues = new ContentValues();
+        eventValues.put(NEW_NAME_COLUMN, "new name");
+        assertThat(mContentResolver.insert(
+                Uri.parse("content://rcs/group_thread/1/name_changed_event"),
+                eventValues)).isEqualTo(Uri.parse(
+                "content://rcs/group_thread/1/name_changed_event/1"));
+    }
+}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java b/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java
new file mode 100644
index 0000000..e18ebd5
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java
@@ -0,0 +1,588 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.providers.telephony;
+
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.FILE_SIZE_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.SESSION_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_NAME_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.MESSAGE_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.MESSAGE_TEXT_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.MESSAGE_TYPE_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.ORIGINATION_TIMESTAMP_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.CANONICAL_ADDRESS_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_ALIAS_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsEventTypes.PARTICIPANT_JOINED_EVENT_TYPE;
+import static android.provider.Telephony.RcsColumns.RcsThreadColumns.RCS_THREAD_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.DESTINATION_PARTICIPANT_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.EVENT_TYPE_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_NAME_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.SOURCE_PARTICIPANT_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsUnifiedThreadColumns.THREAD_TYPE_COLUMN;
+import static android.telephony.ims.RcsEventQueryParameters.EVENT_QUERY_PARAMETERS_KEY;
+import static android.telephony.ims.RcsEventQueryParameters.GROUP_THREAD_NAME_CHANGED_EVENT;
+import static android.telephony.ims.RcsMessageQueryParameters.MESSAGE_QUERY_PARAMETERS_KEY;
+import static android.telephony.ims.RcsParticipantQueryParameters.PARTICIPANT_QUERY_PARAMETERS_KEY;
+import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
+import static android.telephony.ims.RcsThreadQueryParameters.THREAD_QUERY_PARAMETERS_KEY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.test.runner.AndroidJUnit4;
+import android.telephony.ims.RcsEventQueryParameters;
+import android.telephony.ims.RcsGroupThread;
+import android.telephony.ims.RcsMessageQueryParameters;
+import android.telephony.ims.RcsParticipantQueryParameters;
+import android.telephony.ims.RcsQueryContinuationToken;
+import android.telephony.ims.RcsThreadQueryParameters;
+import android.test.mock.MockContentResolver;
+
+import com.android.providers.telephony.RcsProviderTestable.MockContextWithProvider;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class RcsProviderQueryTest {
+    private MockContentResolver mContentResolver;
+    private RcsProviderTestable mRcsProvider;
+
+    private static final String GROUP_NAME = "group name";
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mRcsProvider = new RcsProviderTestable();
+        MockContextWithProvider context = new MockContextWithProvider(mRcsProvider);
+        mContentResolver = context.getContentResolver();
+
+        // insert two participants
+        Uri participantUri = Uri.parse("content://rcs/participant");
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 99);
+        contentValues.put(RCS_ALIAS_COLUMN, "Some alias");
+        mContentResolver.insert(participantUri, contentValues);
+
+        contentValues.clear();
+        contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 100);
+        contentValues.put(RCS_ALIAS_COLUMN, "Some other alias");
+        mContentResolver.insert(participantUri, contentValues);
+
+        // insert two 1 to 1 threads
+        ContentValues p2pContentValues = new ContentValues(0);
+        Uri threadsUri = Uri.parse("content://rcs/p2p_thread");
+        assertThat(mContentResolver.insert(threadsUri, p2pContentValues)).isEqualTo(
+                Uri.parse("content://rcs/p2p_thread/1"));
+        assertThat(mContentResolver.insert(threadsUri, p2pContentValues)).isEqualTo(
+                Uri.parse("content://rcs/p2p_thread/2"));
+
+        // insert one group thread
+        ContentValues groupContentValues = new ContentValues(1);
+        groupContentValues.put(GROUP_NAME_COLUMN, GROUP_NAME);
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/group_thread"),
+                groupContentValues)).isEqualTo(Uri.parse("content://rcs/group_thread/3"));
+
+        // put participants into the group
+        mContentResolver.insert(Uri.parse("content://rcs/group_thread/3/participant/1"), null);
+        mContentResolver.insert(Uri.parse("content://rcs/group_thread/3/participant/2"), null);
+
+        // insert two messages into first thread, leave the second one empty, insert one into group
+        // thread
+        ContentValues messageValues = new ContentValues();
+
+        messageValues.put(ORIGINATION_TIMESTAMP_COLUMN, 300);
+        messageValues.put(MESSAGE_TEXT_COLUMN, "Old message");
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/incoming_message"),
+                messageValues)).isEqualTo(
+                Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"));
+
+        messageValues.clear();
+        messageValues.put(ORIGINATION_TIMESTAMP_COLUMN, 400);
+        messageValues.put(MESSAGE_TEXT_COLUMN, "New message");
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
+                messageValues)).isEqualTo(
+                Uri.parse("content://rcs/p2p_thread/1/outgoing_message/2"));
+
+        messageValues.clear();
+        messageValues.put(ORIGINATION_TIMESTAMP_COLUMN, 200);
+        messageValues.put(MESSAGE_TEXT_COLUMN, "Group message");
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/group_thread/3/incoming_message"),
+                        messageValues)).isEqualTo(
+                Uri.parse("content://rcs/group_thread/3/incoming_message/3"));
+
+        // Add two events to the group thread
+        ContentValues eventValues = new ContentValues();
+        eventValues.put(NEW_NAME_COLUMN, "New group name");
+        assertThat(mContentResolver.insert(
+                Uri.parse("content://rcs/group_thread/3/name_changed_event"),
+                eventValues)).isEqualTo(
+                Uri.parse("content://rcs/group_thread/3/name_changed_event/1"));
+
+        eventValues.clear();
+        eventValues.put(SOURCE_PARTICIPANT_ID_COLUMN, 1);
+        eventValues.put(DESTINATION_PARTICIPANT_ID_COLUMN, 2);
+        assertThat(mContentResolver.insert(
+                Uri.parse("content://rcs/group_thread/3/participant_joined_event"),
+                eventValues)).isEqualTo(
+                Uri.parse("content://rcs/group_thread/3/participant_joined_event/2"));
+    }
+
+    @After
+    public void tearDown() {
+        mRcsProvider.tearDown();
+    }
+
+    @Test
+    public void testCanQueryUnifiedThreads() {
+        RcsThreadQueryParameters queryParameters = new RcsThreadQueryParameters.Builder().build();
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(THREAD_QUERY_PARAMETERS_KEY, queryParameters);
+
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/thread"),
+                null, bundle, null);
+        assertThat(cursor.getCount()).isEqualTo(3);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(1);
+        assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(
+                GROUP_NAME);
+        assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
+                200);
+        assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
+                "Group message");
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(0);
+        assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(null);
+        assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(0);
+        assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(null);
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(0);
+        assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(null);
+        assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
+                400);
+        assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
+                "New message");
+    }
+
+    @Test
+    public void testCanQueryUnifiedThreadsWithLimitAndSorting() {
+        RcsThreadQueryParameters queryParameters = new RcsThreadQueryParameters.Builder()
+                .setThreadType(RcsThreadQueryParameters.THREAD_TYPE_1_TO_1).setResultLimit(1)
+                .setSortProperty(RcsThreadQueryParameters.SORT_BY_TIMESTAMP).setSortDirection(true)
+                .build();
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(THREAD_QUERY_PARAMETERS_KEY, queryParameters);
+
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/thread"),
+                null, bundle, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(0);
+        assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(null);
+        assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(0);
+        assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(null);
+    }
+
+    @Test
+    public void testCanContinueThreadQuery() {
+        // Limit results to 1.
+        RcsThreadQueryParameters queryParameters =
+                new RcsThreadQueryParameters.Builder().setResultLimit(1).build();
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(THREAD_QUERY_PARAMETERS_KEY, queryParameters);
+
+        // Perform an initial query, verify first thread is returned
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/thread"), null, bundle,
+                null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(1);
+        assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(
+                GROUP_NAME);
+        assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
+                200);
+        assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
+                "Group message");
+
+        // Put the continuation token in the bundle to do a follow up query
+        RcsQueryContinuationToken continuationToken = cursor.getExtras().getParcelable(
+                QUERY_CONTINUATION_TOKEN);
+        bundle.clear();
+        bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
+        cursor.close();
+
+        cursor = mContentResolver.query(Uri.parse("content://rcs/thread"), null, bundle,
+                null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(0);
+        assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(null);
+        assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(0);
+        assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(null);
+        cursor.close();
+
+        // Put the continuation token in the bundle to do a follow up query again, verify third
+        // thread is returned
+        continuationToken = cursor.getExtras().getParcelable(QUERY_CONTINUATION_TOKEN);
+        bundle.clear();
+        bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
+        cursor = mContentResolver.query(Uri.parse("content://rcs/thread"), null, bundle,
+                null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(THREAD_TYPE_COLUMN))).isEqualTo(0);
+        assertThat(cursor.getString(cursor.getColumnIndex(GROUP_NAME_COLUMN))).isEqualTo(null);
+        assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
+                400);
+        assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
+                "New message");
+        cursor.close();
+    }
+
+    @Test
+    public void testQuery1To1Threads() {
+        // verify two threads are returned in the query
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/p2p_thread"),
+                new String[]{RCS_THREAD_ID_COLUMN}, null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(2);
+    }
+
+    @Test
+    public void testQueryGroupThreads() {
+        // verify one thread is returned in the query
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/group_thread"),
+                new String[]{GROUP_NAME_COLUMN}, null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getString(0)).isEqualTo(GROUP_NAME);
+    }
+
+    @Test
+    public void testQueryParticipant() {
+        RcsParticipantQueryParameters queryParameters = new RcsParticipantQueryParameters.Builder()
+                .build();
+
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(PARTICIPANT_QUERY_PARAMETERS_KEY, queryParameters);
+
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/participant"), null, bundle,
+                null);
+        assertThat(cursor.getCount()).isEqualTo(2);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(RCS_PARTICIPANT_ID_COLUMN))).isEqualTo(2);
+        assertThat(cursor.getInt(cursor.getColumnIndex(CANONICAL_ADDRESS_ID_COLUMN))).isEqualTo(
+                100);
+        assertThat(cursor.getString(cursor.getColumnIndex(RCS_ALIAS_COLUMN))).isEqualTo(
+                "Some other alias");
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(RCS_PARTICIPANT_ID_COLUMN))).isEqualTo(1);
+        assertThat(cursor.getInt(cursor.getColumnIndex(CANONICAL_ADDRESS_ID_COLUMN))).isEqualTo(99);
+        assertThat(cursor.getString(cursor.getColumnIndex(RCS_ALIAS_COLUMN))).isEqualTo(
+                "Some alias");
+    }
+
+    @Test
+    public void testQueryParticipantWithContinuation() {
+        Uri participantUri = Uri.parse("content://rcs/participant");
+
+        // Perform the initial query
+        RcsParticipantQueryParameters queryParameters =
+                new RcsParticipantQueryParameters.Builder().setAliasLike("%ali%").setSortProperty(
+                        RcsParticipantQueryParameters.SORT_BY_ALIAS).setSortDirection(true)
+                        .setResultLimit(1).build();
+
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(PARTICIPANT_QUERY_PARAMETERS_KEY, queryParameters);
+
+        Cursor cursor = mContentResolver.query(participantUri, null, bundle, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(0)).isEqualTo(1);
+        assertThat(cursor.getInt(1)).isEqualTo(99);
+        assertThat(cursor.getString(2)).isEqualTo("Some alias");
+
+        // Perform the continuation query
+        RcsQueryContinuationToken continuationToken = cursor.getExtras().getParcelable(
+                QUERY_CONTINUATION_TOKEN);
+        bundle.clear();
+        bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
+
+        cursor = mContentResolver.query(participantUri, null, bundle, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(0)).isEqualTo(2);
+        assertThat(cursor.getInt(1)).isEqualTo(100);
+        assertThat(cursor.getString(2)).isEqualTo("Some other alias");
+
+        // Perform the continuation query to verify no entries left
+        continuationToken = cursor.getExtras().getParcelable(QUERY_CONTINUATION_TOKEN);
+        bundle.clear();
+        bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
+
+        cursor = mContentResolver.query(participantUri, null, bundle, null);
+        assertThat(cursor.getCount()).isEqualTo(0);
+        continuationToken = cursor.getExtras().getParcelable(QUERY_CONTINUATION_TOKEN);
+        assertThat(continuationToken).isNull();
+    }
+
+    @Test
+    public void testQueryGroupParticipants() {
+        // TODO - implement
+    }
+
+    @Test
+    @Ignore // TODO: fix and un-ignore
+    public void testQueryEvents() {
+        RcsEventQueryParameters queryParameters = new RcsEventQueryParameters.Builder().build();
+
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(EVENT_QUERY_PARAMETERS_KEY, queryParameters);
+
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/event"), null, bundle,
+                null);
+        assertThat(cursor.getCount()).isEqualTo(2);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(EVENT_TYPE_COLUMN))).isEqualTo(
+                PARTICIPANT_JOINED_EVENT_TYPE);
+        assertThat(cursor.getInt(cursor.getColumnIndex(SOURCE_PARTICIPANT_ID_COLUMN))).isEqualTo(
+                1);
+        assertThat(cursor.getInt(cursor.getColumnIndex(DESTINATION_PARTICIPANT_ID_COLUMN))).isEqualTo(
+                2);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(EVENT_TYPE_COLUMN))).isEqualTo(
+                GROUP_THREAD_NAME_CHANGED_EVENT);
+        assertThat(cursor.getString(cursor.getColumnIndex(NEW_NAME_COLUMN))).isEqualTo(
+                "New group name");
+    }
+
+    @Test
+    @Ignore // TODO: fix and un-ignore
+    public void testQueryEventsWithContinuation() {
+        RcsEventQueryParameters queryParameters =
+                new RcsEventQueryParameters.Builder().setResultLimit(1).setSortDirection(true)
+                        .build();
+
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(EVENT_QUERY_PARAMETERS_KEY, queryParameters);
+
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/event"), null, bundle,
+                null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(EVENT_TYPE_COLUMN))).isEqualTo(
+                GROUP_THREAD_NAME_CHANGED_EVENT);
+        assertThat(cursor.getString(cursor.getColumnIndex(NEW_NAME_COLUMN))).isEqualTo(
+                "New group name");
+    }
+
+    @Test
+    @Ignore // TODO: fix and un-ignore
+    public void testQueryEventsWithTypeLimitation() {
+        RcsEventQueryParameters queryParameters =
+                new RcsEventQueryParameters.Builder().setEventType(
+                        GROUP_THREAD_NAME_CHANGED_EVENT).build();
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(EVENT_QUERY_PARAMETERS_KEY, queryParameters);
+
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/event"), null, bundle,
+                null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(EVENT_TYPE_COLUMN))).isEqualTo(
+                GROUP_THREAD_NAME_CHANGED_EVENT);
+        assertThat(cursor.getString(cursor.getColumnIndex(NEW_NAME_COLUMN))).isEqualTo(
+                "New group name");
+    }
+
+    @Test
+    @Ignore // TODO: fix and un-ignore
+    public void testQueryMessages() {
+        RcsMessageQueryParameters queryParameters = new RcsMessageQueryParameters.Builder().build();
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(MESSAGE_QUERY_PARAMETERS_KEY, queryParameters);
+
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, bundle,
+                null);
+
+        assertThat(cursor.getCount()).isEqualTo(3);
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(3);
+        assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(3);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(2);
+        assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(1);
+        assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(1);
+    }
+
+    @Test
+    @Ignore // TODO: fix and un-ignore
+    public void testQueryMessagesWithContinuation() {
+        RcsMessageQueryParameters queryParameters =
+                new RcsMessageQueryParameters.Builder().setMessageLike("%o%message").setResultLimit(
+                        1).setSortProperty(RcsMessageQueryParameters.SORT_BY_TIMESTAMP)
+                        .setSortDirection(true).build();
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(MESSAGE_QUERY_PARAMETERS_KEY, queryParameters);
+
+        // Perform the initial query
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, bundle,
+                null);
+
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(3);
+        assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(3);
+        assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
+                200);
+        assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TYPE_COLUMN))).isEqualTo(
+                "Group message");
+
+        // Perform the continuation query
+        RcsQueryContinuationToken continuationToken = cursor.getExtras().getParcelable(
+                QUERY_CONTINUATION_TOKEN);
+        assertThat(continuationToken).isNotNull();
+        bundle.clear();
+        bundle.putParcelable(QUERY_CONTINUATION_TOKEN, continuationToken);
+
+        cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, bundle, null);
+
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(1);
+        assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(1);
+        assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
+                300);
+        assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
+                "Old message");
+    }
+
+    @Test
+    @Ignore // TODO: fix and un-ignore
+    public void testQueryMessagesWithThreadFilter() {
+        RcsMessageQueryParameters queryParameters =
+                new RcsMessageQueryParameters.Builder().setThread(new RcsGroupThread(3))
+                        .build();
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(MESSAGE_QUERY_PARAMETERS_KEY, queryParameters);
+
+        // Perform the initial query
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/message"), null, bundle,
+                null);
+
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getInt(cursor.getColumnIndex(MESSAGE_ID_COLUMN))).isEqualTo(3);
+        assertThat(cursor.getInt(cursor.getColumnIndex(RCS_THREAD_ID_COLUMN))).isEqualTo(3);
+        assertThat(cursor.getInt(cursor.getColumnIndex(ORIGINATION_TIMESTAMP_COLUMN))).isEqualTo(
+                200);
+        assertThat(cursor.getString(cursor.getColumnIndex(MESSAGE_TEXT_COLUMN))).isEqualTo(
+                "Group message");
+
+    }
+
+    @Test
+    public void testQueryParticipantOf1To1Thread() {
+        // insert the participant into a 1 to 1 thread
+        Uri insertUri = Uri.parse("content://rcs/p2p_thread/1/participant/1");
+        assertThat(mContentResolver.insert(insertUri, null)).isNotNull();
+
+        // query the participant back
+        Uri queryUri = Uri.parse("content://rcs/p2p_thread/1/participant");
+        Cursor cursor = mContentResolver.query(queryUri, null, null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+
+        assertThat(cursor.getInt(1)).isEqualTo(99);
+        assertThat(cursor.getString(2)).isEqualTo("Some alias");
+    }
+
+    @Test
+    public void testQueryParticipantOfGroupThread() {
+        // query all the participants in this thread
+        Uri queryUri = Uri.parse("content://rcs/group_thread/3/participant");
+        Cursor cursor = mContentResolver.query(queryUri, null, null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+
+        assertThat(cursor.getInt(cursor.getColumnIndex(RCS_PARTICIPANT_ID_COLUMN))).isEqualTo(1);
+        assertThat(cursor.getInt(cursor.getColumnIndex(CANONICAL_ADDRESS_ID_COLUMN))).isEqualTo(99);
+        assertThat(cursor.getString(cursor.getColumnIndex(RCS_ALIAS_COLUMN))).isEqualTo(
+                "Some alias");
+    }
+
+    @Test
+    public void testQueryParticipantOfGroupThreadWithId() {
+        Cursor cursor = mContentResolver.query(
+                Uri.parse("content://rcs/group_thread/3/participant/1"), null, null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+
+        assertThat(cursor.getInt(cursor.getColumnIndex(RCS_PARTICIPANT_ID_COLUMN))).isEqualTo(1);
+        assertThat(cursor.getInt(cursor.getColumnIndex(CANONICAL_ADDRESS_ID_COLUMN))).isEqualTo(99);
+        assertThat(cursor.getString(cursor.getColumnIndex(RCS_ALIAS_COLUMN))).isEqualTo(
+                "Some alias");
+    }
+
+    @Test
+    public void testQueryFileTransfer() {
+        ContentValues values = new ContentValues();
+        // add an incoming message to the thread 2
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/2/incoming_message"),
+                values)).isEqualTo(Uri.parse("content://rcs/p2p_thread/2/incoming_message/4"));
+
+        // add a file transfer
+        values.put(SESSION_ID_COLUMN, "session_id");
+        values.put(FILE_SIZE_COLUMN, 1234567890);
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/message/4/file_transfer"),
+                        values)).isEqualTo(Uri.parse("content://rcs/file_transfer/1"));
+
+        // query the file transfer back
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/file_transfer/1"), null,
+                null, null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(0)).isEqualTo(1);
+        assertThat(cursor.getInt(1)).isEqualTo(4);
+        assertThat(cursor.getString(2)).isEqualTo("session_id");
+        assertThat(cursor.getLong(5)).isEqualTo(1234567890);
+    }
+}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderTest.java b/tests/src/com/android/providers/telephony/RcsProviderTest.java
deleted file mode 100644
index 4074e77..0000000
--- a/tests/src/com/android/providers/telephony/RcsProviderTest.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-package com.android.providers.telephony;
-
-import static com.android.providers.telephony.RcsProviderParticipantHelper.CANONICAL_ADDRESS_ID_COLUMN;
-import static com.android.providers.telephony.RcsProviderParticipantHelper.RCS_ALIAS_COLUMN;
-import static com.android.providers.telephony.RcsProviderThreadHelper.OWNER_PARTICIPANT;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.AppOpsManager;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.pm.ProviderInfo;
-import android.database.Cursor;
-import android.net.Uri;
-import android.telephony.TelephonyManager;
-import android.test.mock.MockContentResolver;
-import android.test.mock.MockContext;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-
-public class RcsProviderTest {
-    private MockContentResolver mContentResolver;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        RcsProvider rcsProvider = new RcsProviderTestable();
-        MockContextWithProvider context = new MockContextWithProvider(rcsProvider);
-        mContentResolver = context.getContentResolver();
-    }
-
-    // TODO(sahinc): This test isn't that useful for now as it only checks the return value. Revisit
-    // once we have more of the implementation in place.
-    @Test
-    public void testInsertThread() {
-        ContentValues contentValues = new ContentValues();
-        contentValues.put(OWNER_PARTICIPANT, 5);
-
-        Uri uri = mContentResolver.insert(Uri.parse("content://rcs/thread"), contentValues);
-        assertThat(uri).isEqualTo(Uri.parse("content://rcs/thread/1"));
-    }
-
-    @Test
-    public void testUpdateThread() {
-        ContentValues contentValues = new ContentValues();
-        contentValues.put(OWNER_PARTICIPANT, 5);
-        mContentResolver.insert(Uri.parse("content://rcs/thread"), contentValues);
-
-        contentValues.put(OWNER_PARTICIPANT, 12);
-        int updateCount = mContentResolver.update(Uri.parse("content://rcs/thread"),
-                contentValues, "owner_participant=5", null);
-
-        assertThat(updateCount).isEqualTo(1);
-    }
-
-    @Test
-    public void testCanQueryAllThreads() {
-        // insert two threads
-        ContentValues contentValues = new ContentValues();
-        Uri threadsUri = Uri.parse("content://rcs/thread");
-        contentValues.put(OWNER_PARTICIPANT, 7);
-        mContentResolver.insert(threadsUri, contentValues);
-
-        contentValues.put(OWNER_PARTICIPANT, 13);
-        mContentResolver.insert(threadsUri, contentValues);
-
-        //verify two threads are inserted
-        Cursor cursor = mContentResolver.query(threadsUri, null, null, null, null);
-        assertThat(cursor.getCount()).isEqualTo(2);
-    }
-
-    @Test
-    public void testInsertParticipant() {
-        ContentValues contentValues = new ContentValues();
-        contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 6);
-        contentValues.put(RCS_ALIAS_COLUMN, "Alias");
-
-        Uri uri = mContentResolver.insert(Uri.parse("content://rcs/participant"), contentValues);
-        assertThat(uri).isEqualTo(Uri.parse("content://rcs/participant/1"));
-    }
-
-    @Test
-    public void testUpdateParticipant() {
-        // insert a participant
-        Uri participantUri = Uri.parse("content://rcs/participant");
-        ContentValues contentValues = new ContentValues();
-        contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 11);
-        contentValues.put(RCS_ALIAS_COLUMN, "Alias 1");
-
-        mContentResolver.insert(participantUri, contentValues);
-
-        // update the participant
-        contentValues.clear();
-        contentValues.put(RCS_ALIAS_COLUMN, "Alias 2");
-
-        int updatedRowCount = mContentResolver.update(participantUri, contentValues, "rcs_alias=?",
-                new String[]{"Alias 1"});
-        assertThat(updatedRowCount).isEqualTo(1);
-
-        // verify participant is actually updated
-        Cursor cursor = mContentResolver.query(participantUri, new String[]{RCS_ALIAS_COLUMN},
-                "rcs_alias=?", new String[]{"Alias 2"}, null);
-        cursor.moveToNext();
-        assertThat(cursor.getString(0)).isEqualTo("Alias 2");
-    }
-
-    @Test
-    public void testQueryParticipant() {
-        // insert a participant
-        Uri participantUri = Uri.parse("content://rcs/participant");
-        ContentValues contentValues = new ContentValues();
-        contentValues.put(CANONICAL_ADDRESS_ID_COLUMN, 99);
-        contentValues.put(RCS_ALIAS_COLUMN, "Some alias");
-
-        mContentResolver.insert(participantUri, contentValues);
-
-        // Query the participant back
-        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/participant"),
-                new String[]{RCS_ALIAS_COLUMN}, null, null, null);
-        cursor.moveToNext();
-        assertThat(cursor.getString(0)).isEqualTo("Some alias");
-    }
-
-    class MockContextWithProvider extends MockContext {
-        private final MockContentResolver mResolver;
-
-        MockContextWithProvider(RcsProvider rcsProvider) {
-            mResolver = new MockContentResolver();
-
-            // Add authority="rcs" to given smsProvider
-            ProviderInfo providerInfo = new ProviderInfo();
-            providerInfo.authority = RcsProvider.AUTHORITY;
-            rcsProvider.attachInfoForTesting(this, providerInfo);
-            mResolver.addProvider(RcsProvider.AUTHORITY, rcsProvider);
-        }
-
-        @Override
-        public MockContentResolver getContentResolver() {
-            return mResolver;
-        }
-
-        @Override
-        public Object getSystemService(String name) {
-            switch (name) {
-                case Context.APP_OPS_SERVICE:
-                    return Mockito.mock(AppOpsManager.class);
-                case Context.TELEPHONY_SERVICE:
-                    return Mockito.mock(TelephonyManager.class);
-                default:
-                    return null;
-            }
-        }
-    }
-}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderTestable.java b/tests/src/com/android/providers/telephony/RcsProviderTestable.java
index 397d656..569fcdb 100644
--- a/tests/src/com/android/providers/telephony/RcsProviderTestable.java
+++ b/tests/src/com/android/providers/telephony/RcsProviderTestable.java
@@ -15,21 +15,44 @@
  */
 package com.android.providers.telephony;
 
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
+import android.telephony.TelephonyManager;
+import android.test.mock.MockContentResolver;
+import android.test.mock.MockContext;
+
+import org.mockito.Mockito;
 
 /**
  * A subclass of RcsProvider used for testing on an in-memory database
  */
 public class RcsProviderTestable extends RcsProvider {
+    private MockContextWithProvider mockContextWithProvider;
 
     @Override
     public boolean onCreate() {
+        mockContextWithProvider = new MockContextWithProvider(this);
         mDbOpenHelper = new InMemoryRcsDatabase();
+        mParticipantHelper = new RcsProviderParticipantHelper(mDbOpenHelper);
+        mThreadHelper = new RcsProviderThreadHelper(mDbOpenHelper);
+        mMessageHelper = new RcsProviderMessageHelper(mDbOpenHelper);
+        mEventHelper = new RcsProviderEventHelper(mDbOpenHelper);
         return true;
     }
 
-    static class InMemoryRcsDatabase extends SQLiteOpenHelper {
+    protected void tearDown() {
+        mDbOpenHelper.close();
+    }
+
+    public SQLiteDatabase getWritableDatabase() {
+        return mDbOpenHelper.getWritableDatabase();
+    }
+
+    class InMemoryRcsDatabase extends SQLiteOpenHelper {
         InMemoryRcsDatabase() {
             super(null,        // no context is needed for in-memory db
                     null,      // db file name is null for in-memory db
@@ -39,8 +62,16 @@
 
         @Override
         public void onCreate(SQLiteDatabase db) {
+            MmsSmsDatabaseHelper mmsSmsDatabaseHelper = new MmsSmsDatabaseHelper(
+                mockContextWithProvider, null);
+            mmsSmsDatabaseHelper.createMmsTables(db);
+            mmsSmsDatabaseHelper.createSmsTables(db);
+            mmsSmsDatabaseHelper.createCommonTables(db);
+
             RcsProviderThreadHelper.createThreadTables(db);
             RcsProviderParticipantHelper.createParticipantTables(db);
+            RcsProviderMessageHelper.createRcsMessageTables(db);
+            RcsProviderEventHelper.createRcsEventTables(db);
         }
 
         @Override
@@ -48,4 +79,45 @@
             // no-op
         }
     }
+
+    static class MockContextWithProvider extends MockContext {
+        private final MockContentResolver mResolver;
+
+        MockContextWithProvider(RcsProvider rcsProvider) {
+            mResolver = new MockContentResolver();
+
+            // Add authority="rcs" to given smsProvider
+            ProviderInfo providerInfo = new ProviderInfo();
+            providerInfo.authority = RcsProvider.AUTHORITY;
+            rcsProvider.attachInfoForTesting(this, providerInfo);
+            mResolver.addProvider(RcsProvider.AUTHORITY, rcsProvider);
+        }
+
+        @Override
+        public MockContentResolver getContentResolver() {
+            return mResolver;
+        }
+
+        @Override
+        public PackageManager getPackageManager() {
+            return Mockito.mock(PackageManager.class);
+        }
+
+        @Override
+        public Object getSystemService(String name) {
+            switch (name) {
+                case Context.APP_OPS_SERVICE:
+                    return Mockito.mock(AppOpsManager.class);
+                case Context.TELEPHONY_SERVICE:
+                    return Mockito.mock(TelephonyManager.class);
+                default:
+                    return null;
+            }
+        }
+
+        @Override
+        public boolean isCredentialProtectedStorage() {
+            return false;
+        }
+    }
 }
diff --git a/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java b/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java
new file mode 100644
index 0000000..28954c9
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java
@@ -0,0 +1,338 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.providers.telephony;
+
+import static android.provider.Telephony.RcsColumns.Rcs1To1ThreadColumns.FALLBACK_THREAD_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.HEIGHT_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsFileTransferColumns.WIDTH_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.GROUP_NAME_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.OWNER_PARTICIPANT_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsIncomingMessageColumns.ARRIVAL_TIMESTAMP_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageColumns.ORIGINATION_TIMESTAMP_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsMessageDeliveryColumns.DELIVERED_TIMESTAMP_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.CANONICAL_ADDRESS_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_ALIAS_COLUMN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.Telephony.RcsColumns.RcsMessageDeliveryColumns;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.mock.MockContentResolver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class RcsProviderUpdateTest {
+    private MockContentResolver mContentResolver;
+    private RcsProviderTestable mRcsProvider;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mRcsProvider = new RcsProviderTestable();
+        RcsProviderTestable.MockContextWithProvider
+                context = new RcsProviderTestable.MockContextWithProvider(mRcsProvider);
+        mContentResolver = context.getContentResolver();
+
+        // insert a participant
+        //  first into the MmsSmsProvider
+        mRcsProvider.getWritableDatabase().execSQL(
+                "INSERT INTO canonical_addresses VALUES (1, \"+15551234567\")");
+
+        //  then into the RcsProvider
+        ContentValues participantValues = new ContentValues();
+        participantValues.put(RCS_ALIAS_COLUMN, "Bob");
+        participantValues.put(CANONICAL_ADDRESS_ID_COLUMN, 1);
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/participant"),
+                participantValues)).isEqualTo(Uri.parse("content://rcs/participant/1"));
+
+        // insert fallback threads
+        mRcsProvider.getWritableDatabase().execSQL("INSERT INTO threads(_id) VALUES (1)");
+        mRcsProvider.getWritableDatabase().execSQL("INSERT INTO threads(_id) VALUES (2)");
+
+        // insert one 1 to 1 thread
+        ContentValues p2pContentValues = new ContentValues();
+        Uri p2pThreadUri = Uri.parse("content://rcs/p2p_thread");
+        p2pContentValues.put(FALLBACK_THREAD_ID_COLUMN, 1);
+        assertThat(mContentResolver.insert(p2pThreadUri, p2pContentValues)).isEqualTo(
+                Uri.parse("content://rcs/p2p_thread/1"));
+
+        // insert one group thread
+        ContentValues groupContentValues = new ContentValues();
+        groupContentValues.put(OWNER_PARTICIPANT_COLUMN, 1);
+        groupContentValues.put(GROUP_NAME_COLUMN, "Name");
+        Uri groupThreadUri = Uri.parse("content://rcs/group_thread");
+        assertThat(mContentResolver.insert(groupThreadUri, groupContentValues)).isEqualTo(
+                Uri.parse("content://rcs/group_thread/2"));
+
+        // Add participant to both threads
+        Uri p2pInsertionUri = Uri.parse("content://rcs/p2p_thread/1/participant/1");
+        assertThat(mContentResolver.insert(p2pInsertionUri, null)).isEqualTo(p2pInsertionUri);
+
+        Uri groupInsertionUri = Uri.parse("content://rcs/group_thread/2/participant/1");
+        assertThat(mContentResolver.insert(groupInsertionUri, null)).isEqualTo(groupInsertionUri);
+
+        // add incoming and outgoing messages to both threads
+        ContentValues messageValues = new ContentValues();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/incoming_message"),
+                messageValues)).isEqualTo(
+                Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"));
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/p2p_thread/1/outgoing_message"),
+                messageValues)).isEqualTo(
+                Uri.parse("content://rcs/p2p_thread/1/outgoing_message/2"));
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/incoming_message"),
+                        messageValues)).isEqualTo(
+                Uri.parse("content://rcs/group_thread/2/incoming_message/3"));
+        assertThat(
+                mContentResolver.insert(Uri.parse("content://rcs/group_thread/2/outgoing_message"),
+                        messageValues)).isEqualTo(
+                Uri.parse("content://rcs/group_thread/2/outgoing_message/4"));
+
+        // add message delivery to the outgoing messages
+        ContentValues deliveryValues = new ContentValues();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/outgoing_message/2/delivery/1"),
+                deliveryValues)).isEqualTo(
+                Uri.parse("content://rcs/outgoing_message/2/delivery/1"));
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/outgoing_message/4/delivery/1"),
+                deliveryValues)).isEqualTo(
+                Uri.parse("content://rcs/outgoing_message/4/delivery/1"));
+
+        // add a file transfer to an incoming message
+        ContentValues fileTransferValues = new ContentValues();
+        assertThat(mContentResolver.insert(Uri.parse("content://rcs/message/3/file_transfer"),
+                fileTransferValues)).isEqualTo(Uri.parse("content://rcs/file_transfer/1"));
+    }
+
+    @After
+    public void tearDown() {
+        mRcsProvider.tearDown();
+    }
+
+    @Test
+    public void testUpdate1To1ThreadWithSelection() {
+        // update the fallback thread id
+        ContentValues contentValues = new ContentValues(1);
+        contentValues.put(FALLBACK_THREAD_ID_COLUMN, 2);
+        Uri p2pThreadUri = Uri.parse("content://rcs/p2p_thread");
+
+        assertThat(mContentResolver.update(p2pThreadUri, contentValues, "rcs_fallback_thread_id=1",
+                null)).isEqualTo(1);
+
+        // verify the thread is actually updated
+        Cursor cursor = mContentResolver.query(p2pThreadUri,
+                new String[]{FALLBACK_THREAD_ID_COLUMN}, "rcs_fallback_thread_id=2", null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(0)).isEqualTo(2);
+    }
+
+    @Test
+    public void testUpdate1To1ThreadWithId() {
+        // update the fallback thread id
+        ContentValues contentValues = new ContentValues(1);
+        contentValues.put(FALLBACK_THREAD_ID_COLUMN, 2);
+        Uri p2pThreadUri = Uri.parse("content://rcs/p2p_thread/1");
+        assertThat(mContentResolver.update(p2pThreadUri, contentValues, null, null)).isEqualTo(1);
+
+        // verify the thread is actually updated
+        Cursor cursor = mContentResolver.query(p2pThreadUri,
+                new String[]{FALLBACK_THREAD_ID_COLUMN}, null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getInt(0)).isEqualTo(2);
+    }
+
+    @Test
+    public void testUpdateGroupThreadWithSelection() {
+        // update the group name
+        ContentValues contentValues = new ContentValues(1);
+        contentValues.put(GROUP_NAME_COLUMN, "New name");
+        Uri groupThreadUri = Uri.parse("content://rcs/group_thread");
+        assertThat(mContentResolver.update(groupThreadUri, contentValues, "group_name=\"Name\"",
+                null)).isEqualTo(1);
+
+        // verify the thread is actually updated
+        Cursor cursor = mContentResolver.query(groupThreadUri, new String[]{GROUP_NAME_COLUMN},
+                "group_name=\"New name\"", null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+
+        cursor.moveToNext();
+        assertThat(cursor.getString(0)).isEqualTo("New name");
+    }
+
+    @Test
+    public void testUpdateGroupThreadWithId() {
+        // update the group name
+        ContentValues contentValues = new ContentValues(1);
+        contentValues.put(GROUP_NAME_COLUMN, "New name");
+        Uri groupThreadUri = Uri.parse("content://rcs/group_thread/2");
+        assertThat(mContentResolver.update(groupThreadUri, contentValues, null, null)).isEqualTo(1);
+
+        // verify the thread is actually updated
+        Cursor cursor = mContentResolver.query(groupThreadUri, new String[]{GROUP_NAME_COLUMN},
+                null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getString(0)).isEqualTo("New name");
+    }
+
+    @Test
+    public void testUpdateParticipantWithId() {
+        // change the participant name from Bob to Bobby
+        ContentValues contentValues = new ContentValues(1);
+        contentValues.put(RCS_ALIAS_COLUMN, "Bobby");
+
+        Uri participantUri = Uri.parse("content://rcs/participant/1");
+
+        assertThat(mContentResolver.update(participantUri, contentValues, null, null)).isEqualTo(1);
+
+        // verify participant is actually updated
+        Cursor cursor = mContentResolver.query(participantUri, new String[]{RCS_ALIAS_COLUMN}, null,
+                null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getString(0)).isEqualTo("Bobby");
+    }
+
+    @Test
+    public void testUpdate1To1ThreadParticipantFails() {
+        assertThat(
+                mContentResolver.update(Uri.parse("content://rcs/p2p_thread/1/participant/1"), null,
+                        null, null)).isEqualTo(0);
+    }
+
+    @Test
+    public void testUpdateGroupParticipantFails() {
+        assertThat(mContentResolver.update(Uri.parse("content://rcs/group_thread/2/participant/1"),
+                null, null, null)).isEqualTo(0);
+    }
+
+    @Test
+    public void testUpdateUnifiedMessageViewFails() {
+        ContentValues updateValues = new ContentValues();
+        updateValues.put(ORIGINATION_TIMESTAMP_COLUMN, 1234567890);
+
+        assertThat(mContentResolver.update(Uri.parse("content://rcs/message"), updateValues, null,
+                null)).isEqualTo(0);
+        assertThat(mContentResolver.update(Uri.parse("content://rcs/message/1"), updateValues, null,
+                null)).isEqualTo(0);
+    }
+
+    @Test
+    public void testUpdateMessageOnThreadFails() {
+        ContentValues updateValues = new ContentValues();
+        updateValues.put(ORIGINATION_TIMESTAMP_COLUMN, 1234567890);
+
+        assertThat(mContentResolver.update(Uri.parse("content://rcs/p2p_thread/1/incoming_message"),
+                updateValues, null, null)).isEqualTo(0);
+        assertThat(
+                mContentResolver.update(Uri.parse("content://rcs/p2p_thread/1/incoming_message/1"),
+                        updateValues, null, null)).isEqualTo(0);
+        assertThat(
+                mContentResolver.update(Uri.parse("content://rcs/group_thread/2/outgoing_message"),
+                        updateValues, null, null)).isEqualTo(0);
+        assertThat(mContentResolver.update(
+                Uri.parse("content://rcs/groupp_thread/2/outgoing_message/1"), updateValues, null,
+                null)).isEqualTo(0);
+    }
+
+    @Test
+    public void testUpdateMessage() {
+        // update the message
+        ContentValues updateValues = new ContentValues(1);
+        updateValues.put(ORIGINATION_TIMESTAMP_COLUMN, 1234567890);
+        assertThat(
+                mContentResolver.update(Uri.parse("content://rcs/outgoing_message/2"), updateValues,
+                        null, null)).isEqualTo(1);
+
+        // verify the value is actually updated
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/outgoing_message/2"), null,
+                null, null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getLong(5)).isEqualTo(1234567890);
+        cursor.close();
+    }
+
+    @Test
+    @Ignore // TODO: fix and un-ignore
+    public void testUpdateIncomingMessageSpecificColumn() {
+        // update the message
+        ContentValues updateValues = new ContentValues(1);
+        updateValues.put(ARRIVAL_TIMESTAMP_COLUMN, 987654321);
+        assertThat(
+                mContentResolver.update(Uri.parse("content://rcs/incoming_message/3"), updateValues,
+                        null, null)).isEqualTo(1);
+
+        // verify the value is actually updated
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/incoming_message/3"), null,
+                null, null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getLong(7)).isEqualTo(987654321);
+        cursor.close();
+    }
+
+    @Test
+    public void testUpdateMessageDelivery() {
+        ContentValues updateValues = new ContentValues();
+        updateValues.put(DELIVERED_TIMESTAMP_COLUMN, 12345);
+        updateValues.put(RcsMessageDeliveryColumns.SEEN_TIMESTAMP_COLUMN, 54321);
+
+        assertThat(mContentResolver.update(Uri.parse("content://rcs/outgoing_message/2/delivery/1"),
+                updateValues, null, null)).isEqualTo(1);
+
+        // verify the value is actually updated
+        Cursor cursor = mContentResolver.query(
+                Uri.parse("content://rcs/outgoing_message/2/delivery"), null, null, null, null,
+                null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getInt(0)).isEqualTo(2);
+        assertThat(cursor.getInt(1)).isEqualTo(1);
+        assertThat(cursor.getLong(2)).isEqualTo(12345);
+        assertThat(cursor.getLong(3)).isEqualTo(54321);
+    }
+
+    @Test
+    public void testUpdateFileTransfer() {
+        ContentValues updateValues = new ContentValues();
+        updateValues.put(WIDTH_COLUMN, 640);
+        updateValues.put(HEIGHT_COLUMN, 480);
+
+        assertThat(mContentResolver.update(Uri.parse("content://rcs/file_transfer/1"), updateValues,
+                null, null)).isEqualTo(1);
+
+        // verify that the values are actually updated
+        Cursor cursor = mContentResolver.query(Uri.parse("content://rcs/file_transfer/1"), null,
+                null, null, null, null);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getInt(8)).isEqualTo(640);
+        assertThat(cursor.getInt(9)).isEqualTo(480);
+    }
+}
