diff --git a/src/com/android/contacts/callblocking/BlockNumberDialogFragment.java b/src/com/android/contacts/callblocking/BlockNumberDialogFragment.java
index 80ad1f7..c9b5314 100644
--- a/src/com/android/contacts/callblocking/BlockNumberDialogFragment.java
+++ b/src/com/android/contacts/callblocking/BlockNumberDialogFragment.java
@@ -82,7 +82,7 @@
     private Callback mCallback;
 
     public static void show(
-            Integer blockId,
+            Long blockId,
             String number,
             String countryIso,
             String displayNumber,
@@ -97,7 +97,7 @@
     }
 
     private static BlockNumberDialogFragment newInstance(
-            Integer blockId,
+            Long blockId,
             String number,
             String countryIso,
             String displayNumber,
diff --git a/src/com/android/contacts/callblocking/BlockedNumbersAdapter.java b/src/com/android/contacts/callblocking/BlockedNumbersAdapter.java
index 2e31f71..db76737 100644
--- a/src/com/android/contacts/callblocking/BlockedNumbersAdapter.java
+++ b/src/com/android/contacts/callblocking/BlockedNumbersAdapter.java
@@ -19,13 +19,13 @@
 import android.app.FragmentManager;
 import android.content.Context;
 import android.database.Cursor;
+import android.provider.BlockedNumberContract.BlockedNumbers;
 import android.telephony.PhoneNumberUtils;
 import android.view.View;
 
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.GeoUtil;
 import com.android.contacts.R;
-import com.android.contacts.callblocking.FilteredNumberContract.FilteredNumberColumns;
 
 public class BlockedNumbersAdapter extends NumbersAdapter {
     private BlockedNumbersAdapter(
@@ -48,10 +48,10 @@
     @Override
     public void bindView(View view, final Context context, Cursor cursor) {
         super.bindView(view, context, cursor);
-        final Integer id = cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns._ID));
-        final String countryIso = cursor.getString(cursor.getColumnIndex(
-                FilteredNumberColumns.COUNTRY_ISO));
-        final String number = cursor.getString(cursor.getColumnIndex(FilteredNumberColumns.NUMBER));
+        final Long id = cursor.getLong(cursor.getColumnIndex(BlockedNumbers.COLUMN_ID));
+        final String countryIso = GeoUtil.getCurrentCountryIso(context);
+        final String number = cursor.getString(
+                cursor.getColumnIndex(BlockedNumbers.COLUMN_ORIGINAL_NUMBER));
 
         final View deleteButton = view.findViewById(R.id.delete_button);
         deleteButton.setOnClickListener(new View.OnClickListener() {
diff --git a/src/com/android/contacts/callblocking/BlockedNumbersFragment.java b/src/com/android/contacts/callblocking/BlockedNumbersFragment.java
index fbdfa00..6680cca 100644
--- a/src/com/android/contacts/callblocking/BlockedNumbersFragment.java
+++ b/src/com/android/contacts/callblocking/BlockedNumbersFragment.java
@@ -24,6 +24,7 @@
 import android.database.Cursor;
 import android.graphics.drawable.ColorDrawable;
 import android.os.Bundle;
+import android.provider.BlockedNumberContract.BlockedNumbers;
 import android.support.v4.app.ActivityCompat;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.AppCompatActivity;
@@ -141,16 +142,12 @@
     @Override
     public Loader<Cursor> onCreateLoader(int id, Bundle args) {
         final String[] projection = {
-            FilteredNumberContract.FilteredNumberColumns._ID,
-            FilteredNumberContract.FilteredNumberColumns.COUNTRY_ISO,
-            FilteredNumberContract.FilteredNumberColumns.NUMBER,
-            FilteredNumberContract.FilteredNumberColumns.NORMALIZED_NUMBER
+            BlockedNumbers.COLUMN_ID,
+            BlockedNumbers.COLUMN_ORIGINAL_NUMBER,
+            BlockedNumbers.COLUMN_E164_NUMBER
         };
-        final String selection = FilteredNumberContract.FilteredNumberColumns.TYPE
-                + "=" + FilteredNumberContract.FilteredNumberTypes.BLOCKED_NUMBER;
         final CursorLoader cursorLoader = new CursorLoader(
-                getContext(), FilteredNumberContract.FilteredNumber.CONTENT_URI, projection,
-                selection, null, null);
+                getContext(), BlockedNumbers.CONTENT_URI, projection, null, null, null);
         return cursorLoader;
     }
 
diff --git a/src/com/android/contacts/callblocking/FilteredNumberAsyncQueryHandler.java b/src/com/android/contacts/callblocking/FilteredNumberAsyncQueryHandler.java
index 51f6991..f7f67eb 100644
--- a/src/com/android/contacts/callblocking/FilteredNumberAsyncQueryHandler.java
+++ b/src/com/android/contacts/callblocking/FilteredNumberAsyncQueryHandler.java
@@ -24,14 +24,10 @@
 import android.database.DatabaseUtils;
 import android.database.sqlite.SQLiteDatabaseCorruptException;
 import android.net.Uri;
+import android.provider.BlockedNumberContract.BlockedNumbers;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 
-import com.android.contacts.callblocking.FilteredNumberContract.FilteredNumber;
-import com.android.contacts.callblocking.FilteredNumberContract.FilteredNumberColumns;
-import com.android.contacts.callblocking.FilteredNumberContract.FilteredNumberSources;
-import com.android.contacts.callblocking.FilteredNumberContract.FilteredNumberTypes;
-
 public class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler {
     private static final int NO_TOKEN = 0;
 
@@ -58,7 +54,7 @@
          * Invoked after querying if a number is blocked.
          * @param id The ID of the row if blocked, null otherwise.
          */
-        void onCheckComplete(Integer id);
+        void onCheckComplete(Long id);
     }
 
     public interface OnBlockNumberListener {
@@ -78,14 +74,6 @@
         void onUnblockComplete(int rows, ContentValues values);
     }
 
-    public interface OnHasBlockedNumbersListener {
-        /**
-         * @param hasBlockedNumbers {@code true} if any blocked numbers are stored.
-         *     {@code false} otherwise.
-         */
-        void onHasBlockedNumbers(boolean hasBlockedNumbers);
-    }
-
     @Override
     protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
         if (cookie != null) {
@@ -114,27 +102,6 @@
         }
     }
 
-    public final void incrementFilteredCount(Integer id) {
-        startUpdate(NO_TOKEN, null,
-                ContentUris.withAppendedId(FilteredNumber.CONTENT_URI_INCREMENT_FILTERED_COUNT, id),
-                null, null, null);
-    }
-
-    public final void hasBlockedNumbers(final OnHasBlockedNumbersListener listener) {
-        startQuery(NO_TOKEN,
-                new Listener() {
-                    @Override
-                    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
-                        listener.onHasBlockedNumbers(cursor != null && cursor.getCount() > 0);
-                    }
-                },
-                FilteredNumber.CONTENT_URI,
-                new String[]{ FilteredNumberColumns._ID },
-                FilteredNumberColumns.TYPE + "=" + FilteredNumberTypes.BLOCKED_NUMBER,
-                null,
-                null);
-    }
-
     /**
      * Check if this number has been blocked.
      *
@@ -157,18 +124,13 @@
                             return;
                         }
                         cursor.moveToFirst();
-                        if (cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns.TYPE))
-                                != FilteredNumberTypes.BLOCKED_NUMBER) {
-                            listener.onCheckComplete(null);
-                            return;
-                        }
-                        listener.onCheckComplete(
-                                cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns._ID)));
+                        listener.onCheckComplete(cursor.getLong(
+                                        cursor.getColumnIndex(BlockedNumbers.COLUMN_ID)));
                     }
                 },
-                FilteredNumber.CONTENT_URI,
-                new String[]{ FilteredNumberColumns._ID, FilteredNumberColumns.TYPE },
-                FilteredNumberColumns.NORMALIZED_NUMBER + " = ?",
+                BlockedNumbers.CONTENT_URI,
+                new String[]{ BlockedNumbers.COLUMN_ID},
+                BlockedNumbers.COLUMN_E164_NUMBER + " = ?",
                 new String[]{ normalizedNumber },
                 null);
 
@@ -192,11 +154,8 @@
             normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
         }
         ContentValues v = new ContentValues();
-        v.put(FilteredNumberColumns.NORMALIZED_NUMBER, normalizedNumber);
-        v.put(FilteredNumberColumns.NUMBER, number);
-        v.put(FilteredNumberColumns.COUNTRY_ISO, countryIso);
-        v.put(FilteredNumberColumns.TYPE, FilteredNumberTypes.BLOCKED_NUMBER);
-        v.put(FilteredNumberColumns.SOURCE, FilteredNumberSources.USER);
+        v.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number);
+        v.put(BlockedNumbers.COLUMN_E164_NUMBER, normalizedNumber);
         blockNumber(listener, v);
     }
 
@@ -213,7 +172,7 @@
                             listener.onBlockComplete(uri);
                         }
                     }
-                }, FilteredNumber.CONTENT_URI, values);
+                }, BlockedNumbers.CONTENT_URI, values);
     }
 
     /**
@@ -225,7 +184,7 @@
         if (id == null) {
             throw new IllegalArgumentException("Null id passed into unblock");
         }
-        unblock(listener, ContentUris.withAppendedId(FilteredNumber.CONTENT_URI, id));
+        unblock(listener, ContentUris.withAppendedId(BlockedNumbers.CONTENT_URI, id));
     }
 
     /**
@@ -246,7 +205,7 @@
                 cursor.moveToFirst();
                 final ContentValues values = new ContentValues();
                 DatabaseUtils.cursorRowToContentValues(cursor, values);
-                values.remove(FilteredNumberColumns._ID);
+                values.remove(BlockedNumbers.COLUMN_ID);
 
                 startDelete(NO_TOKEN, new Listener() {
                     @Override
diff --git a/src/com/android/contacts/callblocking/FilteredNumberContract.java b/src/com/android/contacts/callblocking/FilteredNumberContract.java
deleted file mode 100644
index 9f66240..0000000
--- a/src/com/android/contacts/callblocking/FilteredNumberContract.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2016 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.contacts.callblocking;
-
-import android.net.Uri;
-import android.provider.BaseColumns;
-
-/**
- * <p>
- * The contract between the filtered number provider and applications. Contains
- * definitions for the supported URIs and columns.
- * </p>
- */
-public final class FilteredNumberContract {
-
-    /** The authority for the filtered numbers provider
-     *  Contacts should use this authority from GoogleDialer. */
-    public static final String AUTHORITY =
-            "com.google.android.dialer.provider.filterednumberprovider";
-
-    /** A content:// style uri to the authority for the filtered numbers provider */
-    public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);
-
-    /** The type of filtering to be applied, e.g. block the number or whitelist the number. */
-    public interface FilteredNumberTypes {
-        int UNDEFINED = 0;
-        /**
-         * Dialer will disconnect the call without sending the caller to voicemail.
-         */
-        int BLOCKED_NUMBER = 1;
-    }
-
-    /** The original source of the filtered number, e.g. the user manually added it. */
-    public interface FilteredNumberSources {
-        int UNDEFINED = 0;
-        /**
-         * The user manually added this number through Dialer (e.g. from the call log or InCallUI).
-         */
-        int USER = 1;
-    }
-
-    public interface FilteredNumberColumns {
-        // TYPE: INTEGER
-        String _ID = "_id";
-        /**
-         * Represents the number to be filtered, normalized to compare phone numbers for equality.
-         *
-         * TYPE: TEXT
-         */
-        String NORMALIZED_NUMBER = "normalized_number";
-        /**
-         * Represents the number to be filtered, for formatting and
-         * used with country iso for contact lookups.
-         *
-         * TYPE: TEXT
-         */
-        String NUMBER = "number";
-        /**
-         * The country code representing the country detected when
-         * the phone number was added to the database.
-         * Most numbers don't have the country code, so a best guess is provided by
-         * the country detector system. The country iso is also needed in order to format
-         * phone numbers correctly.
-         *
-         * TYPE: TEXT
-         */
-        String COUNTRY_ISO = "country_iso";
-        /**
-         * The number of times the number has been filtered by Dialer.
-         * When this number is incremented, LAST_TIME_FILTERED should also be updated to
-         * the current time.
-         *
-         * TYPE: INTEGER
-         */
-        String TIMES_FILTERED = "times_filtered";
-        /**
-         * Set to the current time when the phone number is filtered.
-         * When this is updated, TIMES_FILTERED should also be incremented.
-         *
-         * TYPE: LONG
-         */
-        String LAST_TIME_FILTERED = "last_time_filtered";
-        // TYPE: LONG
-        String CREATION_TIME = "creation_time";
-        /**
-         * Indicates the type of filtering to be applied.
-         *
-         * TYPE: INTEGER
-         * See {@link FilteredNumberTypes}
-         */
-        String TYPE = "type";
-        /**
-         * Integer representing the original source of the filtered number.
-         *
-         * TYPE: INTEGER
-         * See {@link FilteredNumberSources}
-         */
-        String SOURCE = "source";
-    }
-
-    /**
-     * <p>
-     * Constants for the table of filtered numbers.
-     * </p>
-     * <h3>Operations</h3>
-     * <dl>
-     * <dt><b>Insert</b></dt>
-     * <dd>Required fields: NUMBER, NORMALIZED_NUMBER, TYPE, SOURCE.
-     * A default value will be used for the other fields if left null.</dd>
-     * <dt><b>Update</b></dt>
-     * <dt><b>Delete</b></dt>
-     * <dt><b>Query</b></dt>
-     * <dd>{@link #CONTENT_URI} can be used for any query, append an ID to
-     * retrieve a specific filtered number entry.</dd>
-     * </dl>
-     */
-    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.
-         */
-        private FilteredNumber () {}
-
-        /**
-         * The MIME type of {@link #CONTENT_URI} providing a directory of
-         * filtered numbers.
-         */
-        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/filtered_numbers_table";
-
-        /**
-         * The MIME type of a {@link #CONTENT_URI} single filtered number.
-         */
-        public static final String CONTENT_ITEM_TYPE =
-                "vnd.android.cursor.item/filtered_numbers_table";
-    }
-}
\ No newline at end of file
diff --git a/src/com/android/contacts/callblocking/OnListFragmentScrolledListener.java b/src/com/android/contacts/callblocking/OnListFragmentScrolledListener.java
deleted file mode 100644
index 819bcde..0000000
--- a/src/com/android/contacts/callblocking/OnListFragmentScrolledListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2016 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.contacts.callblocking;
-
-/*
- * Interface to provide callback to activity when a child fragment is scrolled
- */
-public interface OnListFragmentScrolledListener {
-    void onListFragmentScrollStateChange(int scrollState);
-}
diff --git a/src/com/android/contacts/callblocking/SearchAdapter.java b/src/com/android/contacts/callblocking/SearchAdapter.java
index ca5908f..27ca89a 100644
--- a/src/com/android/contacts/callblocking/SearchAdapter.java
+++ b/src/com/android/contacts/callblocking/SearchAdapter.java
@@ -20,12 +20,10 @@
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.telephony.PhoneNumberUtils;
-import android.text.BidiFormatter;
 import android.text.TextUtils;
 import android.view.View;
 import android.view.ViewGroup;
 
-import com.android.contacts.callblocking.FilteredNumberAsyncQueryHandler;
 import com.android.contacts.common.CallUtil;
 import com.android.contacts.common.GeoUtil;
 import com.android.contacts.common.list.ContactListItemView;
@@ -40,18 +38,14 @@
     private String mCountryIso;
 
     public final static int SHORTCUT_INVALID = -1;
-    public final static int SHORTCUT_DIRECT_CALL = 0;
     public final static int SHORTCUT_CREATE_NEW_CONTACT = 1;
     public final static int SHORTCUT_ADD_TO_EXISTING_CONTACT = 2;
-    public final static int SHORTCUT_SEND_SMS_MESSAGE = 3;
-    public final static int SHORTCUT_MAKE_VIDEO_CALL = 4;
     public final static int SHORTCUT_BLOCK_NUMBER = 5;
 
     public final static int SHORTCUT_COUNT = 6;
 
     private final boolean[] mShortcutEnabled = new boolean[SHORTCUT_COUNT];
 
-    private final BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
     private boolean mVideoCallingEnabled = false;
 
     protected boolean mIsQuerySipAddress;
@@ -236,7 +230,7 @@
         return false;
     }
 
-    public void setViewBlocked(ContactListItemView view, Integer id) {
+    public void setViewBlocked(ContactListItemView view, Long id) {
         view.setTag(R.id.block_id, id);
         final int textColor = mResources.getColor(R.color.blocked_number_block_color);
         view.getDataView().setTextColor(textColor);
@@ -265,7 +259,7 @@
         final FilteredNumberAsyncQueryHandler.OnCheckBlockedListener onCheckListener =
                 new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() {
                     @Override
-                    public void onCheckComplete(Integer id) {
+                    public void onCheckComplete(Long id) {
                         if (id != null) {
                             setViewBlocked(view, id);
                         }
diff --git a/src/com/android/contacts/callblocking/SearchFragment.java b/src/com/android/contacts/callblocking/SearchFragment.java
index a175812..d50ccf5 100644
--- a/src/com/android/contacts/callblocking/SearchFragment.java
+++ b/src/com/android/contacts/callblocking/SearchFragment.java
@@ -1,8 +1,5 @@
 package com.android.contacts.callblocking;
 
-import android.animation.Animator;
-import android.animation.AnimatorInflater;
-import android.animation.AnimatorListenerAdapter;
 import android.app.Activity;
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
@@ -53,11 +50,7 @@
 
     public static final int PERMISSION_REQUEST_CODE = 1;
     private static final int SEARCH_DIRECTORY_RESULT_LIMIT = 5;
-    // copied from packages/apps/InCallUI/src/com/android/incallui/Call.java
-    public static final int INITIATION_REMOTE_DIRECTORY = 4;
-    public static final int INITIATION_REGULAR_SEARCH = 6;
 
-    private OnListFragmentScrolledListener mActivityScrollListener;
     private View.OnTouchListener mActivityOnTouchListener;
     private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
     private EditText mSearchView;
@@ -90,7 +83,6 @@
      * Stores the untouched user-entered string that is used to populate the add to contacts
      * intent.
      */
-    private String mAddToContactNumber;
     private int mActionBarHeight;
     private int mShadowHeight;
     private int mPaddingTop;
@@ -190,13 +182,6 @@
         setDarkTheme(false);
         setPhotoPosition(ContactListItemView.getDefaultPhotoPosition(false /* opposite */));
         setUseCallableUri(true);
-
-        try {
-            mActivityScrollListener = (OnListFragmentScrolledListener) activity;
-        } catch (ClassCastException e) {
-            Log.d(TAG, activity.toString() + " doesn't implement OnListFragmentScrolledListener. " +
-                    "Ignoring.");
-        }
     }
 
     @Override
@@ -236,9 +221,6 @@
         listView.setOnScrollListener(new OnScrollListener() {
             @Override
             public void onScrollStateChanged(AbsListView view, int scrollState) {
-                if (mActivityScrollListener != null) {
-                    mActivityScrollListener.onListFragmentScrollStateChange(scrollState);
-                }
             }
 
             @Override
@@ -260,26 +242,6 @@
     }
 
     @Override
-    public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
-        Animator animator = null;
-        if (nextAnim != 0) {
-            animator = AnimatorInflater.loadAnimator(getActivity(), nextAnim);
-        }
-        if (animator != null) {
-            final View view = getView();
-            final int oldLayerType = view.getLayerType();
-            view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
-            animator.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    view.setLayerType(oldLayerType, null);
-                }
-            });
-        }
-        return animator;
-    }
-
-    @Override
     protected void setSearchMode(boolean flag) {
         super.setSearchMode(flag);
         // This hides the "All contacts with phone numbers" header in the search fragment
@@ -289,10 +251,6 @@
         }
     }
 
-    public void setAddToContactNumber(String addToContactNumber) {
-        mAddToContactNumber = addToContactNumber;
-    }
-
     @Override
     protected ContactEntryListAdapter createListAdapter() {
         SearchAdapter adapter = new SearchAdapter(getActivity());
@@ -353,7 +311,7 @@
         final int adapterPosition = position - getListView().getHeaderViewsCount();
         final SearchAdapter adapter = (SearchAdapter) getAdapter();
         final int shortcutType = adapter.getShortcutTypeFromPosition(adapterPosition);
-        final Integer blockId = (Integer) view.getTag(R.id.block_id);
+        final Long blockId = (Long) view.getTag(R.id.block_id);
         final String number;
         switch (shortcutType) {
             case SearchAdapter.SHORTCUT_INVALID:
@@ -376,7 +334,7 @@
         final String countryIso = GeoUtil.getCurrentCountryIso(getContext());
         final OnCheckBlockedListener onCheckListener = new OnCheckBlockedListener() {
             @Override
-            public void onCheckComplete(Integer id) {
+            public void onCheckComplete(Long id) {
                 if (id == null) {
                     BlockNumberDialogFragment.show(
                             id,
@@ -497,11 +455,6 @@
     }
 
     @Override
-    protected int getCallInitiationType(boolean isRemoteDirectory) {
-        return isRemoteDirectory ? INITIATION_REMOTE_DIRECTORY : INITIATION_REGULAR_SEARCH;
-    }
-
-    @Override
     public void onFilterNumberSuccess() {
         goBack();
     }
@@ -525,7 +478,7 @@
         getAdapter().notifyDataSetChanged();
     }
 
-    private void blockContactNumber(final String number, final Integer blockId) {
+    private void blockContactNumber(final String number, final Long blockId) {
         if (blockId != null) {
             Toast.makeText(getContext(), ContactDisplayUtils.getTtsSpannedPhoneNumber(
                             getResources(), R.string.alreadyBlocked, number),
@@ -533,10 +486,10 @@
             return;
         }
 
-        com.android.contacts.callblocking.BlockNumberDialogFragment.show(
+        BlockNumberDialogFragment.show(
                 blockId,
                 number,
-                com.android.contacts.common.GeoUtil.getCurrentCountryIso(getContext()),
+                GeoUtil.getCurrentCountryIso(getContext()),
                 number,
                 R.id.blocked_numbers_activity_container,
                 getFragmentManager(),
diff --git a/src/com/android/contacts/callblocking/ViewNumbersToImportAdapter.java b/src/com/android/contacts/callblocking/ViewNumbersToImportAdapter.java
index c5a14a6..224e085 100644
--- a/src/com/android/contacts/callblocking/ViewNumbersToImportAdapter.java
+++ b/src/com/android/contacts/callblocking/ViewNumbersToImportAdapter.java
@@ -24,9 +24,6 @@
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.GeoUtil;
 import com.android.contacts.R;
-import com.android.contacts.callblocking.ContactInfoHelper;
-import com.android.contacts.callblocking.FilteredNumbersUtil;
-import com.android.contacts.callblocking.NumbersAdapter;
 
 public class ViewNumbersToImportAdapter extends NumbersAdapter {
 
diff --git a/src/com/android/contacts/callblocking/ViewNumbersToImportFragment.java b/src/com/android/contacts/callblocking/ViewNumbersToImportFragment.java
index d75ade5..f756195 100644
--- a/src/com/android/contacts/callblocking/ViewNumbersToImportFragment.java
+++ b/src/com/android/contacts/callblocking/ViewNumbersToImportFragment.java
@@ -22,24 +22,17 @@
 import android.content.CursorLoader;
 import android.content.Loader;
 import android.database.Cursor;
-import android.os.AsyncTask;
 import android.os.Bundle;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.Contacts;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.AppCompatActivity;
-import android.text.TextUtils;
-import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
 import com.android.contacts.R;
-import com.android.contacts.callblocking.FilteredNumberContract;
-import com.android.contacts.callblocking.FilteredNumbersUtil;
 import com.android.contacts.callblocking.FilteredNumbersUtil.ImportSendToVoicemailContactsListener;
 
-
 public class ViewNumbersToImportFragment extends ListFragment
         implements LoaderManager.LoaderCallbacks<Cursor>,
         View.OnClickListener {
