diff --git a/Configuration/UserConfig.cs b/Configuration/UserConfig.cs
index 4c761fdf..ac38cc59 100644
--- a/Configuration/UserConfig.cs
+++ b/Configuration/UserConfig.cs
@@ -23,9 +23,9 @@ sealed class UserConfig : ConfigManager.BaseConfig{
         public bool BestImageQuality          { get; set; } = true;
         public bool EnableAnimatedImages      { get; set; } = true;
 
-        public bool _enableSmoothScrolling = true;
-        public bool _enableTouchAdjustment = false;
-        public string _customCefArgs       = null;
+        private bool _enableSmoothScrolling = true;
+        private bool _enableTouchAdjustment = false;
+        private string _customCefArgs       = null;
 
         public string BrowserPath            { get; set; } = null;
         public bool IgnoreTrackingUrlWarning { get; set; } = false;
diff --git a/Core/Bridge/PropertyBridge.cs b/Core/Bridge/PropertyBridge.cs
index 8ab153f0..87f7e821 100644
--- a/Core/Bridge/PropertyBridge.cs
+++ b/Core/Bridge/PropertyBridge.cs
@@ -1,4 +1,5 @@
 using System.Text;
+using TweetDuck.Configuration;
 
 namespace TweetDuck.Core.Bridge{
     static class PropertyBridge{
@@ -10,20 +11,21 @@ public static string GenerateScript(Environment environment){
             string Bool(bool value) => value ? "true;" : "false;";
             string Str(string value) => '"'+value+"\";";
 
+            UserConfig config = Program.Config.User;
             StringBuilder build = new StringBuilder().Append("(function(x){");
 
-            build.Append("x.expandLinksOnHover=").Append(Bool(Program.UserConfig.ExpandLinksOnHover));
+            build.Append("x.expandLinksOnHover=").Append(Bool(config.ExpandLinksOnHover));
             
             if (environment == Environment.Browser){
-                build.Append("x.openSearchInFirstColumn=").Append(Bool(Program.UserConfig.OpenSearchInFirstColumn));
-                build.Append("x.keepLikeFollowDialogsOpen=").Append(Bool(Program.UserConfig.KeepLikeFollowDialogsOpen));
-                build.Append("x.muteNotifications=").Append(Bool(Program.UserConfig.MuteNotifications));
-                build.Append("x.notificationMediaPreviews=").Append(Bool(Program.UserConfig.NotificationMediaPreviews));
-                build.Append("x.translationTarget=").Append(Str(Program.UserConfig.TranslationTarget));
+                build.Append("x.openSearchInFirstColumn=").Append(Bool(config.OpenSearchInFirstColumn));
+                build.Append("x.keepLikeFollowDialogsOpen=").Append(Bool(config.KeepLikeFollowDialogsOpen));
+                build.Append("x.muteNotifications=").Append(Bool(config.MuteNotifications));
+                build.Append("x.notificationMediaPreviews=").Append(Bool(config.NotificationMediaPreviews));
+                build.Append("x.translationTarget=").Append(Str(config.TranslationTarget));
             }
 
             if (environment == Environment.Notification){
-                build.Append("x.skipOnLinkClick=").Append(Bool(Program.UserConfig.NotificationSkipOnLinkClick));
+                build.Append("x.skipOnLinkClick=").Append(Bool(config.NotificationSkipOnLinkClick));
             }
             
             return build.Append("})(window.$TDX=window.$TDX||{})").ToString();
diff --git a/Core/FormBrowser.cs b/Core/FormBrowser.cs
index 667d8ba2..f0697b1f 100644
--- a/Core/FormBrowser.cs
+++ b/Core/FormBrowser.cs
@@ -20,7 +20,7 @@
 
 namespace TweetDuck.Core{
     sealed partial class FormBrowser : Form, AnalyticsFile.IProvider{
-        private static UserConfig Config => Program.UserConfig;
+        private static UserConfig Config => Program.Config.User;
 
         public bool IsWaiting{
             set{
diff --git a/Core/Handling/ContextMenuBase.cs b/Core/Handling/ContextMenuBase.cs
index 90ed091a..035e8bce 100644
--- a/Core/Handling/ContextMenuBase.cs
+++ b/Core/Handling/ContextMenuBase.cs
@@ -6,6 +6,7 @@
 using TweetDuck.Core.Controls;
 using TweetDuck.Core.Utils;
 using System.Linq;
+using TweetDuck.Configuration;
 using TweetDuck.Core.Bridge;
 using TweetDuck.Core.Management;
 using TweetDuck.Core.Notification;
@@ -15,7 +16,9 @@
 
 namespace TweetDuck.Core.Handling{
     abstract class ContextMenuBase : IContextMenuHandler{
-        private static TwitterUtils.ImageQuality ImageQuality => Program.UserConfig.TwitterImageQuality;
+        protected static UserConfig Config => Program.Config.User;
+
+        private static TwitterUtils.ImageQuality ImageQuality => Config.TwitterImageQuality;
         
         private const CefMenuCommand MenuOpenLinkUrl     = (CefMenuCommand)26500;
         private const CefMenuCommand MenuCopyLinkUrl     = (CefMenuCommand)26501;
diff --git a/Core/Handling/ContextMenuBrowser.cs b/Core/Handling/ContextMenuBrowser.cs
index 782bb78b..fd6b4493 100644
--- a/Core/Handling/ContextMenuBrowser.cs
+++ b/Core/Handling/ContextMenuBrowser.cs
@@ -77,7 +77,7 @@ public override void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser br
             
                 globalMenu.AddItem(CefMenuCommand.Reload, TitleReloadBrowser);
                 globalMenu.AddCheckItem(MenuMute, TitleMuteNotifications);
-                globalMenu.SetChecked(MenuMute, Program.UserConfig.MuteNotifications);
+                globalMenu.SetChecked(MenuMute, Config.MuteNotifications);
                 globalMenu.AddSeparator();
 
                 globalMenu.AddItem(MenuSettings, TitleSettings);
@@ -163,7 +163,7 @@ public static ContextMenu CreateMenu(FormBrowser form){
             menu.MenuItems.Add(TitleAboutProgram,  (sender, args) => form.OpenAbout());
 
             menu.Popup += (sender, args) => {
-                menu.MenuItems[1].Checked = Program.UserConfig.MuteNotifications;
+                menu.MenuItems[1].Checked = Config.MuteNotifications;
                 form.AnalyticsFile.BrowserContextMenus.Trigger();
             };
 
@@ -171,8 +171,8 @@ public static ContextMenu CreateMenu(FormBrowser form){
         }
 
         private static void ToggleMuteNotifications(){
-            Program.UserConfig.MuteNotifications = !Program.UserConfig.MuteNotifications;
-            Program.UserConfig.Save();
+            Config.MuteNotifications = !Config.MuteNotifications;
+            Config.Save();
         }
     }
 }
diff --git a/Core/Handling/General/BrowserProcessHandler.cs b/Core/Handling/General/BrowserProcessHandler.cs
index f8344443..f3078559 100644
--- a/Core/Handling/General/BrowserProcessHandler.cs
+++ b/Core/Handling/General/BrowserProcessHandler.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Threading.Tasks;
 using CefSharp;
+using TweetDuck.Configuration;
 
 namespace TweetDuck.Core.Handling.General{
     sealed class BrowserProcessHandler : IBrowserProcessHandler{
@@ -9,10 +10,12 @@ public static Task UpdatePrefs(){
         }
 
         private static void UpdatePrefsInternal(){
+            UserConfig config = Program.Config.User;
+
             using(IRequestContext ctx = Cef.GetGlobalRequestContext()){
-                ctx.SetPreference("browser.enable_spellchecking", Program.UserConfig.EnableSpellCheck, out string _);
-                ctx.SetPreference("spellcheck.dictionary", Program.UserConfig.SpellCheckLanguage, out string _);
-                ctx.SetPreference("settings.a11y.animation_policy", Program.UserConfig.EnableAnimatedImages ? "allowed" : "none", out string _);
+                ctx.SetPreference("browser.enable_spellchecking", config.EnableSpellCheck, out string _);
+                ctx.SetPreference("spellcheck.dictionary", config.SpellCheckLanguage, out string _);
+                ctx.SetPreference("settings.a11y.animation_policy", config.EnableAnimatedImages ? "allowed" : "none", out string _);
             }
         }
 
diff --git a/Core/Management/BrowserCache.cs b/Core/Management/BrowserCache.cs
index 0e61f528..6d20ed44 100644
--- a/Core/Management/BrowserCache.cs
+++ b/Core/Management/BrowserCache.cs
@@ -28,7 +28,7 @@ public static void GetCacheSize(Action<Task<long>> callbackBytes){
         }
         
         public static void RefreshTimer(){
-            bool shouldRun = Program.SystemConfig.ClearCacheAutomatically && !ClearOnExit;
+            bool shouldRun = Program.Config.System.ClearCacheAutomatically && !ClearOnExit;
 
             if (!shouldRun && AutoClearTimer != null){
                 AutoClearTimer.Dispose();
@@ -38,7 +38,7 @@ public static void RefreshTimer(){
                 AutoClearTimer = new Timer(state => {
                     if (AutoClearTimer != null){
                         try{
-                            if (CalculateCacheSize() >= Program.SystemConfig.ClearCacheThreshold*1024L*1024L){
+                            if (CalculateCacheSize() >= Program.Config.System.ClearCacheThreshold*1024L*1024L){
                                 SetClearOnExit();
                             }
                         }catch(Exception){
diff --git a/Core/Management/VideoPlayer.cs b/Core/Management/VideoPlayer.cs
index be87dc8e..07359fae 100644
--- a/Core/Management/VideoPlayer.cs
+++ b/Core/Management/VideoPlayer.cs
@@ -2,6 +2,7 @@
 using System.Diagnostics;
 using System.IO;
 using System.Windows.Forms;
+using TweetDuck.Configuration;
 using TweetDuck.Core.Controls;
 using TweetDuck.Core.Other;
 using TweetDuck.Core.Utils;
@@ -9,6 +10,8 @@
 
 namespace TweetDuck.Core.Management{
     sealed class VideoPlayer : IDisposable{
+        private static UserConfig Config => Program.Config.User;
+
         public bool Running => currentInstance != null && currentInstance.Running;
 
         public event EventHandler ProcessExited;
@@ -37,7 +40,7 @@ public void Launch(string url, string username){
 
                 if ((process = Process.Start(new ProcessStartInfo{
                     FileName = Path.Combine(Program.ProgramPath, "TweetDuck.Video.exe"),
-                    Arguments = $"{owner.Handle} {Program.UserConfig.VideoPlayerVolume} \"{url}\" \"{pipe.GenerateToken()}\"",
+                    Arguments = $"{owner.Handle} {Config.VideoPlayerVolume} \"{url}\" \"{pipe.GenerateToken()}\"",
                     UseShellExecute = false,
                     RedirectStandardOutput = true
                 })) != null){
@@ -68,9 +71,9 @@ private void pipe_DataIn(object sender, DuplexPipe.PipeReadEventArgs e){
             owner.InvokeSafe(() => {
                 switch(e.Key){
                     case "vol":
-                        if (int.TryParse(e.Data, out int volume) && volume != Program.UserConfig.VideoPlayerVolume){
-                            Program.UserConfig.VideoPlayerVolume = volume;
-                            Program.UserConfig.Save();
+                        if (int.TryParse(e.Data, out int volume) && volume != Config.VideoPlayerVolume){
+                            Config.VideoPlayerVolume = volume;
+                            Config.Save();
                         }
 
                         break;
diff --git a/Core/Notification/Example/FormNotificationExample.cs b/Core/Notification/Example/FormNotificationExample.cs
index a85fdb7d..4edf7a49 100644
--- a/Core/Notification/Example/FormNotificationExample.cs
+++ b/Core/Notification/Example/FormNotificationExample.cs
@@ -8,11 +8,11 @@
 namespace TweetDuck.Core.Notification.Example{
     sealed class FormNotificationExample : FormNotificationMain{
         public override bool RequiresResize => true;
-        protected override bool CanDragWindow => Program.UserConfig.NotificationPosition == TweetNotification.Position.Custom;
+        protected override bool CanDragWindow => Config.NotificationPosition == TweetNotification.Position.Custom;
         
         protected override FormBorderStyle NotificationBorderStyle{
             get{
-                if (Program.UserConfig.NotificationSize == TweetNotification.Size.Custom){
+                if (Config.NotificationSize == TweetNotification.Size.Custom){
                     switch(base.NotificationBorderStyle){
                         case FormBorderStyle.FixedSingle: return FormBorderStyle.Sizable;
                         case FormBorderStyle.FixedToolWindow: return FormBorderStyle.SizableToolWindow;
diff --git a/Core/Notification/FormNotificationBase.cs b/Core/Notification/FormNotificationBase.cs
index 9a9728ba..eef8a0c0 100644
--- a/Core/Notification/FormNotificationBase.cs
+++ b/Core/Notification/FormNotificationBase.cs
@@ -11,6 +11,8 @@
 
 namespace TweetDuck.Core.Notification{
     partial class FormNotificationBase : Form, AnalyticsFile.IProvider{
+        protected static UserConfig Config => Program.Config.User;
+
         protected static int FontSizeLevel{
             get{
                 switch(TweetDeckBridge.FontSize){
@@ -25,19 +27,18 @@ protected static int FontSizeLevel{
 
         protected virtual Point PrimaryLocation{
             get{
-                UserConfig config = Program.UserConfig;
                 Screen screen;
 
-                if (config.NotificationDisplay > 0 && config.NotificationDisplay <= Screen.AllScreens.Length){
-                    screen = Screen.AllScreens[config.NotificationDisplay-1];
+                if (Config.NotificationDisplay > 0 && Config.NotificationDisplay <= Screen.AllScreens.Length){
+                    screen = Screen.AllScreens[Config.NotificationDisplay-1];
                 }
                 else{
                     screen = Screen.FromControl(owner);
                 }
             
-                int edgeDist = config.NotificationEdgeDistance;
+                int edgeDist = Config.NotificationEdgeDistance;
 
-                switch(config.NotificationPosition){
+                switch(Config.NotificationPosition){
                     case TweetNotification.Position.TopLeft:
                         return new Point(screen.WorkingArea.X+edgeDist, screen.WorkingArea.Y+edgeDist);
 
@@ -51,12 +52,12 @@ protected virtual Point PrimaryLocation{
                         return new Point(screen.WorkingArea.X+screen.WorkingArea.Width-edgeDist-Width, screen.WorkingArea.Y+screen.WorkingArea.Height-edgeDist-Height);
 
                     case TweetNotification.Position.Custom:
-                        if (!config.IsCustomNotificationPositionSet){
-                            config.CustomNotificationPosition = new Point(screen.WorkingArea.X+screen.WorkingArea.Width-edgeDist-Width, screen.WorkingArea.Y+edgeDist);
-                            config.Save();
+                        if (!Config.IsCustomNotificationPositionSet){
+                            Config.CustomNotificationPosition = new Point(screen.WorkingArea.X+screen.WorkingArea.Width-edgeDist-Width, screen.WorkingArea.Y+edgeDist);
+                            Config.Save();
                         }
 
-                        return config.CustomNotificationPosition;
+                        return Config.CustomNotificationPosition;
                 }
 
                 return Location;
@@ -93,7 +94,7 @@ protected virtual FormBorderStyle NotificationBorderStyle{
         protected override bool ShowWithoutActivation => true;
         
         protected float DpiScale { get; }
-        protected double SizeScale => DpiScale*Program.UserConfig.ZoomLevel/100.0;
+        protected double SizeScale => DpiScale*Config.ZoomLevel/100.0;
 
         protected readonly FormBrowser owner;
         protected readonly ChromiumWebBrowser browser;
@@ -203,7 +204,7 @@ protected virtual void SetNotificationSize(int width, int height){
 
         protected virtual void UpdateTitle(){
             string title = currentNotification?.ColumnTitle;
-            Text = string.IsNullOrEmpty(title) || !Program.UserConfig.DisplayNotificationColumn ? Program.BrandName : Program.BrandName+" - "+title;
+            Text = string.IsNullOrEmpty(title) || !Config.DisplayNotificationColumn ? Program.BrandName : $"{Program.BrandName} - {title}";
         }
 
         public void ShowTweetDetail(){
diff --git a/Core/Notification/FormNotificationMain.cs b/Core/Notification/FormNotificationMain.cs
index 10bf22b7..d5563052 100644
--- a/Core/Notification/FormNotificationMain.cs
+++ b/Core/Notification/FormNotificationMain.cs
@@ -29,7 +29,7 @@ abstract partial class FormNotificationMain : FormNotificationBase, ITweetDeckBr
 
         public virtual bool RequiresResize{
             get{
-                return !prevDisplayTimer.HasValue || !prevFontSize.HasValue || prevDisplayTimer != Program.UserConfig.DisplayNotificationTimer || prevFontSize != FontSizeLevel;
+                return !prevDisplayTimer.HasValue || !prevFontSize.HasValue || prevDisplayTimer != Config.DisplayNotificationTimer || prevFontSize != FontSizeLevel;
             }
 
             set{
@@ -38,7 +38,7 @@ public virtual bool RequiresResize{
                     prevFontSize = null;
                 }
                 else{
-                    prevDisplayTimer = Program.UserConfig.DisplayNotificationTimer;
+                    prevDisplayTimer = Config.DisplayNotificationTimer;
                     prevFontSize = FontSizeLevel;
                 }
             }
@@ -46,29 +46,29 @@ public virtual bool RequiresResize{
 
         private int BaseClientWidth{
             get{
-                switch(Program.UserConfig.NotificationSize){
+                switch(Config.NotificationSize){
                     default:
                         return BrowserUtils.Scale(284, SizeScale*(1.0+0.05*FontSizeLevel));
 
                     case TweetNotification.Size.Custom:
-                        return Program.UserConfig.CustomNotificationSize.Width;
+                        return Config.CustomNotificationSize.Width;
                 }
             }
         }
 
         private int BaseClientHeight{
             get{
-                switch(Program.UserConfig.NotificationSize){
+                switch(Config.NotificationSize){
                     default:
                         return BrowserUtils.Scale(122, SizeScale*(1.0+0.08*FontSizeLevel));
 
                     case TweetNotification.Size.Custom:
-                        return Program.UserConfig.CustomNotificationSize.Height;
+                        return Config.CustomNotificationSize.Height;
                 }
             }
         }
         
-        public Size BrowserSize => Program.UserConfig.DisplayNotificationTimer ? new Size(ClientSize.Width, ClientSize.Height-timerBarHeight) : ClientSize;
+        public Size BrowserSize => Config.DisplayNotificationTimer ? new Size(ClientSize.Width, ClientSize.Height-timerBarHeight) : ClientSize;
 
         protected FormNotificationMain(FormBrowser owner, PluginManager pluginManager, bool enableContextMenu) : base(owner, enableContextMenu){
             InitializeComponent();
@@ -131,7 +131,7 @@ private IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam){
                 int eventType = wParam.ToInt32();
 
                 if (eventType == NativeMethods.WM_MOUSEWHEEL && IsCursorOverBrowser){
-                    browser.SendMouseWheelEvent(0, 0, 0, BrowserUtils.Scale(NativeMethods.GetMouseHookData(lParam), Program.UserConfig.NotificationScrollSpeed*0.01), CefEventFlags.None);
+                    browser.SendMouseWheelEvent(0, 0, 0, BrowserUtils.Scale(NativeMethods.GetMouseHookData(lParam), Config.NotificationScrollSpeed*0.01), CefEventFlags.None);
                     return NativeMethods.HOOK_HANDLED;
                 }
                 else if (eventType == NativeMethods.WM_XBUTTONDOWN && DesktopBounds.Contains(Cursor.Position)){
@@ -200,7 +200,7 @@ private void timerHideProgress_Tick(object sender, EventArgs e){
             timeLeft -= timerProgress.Interval;
 
             int value = BrowserUtils.Scale(progressBarTimer.Maximum+25, (totalTime-timeLeft)/(double)totalTime);
-            progressBarTimer.SetValueInstant(Program.UserConfig.NotificationTimerCountDown ? progressBarTimer.Maximum-value : value);
+            progressBarTimer.SetValueInstant(Config.NotificationTimerCountDown ? progressBarTimer.Maximum-value : value);
 
             if (timeLeft <= 0){
                 FinishCurrentNotification();
@@ -216,7 +216,7 @@ public virtual void ShowNotification(TweetNotification notification){
         public override void HideNotification(){
             base.HideNotification();
             
-            progressBarTimer.Value = Program.UserConfig.NotificationTimerCountDown ? progressBarTimer.Maximum : progressBarTimer.Minimum;
+            progressBarTimer.Value = Config.NotificationTimerCountDown ? progressBarTimer.Maximum : progressBarTimer.Minimum;
             timerProgress.Stop();
             totalTime = 0;
 
@@ -258,14 +258,14 @@ protected override string GetTweetHTML(TweetNotification tweet){
 
         protected override void LoadTweet(TweetNotification tweet){
             timerProgress.Stop();
-            totalTime = timeLeft = tweet.GetDisplayDuration(Program.UserConfig.NotificationDurationValue);
-            progressBarTimer.Value = Program.UserConfig.NotificationTimerCountDown ? progressBarTimer.Maximum : progressBarTimer.Minimum;
+            totalTime = timeLeft = tweet.GetDisplayDuration(Config.NotificationDurationValue);
+            progressBarTimer.Value = Config.NotificationTimerCountDown ? progressBarTimer.Maximum : progressBarTimer.Minimum;
 
             base.LoadTweet(tweet);
         }
 
         protected override void SetNotificationSize(int width, int height){
-            if (Program.UserConfig.DisplayNotificationTimer){
+            if (Config.DisplayNotificationTimer){
                 ClientSize = new Size(width, height+timerBarHeight);
                 progressBarTimer.Visible = true;
             }
diff --git a/Core/Notification/FormNotificationTweet.cs b/Core/Notification/FormNotificationTweet.cs
index 5410c92c..8917e539 100644
--- a/Core/Notification/FormNotificationTweet.cs
+++ b/Core/Notification/FormNotificationTweet.cs
@@ -32,10 +32,10 @@ protected override bool CanDragWindow{
         public FormNotificationTweet(FormBrowser owner, PluginManager pluginManager) : base(owner, pluginManager, true){
             InitializeComponent();
 
-            Program.UserConfig.MuteToggled += Config_MuteToggled;
-            Disposed += (sender, args) => Program.UserConfig.MuteToggled -= Config_MuteToggled;
+            Config.MuteToggled += Config_MuteToggled;
+            Disposed += (sender, args) => Config.MuteToggled -= Config_MuteToggled;
 
-            if (Program.UserConfig.MuteNotifications){
+            if (Config.MuteNotifications){
                 PauseNotification();
             }
         }
@@ -57,7 +57,7 @@ protected override void WndProc(ref Message m){
         // event handlers
 
         private void Config_MuteToggled(object sender, EventArgs e){
-            if (Program.UserConfig.MuteNotifications){
+            if (Config.MuteNotifications){
                 PauseNotification();
             }
             else{
@@ -73,7 +73,7 @@ private void timerCursorCheck_Tick(object sender, EventArgs e){
         }
 
         private void timerIdlePauseCheck_Tick(object sender, EventArgs e){
-            if (NativeMethods.GetIdleSeconds() < Program.UserConfig.NotificationIdlePauseSeconds){
+            if (NativeMethods.GetIdleSeconds() < Config.NotificationIdlePauseSeconds){
                 ResumeNotification();
                 timerIdlePauseCheck.Stop();
             }
@@ -128,7 +128,7 @@ public override void ResumeNotification(){
 
         private void LoadNextNotification(){
             if (!IsNotificationVisible){
-                if (Program.UserConfig.NotificationNonIntrusiveMode && IsCursorOverNotificationArea && NativeMethods.GetIdleSeconds() < NonIntrusiveIdleLimit){
+                if (Config.NotificationNonIntrusiveMode && IsCursorOverNotificationArea && NativeMethods.GetIdleSeconds() < NonIntrusiveIdleLimit){
                     if (!timerCursorCheck.Enabled){
                         PauseNotification();
                         timerCursorCheck.Start();
@@ -136,7 +136,7 @@ private void LoadNextNotification(){
 
                     return;
                 }
-                else if (Program.UserConfig.NotificationIdlePauseSeconds > 0 && NativeMethods.GetIdleSeconds() >= Program.UserConfig.NotificationIdlePauseSeconds){
+                else if (Config.NotificationIdlePauseSeconds > 0 && NativeMethods.GetIdleSeconds() >= Config.NotificationIdlePauseSeconds){
                     if (!timerIdlePauseCheck.Enabled){
                         PauseNotification();
                         timerIdlePauseCheck.Start();
diff --git a/Core/Notification/TweetNotification.cs b/Core/Notification/TweetNotification.cs
index 782d5b1d..7ef6975f 100644
--- a/Core/Notification/TweetNotification.cs
+++ b/Core/Notification/TweetNotification.cs
@@ -59,8 +59,8 @@ public string GenerateHtml(string bodyClasses, Control sync){
             build.Append(TweetDeckBridge.NotificationHeadLayout ?? DefaultHeadLayout);
             build.Append("<style type='text/css'>").Append(ScriptLoader.LoadResource("styles/notification.css", sync) ?? string.Empty).Append("</style>");
 
-            if (!string.IsNullOrEmpty(Program.UserConfig.CustomNotificationCSS)){
-                build.Append("<style type='text/css'>").Append(Program.UserConfig.CustomNotificationCSS).Append("</style>");
+            if (!string.IsNullOrEmpty(Program.Config.User.CustomNotificationCSS)){
+                build.Append("<style type='text/css'>").Append(Program.Config.User.CustomNotificationCSS).Append("</style>");
             }
             
             build.Append("</head>");
diff --git a/Core/Other/Analytics/AnalyticsReportGenerator.cs b/Core/Other/Analytics/AnalyticsReportGenerator.cs
index 42d86cf0..77bb0cd9 100644
--- a/Core/Other/Analytics/AnalyticsReportGenerator.cs
+++ b/Core/Other/Analytics/AnalyticsReportGenerator.cs
@@ -119,8 +119,8 @@ public static AnalyticsReport Create(AnalyticsFile file, ExternalInfo info, Plug
             }.FinalizeReport();
         }
 
-        private static UserConfig UserConfig => Program.UserConfig;
-        private static SystemConfig SysConfig => Program.SystemConfig;
+        private static UserConfig UserConfig => Program.Config.User;
+        private static SystemConfig SysConfig => Program.Config.System;
 
         private static string Bool(bool value) => value ? "on" : "off";
         private static string Exact(int value) => value.ToString();
diff --git a/Core/Other/FormPlugins.cs b/Core/Other/FormPlugins.cs
index c3c99da6..6f1ec1f5 100644
--- a/Core/Other/FormPlugins.cs
+++ b/Core/Other/FormPlugins.cs
@@ -3,11 +3,14 @@
 using System.Drawing;
 using System.Linq;
 using System.Windows.Forms;
+using TweetDuck.Configuration;
 using TweetDuck.Plugins;
 using TweetDuck.Plugins.Controls;
 
 namespace TweetDuck.Core.Other{
     sealed partial class FormPlugins : Form, FormManager.IAppDialog{
+        private static UserConfig Config => Program.Config.User;
+
         private readonly PluginManager pluginManager;
         
         public FormPlugins(){
@@ -19,8 +22,8 @@ public FormPlugins(){
         public FormPlugins(PluginManager pluginManager) : this(){
             this.pluginManager = pluginManager;
 
-            if (!Program.UserConfig.PluginsWindowSize.IsEmpty){
-                Size targetSize = Program.UserConfig.PluginsWindowSize;
+            if (!Config.PluginsWindowSize.IsEmpty){
+                Size targetSize = Config.PluginsWindowSize;
                 Size = new Size(Math.Max(MinimumSize.Width, targetSize.Width), Math.Max(MinimumSize.Height, targetSize.Height));
             }
             
@@ -29,8 +32,8 @@ public FormPlugins(PluginManager pluginManager) : this(){
             };
 
             FormClosed += (sender, args) => {
-                Program.UserConfig.PluginsWindowSize = Size;
-                Program.UserConfig.Save();
+                Config.PluginsWindowSize = Size;
+                Config.Save();
             };
 
             ResizeEnd += (sender, args) => {
diff --git a/Core/Other/Settings/BaseTabSettings.cs b/Core/Other/Settings/BaseTabSettings.cs
index c42019fa..7dcda2bd 100644
--- a/Core/Other/Settings/BaseTabSettings.cs
+++ b/Core/Other/Settings/BaseTabSettings.cs
@@ -4,8 +4,8 @@
 
 namespace TweetDuck.Core.Other.Settings{
     class BaseTabSettings : UserControl{
-        protected static UserConfig Config => Program.UserConfig;
-        protected static SystemConfig SysConfig => Program.SystemConfig;
+        protected static UserConfig Config => Program.Config.User;
+        protected static SystemConfig SysConfig => Program.Config.System;
 
         public IEnumerable<Control> InteractiveControls{
             get{
diff --git a/Core/Other/Settings/Dialogs/DialogSettingsCSS.cs b/Core/Other/Settings/Dialogs/DialogSettingsCSS.cs
index 95922cb1..e3a8496e 100644
--- a/Core/Other/Settings/Dialogs/DialogSettingsCSS.cs
+++ b/Core/Other/Settings/Dialogs/DialogSettingsCSS.cs
@@ -13,7 +13,7 @@ sealed partial class DialogSettingsCSS : Form{
         private readonly Action<string> reinjectBrowserCSS;
         private readonly Action openDevTools;
 
-        public DialogSettingsCSS(Action<string> reinjectBrowserCSS, Action openDevTools){
+        public DialogSettingsCSS(string browserCSS, string notificationCSS, Action<string> reinjectBrowserCSS, Action openDevTools){
             InitializeComponent();
             
             Text = Program.BrandName+" Options - CSS";
@@ -22,10 +22,10 @@ public DialogSettingsCSS(Action<string> reinjectBrowserCSS, Action openDevTools)
             this.openDevTools = openDevTools;
             
             textBoxBrowserCSS.EnableMultilineShortcuts();
-            textBoxBrowserCSS.Text = Program.UserConfig.CustomBrowserCSS ?? "";
+            textBoxBrowserCSS.Text = browserCSS ?? "";
 
             textBoxNotificationCSS.EnableMultilineShortcuts();
-            textBoxNotificationCSS.Text = Program.UserConfig.CustomNotificationCSS ?? "";
+            textBoxNotificationCSS.Text = notificationCSS ?? "";
 
             if (!BrowserUtils.HasDevTools){
                 btnOpenDevTools.Enabled = false;
diff --git a/Core/Other/Settings/Dialogs/DialogSettingsCefArgs.cs b/Core/Other/Settings/Dialogs/DialogSettingsCefArgs.cs
index 578f48b1..472357c3 100644
--- a/Core/Other/Settings/Dialogs/DialogSettingsCefArgs.cs
+++ b/Core/Other/Settings/Dialogs/DialogSettingsCefArgs.cs
@@ -8,13 +8,15 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
     sealed partial class DialogSettingsCefArgs : Form{
         public string CefArgs => textBoxArgs.Text;
 
-        public DialogSettingsCefArgs(){
+        private readonly string initialArgs;
+
+        public DialogSettingsCefArgs(string args){
             InitializeComponent();
             
             Text = Program.BrandName+" Options - CEF Arguments";
             
             textBoxArgs.EnableMultilineShortcuts();
-            textBoxArgs.Text = Program.UserConfig.CustomCefArgs ?? "";
+            textBoxArgs.Text = initialArgs = args ?? "";
             textBoxArgs.Select(textBoxArgs.Text.Length, 0);
         }
 
@@ -23,16 +25,14 @@ private void btnHelp_Click(object sender, EventArgs e){
         }
 
         private void btnApply_Click(object sender, EventArgs e){
-            string prevArgs = Program.UserConfig.CustomCefArgs;
-
-            if (CefArgs == prevArgs){
+            if (CefArgs == initialArgs){
                 DialogResult = DialogResult.Cancel;
                 Close();
                 return;
             }
 
             int count = CommandLineArgs.ReadCefArguments(CefArgs).Count;
-            string prompt = count == 0 && !string.IsNullOrWhiteSpace(prevArgs) ? "All current arguments will be removed. Continue?" : count+(count == 1 ? " argument was" : " arguments were")+" detected. Continue?";
+            string prompt = count == 0 && !string.IsNullOrWhiteSpace(initialArgs) ? "All current arguments will be removed. Continue?" : count+(count == 1 ? " argument was" : " arguments were")+" detected. Continue?";
 
             if (FormMessage.Question("Confirm CEF Arguments", prompt, FormMessage.OK, FormMessage.Cancel)){
                 DialogResult = DialogResult.OK;
diff --git a/Core/Other/Settings/Dialogs/DialogSettingsManage.cs b/Core/Other/Settings/Dialogs/DialogSettingsManage.cs
index 2ccc8afd..07a33de0 100644
--- a/Core/Other/Settings/Dialogs/DialogSettingsManage.cs
+++ b/Core/Other/Settings/Dialogs/DialogSettingsManage.cs
@@ -125,11 +125,11 @@ private void btnContinue_Click(object sender, EventArgs e){
                         Program.Config.ProgramRestartRequested += Config_ProgramRestartRequested;
 
                         if (SelectedItems.HasFlag(ProfileManager.Items.UserConfig)){
-                            Program.UserConfig.Reset();
+                            Program.Config.User.Reset();
                         }
 
                         if (SelectedItems.HasFlag(ProfileManager.Items.SystemConfig)){
-                            Program.SystemConfig.Reset();
+                            Program.Config.System.Reset();
                         }
 
                         Program.Config.ProgramRestartRequested -= Config_ProgramRestartRequested;
diff --git a/Core/Other/Settings/Dialogs/DialogSettingsSearchEngine.cs b/Core/Other/Settings/Dialogs/DialogSettingsSearchEngine.cs
index 765a8816..a5d267d4 100644
--- a/Core/Other/Settings/Dialogs/DialogSettingsSearchEngine.cs
+++ b/Core/Other/Settings/Dialogs/DialogSettingsSearchEngine.cs
@@ -10,7 +10,7 @@ public DialogSettingsSearchEngine(){
             
             Text = Program.BrandName+" Options - Custom Search Engine";
             
-            textBoxUrl.Text = Program.UserConfig.SearchEngineUrl ?? "";
+            textBoxUrl.Text = Program.Config.User.SearchEngineUrl ?? "";
             textBoxUrl.Select(textBoxUrl.Text.Length, 0);
         }
         
diff --git a/Core/Other/Settings/TabSettingsAdvanced.cs b/Core/Other/Settings/TabSettingsAdvanced.cs
index 89e78b4b..a64561ff 100644
--- a/Core/Other/Settings/TabSettingsAdvanced.cs
+++ b/Core/Other/Settings/TabSettingsAdvanced.cs
@@ -103,7 +103,7 @@ private void checkClearCacheAuto_CheckedChanged(object sender, EventArgs e){
         #region Configuration
 
         private void btnEditCefArgs_Click(object sender, EventArgs e){
-            DialogSettingsCefArgs form = new DialogSettingsCefArgs();
+            DialogSettingsCefArgs form = new DialogSettingsCefArgs(Config.CustomCefArgs);
 
             form.VisibleChanged += (sender2, args2) => {
                 form.MoveToCenter(ParentForm);
@@ -124,7 +124,7 @@ private void btnEditCefArgs_Click(object sender, EventArgs e){
         }
 
         private void btnEditCSS_Click(object sender, EventArgs e){
-            DialogSettingsCSS form = new DialogSettingsCSS(reinjectBrowserCSS, openDevTools);
+            DialogSettingsCSS form = new DialogSettingsCSS(Config.CustomBrowserCSS, Config.CustomNotificationCSS, reinjectBrowserCSS, openDevTools);
 
             form.VisibleChanged += (sender2, args2) => {
                 form.MoveToCenter(ParentForm);
diff --git a/Core/Other/TrayIcon.cs b/Core/Other/TrayIcon.cs
index 7d716746..7d9d4ded 100644
--- a/Core/Other/TrayIcon.cs
+++ b/Core/Other/TrayIcon.cs
@@ -10,7 +10,7 @@ public enum Behavior{ // keep order
             Disabled, DisplayOnly, MinimizeToTray, CloseToTray, Combined
         }
 
-        private static UserConfig Config => Program.UserConfig;
+        private static UserConfig Config => Program.Config.User;
 
         public event EventHandler ClickRestore;
         public event EventHandler ClickClose;
@@ -56,6 +56,7 @@ public TrayIcon(){
             this.notifyIcon.Text = Program.BrandName;
 
             Config.MuteToggled += Config_MuteToggled;
+            Disposed += (sender, args) => Config.MuteToggled -= Config_MuteToggled;
         }
 
         public TrayIcon(IContainer container) : this(){
diff --git a/Core/TweetDeckBrowser.cs b/Core/TweetDeckBrowser.cs
index 80dd878d..c5053711 100644
--- a/Core/TweetDeckBrowser.cs
+++ b/Core/TweetDeckBrowser.cs
@@ -16,6 +16,8 @@
 
 namespace TweetDuck.Core{
     sealed class TweetDeckBrowser : ITweetDeckBrowser, IDisposable{
+        private static UserConfig Config => Program.Config.User;
+
         public bool Ready { get; private set; }
 
         public bool Enabled{
@@ -66,12 +68,12 @@ public TweetDeckBrowser(FormBrowser owner, TweetDeckBridge tdBridge, UpdateBridg
 
             this.browser.SetupResourceHandler(TweetNotification.AppLogo);
             this.browser.SetupResourceHandler(TwitterUtils.LoadingSpinner);
+            this.browser.SetupZoomEvents();
 
             owner.Controls.Add(browser);
             
-            Program.UserConfig.MuteToggled += UserConfig_MuteToggled;
-            this.browser.SetupZoomEvents();
-            Program.UserConfig.SoundNotificationChanged += UserConfig_SoundNotificationInfoChanged;
+            Config.MuteToggled += Config_MuteToggled;
+            Config.SoundNotificationChanged += Config_SoundNotificationInfoChanged;
         }
 
         // setup and management
@@ -89,8 +91,8 @@ public void Focus(){
         }
 
         public void Dispose(){
-            Program.UserConfig.MuteToggled -= UserConfig_MuteToggled;
-            Program.UserConfig.SoundNotificationChanged -= UserConfig_SoundNotificationInfoChanged;
+            Config.MuteToggled -= Config_MuteToggled;
+            Config.SoundNotificationChanged -= Config_SoundNotificationInfoChanged;
             
             browser.Dispose();
         }
@@ -148,8 +150,8 @@ private void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
                     ScriptLoader.ExecuteFile(frame, "code.js", browser);
 
                     InjectBrowserCSS();
-                    ReinjectCustomCSS(Program.UserConfig.CustomBrowserCSS);
-                    UserConfig_SoundNotificationInfoChanged(null, EventArgs.Empty);
+                    ReinjectCustomCSS(Config.CustomBrowserCSS);
+                    Config_SoundNotificationInfoChanged(null, EventArgs.Empty);
 
                     TweetDeckBridge.ResetStaticProperties();
 
@@ -157,7 +159,7 @@ private void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
                         ScriptLoader.ExecuteScript(frame, "TD.storage.Account.prototype.requiresConsent = function(){ return false; }", "gen:gdpr");
                     }
 
-                    if (Program.UserConfig.FirstRun){
+                    if (Config.FirstRun){
                         ScriptLoader.ExecuteFile(frame, "introduction.js", browser);
                     }
                 }
@@ -180,20 +182,22 @@ private void browser_LoadError(object sender, LoadErrorEventArgs e){
             }
         }
 
-        private void UserConfig_MuteToggled(object sender, EventArgs e){
+        private void Config_MuteToggled(object sender, EventArgs e){
             UpdateProperties();
         }
 
-        private void UserConfig_SoundNotificationInfoChanged(object sender, EventArgs e){
+        private void Config_SoundNotificationInfoChanged(object sender, EventArgs e){
             const string soundUrl = "https://ton.twimg.com/tduck/updatesnd";
-            bool hasCustomSound = Program.UserConfig.IsCustomSoundNotificationSet;
 
-            if (prevSoundNotificationPath != Program.UserConfig.NotificationSoundPath){
-                browser.SetupResourceHandler(soundUrl, hasCustomSound ? SoundNotification.CreateFileHandler(Program.UserConfig.NotificationSoundPath) : null);
-                prevSoundNotificationPath = Program.UserConfig.NotificationSoundPath;
+            bool hasCustomSound = Config.IsCustomSoundNotificationSet;
+            string newNotificationPath = Config.NotificationSoundPath;
+
+            if (prevSoundNotificationPath != newNotificationPath){
+                browser.SetupResourceHandler(soundUrl, hasCustomSound ? SoundNotification.CreateFileHandler(newNotificationPath) : null);
+                prevSoundNotificationPath = newNotificationPath;
             }
 
-            browser.ExecuteScriptAsync("TDGF_setSoundNotificationData", hasCustomSound, Program.UserConfig.NotificationSoundVolume);
+            browser.ExecuteScriptAsync("TDGF_setSoundNotificationData", hasCustomSound, Config.NotificationSoundVolume);
         }
 
         // external handling
diff --git a/Core/Utils/BrowserUtils.cs b/Core/Utils/BrowserUtils.cs
index 61a613c0..242db159 100644
--- a/Core/Utils/BrowserUtils.cs
+++ b/Core/Utils/BrowserUtils.cs
@@ -21,12 +21,12 @@ static class BrowserUtils{
         private static SystemConfig SysConfig => Program.Config.System;
         
         public static void SetupCefArgs(IDictionary<string, string> args){
-            if (!Program.SystemConfig.HardwareAcceleration){
+            if (!SysConfig.HardwareAcceleration){
                 args["disable-gpu"] = "1";
                 args["disable-gpu-vsync"] = "1";
             }
 
-            if (Program.UserConfig.EnableSmoothScrolling){
+            if (Config.EnableSmoothScrolling){
                 args["disable-threaded-scrolling"] = "1";
 
                 if (args.TryGetValue("disable-features", out string disabledFeatures)){
@@ -40,7 +40,7 @@ public static void SetupCefArgs(IDictionary<string, string> args){
                 args["disable-smooth-scrolling"] = "1";
             }
 
-            if (!Program.UserConfig.EnableTouchAdjustment){
+            if (!Config.EnableTouchAdjustment){
                 args["disable-touch-adjustment"] = "1";
             }
             
@@ -117,7 +117,7 @@ public static void OpenExternalBrowser(string url){
                         FormGuide.Show(hash);
                     }
                     else{
-                        string browserPath = Program.UserConfig.BrowserPath;
+                        string browserPath = Config.BrowserPath;
 
                         if (browserPath == null || !File.Exists(browserPath)){
                             WindowsUtils.OpenAssociatedProgram(url);
@@ -134,7 +134,7 @@ public static void OpenExternalBrowser(string url){
                     break;
 
                 case UrlCheckResult.Tracking:
-                    if (Program.UserConfig.IgnoreTrackingUrlWarning){
+                    if (Config.IgnoreTrackingUrlWarning){
                         goto case UrlCheckResult.Fine;
                     }
 
@@ -146,8 +146,8 @@ public static void OpenExternalBrowser(string url){
                         DialogResult result = form.ShowDialog();
 
                         if (result == DialogResult.Ignore){
-                            Program.UserConfig.IgnoreTrackingUrlWarning = true;
-                            Program.UserConfig.Save();
+                            Config.IgnoreTrackingUrlWarning = true;
+                            Config.Save();
                         }
 
                         if (result == DialogResult.Ignore || result == DialogResult.Yes){
@@ -166,7 +166,7 @@ public static void OpenExternalBrowser(string url){
         public static void OpenExternalSearch(string query){
             if (string.IsNullOrWhiteSpace(query))return;
             
-            string searchUrl = Program.UserConfig.SearchEngineUrl;
+            string searchUrl = Config.SearchEngineUrl;
             
             if (string.IsNullOrEmpty(searchUrl)){
                 if (FormMessage.Question("Search Options", "You have not configured a default search engine yet, would you like to do it now?", FormMessage.Yes, FormMessage.No)){
@@ -179,7 +179,7 @@ public static void OpenExternalSearch(string query){
                     if (settings == null)return;
 
                     settings.FormClosed += (sender, args) => {
-                        if (args.CloseReason == CloseReason.UserClosing && Program.UserConfig.SearchEngineUrl != searchUrl){
+                        if (args.CloseReason == CloseReason.UserClosing && Config.SearchEngineUrl != searchUrl){
                             OpenExternalSearch(query);
                         }
                     };
diff --git a/Program.cs b/Program.cs
index 500aedf0..77d33dd2 100644
--- a/Program.cs
+++ b/Program.cs
@@ -49,11 +49,7 @@ static class Program{
         public static CultureInfo Culture { get; }
         public static Reporter Reporter { get; }
         public static ConfigManager Config { get; }
-
-        // TODO
-        public static UserConfig UserConfig => Config.User;
-        public static SystemConfig SystemConfig => Config.System;
-
+        
         static Program(){
             Culture = CultureInfo.CurrentCulture;
             Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
@@ -147,7 +143,7 @@ private static void Main(){
                 #endif
             };
             
-            CommandLineArgs.ReadCefArguments(UserConfig.CustomCefArgs).ToDictionary(settings.CefCommandLineArgs);
+            CommandLineArgs.ReadCefArguments(Config.User.CustomCefArgs).ToDictionary(settings.CefCommandLineArgs);
             BrowserUtils.SetupCefArgs(settings.CefCommandLineArgs);
             
             Cef.Initialize(settings, false, new BrowserProcessHandler());
diff --git a/Updates/UpdateHandler.cs b/Updates/UpdateHandler.cs
index c88c22fc..e9a47d52 100644
--- a/Updates/UpdateHandler.cs
+++ b/Updates/UpdateHandler.cs
@@ -39,7 +39,7 @@ public void StartTimer(){
 
             timer.Stop();
 
-            if (Program.UserConfig.EnableUpdateCheck){
+            if (Program.Config.User.EnableUpdateCheck){
                 DateTime now = DateTime.Now;
                 TimeSpan nextHour = now.AddSeconds(60*(60-now.Minute)-now.Second)-now;
 
@@ -53,7 +53,7 @@ public void StartTimer(){
         }
 
         public int Check(bool force){
-            if (Program.UserConfig.EnableUpdateCheck || force){
+            if (Program.Config.User.EnableUpdateCheck || force){
                 int nextEventId = unchecked(++lastEventId);
                 Task<UpdateInfo> checkTask = client.Check();