diff --git a/src/java/com/android/ims/rcs/uce/eab/EabProvider.java b/src/java/com/android/ims/rcs/uce/eab/EabProvider.java
index 60283c2..da70349 100644
--- a/src/java/com/android/ims/rcs/uce/eab/EabProvider.java
+++ b/src/java/com/android/ims/rcs/uce/eab/EabProvider.java
@@ -81,7 +81,7 @@
     public static final String AUTHORITY = "eab";
 
     private static final String TAG = "EabProvider";
-    private static final int DATABASE_VERSION = 2;
+    private static final int DATABASE_VERSION = 3;
 
     public static final String EAB_CONTACT_TABLE_NAME = "eab_contact";
     public static final String EAB_COMMON_TABLE_NAME = "eab_common";
@@ -332,8 +332,6 @@
 
         static {
             CONTACT_UNIQUE_FIELDS.add(ContactColumns.PHONE_NUMBER);
-
-            COMMON_UNIQUE_FIELDS.add(EabCommonColumns.EAB_CONTACT_ID);
         }
 
         @VisibleForTesting
@@ -356,8 +354,7 @@
                 + EabCommonColumns.EAB_CONTACT_ID + " INTEGER DEFAULT -1, "
                 + EabCommonColumns.MECHANISM + " INTEGER DEFAULT NULL, "
                 + EabCommonColumns.REQUEST_RESULT + " INTEGER DEFAULT -1, "
-                + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1, "
-                + "UNIQUE (" + TextUtils.join(", ", COMMON_UNIQUE_FIELDS) + ")"
+                + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1 "
                 + ");";
 
         @VisibleForTesting
@@ -410,6 +407,46 @@
                         + ContactColumns.CONTACT_ID + " INTEGER DEFAULT -1;");
                 oldVersion = 2;
             }
+
+            if (oldVersion < 3) {
+                // Drop UNIQUE constraint in EAB_COMMON_TABLE, SQLite didn't support DROP
+                // constraint, so drop the old one and migrate data to new one
+
+                // Create temp table
+                final String createTempTableCommand = "CREATE TABLE temp"
+                        + " ("
+                        + EabCommonColumns._ID + " INTEGER PRIMARY KEY, "
+                        + EabCommonColumns.EAB_CONTACT_ID + " INTEGER DEFAULT -1, "
+                        + EabCommonColumns.MECHANISM + " INTEGER DEFAULT NULL, "
+                        + EabCommonColumns.REQUEST_RESULT + " INTEGER DEFAULT -1, "
+                        + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1 "
+                        + ");";
+                sqLiteDatabase.execSQL(createTempTableCommand);
+
+                // Migrate data to temp table
+                sqLiteDatabase.execSQL("INSERT INTO temp ("
+                        + EabCommonColumns._ID + ", "
+                        + EabCommonColumns.EAB_CONTACT_ID + ", "
+                        + EabCommonColumns.MECHANISM + ", "
+                        + EabCommonColumns.REQUEST_RESULT + ", "
+                        + EabCommonColumns.SUBSCRIPTION_ID + ") "
+                        + " SELECT "
+                        + EabCommonColumns._ID + ", "
+                        + EabCommonColumns.EAB_CONTACT_ID + ", "
+                        + EabCommonColumns.MECHANISM + ", "
+                        + EabCommonColumns.REQUEST_RESULT + ", "
+                        + EabCommonColumns.SUBSCRIPTION_ID + " "
+                        + " FROM "
+                        + EAB_COMMON_TABLE_NAME
+                        +";");
+
+                // Drop old one
+                sqLiteDatabase.execSQL("DROP TABLE " + EAB_COMMON_TABLE_NAME + ";");
+
+                // Rename temp to eab_common
+                sqLiteDatabase.execSQL("ALTER TABLE temp RENAME TO " + EAB_COMMON_TABLE_NAME + ";");
+                oldVersion = 3;
+            }
         }
     }
 
diff --git a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
index 5138445..96147b4 100644
--- a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java
@@ -66,7 +66,8 @@
 @RunWith(AndroidJUnit4.class)
 public class EabControllerTest extends ImsTestBase {
     EabProviderTestable mEabProviderTestable = new EabProviderTestable();
-    EabControllerImpl mEabController;
+    EabControllerImpl mEabControllerSub1;
+    EabControllerImpl mEabControllerSub2;
     PersistableBundle mBundle;
     ExecutorService mExecutor = Executors.newSingleThreadExecutor();
 
@@ -74,6 +75,7 @@
     EabControllerImpl.ExpirationTimeFactory mExpirationTimeFactory;
 
     private static final int TEST_SUB_ID = 1;
+    private static final int TEST_SECOND_SUB_ID = 2;
     private static final String TEST_PHONE_NUMBER = "16661234567";
     private static final String TEST_SERVICE_STATUS = "status";
     private static final String TEST_SERVICE_SERVICE_ID = "serviceId";
@@ -94,9 +96,14 @@
         mockContentResolver.addProvider(EabProvider.AUTHORITY, mEabProviderTestable);
 
         insertContactInfoToDB();
-        mEabController = new EabControllerImpl(
+        mEabControllerSub1 = new EabControllerImpl(
                 mContext, TEST_SUB_ID, null, Looper.getMainLooper());
-        mEabController.setExpirationTimeFactory(mExpirationTimeFactory);
+        mEabControllerSub1.setExpirationTimeFactory(mExpirationTimeFactory);
+
+        mEabControllerSub2 = new EabControllerImpl(
+                mContext, TEST_SECOND_SUB_ID, null, Looper.getMainLooper());
+        mEabControllerSub2.setExpirationTimeFactory(mExpirationTimeFactory);
+
         doReturn(Instant.now().getEpochSecond()).when(mExpirationTimeFactory).getExpirationTime();
 
         mBundle = mContextFixture.getTestCarrierConfigBundle();
@@ -113,9 +120,9 @@
         List<RcsContactUceCapability> contactList = new ArrayList<>();
         contactList.add(createPresenceCapability());
 
-        mEabController.saveCapabilities(contactList);
+        mEabControllerSub1.saveCapabilities(contactList);
 
-        EabCapabilityResult result = mEabController.getAvailability(TEST_CONTACT_URI);
+        EabCapabilityResult result = mEabControllerSub1.getAvailability(TEST_CONTACT_URI);
         Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL, result.getStatus());
         Assert.assertEquals(TEST_CONTACT_URI,
                 result.getContactCapabilities().getContactUri());
@@ -127,14 +134,14 @@
         List<RcsContactUceCapability> contactList = new ArrayList<>();
         contactList.add(createPresenceCapability());
 
-        mEabController.saveCapabilities(contactList);
+        mEabControllerSub1.saveCapabilities(contactList);
 
         List<Uri> contactUriList = new ArrayList<>();
         contactUriList.add(TEST_CONTACT_URI);
         Assert.assertEquals(1,
-                mEabController.getCapabilities(contactUriList).size());
+                mEabControllerSub1.getCapabilities(contactUriList).size());
         Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
-                mEabController.getCapabilities(contactUriList).get(0).getStatus());
+                mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
     }
 
     @Test
@@ -145,14 +152,14 @@
 
         contactList.add(createPresenceCapability());
 
-        mEabController.saveCapabilities(contactList);
+        mEabControllerSub1.saveCapabilities(contactList);
 
         List<Uri> contactUriList = new ArrayList<>();
         contactUriList.add(TEST_CONTACT_URI);
         Assert.assertEquals(1,
-                mEabController.getCapabilities(contactUriList).size());
+                mEabControllerSub1.getCapabilities(contactUriList).size());
         Assert.assertEquals(EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE,
-                mEabController.getCapabilities(contactUriList).get(0).getStatus());
+                mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
     }
 
     @Test
@@ -164,16 +171,16 @@
         List<RcsContactUceCapability> contactList = new ArrayList<>();
         contactList.add(createPresenceNonRcsCapability());
 
-        mEabController.saveCapabilities(contactList);
+        mEabControllerSub1.saveCapabilities(contactList);
 
         List<Uri> contactUriList = new ArrayList<>();
         contactUriList.add(TEST_CONTACT_URI);
 
         // Verify result is not expired
         Assert.assertEquals(1,
-                mEabController.getCapabilities(contactUriList).size());
+                mEabControllerSub1.getCapabilities(contactUriList).size());
         Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
-                mEabController.getCapabilities(contactUriList).get(0).getStatus());
+                mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
     }
 
     @Test
@@ -187,15 +194,15 @@
 
         List<RcsContactUceCapability> contactList = new ArrayList<>();
         contactList.add(createPresenceNonRcsCapability());
-        mEabController.saveCapabilities(contactList);
+        mEabControllerSub1.saveCapabilities(contactList);
 
         // Verify result is expired
         List<Uri> contactUriList = new ArrayList<>();
         contactUriList.add(TEST_CONTACT_URI);
         Assert.assertEquals(1,
-                mEabController.getCapabilities(contactUriList).size());
+                mEabControllerSub1.getCapabilities(contactUriList).size());
         Assert.assertEquals(EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE,
-                mEabController.getCapabilities(contactUriList).get(0).getStatus());
+                mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
     }
 
     @Test
@@ -209,7 +216,7 @@
         data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, -1);
         mContext.getContentResolver().insert(COMMON_URI, data);
 
-        mExecutor.execute(mEabController.mCapabilityCleanupRunnable);
+        mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
         mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);
 
         // Verify the entry that cannot map to presence/option table has been removed
@@ -242,7 +249,7 @@
                 expiredDate.getTime().getTime() / 1000);
         mContext.getContentResolver().insert(PRESENCE_URI, data);
 
-        mExecutor.execute(mEabController.mCapabilityCleanupRunnable);
+        mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
         mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);
 
         // Verify the invalid data has been removed after save capabilities
@@ -275,7 +282,7 @@
                 expiredDate.getTime().getTime() / 1000);
         mContext.getContentResolver().insert(OPTIONS_URI, data);
 
-        mExecutor.execute(mEabController.mCapabilityCleanupRunnable);
+        mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
         mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);
 
         // Verify the invalid data has been removed after save capabilities
@@ -289,6 +296,23 @@
         }
     }
 
+    @Test
+    @SmallTest
+    public void testSaveCapabilityForDifferentSubId() {
+        List<RcsContactUceCapability> contactList = new ArrayList<>();
+        contactList.add(createPresenceCapability());
+
+        mEabControllerSub1.saveCapabilities(contactList);
+        mEabControllerSub2.saveCapabilities(contactList);
+
+        List<Uri> contactUriList = new ArrayList<>();
+        contactUriList.add(TEST_CONTACT_URI);
+        Assert.assertEquals(1,
+                mEabControllerSub1.getCapabilities(contactUriList).size());
+        Assert.assertEquals(1,
+                mEabControllerSub2.getCapabilities(contactUriList).size());
+    }
+
     private RcsContactUceCapability createPresenceCapability() {
         RcsContactPresenceTuple.ServiceCapabilities.Builder serviceCapabilitiesBuilder =
                 new RcsContactPresenceTuple.ServiceCapabilities.Builder(TEST_AUDIO_CAPABLE,
diff --git a/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java
index 3c22e0e..6d09ebf 100644
--- a/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java
+++ b/tests/src/com/android/ims/rcs/uce/eab/EabProviderTest.java
@@ -117,17 +117,19 @@
 
     @Test
     @SmallTest
-    public void testCommonIsUnique() {
+    public void testCommonIsNotUnique() {
         ContentValues data = new ContentValues();
         data.put(EabProvider.EabCommonColumns.EAB_CONTACT_ID, 1);
         data.put(EabProvider.EabCommonColumns.MECHANISM, CAPABILITY_MECHANISM_PRESENCE);
         data.put(EabProvider.EabCommonColumns.REQUEST_RESULT, REQUEST_RESULT_FOUND);
+        data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, 1);
         mContext.getContentResolver().insert(COMMON_URI, data);
 
         data = new ContentValues();
         data.put(EabProvider.EabCommonColumns.EAB_CONTACT_ID, 1);
         data.put(EabProvider.EabCommonColumns.MECHANISM, CAPABILITY_MECHANISM_PRESENCE);
         data.put(EabProvider.EabCommonColumns.REQUEST_RESULT, REQUEST_RESULT_FOUND);
+        data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, 2);
         mContext.getContentResolver().insert(COMMON_URI, data);
 
         Cursor cursor = mContext.getContentResolver().query(COMMON_URI,
@@ -136,7 +138,7 @@
                 null,
                 null);
 
-        assertEquals(1, cursor.getCount());
+        assertEquals(2, cursor.getCount());
     }
 
     @Test
