diff --git a/src/com/android/contacts/calllog/CallLogFragment.java b/src/com/android/contacts/calllog/CallLogFragment.java
index 8996821..7e6828e 100644
--- a/src/com/android/contacts/calllog/CallLogFragment.java
+++ b/src/com/android/contacts/calllog/CallLogFragment.java
@@ -147,7 +147,7 @@
     }
 
     private CallLogAdapter mAdapter;
-    private QueryHandler mQueryHandler;
+    private CallLogQueryHandler mCallLogQueryHandler;
     private String mVoiceMailNumber;
     private String mCurrentCountryIso;
     private boolean mScrollToTop;
@@ -809,7 +809,7 @@
     }
 
     /** Handles asynchronous queries to the call log. */
-    private static final class QueryHandler extends AsyncQueryHandler {
+    private static final class CallLogQueryHandler extends AsyncQueryHandler {
         /** The token for the query to fetch the new entries from the call log. */
         private static final int QUERY_NEW_CALLS_TOKEN = 53;
         /** The token for the query to fetch the old entries from the call log. */
@@ -854,7 +854,7 @@
             return new CatchingWorkerHandler(looper);
         }
 
-        public QueryHandler(CallLogFragment fragment) {
+        public CallLogQueryHandler(CallLogFragment fragment) {
             super(fragment.getActivity().getContentResolver());
             mFragment = new WeakReference<CallLogFragment>(fragment);
         }
@@ -1020,20 +1020,8 @@
          */
         private void updateAdapterData(Cursor combinedCursor) {
             final CallLogFragment fragment = mFragment.get();
-            if (fragment != null && fragment.getActivity() != null &&
-                    !fragment.getActivity().isFinishing()) {
-                Log.d(TAG, "updating adapter");
-                final CallLogAdapter callsAdapter = fragment.mAdapter;
-                callsAdapter.setLoading(false);
-                callsAdapter.changeCursor(combinedCursor);
-                if (fragment.mScrollToTop) {
-                    final ListView listView = fragment.getListView();
-                    if (listView.getFirstVisiblePosition() > 5) {
-                        listView.setSelection(5);
-                    }
-                    listView.smoothScrollToPosition(0);
-                    fragment.mScrollToTop = false;
-                }
+            if (fragment != null) {
+                fragment.onCallsFetched(combinedCursor);
             }
         }
     }
@@ -1044,13 +1032,31 @@
 
         mVoiceMailNumber = ((TelephonyManager) getActivity().getSystemService(
                 Context.TELEPHONY_SERVICE)).getVoiceMailNumber();
-        mQueryHandler = new QueryHandler(this);
+        mCallLogQueryHandler = new CallLogQueryHandler(this);
 
         mCurrentCountryIso = ContactsUtils.getCurrentCountryIso(getActivity());
 
         setHasOptionsMenu(true);
     }
 
+    /** Called by the CallLogQueryHandler when the list of calls has been fetched or updated. */
+    public void onCallsFetched(Cursor cursor) {
+        if (getActivity() == null || getActivity().isFinishing()) {
+            return;
+        }
+        Log.d(TAG, "updating adapter");
+        mAdapter.setLoading(false);
+        mAdapter.changeCursor(cursor);
+        if (mScrollToTop) {
+            final ListView listView = getListView();
+            if (listView.getFirstVisiblePosition() > 5) {
+                listView.setSelection(5);
+            }
+            listView.smoothScrollToPosition(0);
+            mScrollToTop = false;
+        }
+    }
+
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
         return inflater.inflate(R.layout.call_log_fragment, container, false);
@@ -1126,12 +1132,12 @@
     }
 
     private void resetNewCallsFlag() {
-        mQueryHandler.updateMissedCalls();
+        mCallLogQueryHandler.updateMissedCalls();
     }
 
     private void startQuery() {
         mAdapter.setLoading(true);
-        mQueryHandler.fetchCalls();
+        mCallLogQueryHandler.fetchCalls();
     }
 
     @Override
