diff --git a/Core/FormBrowser.cs b/Core/FormBrowser.cs
index f0697b1f..bc5d1c9b 100644
--- a/Core/FormBrowser.cs
+++ b/Core/FormBrowser.cs
@@ -14,7 +14,6 @@
 using TweetDuck.Core.Other.Settings.Dialogs;
 using TweetDuck.Core.Utils;
 using TweetDuck.Plugins;
-using TweetDuck.Plugins.Enums;
 using TweetDuck.Plugins.Events;
 using TweetDuck.Updates;
 
@@ -79,11 +78,9 @@ public FormBrowser(){
             this.updateBridge.UpdateDelayed += updateBridge_UpdateDelayed;
             this.updateBridge.UpdateDismissed += updateBridge_UpdateDismissed;
 
-            this.browser = new TweetDeckBrowser(this, new TweetDeckBridge.Browser(this, notification), updateBridge);
+            this.browser = new TweetDeckBrowser(this, plugins, new TweetDeckBridge.Browser(this, notification), updateBridge);
             this.contextMenu = ContextMenuBrowser.CreateMenu(this);
 
-            this.plugins.Register(browser, PluginEnvironment.Browser, this, true);
-
             Controls.Add(new MenuStrip{ Visible = false }); // fixes Alt freezing the program in Win 10 Anniversary Update
 
             Disposed += (sender, args) => {
diff --git a/Core/Notification/FormNotificationMain.cs b/Core/Notification/FormNotificationMain.cs
index c5f2ae9a..1b553343 100644
--- a/Core/Notification/FormNotificationMain.cs
+++ b/Core/Notification/FormNotificationMain.cs
@@ -5,7 +5,6 @@
 using TweetDuck.Core.Bridge;
 using TweetDuck.Core.Controls;
 using TweetDuck.Core.Handling;
-using TweetDuck.Core.Other.Interfaces;
 using TweetDuck.Core.Utils;
 using TweetDuck.Data;
 using TweetDuck.Plugins;
@@ -13,7 +12,7 @@
 using TweetDuck.Resources;
 
 namespace TweetDuck.Core.Notification{
-    abstract partial class FormNotificationMain : FormNotificationBase, ITweetDeckBrowser{
+    abstract partial class FormNotificationMain : FormNotificationBase{
         private readonly PluginManager plugins;
         private readonly int timerBarHeight;
 
@@ -84,34 +83,12 @@ protected FormNotificationMain(FormBrowser owner, PluginManager pluginManager, b
             browser.LoadingStateChanged += Browser_LoadingStateChanged;
             browser.FrameLoadEnd += Browser_FrameLoadEnd;
 
-            plugins.Register(this, PluginEnvironment.Notification, this);
+            plugins.Register(browser, PluginEnvironment.Notification, this);
 
             mouseHookDelegate = MouseHookProc;
             Disposed += (sender, args) => StopMouseHook(true);
         }
 
-        // implementation of ITweetDeckBrowser
-
-        bool ITweetDeckBrowser.IsTweetDeckWebsite => IsNotificationVisible;
-
-        void ITweetDeckBrowser.RegisterBridge(string name, object obj){
-            browser.RegisterAsyncJsObject(name, obj);
-        }
-
-        void ITweetDeckBrowser.OnFrameLoaded(Action<IFrame> callback){
-            browser.FrameLoadEnd += (sender, args) => {
-                IFrame frame = args.Frame;
-
-                if (frame.IsMain && browser.Address != "about:blank"){
-                    callback(frame);
-                }
-            };
-        }
-
-        void ITweetDeckBrowser.ExecuteFunction(string name, params object[] args){
-            browser.ExecuteScriptAsync(name, args);
-        }
-
         // mouse wheel hook
 
         private void StartMouseHook(){
diff --git a/Core/Other/Interfaces/ITweetDeckBrowser.cs b/Core/Other/Interfaces/ITweetDeckBrowser.cs
deleted file mode 100644
index 8c0f8512..00000000
--- a/Core/Other/Interfaces/ITweetDeckBrowser.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-using CefSharp;
-
-namespace TweetDuck.Core.Other.Interfaces{
-    interface ITweetDeckBrowser{
-        bool IsTweetDeckWebsite { get; }
-
-        void RegisterBridge(string name, object obj);
-        void OnFrameLoaded(Action<IFrame> callback);
-        void ExecuteFunction(string name, params object[] args);
-    }
-}
diff --git a/Core/TweetDeckBrowser.cs b/Core/TweetDeckBrowser.cs
index c5053711..c176aaad 100644
--- a/Core/TweetDeckBrowser.cs
+++ b/Core/TweetDeckBrowser.cs
@@ -10,12 +10,13 @@
 using TweetDuck.Core.Handling;
 using TweetDuck.Core.Handling.General;
 using TweetDuck.Core.Notification;
-using TweetDuck.Core.Other.Interfaces;
 using TweetDuck.Core.Utils;
+using TweetDuck.Plugins;
+using TweetDuck.Plugins.Enums;
 using TweetDuck.Resources;
 
 namespace TweetDuck.Core{
-    sealed class TweetDeckBrowser : ITweetDeckBrowser, IDisposable{
+    sealed class TweetDeckBrowser : IDisposable{
         private static UserConfig Config => Program.Config.User;
 
         public bool Ready { get; private set; }
@@ -41,7 +42,7 @@ public bool IsTweetDeckWebsite{
 
         private string prevSoundNotificationPath = null;
 
-        public TweetDeckBrowser(FormBrowser owner, TweetDeckBridge tdBridge, UpdateBridge updateBridge){
+        public TweetDeckBrowser(FormBrowser owner, PluginManager plugins, TweetDeckBridge tdBridge, UpdateBridge updateBridge){
             RequestHandlerBrowser requestHandler = new RequestHandlerBrowser();
             
             this.browser = new ChromiumWebBrowser(TwitterUtils.TweetDeckURL){
@@ -71,6 +72,7 @@ public TweetDeckBrowser(FormBrowser owner, TweetDeckBridge tdBridge, UpdateBridg
             this.browser.SetupZoomEvents();
 
             owner.Controls.Add(browser);
+            plugins.Register(browser, PluginEnvironment.Browser, owner, true);
             
             Config.MuteToggled += Config_MuteToggled;
             Config.SoundNotificationChanged += Config_SoundNotificationInfoChanged;
@@ -96,24 +98,6 @@ public void Dispose(){
             
             browser.Dispose();
         }
-        
-        void ITweetDeckBrowser.RegisterBridge(string name, object obj){
-            browser.RegisterAsyncJsObject(name, obj);
-        }
-
-        void ITweetDeckBrowser.OnFrameLoaded(Action<IFrame> callback){
-            browser.FrameLoadEnd += (sender, args) => {
-                IFrame frame = args.Frame;
-
-                if (frame.IsMain && TwitterUtils.IsTweetDeckWebsite(frame)){
-                    callback(frame);
-                }
-            };
-        }
-
-        void ITweetDeckBrowser.ExecuteFunction(string name, params object[] args){
-            browser.ExecuteScriptAsync(name, args);
-        }
 
         // event handlers
 
diff --git a/Plugins/PluginManager.cs b/Plugins/PluginManager.cs
index 843f1303..290e97e8 100644
--- a/Plugins/PluginManager.cs
+++ b/Plugins/PluginManager.cs
@@ -5,7 +5,7 @@
 using System.IO;
 using System.Linq;
 using System.Windows.Forms;
-using TweetDuck.Core.Other.Interfaces;
+using TweetDuck.Core.Utils;
 using TweetDuck.Data;
 using TweetDuck.Plugins.Enums;
 using TweetDuck.Plugins.Events;
@@ -34,7 +34,7 @@ sealed class PluginManager{
         private readonly Dictionary<int, Plugin> tokens = new Dictionary<int, Plugin>();
         private readonly Random rand = new Random();
 
-        private ITweetDeckBrowser mainBrowser;
+        private IWebBrowser mainBrowser;
 
         public PluginManager(string rootPath, string configPath){
             this.rootPath = rootPath;
@@ -47,9 +47,16 @@ public PluginManager(string rootPath, string configPath){
             Config.PluginChangedState += Config_PluginChangedState;
         }
 
-        public void Register(ITweetDeckBrowser browser, PluginEnvironment environment, Control sync, bool asMainBrowser = false){
-            browser.OnFrameLoaded(frame => ExecutePlugins(frame, environment, sync));
-            browser.RegisterBridge("$TDP", bridge);
+        public void Register(IWebBrowser browser, PluginEnvironment environment, Control sync, bool asMainBrowser = false){
+            browser.FrameLoadEnd += (sender, args) => {
+                IFrame frame = args.Frame;
+
+                if (frame.IsMain && TwitterUtils.IsTweetDeckWebsite(frame)){
+                    ExecutePlugins(frame, environment, sync);
+                }
+            };
+
+            browser.RegisterAsyncJsObject("$TDP", bridge);
 
             if (asMainBrowser){
                 mainBrowser = browser;
@@ -57,7 +64,7 @@ public void Register(ITweetDeckBrowser browser, PluginEnvironment environment, C
         }
 
         private void Config_PluginChangedState(object sender, PluginChangedStateEventArgs e){
-            mainBrowser?.ExecuteFunction("TDPF_setPluginState", e.Plugin, e.IsEnabled);
+            mainBrowser?.ExecuteScriptAsync("TDPF_setPluginState", e.Plugin, e.IsEnabled);
             Config.Save(configPath);
         }
 
@@ -75,7 +82,7 @@ public bool IsPluginConfigurable(Plugin plugin){
 
         public void ConfigurePlugin(Plugin plugin){
             if (bridge.WithConfigureFunction.Contains(plugin)){
-                mainBrowser?.ExecuteFunction("TDPF_configurePlugin", plugin);
+                mainBrowser?.ExecuteScriptAsync("TDPF_configurePlugin", plugin);
             }
             else if (plugin.HasConfig){
                 if (File.Exists(plugin.ConfigPath)){
diff --git a/TweetDuck.csproj b/TweetDuck.csproj
index 3b77325e..37245a91 100644
--- a/TweetDuck.csproj
+++ b/TweetDuck.csproj
@@ -95,7 +95,6 @@
     <Compile Include="Core\Handling\RequestHandlerBase.cs" />
     <Compile Include="Core\Handling\RequestHandlerBrowser.cs" />
     <Compile Include="Core\Handling\ResourceHandlerNotification.cs" />
-    <Compile Include="Core\Other\Interfaces\ITweetDeckBrowser.cs" />
     <Compile Include="Core\Management\ContextInfo.cs" />
     <Compile Include="Core\Notification\Example\FormNotificationExample.cs">
       <SubType>Form</SubType>