diff --git a/Core/FormBrowser.cs b/Core/FormBrowser.cs
index b8b6b9f4..1729e3fc 100644
--- a/Core/FormBrowser.cs
+++ b/Core/FormBrowser.cs
@@ -112,6 +112,7 @@ private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
 
                 if (plugins.HasAnyPlugin(PluginEnvironment.Browser)){
                     ScriptLoader.ExecuteFile(e.Frame, PluginManager.PluginBrowserScriptFile);
+                    ScriptLoader.ExecuteFile(e.Frame, PluginManager.PluginGlobalScriptFile);
                     plugins.ExecutePlugins(e.Frame, PluginEnvironment.Browser, true);
                 }
             }
diff --git a/Core/FormNotification.cs b/Core/FormNotification.cs
index 57f1e378..d7e9e871 100644
--- a/Core/FormNotification.cs
+++ b/Core/FormNotification.cs
@@ -196,6 +196,7 @@ private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
 
                 if (plugins.HasAnyPlugin(PluginEnvironment.Notification)){
                     ScriptLoader.ExecuteScript(e.Frame, pluginJS, PluginScriptIdentifier);
+                    ScriptLoader.ExecuteFile(e.Frame, PluginManager.PluginGlobalScriptFile);
                     plugins.ExecutePlugins(e.Frame, PluginEnvironment.Notification, false);
                 }
             }
diff --git a/Plugins/PluginManager.cs b/Plugins/PluginManager.cs
index 9d7ddfa5..531b241f 100644
--- a/Plugins/PluginManager.cs
+++ b/Plugins/PluginManager.cs
@@ -10,6 +10,7 @@ namespace TweetDck.Plugins{
     class PluginManager{
         public const string PluginBrowserScriptFile = "plugins.browser.js";
         public const string PluginNotificationScriptFile = "plugins.notification.js";
+        public const string PluginGlobalScriptFile = "plugins.js";
 
         public string PathOfficialPlugins { get { return Path.Combine(rootPath, "official"); } }
         public string PathCustomPlugins { get { return Path.Combine(rootPath, "user"); } }
diff --git a/Resources/Scripts/plugins.js b/Resources/Scripts/plugins.js
new file mode 100644
index 00000000..7a720412
--- /dev/null
+++ b/Resources/Scripts/plugins.js
@@ -0,0 +1,26 @@
+(function($TDP){
+  //
+  // Block: Setup a simple JavaScript object configuration loader.
+  //
+  window.TDPF_loadConfigurationFile = function(pluginObject, fileName, onSuccess, onFailure){
+    $TDP.readFile(pluginObject.$token, fileName, true).then(contents => {
+      var obj;
+
+      try{
+        obj = eval("("+contents+")");
+      }catch(err){
+        if (!(onFailure && onFailure(err.message))){
+          alert("Problem loading '"+fileName+"' file for '"+pluginObject.$id+"' plugin, the JavaScript syntax is invalid: "+err.message);
+        }
+
+        return;
+      }
+
+      onSuccess && onSuccess(obj);
+    }).catch(err => {
+      if (!(onFailure && onFailure(err))){
+        alert("Problem loading '"+fileName+"' file for '"+pluginObject.$id+"' plugin: "+err);
+      }
+    });
+  };
+})($TDP);
\ No newline at end of file