diff --git a/NEWS b/NEWS
index e69de29..145b6b4 100644
--- a/NEWS
+++ b/NEWS
@@ -0,0 +1,11 @@
+============================================================================
+API breaks in 0.2.0
+============================================================================
+
+BackendStore is now a singleton.
+
+Vala:
+BackendStore default constructor removed. Use BackendStore.dup().
+
+C:
+folks_backend_store_new() removed. Use folks_backend_store_dup().
diff --git a/configure.ac b/configure.ac
index cce55dd..74a43d9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,9 +1,9 @@
 # If not 1, append datestamp to the version number
-m4_define([folks_released], [1])
+m4_define([folks_released], [0])
 
 m4_define([folks_major_version], [0])
 m4_define([folks_minor_version], [1])
-m4_define([folks_micro_version], [17])
+m4_define([folks_micro_version], [18])
 m4_define([folks_nano_version], [0])
 
 # If library source has changed since last release, increment revision
diff --git a/folks/backend-store.vala b/folks/backend-store.vala
index b6aff32..ee2dda8 100644
--- a/folks/backend-store.vala
+++ b/folks/backend-store.vala
@@ -38,7 +38,9 @@ public class Folks.BackendStore : Object {
   private delegate void ModuleFinalizeFunc (BackendStore store);
 
   private HashMap<string,Backend> backend_hash;
+  private HashMap<string,Backend> _prepared_backends;
   private GLib.List<ModuleFinalizeFunc> finalize_funcs = null;
+  private static weak BackendStore instance;
 
   /**
    * Emitted when a backend has been added to the BackendStore.
@@ -46,16 +48,60 @@ public class Folks.BackendStore : Object {
    * This will not be emitted until after {@link BackendStore.load_backends}
    * has been called.
    *
+   * {@link Backend}s referenced in this signal are also included in @{link
+   * BackendStore.enabled_backends}.
+   *
    * @param backend the new {@link Backend}
    */
   public signal void backend_available (Backend backend);
 
   /**
+   * The list of backends visible to this store which have not been explicitly
+   * disabled.
+   *
+   * This list will be empty before {@link BackendStore.load_backends} has been
+   * called.
+   *
+   * The backends in this list have been prepared and are ready to use.
+   *
+   * @since 0.2.0
+   */
+  public GLib.List<Backend> enabled_backends
+    {
+      owned get
+        {
+          var backends = new GLib.List<Backend> ();
+          foreach (var entry in this._prepared_backends)
+            backends.prepend (entry.value);
+
+          return backends;
+        }
+
+      private set {}
+    }
+
+  /**
    * Create a new BackendStore.
    */
-  public BackendStore ()
+  public static BackendStore dup ()
+    {
+      if (instance == null)
+        {
+          /* use an intermediate variable to force a strong reference */
+          var new_instance = new BackendStore ();
+          instance = new_instance;
+
+          return new_instance;
+        }
+
+      return instance;
+    }
+
+  private BackendStore ()
     {
       this.backend_hash = new HashMap<string,Backend> (str_hash, str_equal);
+      this._prepared_backends = new HashMap<string,Backend> (str_hash,
+          str_equal);
     }
 
   ~BackendStore ()
@@ -63,10 +109,13 @@ public class Folks.BackendStore : Object {
       /* Finalize all the loaded modules */
       foreach (ModuleFinalizeFunc func in this.finalize_funcs)
         func (this);
+
+      /* manually clear the singleton instance */
+      instance = null;
     }
 
   /**
-   * Find and load all available backends.
+   * Find, load, and prepare all backends which are not disabled.
    *
    * Backends will be searched for in the path given by the `FOLKS_BACKEND_DIR`
    * environment variable, if it's set. If it's not set, backends will be
@@ -93,6 +142,27 @@ public class Folks.BackendStore : Object {
       assert (dir != null && yield is_dir (dir));
 
       yield this.load_modules_from_dir (dir);
+
+      /* all the found modules should call add_backend() for their backends
+       * (adding them to the backend hash) as a consequence of
+       * load_modules_from_dir(). */
+
+      foreach (var backend in this.backend_hash.values)
+        {
+          try
+            {
+              yield backend.prepare ();
+
+              debug ("New backend '%s' prepared", backend.name);
+              this._prepared_backends.set (backend.name, backend);
+              this.backend_available (backend);
+            }
+          catch (GLib.Error e)
+            {
+              warning ("Error preparing Backend '%s': %s", backend.name,
+                  e.message);
+            }
+        }
   }
 
   /**
@@ -102,9 +172,7 @@ public class Folks.BackendStore : Object {
    */
   public void add_backend (Backend backend)
     {
-      debug ("New backend '%s' available", backend.name);
       this.backend_hash.set (backend.name, backend);
-      this.backend_available (backend);
     }
 
   /**
diff --git a/folks/individual-aggregator.vala b/folks/individual-aggregator.vala
index 26353cd..beaf2be 100644
--- a/folks/individual-aggregator.vala
+++ b/folks/individual-aggregator.vala
@@ -123,7 +123,7 @@ public class Folks.IndividualAggregator : Object
       this.linking_enabled = (disable_linking == null ||
           disable_linking == "no" || disable_linking == "0");
 
-      this.backend_store = new BackendStore ();
+      this.backend_store = BackendStore.dup ();
       this.backend_store.backend_available.connect (this.backend_available_cb);
     }
 
@@ -138,28 +138,36 @@ public class Folks.IndividualAggregator : Object
    */
   public async void prepare () throws GLib.Error
     {
-      this.backend_store.load_backends ();
+      /* Once this async function returns, all the {@link Backend}s will have
+       * been prepared (though no {@link PersonaStore}s are guaranteed to be
+       * available yet). This last guarantee is new as of version 0.2.0. */
+      yield this.backend_store.load_backends ();
+    }
+
+  private async void add_backend (Backend backend)
+    {
+      if (!this.backends.contains (backend))
+        {
+          this.backends.add (backend);
+
+          backend.persona_store_added.connect (
+              this.backend_persona_store_added_cb);
+          backend.persona_store_removed.connect (
+              this.backend_persona_store_removed_cb);
+
+          /* handle the stores that have already been signaled */
+          backend.persona_stores.foreach ((k, v) =>
+              {
+                this.backend_persona_store_added_cb (backend,
+                  (PersonaStore) v);
+              });
+        }
     }
 
   private void backend_available_cb (BackendStore backend_store,
       Backend backend)
     {
-      backend.persona_store_added.connect (this.backend_persona_store_added_cb);
-      backend.persona_store_removed.connect (
-          this.backend_persona_store_removed_cb);
-
-      backend.prepare.begin ((obj, result) =>
-        {
-          try
-            {
-              backend.prepare.end (result);
-            }
-          catch (GLib.Error e)
-            {
-              warning ("Error preparing Backend '%s': %s", backend.name,
-                  e.message);
-            }
-        });
+      this.add_backend.begin (backend);
     }
 
   private void backend_persona_store_added_cb (Backend backend,
diff --git a/tools/import.vala b/tools/import.vala
index aca2a97..451290f 100644
--- a/tools/import.vala
+++ b/tools/import.vala
@@ -90,7 +90,7 @@ public class Folks.ImportTool : Object
 
   private static async bool import ()
     {
-      BackendStore backend_store = new BackendStore ();
+      BackendStore backend_store = BackendStore.dup ();
 
       try
         {
