diff --git a/library/win_winget.ps1 b/library/win_winget.ps1
new file mode 100644
index 0000000..1915df3
--- /dev/null
+++ b/library/win_winget.ps1
@@ -0,0 +1,96 @@
+#!powershell
+
+#AnsibleRequires -CSharpUtil Ansible.Basic
+#AnsibleRequires -PowerShell Ansible.ModuleUtils.CommandUtil
+
+$module = [Ansible.Basic.AnsibleModule]::Create($args, @{
+ options = @{
+ name = @{
+ type = "str"
+ default = $null
+ }
+ state = @{
+ type = "str"
+ default = "present"
+ choices = ("absent", "latest", "present")
+ }
+ }
+ supports_check_mode = $false
+})
+
+$name = $module.Params.name
+$state = $module.Params.state
+$winget = Get-ExecutablePath "winget"
+$noPackageString = "No installed package found matching input criteria."
+
+if ($name -and $id) {
+ $module.FailJson("name `"$name`" and id `"$id`" must not both be provided")
+}
+
+function Test-Installed {
+ $command = "`"$winget`" list `"$name`""
+ $result = Run-Command -command $command
+ if ($result.rc -eq 0) {
+ return $true
+ }
+ return $false
+}
+
+function Test-UpgradeAvailable {
+ if (!(Test-Installed)) {
+ return $true
+ }
+ $command = "`"$winget`" list --upgrade-available `"$name`""
+ $result = Run-Command -command $command
+ if ($result.stdout.Contains($noPackageString)) {
+ return $false
+ }
+ return $true
+}
+
+switch ($state) {
+ "absent" {
+ if (Test-Installed) {
+ $command = "`"$winget`" uninstall `"$name`""
+ $result = Run-Command -command $command
+ if ($result.rc -ne 0) {
+ $module.Result.rc = $result.rc
+ $module.Result.stdout = $result.stdout
+ $module.FailJson("Failed to uninstall package `"$name`"")
+ }
+ $module.Result.stdout = $result.stdout
+ $module.Result.changed = $true
+ }
+ }
+
+ "latest" {
+ if (Test-UpgradeAvailable) {
+ $command = "`"$winget`" install `"$name`""
+ $result = Run-Command -command $command
+ if ($result.rc -ne 0) {
+ $module.Result.rc = $result.rc
+ $module.Result.stdout = $result.stdout
+ $module.FailJson("Failed to install package `"$name`"")
+ }
+ $module.Result.stdout = $result.stdout
+ $module.Result.changed = $true
+ }
+ }
+
+ "present" {
+ if (!(Test-Installed)) {
+ $command = "`"$winget`" install `"$name`""
+ $result = Run-Command -command $command
+ if ($result.rc -ne 0) {
+ $module.Result.rc = $result.rc
+ $module.Result.stdout = $result.stdout
+ $module.FailJson("Failed to install package `"$name`"")
+ }
+ $module.Result.stdout = $result.stdout
+ $module.Result.changed = $true
+ }
+ }
+}
+
+$module.Result.rc = 0
+$module.ExitJson()
diff --git a/library/win_winget.py b/library/win_winget.py
new file mode 100644
index 0000000..992960f
--- /dev/null
+++ b/library/win_winget.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+
+DOCUMENTATION = '''
+module: win_winget
+author:
+ - "Kenneth Benzie (Benie)"
+short_desription: Manages packages with WinGet
+description:
+ - Magage packages using WinGet.
+options:
+ name:
+ description:
+ - Name of the package to manage.
+ type: str
+ state:
+ description:
+ - Indicates the desired package state. V(latest) ensures that the latest
+ version is installed.
+ type: str
+ choices: [ absent, present, latest ]
+ default: present
+'''
+
+EXAMPLES = '''
+- name: Install Apple Music
+ win_winget:
+ name: Apple Music
+ state: present
+
+- name: Install latest version of Neovim Qt
+ win_winget:
+ name: neovim-qt
+ state: latest
+
+- name: Uninstall Microsoft OneDrive
+ win_winget:
+ id: Microsoft.OneDrive
+ state: absent
+'''
+
+RETURN = '''
+stdout:
+ description: Output from WinGet.
+ returned: Success, when needed.
+ type: str
+ sample: ''
+'''