Index: options.js
===================================================================
--- a/options.js
+++ b/options.js
@@ -67,7 +67,17 @@
   $("#removeCustomFilter").click(removeSelectedFilters);
   $("#rawFiltersButton").click(toggleFiltersInRawFormat);
   $("#importRawFilters").click(importRawFiltersText);
-  FilterNotifier.addListener(onFilterChange);
+
+  FilterNotifier.on("load", reloadFilters);
+  FilterNotifier.on("subscription.title", onSubscriptionChange);
+  FilterNotifier.on("subscription.disabled", onSubscriptionChange);
+  FilterNotifier.on("subscription.homepage", onSubscriptionChange);
+  FilterNotifier.on("subscription.lastDownload", onSubscriptionChange);
+  FilterNotifier.on("subscription.downloadStatus", onSubscriptionChange);
+  FilterNotifier.on("subscription.added", onSubscriptionAdded);
+  FilterNotifier.on("subscription.removed", onSubscriptionRemoved);
+  FilterNotifier.on("filter.added", onFilterAdded);
+  FilterNotifier.on("filter.removed", onFilterRemoved);
 
   // Display jQuery UI elements
   $("#tabs").tabs();
@@ -175,7 +185,16 @@
 // Cleans up when the options window is closed
 function unloadOptions()
 {
-  FilterNotifier.removeListener(onFilterChange);
+  FilterNotifier.off("load", reloadFilters);
+  FilterNotifier.off("subscription.title", onSubscriptionChange);
+  FilterNotifier.off("subscription.disabled", onSubscriptionChange);
+  FilterNotifier.off("subscription.homepage", onSubscriptionChange);
+  FilterNotifier.off("subscription.lastDownload", onSubscriptionChange);
+  FilterNotifier.off("subscription.downloadStatus", onSubscriptionChange);
+  FilterNotifier.off("subscription.added", onSubscriptionAdded);
+  FilterNotifier.off("subscription.removed", onSubscriptionRemoved);
+  FilterNotifier.off("filter.added", onFilterAdded);
+  FilterNotifier.off("filter.removed", onFilterRemoved);
 }
 
 function initCheckbox(id, descriptor)
@@ -421,61 +440,59 @@
   }
 }
 
-function onFilterChange(action, item, param1, param2)
+function onSubscriptionChange(subscription)
 {
-  switch (action)
+  var element = findSubscriptionElement(subscription);
+  if (element)
+    updateSubscriptionInfo(element);
+}
+
+function onSubscriptionAdded(subscription)
+{
+  if (subscription instanceof SpecialSubscription)
   {
-    case "load":
-      reloadFilters();
-      break;
-    case "subscription.title":
-    case "subscription.disabled":
-    case "subscription.homepage":
-    case "subscription.lastDownload":
-    case "subscription.downloadStatus":
-      var element = findSubscriptionElement(item);
-      if (element)
-        updateSubscriptionInfo(element);
-      break;
-    case "subscription.added":
-      if (item instanceof SpecialSubscription)
-      {
-        for (var i = 0; i < item.filters.length; i++)
-          onFilterChange("filter.added", item.filters[i]);
-      }
-      else if (item.url == Prefs.subscriptions_exceptionsurl)
-        $("#acceptableAds").prop("checked", true);
-      else if (!findSubscriptionElement(item))
-        addSubscriptionEntry(item);
-      break;
-    case "subscription.removed":
-      if (item instanceof SpecialSubscription)
-      {
-        for (var i = 0; i < item.filters.length; i++)
-          onFilterChange("filter.removed", item.filters[i]);
-      }
-      else if (item.url == Prefs.subscriptions_exceptionsurl)
-        $("#acceptableAds").prop("checked", false);
-      else
-      {
-        var element = findSubscriptionElement(item);
-        if (element)
-          element.parentNode.removeChild(element);
-      }
-      break;
-    case "filter.added":
-      if (item instanceof WhitelistFilter && /^@@\|\|([^\/:]+)\^\$document$/.test(item.text))
-        appendToListBox("excludedDomainsBox", RegExp.$1);
-      else
-        appendToListBox("userFiltersBox", item.text);
-      break;
-    case "filter.removed":
-      if (item instanceof WhitelistFilter && /^@@\|\|([^\/:]+)\^\$document$/.test(item.text))
-        removeFromListBox("excludedDomainsBox", RegExp.$1);
-      else
-        removeFromListBox("userFiltersBox", item.text);
-      break;
+    for (var i = 0; i < subscription.filters.length; i++)
+      onFilterChange("filter.added", subscription.filters[i]);
   }
+  else if (subscription.url == Prefs.subscriptions_exceptionsurl)
+    $("#acceptableAds").prop("checked", true);
+  else if (!findSubscriptionElement(subscription))
+    addSubscriptionEntry(subscription);
+}
+
+function onSubscriptionRemoved(subscription)
+{
+  if (subscription instanceof SpecialSubscription)
+  {
+    for (var i = 0; i < subscription.filters.length; i++)
+      onFilterChange("filter.removed", subscription.filters[i]);
+  }
+  else if (subscription.url == Prefs.subscriptions_exceptionsurl)
+    $("#acceptableAds").prop("checked", false);
+  else
+  {
+    var element = findSubscriptionElement(subscription);
+    if (element)
+      element.parentNode.removeChild(element);
+  }
+}
+
+function onFilterAdded(filter)
+{
+  if (filter instanceof WhitelistFilter &&
+      /^@@\|\|([^\/:]+)\^\$document$/.test(filter.text))
+    appendToListBox("excludedDomainsBox", RegExp.$1);
+  else
+    appendToListBox("userFiltersBox", filter.text);
+}
+
+function onFilterRemoved(filter)
+{
+  if (filter instanceof WhitelistFilter &&
+      /^@@\|\|([^\/:]+)\^\$document$/.test(filter.text))
+    removeFromListBox("excludedDomainsBox", RegExp.$1);
+  else
+    removeFromListBox("userFiltersBox", filter.text);
 }
 
 // Populates a list box with a number of entries
