diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 10ea098..5769962 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -100,11 +100,10 @@
                   android:writePermission="android.permission.MODIFY_PHONE_STATE" />
 
         <provider android:name="CellBroadcastProvider"
-                  android:authorities="cellbroadcasts"
+                  android:authorities="cellbroadcasts_fwk"
                   android:exported="true"
                   android:singleUser="true"
-                  android:multiprocess="false"
-                  android:readPermission="android.permission.READ_CELL_BROADCASTS" />
+                  android:multiprocess="false" />
 
         <provider android:name="HbpcdLookupProvider"
                   android:authorities="hbpcd_lookup"
diff --git a/src/com/android/providers/telephony/CellBroadcastProvider.java b/src/com/android/providers/telephony/CellBroadcastProvider.java
index 3c6c51c..c50fbf2 100644
--- a/src/com/android/providers/telephony/CellBroadcastProvider.java
+++ b/src/com/android/providers/telephony/CellBroadcastProvider.java
@@ -78,7 +78,10 @@
 
     /** Authority string for content URIs. */
     @VisibleForTesting
-    public static final String AUTHORITY = "cellbroadcasts";
+    public static final String AUTHORITY = "cellbroadcasts_fwk";
+
+    /** Content uri of this provider. */
+    public static final Uri CONTENT_URI = Uri.parse("content://cellbroadcasts_fwk");
 
     @VisibleForTesting
     public PermissionChecker mPermissionChecker;
@@ -171,9 +174,9 @@
                 long row = getWritableDatabase().insertOrThrow(CELL_BROADCASTS_TABLE_NAME, null,
                         values);
                 if (row > 0) {
-                    Uri newUri = ContentUris.withAppendedId(CellBroadcasts.CONTENT_URI, row);
+                    Uri newUri = ContentUris.withAppendedId(CONTENT_URI, row);
                     getContext().getContentResolver()
-                            .notifyChange(CellBroadcasts.CONTENT_URI, null /* observer */);
+                            .notifyChange(CONTENT_URI, null /* observer */);
                     return newUri;
                 } else {
                     Log.e(TAG, "Insert record failed because of unknown reason, uri = " + uri);
@@ -300,14 +303,14 @@
     private class CellBroadcastPermissionChecker implements PermissionChecker {
         @Override
         public boolean hasWritePermission() {
-            // Only the phone process has the write permission for CellBroadcast content provider.
+            // Only the phone process has the write permission to modify this provider. 
             return Binder.getCallingUid() == Process.PHONE_UID;
         }
 
         @Override
         public boolean hasReadPermission() {
-            return getContext().checkCallingOrSelfPermission(
-                    "android.permission.READ_CELL_BROADCASTS") == PackageManager.PERMISSION_GRANTED;
+            // Only the phone process has the read permission to query data from this provider. 
+            return Binder.getCallingUid() == Process.PHONE_UID;
         }
     }
 }
diff --git a/tests/src/com/android/providers/telephony/CellBroadcastProviderTest.java b/tests/src/com/android/providers/telephony/CellBroadcastProviderTest.java
index 517572e..b5ff07b 100644
--- a/tests/src/com/android/providers/telephony/CellBroadcastProviderTest.java
+++ b/tests/src/com/android/providers/telephony/CellBroadcastProviderTest.java
@@ -40,6 +40,8 @@
 public class CellBroadcastProviderTest extends TestCase {
     private static final String TAG = CellBroadcastProviderTest.class.getSimpleName();
 
+    public static final Uri CONTENT_URI = Uri.parse("content://cellbroadcasts_fwk");
+
     private static final int GEO_SCOPE = 1;
     private static final String PLMN = "123456";
     private static final int LAC = 13;
@@ -117,7 +119,7 @@
     public void testUpdate() {
         // Insert a cellbroadcast to the database.
         ContentValues cv = fakeCellBroadcast();
-        Uri uri = mContentResolver.insert(CellBroadcasts.CONTENT_URI, cv);
+        Uri uri = mContentResolver.insert(CONTENT_URI, cv);
         assertThat(uri).isNotNull();
 
         // Change some fields of this cell broadcast.
@@ -125,11 +127,11 @@
         int receivedTime = 1234555555;
         cv.put(CellBroadcasts.MESSAGE_BROADCASTED, messageBroadcasted);
         cv.put(CellBroadcasts.RECEIVED_TIME, receivedTime);
-        mContentResolver.update(CellBroadcasts.CONTENT_URI, cv, SELECT_BY_ID,
+        mContentResolver.update(CONTENT_URI, cv, SELECT_BY_ID,
                 new String[] { uri.getLastPathSegment() });
 
         // Query and check if the update is successed.
-        Cursor cursor = mContentResolver.query(CellBroadcasts.CONTENT_URI, QUERY_COLUMNS,
+        Cursor cursor = mContentResolver.query(CONTENT_URI, QUERY_COLUMNS,
                 SELECT_BY_ID, new String[] { uri.getLastPathSegment() }, null /* orderBy */);
         cursor.moveToNext();
 
@@ -143,14 +145,14 @@
     @Test
     public void testUpdate_WithoutWritePermission_fail() {
         ContentValues cv = fakeCellBroadcast();
-        Uri uri = mContentResolver.insert(CellBroadcasts.CONTENT_URI, cv);
+        Uri uri = mContentResolver.insert(CONTENT_URI, cv);
         assertThat(uri).isNotNull();
 
         // Revoke the write permission
         doReturn(false).when(mMockPermissionChecker).hasWritePermission();
 
         try {
-            mContentResolver.update(CellBroadcasts.CONTENT_URI, cv, SELECT_BY_ID,
+            mContentResolver.update(CONTENT_URI, cv, SELECT_BY_ID,
                     new String[] { uri.getLastPathSegment() });
             fail();
         } catch (SecurityException ex) {
@@ -165,19 +167,19 @@
         ContentValues cv = fakeCellBroadcast();
         cv.put(CellBroadcasts.MESSAGE_BROADCASTED, 0);
         for (int i = 0; i < messageNotBroadcastedCount; i++) {
-            mContentResolver.insert(CellBroadcasts.CONTENT_URI, cv);
+            mContentResolver.insert(CONTENT_URI, cv);
         }
 
         // Insert some cell broadcasts which message_broadcasted is true
         int messageBroadcastedCount = 6;
         cv.put(CellBroadcasts.MESSAGE_BROADCASTED, 1);
         for (int i = 0; i < messageBroadcastedCount; i++) {
-            mContentResolver.insert(CellBroadcasts.CONTENT_URI, cv);
+            mContentResolver.insert(CONTENT_URI, cv);
         }
 
         // Query the broadcast with message_broadcasted is false
         Cursor cursor = mContentResolver.query(
-                CellBroadcasts.CONTENT_URI,
+                CONTENT_URI,
                 QUERY_COLUMNS,
                 String.format("%s=?", CellBroadcasts.MESSAGE_BROADCASTED), /* selection */
                 new String[] {"0"}, /* selectionArgs */
@@ -187,14 +189,14 @@
 
     @Test
     public void testDelete_withoutWritePermission_throwSecurityException() {
-        Uri uri = mContentResolver.insert(CellBroadcasts.CONTENT_URI, fakeCellBroadcast());
+        Uri uri = mContentResolver.insert(CONTENT_URI, fakeCellBroadcast());
         assertThat(uri).isNotNull();
 
         // Revoke the write permission
         doReturn(false).when(mMockPermissionChecker).hasWritePermission();
 
         try {
-            mContentResolver.delete(CellBroadcasts.CONTENT_URI, SELECT_BY_ID,
+            mContentResolver.delete(CONTENT_URI, SELECT_BY_ID,
                     new String[] { uri.getLastPathSegment() });
             fail();
         } catch (SecurityException ex) {
@@ -207,24 +209,24 @@
     public void testDelete_oneRecord_success() {
         // Insert a cellbroadcast to the database.
         ContentValues cv = fakeCellBroadcast();
-        Uri uri = mContentResolver.insert(CellBroadcasts.CONTENT_URI, cv);
+        Uri uri = mContentResolver.insert(CONTENT_URI, cv);
         assertThat(uri).isNotNull();
 
         String[] selectionArgs = new String[] { uri.getLastPathSegment() };
 
         // Ensure the cell broadcast is inserted.
-        Cursor cursor = mContentResolver.query(CellBroadcasts.CONTENT_URI, QUERY_COLUMNS,
+        Cursor cursor = mContentResolver.query(CONTENT_URI, QUERY_COLUMNS,
                 SELECT_BY_ID, selectionArgs, null /* orderBy */);
         assertThat(cursor.getCount()).isEqualTo(1);
         cursor.close();
 
         // Delete the cell broadcast
-        int rowCount = mContentResolver.delete(CellBroadcasts.CONTENT_URI, SELECT_BY_ID,
+        int rowCount = mContentResolver.delete(CONTENT_URI, SELECT_BY_ID,
                 selectionArgs);
         assertThat(rowCount).isEqualTo(1);
 
         // Ensure the cell broadcast is deleted.
-        cursor = mContentResolver.query(CellBroadcasts.CONTENT_URI, QUERY_COLUMNS, SELECT_BY_ID,
+        cursor = mContentResolver.query(CONTENT_URI, QUERY_COLUMNS, SELECT_BY_ID,
                 selectionArgs, null /* orderBy */);
         assertThat(cursor.getCount()).isEqualTo(0);
         cursor.close();
@@ -233,23 +235,23 @@
     @Test
     public void testDelete_all_success() {
         // Insert a cellbroadcast to the database.
-        mContentResolver.insert(CellBroadcasts.CONTENT_URI, fakeCellBroadcast());
-        mContentResolver.insert(CellBroadcasts.CONTENT_URI, fakeCellBroadcast());
+        mContentResolver.insert(CONTENT_URI, fakeCellBroadcast());
+        mContentResolver.insert(CONTENT_URI, fakeCellBroadcast());
 
         // Ensure the cell broadcast are inserted.
-        Cursor cursor = mContentResolver.query(CellBroadcasts.CONTENT_URI, QUERY_COLUMNS,
+        Cursor cursor = mContentResolver.query(CONTENT_URI, QUERY_COLUMNS,
                 null /* selection */, null /* selectionArgs */, null /* orderBy */);
         assertThat(cursor.getCount()).isEqualTo(2);
         cursor.close();
 
         // Delete all cell broadcasts.
         int rowCount = mContentResolver.delete(
-                CellBroadcasts.CONTENT_URI, null /* selection */, null /* selectionArgs */);
+                CONTENT_URI, null /* selection */, null /* selectionArgs */);
         assertThat(rowCount).isEqualTo(2);
         cursor.close();
 
         // Ensure all cell broadcasts are deleted.
-        cursor = mContentResolver.query(CellBroadcasts.CONTENT_URI, QUERY_COLUMNS,
+        cursor = mContentResolver.query(CONTENT_URI, QUERY_COLUMNS,
                 null /* selection */, null /* selectionArgs */, null /* orderBy */);
         assertThat(cursor.getCount()).isEqualTo(0);
         cursor.close();
@@ -260,7 +262,7 @@
         doReturn(false).when(mMockPermissionChecker).hasWritePermission();
 
         try {
-            mContentResolver.insert(CellBroadcasts.CONTENT_URI, fakeCellBroadcast());
+            mContentResolver.insert(CONTENT_URI, fakeCellBroadcast());
             fail();
         } catch (SecurityException ex) {
             // pass the test
@@ -270,13 +272,13 @@
     @Test
     public void testInsertAndQuery() {
         // Insert a cell broadcast message
-        Uri uri = mContentResolver.insert(CellBroadcasts.CONTENT_URI, fakeCellBroadcast());
+        Uri uri = mContentResolver.insert(CONTENT_URI, fakeCellBroadcast());
 
         // Verify that the return uri is not null and the record is inserted into the database
         // correctly.
         assertThat(uri).isNotNull();
         Cursor cursor = mContentResolver.query(
-                CellBroadcasts.CONTENT_URI, QUERY_COLUMNS, SELECT_BY_ID,
+                CONTENT_URI, QUERY_COLUMNS, SELECT_BY_ID,
                 new String[] { uri.getLastPathSegment() }, null /* orderBy */);
         assertThat(cursor.getCount()).isEqualTo(1);
 
