diff --git a/tests/folks/Makefile.am b/tests/folks/Makefile.am
index dd96a8d..09ee7ab 100644
--- a/tests/folks/Makefile.am
+++ b/tests/folks/Makefile.am
@@ -39,6 +39,7 @@ AM_VALAFLAGS = \
 
 # in order from least to most complex
 noinst_PROGRAMS = \
+	field-details \
 	backend-loading \
 	aggregation \
 	$(NULL)
@@ -62,6 +63,10 @@ aggregation_SOURCES = \
 	aggregation.vala \
 	$(NULL)
 
+field_details_SOURCES = \
+	field-details.vala \
+	$(NULL)
+
 CLEANFILES = \
         *.pid \
         *.address \
@@ -72,6 +77,7 @@ MAINTAINERCLEANFILES = \
         $(addsuffix .c,$(noinst_PROGRAMS)) \
         backend_loading_vala.stamp \
         aggregation_vala.stamp \
+        field_details_vala.stamp \
         $(NULL)
 
 EXTRA_DIST = \
diff --git a/tests/folks/field-details.vala b/tests/folks/field-details.vala
new file mode 100644
index 0000000..d267cca
--- /dev/null
+++ b/tests/folks/field-details.vala
@@ -0,0 +1,98 @@
+using Folks;
+
+public class FieldDetailsTests : Folks.TestCase
+{
+  public FieldDetailsTests ()
+    {
+      base ("FieldDetails");
+      this.add_test ("parameter replacement", this.test_param_replacement);
+    }
+
+  public override void set_up ()
+    {
+    }
+
+  public override void tear_down ()
+    {
+    }
+
+  public void test_param_replacement ()
+    {
+      string param_name = "metasyntactic-variables";
+      string[] values_1 = {"foo", "bar", "baz"};
+      string[] values_2 = {"qux", "quxx"};
+      FieldDetails details;
+      uint i;
+      unowned GLib.List<string> values;
+
+      details = new FieldDetails (param_name);
+
+      foreach (var val in values_1)
+        details.add_parameter (param_name, val);
+
+      /* populate with first list of param values */
+      i = 0;
+      values = details.get_parameter_values (param_name);
+      assert (values.length () == values_1.length);
+      values.foreach ((v) =>
+        {
+          assert (v == values_1[i]);
+          i++;
+        });
+
+      /* replace the list of param values */
+      i = 0;
+      details.set_parameter (param_name, values_2[0]);
+      values = details.get_parameter_values (param_name);
+      assert (values.length () == 1);
+      values.foreach ((v) =>
+        {
+          assert (v == values_2[i]);
+          i++;
+        });
+
+      /* clear the list */
+      details.remove_parameter_all (param_name);
+      values = details.get_parameter_values (param_name);
+      assert (values == null);
+
+      /* populate with the combined list of values */
+      foreach (var val in values_1)
+        details.add_parameter (param_name, val);
+
+      var values_2_list = new GLib.List<string> ();
+      foreach (var val in values_2)
+        values_2_list.append (val);
+
+      var param_table = new HashTable<string, unowned List<string>> (str_hash,
+          str_equal);
+      param_table.insert (param_name, values_2_list);
+
+      details.extend_parameters (param_table);
+      values = details.get_parameter_values (param_name);
+      assert (values.length () == (values_1.length + values_2.length));
+      i = 0;
+      foreach (var val in values_1)
+        {
+          assert (values.nth_data (i) == val);
+          i++;
+        }
+      foreach (var val in values_2)
+        {
+          assert (values.nth_data (i) == val);
+          i++;
+        }
+    }
+}
+
+public int main (string[] args)
+{
+  Test.init (ref args);
+
+  TestSuite root = TestSuite.get_root ();
+  root.add_suite (new FieldDetailsTests ().get_suite ());
+
+  Test.run ();
+
+  return 0;
+}
