diff --git a/assets/carrier_list.pb b/assets/carrier_list.pb
index 9580a0b..18b18e3 100644
--- a/assets/carrier_list.pb
+++ b/assets/carrier_list.pb
Binary files differ
diff --git a/assets/carrier_list.textpb b/assets/carrier_list.textpb
index b55cf68..07fdc8d 100644
--- a/assets/carrier_list.textpb
+++ b/assets/carrier_list.textpb
@@ -10244,4 +10244,4 @@
     mccmnc_tuple: "44010"
   }
 }
-version: 7
+version: 8
diff --git a/src/com/android/providers/telephony/CarrierIdProvider.java b/src/com/android/providers/telephony/CarrierIdProvider.java
index 97d496b..a2c924c 100644
--- a/src/com/android/providers/telephony/CarrierIdProvider.java
+++ b/src/com/android/providers/telephony/CarrierIdProvider.java
@@ -385,7 +385,11 @@
                     cv = new ContentValues();
                     cv.put(CarrierId.CARRIER_ID, id.canonicalId);
                     cv.put(CarrierId.CARRIER_NAME, id.carrierName);
-                    cv.put(CarrierId.PARENT_CARRIER_ID, id.parentCanonicalId);
+                    // 0 is the default proto value. if parentCanonicalId is unset, apply default
+                    // unknown carrier id -1.
+                    if (id.parentCanonicalId > 0) {
+                        cv.put(CarrierId.PARENT_CARRIER_ID, id.parentCanonicalId);
+                    }
                     cvs = new ArrayList<>();
                     convertCarrierAttrToContentValues(cv, cvs, attr, 0);
                     for (ContentValues contentVal : cvs) {
diff --git a/src/com/android/providers/telephony/RcsProvider.java b/src/com/android/providers/telephony/RcsProvider.java
index c0ca9e1..3235b27 100644
--- a/src/com/android/providers/telephony/RcsProvider.java
+++ b/src/com/android/providers/telephony/RcsProvider.java
@@ -15,6 +15,7 @@
  */
 package com.android.providers.telephony;
 
+import static android.provider.Telephony.RcsColumns.RcsThreadColumns.RCS_THREAD_URI_PART;
 import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
 
 import static com.android.providers.telephony.RcsProviderUtil.buildUriWithRowIdAppended;
@@ -136,7 +137,7 @@
 
     static {
         // example URI: content://rcs/thread
-        URL_MATCHER.addURI(AUTHORITY, "thread", UNIFIED_RCS_THREAD);
+        URL_MATCHER.addURI(AUTHORITY, RCS_THREAD_URI_PART, 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);
@@ -503,8 +504,10 @@
                                 + uri);
                 break;
             case P2P_THREAD_PARTICIPANT_WITH_ID:
-                return returnUriAsIsIfSuccessful(uri,
-                        mParticipantHelper.insertParticipantIntoP2pThread(uri));
+                Log.e(TAG,
+                        "Inserting participant into a thread via URI is not supported, uri: "
+                                + uri);
+                break;
             case GROUP_THREAD:
                 return buildUriWithRowIdAppended(GROUP_THREAD_URI_PREFIX,
                         mThreadHelper.insertGroupThread(values));
diff --git a/src/com/android/providers/telephony/RcsProviderParticipantHelper.java b/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
index 57223c2..ab23d6d 100644
--- a/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
+++ b/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
@@ -267,38 +267,6 @@
         return rowId;
     }
 
-    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
diff --git a/src/com/android/providers/telephony/RcsProviderThreadHelper.java b/src/com/android/providers/telephony/RcsProviderThreadHelper.java
index a60d1e9..c1a35ef 100644
--- a/src/com/android/providers/telephony/RcsProviderThreadHelper.java
+++ b/src/com/android/providers/telephony/RcsProviderThreadHelper.java
@@ -23,6 +23,7 @@
 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.RcsParticipantColumns.RCS_PARTICIPANT_ID_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;
@@ -317,32 +318,94 @@
         return queryGroupThread(projection, getThreadIdSelection(uri), null, null);
     }
 
+    /**
+     * @param contentValues should contain the participant ID of the other participant under key
+     *                      {@link RCS_PARTICIPANT_ID_COLUMN}
+     */
     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;
+            return TRANSACTION_FAILED;
+        }
+
+        Long participantId = contentValues.getAsLong(RCS_PARTICIPANT_ID_COLUMN);
+        if (participantId == null) {
+            Log.e(RcsProvider.TAG,
+                    "inserting threads without participant IDs is not supported");
+            return TRANSACTION_FAILED;
         }
 
         SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
         try {
             db.beginTransaction();
 
-            // Insert into the common rcs_threads table
-            long rowId = insertIntoCommonRcsThreads(db);
+            if (hasExisting1To1ThreadForParticipant(db, participantId)) {
+                return TRANSACTION_FAILED;
+            }
 
-            // 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);
+            long threadId = insertIntoCommonRcsThreads(db);
+            if (threadId == -1) {
+                return TRANSACTION_FAILED;
+            }
+
+            if (insertP2pThread(db, threadId) == -1) {
+                return TRANSACTION_FAILED;
+            }
+
+            if (insertParticipantIntoP2pThread(db, threadId, participantId) == -1) {
+                return TRANSACTION_FAILED;
+            }
 
             db.setTransactionSuccessful();
-            returnValue = rowId;
+
+            return threadId;
         } finally {
             db.endTransaction();
         }
-        return returnValue;
+    }
+
+    private long insertP2pThread(SQLiteDatabase db, long threadId) {
+        ContentValues contentValues = new ContentValues(1);
+        contentValues.put(RCS_THREAD_ID_COLUMN, threadId);
+
+        return db.insert(RCS_1_TO_1_THREAD_TABLE, RCS_THREAD_ID_COLUMN, contentValues);
+    }
+
+    private long insertParticipantIntoP2pThread(
+            SQLiteDatabase db, long threadId, long participantId) {
+        ContentValues contentValues = new ContentValues(2);
+        contentValues.put(RCS_THREAD_ID_COLUMN, threadId);
+        contentValues.put(RCS_PARTICIPANT_ID_COLUMN, participantId);
+
+        return db.insert(
+                RCS_PARTICIPANT_THREAD_JUNCTION_TABLE, RCS_PARTICIPANT_ID_COLUMN, contentValues);
+    }
+
+    private boolean hasExisting1To1ThreadForParticipant(SQLiteDatabase db, long participantId) {
+        String table = joinOnColumn(
+                RCS_PARTICIPANT_THREAD_JUNCTION_TABLE,
+                RCS_1_TO_1_THREAD_TABLE,
+                RCS_THREAD_ID_COLUMN);
+
+        try (Cursor cursor = db.query(
+                table,
+                null,
+                RCS_PARTICIPANT_ID_COLUMN + "=?",
+                new String[]{Long.toString(participantId)},
+                null,
+                null,
+                null)) {
+            if (cursor == null || cursor.getCount() == 0) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private String joinOnColumn(String t1, String t2, String col) {
+        return t1 + " JOIN " + t2 + " ON (" + t1 + "." + col + "=" + t2 + "." + col + ")";
     }
 
     long insertGroupThread(ContentValues contentValues) {
diff --git a/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java b/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java
index 61e9713..77a5a70 100644
--- a/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java
+++ b/tests/src/com/android/providers/telephony/RcsProviderDeleteTest.java
@@ -15,7 +15,6 @@
  */
 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;
@@ -24,6 +23,7 @@
 import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_NAME_COLUMN;
 
 import static com.android.providers.telephony.RcsProvider.RCS_MESSAGE_TABLE;
+import static com.android.providers.telephony.RcsProviderHelper.setup1To1Thread;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -66,12 +66,7 @@
         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"));
+        setup1To1Thread(mContentResolver);
 
         // insert one group thread
         ContentValues groupContentValues = new ContentValues();
@@ -81,11 +76,6 @@
         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);
diff --git a/tests/src/com/android/providers/telephony/RcsProviderHelper.java b/tests/src/com/android/providers/telephony/RcsProviderHelper.java
new file mode 100644
index 0000000..5a7f9a0
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/RcsProviderHelper.java
@@ -0,0 +1,55 @@
+/*
+ * 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.Rcs1To1ThreadColumns.FALLBACK_THREAD_ID_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.net.Uri;
+
+class RcsProviderHelper {
+    /**
+     * Sets up a 1-to-1 thread with a participant ID of 1 and a fallback thread ID of 1.
+     *
+     * @return the {@link Uri} of the newly inserted row
+     */
+    static Uri setup1To1Thread(ContentResolver contentResolver) {
+        return setup1To1Thread(contentResolver, 1, 1);
+    }
+
+    static Uri setup1To1Thread(
+            ContentResolver contentResolver, int participantId, int fallbackThreadId) {
+        ContentValues insertValues = new ContentValues();
+        Uri insertionUri = Uri.parse("content://rcs/p2p_thread");
+        insertValues.put(RCS_PARTICIPANT_ID_COLUMN, participantId);
+
+        Uri rowUri = contentResolver.insert(insertionUri, insertValues);
+        assertThat(rowUri).isNotNull();
+
+        ContentValues updateValues = new ContentValues();
+        updateValues.put(FALLBACK_THREAD_ID_COLUMN, fallbackThreadId);
+        assertThat(contentResolver.update(rowUri, updateValues, null, null))
+                .isEqualTo(1);
+
+        return rowUri;
+    }
+
+}
diff --git a/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java b/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java
index b893341..7e63d7f 100644
--- a/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java
+++ b/tests/src/com/android/providers/telephony/RcsProviderInsertTest.java
@@ -15,7 +15,6 @@
  */
 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;
@@ -25,6 +24,8 @@
 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.RcsProviderHelper.setup1To1Thread;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.ContentValues;
@@ -65,12 +66,10 @@
     }
 
     @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"));
+    public void testDuplicate1To1ThreadInsertion() {
+        Uri uri = setup1To1Thread(mContentResolver);
+
+        assertThat(mContentResolver.insert(uri, null)).isNull();
     }
 
     @Test
@@ -94,27 +93,6 @@
     }
 
     @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();
@@ -164,9 +142,8 @@
     @Ignore // TODO: fix and un-ignore
     public void testInsertMessageIntoThread() {
         // create two threads
+        setup1To1Thread(mContentResolver);
         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();
 
@@ -192,10 +169,9 @@
 
     @Test
     public void testInsertMessageDelivery() {
-        // create a thread
+        setup1To1Thread(mContentResolver);
+
         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"),
@@ -208,10 +184,9 @@
 
     @Test
     public void testInsertFileTransfer() {
-        // create a thread
+        setup1To1Thread(mContentResolver);
+
         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"),
diff --git a/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java b/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java
index e1ae982..7b0ed62 100644
--- a/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java
+++ b/tests/src/com/android/providers/telephony/RcsProviderQueryTest.java
@@ -15,6 +15,7 @@
  */
 package com.android.providers.telephony;
 
+import static android.provider.Telephony.RcsColumns.RcsEventTypes.PARTICIPANT_JOINED_EVENT_TYPE;
 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;
@@ -25,7 +26,6 @@
 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;
@@ -39,6 +39,8 @@
 import static android.telephony.ims.RcsQueryContinuationToken.QUERY_CONTINUATION_TOKEN;
 import static android.telephony.ims.RcsThreadQueryParams.THREAD_QUERY_PARAMETERS_KEY;
 
+import static com.android.providers.telephony.RcsProviderHelper.setup1To1Thread;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.ContentValues;
@@ -90,12 +92,8 @@
         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"));
+        setup1To1Thread(mContentResolver, 1, 1);
+        setup1To1Thread(mContentResolver, 2, 2);
 
         // insert one group thread
         ContentValues groupContentValues = new ContentValues(1);
@@ -519,10 +517,6 @@
 
     @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);
diff --git a/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java b/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java
index 28954c9..45ab0ca 100644
--- a/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java
+++ b/tests/src/com/android/providers/telephony/RcsProviderUpdateTest.java
@@ -25,6 +25,9 @@
 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 android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
+
+import static com.android.providers.telephony.RcsProviderHelper.setup1To1Thread;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -71,12 +74,7 @@
         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"));
+        setup1To1Thread(mContentResolver);
 
         // insert one group thread
         ContentValues groupContentValues = new ContentValues();
@@ -86,10 +84,6 @@
         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);
 
