Index: test/matcher.js
===================================================================
--- a/test/matcher.js
+++ b/test/matcher.js
@@ -348,25 +348,96 @@
 
   test.done();
 };
 
 exports.testAddRemoveByKeyword = function(test)
 {
   let matcher = new CombinedMatcher();
 
-  matcher.add(Filter.fromText("||example.com/foo/bar/image.jpg"));
+  matcher.add(Filter.fromText("||example.com/foo/bar/image.jpg^"));
 
   // Add the same filter a second time to make sure it doesn't get added again
   // by a different keyword.
-  matcher.add(Filter.fromText("||example.com/foo/bar/image.jpg"));
+  matcher.add(Filter.fromText("||example.com/foo/bar/image.jpg^"));
 
   test.ok(!!matcher.matchesAny("https://example.com/foo/bar/image.jpg",
                                RegExpFilter.typeMap.IMAGE));
 
-  matcher.remove(Filter.fromText("||example.com/foo/bar/image.jpg"));
+  matcher.remove(Filter.fromText("||example.com/foo/bar/image.jpg^"));
 
   // Make sure the filter got removed so there is no match.
   test.ok(!matcher.matchesAny("https://example.com/foo/bar/image.jpg",
                               RegExpFilter.typeMap.IMAGE));
 
+
+  // Map { "example" => { text: "||example.com^$~third-party" } }
+  matcher.add(Filter.fromText("||example.com^$~third-party"));
+
+  test.equal(matcher._blacklist._filterDomainMapsByKeyword.size, 1);
+
+  for (let [key, value] of matcher._blacklist._filterDomainMapsByKeyword)
+  {
+    test.equal(key, "example");
+    test.deepEqual(value, Filter.fromText("||example.com^$~third-party"));
+    break;
+  }
+
+  test.ok(!!matcher.matchesAny("https://example.com/example/image.jpg",
+                               RegExpFilter.typeMap.IMAGE, "example.com",
+                               false));
+
+  // Map {
+  //   "example" => Map {
+  //     "" => Map {
+  //       { text: "||example.com^$~third-party" } => true,
+  //       { text: "/example/*$~third-party" } => true
+  //     }
+  //   }
+  // }
+  matcher.add(Filter.fromText("/example/*$~third-party"));
+
+  test.equal(matcher._blacklist._filterDomainMapsByKeyword.size, 1);
+
+  for (let [key, value] of matcher._blacklist._filterDomainMapsByKeyword)
+  {
+    test.equal(key, "example");
+    test.equal(value.size, 1);
+
+    let map = value.get("");
+    test.equal(map.size, 2);
+    test.equal(map.get(Filter.fromText("||example.com^$~third-party")), true);
+    test.equal(map.get(Filter.fromText("/example/*$~third-party")), true);
+
+    break;
+  }
+
+  test.ok(!!matcher.matchesAny("https://example.com/example/image.jpg",
+                               RegExpFilter.typeMap.IMAGE, "example.com",
+                               false));
+
+  // Map { "example" => { text: "/example/*$~third-party" } }
+  matcher.remove(Filter.fromText("||example.com^$~third-party"));
+
+  test.equal(matcher._blacklist._filterDomainMapsByKeyword.size, 1);
+
+  for (let [key, value] of matcher._blacklist._filterDomainMapsByKeyword)
+  {
+    test.equal(key, "example");
+    test.deepEqual(value, Filter.fromText("/example/*$~third-party"));
+    break;
+  }
+
+  test.ok(!!matcher.matchesAny("https://example.com/example/image.jpg",
+                               RegExpFilter.typeMap.IMAGE, "example.com",
+                               false));
+
+  // Map {}
+  matcher.remove(Filter.fromText("/example/*$~third-party"));
+
+  test.equal(matcher._blacklist._filterDomainMapsByKeyword.size, 0);
+
+  test.ok(!matcher.matchesAny("https://example.com/example/image.jpg",
+                              RegExpFilter.typeMap.IMAGE, "example.com",
+                              false));
+
   test.done();
 };
