diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix
index 286918c..026b4d1 100644
--- a/nix/configuration/configuration.nix
+++ b/nix/configuration/configuration.nix
@@ -69,6 +69,7 @@
     ./roles/sops
     ./roles/gcloud
     ./roles/steam_run_free
+    ./roles/pcsx2
   ];
 
   nix.settings.experimental-features = [
diff --git a/nix/configuration/hosts/odo/default.nix b/nix/configuration/hosts/odo/default.nix
index 9b2dbd8..c5ac484 100644
--- a/nix/configuration/hosts/odo/default.nix
+++ b/nix/configuration/hosts/odo/default.nix
@@ -65,6 +65,7 @@
   me.lvfs.enable = true;
   me.media.enable = true;
   me.nix_index.enable = true;
+  me.pcsx2.enable = true;
   me.python.enable = true;
   me.qemu.enable = true;
   me.rust.enable = true;
diff --git a/nix/configuration/hosts/odo/wifi.nix b/nix/configuration/hosts/odo/wifi.nix
index d523f3c..867f37f 100644
--- a/nix/configuration/hosts/odo/wifi.nix
+++ b/nix/configuration/hosts/odo/wifi.nix
@@ -9,9 +9,10 @@
   imports = [ ];
 
   config = {
-    environment.loginShellInit = lib.mkIf (!config.me.buildingIso) ''
-      doas iw dev wlan0 set power_save off
-    '';
+    # Doesn't seem necessary starting with 6.13
+    # environment.loginShellInit = lib.mkIf (!config.me.buildingIso) ''
+    #   doas iw dev wlan0 set power_save off
+    # '';
 
     # Enable debug logging for ath12k wifi card.
     boot.kernelParams = [
diff --git a/nix/configuration/roles/pcsx2/default.nix b/nix/configuration/roles/pcsx2/default.nix
new file mode 100644
index 0000000..2af42ea
--- /dev/null
+++ b/nix/configuration/roles/pcsx2/default.nix
@@ -0,0 +1,95 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+  imports = [ ];
+
+  options.me = {
+    pcsx2.enable = lib.mkOption {
+      type = lib.types.bool;
+      default = false;
+      example = true;
+      description = "Whether we want to install pcsx2.";
+    };
+  };
+
+  config = lib.mkIf config.me.pcsx2.enable (
+    lib.mkMerge [
+      (lib.mkIf config.me.graphical {
+        environment.systemPackages = with pkgs; [
+          pcsx2
+        ];
+
+        environment.persistence."/state" = lib.mkIf (!config.me.buildingIso) {
+          hideMounts = true;
+          users.talexander = {
+            directories = [
+              {
+                # Shaders, games list, and achievement data.
+                directory = ".config/PCSX2/cache";
+                user = "talexander";
+                group = "talexander";
+                mode = "0755";
+              }
+              {
+                # Save states.
+                directory = ".config/PCSX2/sstates";
+                user = "talexander";
+                group = "talexander";
+                mode = "0755";
+              }
+              {
+                # Screenshots.
+                directory = ".config/PCSX2/snaps";
+                user = "talexander";
+                group = "talexander";
+                mode = "0755";
+              }
+              {
+                # Game covers.
+                directory = ".config/PCSX2/covers";
+                user = "talexander";
+                group = "talexander";
+                mode = "0755";
+              }
+              {
+                # Video recordings.
+                directory = ".config/PCSX2/videos";
+                user = "talexander";
+                group = "talexander";
+                mode = "0755";
+              }
+            ];
+          };
+        };
+
+        environment.persistence."/persist" = lib.mkIf (!config.me.buildingIso) {
+          hideMounts = true;
+          users.talexander = {
+            directories = [
+              {
+                # Game saves
+                directory = ".config/PCSX2/memcards";
+                user = "talexander";
+                group = "talexander";
+                mode = "0755";
+              }
+            ];
+          };
+        };
+
+        home-manager.users.talexander =
+          { pkgs, ... }:
+          {
+            home.file.".config/PCSX2/inis/PCSX2.ini" = {
+              source = ./files/PCSX2.ini;
+            };
+          };
+      })
+    ]
+  );
+}
diff --git a/nix/configuration/roles/pcsx2/files/PCSX2.ini b/nix/configuration/roles/pcsx2/files/PCSX2.ini
new file mode 100644
index 0000000..fe61506
--- /dev/null
+++ b/nix/configuration/roles/pcsx2/files/PCSX2.ini
@@ -0,0 +1,104 @@
+[UI]
+SettingsVersion = 1
+InhibitScreensaver = true
+ConfirmShutdown = false
+StartPaused = false
+PauseOnFocusLoss = true
+StartFullscreen = true
+
+
+[Folders]
+Bios = ../../persist/games/ps2/bios
+Snapshots = snaps
+Savestates = sstates
+MemoryCards = memcards
+Logs = logs
+Cheats = cheats
+Patches = patches
+UserResources = resources
+Cache = cache
+Textures = textures
+InputProfiles = inputprofiles
+Videos = videos
+
+
+[EmuCore/GS]
+VsyncEnable = true
+# Internal resolution aspect corrected
+ScreenshotSize = 1
+# webp
+ScreenshotFormat = 2
+OsdShowFPS = true
+# Capture video at internal resolution
+VideoCaptureAutoResolution = true
+# 2x native resolution
+upscale_multiplier = 2
+CaptureContainer = mkv
+VideoCaptureCodec = av1_vaapi
+AudioCaptureCodec = flac
+
+
+[Filenames]
+BIOS = ps2-0230a-20080220.bin
+
+[MemoryCards]
+Slot1_Enable = true
+Slot1_Filename = Mcd001.ps2
+Slot2_Enable = true
+Slot2_Filename = Mcd002.ps2
+
+
+[InputSources]
+Keyboard = false
+Mouse = false
+SDL = true
+# Enhanced ps4 and ps5 controller support
+SDLControllerEnhancedMode = true
+SDLPS5PlayerLED = true
+
+
+[Pad1]
+Type = DualShock2
+InvertL = 0
+InvertR = 0
+Deadzone = 0
+AxisScale = 1.33
+LargeMotorScale = 1
+SmallMotorScale = 1
+ButtonDeadzone = 0
+PressureModifier = 0.5
+Up = SDL-0/DPadUp
+Right = SDL-0/DPadRight
+Down = SDL-0/DPadDown
+Left = SDL-0/DPadLeft
+Triangle = SDL-0/Y
+Circle = SDL-0/B
+Cross = SDL-0/A
+Square = SDL-0/X
+Select = SDL-0/Back
+Start = SDL-0/Start
+L1 = SDL-0/LeftShoulder
+L2 = SDL-0/+LeftTrigger
+R1 = SDL-0/RightShoulder
+R2 = SDL-0/+RightTrigger
+L3 = SDL-0/LeftStick
+R3 = SDL-0/RightStick
+LUp = SDL-0/-LeftY
+LRight = SDL-0/+LeftX
+LDown = SDL-0/+LeftY
+LLeft = SDL-0/-LeftX
+RUp = SDL-0/-RightY
+RRight = SDL-0/+RightX
+RDown = SDL-0/+RightY
+RLeft = SDL-0/-RightX
+Analog = SDL-0/Guide
+LargeMotor = SDL-0/LargeMotor
+SmallMotor = SDL-0/SmallMotor
+
+
+[AutoUpdater]
+CheckAtStartup = false
+
+
+[GameList]
+RecursivePaths = /home/talexander/persist/games/ps2/roms
diff --git a/nix/steam_deck/configuration/home.nix b/nix/steam_deck/configuration/home.nix
index cbb12f9..ecc0307 100644
--- a/nix/steam_deck/configuration/home.nix
+++ b/nix/steam_deck/configuration/home.nix
@@ -9,6 +9,7 @@
   imports = [
     ./roles/2ship2harkinian
     ./roles/graphics
+    ./roles/pcsx2
     ./roles/shipwright
     ./roles/sm64ex
     ./roles/steam_rom_manager
diff --git a/nix/steam_deck/configuration/hosts/deck/default.nix b/nix/steam_deck/configuration/hosts/deck/default.nix
index fb5c5e5..c99526d 100644
--- a/nix/steam_deck/configuration/hosts/deck/default.nix
+++ b/nix/steam_deck/configuration/hosts/deck/default.nix
@@ -10,6 +10,7 @@
 
   config = {
     me.graphical = true;
+    me.pcsx2.enable = true;
     me.ship2harkinian.enable = true;
     me.shipwright.enable = true;
     me.sm64ex.enable = true;
diff --git a/nix/steam_deck/configuration/roles/pcsx2/default.nix b/nix/steam_deck/configuration/roles/pcsx2/default.nix
new file mode 100644
index 0000000..616bffd
--- /dev/null
+++ b/nix/steam_deck/configuration/roles/pcsx2/default.nix
@@ -0,0 +1,94 @@
+# MANUAL: mkdir -p ~/.persist/.config/PCSX2/memcards ~/.state/.config/PCSX2/cache ~/.state/.config/PCSX2/sstates ~/.state/.config/PCSX2/snaps ~/.state/.config/PCSX2/covers ~/.state/.config/PCSX2/videos
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+let
+  steam_pcsx2 = pkgs.writeScriptBin "steam_pcsx2" ''
+    export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${pkgs.libglvnd}/lib"
+    exec ${pkgs.pcsx2}/bin/pcsx2-qt
+  '';
+in
+{
+  imports = [ ];
+
+  options.me = {
+    pcsx2.enable = lib.mkOption {
+      type = lib.types.bool;
+      default = false;
+      example = true;
+      description = "Whether we want to install pcsx2.";
+    };
+  };
+
+  config = lib.mkIf config.me.pcsx2.enable (
+    lib.mkMerge [
+      (lib.mkIf config.me.graphical {
+        home.packages = with pkgs; [
+          pcsx2
+          steam_pcsx2
+        ];
+
+        home.file.".config/PCSX2/inis/PCSX2.ini" = {
+          source = ./files/PCSX2.ini;
+        };
+
+        home.persistence."/home/deck/.persist" = {
+          directories = [
+            {
+              directory = ".config/PCSX2/memcards";
+              method = "symlink";
+            }
+          ];
+        };
+        home.persistence."/home/deck/.state" = {
+          directories = [
+            {
+              directory = ".config/PCSX2/cache";
+              method = "symlink";
+            }
+            {
+              directory = ".config/PCSX2/sstates";
+              method = "symlink";
+            }
+            {
+              directory = ".config/PCSX2/snaps";
+              method = "symlink";
+            }
+            {
+              directory = ".config/PCSX2/covers";
+              method = "symlink";
+            }
+            {
+              directory = ".config/PCSX2/videos";
+              method = "symlink";
+            }
+          ];
+        };
+
+        nixpkgs.overlays = [
+          (final: prev: {
+            pcsx2 = pkgs.buildEnv {
+              name = prev.pcsx2.name;
+              paths = [
+                (config.lib.nixGL.wrap prev.pcsx2)
+              ];
+              extraOutputsToInstall = [
+                "man"
+                "doc"
+                "info"
+              ];
+              # We have to use 555 instead of the normal 444 here because the .desktop file ends up inside $HOME on steam deck and desktop files must be either not in $HOME or must be executable, otherwise KDE Plasma refuses to execute them.
+              postBuild = ''
+                chmod 0555 $out/share/applications/PCSX2.desktop
+              '';
+            };
+          })
+        ];
+      })
+    ]
+  );
+}
diff --git a/nix/steam_deck/configuration/roles/pcsx2/files/PCSX2.ini b/nix/steam_deck/configuration/roles/pcsx2/files/PCSX2.ini
new file mode 100644
index 0000000..e38238d
--- /dev/null
+++ b/nix/steam_deck/configuration/roles/pcsx2/files/PCSX2.ini
@@ -0,0 +1,104 @@
+[UI]
+SettingsVersion = 1
+InhibitScreensaver = true
+ConfirmShutdown = false
+StartPaused = false
+PauseOnFocusLoss = true
+StartFullscreen = true
+
+
+[Folders]
+Bios = ../../.persist/manual/games/ps2/bios
+Snapshots = snaps
+Savestates = sstates
+MemoryCards = memcards
+Logs = logs
+Cheats = cheats
+Patches = patches
+UserResources = resources
+Cache = cache
+Textures = textures
+InputProfiles = inputprofiles
+Videos = videos
+
+
+[EmuCore/GS]
+VsyncEnable = true
+# Internal resolution aspect corrected
+ScreenshotSize = 1
+# webp
+ScreenshotFormat = 2
+OsdShowFPS = true
+# Capture video at internal resolution
+VideoCaptureAutoResolution = true
+# 2x native resolution
+upscale_multiplier = 2
+CaptureContainer = mkv
+VideoCaptureCodec = av1_vaapi
+AudioCaptureCodec = flac
+
+
+[Filenames]
+BIOS = ps2-0230a-20080220.bin
+
+[MemoryCards]
+Slot1_Enable = true
+Slot1_Filename = Mcd001.ps2
+Slot2_Enable = true
+Slot2_Filename = Mcd002.ps2
+
+
+[InputSources]
+Keyboard = false
+Mouse = false
+SDL = true
+# Enhanced ps4 and ps5 controller support
+SDLControllerEnhancedMode = true
+SDLPS5PlayerLED = true
+
+
+[Pad1]
+Type = DualShock2
+InvertL = 0
+InvertR = 0
+Deadzone = 0
+AxisScale = 1.33
+LargeMotorScale = 1
+SmallMotorScale = 1
+ButtonDeadzone = 0
+PressureModifier = 0.5
+Up = SDL-0/DPadUp
+Right = SDL-0/DPadRight
+Down = SDL-0/DPadDown
+Left = SDL-0/DPadLeft
+Triangle = SDL-0/Y
+Circle = SDL-0/B
+Cross = SDL-0/A
+Square = SDL-0/X
+Select = SDL-0/Back
+Start = SDL-0/Start
+L1 = SDL-0/LeftShoulder
+L2 = SDL-0/+LeftTrigger
+R1 = SDL-0/RightShoulder
+R2 = SDL-0/+RightTrigger
+L3 = SDL-0/LeftStick
+R3 = SDL-0/RightStick
+LUp = SDL-0/-LeftY
+LRight = SDL-0/+LeftX
+LDown = SDL-0/+LeftY
+LLeft = SDL-0/-LeftX
+RUp = SDL-0/-RightY
+RRight = SDL-0/+RightX
+RDown = SDL-0/+RightY
+RLeft = SDL-0/-RightX
+Analog = SDL-0/Guide
+LargeMotor = SDL-0/LargeMotor
+SmallMotor = SDL-0/SmallMotor
+
+
+[AutoUpdater]
+CheckAtStartup = false
+
+
+[GameList]
+RecursivePaths = /home/deck/.persist/manual/games/ps2/roms