diff --git a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
index 0f33aa2..9da9cc1 100644
--- a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
+++ b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
@@ -80,22 +80,30 @@
 
     @Override
     protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
-        ((Listener) cookie).onQueryComplete(token, cookie, cursor);
+        if (cookie != null) {
+            ((Listener) cookie).onQueryComplete(token, cookie, cursor);
+        }
     }
 
     @Override
     protected void onInsertComplete(int token, Object cookie, Uri uri) {
-        ((Listener) cookie).onInsertComplete(token, cookie, uri);
+        if (cookie != null) {
+            ((Listener) cookie).onInsertComplete(token, cookie, uri);
+        }
     }
 
     @Override
     protected void onUpdateComplete(int token, Object cookie, int result) {
-        ((Listener) cookie).onUpdateComplete(token, cookie, result);
+        if (cookie != null) {
+            ((Listener) cookie).onUpdateComplete(token, cookie, result);
+        }
     }
 
     @Override
     protected void onDeleteComplete(int token, Object cookie, int result) {
-        ((Listener) cookie).onDeleteComplete(token, cookie, result);
+        if (cookie != null) {
+            ((Listener) cookie).onDeleteComplete(token, cookie, result);
+        }
     }
 
     private static Uri getContentUri(Integer id) {
@@ -106,6 +114,12 @@
         return uri;
     }
 
+    public final void incrementFilteredCount(Integer id) {
+        startUpdate(NO_TOKEN, null,
+                ContentUris.withAppendedId(FilteredNumber.CONTENT_URI_INCREMENT_FILTERED_COUNT, id),
+                null, null, null);
+    }
+
     /**
      * Check if the number + country iso given has been blocked.
      * This method normalizes the number for the lookup if normalizedNumber is null.
diff --git a/src/com/android/dialer/database/FilteredNumberContract.java b/src/com/android/dialer/database/FilteredNumberContract.java
index 38c49dc..f396681 100644
--- a/src/com/android/dialer/database/FilteredNumberContract.java
+++ b/src/com/android/dialer/database/FilteredNumberContract.java
@@ -16,13 +16,8 @@
 
 package com.android.dialer.database;
 
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.database.Cursor;
 import android.net.Uri;
 import android.provider.BaseColumns;
-import android.telephony.PhoneNumberUtils;
 
 import com.android.dialerbind.ObjectFactory;
 
@@ -137,11 +132,17 @@
     public static class FilteredNumber implements BaseColumns {
 
         public static final String FILTERED_NUMBERS_TABLE = "filtered_numbers_table";
+        public static final String FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT =
+                "filtered_numbers_increment_filtered_count";
 
         public static final Uri CONTENT_URI = Uri.withAppendedPath(
                 AUTHORITY_URI,
                 FILTERED_NUMBERS_TABLE);
 
+        public static final Uri CONTENT_URI_INCREMENT_FILTERED_COUNT = Uri.withAppendedPath(
+                AUTHORITY_URI,
+                FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT);
+
         /**
          * This utility class cannot be instantiated.
          */
diff --git a/src/com/android/dialer/database/FilteredNumberProvider.java b/src/com/android/dialer/database/FilteredNumberProvider.java
index 2bea7ca..acb5e7f 100644
--- a/src/com/android/dialer/database/FilteredNumberProvider.java
+++ b/src/com/android/dialer/database/FilteredNumberProvider.java
@@ -22,12 +22,12 @@
 import android.content.Context;
 import android.content.UriMatcher;
 import android.database.Cursor;
+import android.database.SQLException;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteQueryBuilder;
 import android.net.Uri;
 import android.os.Binder;
 import android.text.TextUtils;
-import android.text.format.Time;
 import android.util.Log;
 
 import com.android.contacts.common.GeoUtil;
@@ -49,6 +49,7 @@
 
     private static final int FILTERED_NUMBERS_TABLE = 1;
     private static final int FILTERED_NUMBERS_TABLE_ID = 2;
+    private static final int FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT = 3;
 
     private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
 
@@ -64,6 +65,10 @@
         sUriMatcher.addURI(ObjectFactory.getFilteredNumberProviderAuthority(),
                 FilteredNumberContract.FilteredNumber.FILTERED_NUMBERS_TABLE + "/#",
                 FILTERED_NUMBERS_TABLE_ID);
+        sUriMatcher.addURI(ObjectFactory.getFilteredNumberProviderAuthority(),
+                FilteredNumberContract.FilteredNumber.FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT
+                        + "/#",
+                FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT);
         return true;
     }
 
@@ -121,9 +126,7 @@
 
     @VisibleForTesting
     protected long getCurrentTimeMs() {
-        Time timeNow = new Time();
-        timeNow.setToNow();
-        return timeNow.toMillis(false);
+        return System.currentTimeMillis();
     }
 
     private void setDefaultValues(ContentValues values) {
@@ -171,6 +174,20 @@
             case FILTERED_NUMBERS_TABLE_ID:
                 selection = getSelectionWithId(selection, ContentUris.parseId(uri));
                 break;
+            case FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT:
+                final long id = ContentUris.parseId(uri);
+                try {
+                    db.execSQL(" UPDATE " + DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE
+                            + " SET" + FilteredNumberColumns.TIMES_FILTERED + "="
+                            + FilteredNumberColumns.TIMES_FILTERED + "+1,"
+                            + FilteredNumberColumns.LAST_TIME_FILTERED + "="
+                            + getCurrentTimeMs()
+                            + " WHERE " + FilteredNumberColumns._ID + "=" + id);
+                } catch (SQLException e) {
+                    Log.d(TAG, "Could not update blocked statistics for " + id);
+                    return 0;
+                }
+                return 1;
             default:
                 throw new IllegalArgumentException("Unknown uri: " + uri);
         }
