diff --git a/src/com/android/providers/telephony/CarrierIdProvider.java b/src/com/android/providers/telephony/CarrierIdProvider.java
index 7acea68..95b17e4 100644
--- a/src/com/android/providers/telephony/CarrierIdProvider.java
+++ b/src/com/android/providers/telephony/CarrierIdProvider.java
@@ -23,6 +23,7 @@
 import android.content.SharedPreferences;
 import android.content.UriMatcher;
 import android.database.Cursor;
+import android.database.MatrixCursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
 import android.database.sqlite.SQLiteQueryBuilder;
@@ -70,12 +71,13 @@
     private static final int DATABASE_VERSION = 3;
 
     private static final String ASSETS_PB_FILE = "carrier_list.pb";
-    private static final String VERSION_PREF_KEY = "version";
+    private static final String VERSION_KEY = "version";
     private static final String OTA_UPDATED_PB_PATH = "misc/carrierid/" + ASSETS_PB_FILE;
     private static final String PREF_FILE = CarrierIdProvider.class.getSimpleName();
 
     private static final UriMatcher s_urlMatcher = new UriMatcher(UriMatcher.NO_MATCH);
     private static final int URL_UPDATE_FROM_PB = 1;
+    private static final int URL_GET_VERSION    = 2;
 
     /**
      * index 0: {@link CarrierIdentification#MCCMNC}
@@ -162,6 +164,7 @@
         mDbHelper = new CarrierIdDatabaseHelper(getContext());
         mDbHelper.getReadableDatabase();
         s_urlMatcher.addURI(AUTHORITY, "update_db", URL_UPDATE_FROM_PB);
+        s_urlMatcher.addURI(AUTHORITY, "get_version", URL_GET_VERSION);
         initDatabaseFromPb(mDbHelper.getWritableDatabase());
         return true;
     }
@@ -182,11 +185,20 @@
                     + " selection=" + selection
                     + " selectionArgs=" + Arrays.toString(selectionArgs));
         }
-        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
-        qb.setTables(CARRIER_ID_TABLE);
 
-        SQLiteDatabase db = getReadableDatabase();
-        return qb.query(db, projectionIn, selection, selectionArgs, null, null, sortOrder);
+        final int match = s_urlMatcher.match(uri);
+        switch (match) {
+            case URL_GET_VERSION:
+                final MatrixCursor cursor = new MatrixCursor(new String[] {VERSION_KEY});
+                cursor.addRow(new Object[] {getAppliedVersion()});
+                return cursor;
+            default:
+                SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+                qb.setTables(CARRIER_ID_TABLE);
+
+                SQLiteDatabase db = getReadableDatabase();
+                return qb.query(db, projectionIn, selection, selectionArgs, null, null, sortOrder);
+        }
     }
 
     @Override
@@ -454,13 +466,13 @@
 
     private int getAppliedVersion() {
         final SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
-        return sp.getInt(VERSION_PREF_KEY, -1);
+        return sp.getInt(VERSION_KEY, -1);
     }
 
     private void setAppliedVersion(int version) {
         final SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
         SharedPreferences.Editor editor = sp.edit();
-        editor.putInt(VERSION_PREF_KEY, version);
+        editor.putInt(VERSION_KEY, version);
         editor.apply();
     }
 
diff --git a/tests/src/com/android/providers/telephony/CarrierIdProviderTest.java b/tests/src/com/android/providers/telephony/CarrierIdProviderTest.java
index 2bf069b..be600f6 100644
--- a/tests/src/com/android/providers/telephony/CarrierIdProviderTest.java
+++ b/tests/src/com/android/providers/telephony/CarrierIdProviderTest.java
@@ -17,6 +17,7 @@
 package com.android.providers.telephony;
 
 import android.content.ContentValues;
+import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
 import android.database.ContentObserver;
@@ -24,6 +25,7 @@
 import android.database.SQLException;
 import android.net.Uri;
 import android.os.Handler;
+import android.provider.Telephony;
 import android.provider.Telephony.CarrierIdentification;
 import android.test.mock.MockContentResolver;
 import android.test.mock.MockContext;
@@ -34,6 +36,11 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
 /**
  * Tests for testing CRUD operations of CarrierIdProvider.
  * Uses CarrierIdProviderTestable to set up in-memory database
@@ -64,6 +71,7 @@
     private MockContentResolver mContentResolver;
     private CarrierIdProviderTestable mCarrierIdProviderTestable;
     private FakeContentObserver mContentObserver;
+    private SharedPreferences mSharedPreferences = mock(SharedPreferences.class);
 
     private class FakeContentResolver extends MockContentResolver {
         @Override
@@ -124,6 +132,11 @@
         public int checkCallingOrSelfPermission(String permission) {
             return PackageManager.PERMISSION_GRANTED;
         }
+
+        @Override
+        public SharedPreferences getSharedPreferences(String name, int mode) {
+            return mSharedPreferences;
+        }
     }
 
     @Override
@@ -297,6 +310,22 @@
         assertEquals(dummy_iccid_prefix, findEntry.getString(1));
     }
 
+    @Test
+    public void testGetVersion() {
+        doReturn(5).when(mSharedPreferences).getInt(eq("version"), anyInt());
+        int version = 0;
+        try {
+            Cursor cursor = mContext.getContentResolver().query(
+                    Uri.withAppendedPath(Telephony.CarrierIdentification.CONTENT_URI,
+                            "get_version"), null, null, null);
+            cursor.moveToFirst();
+            version = cursor.getInt(0);
+        } catch (Exception e) {
+            Log.d(TAG, "Error querying carrier list version:" + e);
+        }
+        assertEquals(5, version);
+    }
+
     private static ContentValues createCarrierInfoInternal() {
         ContentValues contentValues = new ContentValues();
         contentValues.put(CarrierIdentification.MCCMNC, dummy_mccmnc);
