diff --git a/folks/individual-aggregator.vala b/folks/individual-aggregator.vala
index 84448c2..28ec83f 100644
--- a/folks/individual-aggregator.vala
+++ b/folks/individual-aggregator.vala
@@ -619,8 +619,8 @@ public class Folks.IndividualAggregator : Object
       if (store == null)
         {
           throw new IndividualAggregatorError.STORE_NOT_FOUND (
-              "no store known for type ID '%s' and ID '%s'", store.type_id,
-              store.id);
+              "no store known for type ID '%s' and ID '%s'", persona_store_type,
+              persona_store_id);
         }
 
       Persona persona = null;
diff --git a/tests/telepathy/Makefile.am b/tests/telepathy/Makefile.am
index 39b6896..c93ebc1 100644
--- a/tests/telepathy/Makefile.am
+++ b/tests/telepathy/Makefile.am
@@ -4,6 +4,7 @@ AM_CPPFLAGS = \
 	$(TP_GLIB_CFLAGS) \
 	-I$(top_srcdir)/folks \
 	-I$(top_srcdir)/backends/telepathy \
+	-I$(top_srcdir)/backends/telepathy/lib \
 	-I$(top_srcdir)/tests/lib/telepathy/contactlist \
 	-include $(CONFIG_HEADER) \
 	$(NULL)
@@ -12,6 +13,7 @@ LDADD = \
 	$(GLIB_LIBS) \
 	$(GEE_LIBS) \
 	$(TP_GLIB_LIBS) \
+	-L$(top_srcdir)/backends/telepathy/lib \
 	$(NULL)
 
 RUN_WITH_PRIVATE_BUS = $(top_srcdir)/tests/tools/with-session-bus.sh
@@ -47,6 +49,7 @@ contact_retrieval_SOURCES = \
 
 contact_retrieval_LDADD = \
 	$(top_builddir)/tests/lib/telepathy/contactlist/libtp-test-contactlist.la \
+	$(top_builddir)/backends/telepathy/lib/libfolks-telepathy.la \
 	$(top_builddir)/folks/libfolks.la
 
 CLEANFILES = \
diff --git a/tests/telepathy/contact-retrieval.vala b/tests/telepathy/contact-retrieval.vala
index ccf6402..96b6e17 100644
--- a/tests/telepathy/contact-retrieval.vala
+++ b/tests/telepathy/contact-retrieval.vala
@@ -14,12 +14,30 @@ public class ContactRetrievalTests : Folks.TestCase
   private MainLoop main_loop;
   private string bus_name;
   private string object_path;
+  private HashSet<string> default_individuals;
+  private string individual_id_prefix = "telepathy:protocol:";
+  private string account_path =
+    "/org/freedesktop/Telepathy/Account/cm/protocol/account";
 
   public ContactRetrievalTests ()
     {
       base ("ContactRetrieval");
 
+      /* Create a set of the individuals we expect to see */
+      this.default_individuals = new HashSet<string> (str_hash, str_equal);
+
+      var prefix = this.individual_id_prefix;
+      default_individuals.add (prefix + "travis@example.com");
+      default_individuals.add (prefix + "olivier@example.com");
+      default_individuals.add (prefix + "guillaume@example.com");
+      default_individuals.add (prefix + "sjoerd@example.com");
+      default_individuals.add (prefix + "christian@example.com");
+      default_individuals.add (prefix + "wim@example.com");
+      default_individuals.add (prefix + "helen@example.com");
+      default_individuals.add (prefix + "geraldine@example.com");
+
       this.add_test ("aggregator", this.test_aggregator);
+      this.add_test ("aggregator:add", this.test_aggregator_add);
       this.add_test ("individual properties",
           this.test_individual_properties);
     }
@@ -139,19 +157,10 @@ public class ContactRetrievalTests : Folks.TestCase
               "any .service files");
         });
 
-      /* Create a set of the individuals we expect to see */
-      HashSet<string> expected_individuals = new HashSet<string> (str_hash,
-          str_equal);
-
-      string prefix = "telepathy:protocol:";
-      expected_individuals.add (prefix + "travis@example.com");
-      expected_individuals.add (prefix + "olivier@example.com");
-      expected_individuals.add (prefix + "guillaume@example.com");
-      expected_individuals.add (prefix + "sjoerd@example.com");
-      expected_individuals.add (prefix + "christian@example.com");
-      expected_individuals.add (prefix + "wim@example.com");
-      expected_individuals.add (prefix + "helen@example.com");
-      expected_individuals.add (prefix + "geraldine@example.com");
+      /* work on a copy so we can mangle it */
+      HashSet<string> expected_individuals = new HashSet<string> ();
+      foreach (var id in this.default_individuals)
+        expected_individuals.add (id);
 
       /* Set up the aggregator */
       var aggregator = new IndividualAggregator ();
@@ -162,21 +171,150 @@ public class ContactRetrievalTests : Folks.TestCase
 
           assert (removed == null);
         });
-      aggregator.prepare ();
 
       /* Kill the main loop after a few seconds. If there are still individuals
-       * in the set of expected individuals, the aggregator has either failed
-       * or been too slow (which we can consider to be failure). */
+       * in the set of expected individuals, the aggregator has either failed or
+       * been too slow (which we can consider to be failure). */
       Timeout.add_seconds (3, () =>
         {
           main_loop.quit ();
           return false;
         });
 
+      Idle.add (() =>
+        {
+          aggregator.prepare.begin ((s,r) =>
+            {
+              try
+                {
+                  aggregator.prepare.end (r);
+                }
+              catch (GLib.Error e1)
+                {
+                  GLib.critical ("failed to prepare aggregator: %s",
+                    e1.message);
+                  assert_not_reached ();
+                }
+            });
+
+          return false;
+        });
+
       main_loop.run ();
 
       /* We should have enumerated exactly the individuals in the set */
       assert (expected_individuals.size == 0);
+
+      /* necessary to reset the aggregator for the next test */
+      aggregator = null;
+    }
+
+  public void test_aggregator_add ()
+    {
+      var main_loop = new GLib.MainLoop (null, false);
+
+      /* Ignore the error caused by not running the logger */
+      Test.log_set_fatal_handler ((d, l, m) =>
+        {
+          return !m.has_suffix ("couldn't get list of favourite contacts: " +
+              "The name org.freedesktop.Telepathy.Logger was not provided by " +
+              "any .service files");
+        });
+
+      HashSet<string> added_individuals = new HashSet<string> ();
+      added_individuals.add ("master.shake@example.com");
+      added_individuals.add ("2wycked@example.com");
+      added_individuals.add ("carl-brutananadilewski@example.com");
+
+      /* Set up the aggregator */
+      var aggregator = new IndividualAggregator ();
+
+      aggregator.individuals_changed.connect ((added, removed, m, a, r) =>
+        {
+          /* implicitly ignore the default Individuals, since that's covered in
+           * other test(s) */
+          foreach (Individual i in added)
+            {
+              /* If the Individual contains a Persona with an ID we provided,
+               * mark it as recieved.
+               * This intentionally avoids assuming that the Individual's ID is
+               * necessarily related to the ID of any of its Persona(s) */
+              foreach (Folks.Persona p in i.personas)
+                {
+                  if (p is Tpf.Persona)
+                    if (added_individuals.remove (((Tpf.Persona) p).display_id))
+                      break;
+                }
+            }
+
+          assert (removed == null);
+        });
+
+      /* Kill the main loop after a few seconds. If there are still individuals
+       * in the set of expected individuals, the aggregator has either failed or
+       * been too slow (which we can consider to be failure). */
+      Timeout.add_seconds (3, () =>
+        {
+          main_loop.quit ();
+          return false;
+        });
+
+      Idle.add (() =>
+        {
+          aggregator.prepare.begin ((s,r) =>
+            {
+              try
+                {
+                  aggregator.prepare.end (r);
+                }
+              catch (GLib.Error e1)
+                {
+                  GLib.critical ("failed to prepare aggregator: %s",
+                    e1.message);
+                  assert_not_reached ();
+                }
+
+              aggregator.store_changed.connect ((store, is_member) =>
+                {
+                  if (store.type_id != "telepathy" || !is_member)
+                    return;
+
+                  foreach (var id in added_individuals)
+                    {
+                      var details = new HashTable<string, GLib.Value?> (
+                          str_hash, str_equal);
+
+                      details.insert ("contact", id);
+                      aggregator.add_persona_from_details.begin (null,
+                          "telepathy", this.account_path, details, (s,res) =>
+                          {
+                            try
+                              {
+                                aggregator.add_persona_from_details.end (res);
+                              }
+                            catch (GLib.Error e2)
+                              {
+                                GLib.critical ("failed to add persona: %s",
+                                  e2.message);
+                                assert_not_reached ();
+                              }
+                          });
+
+                    }
+                });
+
+            });
+
+          return false;
+        });
+
+      main_loop.run ();
+
+      /* We should have received (and removed) the individuals in the set */
+      assert (added_individuals.size == 0);
+
+      /* necessary to reset the aggregator for the next test */
+      aggregator = null;
     }
 
   public void test_individual_properties ()
@@ -198,7 +336,7 @@ public class ContactRetrievalTests : Folks.TestCase
           foreach (Individual i in added)
             {
               /* We only check one */
-              if (i.id != "telepathy:protocol:olivier@example.com")
+              if (i.id != (this.individual_id_prefix + "olivier@example.com"))
                 {
                   continue;
                 }
@@ -229,6 +367,9 @@ public class ContactRetrievalTests : Folks.TestCase
         });
 
       main_loop.run ();
+
+      /* necessary to reset the aggregator for the next test */
+      aggregator = null;
     }
 }
 
