diff --git a/roles/core/userland-software/init.sls b/roles/core/userland-software/init.sls
index b086322..5dc1def 100644
--- a/roles/core/userland-software/init.sls
+++ b/roles/core/userland-software/init.sls
@@ -1,173 +1,187 @@
 #   -------------------------------------------------------------
 #   Salt — Provision software needed by other core roles
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 #   Project:        Nasqueron
 #   Created:        2016-04-09
 #   License:        Trivial work, not eligible to copyright
 #   -------------------------------------------------------------
 
 {% from "map.jinja" import dirs, packages with context %}
 
 #   -------------------------------------------------------------
 #   Software sources
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 {% if grains['os'] == 'FreeBSD' %}
 /usr/local/etc/pkg/repos/Nasqueron.conf:
   file.managed:
     - source: salt://roles/core/userland-software/files/Nasqueron.conf
     - makedirs: True
 {% endif %}
 
 {% if grains['os_family'] == 'RedHat' and grains['os'] != 'Fedora' %}
 epel-release:
   pkg.installed
 
 /etc/yum.repos.d/nasqueron.repo:
   file.managed:
     - source: salt://roles/core/userland-software/files/nasqueron.repo
 {% endif %}
 
 {% if grains['os'] == 'Debian' %}
 /etc/apt/sources.list:
   file.managed:
     - source: salt://roles/core/userland-software/files/sources.list
     - template: jinja
     - context:
         debian_version: {{ grains['oscodename'] }}
 
 apt_update_debian_sources:
   cmd.run:
     - name: apt update
     - onchanges:
       - file: /etc/apt/sources.list
 {% endif %}
 
 {% if grains['kernel'] == 'Linux' %}
 snapd:
   pkg.installed
 {% endif %}
 
 {% if grains['os_family'] == 'RedHat' or grains['os'] == 'Arch' %}
 snap_enable:
   cmd.run:
     - name: |
         systemctl enable --now snapd.socket
         systemctl restart snapd
         sleep 30
         touch /var/lib/snapd/.enabled
     - creates: /var/lib/snapd/.enabled
 
 /snap:
   file.symlink:
     - target: /var/lib/snapd/snap
 {% endif %}
 
 {% if grains['os'] == 'FreeBSD' %}
 /etc/periodic/daily/720.portsnap:
   file.managed:
     - source: salt://roles/core/userland-software/files/720.portsnap
 {% endif %}
 
 #   -------------------------------------------------------------
 #   Shells
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 shells:
   pkg.installed:
     - pkgs:
       - bash
       - zsh
       {% if grains['kernel'] == 'Linux' %}
       - tcsh
       {% endif %}
 
       # Shell utilities
       {% if grains['os'] == 'FreeBSD' %}
       - starship
       {% endif %}
 
 {% if grains['kernel'] == 'Linux' and grains['osarch'] == 'x86_64' %}
 install_starship:
   cmd.run:
     - name: snap install starship
     - creates: /var/lib/snapd/snap/bin/starship
 {% endif %}
 
 /usr/local/share/zsh/site-functions/_pm:
   file.managed:
     # At commit 683d331 - 2017-11-05
     - source: https://raw.githubusercontent.com/Angelmmiguel/pm/master/zsh/_pm
     - source_hash: deea33968be713cdbd8385d3a72df2dd09c444e42499531893133f009f0ce0ea
     - makedirs: True
 
 #   -------------------------------------------------------------
 #   tmux
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 tmux:
   pkg.installed
 
 {{ dirs.etc }}/tmux.conf:
   file.managed:
     - source: salt://roles/core/userland-software/files/tmux.conf
 
 {{ dirs.bin }}/tmux-reattach:
   file.managed:
     - source: salt://roles/core/userland-software/files/tmux-reattach.sh
     - mode: 755
 
 #   -------------------------------------------------------------
 #   Python
 #
 #   The "python3" package takes care on FreeBSD to create
 #   the symbolic link to the relevant Python 3.x version.
 #
 #   If Python is implicitly installed instead, it will be
 #   a package like python3.9 without the symlink.
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 python3:
   pkg.installed
 
 #   -------------------------------------------------------------
 #   System administration utilities
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 sysadmin_utilities:
   pkg.installed:
     - pkgs:
       - bat
       - nano
       - ripgrep
       - tree
       - wget
       {% if grains['os'] == 'FreeBSD' %}
       - gnu-watch
       {% else %}
       - {{ packages.netcat }}
       - net-tools
       {% endif %}
       {% if grains['os_family'] == 'RedHat' %}
       - psmisc
       - tar
       {% endif %}
 
 {% if grains['os'] == 'Debian' %}
 /usr/bin/bat:
   file.symlink:
     - target: /usr/bin/batcat
 {% endif %}
 
 {% if grains['os'] == 'FreeBSD' %}
 /usr/local/bin/gwatch:
   file.symlink:
     - target: /usr/local/bin/gnu-watch
 {% endif %}
 
 {% if grains['os_family'] == 'RedHat' %}
 {{ dirs.bin }}/new-partition:
   file.managed:
     - source: salt://roles/core/userland-software/files/new-partition.sh
     - mode: 755
 {% endif %}
+
+#   -------------------------------------------------------------
+#   Nano configuration
+#   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+nano_sls_support:
+  file.replace:
+    - name: {{ dirs.share }}/nano/yaml.nanorc
+    - pattern: {{ 'syntax yaml "\.ya?ml$"' | regex_escape }}
+    - repl: syntax yaml "\.(ya?ml|sls)$"
+
+{{ dirs.etc }}/nanorc:
+  nano.config_autogenerated:
+    - nanorc_dir: {{ dirs.share }}/nano
diff --git a/roles/shellserver/userland-software/base.sls b/roles/shellserver/userland-software/base.sls
index e9edf72..09ae395 100644
--- a/roles/shellserver/userland-software/base.sls
+++ b/roles/shellserver/userland-software/base.sls
@@ -1,301 +1,286 @@
 #   -------------------------------------------------------------
 #   Salt — Provision base software
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 #   Project:        Nasqueron
 #   Created:        2016-04-09
 #   License:        Trivial work, not eligible to copyright
 #   -------------------------------------------------------------
 
 {% from "map.jinja" import dirs, packages, packages_prefixes with context %}
 
 /opt:
   file.directory
 
 #   -------------------------------------------------------------
 #   Editors
 #
 #   Disclaimer: We don't caution the views of Richard Stallman
 #   or the Church of Emacs positions.
 #   See http://geekfeminism.wikia.com/wiki/EMACS_virgins_joke
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 editors:
   pkg.installed:
     - pkgs:
       - joe
-      - nano
       - vim
       - emacs-nox
 
 #   -------------------------------------------------------------
 #   General UNIX utilities
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 utilities:
   pkg.installed:
     - pkgs:
       - cmatrix
       - figlet
       - glow
       - {{ packages.gpg }}
       - grc
       - moreutils
       - mosh
       - nmap
       - toilet
       - unrar
       - whois
       - woof
       - zip
       {% if grains['os_family'] == 'Debian' %}
       - bsdmainutils
       - dnsutils
       - sockstat
       - sysvbanner
       - toilet-fonts
       {% endif %}
       {% if grains['os'] == 'FreeBSD' %}
       - bind-tools
       - coreutils
       - figlet-fonts
       - gsed
       - sudo
       {% endif %}
 
 utilities_www:
   pkg.installed:
     - pkgs:
       - links
       - lynx
       - w3m
 
 #   -------------------------------------------------------------
 #   More exotic shells
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 userland_software_shells:
   pkg.installed:
     - pkgs:
       - fish
 
 #   -------------------------------------------------------------
 #   Development
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 dev:
   pkg.installed:
     - pkgs:
       - {{ packages.ag }}
       - autoconf
       - automake
       - {{ packages.bats }}
       - cmake
       - colordiff
       - {{ packages.cppunit }}
       - git
       - git-lfs
       - jq
       - valgrind
       {% if grains['os'] == 'FreeBSD' %}
       - hub
       {% else %}
       - arcanist
       - clang
       - llvm
       - strace
       {% endif %}
 
 {% if grains['os_family'] == 'Debian' %}
 dev_popular_libs:
   pkg.installed:
     - pkgs:
       - libssl-dev
 {% endif %}
 
 #   -------------------------------------------------------------
 #   Languages
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 languages_removed:
   pkg.removed:
     - pkgs:
       {% if grains['os_family'] == 'Debian' %}
       - php7.0
       - php7.1
       - php7.2
       - php7.3
       - php7.4
       - php8.0
       - php8.1
       {% elif grains['os'] == 'FreeBSD' %}
       - php70
       - php71
       - php72
       - php73
       - php74
       - php80
       - php81
       {% endif %}
 
 languages:
   pkg.installed:
     - pkgs:
       - python3
       - {{ packages.tcl }}
       {% if grains['os_family'] == 'Debian' %}
       - php8.2
       {% elif grains['os'] == 'FreeBSD' %}
       - php82
       {% endif %}
 
 #   -------------------------------------------------------------
 #   De facto standard libraries for languages
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 languages_libs:
   pkg.installed:
     - pkgs:
       # PHP extensions
       - {{ packages_prefixes.php }}bcmath
       - {{ packages_prefixes.php }}curl
       - {{ packages_prefixes.php }}gd
       - {{ packages_prefixes.php }}intl
       - {{ packages_prefixes.php }}mbstring
       - {{ packages_prefixes.php }}soap
       - {{ packages_prefixes.php }}xml
       - {{ packages_prefixes.php }}xsl
 
       {% if grains['os_family'] == 'Debian' %}
       - {{ packages_prefixes.php }}json
 
       # On Debian, these PDO extensions doesn't follow regular names
       # but are installed if you require the legacy extension name.
       - {{ packages_prefixes.php }}mysql
       - {{ packages_prefixes.php }}pgsql
       - {{ packages_prefixes.php }}sqlite3
       {% else %}
       # On Debian, these extensions are now shipped by default:
       - {{ packages_prefixes.php }}calendar
       - {{ packages_prefixes.php }}ctype
       - {{ packages_prefixes.php }}dom
       - {{ packages_prefixes.php }}fileinfo
       - {{ packages_prefixes.php }}filter
       - {{ packages_prefixes.php }}iconv
       - {{ packages_prefixes.php }}mysqli
       - {{ packages_prefixes.php }}pcntl
       - {{ packages_prefixes.php }}pdo
       - {{ packages_prefixes.php }}phar
       - {{ packages_prefixes.php }}session
       - {{ packages_prefixes.php }}simplexml
       - {{ packages_prefixes.php }}sockets
       - {{ packages_prefixes.php }}tokenizer
       - {{ packages_prefixes.php }}xmlreader
       - {{ packages_prefixes.php }}xmlwriter
       - {{ packages_prefixes.php }}zlib
       # On Debian, these PDO extensions doesn't follow regular names:
       - {{ packages_prefixes.php }}pdo_mysql
       - {{ packages_prefixes.php }}pdo_pgsql
       - {{ packages_prefixes.php }}pdo_sqlite
       {% endif %}
 
       # PECL extensions
       - {{ packages_prefixes.pecl }}yaml
 
       # PHP utilities
       - {{ packages.composer }}
 
       {% if grains['os'] != 'FreeBSD' %}
       # On FreeBSD, PEAR is still a PHP 5.6 package (last tested 2018-02-17).
       # Same for Composer (last tested 2018-02-28)
       - {{ packages.pear }}
       - {{ packages.phpcs }}
       {% endif %}
 
       # Standard Python modules
       {% if grains['os'] == 'FreeBSD' %}
       - {{ packages_prefixes.python3 }}gdbm
       - {{ packages_prefixes.python3 }}sqlite3
       {% endif %}
 
       # TCL
       - tcllib
       - {{ packages.tcltls }}
 
 languages_libs_removed_files:
   file.absent:
     - names:
       - /usr/local/etc/php/ext-20-openssl.ini
 
 #   -------------------------------------------------------------
 #   Workaround : install phpcs on FreeBSD
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 {% if grains['os'] == 'FreeBSD' %}
 /opt/phpcs:
   file.directory
 
 {% for command in ['phpcs', 'phpcbf'] %}
 /opt/phpcs/{{ command }}:
   file.managed:
     - source: https://squizlabs.github.io/PHP_CodeSniffer/{{ command }}.phar
     - skip_verify: True
     - mode: 755
 
 {{ dirs.bin }}/{{ command }}:
   file.symlink:
     - target: /opt/phpcs/{{ command }}
     - require:
       - file: /opt/phpcs/{{ command }}
 {% endfor %}
 {% endif %}
 
 #   -------------------------------------------------------------
 #   Spelling and language utilities
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 spelling:
   pkg.installed:
     - pkgs:
         - {{ packages['aspell-en'] }}
         - {{ packages['aspell-fr'] }}
         - {{ packages.verbiste }}
 
 #   -------------------------------------------------------------
 #   Media utilities
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 media:
   pkg.installed:
     - pkgs:
       - {{ packages.exiftool }}
       - gifsicle
       - id3v2
       - {{ packages.imagemagick }}
       - mozjpeg
       - optipng
       - sox
 
 #   -------------------------------------------------------------
 #   Office utilities (bureautique)
 #   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 office_software:
   pkg.installed:
     - pkgs:
       - gcal
       - pdftk
       - qpdf
-
-#   -------------------------------------------------------------
-#   Nano configuration
-#   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-nano_sls_support:
-  file.replace:
-    - name: {{ dirs.share }}/nano/yaml.nanorc
-    - pattern: {{ 'syntax yaml "\.ya?ml$"' | regex_escape }}
-    - repl: syntax yaml "\.(ya?ml|sls)$"
-
-{{ dirs.etc }}/nanorc:
-  nano.config_autogenerated:
-    - nanorc_dir: {{ dirs.share }}/nano