diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 60b5bb1..ae63791 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -136,6 +136,8 @@
 
     private Context mContext;
 
+    private LoaderManager mLoaderManager;
+
     protected abstract View inflateView(LayoutInflater inflater, ViewGroup container);
     protected abstract T createListAdapter();
 
@@ -150,6 +152,7 @@
     public void onAttach(Activity activity) {
         super.onAttach(activity);
         setContext(activity);
+        setLoaderManager(super.getLoaderManager());
     }
 
     /**
@@ -164,6 +167,18 @@
         return mContext;
     }
 
+    /**
+     * Overrides a loader manager for use in unit tests.
+     */
+    public void setLoaderManager(LoaderManager loaderManager) {
+        mLoaderManager = loaderManager;
+    }
+
+    @Override
+    public LoaderManager getLoaderManager() {
+        return mLoaderManager;
+    }
+
     public T getAdapter() {
         return mAdapter;
     }
diff --git a/src/com/android/contacts/widget/InstrumentedLoaderManagingFragment.java b/src/com/android/contacts/widget/InstrumentedLoaderManagingFragment.java
deleted file mode 100644
index af72389..0000000
--- a/src/com/android/contacts/widget/InstrumentedLoaderManagingFragment.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2010 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.widget;
-
-import android.app.Fragment;
-import android.app.LoaderManagingFragment;
-import android.content.Loader;
-import android.os.Bundle;
-
-/**
- * A modification of the {@link LoaderManagingFragment} class that supports testing of
- * loader-based fragments using synchronous data loading.
- */
-public abstract class InstrumentedLoaderManagingFragment<D> extends Fragment {
-
-    public interface Delegate<D> {
-        void onStartLoading(Loader<D> loader);
-    }
-
-    private Delegate<D> mDelegate;
-
-    public void setDelegate(Delegate<D> listener) {
-        this.mDelegate = listener;
-    }
-
-//    public Loader<D> startLoading(int id, Bundle args) {
-//        getLoaderManager().initLoader(id, args, callback);
-//        if (mDelegate != null) {
-//            Loader<D> loader = onCreateLoader(id, args);
-//            loader.registerListener(id, this);
-//            mDelegate.onStartLoading(loader);
-//            return loader;
-//        } else {
-//            return super.startLoading(id, args);
-//        }
-//    }
-}
diff --git a/tests/src/com/android/contacts/DefaultContactBrowseListFragmentTest.java b/tests/src/com/android/contacts/DefaultContactBrowseListFragmentTest.java
index 40607bf..8ad3cb9 100644
--- a/tests/src/com/android/contacts/DefaultContactBrowseListFragmentTest.java
+++ b/tests/src/com/android/contacts/DefaultContactBrowseListFragmentTest.java
@@ -19,15 +19,15 @@
 import com.android.contacts.list.DefaultContactBrowseListFragment;
 import com.android.contacts.tests.mocks.ContactsMockContext;
 import com.android.contacts.tests.mocks.MockContentProvider;
-import com.android.contacts.widget.LoaderManagingFragmentTestDelegate;
+import com.android.contacts.widget.TestLoaderManager;
 
 import android.database.Cursor;
 import android.provider.ContactsContract;
-import android.provider.Settings;
 import android.provider.ContactsContract.ContactCounts;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.ProviderStatus;
 import android.provider.ContactsContract.StatusUpdates;
+import android.provider.Settings;
 import android.test.InstrumentationTestCase;
 import android.test.suitebuilder.annotation.Smoke;
 import android.view.LayoutInflater;
@@ -101,11 +101,11 @@
 
         DefaultContactBrowseListFragment fragment = new DefaultContactBrowseListFragment();
 
-        LoaderManagingFragmentTestDelegate<Cursor> delegate =
-                new LoaderManagingFragmentTestDelegate<Cursor>();
+        TestLoaderManager loaderManager = new TestLoaderManager();
 
-        // Divert loader registration to the delegate to ensure that loading is done synchronously
-//        fragment.setDelegate(delegate);
+        // Divert loader registration the TestLoaderManager to ensure that loading is
+        // done synchronously
+        fragment.setLoaderManager(loaderManager);
 
         // Fragment life cycle
         fragment.onCreate(null);
@@ -121,7 +121,7 @@
         fragment.onStart();
 
         // All loaders have been registered. Now perform the loading synchronously.
-        delegate.executeLoaders();
+        loaderManager.executeLoaders();
 
         // Now we can assert that the data got loaded into the list.
         ListView listView = (ListView)view.findViewById(android.R.id.list);
diff --git a/tests/src/com/android/contacts/widget/LoaderManagingFragmentTestDelegate.java b/tests/src/com/android/contacts/widget/LoaderManagingFragmentTestDelegate.java
deleted file mode 100644
index 353bfc7..0000000
--- a/tests/src/com/android/contacts/widget/LoaderManagingFragmentTestDelegate.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2010 Google Inc. All Rights Reserved.
-
-package com.android.contacts.widget;
-
-import android.content.AsyncTaskLoader;
-import android.content.Loader;
-
-import java.util.LinkedHashMap;
-
-import junit.framework.Assert;
-
-/**
- * A delegate of {@link InstrumentedLoaderManagingFragment} that performs
- * synchronous loading on demand for unit testing.
- */
-public class LoaderManagingFragmentTestDelegate<D> {
-
-    // Using a linked hash map to get all loading done in a predictable order.
-    private LinkedHashMap<Integer, Loader<D>> mStartedLoaders =
-            new LinkedHashMap<Integer, Loader<D>>();
-
-    public void onStartLoading(Loader<D> loader) {
-        int id = loader.getId();
-        mStartedLoaders.put(id, loader);
-    }
-
-    /**
-     * Synchronously runs all started loaders.
-     */
-    public void executeLoaders() {
-        for (Loader<D> loader : mStartedLoaders.values()) {
-            executeLoader(loader);
-        }
-    }
-
-    /**
-     * Synchronously runs the specified loader.
-     */
-    public void executeLoader(int id) {
-        Loader<D> loader = mStartedLoaders.get(id);
-        if (loader == null) {
-            Assert.fail("Loader not started: " + id);
-        }
-        executeLoader(loader);
-    }
-
-    private void executeLoader(Loader<D> loader) {
-        if (loader instanceof AsyncTaskLoader) {
-            AsyncTaskLoader<D> atLoader = (AsyncTaskLoader<D>)loader;
-            D data = atLoader.loadInBackground();
-            atLoader.deliverResult(data);
-        } else {
-            loader.forceLoad();
-        }
-    }
-}
\ No newline at end of file
diff --git a/tests/src/com/android/contacts/widget/TestLoaderManager.java b/tests/src/com/android/contacts/widget/TestLoaderManager.java
new file mode 100644
index 0000000..7d292ae
--- /dev/null
+++ b/tests/src/com/android/contacts/widget/TestLoaderManager.java
@@ -0,0 +1,85 @@
+// Copyright 2010 Google Inc. All Rights Reserved.
+
+package com.android.contacts.widget;
+
+import android.app.LoaderManager;
+import android.content.AsyncTaskLoader;
+import android.content.Loader;
+import android.content.Loader.OnLoadCompleteListener;
+import android.os.Bundle;
+
+import java.util.LinkedHashMap;
+
+import junit.framework.Assert;
+
+/**
+ * A {@link LoaderManager} that performs synchronous loading on demand for unit
+ * testing.
+ */
+public class TestLoaderManager implements LoaderManager {
+
+    // Using a linked hash map to get all loading done in a predictable order.
+    private LinkedHashMap<Integer, Loader<?>> mStartedLoaders = new LinkedHashMap<
+            Integer, Loader<?>>();
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <D> Loader<D> getLoader(int id) {
+        return (Loader<D>)mStartedLoaders.get(id);
+    }
+
+    @Override
+    public <D> Loader<D> initLoader(int id, Bundle args, final LoaderCallbacks<D> callbacks) {
+        Loader<D> loader = callbacks.onCreateLoader(id, args);
+        loader.registerListener(id, new OnLoadCompleteListener<D>() {
+            @Override
+            public void onLoadComplete(Loader<D> loader, D data) {
+                callbacks.onLoadFinished(loader, data);
+            }
+        });
+
+        mStartedLoaders.put(id, loader);
+        return loader;
+    }
+
+    @Override
+    public <D> Loader<D> restartLoader(int id, Bundle args, LoaderCallbacks<D> callbacks) {
+        return initLoader(id, args, callbacks);
+    }
+
+    @Override
+    public void stopLoader(int id) {
+        mStartedLoaders.get(id).stopLoading();
+    }
+
+    /**
+     * Synchronously runs all started loaders.
+     */
+    public void executeLoaders() {
+        for (Loader<?> loader : mStartedLoaders.values()) {
+            executeLoader(loader);
+        }
+    }
+
+    /**
+     * Synchronously runs the specified loader.
+     */
+    public void executeLoader(int id) {
+        Loader<?> loader = mStartedLoaders.get(id);
+        if (loader == null) {
+            Assert.fail("Loader not started: " + id);
+        }
+        executeLoader(loader);
+    }
+
+    @SuppressWarnings("unchecked")
+    private <D> void executeLoader(final Loader<D> loader) {
+        if (loader instanceof AsyncTaskLoader) {
+            AsyncTaskLoader<D> atLoader = (AsyncTaskLoader<D>)loader;
+            D data = atLoader.loadInBackground();
+            loader.deliverResult(data);
+        } else {
+            loader.forceLoad();
+        }
+    }
+}
