diff --git a/js/Feeds.js b/js/Feeds.js
index 33a1fa3dc8385112eec9d6f3b0f9ce4687f5c032..b14caeaf99e2d9f4627597b490454cee85119905 100644
--- a/js/Feeds.js
+++ b/js/Feeds.js
@@ -113,7 +113,7 @@ const	Feeds = {
 		this.hideOrShowFeeds(App.getInitParam("hide_read_feeds"));
 		this._counters_prev = elems;
 
-		PluginHost.run(PluginHost.HOOK_COUNTERS_PROCESSED);
+		PluginHost.run(PluginHost.HOOK_COUNTERS_PROCESSED, elems);
 	},
 	reloadCurrent: function(method) {
 		if (this.getActive() != undefined) {
diff --git a/js/Headlines.js b/js/Headlines.js
index 28e43be1f9866f85df397173260c5157c86fd70f..8d7e06f41cdd0c38a7504424ef731660b95d0f0d 100755
--- a/js/Headlines.js
+++ b/js/Headlines.js
@@ -72,6 +72,8 @@ const Headlines = {
 			}
 		});
 
+		PluginHost.run(PluginHost.HOOK_HEADLINE_MUTATIONS, mutations);
+
 		Headlines.updateSelectedPrompt();
 
 		if ('requestIdleCallback' in window)
@@ -198,6 +200,8 @@ const Headlines = {
 				console.log('requesting counters for', feeds, labels);
 				Feeds.requestCounters(feeds, labels);
 			}
+
+			PluginHost.run(PluginHost.HOOK_HEADLINE_MUTATIONS_SYNCED, results);
 		});
 	},
 	click: function (event, id, in_body) {
diff --git a/js/PluginHost.js b/js/PluginHost.js
index caee79d588738d25262aacc0208b22e76ab08176..b54f1ece3d13d7ebe83707bd724ddcc9541c2708 100644
--- a/js/PluginHost.js
+++ b/js/PluginHost.js
@@ -17,6 +17,8 @@ const PluginHost = {
 	HOOK_HEADLINE_RENDERED: 12,
 	HOOK_COUNTERS_RECEIVED: 13,
 	HOOK_COUNTERS_PROCESSED: 14,
+	HOOK_HEADLINE_MUTATIONS: 15,
+	HOOK_HEADLINE_MUTATIONS_SYNCED: 16,
 	hooks: [],
 	register: function (name, callback) {
 		if (typeof(this.hooks[name]) == 'undefined')
@@ -25,7 +27,7 @@ const PluginHost = {
 		this.hooks[name].push(callback);
 	},
 	run: function (name, args) {
-		//console.warn('PluginHost::run ' + name);
+		//console.warn('PluginHost.run', name);
 
 		if (typeof(this.hooks[name]) != 'undefined')
 			for (let i = 0; i < this.hooks[name].length; i++) {