-sys_root_stretch/
-sys_root_buster/
-rpi_root_stretch/
-rpi_root_buster/
+sys_root_stretch_*/
+sys_root_buster_*/
 cfg_root/
 img_mount/
 iso_root/
-part_boot.img
-part_root.img
-rpi_boot.img
-rpi_root.img
 config.mk
+*.img
+*.iso
+*.squash
+*.squashfs
 .*.swp
 .*.swo
+*~
 
 BOOT_MB := 62
 ROOT_MB := 959
 
+fstype := ext4
+
 config.mk:
        cp "config.example" "$@"
 
 endef
 endif
 
-fstype := ext4
-
 ifdef disk
   VOLUME := ${disk}
   PBOOT := ${disk}1
   VOLUME := ${image}
   PBOOT := part_boot.img
   PROOT := part_root.img
-  SYSROOT := sys_root_${release}/
+  SYSROOT := sys_root_${release}_${ARCH}/
   CFGROOT := img_mount/
   
   _target: _mbr _umount _config _install
   _umount: _img_mount _config _bootloader_pc
   _mbr: _partcopy _bootloader_pc
 
+else ifdef subvol
+  SYSROOT := sys_root_${release}_${ARCH}/
+  CFGROOT := cfg_root/
+
+  _target: _install _config ${subvol}
+  
+  _bootstrap:
+  _install: _bootstrap
+  _copy: _install
+  _config: _copy
+
+  ${subvol}: _config
+       btrfs sub snap "${CFGROOT}" "$@"
+
 else ifdef squash
   SQUASH := ${squash}
-  SYSROOT := sys_root_${release}/
+  SYSROOT := sys_root_${release}_${ARCH}/
   CFGROOT := cfg_root/
 
   PACKAGES += squashfs-tools nbd-client
 else ifdef iso
   ISO := ${iso}
   ISOROOT := iso_root/
-  SYSROOT := sys_root_${release}/
+  SYSROOT := sys_root_${release}_${ARCH}/
   CFGROOT := cfg_root/
   BOOT_MB := 2
   PBOOT := ${ISOROOT}/efi.img
   _copy: _install
   _config: _copy _squash_modules
   _isosquash: _config
-#  ${PBOOT}: ${ISOROOT}
-#  _format_boot: ${PBOOT}
-#  _efi_mount: ${PBOOT} _format_boot
-#  _efi_umount: _config
   _bootloader_iso: _config
   _iso_image: _bootloader_iso _isosquash # _efi_umount
 
 else ifdef raspi
+  ARCH := armhf
+
   VOLUME := ${raspi}
   PBOOT := rpi_boot.img
   PROOT := rpi_root.img
-  SYSROOT := rpi_root_${release}/
+  SYSROOT := sys_root_${release}_${ARCH}/
   CFGROOT := img_mount/
   
-  ARCH := armhf
   KEYRING := keys/raspbian-archive-keyring.gpg
   BOOTSTRAP := http://raspbian.raspberrypi.org/raspbian
 
   deb  http://archive.raspberrypi.org/debian ${release} main
   endef
 
-  PACKAGES += firmware-brcm80211 libraspberrypi-bin libraspberrypi0 pi-bluetooth raspberrypi-bootloader raspberrypi-kernel initramfs-tools nilfs-tools
-  fstype := nilfs2
+  PACKAGES += firmware-brcm80211 libraspberrypi-bin libraspberrypi0 pi-bluetooth raspberrypi-bootloader raspberrypi-kernel initramfs-tools
 
   _target: _umount _config
   
   _copy: _install _img_mount
   _config: _copy _img_mount
   _bootloader_raspi: _img_mount
-  _umount: _img_mount _config _bootloader_raspi
+  _umount: _copy _config _bootloader_raspi
 
 else
   _target:
   include $(addsuffix .mk, $(addprefix modules/, $(subst ${comma_},${space_},${modules})))
 endif
 
-ifeq "${ARCH}" "amd64"
+ifeq "$(findstring linux-image, ${PACKAGES})" "linux-image"
+else ifeq "${ARCH}" "amd64"
   PACKAGES += linux-image-amd64
 else ifeq "${ARCH}" "i386"
   PACKAGES += linux-image-686
 
 export SOURCES SYSROOT CFGROOT VOLUME PBOOT PROOT SQUASH ARCH KEYRING BOOTSTRAP ISOROOT ISO
 
-sys_root_${release}/:
+sys_root_${release}_${ARCH}/:
        btrfs subvol create "$@" || mkdir "$@"
        chmod 755 "$@"
 
-rpi_root_${release}/:
-       btrfs subvol create "$@" || mkdir "$@"
-       chmod 755 "$@"
-
-cfg_root/: sys_root_${release}/ _install
+cfg_root/: sys_root_${release}_${ARCH}/ _install
        -btrfs sub del "$@" || rm -r "$@"
        btrfs sub snap "$<" "$@" || mkdir "$@"
        chmod 755 "$@"
 ${SYSROOT}/etc/apt/trusted.gpg.d/: ${SYSROOT} _bootstrap
        mkdir -p -m 755 "$@"
        cp keys/*.gpg "$@"
+       chmod 644 "$@"/*.gpg
 
 _install: ${SYSROOT} _aptkeys _norecommends
        printf '%s\n' "$${SOURCES}" |sort -u >"$${SYSROOT}/etc/apt/sources.list"
        chroot "$${SYSROOT}" rm /usr/sbin/udevadm
 
 _copy: ${SYSROOT} ${CFGROOT}
+       sync
        cp -au "$${SYSROOT}/." "$${CFGROOT}/"
 
 _config: ${CFGROOT}
 
 _sparse: ${PBOOT} ${PROOT}
 
-ifdef raspi
-_format_root: ${PROOT}
-       -umount "$${CFGROOT}/boot" "$${CFGROOT}" "${PROOT}"
-       mkfs.nilfs2 -f -L FSROOT "$${PROOT}"
+ifeq "${fstype}" "ext4"
+  fsflag:=-F
 else
+  fsflag:=-f
+endif
+
 _format_root: ${PROOT}
        -umount "$${CFGROOT}/boot" "$${CFGROOT}" "${PROOT}"
-       mkfs.ext4 -F -L FSROOT "$${PROOT}"
-endif
+       mkfs.${fstype} ${fsflag} -L FSROOT "$${PROOT}"
 
 _format_boot: ${PBOOT}
        -umount "$${CFGROOT}/boot" "${PBOOT}"
 _bootloader_iso: ${CFGROOT} ${ISOROOT}
        mkdir -p "$${ISOROOT}/boot/grub/"
        cp -L "$${CFGROOT}/vmlinuz" "$${CFGROOT}/initrd.img" "$${ISOROOT}"
+       printf '%s\n' "insmod all_video" "set gfxmode=auto" "load_video" "insmod gfxterm" \
+               >"$${ISOROOT}/boot/grub/grub.cfg"
        printf '%s\n' "set timeout=10" "default=buster" \
                "menuentry 'Debian Buster' --id 'buster' {" \
                "linux '/vmlinuz' boot=live" "initrd '/initrd.img'" "}" \
-               >"$${ISOROOT}/boot/grub/grub.cfg"
+               >>"$${ISOROOT}/boot/grub/grub.cfg"
        -[ -f "$${ISOROOT}/install/initrd.gz" -a -f "$${ISOROOT}/install/linux" ] && \
        printf '%s\n' "menuentry 'Install Debian' --id 'install' {" \
                "linux '/install/linux'" "initrd '/install/initrd.gz'" "}" \
        mount -t vfat -o loop "$${PBOOT}" "efi/"
 
 _efi_umount: _efi_mount
+       sync
        umount efi/ && rmdir efi/
 
 .PHONY: _syslinux_mbr _grub_mbr
        || mount -o loop,offset=2M,sizelimit=${BOOT_MB}M \
                 -t vfat "$${VOLUME}" "$${CFGROOT}/boot"
 
-_umount_boot: ${CFGROOT}
+_umount_boot: ${CFGROOT} _config
+       sync
        -umount "$${CFGROOT}/boot"
 
-_umount_root: _umount_boot
+_umount_root: _umount_boot _config
+       sync
        umount "$${CFGROOT}" && rmdir "$${CFGROOT}"
 
 _umount: _umount_boot _umount_root
        -rmdir hdd_mount
        if [ -d "cfg_root/" ]; then btrfs sub del "cfg_root/" || rm -r "cfg_root/"; fi
        if [ -d "iso_root/" ]; then btrfs sub del "iso_root/" || rm -r "iso_root/"; fi
-       if [ -d "sys_root_${release}/" ]; then btrfs sub del "sys_root_${release}/" || rm -r "sys_root_${release}/"; fi
-       if [ -d "rpi_root_${release}/" ]; then btrfs sub del "rpi_root_${release}/" || rm -r "rpi_root_${release}/"; fi
+       if [ -d "sys_root_${release}_${ARCH}/" ]; then btrfs sub del "sys_root_${release}_${ARCH}/" || rm -r "sys_root_${release}_${ARCH}/"; fi
        -rm part_boot.img
        -rm part_root.img
        -rm rpi_boot.img
 
   approxhost := localhost
 endif
 
+approxrepos := main
+approxrepos += $(findstring contrib, ${SOURCES})
+approxrepos += $(findstring non-free, ${SOURCES})
+
 ifdef approx
   BOOTSTRAP := ${approx}
   define SOURCES =
-  deb ${approx} ${release} main
+  deb ${approx} ${release} ${approxrepos}
   endef
 else ifdef raspi
   BOOTSTRAP := http://localhost/raspbian
 else
   BOOTSTRAP := http://localhost/debian
   define SOURCES :=
-  deb http://${approxhost}/debian ${release} main
+  deb http://${approxhost}/debian ${release} ${approxrepos}
   endef
 endif
 
 
 
 keyboard-configuration keyboard-configuration/model    select  Generic 105-key (Intl) PC
 keyboard-configuration keyboard-configuration/variant  select  English (US) - English (Macintosh)
+
+console-setup  console-setup/charmap47 select  UTF-8
+console-setup  console-setup/codeset47 select  # Latin1 and Latin5 - western Europe and Turkic languages
 endef
 
+ifndef rpivmem
+  rpivmem := 128
+endif
+
 define RPICONFIG :=
 ${RPICONFIG}
 
-dtoverlay=vc4-fkms-v3d,cma-256
+dtoverlay=vc4-fkms-v3d,cma-${rpivmem}
 endef
 
 .PHONY: _debconf_selections _raspberry_config _keyboard
        printf '%s\n' "$${RPICONFIG}" >>"$${CFGROOT}/boot/config.txt"
 
 _raspberry_initrd: ${CFGROOT}
-       printf 'nilfs2\n' >>"$${CFGROOT}/etc/initramfs-tools/modules"
-       k="$$(echo "$${CFGROOT}"/lib/modules/*-v7+)"; \
+       printf '${fstype}\n' >>"$${CFGROOT}/etc/initramfs-tools/modules"
+       k="$$(printf '%s\n' "$${CFGROOT}"/lib/modules/* |sed 's;^.*/;;; /-/d')"; \
+       [ "${kernel}" ] && k="${kernel}"; \
        chroot $${CFGROOT} update-initramfs -c -k "$${k##*/}"; \
        printf 'initramfs initrd.img-%s\n' "$${k##*/}" >>"$${CFGROOT}/boot/config.txt"
 
        printf '%s\n' "$${hostname}" >"$${CFGROOT}/etc/hostname"
        sed -Ei "s;^127\.0\.0\.1.*$$;&  $${hostname};" "$${CFGROOT}/etc/hosts"
 
+.PHONY: _systemd_timeout
+_config: _systemd_timeout
+_systemd_timeout: ${CFGROOT}
+       mkdir -p "$${CFGROOT}/etc/systemd"
+       printf 'DefaultTimeout%sSec=%s\n' Start 10s Stop 10s >>"$${CFGROOT}/etc/systemd/system.conf"
+
 ifdef wifi
   _config: ${CFGROOT}/etc/network/interfaces.d/wifi
   ifdef wifipass
     export wifi
     ${CFGROOT}/etc/network/interfaces.d/wifi: ${CFGROOT}
        printf 'auto wlan0\nallow-hotplug wlan0\n\niface wlan0 inet dhcp\n' >$@
-       printf '  wireless-essid %s\n' "$$wifi" >>$@
+       printf '  wireless-essid "%s"\n' "$$wifi" >>$@
   endif
 endif
 
--- /dev/null
+PACKAGES += xserver-xorg-input-evdev xinput xinput-calibrator
+
+define RPICONFIG +=
+
+### Waveshare 4 Inch Display ###
+hdmi_force_hotplug=1
+dtparam=i2c_arm=on
+dtparam=spi=on
+enable_uart=1
+dtoverlay=waveshare35a
+# dtoverlay=ads7846,cs=1,penirq=25,penirq_pull=2,speed=50000,keep_vref_on=0,swapxy=0,pmax=255,xohms=150,xmin=200,xmax=3900,ymin=200,ymax=3900
+hdmi_group=2
+hdmi_mode=1
+hdmi_mode=87
+hdmi_cvt 430 320 60 6 0 0 0
+hdmi_drive=2
+display_rotate=0
+endef
+
+export display_wsLCD4_cfg display_wsLCD4_rotation
+
+define display_wsLCD4_cfg :=
+Section "InputClass"
+       Identifier      "calibration"
+       MatchProduct    "ADS7846 Touchscreen"
+       Option  "Calibration"   "3950 172 3871 194"
+       Option  "SwapAxes"      "1"
+       Option  "EmulateThirdButton"    "1"
+       Option  "EmulateThirdButtonTimeout"     "1000"
+       Option  "EmulateThirdButtonMoveThreshold"       "300"
+
+       # Identifier "evdev touchscreen catchall"
+       # MatchIsTouchscreen "on"
+       # Option  "Calibration"   "200 3950 250 4000"
+       # MatchDevicePath "/dev/input/event*"
+       # Driver "evdev"
+EndSection
+endef
+
+define display_wsLCD4_rotation :=
+# Keep touch matrix rotated in accordance with screen rotation
+while sleep 3; do
+  oldrotate="$${rotate}"
+  rotate="$$(xrandr |grep primary)"
+  rotate="$${rotate#*+0+0 }"
+  rotate="$${rotate% (*}"
+
+  [ "$${oldrotate}" = "$${rotate}" ] || case $$rotate in
+    left)     xinput set-prop 'ADS7846 Touchscreen' 'Coordinate Transformation Matrix' 0 -1 1  1 0 0  0 0 1;;
+    right)    xinput set-prop 'ADS7846 Touchscreen' 'Coordinate Transformation Matrix' 0 1 0  -1 0 1  0 0 1;;
+    inverted) xinput set-prop 'ADS7846 Touchscreen' 'Coordinate Transformation Matrix' -1 0 1  0 -1 1  0 0 1;;
+    *)        xinput set-prop 'ADS7846 Touchscreen' 'Coordinate Transformation Matrix' 1 0 0  0 1 0  0 0 1;;
+  esac
+done &
+endef
+
+.PHONY: _display_wsLCD4
+_config: _display_wsLCD5 ${CFGROOT}/boot/waveshare35a.dtbo
+_display_wsLCD4: ${CFGROOT} _copy _mount
+       # Rough touch calibration
+       mkdir -p "$${CFGROOT}/usr/share/X11/xorg.conf.d/"
+       printf '%s\n' "$${display_wsLCD4_cfg}" >"$${CFGROOT}/usr/share/X11/xorg.conf.d/45-evdev.conf"
+       # Resolution / Rotation stuff
+       mkdir -p "$${CFGROOT}/etc/X11/Xsession.d/"
+       printf 'xrandr --size 480x320\n' >"$${CFGROOT}/etc/X11/Xsession.d/10display_resolution"
+       printf '%s\n' "$$display_wsLCD4_rotation" >"$${CFGROOT}/etc/X11/Xsession.d/20touch_rotation"
+       # Correct DPI scaling, although application support is mediocre
+       mkdir -p "$${CFGROOT}/etc/X11/Xresources/"
+       printf 'Xft.dpi: 144\n' >"$${CFGROOT}/etc/X11/Xresources/dpi_resolution"
+       # Workaround for applications that do not handle DPI scaling correctly
+       -sed -i 's;^Exec=;Exec=env GDK_DPI_SCALE=.5 ;' \
+         $${CFGROOT}/usr/share/applications/chromium*.desktop \
+         $${CFGROOT}/usr/share/applications/firefox*.desktop \
+         $${CFGROOT}/usr/share/applications/exo-web-browser.desktop
+
+${CFGROOT}/boot/waveshare35a.dtbo: modules/waveshare35a-overlay.dtb
+       cp "$<" "$@"
 
 ${CFGROOT}/opt/pam_script/pam_script_passwd: ${CFGROOT} .FORCE
        mkdir -p "$(dir $@)"
        printf '%s' "$${smb_nis_pamscript}" >"$@"
+       chmod a+x "$@"
 
 ${CFGROOT}/etc/security/pam_mount.conf.xml: ${CFGROOT} .FORCE
        mkdir -p "$(dir $@)"
 
-PACKAGES += xfce4 xauth x11-xserver-utils x2x xvkbd blueman xfce4-terminal xfce4-clipman-plugin xfce4-whiskermenu-plugin thunar gvfs gvfs-backends gvfs-fuse xscreensaver policykit-1
+PACKAGES += blueman gvfs gvfs-backends gvfs-fuse policykit-1 thunar x11-xserver-utils x2x xauth xfce4 xfce4-clipman-plugin xfce4-terminal xfce4-whiskermenu-plugin xscreensaver xvkbd
+
 
 .PHONY: _xfce
 _config: _xfce
 
-[settings]
+[Settings]
 gtk-print-preview-command = okular %f
 
--- /dev/null
+[Desktop Entry]
+Name=Virtual Keyboard
+Exec=onboard -l Small -t ModelM
 
-favorites=libreoffice-startcenter.desktop,firefox-esr.desktop,clementine.desktop,marble.desktop,audacity.desktop,org.kde.kdenlive.desktop,blender.desktop,inkscape.desktop,org.kde.krita.desktop,xfce4-terminal.desktop
+favorites=libreoffice-startcenter.desktop,firefox-esr.desktop,clementine.desktop,org.kde.marble.desktop,org.kde.marble.desktop,audacity.desktop,org.kde.kdenlive.desktop,blender.desktop,inkscape.desktop,org.kde.krita.desktop,xfce4-terminal.desktop