From 198e984bcd00c32c100821c7edc7670f0f84ffcf Mon Sep 17 00:00:00 2001
From: Manuel Thalmann <m@nuth.ch>
Date: Thu, 8 Aug 2024 04:36:35 +0200
Subject: [PATCH] Add scripts for all remaining apps

---
 scripts/Common/Software/PinnedItem/Manage.ps1 |  15 ++
 scripts/Windows/OS/Install.ps1                | 176 +++++++++++++++++-
 scripts/Windows/Scripts/AppAssociations.ps1   |   4 +-
 .../Software/MSEdgeRedirect/Manage.ps1        |  35 ++++
 .../Windows/Software/ManiaPlanet/Manage.ps1   |  13 ++
 scripts/Windows/Software/NVS/Manage.ps1       |  33 ++++
 scripts/Windows/Software/PuTTY/Manage.ps1     |  14 ++
 scripts/Windows/Software/RetroArch/Manage.ps1 |  15 ++
 .../TrackMania Nations Forever/Manage.ps1     |  21 +++
 .../TrackMania United Forever/Manage.ps1      |  33 ++++
 .../Ubiquiti UniFi Controller/Manage.ps1      |  25 +++
 .../Windows/Software/VisualStudio/Manage.ps1  |  32 ++++
 scripts/Windows/Software/osu!/Manage.ps1      |  14 ++
 scripts/Windows/Software/osu!lazer/Manage.ps1 |  31 +++
 scripts/Windows/Software/reWASD/Manage.ps1    |  22 +++
 scripts/Windows/Software/zoxide/Manage.ps1    |  28 +++
 16 files changed, 508 insertions(+), 3 deletions(-)
 create mode 100644 scripts/Common/Software/PinnedItem/Manage.ps1
 create mode 100644 scripts/Windows/Software/MSEdgeRedirect/Manage.ps1
 create mode 100644 scripts/Windows/Software/ManiaPlanet/Manage.ps1
 create mode 100644 scripts/Windows/Software/NVS/Manage.ps1
 create mode 100644 scripts/Windows/Software/PuTTY/Manage.ps1
 create mode 100644 scripts/Windows/Software/RetroArch/Manage.ps1
 create mode 100644 scripts/Windows/Software/TrackMania Nations Forever/Manage.ps1
 create mode 100644 scripts/Windows/Software/TrackMania United Forever/Manage.ps1
 create mode 100644 scripts/Windows/Software/Ubiquiti UniFi Controller/Manage.ps1
 create mode 100644 scripts/Windows/Software/VisualStudio/Manage.ps1
 create mode 100644 scripts/Windows/Software/osu!/Manage.ps1
 create mode 100644 scripts/Windows/Software/osu!lazer/Manage.ps1
 create mode 100644 scripts/Windows/Software/reWASD/Manage.ps1
 create mode 100644 scripts/Windows/Software/zoxide/Manage.ps1

diff --git a/scripts/Common/Software/PinnedItem/Manage.ps1 b/scripts/Common/Software/PinnedItem/Manage.ps1
new file mode 100644
index 00000000..5394743e
--- /dev/null
+++ b/scripts/Common/Software/PinnedItem/Manage.ps1
@@ -0,0 +1,15 @@
+param (
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../PowerShell/Module.ps1";
+. "$PSScriptRoot/../../Scripts/Software.ps1";
+
+$parameters = Get-ModuleInstallerComponents "PinnedItem" -NativeOnly;
+
+foreach ($key in $PSBoundParameters.Keys) {
+    $parameters.Add($key, $PSBoundParameters.TryGetValue($key));
+}
+
+Start-SoftwareInstaller @parameters;
diff --git a/scripts/Windows/OS/Install.ps1 b/scripts/Windows/OS/Install.ps1
index b27d2e0c..b5c958c5 100644
--- a/scripts/Windows/OS/Install.ps1
+++ b/scripts/Windows/OS/Install.ps1
@@ -119,10 +119,14 @@ $null = New-Module {
                         [InstallerAction] $Action
                     )
 
+                    [bool] $install = $null;
                     $arguments = [hashtable]@{ };
 
                     if ($Action) {
-                        $arguments.Add("action", $Action);
+                        $install = $true;
+                        $null = $arguments.Add("action", $Action);
+                    } else {
+                        $install = ($Action -eq ([InstallerAction]::Install));
                     }
 
                     # Drivers
@@ -146,7 +150,7 @@ $null = New-Module {
                             }
                         }
 
-                        if (-not $Action -or ($Action -eq ([InstallerAction]::Install))) {
+                        if ($install) {
                             if (Get-Config "valhalla.hardware.amdCPU") {
                                 Install-ChocoPackage amd-ryzen-master;
                                 # ToDo: backup Ryzen energy saving plan
@@ -182,30 +186,198 @@ $null = New-Module {
                         $commonSoftware = "$PSScriptRoot/../../Common/Software";
                         . "$softwarePath/Windows/Manage.ps1" @arguments;
 
+                        if (Get-Config "valhalla.hardware.logitechG") {
+                            . "$softwarePath/LGHub/Manage.ps1" @arguments;
+                        }
+
                         if (Test-Collection "essential") {
                             # Essentials
                             . "$softwarePath/OpenSSH/Manage.ps1" @arguments;
                             . "$softwarePath/PowerShell/Manage.ps1" @arguments;
                             . "$softwarePath/chocolatey/Manage.ps1" @arguments;
+                            . "$softwarePath/zoxide/Manage.ps1" @arguments;
                             . "$commonSoftware/posh-git/Manage.ps1" @arguments;
                             . "$commonSoftware/Terminal-Icons/Manage.ps1" @arguments;
                             . "$commonSoftware/Oh My Posh/Manage.ps1" @arguments;
+
+                            if ($install) {
+                                Install-ChocoPackage `
+                                    procexp `
+                                    procmon `
+                                    ;
+
+                                Install-WingetPackage `
+                                    KDE.KDEConnect `
+                                    ;
+                            }
                         }
 
                         if (Test-Collection "common") {
                             # Common Software
                             . "$softwarePath/WinSCP/Manage.ps1" @arguments;
                             . "$softwarePath/Thunderbird/Manage.ps1" @arguments;
+                            . "$softwarePath/PuTTY/Manage.ps1" @arguments;
+
+                            if ($install) {
+                                Install-ChocoPackage `
+                                    7zip `
+                                    chocolateygui `
+                                    DefaultProgramsEditor `
+                                    bitwarden `
+                                    keepass `
+                                    ;
+
+                                Install-WingetPackage `
+                                    SomePythonThings.WingetUIStore `
+                                    ;
+                            }
                         }
 
                         if (Test-Collection "desktopExperience") {
+                            if ($install) {
+                                # Fonts
+                                Install-ChocoPackage nerd-fonts-CascadiaCode;
+
+                                # Internet Access
+                                Install-WingetPackage Brave.Brave kamranahmedse.pennywise;
+                                Remove-DesktopIcon "*Brave*";
+                                Remove-TaskbarItem "*Brave*";
+                                Remove-DesktopIcon "Pennywise*";
+
+                                # Tools
+                                Install-SetupPackage -Source "https://github.com/mRemoteNG/mRemoteNG/releases/download/2023.03.03-v1.77.3-nb/mRemoteNG-Installer-1.77.3.nb-1784.msi" -ArgumentList "/Quiet";
+                                Remove-DesktopIcon "mRemoteNG*";
+
+                                Install-ChocoPackage `
+                                    gimp `
+                                    gpu-z `
+                                    windirstat `
+                                    winmerge `
+                                    handbrake `
+                                    hwmonitor `
+                                    qbittorrent `
+                                    imgburn `
+                                    inkscape `
+                                    krita `
+                                    MetaX `
+                                    obs-studio `
+                                    ;
+
+                                Remove-DesktopIcon "GPU-Z*";
+                                Remove-DesktopIcon "WinDirStat*";
+                                Remove-DesktopIcon "*HWMonitor*";
+                                Remove-DesktopIcon "ImgBurn*";
+                                Remove-DesktopIcon "InkScape*";
+                                Remove-DesktopIcon "Krita*";
+                                Remove-DesktopIcon "MetaX*";
+                                Remove-DesktopIcon "OBS Studio*";
+
+                                Install-WingetPackage `
+                                    AntSoftware.AntRenamer `
+                                    AppWork.JDownloader;
+
+                                Remove-DesktopIcon "JDownloader*";
+                            }
+
+                            # ToDo: Consider hiding behind own config?
+                            . "$softwarePath/Ubiquiti UniFi Controller/Manage.ps1" @arguments;
+
                             # Internet Access
                             . "$softwarePath/Firefox/Manage.ps1" @arguments;
+                            . "$softwarePath/MSEdgeRedirect/Manage.ps1" @arguments;
 
                             if (Test-Collection "fileSync") {
                                 . "$softwarePath/Nextcloud/Manage.ps1" @arguments;
                             }
                         }
+
+                        if (Test-Collection "socialMedia") {
+                            if ($install) {
+                                Install-ChocoPackage `
+                                    signal `
+                                    threema-desktop `
+                                    element-desktop `
+                                    teamspeak `
+                                    ;
+
+                                Remove-DesktopIcon "*Element*";
+                                Remove-DesktopIcon "*TeamSpeak*";
+
+                                Install-WingetPackage Discord.Discord;
+                                Remove-DesktopIcon "*Discord*";
+                            }
+                        }
+
+                        if (Test-Collection "media") {
+                            if ($install) {
+                                Install-ChocoPackage `
+                                    k-litecodecpackmega `
+                                    jellyfin-media-player `
+                                    vlc `
+                                    ;
+
+                                Remove-DesktopIcon "VLC*";
+                                Install-WingetPackage Ytmdesktop.Ytmdesktop;
+                                Remove-DesktopIcon "Youtube Music*";
+                            }
+                        }
+
+                        if (Test-Collection "coding") {
+                            if ($install) {
+                                Install-ChocoPackage vscode -ArgumentList "--params","/NoDesktopIcon";
+                                Install-ChocoPackage vscodium -ArgumentList "--params","/NoDesktopIcon /AssociateWithFiles";
+
+                                Install-ChocoPackage `
+                                    gh `
+                                    github-desktop `
+                                    ida-free `
+                                    HxD `
+                                    docker-desktop `
+                                    imhex `
+                                    dotpeek `
+                                    ;
+
+                                Remove-DesktopIcon "IDA *";
+                                Remove-DesktopIcon "GitHub*";
+                                Remove-DesktopIcon "Docker*";
+                            }
+
+                            . "$softwarePath/VisualStudio/Manage.ps1" @arguments;
+
+                            # Node.js
+                            . "$softwarePath/NVS/Manage.ps1" @arguments;
+                        }
+
+                        if (Test-Collection "gaming") {
+                            # Gaming
+                            if ($install) {
+                                Install-ChocoPackage `
+                                    goggalaxy `
+                                    epicgameslauncher `
+                                    steam `
+                                    rayman-controlpanel `
+                                    ppsspp `
+                                    ;
+
+                                Remove-DesktopIcon "*Epic Games*";
+                                Remove-DesktopIcon "*Steam*";
+                                Remove-DesktopIcon "*PPSSPP *-Bit*";
+
+                                Install-ChocoPackage ubisoft-connect -ArgumentList "--ignore-checksums";
+                                Remove-DesktopIcon "*Ubisoft Connect*";
+
+                                Install-WingetPackage ElectronicArts.EADesktop;
+                                Remove-DesktopIcon "EA.*";
+                            }
+
+                            . "$softwarePath/TrackMania Nations Forever/Manage.ps1" @arguments;
+                            . "$softwarePath/TrackMania United Forever/Manage.ps1" @arguments;
+                            . "$softwarePath/ManiaPlanet/Manage.ps1" @arguments;
+                            . "$softwarePath/osu!/Manage.ps1" @arguments;
+                            . "$softwarePath/osu!lazer/Manage.ps1" @arguments;
+                            . "$softwarePath/RetorArch/Manage.ps1" @arguments;
+                            . "$softwarePath/reWASD/Manage.ps1" @arguments;
+                        }
                     };
                 }
 
diff --git a/scripts/Windows/Scripts/AppAssociations.ps1 b/scripts/Windows/Scripts/AppAssociations.ps1
index c630292a..a4af3c1c 100644
--- a/scripts/Windows/Scripts/AppAssociations.ps1
+++ b/scripts/Windows/Scripts/AppAssociations.ps1
@@ -96,7 +96,9 @@ $null = New-Module {
         $writer = [XmlWriter]::Create($configFile.FullName, $writerSettings);
         $document.Save($writer);
         $writer.Dispose();
-        DISM /Online "/Import-DefaultAppAssociations:$($configFile.FullName)";
+        Write-Host "$configFile";
+        Read-Host "press enter";
+        # DISM /Online "/Import-DefaultAppAssociations:$($configFile.FullName)";
         Remove-Item $configFile;
     }
 }
diff --git a/scripts/Windows/Software/MSEdgeRedirect/Manage.ps1 b/scripts/Windows/Software/MSEdgeRedirect/Manage.ps1
new file mode 100644
index 00000000..f189a7dc
--- /dev/null
+++ b/scripts/Windows/Software/MSEdgeRedirect/Manage.ps1
@@ -0,0 +1,35 @@
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        param(
+            [scriptblock] $Installer
+        )
+
+        Install-ChocoPackage MSEdgeRedirect;
+        & $Installer -Action ([InstallerAction]::Configure);
+    } `
+    -Configurator {
+        $configPath = "HKLM:\SOFTWARE\Robert Maehl Software\MSEdgeRedirect";
+
+        [hashtable] $options = @{
+            NoBing = 1;
+            NoImgs = 1;
+            NoNews = 1;
+            NoPDFs = 1;
+            Search = "StartPage";
+            Images = "Custom";
+            ImagePath = "https://startpage.com/sp/search?cat=images&query=";
+            News = "Google";
+            PDFApp = "C:\Program Files\Mozilla Firefox\firefox.exe";
+        };
+
+        foreach ($key in $options.Keys) {
+            Set-ItemProperty $configPath -Name $key -Value ($options[$key]);
+        }
+    };
diff --git a/scripts/Windows/Software/ManiaPlanet/Manage.ps1 b/scripts/Windows/Software/ManiaPlanet/Manage.ps1
new file mode 100644
index 00000000..d2cd2cd4
--- /dev/null
+++ b/scripts/Windows/Software/ManiaPlanet/Manage.ps1
@@ -0,0 +1,13 @@
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        Install-WingetPackage Nadeo.ManiaPlanet;
+    };
+
+# ToDo: Add restoration
diff --git a/scripts/Windows/Software/NVS/Manage.ps1 b/scripts/Windows/Software/NVS/Manage.ps1
new file mode 100644
index 00000000..31d6e2db
--- /dev/null
+++ b/scripts/Windows/Software/NVS/Manage.ps1
@@ -0,0 +1,33 @@
+using namespace System.Security.AccessControl;
+using namespace System.Security.Principal;
+
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        $env:NVS_HOME = "$env:ProgramData\nvs";
+        git clone "https://github.com/jasongin/nvs.git" $env:NVS_HOME;
+        & "$env:NVS_HOME\nvs.cmd" install;
+
+        $acl = Get-Acl $env:NVS_HOME;
+
+        $acl.AddAccessRule(
+            [FileSystemAccessRule]::new(
+                [SecurityIdentifier]::new([WellKnownSidType]::BuiltinUsersSid, $null),
+                [FileSystemRights]::FullControl,
+                [InheritanceFlags]::ObjectInherit -bor [InheritanceFlags]::ContainerInherit,
+                [PropagationFlags]::InheritOnly,
+                [AccessControlType]::Allow));
+
+        Set-Acl $env:NVS_HOME $acl;
+        refreshenv;
+    } `
+    -Configurator {
+        nvs add latest;
+        nvs link latest;
+    };
diff --git a/scripts/Windows/Software/PuTTY/Manage.ps1 b/scripts/Windows/Software/PuTTY/Manage.ps1
new file mode 100644
index 00000000..cb6e5b56
--- /dev/null
+++ b/scripts/Windows/Software/PuTTY/Manage.ps1
@@ -0,0 +1,14 @@
+using namespace Microsoft.Win32;
+
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        Install-ChocoPackage putty;
+    };
+# ToDo: Add restoration
diff --git a/scripts/Windows/Software/RetroArch/Manage.ps1 b/scripts/Windows/Software/RetroArch/Manage.ps1
new file mode 100644
index 00000000..2667782c
--- /dev/null
+++ b/scripts/Windows/Software/RetroArch/Manage.ps1
@@ -0,0 +1,15 @@
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        Install-ChocoPackage retroarch;
+        # ToDo: Add start menu shortcut
+        # ToDo: Add function for this purpose
+    };
+
+# ToDo: Add restoration
diff --git a/scripts/Windows/Software/TrackMania Nations Forever/Manage.ps1 b/scripts/Windows/Software/TrackMania Nations Forever/Manage.ps1
new file mode 100644
index 00000000..e2bddc0b
--- /dev/null
+++ b/scripts/Windows/Software/TrackMania Nations Forever/Manage.ps1	
@@ -0,0 +1,21 @@
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        foreach ($feature in @("DirectPlay", "NetFx3")) {
+            if ((Get-WindowsOptionalFeature -Online -FeatureName $feature).State -ne "Enabled") {
+                Write-Information "Enabling the ``$feature`` feature…";
+                $null = Enable-WindowsOptionalFeature -Online -All -FeatureName $feature;
+            }
+
+            Install-WingetPackage Nadeo.TrackManiaNationsForever;
+            Remove-DesktopIcon "*TmNationsForever*";
+        }
+    };
+
+# ToDo: Add restoration
diff --git a/scripts/Windows/Software/TrackMania United Forever/Manage.ps1 b/scripts/Windows/Software/TrackMania United Forever/Manage.ps1
new file mode 100644
index 00000000..da083bbe
--- /dev/null
+++ b/scripts/Windows/Software/TrackMania United Forever/Manage.ps1	
@@ -0,0 +1,33 @@
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        $file = "TmUnitedForever.exe";
+        $dir = New-TemporaryDirectory;
+
+        foreach ($feature in @("DirectPlay", "NetFx3")) {
+            if ((Get-WindowsOptionalFeature -Online -FeatureName $feature).State -ne "Enabled") {
+                Write-Information "Enabling the ``$feature`` feature…";
+                $null = Enable-WindowsOptionalFeature -Online -All -FeatureName $feature;
+            }
+        }
+
+        $null = Push-Location $dir;
+        Write-Host "Downloading TrackMania United Forever…";
+        Invoke-WebRequest "http://files.trackmaniaforever.com/tmunitedforever_setup.exe" -OutFile "$file";
+
+        Write-Host "Starting installation…";
+        Start-Process -Wait -FilePath $file -ArgumentList "/Silent";
+        Remove-DesktopIcon "*TmUnitedForever*";
+        $null = Pop-Location;
+
+        Remove-Item -Recurse $dir;
+    };
+
+# ToDo: Add restoration
diff --git a/scripts/Windows/Software/Ubiquiti UniFi Controller/Manage.ps1 b/scripts/Windows/Software/Ubiquiti UniFi Controller/Manage.ps1
new file mode 100644
index 00000000..eb047168
--- /dev/null
+++ b/scripts/Windows/Software/Ubiquiti UniFi Controller/Manage.ps1	
@@ -0,0 +1,25 @@
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        Write-Information "Downgrading AutoHotkey…";
+        $id = "AutoHotkey.AutoHotkey";
+        $uninstall = { winget uninstall --accept-source-agreements -e --id "$id"; };
+        & $uninstall;
+        Install-WingetPackage $id -ArgumentList "--version","1.1.37.00";
+        Install-ChocoPackage temurin11jre;
+
+        Write-Host "Installing UniFi Controller…";
+        Install-ChocoPackage ubiquiti-unifi-controller -ArgumentList "--ignore-dependencies";
+
+        Write-Information "Upgrading AutoHotkey…";
+        & $uninstall;
+        Install-WingetPackage $id;
+        Remove-DesktopIcon "UniFi*";
+    };
diff --git a/scripts/Windows/Software/VisualStudio/Manage.ps1 b/scripts/Windows/Software/VisualStudio/Manage.ps1
new file mode 100644
index 00000000..79b7301a
--- /dev/null
+++ b/scripts/Windows/Software/VisualStudio/Manage.ps1
@@ -0,0 +1,32 @@
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+& {
+    param($parameters)
+
+    . "$PSScriptRoot/../../../Common/Scripts/BrowserAutomation.ps1";
+    . "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+    . "$PSScriptRoot/../../../Common/Scripts/System.ps1";
+
+    [System.Tuple[string, string, string][]] $versions = @(
+        [System.Tuple]::Create("visualstudio2019enterprise", "VisualStudio.16.Release", "Microsoft.VisualStudio.Product.Enterprise"),
+        [System.Tuple]::Create("visualstudio2019community", "VisualStudio.16.Release", "Microsoft.VisualStudio.Product.Community"),
+        [System.Tuple]::Create("visualstudio2022enterprise", "VisualStudio.17.Release", "Microsoft.VisualStudio.Product.Enterprise"),
+        [System.Tuple]::Create("visualstudio2022community", "VisualStudio.17.Release", "Microsoft.VisualStudio.Product.Community")
+    );
+
+    Start-SoftwareInstaller @parameters `
+        -Installer {
+            foreach ($version in $versions) {
+                $packageName = $version[0];
+                Write-Host "Installing ``$packageName``…";
+                Install-ChocoPackage $packageName;
+                Remove-DesktopIcon "CocosCreator*";
+                Remove-DesktopIcon "Unity Hub*";
+            }
+        };
+
+    # ToDo: Add restoration
+} $PSBoundParameters;
diff --git a/scripts/Windows/Software/osu!/Manage.ps1 b/scripts/Windows/Software/osu!/Manage.ps1
new file mode 100644
index 00000000..d3ad1af7
--- /dev/null
+++ b/scripts/Windows/Software/osu!/Manage.ps1
@@ -0,0 +1,14 @@
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        Install-ChocoPackage osu;
+        Remove-DesktopIcon "*osu*";
+    };
+
+# ToDo: Add restoration
diff --git a/scripts/Windows/Software/osu!lazer/Manage.ps1 b/scripts/Windows/Software/osu!lazer/Manage.ps1
new file mode 100644
index 00000000..e3f96bf5
--- /dev/null
+++ b/scripts/Windows/Software/osu!lazer/Manage.ps1
@@ -0,0 +1,31 @@
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        $file = "osu!lazer.exe";
+        $processName = "osu!";
+        $dir = New-TemporaryDirectory;
+
+        Push-Location $dir;
+        Invoke-WebRequest "https://github.com/ppy/osu/releases/latest/download/install.exe" -OutFile $file;
+        Start-Process -FilePath $file;
+
+        while (-not (Get-Process -ErrorAction SilentlyContinue $processName)) {
+            Start-Sleep 1;
+        }
+
+        Start-Sleep 10;
+        Get-Process $processName | Stop-Process -Force;
+        Pop-Location;
+        Remove-Item -Recurse $dir,
+
+        Remove-DesktopIcon "*osu*";
+    };
+
+# ToDo: Add restoration
diff --git a/scripts/Windows/Software/reWASD/Manage.ps1 b/scripts/Windows/Software/reWASD/Manage.ps1
new file mode 100644
index 00000000..47998cd7
--- /dev/null
+++ b/scripts/Windows/Software/reWASD/Manage.ps1
@@ -0,0 +1,22 @@
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../../../Common/Scripts/BrowserAutomation.ps1";
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        Write-Host "Downloading reWASD…";
+        $dir = New-TemporaryDirectory;
+        $file = Start-BrowserDownload -URL "https://rewasd.com/" -ButtonSelector 'a.btn-default[href="#"]' -OutDir $dir;
+
+        Write-Host "Installing reWASD…";
+        Start-Process -Wait -FilePath $($file.FullName) -ArgumentList "/S";
+        Remove-Item -Recurse $dir;
+        Remove-DesktopIcon "*reWASD*";
+    };
+
+# ToDo: Add restoration
diff --git a/scripts/Windows/Software/zoxide/Manage.ps1 b/scripts/Windows/Software/zoxide/Manage.ps1
new file mode 100644
index 00000000..a3720129
--- /dev/null
+++ b/scripts/Windows/Software/zoxide/Manage.ps1
@@ -0,0 +1,28 @@
+param(
+    $Action,
+    [hashtable] $Arguments
+)
+
+. "$PSScriptRoot/../PowerShell/Profile.ps1";
+. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
+
+Start-SoftwareInstaller @PSBoundParameters `
+    -Installer {
+        param(
+            [scriptblock] $Installer
+        )
+
+        Install-ChocoPackage zoxide;
+        Install-WingetPackage junegunn.fzf;
+        & $Installer -Action ([InstallerAction]::Configure);
+    } `
+    -Configurator {
+        Add-PowerShellProfileStatement `
+            -System `
+            -Category "zoxide" `
+            -Script (
+                @(
+                    "# zoxide",
+                    (Get-ScriptInitializer "zoxide init powershell | Out-String")
+                ) -join [System.Environment]::NewLine);
+    };