diff --git a/res/layout-finger/tab_indicator.xml b/res/layout-finger/tab_indicator.xml
index ff64d5e..68f03fd 100644
--- a/res/layout-finger/tab_indicator.xml
+++ b/res/layout-finger/tab_indicator.xml
@@ -22,7 +22,7 @@
     <ImageView android:id="@+id/tab_icon"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_centerHorizontal="true"
+        android:layout_centerInParent="true"
     />
 
     <TextView android:id="@+id/tab_title"
diff --git a/src/com/android/contacts/BaseContactCardActivity.java b/src/com/android/contacts/BaseContactCardActivity.java
index 7d4bb19..b4980f6 100644
--- a/src/com/android/contacts/BaseContactCardActivity.java
+++ b/src/com/android/contacts/BaseContactCardActivity.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2009 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.
@@ -16,32 +16,33 @@
 
 package com.android.contacts;
 
+import java.util.ArrayList;
+
+import com.android.contacts.NotifyingAsyncQueryHandler.AsyncQueryListener;
 import com.android.contacts.ScrollingTabWidget.OnTabSelectionChangedListener;
-import com.android.contacts.NotifyingAsyncQueryHandler.QueryCompleteListener;
+import com.android.contacts.model.ContactsSource;
+import com.android.contacts.model.Sources;
 import com.android.internal.widget.ContactHeaderWidget;
 
 import android.app.Activity;
 import android.content.ContentUris;
-import android.content.ContentValues;
 import android.content.Context;
+import android.content.Entity;
+import android.content.EntityIterator;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.database.Cursor;
-import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.SystemClock;
-import android.provider.SocialContract;
-import android.provider.ContactsContract.Contacts;
+import android.os.RemoteException;
 import android.provider.ContactsContract.RawContacts;
-import android.provider.SocialContract.Activities;
 import android.util.Log;
 import android.util.SparseArray;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
-import android.widget.CheckBox;
 import android.widget.ImageView;
 import android.widget.TextView;
 
@@ -49,7 +50,8 @@
  * The base Activity class for viewing and editing a contact.
  */
 public abstract class BaseContactCardActivity extends Activity
-        implements QueryCompleteListener, OnTabSelectionChangedListener {
+        implements AsyncQueryListener, OnTabSelectionChangedListener,
+        Sources.SourcesCompleteListener {
 
     private static final String TAG = "BaseContactCardActivity";
 
@@ -73,6 +75,8 @@
 
     private static final int TOKEN_TABS = 0;
 
+    private Sources mSources;
+
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -91,17 +95,24 @@
         mTabWidget = (ScrollingTabWidget) findViewById(R.id.tab_widget);
 
         mTabWidget.setTabSelectionListener(this);
+        mTabWidget.setVisibility(View.INVISIBLE);
         mTabRawContactIdMap = new SparseArray<Long>();
 
         mHandler = new NotifyingAsyncQueryHandler(this, this);
 
-        setupTabs();
+        Sources.requestInstance(this, this);
+
     }
 
-    private void setupTabs() {
+    public void onSourcesComplete(Sources sources) {
+        mSources = sources;
+        asyncSetupTabs();
+    }
+
+    private void asyncSetupTabs() {
         long contactId = ContentUris.parseId(mUri);
-        mHandler.startQuery(TOKEN_TABS, null, RawContacts.CONTENT_URI, TAB_PROJECTION,
-                RawContacts.CONTACT_ID + "=" + contactId, null, null);
+        mHandler.startQueryEntities(TOKEN_TABS, null,
+                RawContacts.CONTENT_URI, RawContacts.CONTACT_ID + "=" + contactId, null, null);
     }
 
     /**
@@ -115,41 +126,59 @@
     }
 
     /** {@inheritDoc} */
-    public void onQueryComplete(int token, Object cookie, Cursor cursor) {
+    public void onQueryEntitiesComplete(int token, Object cookie, EntityIterator iterator) {
         try{
             if (token == TOKEN_TABS) {
                 clearCurrentTabs();
-                bindTabs(cursor);
+                bindTabs(readEntities(iterator));
             }
         } finally {
-            if (cursor != null) {
-                cursor.close();
+            if (iterator != null) {
+                iterator.close();
             }
         }
     }
 
+    /** {@inheritDoc} */
+    public void onQueryComplete(int token, Object cookie, Cursor cursor) {
+        // Emtpy
+    }
+
+    private ArrayList<Entity> readEntities(EntityIterator iterator) {
+        ArrayList<Entity> entities = new ArrayList<Entity>();
+        try {
+            while (iterator.hasNext()) {
+                entities.add(iterator.next());
+            }
+        } catch (RemoteException e) {
+        }
+
+        return entities;
+    }
+
     /**
      * Adds a tab for each {@link RawContact} associated with this contact.
      * Override this method if you want to additional tabs and/or different
      * tabs for your activity.
      *
-     * @param tabsCursor A cursor over all the RawContacts associated with
-     * the contact being displayed. Use {@link TAB_CONTACT_ID_COLUMN_INDEX},
-     * {@link TAB_ACCOUNT_NAME_COLUMN_INDEX}, {@link TAB_ACCOUNT_TYPE_COLUMN_INDEX},
-     * and {@link TAB_PACKAGE_COLUMN_INDEX} as column indexes on the cursor.
+     * @param entities An {@link ArrayList} of {@link Entity}s of all the RawContacts
+     * associated with the contact being displayed.
      */
-    protected void bindTabs(Cursor tabsCursor) {
-        while (tabsCursor.moveToNext()) {
-            long contactId = tabsCursor.getLong(TAB_CONTACT_ID_COLUMN_INDEX);
-
-            //TODO: figure out how to get the icon
-            Drawable tabIcon = null;
-            addTab(contactId, null, tabIcon);
+    protected void bindTabs(ArrayList<Entity> entities) {
+        for (Entity entity : entities) {
+            final String accountType = entity.getEntityValues().
+                    getAsString(RawContacts.ACCOUNT_TYPE);
+            final Long rawContactId = entity.getEntityValues().
+                    getAsLong(RawContacts._ID);
+            ContactsSource source = mSources.getSourceForType(accountType);
+            addTab(rawContactId, createTabIndicatorView(mTabWidget, source));
         }
-        selectDefaultTab();
-
+        mTabWidget.setCurrentTab(0);
+        mTabWidget.setVisibility(View.VISIBLE);
+        mTabWidget.postInvalidate();
     }
 
+
     /**
      * Add a tab to be displayed in the {@link ScrollingTabWidget}.
      *
@@ -167,8 +196,8 @@
      * @param contactId The contact id associated with the tab.
      * @param view A view to use as the tab indicator.
      */
-    protected void addTab(long contactId, View view) {
-        mTabRawContactIdMap.put(mTabWidget.getTabCount(), contactId);
+    protected void addTab(long rawContactId, View view) {
+        mTabRawContactIdMap.put(mTabWidget.getTabCount(), rawContactId);
         mTabWidget.addTab(view);
     }
 
@@ -198,6 +227,7 @@
     /**
      * Utility for creating a standard tab indicator view.
      *
+     * @param parent The parent ViewGroup to attach the new view to.
      * @param label The label to display in the tab indicator. If null, not label will be displayed.
      * @param icon The icon to display. If null, no icon will be displayed.
      * @return The tab indicator View.
@@ -216,4 +246,30 @@
         return tabIndicator;
     }
 
+    /**
+     * Utility for creating a standard tab indicator view.
+     *
+     * @param context The label to display in the tab indicator. If null, not label will be displayed.
+     * @param parent The parent ViewGroup to attach the new view to.
+     * @param source The {@link ContactsSource} to build the tab view from.
+     * @return The tab indicator View.
+     */
+    public static View createTabIndicatorView(ViewGroup parent, ContactsSource source) {
+        Drawable icon = null;
+        if (source != null) {
+            final String packageName = source.resPackageName;
+            if (source.iconRes > 0) {
+                try {
+                    final Context authContext = parent.getContext().
+                            createPackageContext(packageName, 0);
+                    icon = authContext.getResources().getDrawable(source.iconRes);
+
+                } catch (PackageManager.NameNotFoundException e) {
+                    Log.d(TAG, "error getting the Package Context for " + packageName, e);
+                }
+            }
+        }
+        return createTabIndicatorView(parent, null, icon);
+    }
+
 }
diff --git a/src/com/android/contacts/DisplayGroupsActivity.java b/src/com/android/contacts/DisplayGroupsActivity.java
index 269ed0b..6da2531 100644
--- a/src/com/android/contacts/DisplayGroupsActivity.java
+++ b/src/com/android/contacts/DisplayGroupsActivity.java
@@ -16,13 +16,14 @@
 
 package com.android.contacts;
 
-import com.android.contacts.NotifyingAsyncQueryHandler.QueryCompleteListener;
+import com.android.contacts.NotifyingAsyncQueryHandler.AsyncQueryListener;
 
 import android.app.ExpandableListActivity;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.EntityIterator;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.content.pm.PackageManager;
@@ -59,7 +60,7 @@
  * select which ones they want to be visible.
  */
 public final class DisplayGroupsActivity extends ExpandableListActivity implements
-        QueryCompleteListener, OnItemClickListener {
+        AsyncQueryListener, OnItemClickListener {
     private static final String TAG = "DisplayGroupsActivity";
 
     public interface Prefs {
@@ -631,4 +632,8 @@
 
     }
 
+    public void onQueryEntitiesComplete(int token, Object cookie, EntityIterator iterator) {
+        // Emtpy
+    }
+
 }
diff --git a/src/com/android/contacts/NotifyingAsyncQueryHandler.java b/src/com/android/contacts/NotifyingAsyncQueryHandler.java
index 2223e9c..0eff1ac 100644
--- a/src/com/android/contacts/NotifyingAsyncQueryHandler.java
+++ b/src/com/android/contacts/NotifyingAsyncQueryHandler.java
@@ -2,6 +2,7 @@
 
 import android.content.AsyncQueryHandler;
 import android.content.Context;
+import android.content.EntityIterator;
 import android.database.Cursor;
 
 import java.lang.ref.WeakReference;
@@ -14,28 +15,48 @@
  * Using this pattern will help keep you from leaking a {@link Context}.
  */
 public class NotifyingAsyncQueryHandler extends AsyncQueryHandler {
-    private final WeakReference<QueryCompleteListener> mListener;
+    private WeakReference<AsyncQueryListener> mListener;
 
     /**
-     * Interface to listen for completed queries.
+     * Interface to listen for completed query operations.
      */
-    public static interface QueryCompleteListener {
-        public void onQueryComplete(int token, Object cookie, Cursor cursor);
+    public interface AsyncQueryListener {
+        void onQueryComplete(int token, Object cookie, Cursor cursor);
+        void onQueryEntitiesComplete(int token, Object cookie, EntityIterator iterator);
     }
 
-    public NotifyingAsyncQueryHandler(Context context, QueryCompleteListener listener) {
+    public NotifyingAsyncQueryHandler(Context context, AsyncQueryListener listener) {
         super(context.getContentResolver());
-        mListener = new WeakReference<QueryCompleteListener>(listener);
+        setQueryListener(listener);
+    }
+
+    /**
+     * Assign the given {@link AsyncQueryListener} to receive query events from
+     * asynchronous calls. Will replace any existing listener.
+     */
+    public void setQueryListener(AsyncQueryListener listener) {
+        mListener = new WeakReference<AsyncQueryListener>(listener);
     }
 
     /** {@inheritDoc} */
     @Override
     protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
-        final QueryCompleteListener listener = mListener.get();
+        final AsyncQueryListener listener = mListener.get();
         if (listener != null) {
             listener.onQueryComplete(token, cookie, cursor);
-        } else {
+        } else if (cursor != null) {
             cursor.close();
         }
     }
+
+    /** {@inheritDoc} */
+    @Override
+    protected void onQueryEntitiesComplete(int token, Object cookie, EntityIterator iterator) {
+        final AsyncQueryListener listener = mListener.get();
+        if (listener != null) {
+            listener.onQueryEntitiesComplete(token, cookie, iterator);
+        } else if (iterator != null) {
+            iterator.close();
+        }
+    }
 }
diff --git a/src/com/android/contacts/ShowOrCreateActivity.java b/src/com/android/contacts/ShowOrCreateActivity.java
index fb6f60b..6ba2315 100755
--- a/src/com/android/contacts/ShowOrCreateActivity.java
+++ b/src/com/android/contacts/ShowOrCreateActivity.java
@@ -16,7 +16,7 @@
 
 package com.android.contacts;
 
-import com.android.contacts.NotifyingAsyncQueryHandler.QueryCompleteListener;
+import com.android.contacts.NotifyingAsyncQueryHandler.AsyncQueryListener;
 import com.android.contacts.ui.FastTrackWindow;
 
 import android.app.Activity;
@@ -25,6 +25,7 @@
 import android.content.ContentUris;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.EntityIterator;
 import android.content.Intent;
 import android.database.Cursor;
 import android.graphics.Rect;
@@ -53,7 +54,7 @@
  * {@link Intent#ACTION_SEARCH}.
  * </ul>
  */
-public final class ShowOrCreateActivity extends Activity implements QueryCompleteListener,
+public final class ShowOrCreateActivity extends Activity implements AsyncQueryListener,
         FastTrackWindow.OnDismissListener {
     static final String TAG = "ShowOrCreateActivity";
     static final boolean LOGD = false;
@@ -267,4 +268,8 @@
             mParent.finish();
         }
     }
+
+    public void onQueryEntitiesComplete(int token, Object cookie, EntityIterator iterator) {
+        // Empty
+    }
 }
diff --git a/src/com/android/contacts/ViewContactActivity.java b/src/com/android/contacts/ViewContactActivity.java
index ec46690..87e6718 100644
--- a/src/com/android/contacts/ViewContactActivity.java
+++ b/src/com/android/contacts/ViewContactActivity.java
@@ -44,6 +44,7 @@
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Entity;
 import android.content.Intent;
 import android.content.DialogInterface.OnClickListener;
 import android.content.pm.PackageManager;
@@ -252,11 +253,11 @@
     }
 
     @Override
-    protected void bindTabs(Cursor tabsCursor) {
-        if (tabsCursor.getCount() > 1) {
+    protected void bindTabs(ArrayList<Entity> entities) {
+        if (entities.size() > 1) {
             addAllTab();
         }
-        super.bindTabs(tabsCursor);
+        super.bindTabs(entities);
     }
 
     private void addAllTab() {
diff --git a/src/com/android/contacts/model/EntityModifier.java b/src/com/android/contacts/model/EntityModifier.java
index de925cb..ed37736 100644
--- a/src/com/android/contacts/model/EntityModifier.java
+++ b/src/com/android/contacts/model/EntityModifier.java
@@ -299,7 +299,8 @@
      */
     public static void parseExtras(Context context, EntityDelta state, Bundle extras) {
         final String accountType = state.getValues().getAsString(RawContacts.ACCOUNT_TYPE);
-        final ContactsSource source = Sources.getInstance(context).getSourceForType(accountType);
+        final ContactsSource source = Sources.getPartialInstance(context).
+                getSourceForType(accountType);
 
         {
             // StructuredName
diff --git a/src/com/android/contacts/model/Sources.java b/src/com/android/contacts/model/Sources.java
index f9618b2..8f09454 100644
--- a/src/com/android/contacts/model/Sources.java
+++ b/src/com/android/contacts/model/Sources.java
@@ -18,6 +18,11 @@
 
 import com.android.contacts.R;
 
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.accounts.Future1;
+import android.accounts.Future1Callback;
+import android.accounts.OperationCanceledException;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -34,6 +39,7 @@
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.CommonDataKinds.Website;
+import android.util.Log;
 import android.view.inputmethod.EditorInfo;
 
 import com.android.contacts.model.ContactsSource.DataKind;
@@ -41,6 +47,7 @@
 import com.android.contacts.model.ContactsSource.EditField;
 import com.android.contacts.model.ContactsSource.StringInflater;
 
+import java.lang.ref.SoftReference;
 import java.util.ArrayList;
 import java.util.HashMap;
 
@@ -54,23 +61,67 @@
 public class Sources {
     // TODO: finish hard-coding all constraints
 
-    private static Sources sInstance;
+    private static SoftReference<Sources> sInstance;
 
-    public static synchronized Sources getInstance(Context context) {
-        if (sInstance == null) {
-            sInstance = new Sources(context);
+    private ArrayList<SourcesCompleteListener> mSourcesCompleteListeners;
+    private boolean mComplete = false;
+
+    /**
+     * Returns the singleton {@link Sources} without binding data from
+     * the available authenticators. All clients of this class should move
+     * to requestInstance().
+     */
+    @Deprecated
+    public static synchronized Sources getPartialInstance(Context context) {
+        if (sInstance == null || sInstance.get() == null) {
+            sInstance = new SoftReference<Sources>(new Sources(context, false));
         }
-        return sInstance;
+        return sInstance.get();
+    }
+
+    /**
+     * Requests the singleton instance of {@link Sources} with data bound
+     * from the available authenticators. The result will be returned to
+     * the {@link SourcesCompleteListener} callback interface.
+     * @param context
+     * @param listener An implementation of {@link SourcesCompleteListener} to
+     * pass the {@link Sources} object to.
+     */
+    public static synchronized void requestInstance(Context context,
+            SourcesCompleteListener listener) {
+        Sources sources = sInstance == null ? null : sInstance.get();
+        if (sources == null) {
+            sources = new Sources(context, true);
+            sources.mSourcesCompleteListeners.add(listener);
+            sInstance = new SoftReference<Sources>(sources);
+        } else {
+            if (sources.mComplete) {
+                // We're already complete, so we can call the callback right now.
+                listener.onSourcesComplete(sources);
+            } else {
+                sources.mSourcesCompleteListeners.add(listener);
+            }
+        }
+
     }
 
     public static final String ACCOUNT_TYPE_GOOGLE = "com.google.GAIA";
     public static final String ACCOUNT_TYPE_EXCHANGE = "com.android.exchange";
+    public static final String ACCOUNT_TYPE_FACEBOOK = "com.facebook.auth.login";
 
     private HashMap<String, ContactsSource> mSources = new HashMap<String, ContactsSource>();
+    private AccountManager mAccountManager;
 
-    private Sources(Context context) {
+    private Sources(Context context, boolean fetchAuthenticatorData) {
         mSources.put(ACCOUNT_TYPE_GOOGLE, buildGoogle(context));
         mSources.put(ACCOUNT_TYPE_EXCHANGE, buildExchange(context));
+        mSources.put(ACCOUNT_TYPE_FACEBOOK, buildFacebook(context));
+
+        if (fetchAuthenticatorData) {
+            mSourcesCompleteListeners = new ArrayList<SourcesCompleteListener>();
+            mAccountManager = AccountManager.get(context);
+            asyncGetAuthenticatorTypes();
+        }
     }
 
     /**
@@ -483,6 +534,18 @@
     }
 
     /**
+     * Hard-coded instance of {@link ContactsSource} for Facebook.
+     */
+    private ContactsSource buildFacebook(Context context) {
+        final ContactsSource list = new ContactsSource();
+        list.accountType = ACCOUNT_TYPE_FACEBOOK;
+        list.resPackageName = context.getPackageName();
+
+        return list;
+
+    }
+
+    /**
      * Simple inflater that assumes a string resource has a "%s" that will be
      * filled from the given column.
      */
@@ -564,4 +627,41 @@
                     type.actionAltRes, null) : null;
         }
     }
+
+    private void asyncGetAuthenticatorTypes() {
+        mAccountManager.getAuthenticatorTypes(new GetAuthenticatorsCallback(), null /* handler */);
+    }
+
+    private class GetAuthenticatorsCallback implements Future1Callback<AuthenticatorDescription[]> {
+        public void run(Future1<AuthenticatorDescription[]> future) {
+            try {
+                AuthenticatorDescription[] authenticatorDescs = future.getResult();
+
+                for (int i = 0; i < authenticatorDescs.length; i++) {
+                    String accountType = authenticatorDescs[i].type;
+                    ContactsSource contactSource = mSources.get(accountType);
+                    if (contactSource != null) {
+                        contactSource.iconRes = authenticatorDescs[i].iconId;
+                        contactSource.titleRes = authenticatorDescs[i].labelId;
+                        contactSource.resPackageName = authenticatorDescs[i].packageName;;
+                    }
+                }
+            } catch (OperationCanceledException e) {
+                // the request was canceled
+            }
+
+            mComplete = true;
+            for (SourcesCompleteListener listener : mSourcesCompleteListeners) {
+                listener.onSourcesComplete(Sources.this);
+            }
+        }
+    }
+
+    /**
+     * Callback interface used for being notified when the Sources object
+     * has finished binding with data from the Authenticators.
+     */
+    public interface SourcesCompleteListener {
+        public void onSourcesComplete(Sources sources);
+    }
 }
diff --git a/src/com/android/contacts/ui/EditContactActivity.java b/src/com/android/contacts/ui/EditContactActivity.java
index 8b4442e..ad2c9ed 100644
--- a/src/com/android/contacts/ui/EditContactActivity.java
+++ b/src/com/android/contacts/ui/EditContactActivity.java
@@ -99,7 +99,7 @@
         final Bundle extras = intent.getExtras();
 
         mUri = intent.getData();
-        mSources = Sources.getInstance(this);
+        mSources = Sources.getPartialInstance(this);
 
         setContentView(R.layout.act_edit);
 
diff --git a/src/com/android/contacts/ui/FastTrackWindow.java b/src/com/android/contacts/ui/FastTrackWindow.java
index 4a2acbc..9f4347e 100644
--- a/src/com/android/contacts/ui/FastTrackWindow.java
+++ b/src/com/android/contacts/ui/FastTrackWindow.java
@@ -17,7 +17,7 @@
 
 import com.android.contacts.NotifyingAsyncQueryHandler;
 import com.android.contacts.R;
-import com.android.contacts.NotifyingAsyncQueryHandler.QueryCompleteListener;
+import com.android.contacts.NotifyingAsyncQueryHandler.AsyncQueryListener;
 import com.android.contacts.model.ContactsSource;
 import com.android.contacts.model.Sources;
 import com.android.contacts.model.ContactsSource.DataKind;
@@ -26,6 +26,7 @@
 import android.content.ActivityNotFoundException;
 import android.content.ContentUris;
 import android.content.Context;
+import android.content.EntityIterator;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.database.Cursor;
@@ -83,7 +84,7 @@
  * Window that shows fast-track contact details for a specific
  * {@link Contacts#_ID}.
  */
-public class FastTrackWindow implements Window.Callback, QueryCompleteListener, OnClickListener,
+public class FastTrackWindow implements Window.Callback, AsyncQueryListener, OnClickListener,
         AbsListView.OnItemClickListener {
     private static final String TAG = "FastTrackWindow";
 
@@ -709,7 +710,7 @@
     private void handleData(Cursor cursor) {
         if (cursor == null) return;
 
-        final ContactsSource defaultSource = Sources.getInstance(mContext).getSourceForType(
+        final ContactsSource defaultSource = Sources.getPartialInstance(mContext).getSourceForType(
                 Sources.ACCOUNT_TYPE_GOOGLE);
 
         {
@@ -997,4 +998,8 @@
     /** {@inheritDoc} */
     public void onWindowFocusChanged(boolean hasFocus) {
     }
+
+    public void onQueryEntitiesComplete(int token, Object cookie, EntityIterator iterator) {
+        //Empty
+    }
 }
