diff --git a/Core/FormBrowser.cs b/Core/FormBrowser.cs
index 2c7aa659..e52a7b2d 100644
--- a/Core/FormBrowser.cs
+++ b/Core/FormBrowser.cs
@@ -209,12 +209,7 @@ private void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
                 TweetDeckBridge.RestoreSessionData(e.Frame);
                 ScriptLoader.ExecuteFile(e.Frame, "code.js");
                 ReinjectCustomCSS(Config.CustomBrowserCSS);
-
-                if (plugins.HasAnyPlugin(PluginEnvironment.Browser)){
-                    ScriptLoader.ExecuteFile(e.Frame, PluginManager.PluginBrowserScriptFile);
-                    ScriptLoader.ExecuteFile(e.Frame, PluginManager.PluginGlobalScriptFile);
-                    plugins.ExecutePlugins(e.Frame, PluginEnvironment.Browser, true);
-                }
+                plugins.ExecutePlugins(e.Frame, PluginEnvironment.Browser);
 
                 TweetDeckBridge.ResetStaticProperties();
 
diff --git a/Core/Notification/FormNotificationMain.cs b/Core/Notification/FormNotificationMain.cs
index 10fae3d6..dde55700 100644
--- a/Core/Notification/FormNotificationMain.cs
+++ b/Core/Notification/FormNotificationMain.cs
@@ -17,10 +17,7 @@ partial class FormNotificationMain : FormNotificationBase{
         private const int TimerBarHeight = 4;
 
         private static readonly string NotificationScriptIdentifier = ScriptLoader.GetRootIdentifier(NotificationScriptFile);
-        private static readonly string PluginScriptIdentifier = ScriptLoader.GetRootIdentifier(PluginManager.PluginNotificationScriptFile);
-
         private static readonly string NotificationJS = ScriptLoader.LoadResource(NotificationScriptFile);
-        private static readonly string PluginJS = ScriptLoader.LoadResource(PluginManager.PluginNotificationScriptFile);
         
         private readonly PluginManager plugins;
 
@@ -169,12 +166,7 @@ private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
             if (e.Frame.IsMain && NotificationJS != null && browser.Address != "about:blank"){
                 e.Frame.ExecuteJavaScriptAsync(PropertyBridge.GenerateScript(PropertyBridge.Environment.Notification));
                 ScriptLoader.ExecuteScript(e.Frame, NotificationJS, NotificationScriptIdentifier);
-
-                if (plugins.HasAnyPlugin(PluginEnvironment.Notification)){
-                    ScriptLoader.ExecuteScript(e.Frame, PluginJS, PluginScriptIdentifier);
-                    ScriptLoader.ExecuteFile(e.Frame, PluginManager.PluginGlobalScriptFile);
-                    plugins.ExecutePlugins(e.Frame, PluginEnvironment.Notification, false);
-                }
+                plugins.ExecutePlugins(e.Frame, PluginEnvironment.Notification);
             }
         }
 
diff --git a/Plugins/Enums/PluginEnvironment.cs b/Plugins/Enums/PluginEnvironment.cs
index bc86ee19..23702dba 100644
--- a/Plugins/Enums/PluginEnvironment.cs
+++ b/Plugins/Enums/PluginEnvironment.cs
@@ -17,7 +17,20 @@ public static IEnumerable<PluginEnvironment> Values{
             }
         }
 
-        public static string GetScriptFile(this PluginEnvironment environment){
+        public static bool IncludesDisabledPlugins(this PluginEnvironment environment){
+            return environment == PluginEnvironment.Browser;
+        }
+
+        public static string GetScriptIdentifier(this PluginEnvironment environment){
+            switch(environment){
+                case PluginEnvironment.None: return "root:plugins";
+                case PluginEnvironment.Browser: return "root:plugins.browser";
+                case PluginEnvironment.Notification: return "root:plugins.notification";
+                default: return null;
+            }
+        }
+
+        public static string GetPluginScriptFile(this PluginEnvironment environment){
             switch(environment){
                 case PluginEnvironment.Browser: return "browser.js";
                 case PluginEnvironment.Notification: return "notification.js";
@@ -25,7 +38,7 @@ public static string GetScriptFile(this PluginEnvironment environment){
             }
         }
 
-        public static string GetScriptVariables(this PluginEnvironment environment){
+        public static string GetPluginScriptVariables(this PluginEnvironment environment){
             switch(environment){
                 case PluginEnvironment.Browser: return "$,$TD,$TDP,TD";
                 case PluginEnvironment.Notification: return "$TD,$TDP";
diff --git a/Plugins/Plugin.cs b/Plugins/Plugin.cs
index 16e14edd..46edb4fb 100644
--- a/Plugins/Plugin.cs
+++ b/Plugins/Plugin.cs
@@ -84,7 +84,7 @@ private void OnMetadataLoaded(){
 
         public string GetScriptPath(PluginEnvironment environment){
             if (Environments.HasFlag(environment)){
-                string file = environment.GetScriptFile();
+                string file = environment.GetPluginScriptFile();
                 return file != null ? Path.Combine(pathRoot, file) : string.Empty;
             }
             else{
@@ -152,7 +152,7 @@ public static Plugin CreateFromFolder(string path, PluginGroup group, out string
 
         private static bool LoadEnvironments(string path, Plugin plugin, out string error){
             foreach(string file in Directory.EnumerateFiles(path, "*.js", SearchOption.TopDirectoryOnly).Select(Path.GetFileName)){
-                plugin.Environments |= PluginEnvironmentExtensions.Values.FirstOrDefault(env => file.Equals(env.GetScriptFile(), StringComparison.Ordinal));
+                plugin.Environments |= PluginEnvironmentExtensions.Values.FirstOrDefault(env => file.Equals(env.GetPluginScriptFile(), StringComparison.Ordinal));
             }
 
             if (plugin.Environments == PluginEnvironment.None){
diff --git a/Plugins/PluginManager.cs b/Plugins/PluginManager.cs
index 1d0f994d..a0c1056f 100644
--- a/Plugins/PluginManager.cs
+++ b/Plugins/PluginManager.cs
@@ -9,12 +9,14 @@
 
 namespace TweetDuck.Plugins{
     sealed class PluginManager{
-        public const string PluginBrowserScriptFile = "plugins.browser.js";
-        public const string PluginNotificationScriptFile = "plugins.notification.js";
-        public const string PluginGlobalScriptFile = "plugins.js";
-
         private const int InvalidToken = 0;
 
+        private static readonly Dictionary<PluginEnvironment, string> PluginSetupScripts = new Dictionary<PluginEnvironment, string>(4){
+            { PluginEnvironment.None, ScriptLoader.LoadResource("plugins.js") },
+            { PluginEnvironment.Browser, ScriptLoader.LoadResource("plugins.browser.js") },
+            { PluginEnvironment.Notification, ScriptLoader.LoadResource("plugins.notification.js") }
+        };
+
         public string PathOfficialPlugins => Path.Combine(rootPath, "official");
         public string PathCustomPlugins => Path.Combine(rootPath, "user");
 
@@ -97,7 +99,17 @@ public void Reload(){
             Reloaded?.Invoke(this, new PluginErrorEventArgs(loadErrors));
         }
 
-        public void ExecutePlugins(IFrame frame, PluginEnvironment environment, bool includeDisabled){
+        public void ExecutePlugins(IFrame frame, PluginEnvironment environment){
+            if (HasAnyPlugin(environment)){
+                ScriptLoader.ExecuteScript(frame, PluginSetupScripts[environment], environment.GetScriptIdentifier());
+                ScriptLoader.ExecuteScript(frame, PluginSetupScripts[PluginEnvironment.None], PluginEnvironment.None.GetScriptIdentifier());
+                ExecutePluginScripts(frame, environment);
+            }
+        }
+
+        private void ExecutePluginScripts(IFrame frame, PluginEnvironment environment){
+            bool includeDisabled = environment.IncludesDisabledPlugins();
+
             if (includeDisabled){
                 ScriptLoader.ExecuteScript(frame, PluginScriptGenerator.GenerateConfig(Config), "gen:pluginconfig");
             }
diff --git a/Plugins/PluginScriptGenerator.cs b/Plugins/PluginScriptGenerator.cs
index d05ac36d..a85c9d5f 100644
--- a/Plugins/PluginScriptGenerator.cs
+++ b/Plugins/PluginScriptGenerator.cs
@@ -8,7 +8,7 @@ public static string GenerateConfig(PluginConfig config){
 
         public static string GeneratePlugin(string pluginIdentifier, string pluginContents, int pluginToken, PluginEnvironment environment){
             return PluginGen
-                .Replace("%params", environment.GetScriptVariables())
+                .Replace("%params", environment.GetPluginScriptVariables())
                 .Replace("%id", pluginIdentifier)
                 .Replace("%token", pluginToken.ToString())
                 .Replace("%contents", pluginContents);