diff --git a/src/com/android/telecomm/CallServiceFinder.java b/src/com/android/telecomm/CallServiceFinder.java
index fa5ee14..898877f 100644
--- a/src/com/android/telecomm/CallServiceFinder.java
+++ b/src/com/android/telecomm/CallServiceFinder.java
@@ -47,95 +47,6 @@
  */
 final class CallServiceFinder {
 
-    /**
-     * Helper class to register/unregister call-service providers.
-     */
-    private class ProviderRegistrar {
-
-        /**
-         * The name of the call-service provider that is expected to register with this finder.
-         */
-        private ComponentName mProviderName;
-
-        /**
-         * A unique identifier for a given lookup cycle, see nextLookupId.
-         * TODO(gilad): Potentially unnecessary, consider removing.
-         */
-        int mLookupId;
-
-        /**
-         * Persists the specified parameters.
-         *
-         * @param providerName The component name of the relevant provider.
-         * @param lookupId The lookup-cycle ID.
-         */
-        ProviderRegistrar(ComponentName providerName, int lookupId) {
-            this.mProviderName = providerName;
-            this.mLookupId = lookupId;
-        }
-
-        ComponentName getProviderName() {
-            return mProviderName;
-        }
-
-        /**
-         * Registers the specified call-service provider.
-         *
-         * @param provider The provider object to register.
-         */
-        void register(ICallServiceProvider provider) {
-            registerProvider(mLookupId, mProviderName, provider);
-        }
-
-        /** Unregisters this provider. */
-        void unregister() {
-            unregisterProvider(mProviderName);
-        }
-    }
-
-    /**
-     * Wrapper around ICallServiceProvider, mostly used for binding etc.
-     *
-     * TODO(gilad): Consider making this wrapper unnecessary.
-     */
-    private class ProviderWrapper {
-
-        /**
-         * Persists the specified parameters and attempts to bind the specified provider.
-         *
-         * TODO(gilad): Consider embedding ProviderRegistrar into this class and do away
-         * with the former, or vice versa.
-         *
-         * @param context The relevant application context.
-         * @param registrar The registrar with which to register and unregister this provider.
-         */
-        ProviderWrapper(Context context, final ProviderRegistrar registrar) {
-            ComponentName name = registrar.getProviderName();
-            Preconditions.checkNotNull(name);
-            Preconditions.checkNotNull(context);
-
-            Intent serviceIntent = new Intent(CALL_SERVICE_PROVIDER_CLASS_NAME).setComponent(name);
-            Log.i(TAG, "Binding to ICallServiceProvider through " + serviceIntent);
-
-            // Connection object for the service binding.
-            ServiceConnection connection = new ServiceConnection() {
-                @Override
-                public void onServiceConnected(ComponentName className, IBinder service) {
-                    registrar.register(ICallServiceProvider.Stub.asInterface(service));
-                }
-
-                @Override
-                public void onServiceDisconnected(ComponentName className) {
-                    registrar.unregister();
-                }
-            };
-
-            if (!context.bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE)) {
-                // TODO(santoscordon): Handle error.
-            }
-        }
-    }
-
     private static final String TAG = CallServiceFinder.class.getSimpleName();
 
     /**
@@ -232,8 +143,7 @@
             if (!mProviderRegistry.contains(name)) {
                 // The provider is either not yet registered or has been unregistered
                 // due to unbinding etc.
-                ProviderRegistrar registrar = new ProviderRegistrar(name, lookupId);
-                new ProviderWrapper(context, registrar);
+                bindProvider(name, lookupId, context);
                 mUnregisteredProviders.add(name);
             }
         }
@@ -281,6 +191,43 @@
     }
 
     /**
+     * Attempts to bind the specified provider and have it register upon successful binding.  Also
+     * performs the necessary wiring to unregister the provider upon un-binding.
+     *
+     * @param providerName The component name of the relevant provider.
+     * @param lookupId The lookup-cycle ID.
+     * @param context The relevant application context.
+     */
+    void bindProvider(
+            final ComponentName providerName, final int lookupId, Context context) {
+
+        Preconditions.checkNotNull(providerName);
+        Preconditions.checkNotNull(context);
+
+        Intent serviceIntent =
+                new Intent(CALL_SERVICE_PROVIDER_CLASS_NAME).setComponent(providerName);
+        Log.i(TAG, "Binding to ICallServiceProvider through " + serviceIntent);
+
+        // Connection object for the service binding.
+        ServiceConnection connection = new ServiceConnection() {
+            @Override
+            public void onServiceConnected(ComponentName className, IBinder service) {
+                ICallServiceProvider provider = ICallServiceProvider.Stub.asInterface(service);
+                registerProvider(lookupId, providerName, provider);
+            }
+
+            @Override
+            public void onServiceDisconnected(ComponentName className) {
+                unregisterProvider(providerName);
+            }
+        };
+
+        if (!context.bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE)) {
+            // TODO(santoscordon): Handle error.
+        }
+    }
+
+    /**
      * Queries the supplied provider asynchronously for its CallServices and passes the list through
      * to {@link #registerCallServices} which will relinquish control back to switchboard.
      *
