diff --git a/modules/nixos/x11/default.nix b/modules/nixos/x11/default.nix
new file mode 100644
index 0000000..289027b
--- /dev/null
+++ b/modules/nixos/x11/default.nix
@@ -0,0 +1,56 @@
+{
+  # Snowfall Lib provides a customized `lib` instance with access to your flake's library
+  # as well as the libraries available from your flake's inputs.
+  lib,
+  # An instance of `pkgs` with your overlays and packages applied is also available.
+  pkgs,
+  # You also have access to your flake's inputs.
+  inputs,
+
+  # Additional metadata is provided by Snowfall Lib.
+  namespace, # The namespace used for your flake, defaulting to "internal" if not set.
+  system, # The system architecture for this host (eg. `x86_64-linux`).
+  target, # The Snowfall Lib target for this system (eg. `x86_64-iso`).
+  format, # A normalized name for the system target (eg. `iso`).
+  virtual, # A boolean to determine whether this system is a virtual target using nixos-generators.
+  systems, # An attribute map of your defined hosts.
+
+  # All other arguments come from the module system.
+  config,
+  ...
+}:
+
+let
+  cfg = config.modules.x11;
+in
+{
+  options.modules.x11 = {
+    enable = lib.mkOption { default = false; };
+  };
+
+  config = lib.mkIf cfg.enable {
+    services.xserver.windowManager.i3.enable = true;
+    services.xserver.windowManager.i3.package = pkgs.i3-gaps;
+
+    services.xserver.wacom.enable = true;
+
+    # TODO: move into i3 module
+    programs.xss-lock = {
+      # responds to "loginctl lock-session" via dbus
+      enable = true;
+      lockerCommand = "${pkgs.i3lock}/bin/i3lock --ignore-empty-password --color=000000";
+    };
+    # services.xserver.xautolock = { # TODO: does not work
+    #   enable = true;
+    #   time = 1;
+    # };
+
+    # Configure keymap in X11
+    services.xserver = {
+      enable = true;
+      displayManager.gdm.enable = true;
+      xkb.layout = "de";
+      xkb.variant = "";
+    };
+  };
+}
diff --git a/systems/x86_64-linux/aspi/default.nix b/systems/x86_64-linux/aspi/default.nix
index 19a7f54..d93bb59 100644
--- a/systems/x86_64-linux/aspi/default.nix
+++ b/systems/x86_64-linux/aspi/default.nix
@@ -75,6 +75,7 @@
     pcmanfm.enable = true;
     # wayland.enable = true;
     # hyprland.enable = true;
+    x11.enable = true;
   };
 
   nix.settings.auto-optimise-store = true;
@@ -105,51 +106,20 @@
     options = "--delete-older-than 30d";
   };
 
-  # Enable the XFCE Desktop Environment.
   security.pam.services.gdm.enableGnomeKeyring = true;
 
   # services.displayManager.sddm.wayland.enable = true;
-  # services.xserver.desktopManager = {
-  #   xterm.enable = false;
-  #   xfce = {
-  #     enable = true;
-  #     noDesktop = true;
-  #     enableXfwm = false;
-  #   };
-  # };
-  # services.xserver.displayManager.gdm.enable = true;
-  services.xserver.windowManager.i3.enable = true;
-  services.xserver.windowManager.i3.package = pkgs.i3-gaps;
-
-  services.xserver.wacom.enable = true;
-
   services.blueman.enable = true;
   services.upower.enable = true;
 
-  # TODO: move into i3 module
-  programs.xss-lock = {
-    # responds to "loginctl lock-session" via dbus
-    enable = true;
-    lockerCommand = "${pkgs.i3lock}/bin/i3lock --ignore-empty-password --color=000000";
-  };
-  # services.xserver.xautolock = { # TODO: does not work
-  #   enable = true;
-  #   time = 1;
-  # };
+  programs.steam.enable = true;
+
   programs.dconf.enable = true;
   services.logind.lidSwitch = "lock";
   services.logind.lidSwitchDocked = "lock";
 
   programs.kdeconnect.enable = true;
 
-  # Configure keymap in X11
-  services.xserver = {
-    enable = true;
-    displayManager.gdm.enable = true;
-    xkb.layout = "de";
-    xkb.variant = "";
-  };
-
   # Enable touchpad support (enabled default in most desktopManager).
   services.libinput.enable = true;