diff --git a/Resources/PostBuild.fsx b/Resources/PostBuild.fsx
deleted file mode 100644
index d5533385..00000000
--- a/Resources/PostBuild.fsx
+++ /dev/null
@@ -1,195 +0,0 @@
-open System
-open System.Collections.Generic
-open System.Diagnostics
-open System.IO
-open System.Threading.Tasks
-
-// "$(DevEnvDir)CommonExtensions\Microsoft\FSharp\fsi.exe" "$(ProjectDir)Resources\PostBuild.fsx" --exec --nologo -- "$(TargetDir)\" "$(ProjectDir)\" "$(ConfigurationName)"
-// "$(ProjectDir)bld\post_build.exe" "$(TargetDir)\" "$(ProjectDir)\" "$(ConfigurationName)"
-
-exception ArgumentUsage of string
-
-#if !INTERACTIVE
-[<EntryPoint>]
-#endif
-let main (argv: string[]) =
-    try
-        if argv.Length < 2 then
-            #if INTERACTIVE
-            raise (ArgumentUsage "fsi.exe PostBuild.fsx --exec --nologo -- <TargetDir> <ProjectDir> [ConfigurationName] [VersionTag]")
-            #else
-            raise (ArgumentUsage "PostBuild.exe <TargetDir> <ProjectDir> [ConfigurationName] [VersionTag]")
-            #endif
-            
-        let _time name func =
-            let sw = Stopwatch.StartNew()
-            func()
-            sw.Stop()
-            printfn "[%s took %i ms]" name (int (Math.Round(sw.Elapsed.TotalMilliseconds)))
-            
-        let (+/) path1 path2 =
-            Path.Combine(path1, path2)
-            
-        let sw = Stopwatch.StartNew()
-        
-        // Setup
-        
-        let targetDir = argv.[0]
-        let projectDir = argv.[1]
-        
-        let configuration = if argv.Length >= 3 then argv.[2]
-                            else "Release"
-                            
-        let version = if argv.Length >= 4 then argv.[3]
-                      else ((targetDir +/ "TweetDuck.exe") |> FileVersionInfo.GetVersionInfo).FileVersion
-                      
-        printfn "--------------------------"
-        printfn "TweetDuck version %s" version
-        printfn "--------------------------"
-        
-        let guideDir = targetDir +/ "guide"
-        let localesDir = targetDir +/ "locales"
-        let pluginsDir = targetDir +/ "plugins"
-        let resourcesDir = targetDir +/ "resources"
-        
-        // Functions (File Management)
-        
-        let copyFile source target =
-            File.Copy(source, target, true)
-            
-        let createDirectory path =
-            Directory.CreateDirectory(path) |> ignore
-            
-        let rec copyDirectoryContentsFiltered source target (filter: string -> bool) =
-            if not (Directory.Exists(target)) then
-                Directory.CreateDirectory(target) |> ignore
-                
-            let src = DirectoryInfo(source)
-            
-            for file in src.EnumerateFiles() do
-                if filter file.Name then
-                    file.CopyTo(target +/ file.Name) |> ignore
-                    
-            for dir in src.EnumerateDirectories() do
-                if filter dir.Name then
-                    copyDirectoryContentsFiltered dir.FullName (target +/ dir.Name) filter
-                    
-        let copyDirectoryContents source target =
-            copyDirectoryContentsFiltered source target (fun _ -> true)
-            
-        // Functions (File Processing)
-        
-        let byPattern path pattern =
-            Directory.EnumerateFiles(path, pattern, SearchOption.AllDirectories)
-            
-        let exceptEndingWith (name: string) =
-            Seq.filter (fun (file: string) -> not (file.EndsWith(name)))
-            
-        let iterateFiles (files: string seq) (func: string -> unit) =
-            Parallel.ForEach(files, func) |> ignore
-            
-        let readFile file = seq {
-            use stream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 0x1000, FileOptions.SequentialScan)
-            use reader = new StreamReader(stream)
-            let mutable cont = true
-            
-            while cont do
-                let line = reader.ReadLine()
-                
-                if line = null then
-                    cont <- false
-                else
-                    yield line
-        }
-        
-        let writeFile (fullPath: string) (lines: string seq) =
-            let relativePath = fullPath.[(targetDir.Length)..]
-            File.WriteAllLines(fullPath, lines |> Seq.toArray)
-            printfn "Processed %s" relativePath
-        
-        let processFiles (files: string seq) (extProcessors: IDictionary<string, (string seq -> string seq)>) =
-            let rec processFileContents file =
-                readFile file
-                |> extProcessors.[Path.GetExtension(file)]
-                
-            iterateFiles files (fun file ->
-                processFileContents file
-                |> (writeFile file)
-            )
-            
-        // Build
-            
-        copyFile (projectDir +/ "bld/Resources/LICENSES.txt") (targetDir +/ "LICENSES.txt")
-        
-        copyDirectoryContents (projectDir +/ "Resources/Guide") guideDir
-        copyDirectoryContents (projectDir +/ "Resources/Content") resourcesDir
-        
-        createDirectory (pluginsDir +/ "official")
-        createDirectory (pluginsDir +/ "user")
-        
-        copyDirectoryContentsFiltered
-            (projectDir +/ "Resources/Plugins")
-            (pluginsDir +/ "official")
-            (fun name -> name <> ".debug" && name <> "emoji-instructions.txt")
-            
-        if configuration = "Debug" then
-            copyDirectoryContents
-                (projectDir +/ "Resources/Plugins/.debug")
-                (pluginsDir +/ "user/.debug")
-                
-        if Directory.Exists(localesDir) || configuration = "Release" then
-            Directory.EnumerateFiles(localesDir, "*.pak")
-            |> exceptEndingWith @"\en-US.pak"
-            |> Seq.iter File.Delete
-            
-        // Validation
-        
-        if File.ReadAllText(pluginsDir +/ "official/emoji-keyboard/emoji-ordering.txt").IndexOf('\r') <> -1 then
-            raise (FormatException("emoji-ordering.txt must not have any carriage return characters"))
-        else
-            printfn "Verified emoji-ordering.txt"
-            
-        // Processing
-        
-        let fileProcessors =
-            dict [
-                ".js", id;
-                ".css", id;
-                ".html", id;
-                ".meta", (fun (lines: string seq) ->
-                    lines
-                    |> Seq.map (fun line -> line.Replace("{version}", version))
-                );
-            ]
-            
-        processFiles (byPattern targetDir "*.js") fileProcessors
-        processFiles (byPattern targetDir "*.css") fileProcessors
-        processFiles (byPattern targetDir "*.html") fileProcessors
-        processFiles (byPattern pluginsDir "*.meta") fileProcessors
-        
-        // Finished
-        
-        sw.Stop()
-        printfn "------------------"
-        printfn "Finished in %i ms" (int (Math.Round(sw.Elapsed.TotalMilliseconds)))
-        printfn "------------------"
-        0
-        
-    with
-    | ArgumentUsage message ->
-        printfn ""
-        printfn "Build script usage:"
-        printfn "%s" message
-        printfn ""
-        1
-    | ex ->
-        printfn ""
-        printfn "Encountered an error while running PostBuild:"
-        printfn "%A" ex
-        printfn ""
-        1
-        
-#if INTERACTIVE
-printfn "Running PostBuild in interpreter..."
-main (fsi.CommandLineArgs |> Array.skip (1 + (fsi.CommandLineArgs |> Array.findIndex (fun arg -> arg = "--"))))
-#endif
diff --git a/Resources/PostBuild.ps1 b/Resources/PostBuild.ps1
new file mode 100644
index 00000000..35dbd518
--- /dev/null
+++ b/Resources/PostBuild.ps1
@@ -0,0 +1,67 @@
+Param(
+  [Parameter(Mandatory = $True, Position = 1)][string] $targetDir,
+  [Parameter(Position = 2)][string] $version = ""
+)
+
+$ErrorActionPreference = "Stop"
+
+try {
+  $sw = [Diagnostics.Stopwatch]::StartNew()
+
+  if ($version.Equals("")) {
+    $version = (Get-Item (Join-Path $targetDir "TweetDuck.exe")).VersionInfo.FileVersion
+  }
+
+  Write-Host "--------------------------"
+  Write-Host "TweetDuck version" $version
+  Write-Host "--------------------------"
+
+  # Helper functions
+
+  function Check-Carriage-Return {
+    Param([Parameter(Mandatory = $True, Position = 1)] $file)
+
+    if (!(Test-Path $file)) {
+      Throw "$file does not exist"
+    }
+
+    if ((Get-Content -Path $file -Raw).Contains("`r")) {
+      Throw "$file must not have any carriage return characters"
+    }
+
+    Write-Host "Verified" $file.Substring($targetDir.Length)
+  }
+
+  function Rewrite-File {
+    Param([Parameter(Mandatory = $True, Position = 1)] $file,
+          [Parameter(Mandatory = $True, Position = 2)] $lines)
+
+    $relativePath = $file.FullName.Substring($targetDir.Length)
+    [IO.File]::WriteAllLines($file.FullName, $lines)
+    Write-Host "Processed" $relativePath
+  }
+
+  # Validation
+
+  Check-Carriage-Return (Join-Path $targetDir "plugins\official\emoji-keyboard\emoji-ordering.txt")
+
+  # Processing
+
+  foreach ($file in Get-ChildItem -Path (Join-Path $targetDir "plugins") -Filter "*.meta" -Recurse) {
+    $lines = [IO.File]::ReadLines($file.FullName)
+    $lines = $lines -Replace '\{version\}', $version
+    Rewrite-File $file $lines
+  }
+
+  # Finished
+
+  $sw.Stop()
+  Write-Host "------------------"
+  Write-Host "Finished in" $([math]::Round($sw.Elapsed.TotalMilliseconds)) "ms"
+  Write-Host "------------------"
+
+} catch {
+  Write-Host "Encountered an error while running PostBuild.ps1 on line" $_.InvocationInfo.ScriptLineNumber
+  Write-Host $_
+  Exit 1
+}
diff --git a/Resources/ResourceHotSwap.cs b/Resources/ResourceHotSwap.cs
index 76fa8f68..67d23df4 100644
--- a/Resources/ResourceHotSwap.cs
+++ b/Resources/ResourceHotSwap.cs
@@ -7,7 +7,7 @@ namespace TweetDuck.Resources {
 	static class ResourceHotSwap {
 		private static readonly string HotSwapProjectRoot = FixPathSlash(Path.GetFullPath(Path.Combine(App.ProgramPath, "../../../")));
 		private static readonly string HotSwapTargetDir = FixPathSlash(Path.Combine(HotSwapProjectRoot, "bin", "tmp"));
-		private static readonly string HotSwapRebuildScript = Path.Combine(HotSwapProjectRoot, "bld", "post_build.exe");
+		private static readonly string HotSwapRebuildScript = Path.Combine(HotSwapProjectRoot, "Resources", "PostBuild.ps1");
 
 		private static string FixPathSlash(string path) {
 			return path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) + '\\';
@@ -23,12 +23,18 @@ public static void Run() {
 
 			DeleteHotSwapFolder();
 			Directory.CreateDirectory(HotSwapTargetDir);
+			Directory.CreateDirectory(Path.Combine(HotSwapTargetDir, "plugins"));
+			Directory.CreateDirectory(Path.Combine(HotSwapTargetDir, "plugins", "user"));
+			CopyDirectory(Path.Combine(HotSwapProjectRoot, "Resources", "Content"), Path.Combine(HotSwapTargetDir, "resources"));
+			CopyDirectory(Path.Combine(HotSwapProjectRoot, "Resources", "Guide"), Path.Combine(HotSwapTargetDir, "guide"));
+			CopyDirectory(Path.Combine(HotSwapProjectRoot, "Resources", "Plugins"), Path.Combine(HotSwapTargetDir, "plugins", "official"));
+			Directory.Move(Path.Combine(HotSwapTargetDir, "plugins", "official", ".debug"), Path.Combine(HotSwapTargetDir, "plugins", "user", ".debug"));
 
 			Stopwatch sw = Stopwatch.StartNew();
 
 			using (Process process = Process.Start(new ProcessStartInfo {
-				FileName = HotSwapRebuildScript,
-				Arguments = $"\"{HotSwapTargetDir}\\\" \"{HotSwapProjectRoot}\\\" \"Debug\" \"{Program.VersionTag}\"",
+				FileName = "powershell",
+				Arguments = $"-NoProfile -ExecutionPolicy Unrestricted -File \"{HotSwapRebuildScript}\" \"{HotSwapTargetDir}\\\" \"{Program.VersionTag}\"",
 				WindowStyle = ProcessWindowStyle.Hidden
 			})) {
 				// ReSharper disable once PossibleNullReferenceException
@@ -46,9 +52,11 @@ public static void Run() {
 			Debug.WriteLine($"Finished rebuild script in {sw.ElapsedMilliseconds} ms");
 
 			Directory.Delete(App.ResourcesPath, true);
+			Directory.Delete(App.GuidePath, true);
 			Directory.Delete(App.PluginPath, true);
 
 			Directory.Move(Path.Combine(HotSwapTargetDir, "resources"), App.ResourcesPath);
+			Directory.Move(Path.Combine(HotSwapTargetDir, "guide"), App.GuidePath);
 			Directory.Move(Path.Combine(HotSwapTargetDir, "plugins"), App.PluginPath);
 
 			DeleteHotSwapFolder();
@@ -59,6 +67,18 @@ private static void DeleteHotSwapFolder() {
 				Directory.Delete(HotSwapTargetDir, true);
 			} catch (DirectoryNotFoundException) {}
 		}
+
+		private static void CopyDirectory(string from, string to) {
+			foreach (var directory in Directory.GetDirectories(from)) {
+				string name = Path.GetFileName(directory);
+				Directory.CreateDirectory(Path.Combine(to, name));
+				CopyDirectory(directory, Path.Combine(to, name));
+			}
+
+			foreach (var file in Directory.GetFiles(from)) {
+				File.Copy(file, Path.Combine(to, Path.GetFileName(file)));
+			}
+		}
 	}
 }
 #endif
diff --git a/TweetDuck.csproj b/TweetDuck.csproj
index 487f37e1..d425eb18 100644
--- a/TweetDuck.csproj
+++ b/TweetDuck.csproj
@@ -61,6 +61,32 @@
     <Reference Include="System.Web.Extensions" />
     <Reference Include="System.Windows.Forms" />
   </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="lib\TweetLib.Browser\TweetLib.Browser.csproj">
+      <Project>{eefb1f37-7cad-46bd-8042-66e7b502ab02}</Project>
+      <Name>TweetLib.Browser</Name>
+    </ProjectReference>
+    <ProjectReference Include="lib\TweetLib.Core\TweetLib.Core.csproj">
+      <Project>{93ba3cb4-a812-4949-b07d-8d393fb38937}</Project>
+      <Name>TweetLib.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="lib\TweetLib.Utils\TweetLib.Utils.csproj">
+      <Project>{476b1007-b12c-447f-b855-9886048201d6}</Project>
+      <Name>TweetLib.Utils</Name>
+    </ProjectReference>
+    <ProjectReference Include="subprocess\TweetDuck.Browser.csproj">
+      <Project>{b10b0017-819e-4f71-870f-8256b36a26aa}</Project>
+      <Name>TweetDuck.Browser</Name>
+    </ProjectReference>
+    <ProjectReference Include="video\TweetDuck.Video.csproj">
+      <Project>{278b2d11-402d-44b6-b6a1-8fa67db65565}</Project>
+      <Name>TweetDuck.Video</Name>
+    </ProjectReference>
+    <ProjectReference Include="lib\TweetLib.Communication\TweetLib.Communication.csproj">
+      <Project>{72473763-4b9d-4fb6-a923-9364b2680f06}</Project>
+      <Name>TweetLib.Communication</Name>
+    </ProjectReference>
+  </ItemGroup>
   <ItemGroup>
     <Compile Include="Application\FileDialogs.cs" />
     <Compile Include="Application\MessageDialogs.cs" />
@@ -311,14 +337,122 @@
   <ItemGroup>
     <None Include="app.config" />
     <None Include="packages.config" />
+    <None Include="Resources\Content\.all.js" />
+    <None Include="Resources\Content\api\bridge.js" />
+    <None Include="Resources\Content\api\jquery.js" />
+    <None Include="Resources\Content\api\patch.js" />
+    <None Include="Resources\Content\api\ready.js" />
+    <None Include="Resources\Content\api\td.js" />
+    <None Include="Resources\Content\api\utils.js" />
+    <None Include="Resources\Content\bootstrap.js" />
     <None Include="Resources\Content\error\error.html" />
     <None Include="Resources\Content\images\logo.png" />
     <None Include="Resources\Content\images\spinner.apng" />
+    <None Include="Resources\Content\introduction\introduction.css" />
+    <None Include="Resources\Content\introduction\introduction.js" />
+    <None Include="Resources\Content\load.js" />
+    <None Include="Resources\Content\login\hide_cookie_bar.js" />
+    <None Include="Resources\Content\login\login.css" />
+    <None Include="Resources\Content\login\redirect_plain_twitter_com.js" />
+    <None Include="Resources\Content\login\setup_document_attributes.js" />
+    <None Include="Resources\Content\notification\add_skip_button.js" />
+    <None Include="Resources\Content\notification\disable_clipboard_formatting.js" />
     <None Include="Resources\Content\notification\example\example.html" />
+    <None Include="Resources\Content\notification\expand_links_or_show_tooltip.js" />
+    <None Include="Resources\Content\notification\handle_links.js" />
+    <None Include="Resources\Content\notification\handle_show_this_thread_link.js" />
     <None Include="Resources\Content\notification\notification.css" />
+    <None Include="Resources\Content\notification\recalculate_tweet_sent_time.js" />
+    <None Include="Resources\Content\notification\reset_scroll_position_on_load.js" />
     <None Include="Resources\Content\notification\screenshot\screenshot.js" />
+    <None Include="Resources\Content\notification\scroll_smoothly.js" />
+    <None Include="Resources\Content\notification\setup_body_hover_class.js" />
+    <None Include="Resources\Content\plugins\base.js" />
     <None Include="Resources\Content\plugins\notification\plugins.js" />
+    <None Include="Resources\Content\plugins\setup.js" />
     <None Include="Resources\Content\plugins\tweetdeck\plugins.js" />
+    <None Include="Resources\Content\tweetdeck\add_tweetduck_to_settings_menu.js" />
+    <None Include="Resources\Content\tweetdeck\bypass_t.co_links.js" />
+    <None Include="Resources\Content\tweetdeck\clear_search_input.js" />
+    <None Include="Resources\Content\tweetdeck\configure_first_day_of_week.js" />
+    <None Include="Resources\Content\tweetdeck\configure_language_for_translations.js" />
+    <None Include="Resources\Content\tweetdeck\disable_clipboard_formatting.js" />
+    <None Include="Resources\Content\tweetdeck\disable_td_metrics.js" />
+    <None Include="Resources\Content\tweetdeck\drag_links_onto_columns.js" />
+    <None Include="Resources\Content\tweetdeck\expand_links_or_show_tooltip.js" />
+    <None Include="Resources\Content\tweetdeck\fix_dm_input_box_focus.js" />
+    <None Include="Resources\Content\tweetdeck\fix_horizontal_scrolling_of_column_container.js" />
+    <None Include="Resources\Content\tweetdeck\fix_marking_dm_as_read_when_replying.js" />
+    <None Include="Resources\Content\tweetdeck\fix_media_preview_urls.js" />
+    <None Include="Resources\Content\tweetdeck\fix_missing_bing_translator_languages.js" />
+    <None Include="Resources\Content\tweetdeck\fix_os_name.js" />
+    <None Include="Resources\Content\tweetdeck\fix_scheduled_tweets_not_appearing.js" />
+    <None Include="Resources\Content\tweetdeck\fix_youtube_previews.js" />
+    <None Include="Resources\Content\tweetdeck\focus_composer_after_alt_tab.js" />
+    <None Include="Resources\Content\tweetdeck\focus_composer_after_image_upload.js" />
+    <None Include="Resources\Content\tweetdeck\focus_composer_after_switching_account.js" />
+    <None Include="Resources\Content\tweetdeck\globals\apply_rot13.js" />
+    <None Include="Resources\Content\tweetdeck\globals\get_class_style_property.js" />
+    <None Include="Resources\Content\tweetdeck\globals\get_column_name.js" />
+    <None Include="Resources\Content\tweetdeck\globals\get_hovered_column.js" />
+    <None Include="Resources\Content\tweetdeck\globals\get_hovered_tweet.js" />
+    <None Include="Resources\Content\tweetdeck\globals\inject_mustache.js" />
+    <None Include="Resources\Content\tweetdeck\globals\prioritize_newest_event.js" />
+    <None Include="Resources\Content\tweetdeck\globals\reload_browser.js" />
+    <None Include="Resources\Content\tweetdeck\globals\reload_columns.js" />
+    <None Include="Resources\Content\tweetdeck\globals\retrieve_tweet.js" />
+    <None Include="Resources\Content\tweetdeck\globals\show_tweet_detail.js" />
+    <None Include="Resources\Content\tweetdeck\handle_extra_mouse_buttons.js" />
+    <None Include="Resources\Content\tweetdeck\hook_theme_settings.js" />
+    <None Include="Resources\Content\tweetdeck\inject_css.js" />
+    <None Include="Resources\Content\tweetdeck\keep_like_follow_dialogs_open.js" />
+    <None Include="Resources\Content\tweetdeck\limit_loaded_dm_count.js" />
+    <None Include="Resources\Content\tweetdeck\make_retweets_lowercase.js" />
+    <None Include="Resources\Content\tweetdeck\middle_click_tweet_icon_actions.js" />
+    <None Include="Resources\Content\tweetdeck\move_accounts_above_hashtags_in_search.js" />
+    <None Include="Resources\Content\tweetdeck\offline_notification.js" />
+    <None Include="Resources\Content\tweetdeck\open_search_externally.js" />
+    <None Include="Resources\Content\tweetdeck\open_search_in_first_column.js" />
+    <None Include="Resources\Content\tweetdeck\paste_images_from_clipboard.js" />
+    <None Include="Resources\Content\tweetdeck\perform_search.js" />
+    <None Include="Resources\Content\tweetdeck\pin_composer_icon.js" />
+    <None Include="Resources\Content\tweetdeck\ready_plugins.js" />
+    <None Include="Resources\Content\tweetdeck\register_composer_active_event.js" />
+    <None Include="Resources\Content\tweetdeck\register_global_functions.js" />
+    <None Include="Resources\Content\tweetdeck\register_global_functions_jquery.js" />
+    <None Include="Resources\Content\tweetdeck\restore_cleared_column.js" />
+    <None Include="Resources\Content\tweetdeck\screenshot_tweet.js" />
+    <None Include="Resources\Content\tweetdeck\setup_column_type_attributes.js" />
+    <None Include="Resources\Content\tweetdeck\setup_desktop_notifications.js" />
+    <None Include="Resources\Content\tweetdeck\setup_link_context_menu.js" />
+    <None Include="Resources\Content\tweetdeck\setup_sound_notifications.js" />
+    <None Include="Resources\Content\tweetdeck\setup_tweet_context_menu.js" />
+    <None Include="Resources\Content\tweetdeck\setup_tweetduck_account_bamboozle.js" />
+    <None Include="Resources\Content\tweetdeck\setup_video_player.js" />
+    <None Include="Resources\Content\tweetdeck\skip_pre_login_page.js" />
+    <None Include="Resources\Content\tweetdeck\tweetdeck.css" />
+    <None Include="Resources\Content\update\update.css" />
+    <None Include="Resources\Content\update\update.js" />
+    <None Include="Resources\Guide\img\app-menu.png" />
+    <None Include="Resources\Guide\img\column-clear-header.png" />
+    <None Include="Resources\Guide\img\column-clear-preferences.png" />
+    <None Include="Resources\Guide\img\column-preferences.png" />
+    <None Include="Resources\Guide\img\icon.ico" />
+    <None Include="Resources\Guide\img\new-tweet-emoji.png" />
+    <None Include="Resources\Guide\img\new-tweet-pin.png" />
+    <None Include="Resources\Guide\img\new-tweet-template-advanced.png" />
+    <None Include="Resources\Guide\img\new-tweet-template-basic.png" />
+    <None Include="Resources\Guide\img\options-manage-export.png" />
+    <None Include="Resources\Guide\img\options-manage-reset.png" />
+    <None Include="Resources\Guide\img\options-manage.png" />
+    <None Include="Resources\Guide\img\options-notifications-location.png" />
+    <None Include="Resources\Guide\img\options-notifications-size.png" />
+    <None Include="Resources\Guide\img\options-sounds.png" />
+    <None Include="Resources\Guide\img\settings-dropdown.png" />
+    <None Include="Resources\Guide\img\settings-editdesign.png" />
+    <None Include="Resources\Guide\index.html" />
+    <None Include="Resources\Guide\script.js" />
+    <None Include="Resources\Guide\style.css" />
     <None Include="Resources\Images\icon-muted.ico" />
     <None Include="Resources\Images\icon-small.ico" />
     <None Include="Resources\Images\icon-tray-muted.ico" />
@@ -346,174 +480,56 @@
     <None Include="Resources\Plugins\templates\modal.html" />
     <None Include="Resources\Plugins\timeline-polls\.meta" />
     <None Include="Resources\Plugins\timeline-polls\browser.js" />
-    <None Include="Resources\PostBuild.fsx" />
+    <None Include="Resources\PostBuild.ps1" />
     <None Include="Resources\PostCefUpdate.ps1" />
   </ItemGroup>
   <ItemGroup>
+    <ResourcesContent Include="$(ProjectDir)Resources\Content\**\*.*" Visible="false" />
+    <ResourcesGuide Include="$(ProjectDir)Resources\Guide\**\*.*" Visible="false" />
+    <ResourcesPlugins Include="$(ProjectDir)Resources\Plugins\**\*.*" Visible="false" />
+    <ResourcesPlugins Remove="$(ProjectDir)Resources\Plugins\.debug\**\*.*" />
+    <ResourcesPlugins Remove="$(ProjectDir)Resources\Plugins\emoji-keyboard\emoji-instructions.txt" />
+    <ResourcesPluginsDebug Include="$(ProjectDir)Resources\Plugins\.debug\**\*.*" Visible="false" />
     <Redist Include="$(ProjectDir)bld\Redist\*.*" Visible="false" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="lib\TweetLib.Browser\TweetLib.Browser.csproj">
-      <Project>{eefb1f37-7cad-46bd-8042-66e7b502ab02}</Project>
-      <Name>TweetLib.Browser</Name>
-    </ProjectReference>
-    <ProjectReference Include="lib\TweetLib.Core\TweetLib.Core.csproj">
-      <Project>{93ba3cb4-a812-4949-b07d-8d393fb38937}</Project>
-      <Name>TweetLib.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="lib\TweetLib.Utils\TweetLib.Utils.csproj">
-      <Project>{476b1007-b12c-447f-b855-9886048201d6}</Project>
-      <Name>TweetLib.Utils</Name>
-    </ProjectReference>
-    <ProjectReference Include="subprocess\TweetDuck.Browser.csproj">
-      <Project>{b10b0017-819e-4f71-870f-8256b36a26aa}</Project>
-      <Name>TweetDuck.Browser</Name>
-    </ProjectReference>
-    <ProjectReference Include="video\TweetDuck.Video.csproj">
-      <Project>{278b2d11-402d-44b6-b6a1-8fa67db65565}</Project>
-      <Name>TweetDuck.Video</Name>
-    </ProjectReference>
-    <ProjectReference Include="lib\TweetLib.Communication\TweetLib.Communication.csproj">
-      <Project>{72473763-4b9d-4fb6-a923-9364b2680f06}</Project>
-      <Name>TweetLib.Communication</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="Resources\Content\.all.js" />
-    <Content Include="Resources\Content\api\bridge.js" />
-    <Content Include="Resources\Content\api\jquery.js" />
-    <Content Include="Resources\Content\api\patch.js" />
-    <Content Include="Resources\Content\api\ready.js" />
-    <Content Include="Resources\Content\api\td.js" />
-    <Content Include="Resources\Content\api\utils.js" />
-    <Content Include="Resources\Content\bootstrap.js" />
-    <Content Include="Resources\Content\introduction\introduction.css" />
-    <Content Include="Resources\Content\introduction\introduction.js" />
-    <Content Include="Resources\Content\load.js" />
-    <Content Include="Resources\Content\login\hide_cookie_bar.js" />
-    <Content Include="Resources\Content\login\login.css" />
-    <Content Include="Resources\Content\login\redirect_plain_twitter_com.js" />
-    <Content Include="Resources\Content\login\setup_document_attributes.js" />
-    <Content Include="Resources\Content\notification\add_skip_button.js" />
-    <Content Include="Resources\Content\notification\disable_clipboard_formatting.js" />
-    <Content Include="Resources\Content\notification\expand_links_or_show_tooltip.js" />
-    <Content Include="Resources\Content\notification\handle_links.js" />
-    <Content Include="Resources\Content\notification\handle_show_this_thread_link.js" />
-    <Content Include="Resources\Content\notification\recalculate_tweet_sent_time.js" />
-    <Content Include="Resources\Content\notification\reset_scroll_position_on_load.js" />
-    <Content Include="Resources\Content\notification\scroll_smoothly.js" />
-    <Content Include="Resources\Content\notification\setup_body_hover_class.js" />
-    <Content Include="Resources\Content\plugins\base.js" />
-    <Content Include="Resources\Content\plugins\setup.js" />
-    <Content Include="Resources\Content\tweetdeck\add_tweetduck_to_settings_menu.js" />
-    <Content Include="Resources\Content\tweetdeck\bypass_t.co_links.js" />
-    <Content Include="Resources\Content\tweetdeck\clear_search_input.js" />
-    <Content Include="Resources\Content\tweetdeck\configure_first_day_of_week.js" />
-    <Content Include="Resources\Content\tweetdeck\configure_language_for_translations.js" />
-    <Content Include="Resources\Content\tweetdeck\disable_clipboard_formatting.js" />
-    <Content Include="Resources\Content\tweetdeck\disable_td_metrics.js" />
-    <Content Include="Resources\Content\tweetdeck\drag_links_onto_columns.js" />
-    <Content Include="Resources\Content\tweetdeck\expand_links_or_show_tooltip.js" />
-    <Content Include="Resources\Content\tweetdeck\fix_dm_input_box_focus.js" />
-    <Content Include="Resources\Content\tweetdeck\fix_horizontal_scrolling_of_column_container.js" />
-    <Content Include="Resources\Content\tweetdeck\fix_marking_dm_as_read_when_replying.js" />
-    <Content Include="Resources\Content\tweetdeck\fix_media_preview_urls.js" />
-    <Content Include="Resources\Content\tweetdeck\fix_missing_bing_translator_languages.js" />
-    <Content Include="Resources\Content\tweetdeck\fix_os_name.js" />
-    <Content Include="Resources\Content\tweetdeck\fix_scheduled_tweets_not_appearing.js" />
-    <Content Include="Resources\Content\tweetdeck\fix_youtube_previews.js" />
-    <Content Include="Resources\Content\tweetdeck\focus_composer_after_alt_tab.js" />
-    <Content Include="Resources\Content\tweetdeck\focus_composer_after_image_upload.js" />
-    <Content Include="Resources\Content\tweetdeck\focus_composer_after_switching_account.js" />
-    <Content Include="Resources\Content\tweetdeck\globals\apply_rot13.js" />
-    <Content Include="Resources\Content\tweetdeck\globals\get_class_style_property.js" />
-    <Content Include="Resources\Content\tweetdeck\globals\get_column_name.js" />
-    <Content Include="Resources\Content\tweetdeck\globals\get_hovered_column.js" />
-    <Content Include="Resources\Content\tweetdeck\globals\get_hovered_tweet.js" />
-    <Content Include="Resources\Content\tweetdeck\globals\inject_mustache.js" />
-    <Content Include="Resources\Content\tweetdeck\globals\prioritize_newest_event.js" />
-    <Content Include="Resources\Content\tweetdeck\globals\reload_browser.js" />
-    <Content Include="Resources\Content\tweetdeck\globals\reload_columns.js" />
-    <Content Include="Resources\Content\tweetdeck\globals\retrieve_tweet.js" />
-    <Content Include="Resources\Content\tweetdeck\globals\show_tweet_detail.js" />
-    <Content Include="Resources\Content\tweetdeck\handle_extra_mouse_buttons.js" />
-    <Content Include="Resources\Content\tweetdeck\hook_theme_settings.js" />
-    <Content Include="Resources\Content\tweetdeck\inject_css.js" />
-    <Content Include="Resources\Content\tweetdeck\keep_like_follow_dialogs_open.js" />
-    <Content Include="Resources\Content\tweetdeck\limit_loaded_dm_count.js" />
-    <Content Include="Resources\Content\tweetdeck\make_retweets_lowercase.js" />
-    <Content Include="Resources\Content\tweetdeck\middle_click_tweet_icon_actions.js" />
-    <Content Include="Resources\Content\tweetdeck\move_accounts_above_hashtags_in_search.js" />
-    <Content Include="Resources\Content\tweetdeck\offline_notification.js" />
-    <Content Include="Resources\Content\tweetdeck\open_search_externally.js" />
-    <Content Include="Resources\Content\tweetdeck\open_search_in_first_column.js" />
-    <Content Include="Resources\Content\tweetdeck\paste_images_from_clipboard.js" />
-    <Content Include="Resources\Content\tweetdeck\perform_search.js" />
-    <Content Include="Resources\Content\tweetdeck\pin_composer_icon.js" />
-    <Content Include="Resources\Content\tweetdeck\ready_plugins.js" />
-    <Content Include="Resources\Content\tweetdeck\register_composer_active_event.js" />
-    <Content Include="Resources\Content\tweetdeck\register_global_functions.js" />
-    <Content Include="Resources\Content\tweetdeck\register_global_functions_jquery.js" />
-    <Content Include="Resources\Content\tweetdeck\restore_cleared_column.js" />
-    <Content Include="Resources\Content\tweetdeck\screenshot_tweet.js" />
-    <Content Include="Resources\Content\tweetdeck\setup_column_type_attributes.js" />
-    <Content Include="Resources\Content\tweetdeck\setup_desktop_notifications.js" />
-    <Content Include="Resources\Content\tweetdeck\setup_link_context_menu.js" />
-    <Content Include="Resources\Content\tweetdeck\setup_sound_notifications.js" />
-    <Content Include="Resources\Content\tweetdeck\setup_tweetduck_account_bamboozle.js" />
-    <Content Include="Resources\Content\tweetdeck\setup_tweet_context_menu.js" />
-    <Content Include="Resources\Content\tweetdeck\setup_video_player.js" />
-    <Content Include="Resources\Content\tweetdeck\skip_pre_login_page.js" />
-    <Content Include="Resources\Content\tweetdeck\tweetdeck.css" />
-    <Content Include="Resources\Content\update\update.js" />
-    <Content Include="Resources\Content\update\update.css" />
-    <Content Include="Resources\Guide\img\app-menu.png" />
-    <Content Include="Resources\Guide\img\column-clear-header.png" />
-    <Content Include="Resources\Guide\img\column-clear-preferences.png" />
-    <Content Include="Resources\Guide\img\column-preferences.png" />
-    <Content Include="Resources\Guide\img\icon.ico" />
-    <Content Include="Resources\Guide\img\new-tweet-emoji.png" />
-    <Content Include="Resources\Guide\img\new-tweet-pin.png" />
-    <Content Include="Resources\Guide\img\new-tweet-template-advanced.png" />
-    <Content Include="Resources\Guide\img\new-tweet-template-basic.png" />
-    <Content Include="Resources\Guide\img\options-manage-export.png" />
-    <Content Include="Resources\Guide\img\options-manage-reset.png" />
-    <Content Include="Resources\Guide\img\options-manage.png" />
-    <Content Include="Resources\Guide\img\options-notifications-location.png" />
-    <Content Include="Resources\Guide\img\options-notifications-size.png" />
-    <Content Include="Resources\Guide\img\options-sounds.png" />
-    <Content Include="Resources\Guide\img\settings-dropdown.png" />
-    <Content Include="Resources\Guide\img\settings-editdesign.png" />
-    <Content Include="Resources\Guide\index.html" />
-    <Content Include="Resources\Guide\script.js" />
-    <Content Include="Resources\Guide\style.css" />
-  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PostBuildEvent>rmdir "$(ProjectDir)bin\Debug"
-rmdir "$(ProjectDir)bin\Release"
-
-rmdir "$(TargetDir)guide" /S /Q
-rmdir "$(TargetDir)plugins" /S /Q
-rmdir "$(TargetDir)resources" /S /Q
-
-"$(ProjectDir)bld\post_build.exe" "$(TargetDir)\" "$(ProjectDir)\" "$(ConfigurationName)"
-</PostBuildEvent>
-  </PropertyGroup>
-  <Target Name="BeforeBuild" Condition="(!$([System.IO.File]::Exists(&quot;$(ProjectDir)bld\post_build.exe&quot;)) OR ($([System.IO.File]::GetLastWriteTime(&quot;$(ProjectDir)Resources\PostBuild.fsx&quot;).Ticks) &gt; $([System.IO.File]::GetLastWriteTime(&quot;$(ProjectDir)bld\post_build.exe&quot;).Ticks)))">
-    <Exec Command="powershell -NoProfile -ExecutionPolicy Bypass -File &quot;$(ProjectDir)bld\POST BUILD.ps1&quot; &quot;$(DevEnvDir)\CommonExtensions\Microsoft\FSharp&quot;" WorkingDirectory="$(ProjectDir)bld\" IgnoreExitCode="true" />
-  </Target>
-  <Target Name="AfterBuild" Condition="$(ConfigurationName) == Release">
-    <Exec Command="del &quot;$(TargetDir)*.pdb&quot;" />
-    <Exec Command="del &quot;$(TargetDir)*.xml&quot;" />
-    <Delete Files="$(TargetDir)CefSharp.BrowserSubprocess.exe" />
-    <Delete Files="$(TargetDir)widevinecdmadapter.dll" />
-    <Copy SourceFiles="@(Redist)" DestinationFolder="$(TargetDir)" />
-    <Exec Command="start &quot;&quot; /B &quot;ISCC.exe&quot; /Q &quot;$(ProjectDir)bld\gen_upd.iss&quot;" WorkingDirectory="$(ProjectDir)bld\" IgnoreExitCode="true" />
-  </Target>
   <PropertyGroup>
     <PreBuildEvent>powershell -NoProfile -Command "$ErrorActionPreference = 'SilentlyContinue'; (Get-Process TweetDuck.Browser | Where-Object {$_.Path -eq '$(TargetDir)TweetDuck.Browser.exe'}).Kill(); Exit 0"</PreBuildEvent>
   </PropertyGroup>
+  <Target Name="CopyResources" AfterTargets="Build">
+    <ItemGroup>
+      <LocalesToDelete Include="$(TargetDir)locales\*.pak" Exclude="$(TargetDir)locales\en-US.pak" Visible="false" />
+    </ItemGroup>
+    <Delete Files="@(LocalesToDelete)" />
+    <RemoveDir Directories="$(TargetDir)resources" />
+    <RemoveDir Directories="$(TargetDir)guide" />
+    <RemoveDir Directories="$(TargetDir)plugins" />
+    <MakeDir Directories="$(TargetDir)plugins\official" />
+    <MakeDir Directories="$(TargetDir)plugins\user" />
+    <Copy SourceFiles="@(ResourcesContent)" DestinationFiles="@(ResourcesContent->'$(TargetDir)\resources\%(RecursiveDir)%(Filename)%(Extension)')" />
+    <Copy SourceFiles="@(ResourcesGuide)" DestinationFiles="@(ResourcesGuide->'$(TargetDir)\guide\%(RecursiveDir)%(Filename)%(Extension)')" />
+    <Copy SourceFiles="@(ResourcesPlugins)" DestinationFiles="@(ResourcesPlugins->'$(TargetDir)\plugins\official\%(RecursiveDir)%(Filename)%(Extension)')" />
+    <Exec Command="powershell -NoProfile -ExecutionPolicy Unrestricted -File &quot;$(ProjectDir)Resources\PostBuild.ps1&quot; &quot;$(TargetDir)\&quot;" IgnoreExitCode="false" />
+  </Target>
+  <Target Name="FinalizeDebug" AfterTargets="CopyResources" Condition="$(ConfigurationName) == Debug">
+    <Copy SourceFiles="@(ResourcesPluginsDebug)" DestinationFiles="@(ResourcesPluginsDebug->'$(TargetDir)\plugins\user\.debug\%(RecursiveDir)%(Filename)%(Extension)')" />
+  </Target>
+  <Target Name="FinalizeRelease" AfterTargets="CopyResources" Condition="$(ConfigurationName) == Release">
+    <ItemGroup>
+      <PdbFiles Include="$(TargetDir)*.pdb" Visible="false" />
+      <XmlFiles Include="$(TargetDir)*.xml" Visible="false" />
+      <TxtFiles Include="$(TargetDir)*.txt" Visible="false" />
+    </ItemGroup>
+    <RemoveDir Directories="$(TargetDir)plugins\official\.debug" />
+    <Delete Files="$(TargetDir)CefSharp.BrowserSubprocess.exe" />
+    <Delete Files="$(TargetDir)widevinecdmadapter.dll" />
+    <Delete Files="@(PdbFiles)" />
+    <Delete Files="@(XmlFiles)" />
+    <Delete Files="@(TxtFiles)" />
+    <Copy SourceFiles="@(Redist)" DestinationFolder="$(TargetDir)" />
+    <Copy SourceFiles="$(ProjectDir)bld\Resources\LICENSES.txt" DestinationFolder="$(TargetDir)" />
+    <Exec Command="start &quot;&quot; /B &quot;ISCC.exe&quot; /Q &quot;$(ProjectDir)bld\gen_upd.iss&quot;" WorkingDirectory="$(ProjectDir)bld\" IgnoreExitCode="true" />
+  </Target>
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
     <PropertyGroup>
       <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
diff --git a/bld/POST BUILD.ps1 b/bld/POST BUILD.ps1
deleted file mode 100644
index 575ed712..00000000
--- a/bld/POST BUILD.ps1	
+++ /dev/null
@@ -1,22 +0,0 @@
-if ([IO.File]::Exists("post_build.exe")) {
-  [IO.File]::Delete("post_build.exe");
-}
-
-$fs = $args[0];
-$fsc = "";
-
-if ([IO.File]::Exists("$fs\fsc.exe")) {
-  $fsc = "$fs\fsc.exe";
-}
-
-if ([IO.File]::Exists("$fs\Tools\fsc.exe")) {
-  $fsc = "$fs\Tools\fsc.exe";
-}
-
-if ($fsc -eq "") {
-  Write-Host "fsc.exe not found"
-  $Host.SetShouldExit(1);
-  exit
-}
-
-& $fsc --standalone --deterministic --preferreduilang:en-US --platform:x86 --target:exe --out:post_build.exe "$PSScriptRoot\..\Resources\PostBuild.fsx"
diff --git a/bld/gen_upd.iss b/bld/gen_upd.iss
index 5b7a06e3..7773555b 100644
--- a/bld/gen_upd.iss
+++ b/bld/gen_upd.iss
@@ -67,6 +67,7 @@ Type: filesandordirs; Name: "{localappdata}\{#MyAppName}\GPUCache"
 [InstallDelete]
 Type: files; Name: "{app}\CEFSHARP-LICENSE.txt"
 Type: files; Name: "{app}\LICENSE.txt"
+Type: files; Name: "{app}\README.txt"
 Type: files; Name: "{app}\natives_blob.bin"
 Type: files; Name: "{app}\cef.pak"
 Type: files; Name: "{app}\cef_100_percent.pak"