{
  config,
  lib,
  ...
}: let
  cfg = config.zfs-root.fileSystems;
  inherit (lib) types mkDefault mkOption mkMerge mapAttrsToList;
in {
  options.zfs-root.fileSystems = {
    datasets = mkOption {
      description = "Set mountpoint for datasets";
      type = types.attrsOf types.str;
      default = {};
    };
    bindmounts = mkOption {
      description = "Set mountpoint for bindmounts";
      type = types.attrsOf types.str;
      default = {};
    };
    efiSystemPartitions = mkOption {
      description = "Set mountpoint for efi system partitions";
      type = types.listOf types.str;
      default = [];
    };
    swapPartitions = mkOption {
      description = "Set swap partitions";
      type = types.listOf types.str;
      default = [];
    };
  };
  config.fileSystems = mkMerge (mapAttrsToList (dataset: mountpoint: {
      "${mountpoint}" = {
        device = "${dataset}";
        fsType = "zfs";
        options = ["X-mount.mkdir" "noatime"];
        neededForBoot = true;
      };
    })
    cfg.datasets
    ++ mapAttrsToList (bindsrc: mountpoint: {
      "${mountpoint}" = {
        device = "${bindsrc}";
        fsType = "none";
        options = ["bind" "X-mount.mkdir" "noatime"];
      };
    })
    cfg.bindmounts
    ++ map (esp: {
      "/boot/efis/${esp}" = {
        device = "${config.zfs-root.boot.devNodes}${esp}";
        fsType = "vfat";
        options = [
          "x-systemd.idle-timeout=1min"
          "x-systemd.automount"
          "noauto"
          "nofail"
          "noatime"
          "X-mount.mkdir"
        ];
      };
    })
    cfg.efiSystemPartitions);
  config.swapDevices = mkDefault (map (swap: {
      device = "${config.zfs-root.boot.devNodes}${swap}";
      discardPolicy = mkDefault "both";
      randomEncryption = {
        enable = true;
        allowDiscards = mkDefault true;
      };
    })
    cfg.swapPartitions);
}