OSDN Git Service

Fix: issue when entering mount menu
[pacbang-linux/installer-arch.git] / archlabs-installer
index ca4f415..bdc2e30 100755 (executable)
@@ -5,24 +5,23 @@
 # Some ideas and code reworked from other resources
 # AIF, Cnichi, Calamares, Arch Wiki.. Credit where credit is due
 
-VER="2.0.17"      # version
-DIST="ArchLabs"  # distributor
-MNT="/mnt"       # mountpoint
-ANS="/tmp/ans"
+VER="2.0.50"     # installer version
+DIST="ArchLabs"  # linux distributor
+MNT="/mnt"       # install mountpoint
+ANS="/tmp/ans"   # dialog answer file
 
+# ------------------------------------------------------ #
+# When manually mounting your partitions, you need
+# to set these values to avoid using the mount menu.
+# ------------------------------------------------------ #
 
-# --------------------------------------------- #
-# if you manually mount your partitions then you
-# need to set these values to avoid issues.
-# --------------------------------------------- #
-
-# root partition, eg/ /dev/sda2
+# root partition, eg. /dev/sda2
 ROOT_PART=''
 
-# boot partition, required on UEFI, eg. /dev/sda1
+# boot partition, required on UEFI eg. /dev/sda1
 BOOT_PART=''
 
-# device used for some bootloader install process, eg. /dev/sda
+# boot device, used for some bootloaders eg. /dev/sda
 BOOT_DEV=''
 
 # bootloader to use, can be:
@@ -34,40 +33,41 @@ BOOTLDR=''
 # this will need to be 'boot' however a popular one for grub is 'boot/efi'
 BOOTDIR='boot'
 
-# swap partition or file path
-SWAP_PART=''
+# ------------------------------------------------------ #
 
-# swap size, only used when creating a swapfile
-SWAP_SIZE=''
+# bulk default values {
 
-# --------------------------------------------- #
+# these values will be selected during the install, it is not recommended
+# to edit them here unless you know what you're doing.
 
-# bulk default values {
+UCODE=''          # cpu microcode (if any), can be: amd-ucode, intel-ucode
+KERNEL=''         # linux kernel, can be: linux, linux-lts, linux-zen, or linux-hardened
+MYSHELL=''        # full path for the shell, eg. /usr/bin/zsh
+
+SWAP_PART=''      # swap partition or file path
+SWAP_SIZE=''      # swap size, only used when creating a swapfile
 
 EXMNT=''          # holder for additional partitions while mounting
 EXMNTS=''         # when an extra partition is mounted append it's info
 
-FONT="ter-i16n"   # font used in the linux console
+FONT="ter-i16n"   # font used for the linux console
 HOOKS="shutdown"  # list of additional HOOKS to add in /etc/mkinitcpio.conf
 
-LOGINRC=''        # login shell rc file, eg. .zprofile, .bash_profile, .profile
-LOGIN_WM=''       # default login session, used only for xinit
 LOGIN_TYPE=''     # login manager can be: lightdm, xinit
-INSTALL_WMS=''    # space separated list of chosen wm and de
+LOGIN_WM=''       # default login session to be placed in ~/.xinitrc
+LOGINRC=''        # login shell rc file, eg. .zprofile, .bash_profile, .profile
 
-UCODE=''          # cpu microcode (if any), eg. amd-ucode, intel-ucode
-KERNEL=''         # can be linux, linux-lts, linux-zen, or linux-hardened
-MYSHELL=''        # full path for the shell, eg. /usr/bin/zsh
+INSTALL_WMS=''    # space separated list of chosen wm/de
 
-WM_PKGS=''        # full list of packages added during wm/de choice
-PACKAGES=''       # list of all packages to install including WM_PKGS
+WM_PKGS=''        # full list of packages added during wm/de choice (not user edited)
+PACKAGES=''       # list of all packages to install including WM_PKGS (not user edited)
 USER_PKGS=''      # packages selected by the user during install
 
-NEWUSER=''        # username for the primary user
-USER_PASS=''      # password for the primary user
+NEWUSER=''        # username for the new user
+USER_PASS=''      # new user's password
 ROOT_PASS=''      # root password
 
-LUKS=''           # empty when not using luks encryption
+LUKS=''           # empty when not using encryption
 LUKS_DEV=''       # boot parameter string for LUKS
 LUKS_PART=''      # partition used for encryption
 LUKS_PASS=''      # encryption password
@@ -75,8 +75,8 @@ LUKS_UUID=''      # encrypted partition UUID
 LUKS_NAME=''      # name used for encryption
 
 LVM=''            # empty when not using lvm
-VGROUP_MB=0       # available space in volume group
 LVM_PARTS=''      # partitions used for volume group
+VGROUP_MB=0       # available space in volume group
 
 WARN=''           # issued mounting/partitioning warning
 SEP_BOOT=''       # separate boot partition for BIOS
@@ -89,22 +89,24 @@ AUTO_ROOT_PART='' # root value from auto partition
 AUTO_BOOT_PART='' # boot value from auto partition
 
 # iso base, pacstrap when running the installer from a stock arch iso
-ISO_BASE="arch-install-scripts b43-firmware b43-fwcutter broadcom-wl clonezilla dhclient dhcpcd ethtool "
+ISO_BASE="b43-firmware b43-fwcutter broadcom-wl clonezilla dhclient dhcpcd ethtool wpa_supplicant "
 ISO_BASE+="exfat-utils f2fs-tools gptfdisk vim hdparm ipw2100-fw ipw2200-fw nfs-utils nilfs-utils ntfs-3g "
-ISO_BASE+="pacman-contrib parted rsync sdparm smartmontools wget wireless_tools wpa_actiond xl2tpd dialog "
-ISO_BASE+="parted alsa-firmware alsa-lib alsa-plugins pulseaudio pulseaudio-alsa networkmanager "
-ISO_BASE+="wireless-regdb wpa_supplicant lm_sensors lsb-release p7zip pamixer reflector unrar htop ranger "
-ISO_BASE+="w3m terminus-font ttf-dejavu archlabs-keyring"
-
-# baseline
-BASE_PKGS="archlabs-skel-base archlabs-themes archlabs-dARK archlabs-icons archlabs-wallpapers "
-BASE_PKGS+="base-devel xorg xorg-drivers sudo git gvfs gtk3 gtk-engines gtk-engine-murrine pavucontrol tumbler "
+ISO_BASE+="pacman-contrib parted rsync sdparm smartmontools wget wireless_tools wpa_actiond xl2tpd dialog parted "
+ISO_BASE+="alsa-firmware alsa-lib alsa-plugins pulseaudio pulseaudio-alsa networkmanager w3m htop wireless-regdb "
+ISO_BASE+="lm_sensors lsb-release p7zip pamixer reflector unrar ranger terminus-font ttf-dejavu archlabs-keyring"
+
+# archlabs base packages
+AL_BASE_PKGS="archlabs-skel-base archlabs-fonts archlabs-themes archlabs-dARK archlabs-icons archlabs-wallpapers archlabs-scripts"
+
+# baseline (usually installed in the background)
+BASE_PKGS="base-devel xorg xorg-drivers xorg-xinit sudo git gvfs gtk3 gtk-engines gtk-engine-murrine pavucontrol tumbler "
 BASE_PKGS+="playerctl ffmpeg gstreamer libmad libmatroska gst-libav gst-plugins-base gst-plugins-good scrot"
 
 # extras for window managers
 WM_BASE_PKGS="arandr archlabs-networkmanager-dmenu xdg-user-dirs nitrogen polkit-gnome volumeicon xclip exo "
 WM_BASE_PKGS+="xdotool compton wmctrl gnome-keyring dunst feh gsimplecal xfce4-power-manager xfce4-settings laptop-detect"
 
+
 SEL=0                                 # currently selected menu item
 ERR="/tmp/errlog"                     # error log used internally
 DBG="/tmp/debuglog"                   # debug log when passed -d
@@ -112,45 +114,36 @@ RUN="/run/archiso/bootmnt/arch/boot"  # path for live /boot
 VM="$(dmesg | grep -i "hypervisor")"  # is the system a vm
 SYS='Unknown'
 
+export DIALOGOPTS="--cr-wrap"
+
 # }
 
 # giant ugly variable container :P {
 
 # RAM in the system in MB
-SYS_MEM="$(awk '/MemTotal/ {
-print int($2 / 1024)"M"
-}' /proc/meminfo)"
+SYS_MEM="$(awk '/MemTotal/ {print int($2 / 1024) "M"}' /proc/meminfo)"
 
 # locales from /etc/locale.gen
-LOCALES="$(awk '/\.UTF-8/ {
-       gsub(/# .*|#/, "")
-       if ($1) {
-               print $1 " - "
-       }
-}' /etc/locale.gen)"
+LOCALES="$(awk '/\.UTF-8/ {gsub(/# .*|#/, ""); if ($1) {print $1 " - "}}' /etc/locale.gen)"
 
 # linux console keyboard mappings
-CMAPS="$(find /usr/share/kbd/keymaps -name '*.map.gz' | awk '{
-       gsub(/\.map\.gz|.*\//, "")
-       print $1 " - "
-}' | sort)"
+CMAPS="$(find /usr/share/kbd/keymaps -name '*.map.gz' | awk '{gsub(/\.map\.gz|.*\//, ""); print $1 " - "}' | sort)"
 
 # terminal size definitions
-# {
 [[ $LINES ]] || LINES=$(tput lines)
 [[ $COLUMNS ]] || COLUMNS=$(tput cols)
-SHL=$((LINES - 20)) # }
+SHL=$((LINES - 20))
 
 # associative arrays
 # {
 
 # commands used to install each bootloader (most get modified during runtime) {
 declare -A BCMDS=(
-[refind-efi]='refind-install'
-[grub]='grub-install --recheck --force'
-[syslinux]='syslinux-install_update -i -a -m'
-[efistub]='efibootmgr -v -d /dev/sda -p 1 -c -l'
-[systemd-boot]='bootctl --path=/boot install'
+[refind-efi]='refind-install'                    # minor modification
+[grub]='grub-install --recheck --force'          # heavily modified
+[syslinux]='syslinux-install_update -i -a -m'    # modified on UEFI
+[efistub]='efibootmgr -v -d /dev/sda -p 1 -c -l' # heavily modified
+[systemd-boot]='bootctl --path=/boot install'    # not modified
 ) # }
 
 # executable name for each wm/de {
@@ -158,6 +151,7 @@ declare -A WM_SESSIONS=(
 [dwm]='dwm'
 [i3-gaps]='i3'
 [bspwm]='bspwm'
+[awesome]='awesome'
 [plasma]='startkde'
 [xfce4]='startxfce4'
 [gnome]='gnome-session'
@@ -166,20 +160,22 @@ declare -A WM_SESSIONS=(
 [cinnamon]='cinnamon-session'
 ) # }
 
-# packages installed for each wm/de {
+# packages installed for each wm/de, most are depends of the skel packages {
 declare -A WM_EXT=(
-[gnome]=''
-[plasma]='kdebase-meta'
-[bspwm]='sxhkd archlabs-skel-bspwm rofi archlabs-polybar'
-[fluxbox]='archlabs-skel-fluxbox archlabs-polybar jgmenu rofi lxmenu-data'
-[i3-gaps]='i3status perl-anyevent-i3 archlabs-skel-i3-gaps rofi archlabs-polybar'
-[openbox]='obconf archlabs-skel-openbox jgmenu archlabs-polybar tint2 conky rofi lxmenu-data'
-[xfce4]='xfce4-goodies xfce4-pulseaudio-plugin network-manager-applet volumeicon rofi archlabs-skel-xfce4'
+[dwm]=''                # NA
+[gnome]=''              # NA
+[awesome]=''            # NA
+[plasma]='kdebase-meta' # base plasma application set
+[bspwm]=''              # see deps of bspwm-skel
+[fluxbox]=''            # see deps of fluxbox-skel
+[i3-gaps]=''            # see deps of i3-gaps-skel
+[openbox]=''            # see deps of openbox-skel
+[xfce4]='xfce4-goodies' # see deps of xfce4-skel
 ) # }
 
 # files that can be edited after install is complete {
 declare -A EDIT_FILES=(
-[login]=''
+[login]='' # login is populated once we know the username and shell
 [fstab]='/etc/fstab'
 [sudoers]='/etc/sudoers'
 [crypttab]='/etc/crypttab'
@@ -192,7 +188,7 @@ declare -A EDIT_FILES=(
 [keyboard]='/etc/X11/xorg.conf.d/00-keyboard.conf /etc/default/keyboard'
 ) # }
 
-# mkfs command for formatting each offered filesystem {
+# mkfs command for filesystem formatting {
 declare -A FS_CMDS=(
 [f2fs]='mkfs.f2fs'
 [jfs]='mkfs.jfs -q'
@@ -206,12 +202,12 @@ declare -A FS_CMDS=(
 [reiserfs]='mkfs.reiserfs -q'
 ) # }
 
-# mount options for each offered filesystem (if any {
+# mount options for each filesystem (if any) {
 declare -A FS_OPTS=(
-[vfat]=''
-[ntfs]=''
-[ext2]=''
-[ext3]=''
+[vfat]=''  # NA
+[ntfs]=''  # NA
+[ext2]=''  # NA
+[ext3]=''  # NA
 [jfs]='discard errors=continue errors=panic nointegrity'
 [reiserfs]='acl nolog notail replayonly user_xattr off'
 [ext4]='discard dealloc nofail noacl relatime noatime nobarrier nodelalloc'
@@ -223,7 +219,7 @@ declare -A FS_OPTS=(
 # PKG_EXT: if you add a package to $PACKAGES in any dialog {
 #          and it uses/requires some additional packages,
 #          you can add them here to keep it simple: [package]="extra"
-#          duplicates are removed with `uniq` before install
+#          duplicates are not added
 declare -A PKG_EXT=(
 [vlc]='qt4'
 [mpd]='mpc'
@@ -247,25 +243,26 @@ declare -A PKG_EXT=(
 # Basics (somewhat in order)
 _keymap="\nPick which keymap to use for the system from the list below\n\nThis is used once a graphical environment is running (Xorg).\n\nSystem default: us"
 _vconsole="\nSelect the console keymap, the console is the tty shell you reach before starting a graphical environment (Xorg).\n\nIts keymap is seperate from the one used by the graphical environments, though many do use the same such as 'us' English.\n\nSystem default: us"
-_user="\nEnter a name and password for the new user account.\n\nThe name must not use capital letters, contain any periods (.), end with a hyphen (-), or include any colons (:)\n\nNOTE: Use the [Up] and [Down] arrows to switch between input fields, [Tab] to toggle between input fields and the buttons, and [Enter] to accept."
-_hostname="\nEnter a hostname for the new system.\n\nA hostname is used to identify systems on the network.\n\nIt's restricted to alphanumeric characters (a-z, A-Z, 0-9).\nIt can contain hyphens (-) BUT NOT at the beggining or end."
-_locale="\nLocale determines the system language and currency formats.\n\nThe format for locale names is languagecode_COUNTRYCODE\n\neg. en_US is: english United States\n    en_GB is: english Great Britain"
-_timez="\nThe time zone is used to set the system clock.\n\nSelect your country or continent from the list below"
-_timesubz="\nSelect the nearest city to you or one with the same time zone.\n\nTIP: Pressing the first letter of the city name repeatedly will navigate between entries beggining with that letter."
-_sessions="\nUse [Space] to toggle available sessions, use [Enter] to accept the selection and continue.\n\nA basic package set will be installed for compatibility and functionality."
-_login="\nSelect which of your session choices to use for the initial login.\n\nYou can be change this later by editing your ~/.xinitrc"
-_packages="\nUse [Space] to move a package into the selected area and press [Enter] to accept the selection.\n\nPackages may be installed by your DE/WM (if any), or for the packages you select."
 _device="\nSelect a device to use from the list below.\n\nDevices (/dev) are the available drives on the system. /sda, /sdb, /sdc ..."
+_resize="\nSelect a new filesystem size in MB, a new partition will be created from the free space but will be left unformatted.\nThe lowest size is just enough to fit the currently in use space on the partition while the default is set to split the free space evenly.\n\nUse Tab or the arrow keys move the cursor between the buttons and the value, when the cursor is on the value, you can edit it by:\n\n - left/right cursor movement to select a digit to modify\n - +/-  characters to increment/decrement the digit by one\n - 0 through 9 to set the digit to the given value\n\nSome keys are also recognized in all cursor positions:\n\n - Home/End set the value to its maximum or minimum\n - Pageup/Pagedown increment the value so that the slider moves by one column."
 _mount="\nUse [Space] to toggle mount options from below, press [Enter] when done to confirm selection.\n\nNot selecting any and confirming will run an automatic mount."
-_warn="\nIMPORTANT: Please choose carefully during mounting and formatting.\n\nPartitions can be mounted without formatting by selecting skip during mounting, useful for extra or already formatted partitions.\n\nThe exception to this is the root (/) partition, it needs to be formatted before install to ensure system stability.\n"
+_warn="\nIMPORTANT:\n\nChoose carefully when editing, formatting, and mounting partitions or your DATA MAY BE LOST.\n\nTo mount a partition without formatting it, select 'skip' when prompted to choose a filesystem during the mounting stage.\nThis can only be used for partitions that already contain a filesystem and cannot be the root (/) partition, it needs to be formatted before install.\n"
 _part="\nFull device auto partitioning is available for beginners otherwise cfdisk is recommended.\n\n  - All systems will require a root partition (8G or greater).\n  - UEFI (and BIOS using LUKS without LVM) require a separate boot partition (100-512M)."
 _uefi="\nSelect the EFI boot partition (/boot), required for UEFI boot.\n\nIt's usually the first partition on the device, 100-512M, and will be formatted as vfat/fat32 if not already."
 _bios="\nDo you want to use a separate boot partition? (optional)\n\nIt's usually the first partition on the device, 100-512M, and will be formatted as ext3/4 if not already."
 _biosluks="\nSelect the boot partition (/boot), required for LUKS.\n\nIt's usually the first partition on the device, 100-512M, and will be formatted as ext3/4 if not already."
 _format="is already formatted correctly.\n\nFor a clean install, previously existing partitions should be reformatted, however this removes ALL data (bootloaders) on the partition so choose carefully.\n\nDo you want to reformat the partition?\n"
 _swapsize="\nEnter the size of the swapfile in megabytes (M) or gigabytes (G).\n\neg. 100M will create a 100 megabyte swapfile, while 10G will create a 10 gigabyte swapfile.\n\nFor ease of use and as an example it is filled in to match the size of your system memory (RAM).\n\nMust be greater than 1, contain only whole numbers, and end with either M or G."
-_expart="\nYou can now select additional partitions you want mounted, once choosen you will be asked to enter a mountpoint.\n\nSelect 'done' to finish the mounting step and begin unpacking the base system in the background."
+_expart="\nYou can now choose any additional partitions you want mounted, you'll be asked for a mountpoint after.\n\nSelect 'done' to finish the mounting step and begin unpacking the base system in the background."
 _exmnt="\nWhere do you want the partition mounted?\n\nEnsure the name begins with a slash (/).\nExamples include: /usr, /home, /var, etc."
+_user="\nEnter a name and password for the new user account.\n\nThe name must not use capital letters, contain any periods (.), end with a hyphen (-), or include any colons (:)\n\nNOTE: Use the [Up] and [Down] arrows to switch between input fields, [Tab] to toggle between input fields and the buttons, and [Enter] to accept."
+_hostname="\nEnter a hostname for the new system.\n\nA hostname is used to identify systems on the network.\n\nIt's restricted to alphanumeric characters (a-z, A-Z, 0-9).\nIt can contain hyphens (-) BUT NOT at the beggining or end."
+_locale="\nLocale determines the system language and currency formats.\n\nThe format for locale names is languagecode_COUNTRYCODE\n\neg. en_US is: english United States\n    en_GB is: english Great Britain"
+_timez="\nThe time zone is used to set the system clock.\n\nSelect your country or continent from the list below"
+_timesubz="\nSelect the nearest city to you or one with the same time zone.\n\nTIP: Pressing the first letter of the city name repeatedly will navigate between entries beggining with that letter."
+_sessions="\nUse [Space] to toggle available sessions, use [Enter] to accept the selection and continue.\n\nA basic package set will be installed for compatibility and functionality."
+_login="\nSelect which of your session choices to use for the initial login.\n\nYou can be change this later by editing your ~/.xinitrc"
+_packages="\nUse [Space] to move a package into the selected area and press [Enter] to accept the selection.\n\nPackages may be installed by your DE/WM (if any), or for the packages you select."
 _edit="\nBefore exiting you can select configuration files to review/change.\n\nIf you need to make other changes with the drives still mounted, use Ctrl-z to pause the installer, when finished type 'fg' and [Enter] or Ctrl-z again to resume the installer, if you want to avoid the automatic reboot using Ctrl-c will cleanly exit."
 
 # LUKS
@@ -306,28 +303,22 @@ select_main()
 {
        (( SEL < 12 )) && (( SEL++ ))
        tput civis
-       dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \
-               --title " Prepare " --default-item $SEL --cancel-label 'Exit' --menu "$_prep" 0 0 0 \
-               1 "Show lsblk output (optional)" \
-               2 "Edit partitions (optional)" \
-               3 "LUKS encryption (optional)" \
-               4 "Logical volume management (optional)" \
-               5 "Mount and format partitions" \
-               6 "Select system bootloader" \
-               7 "Create user and set password" \
-               8 "Configure system settings" \
-               9 "Select window manager or desktop (optional)" \
-               10 "Select additional packages (optional)" \
-               11 "Check configuration choices (optional)" \
+       dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " Prepare " --default-item $SEL --cancel-label 'Exit' --menu "$_prep" 0 0 0 \
+               1 "Device tree (optional)" \
+               2 "Partitioning (optional)" \
+               3 "LUKS setup (optional)" \
+               4 "LVM setup (optional)" \
+               5 "Mount partitions" \
+               6 "System bootloader" \
+               7 "User and password" \
+               8 "System configuration" \
+               9 "Select WM/DE (optional)" \
+               10 "Select Packages (optional)" \
+               11 "View configuration (optional)" \
                12 "Start the installation" 2>"$ANS"
 
        read -r SEL < "$ANS"
-
-       if [[ -z $WARN && $SEL =~ (2|5) ]]; then
-               msg "Prepare" "$_warn"
-               WARN=true
-       fi
-
+       [[ -z $WARN && $SEL =~ (2|5) ]] && { msg "Data Warning" "$_warn"; WARN=true; }
        case $SEL in
                1) part_show ;;
                2) part_menu || (( SEL-- )) ;;
@@ -350,34 +341,25 @@ select_boot()
        if [[ $SYS == 'BIOS' ]]; then
                dlg BOOTLDR menu "BIOS Bootloader" "\nSelect which bootloader to use." \
                        "grub"     "The Grand Unified Bootloader, standard among many Linux distributions" \
-                       "syslinux" "A collection of boot loaders for booting drives, CDs, or over the network"
-
+                       "syslinux" "A collection of boot loaders for booting drives, CDs, or over the network" || return 1
        else
                dlg BOOTLDR menu "UEFI Bootloader" "\nSelect which bootloader to use." \
                        "systemd-boot" "A simple UEFI boot manager which executes configured EFI images" \
                        "grub"         "The Grand Unified Bootloader, standard among many Linux distributions" \
                        "refind-efi"   "A UEFI boot manager that aims to be platform neutral and simplify multi-boot" \
                        "efistub"      "Boot the kernel image directly (no chainloading support)" \
-                       "syslinux"     "A collection of boot loaders for booting drives, CDs, or over the network (no chainloading support)"
-
+                       "syslinux"     "A collection of boot loaders for booting drives, CDs, or over the network (no chainloading support)" || return 1
        fi
-       [[ $BOOTLDR ]] || return 1
        setup_${BOOTLDR}
 }
 
 select_show()
 {
+       local mnt="none"
        local cmd="${BCMDS[$BOOTLDR]}"
-       [[ $BOOT_PART ]] && local mnt="/$BOOTDIR" || local mnt="none"
-
-       local pkgs="${USER_PKGS# }"
-       pkgs="${pkgs% }"
-       pkgs="${pkgs% } ${PACKAGES# }"
-       pkgs="${pkgs//  / }"
-       pkgs="${pkgs//  / }"
-       [[ $INSTALL_WMS == *dwm* ]] && pkgs="dwm st dmenu ${pkgs# }"
-       pkgs="${pkgs# }"
-       pkgs="${pkgs% }"
+       local pkgs="${USER_PKGS//  / } ${PACKAGES//  / }"
+       [[ $BOOT_PART ]] && mnt="/$BOOTDIR"
+       [[ $INSTALL_WMS == *dwm* ]] && pkgs="dwm st dmenu $pkgs"
        pkgs="${pkgs//  / }"
        msg "Show Configuration" "
 
@@ -424,23 +406,22 @@ select_show()
 
   Kernel:   ${KERNEL:-none}
   Sessions: ${INSTALL_WMS:-none}
-  Mirrors:  ${MIRROR_CMD:-none}
   Packages: $(print4 "${pkgs:-none}")
 "
 }
 
 select_login()
 {
-       dlg LOGIN_TYPE menu "Login Management" "\nSelect which login management to use." \
-               "xinit"   "Console login without a display manager" \
-               "lightdm" "Lightweight display manager with a gtk greeter"
-
        if [[ -z $LOGIN_TYPE ]]; then
-               return 1
-       elif [[ $LOGIN_TYPE == 'lightdm' ]]; then
-               WM_PKGS+=" lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings accountsservice"
-               EDIT_FILES[login]="/etc/lightdm/lightdm.conf /etc/lightdm/lightdm-gtk-greeter.conf"
+               dlg LOGIN_TYPE menu "Login Management" "\nSelect what kind of login management to use." \
+                       "xinit"   "Console login without a display manager" \
+                       "lightdm" "Lightweight display manager with a gtk greeter" || return 1
+       fi
+
+       if [[ $LOGIN_TYPE == 'lightdm' ]]; then
                AUTOLOGIN=''
+               LOGIN_PKGS="lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings accountsservice"
+               EDIT_FILES[login]="/etc/lightdm/lightdm.conf /etc/lightdm/lightdm-gtk-greeter.conf"
        else
                if (( WM_NUM == 1 )); then
                        LOGIN_WM="${WM_SESSIONS[$INSTALL_WMS]}"
@@ -449,18 +430,19 @@ select_login()
                        LOGIN_WM="${WM_SESSIONS[$LOGIN_WM]}"
                fi
 
-               local txt="\nDo you want autologin enabled for $NEWUSER?\n\nPicking yes will create the following files:\n\n  - /home/$NEWUSER/$LOGINRC (run startx when logging in on tty1)\n  - /etc/systemd/system/getty@tty1.service.d/autologin.conf (login $NEWUSER without password)\n\nTo disable autologin remove these files.\n"
-
+               local txt="\nDo you want autologin enabled for $NEWUSER?\n\n"
+               txt+="If so the following two files will be created (disable autologin by removing them):\n\n"
+               txt+="- /home/$NEWUSER/$LOGINRC (run startx when logging in on tty1)\n"
+               txt+="- /etc/systemd/system/getty@tty1.service.d/autologin.conf (login $NEWUSER without password)\n"
                yesno "Autologin" "$txt" && AUTOLOGIN=true || AUTOLOGIN=''
-               WM_PKGS+=" xorg-xinit"
+               LOGIN_PKGS="xorg-xinit"
                EDIT_FILES[login]="/home/$NEWUSER/.xinitrc /home/$NEWUSER/.xprofile"
        fi
 }
 
 select_config()
 {
-       local i=0
-
+       typeset -i i=0
        CONFIG_DONE=''
 
        until [[ $CONFIG_DONE ]]; do
@@ -472,28 +454,26 @@ select_config()
                                        /usr/bin/mksh 'The MirBSD Korn Shell - an enhanced version of the public domain ksh' || return 1
 
                                ;;
-                       1) dlg MYHOST input "Hostname" "$_hostname" "${DIST,,}" limit || continue ;;
-                       2) dlg MYLOCALE menu "Locale" "$_locale" $LOCALES || continue ;;
+                       1) dlg MYHOST input "Hostname" "$_hostname" "${DIST,,}" limit || { i=0; continue; } ;;
+                       2) dlg MYLOCALE menu "Locale" "$_locale" $LOCALES || { i=1; continue; } ;;
                        3) ZONE='' SUBZ=''
                                until [[ $ZONE && $SUBZ ]]; do
                                        dlg ZONE menu "Timezone" "$_timez" America - Australia - Asia - Atlantic - Africa - Europe - Indian - Pacific - Arctic - Antarctica - || break
                                        dlg SUBZ menu "Timezone" "$_timesubz" $(awk '/'"$ZONE"'\// {gsub(/'"$ZONE"'\//, ""); print $3 " - "}' /usr/share/zoneinfo/zone.tab | sort) || continue
                                        yesno "Timezone" "\nConfirm time zone: $ZONE/$SUBZ\n" || unset ZONE
                                done
-                               [[ $ZONE && $SUBZ ]] || continue ;;
+                               [[ $ZONE && $SUBZ ]] || { i=2; continue; } ;;
                        4)
                                dlg KERNEL menu "Kernel" "\nChoose which kernel to use." \
                                        linux          'Vanilla linux kernel and modules, with a few patches applied' \
                                        linux-lts      'Long-term support (LTS) linux kernel and modules' \
                                        linux-zen      'A effort of kernel hackers to provide the best kernel for everyday systems' \
-                                       linux-hardened 'A security-focused linux kernel with hardening patches to mitigate exploits' || continue
+                                       linux-hardened 'A security-focused linux kernel with hardening patches to mitigate exploits' || { i=3; continue; }
 
-                               ;;
-                       5) select_mirrorcmd || continue
                                CONFIG_DONE=true
                                ;;
                esac
-               (( i++ ))
+               (( i++ )) # progress through to the next choice
        done
 
        case $MYSHELL in
@@ -507,20 +487,19 @@ select_config()
 
 select_mkuser()
 {
-       local v='' u='' p='' p2='' rp='' rp2=''
        NEWUSER=''
+       local v='' u='' p='' p2='' rp='' rp2=''
 
        until [[ $NEWUSER ]]; do
                i=0
                tput cnorm
-               dialog --cr-wrap --insecure --backtitle "$DIST Installer - $SYS - v$VER" \
-                       --separator $'\n' --title " User " --mixedform "$_user" 0 0 0 \
-                       "Username:"  1 1 "$u" 1 11 $COLUMNS 0 0 \
-                       "Password:"  2 1 ''   2 11 $COLUMNS 0 1 \
-                       "Password2:" 3 1 ''   3 12 $COLUMNS 0 1 \
-                       "--- Root password, if left empty the user password will be used ---" 6 1 '' 6 68 $COLUMNS 0 2 \
-                       "Password:"  8 1 ''   8 11 $COLUMNS 0 1 \
-                       "Password2:" 9 1 ''   9 12 $COLUMNS 0 1 2>"$ANS" || return 1
+               dialog --insecure --backtitle "$DIST Installer - $SYS - v$VER" --separator $'\n' --title " User " --mixedform "$_user" 0 0 0 \
+                       "Username:"  1 1 "$u" 1 11 "$COLUMNS" 0 0 \
+                       "Password:"  2 1 ''   2 11 "$COLUMNS" 0 1 \
+                       "Password2:" 3 1 ''   3 12 "$COLUMNS" 0 1 \
+                       "--- Root password, if left empty the user password will be used ---" 6 1 '' 6 68 "$COLUMNS" 0 2 \
+                       "Password:"  8 1 ''   8 11 "$COLUMNS" 0 1 \
+                       "Password2:" 9 1 ''   9 12 "$COLUMNS" 0 1 2>"$ANS" || return 1
 
                while read -r line; do
                        case $i in
@@ -564,7 +543,7 @@ select_keymap()
                sy Arabic     ara   Arabic      ua Ukrainian  cz Czech      ru Russian \
                sk Slovak     nl    Dutch       it Italian    hu Hungarian  cn Chinese \
                tw Taiwanese  vn    Vietnamese  kr Korean     jp Japanese   th Thai \
-               la Lao        pl    Polish      se Swedish    is Icelandic  fi Finnish \
+               la Lao        pl    Polish      se Swedish    is Icelandic 'fi' Finnish \
                dk Danish     be    Belgian     in Indian     al Albanian   am Armenian \
                bd Bangla     ba    Bosnian    'bg' Bulgarian dz Berber     mm Burmese \
                hr Croatian   gr    Greek       il Hebrew     ir Persian    iq Iraqi \
@@ -576,21 +555,18 @@ select_keymap()
                ke Swahili    bw    Tswana      ph Filipino   my Malay      tm Turkmen \
                id Indonesian bt    Dzongkha    lv Latvian    md Moldavian mao Maori \
                by Belarusian az    Azerbaijani mk Macedonian kh Khmer     epo Esperanto \
-               me Montenegrin
-
-       [[ $KEYMAP ]] || return 1
+               me Montenegrin || return 1
 
        if [[ $CMAPS == *"$KEYMAP"* ]]; then
                CMAP="$KEYMAP"
        else
-               dlg CMAP menu "Console Keymap" "$_vconsole" $CMAPS
-               [[ $CMAP ]] || return 1
+               dlg CMAP menu "Console Keymap" "$_vconsole" $CMAPS || return 1
        fi
 
        if [[ $DISPLAY && $TERM != 'linux' ]]; then
-               setxkbmap $KEYMAP >/dev/null 2>&1
+               setxkbmap "$KEYMAP" >/dev/null 2>&1
        else
-               loadkeys $CMAP >/dev/null 2>&1
+               loadkeys "$CMAP" >/dev/null 2>&1
        fi
 
        return 0
@@ -601,38 +577,41 @@ select_sessions()
        LOGIN_CHOICES=''
 
        dlg INSTALL_WMS check "Sessions" "$_sessions\n" \
-               i3-gaps "A fork of i3wm with more features including gaps" $(ofn i3-gaps "${INSTALL_WMS[*]}") \
-               openbox "A lightweight, powerful, and highly configurable stacking wm" $(ofn openbox "${INSTALL_WMS[*]}") \
-               bspwm "A tiling wm that represents windows as the leaves of a binary tree" $(ofn bspwm "${INSTALL_WMS[*]}") \
-               dwm "A fork of dwm, with more layouts and features" $(ofn dwm "${INSTALL_WMS[*]}") \
-               fluxbox "A lightweight and highly-configurable window manager" $(ofn fluxbox "${INSTALL_WMS[*]}") \
-               gnome "A desktop environment that aims to be simple and easy to use" $(ofn gnome "${INSTALL_WMS[*]}") \
-               cinnamon "A desktop environment combining traditional desktop with modern effects" $(ofn cinnamon "${INSTALL_WMS[*]}") \
-               plasma "A kde software project currently comprising a full desktop environment" $(ofn plasma "${INSTALL_WMS[*]}") \
-               xfce4 "A lightweight and modular desktop environment based on gtk+2/3" $(ofn xfce4 "${INSTALL_WMS[*]}")
-
-       [[ $INSTALL_WMS ]] || return 1
+               i3-gaps "A fork of i3wm with more features including gaps" "$(ofn i3-gaps "${INSTALL_WMS[*]}")" \
+               openbox "A lightweight, powerful, and highly configurable stacking wm" "$(ofn openbox "${INSTALL_WMS[*]}")" \
+               awesome "A customized Awesome WM session created by @elanapan" "$(ofn awesome "${INSTALL_WMS[*]}")" \
+               dwm "A dynamic WM for X that manages windows in tiled, floating, or monocle layouts" "$(ofn dwm "${INSTALL_WMS[*]}")" \
+               bspwm "A tiling wm that represents windows as the leaves of a binary tree" "$(ofn bspwm "${INSTALL_WMS[*]}")" \
+               fluxbox "A lightweight and highly-configurable window manager" "$(ofn fluxbox "${INSTALL_WMS[*]}")" \
+               gnome "A desktop environment that aims to be simple and easy to use" "$(ofn gnome "${INSTALL_WMS[*]}")" \
+               cinnamon "A desktop environment combining traditional desktop with modern effects" "$(ofn cinnamon "${INSTALL_WMS[*]}")" \
+               plasma "A kde software project currently comprising a full desktop environment" "$(ofn plasma "${INSTALL_WMS[*]}")" \
+               xfce4 "A lightweight and modular desktop environment based on gtk+2/3" "$(ofn xfce4 "${INSTALL_WMS[*]}")" || return 1
 
        WM_NUM=0
-       while IFS=' ' read -r field; do
+       while IFS=' ' read -r i; do
                (( WM_NUM++ ))
        done <<< "$INSTALL_WMS"
 
+
        WM_PKGS="${INSTALL_WMS/dwm/}" # remove dwm from package list
        WM_PKGS="${WM_PKGS//  / }"    # remove double spaces
        WM_PKGS="${WM_PKGS# }"        # remove leading space
 
+       # add archlabs base when choosing any session
+       [[ $WM_PKGS ]] && WM_PKGS+=" $AL_BASE_PKGS"
+
        for i in $INSTALL_WMS; do
                LOGIN_CHOICES+="$i - "
                [[ ${WM_EXT[$i]} && $WM_PKGS != *"${WM_EXT[$i]}"* ]] && WM_PKGS+=" ${WM_EXT[$i]}"
        done
 
        select_login || return 1
+       [[ $WM_PKGS != *"$LOGIN_PKGS"* ]] && WM_PKGS+=" $LOGIN_PKGS"
 
-       # add unique wm packages to main package list
-       for i in $WM_PKGS; do
-               [[ $PACKAGES == *$i* ]] || PACKAGES+=" ${i# }"
-       done
+       while IFS=' ' read -r pkg; do
+               [[ $PACKAGES != *"$pkg"* ]] && PACKAGES+=" $pkg"
+       done <<< "$WM_PKGS"
 
        return 0
 }
@@ -640,137 +619,93 @@ select_sessions()
 select_packages()
 {
        dlg USER_PKGS check " Packages " "$_packages" \
-               abiword "A Fully-featured word processor" $(ofn abiword "${USER_PKGS[*]}") \
-               alacritty "A cross-platform, GPU-accelerated terminal emulator" $(ofn alacritty "${USER_PKGS[*]}") \
-               atom "An open-source text editor developed by GitHub" $(ofn atom "${USER_PKGS[*]}") \
-               audacious "A free and advanced audio player based on GTK+" $(ofn audacious "${USER_PKGS[*]}") \
-               audacity "A program that lets you manipulate digital audio waveforms" $(ofn audacity "${USER_PKGS[*]}") \
-               cairo-dock "Light eye-candy fully themable animated dock" $(ofn cairo-dock "${USER_PKGS[*]}") \
-               calligra "A set of applications for productivity" $(ofn calligra "${USER_PKGS[*]}") \
-               chromium "An open-source web browser based on the Blink rendering engine" $(ofn chromium "${USER_PKGS[*]}") \
-               clementine "A modern music player and library organizer" $(ofn clementine "${USER_PKGS[*]}") \
-               cmus "A small, fast and powerful console music player" $(ofn cmus "${USER_PKGS[*]}") \
-               deadbeef "A GTK+ audio player for GNU/Linux" $(ofn deadbeef "${USER_PKGS[*]}") \
-               deluge "A BitTorrent client written in python" $(ofn deluge "${USER_PKGS[*]}") \
-               docky "Full fledged dock for opening applications and managing windows" $(ofn docky "${USER_PKGS[*]}") \
-               emacs "An extensible, customizable, self-documenting real-time display editor" $(ofn emacs "${USER_PKGS[*]}") \
-               epiphany "A GNOME web browser based on the WebKit rendering engine" $(ofn epiphany "${USER_PKGS[*]}") \
-               evince "A document viewer" $(ofn evince "${USER_PKGS[*]}") \
-               evolution "Manage your email, contacts and schedule" $(ofn evolution "${USER_PKGS[*]}") \
-               file-roller "Create and modify archives" $(ofn file-roller "${USER_PKGS[*]}") \
-               firefox "A popular open-source web browser from Mozilla" $(ofn firefox "${USER_PKGS[*]}") \
-               gcolor2 "A simple GTK+2 color selector" $(ofn gcolor2 "${USER_PKGS[*]}") \
-               geany "A fast and lightweight IDE" $(ofn geany "${USER_PKGS[*]}") \
-               geary "A lightweight email client for the GNOME desktop" $(ofn geary "${USER_PKGS[*]}") \
-               gimp "GNU Image Manipulation Program" $(ofn gimp "${USER_PKGS[*]}") \
-               gnome-disk-utility "Disk Management Utility" $(ofn gnome-disk-utility "${USER_PKGS[*]}") \
-               gnome-system-monitor "View current processes and monitor system state" $(ofn gnome-system-monitor "${USER_PKGS[*]}") \
-               gparted "A GUI frontend for creating and manipulating partition tables" $(ofn gparted "${USER_PKGS[*]}") \
-               gpick "Advanced color picker using GTK+ toolkit" $(ofn gpick "${USER_PKGS[*]}") \
-               gpicview "Lightweight image viewer" $(ofn gpicview "${USER_PKGS[*]}") \
-               guvcview "Capture video from camera devices" $(ofn guvcview "${USER_PKGS[*]}") \
-               hexchat "A popular and easy to use graphical IRC client" $(ofn hexchat "${USER_PKGS[*]}") \
-               inkscape "Professional vector graphics editor" $(ofn inkscape "${USER_PKGS[*]}") \
-               irssi "Modular text mode IRC client" $(ofn irssi "${USER_PKGS[*]}") \
-               kdenlive "A popular non-linear video editor for Linux" $(ofn kdenlive "${USER_PKGS[*]}") \
-               krita "Edit and paint images" $(ofn krita "${USER_PKGS[*]}") \
-               libreoffice-fresh "Full featured office suite" $(ofn libreoffice-fresh "${USER_PKGS[*]}") \
-               lollypop "A new music playing application" $(ofn lollypop "${USER_PKGS[*]}") \
-               mousepad "A simple text editor" $(ofn mousepad "${USER_PKGS[*]}") \
-               mpd "A flexible, powerful, server-side application for playing music" $(ofn mpd "${USER_PKGS[*]}") \
-               mpv "A media player based on mplayer" $(ofn mpv "${USER_PKGS[*]}") \
-               mupdf "Lightweight PDF and XPS viewer" $(ofn mupdf "${USER_PKGS[*]}") \
-               mutt "Small but very powerful text-based mail client" $(ofn mutt "${USER_PKGS[*]}") \
-               nautilus "The default file manager for Gnome" $(ofn nautilus "${USER_PKGS[*]}") \
-               ncmpcpp "A mpd client and almost exact clone of ncmpc with some new features" $(ofn ncmpcpp "${USER_PKGS[*]}") \
-               neovim "A fork of Vim aiming to improve user experience, plugins, and GUIs." $(ofn neovim "${USER_PKGS[*]}") \
-               nicotine+ "A graphical client for Soulseek" $(ofn nicotine+ "${USER_PKGS[*]}") \
-               noto-fonts "Google Noto fonts" $(ofn noto-fonts "${USER_PKGS[*]}") \
-               noto-fonts-cjk "Google Noto CJK fonts (Chinese, Japanese, Korean)" $(ofn noto-fonts-cjk "${USER_PKGS[*]}") \
-               obs-studio "Free opensource streaming/recording software" $(ofn obs-studio "${USER_PKGS[*]}") \
-               openshot "An open-source, non-linear video editor for Linux" $(ofn openshot "${USER_PKGS[*]}") \
-               opera "A Fast and secure, free of charge web browser from Opera Software" $(ofn opera "${USER_PKGS[*]}") \
-               pcmanfm "A fast and lightweight file manager based in Lxde" $(ofn pcmanfm "${USER_PKGS[*]}") \
-               pidgin "Multi-protocol instant messaging client" $(ofn pidgin "${USER_PKGS[*]}") \
-               plank "An elegant, simple, and clean dock" $(ofn plank "${USER_PKGS[*]}") \
-               qbittorrent "An advanced BitTorrent client" $(ofn qbittorrent "${USER_PKGS[*]}") \
-               qpdfview "A tabbed PDF viewer" $(ofn qpdfview "${USER_PKGS[*]}") \
-               qt5ct "GUI for managing Qt based application themes, icons, and fonts" $(ofn qt5ct "${USER_PKGS[*]}") \
-               qutebrowser "A keyboard-focused vim-like web browser based on Python and PyQt5" $(ofn qutebrowser "${USER_PKGS[*]}") \
-               rhythmbox "A Music playback and management application" $(ofn rhythmbox "${USER_PKGS[*]}") \
-               rxvt-unicode "A unicode enabled rxvt-clone terminal emulator" $(ofn rxvt-unicode "${USER_PKGS[*]}") \
-               sakura "A terminal emulator based on GTK and VTE" $(ofn sakura "${USER_PKGS[*]}") \
-               simplescreenrecorder "A feature-rich screen recorder" $(ofn simplescreenrecorder "${USER_PKGS[*]}") \
-               steam "A popular game distribution platform by Valve" $(ofn steam "${USER_PKGS[*]}") \
-               surf "A simple web browser based on WebKit2/GTK+" $(ofn surf "${USER_PKGS[*]}") \
-               terminator "Terminal emulator that supports tabs and grids" $(ofn terminator "${USER_PKGS[*]}") \
-               termite "A minimal VTE-based terminal emulator" $(ofn termite "${USER_PKGS[*]}") \
-               thunar "A modern file manager for the Xfce Desktop Environment" $(ofn thunar "${USER_PKGS[*]}") \
-               thunderbird "Standalone mail and news reader from mozilla" $(ofn thunderbird "${USER_PKGS[*]}") \
-               tilda "A GTK based drop down terminal for Linux and Unix" $(ofn tilda "${USER_PKGS[*]}") \
-               tilix "A tiling terminal emulator for Linux using GTK+ 3" $(ofn tilix "${USER_PKGS[*]}") \
-               transmission-cli "Free BitTorrent client CLI" $(ofn transmission-cli "${USER_PKGS[*]}") \
-               transmission-gtk "Free BitTorrent client GTK+ GUI" $(ofn transmission-gtk "${USER_PKGS[*]}") \
-               transmission-qt "Free BitTorrent client Qt GUI" $(ofn transmission-qt "${USER_PKGS[*]}") \
-               ttf-anonymous-pro "A family fixed-width fonts designed with code in mind" $(ofn ttf-anonymous-pro "${USER_PKGS[*]}") \
-               ttf-fira-code "Monospaced font with programming ligatures" $(ofn ttf-fira-code "${USER_PKGS[*]}") \
-               ttf-font-awesome "Iconic font designed for Bootstrap" $(ofn ttf-font-awesome "${USER_PKGS[*]}") \
-               ttf-hack "A hand groomed typeface based on Bitstream Vera Mono" $(ofn ttf-hack "${USER_PKGS[*]}") \
-               vlc "A free and open source cross-platform multimedia player" $(ofn vlc "${USER_PKGS[*]}") \
-               weechat "Fast, light and extensible IRC client" $(ofn weechat "${USER_PKGS[*]}") \
-               xarchiver "A GTK+ frontend to various command line archivers" $(ofn xarchiver "${USER_PKGS[*]}") \
-               xfce-terminal "A terminal emulator based in the Xfce Desktop Environment" $(ofn xfce-terminal "${USER_PKGS[*]}") \
-               xterm "The standard terminal emulator for the X window system" $(ofn xterm "${USER_PKGS[*]}") \
-               zathura "Minimalistic document viewer" $(ofn zathura "${USER_PKGS[*]}")
+               abiword "A Fully-featured word processor" "$(ofn abiword "${USER_PKGS[*]}")" \
+               alacritty "A cross-platform, GPU-accelerated terminal emulator" "$(ofn alacritty "${USER_PKGS[*]}")" \
+               atom "An open-source text editor developed by GitHub" "$(ofn atom "${USER_PKGS[*]}")" \
+               audacious "A free and advanced audio player based on GTK+" "$(ofn audacious "${USER_PKGS[*]}")" \
+               audacity "A program that lets you manipulate digital audio waveforms" "$(ofn audacity "${USER_PKGS[*]}")" \
+               cairo-dock "Light eye-candy fully themable animated dock" "$(ofn cairo-dock "${USER_PKGS[*]}")" \
+               calligra "A set of applications for productivity" "$(ofn calligra "${USER_PKGS[*]}")" \
+               chromium "An open-source web browser based on the Blink rendering engine" "$(ofn chromium "${USER_PKGS[*]}")" \
+               clementine "A modern music player and library organizer" "$(ofn clementine "${USER_PKGS[*]}")" \
+               cmus "A small, fast and powerful console music player" "$(ofn cmus "${USER_PKGS[*]}")" \
+               deadbeef "A GTK+ audio player for GNU/Linux" "$(ofn deadbeef "${USER_PKGS[*]}")" \
+               deluge "A BitTorrent client written in python" "$(ofn deluge "${USER_PKGS[*]}")" \
+               docky "Full fledged dock for opening applications and managing windows" "$(ofn docky "${USER_PKGS[*]}")" \
+               emacs "An extensible, customizable, self-documenting real-time display editor" "$(ofn emacs "${USER_PKGS[*]}")" \
+               epiphany "A GNOME web browser based on the WebKit rendering engine" "$(ofn epiphany "${USER_PKGS[*]}")" \
+               evince "A document viewer" "$(ofn evince "${USER_PKGS[*]}")" \
+               evolution "Manage your email, contacts and schedule" "$(ofn evolution "${USER_PKGS[*]}")" \
+               file-roller "Create and modify archives" "$(ofn file-roller "${USER_PKGS[*]}")" \
+               firefox "A popular open-source web browser from Mozilla" "$(ofn firefox "${USER_PKGS[*]}")" \
+               gcolor2 "A simple GTK+2 color selector" "$(ofn gcolor2 "${USER_PKGS[*]}")" \
+               geany "A fast and lightweight IDE" "$(ofn geany "${USER_PKGS[*]}")" \
+               geary "A lightweight email client for the GNOME desktop" "$(ofn geary "${USER_PKGS[*]}")" \
+               gimp "GNU Image Manipulation Program" "$(ofn gimp "${USER_PKGS[*]}")" \
+               gnome-disk-utility "Disk Management Utility" "$(ofn gnome-disk-utility "${USER_PKGS[*]}")" \
+               gnome-system-monitor "View current processes and monitor system state" "$(ofn gnome-system-monitor "${USER_PKGS[*]}")" \
+               gparted "A GUI frontend for creating and manipulating partition tables" "$(ofn gparted "${USER_PKGS[*]}")" \
+               gpick "Advanced color picker using GTK+ toolkit" "$(ofn gpick "${USER_PKGS[*]}")" \
+               gpicview "Lightweight image viewer" "$(ofn gpicview "${USER_PKGS[*]}")" \
+               guvcview "Capture video from camera devices" "$(ofn guvcview "${USER_PKGS[*]}")" \
+               hexchat "A popular and easy to use graphical IRC client" "$(ofn hexchat "${USER_PKGS[*]}")" \
+               inkscape "Professional vector graphics editor" "$(ofn inkscape "${USER_PKGS[*]}")" \
+               irssi "Modular text mode IRC client" "$(ofn irssi "${USER_PKGS[*]}")" \
+               kdenlive "A popular non-linear video editor for Linux" "$(ofn kdenlive "${USER_PKGS[*]}")" \
+               krita "Edit and paint images" "$(ofn krita "${USER_PKGS[*]}")" \
+               libreoffice-fresh "Full featured office suite" "$(ofn libreoffice-fresh "${USER_PKGS[*]}")" \
+               lollypop "A new music playing application" "$(ofn lollypop "${USER_PKGS[*]}")" \
+               mousepad "A simple text editor" "$(ofn mousepad "${USER_PKGS[*]}")" \
+               mpd "A flexible, powerful, server-side application for playing music" "$(ofn mpd "${USER_PKGS[*]}")" \
+               mpv "A media player based on mplayer" "$(ofn mpv "${USER_PKGS[*]}")" \
+               mupdf "Lightweight PDF and XPS viewer" "$(ofn mupdf "${USER_PKGS[*]}")" \
+               mutt "Small but very powerful text-based mail client" "$(ofn mutt "${USER_PKGS[*]}")" \
+               nautilus "The default file manager for Gnome" "$(ofn nautilus "${USER_PKGS[*]}")" \
+               ncmpcpp "A mpd client and almost exact clone of ncmpc with some new features" "$(ofn ncmpcpp "${USER_PKGS[*]}")" \
+               neovim "A fork of Vim aiming to improve user experience, plugins, and GUIs." "$(ofn neovim "${USER_PKGS[*]}")" \
+               nicotine+ "A graphical client for Soulseek" "$(ofn nicotine+ "${USER_PKGS[*]}")" \
+               noto-fonts "Google Noto fonts" "$(ofn noto-fonts "${USER_PKGS[*]}")" \
+               noto-fonts-cjk "Google Noto CJK fonts (Chinese, Japanese, Korean)" "$(ofn noto-fonts-cjk "${USER_PKGS[*]}")" \
+               obs-studio "Free opensource streaming/recording software" "$(ofn obs-studio "${USER_PKGS[*]}")" \
+               openshot "An open-source, non-linear video editor for Linux" "$(ofn openshot "${USER_PKGS[*]}")" \
+               opera "A Fast and secure, free of charge web browser from Opera Software" "$(ofn opera "${USER_PKGS[*]}")" \
+               pcmanfm "A fast and lightweight file manager based in Lxde" "$(ofn pcmanfm "${USER_PKGS[*]}")" \
+               pidgin "Multi-protocol instant messaging client" "$(ofn pidgin "${USER_PKGS[*]}")" \
+               plank "An elegant, simple, and clean dock" "$(ofn plank "${USER_PKGS[*]}")" \
+               qbittorrent "An advanced BitTorrent client" "$(ofn qbittorrent "${USER_PKGS[*]}")" \
+               qpdfview "A tabbed PDF viewer" "$(ofn qpdfview "${USER_PKGS[*]}")" \
+               qt5ct "GUI for managing Qt based application themes, icons, and fonts" "$(ofn qt5ct "${USER_PKGS[*]}")" \
+               qutebrowser "A keyboard-focused vim-like web browser based on Python and PyQt5" "$(ofn qutebrowser "${USER_PKGS[*]}")" \
+               rhythmbox "A Music playback and management application" "$(ofn rhythmbox "${USER_PKGS[*]}")" \
+               rxvt-unicode "A unicode enabled rxvt-clone terminal emulator" "$(ofn rxvt-unicode "${USER_PKGS[*]}")" \
+               sakura "A terminal emulator based on GTK and VTE" "$(ofn sakura "${USER_PKGS[*]}")" \
+               simplescreenrecorder "A feature-rich screen recorder" "$(ofn simplescreenrecorder "${USER_PKGS[*]}")" \
+               steam "A popular game distribution platform by Valve" "$(ofn steam "${USER_PKGS[*]}")" \
+               surf "A simple web browser based on WebKit2/GTK+" "$(ofn surf "${USER_PKGS[*]}")" \
+               terminator "Terminal emulator that supports tabs and grids" "$(ofn terminator "${USER_PKGS[*]}")" \
+               termite "A minimal VTE-based terminal emulator" "$(ofn termite "${USER_PKGS[*]}")" \
+               thunar "A modern file manager for the Xfce Desktop Environment" "$(ofn thunar "${USER_PKGS[*]}")" \
+               thunderbird "Standalone mail and news reader from mozilla" "$(ofn thunderbird "${USER_PKGS[*]}")" \
+               tilda "A GTK based drop down terminal for Linux and Unix" "$(ofn tilda "${USER_PKGS[*]}")" \
+               tilix "A tiling terminal emulator for Linux using GTK+ 3" "$(ofn tilix "${USER_PKGS[*]}")" \
+               transmission-cli "Free BitTorrent client CLI" "$(ofn transmission-cli "${USER_PKGS[*]}")" \
+               transmission-gtk "Free BitTorrent client GTK+ GUI" "$(ofn transmission-gtk "${USER_PKGS[*]}")" \
+               transmission-qt "Free BitTorrent client Qt GUI" "$(ofn transmission-qt "${USER_PKGS[*]}")" \
+               ttf-anonymous-pro "A family fixed-width fonts designed with code in mind" "$(ofn ttf-anonymous-pro "${USER_PKGS[*]}")" \
+               ttf-fira-code "Monospaced font with programming ligatures" "$(ofn ttf-fira-code "${USER_PKGS[*]}")" \
+               ttf-font-awesome "Iconic font designed for Bootstrap" "$(ofn ttf-font-awesome "${USER_PKGS[*]}")" \
+               ttf-hack "A hand groomed typeface based on Bitstream Vera Mono" "$(ofn ttf-hack "${USER_PKGS[*]}")" \
+               vlc "A free and open source cross-platform multimedia player" "$(ofn vlc "${USER_PKGS[*]}")" \
+               weechat "Fast, light and extensible IRC client" "$(ofn weechat "${USER_PKGS[*]}")" \
+               xarchiver "A GTK+ frontend to various command line archivers" "$(ofn xarchiver "${USER_PKGS[*]}")" \
+               xfce-terminal "A terminal emulator based in the Xfce Desktop Environment" "$(ofn xfce-terminal "${USER_PKGS[*]}")" \
+               xterm "The standard terminal emulator for the X window system" "$(ofn xterm "${USER_PKGS[*]}")" \
+               zathura "Minimalistic document viewer" "$(ofn zathura "${USER_PKGS[*]}")"
 
        if [[ $USER_PKGS ]]; then
                for i in $USER_PKGS; do
-                       [[ ${PKG_EXT[$i]} && $USER_PKGS != *"${PKG_EXT[$i]}"* ]] && USER_PKGS="${USER_PKGS% } ${PKG_EXT[$i]}"
+                       [[ ${PKG_EXT[$i]} && $USER_PKGS != *"${PKG_EXT[$i]}"* ]] && USER_PKGS+=" ${PKG_EXT[$i]}"
                done
-               USER_PKGS="${USER_PKGS//  / }"
-               USER_PKGS="${USER_PKGS# }"
-               USER_PKGS="${USER_PKGS% }"
-       fi
-
-       return 0
-}
-
-select_mirrorcmd()
-{
-       local c='' key="5f29642060ab983b31fdf4c2935d8c56"
-
-       if hash reflector >/dev/null 2>&1; then
-               MIRROR_CMD="reflector --score 100 -l 50 -f 5 --sort rate --verbose"
-               yesno "Mirrorlist" "\nSort the mirrorlist automatically?\n\nTakes longer but can find faster mirrors.\n" && return 0
-
-               c="$(json 'country_name' "$(json 'ip' "check&?access_key=${key}&fields=ip")?access_key=${key}&fields=country_name")"
-               MIRROR_CMD="reflector --country $c --fastest 5 --sort rate --verbose"
-
-               tput cnorm
-               dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \
-                       --title " Mirrorlist " --inputbox "\nThe command below will be used to sort the mirrorlist, edit if needed.\n\n
-      --score n     Limit the list to the n servers with the highest score.
-      --latest n    Limit the list to the n most recently synchronized servers.
-      --fastest n   Return the n fastest mirrors that meet the other criteria.
-      --sort {age,rate,country,score,delay}
-
-            'age':      Last server synchronization;
-            'rate':     Download rate;
-            'country':  Server location;
-            'score':    MirrorStatus score;
-            'delay':    MirrorStatus delay.\n" 0 0 "$MIRROR_CMD" 2>"$ANS"
-
-               [ $? -eq 0 ] || return 1
-               read -r MIRROR_CMD < "$ANS"
-       elif hash rankmirrors >/dev/null 2>&1; then
-               msg "Mirrorlist" "\nQuerying mirrors near your location\n"
-               c="$(json 'country_code' "$(json 'ip' "check&?access_key=${key}&fields=ip")?access_key=${key}&fields=country_code")"
-               local w="https://www.archlinux.org/mirrorlist/?country="
-               if [[ $c ]]; then
-                       [[ $c =~ (CA|US) ]] && MIRROR_CMD="curl -s '${w}US&country=CA&use_mirror_status=on'" || MIRROR_CMD="curl -s '${w}${c}&use_mirror_status=on'"
-               else
-                       MIRROR_CMD="curl -s '${w}US&country=CA&country=NZ&country=GB&country=AU&use_mirror_status=on'"
-               fi
        fi
 
        return 0
@@ -781,41 +716,40 @@ select_mirrorcmd()
 
 part_menu()
 {
-       check_background_install || return 0
-
-       local device choice devhash="$(lsblk -f | base64)"
-       if [[ $# -eq 1 ]]; then
-               device="$1"
-       else
-               umount_dir $MNT
-               part_device || return 1
-               device="$DEVICE"
-       fi
+       is_bg_install || return 0
+       local device choice devhash
+       devhash="$(lsblk -f | base64)"
+       umount_dir $MNT
+       part_device || return 1
+       device="$DEVICE"
 
-       while true; do
+       while :; do
+               choice=""
                if [[ $DISPLAY && $TERM != 'linux' ]] && hash gparted >/dev/null 2>&1; then
                        dlg choice menu "Edit Partitions" "$_part" \
                                "auto"    "Whole device automatic partitioning" \
+                               "shrink"  "Shrink an existing ext2/3/4 or ntfs partition to make room for a new partition" \
                                "gparted" "GUI front end to parted" \
                                "cfdisk"  "Curses based variant of fdisk" \
                                "parted"  "GNU partition editor" \
-                               "fdisk"   "Dialog-driven program for creation and manipulation of partition tables." \
-                               "done"    "Return to the main menu"
-
+                               "fdisk"   "Dialog-driven creation and manipulation of partitions" \
+                               "done"    "Return to the main menu" || return 0
                else
                        dlg choice menu "Edit Partitions" "$_part" \
                                "auto"   "Whole device automatic partitioning" \
+                               "shrink" "Shrink an existing ext2/3/4 or ntfs partition to make room for a new partition" \
                                "cfdisk" "Curses based variant of fdisk" \
                                "parted" "GNU partition editor" \
-                               "fdisk"  "Dialog-driven program for creation and manipulation of partition tables." \
-                               "done"   "Return to the main menu"
-
+                               "fdisk"  "Dialog-driven creation and manipulation of partitions" \
+                               "done"   "Return to the main menu" || return 0
                fi
 
-               if [[-z $choice || $choice == 'done' ]]; then
+               if [[ $choice == 'done' ]]; then
                        return 0
+               elif [[ $choice == 'shrink' ]]; then
+                       part_shrink "$device"
                elif [[ $choice == 'auto' ]]; then
-                       local root_size txt ret table boot_fs
+                       local root_size txt table boot_fs
                        root_size=$(lsblk -lno SIZE "$device" | awk 'NR == 1 {
                                if ($1 ~ "G") {
                                        sub(/G/, "")
@@ -840,15 +774,15 @@ part_menu()
                        tput cnorm
                        $choice "$device"
                fi
-
-               # update the kernel if the partition table changes
-               [[ $devhash == "$(lsblk -f | base64)" ]] || partprobe >/dev/null 2>&1
+               if [[ $devhash != "$(lsblk -f | base64)" ]]; then
+                       msg "Probing Partitions" "\nInforming the kernel of partition changes using partprobe.\n" 0
+                       partprobe >/dev/null 2>&1
+               fi
        done
 }
 
 part_show()
 {
-       tput civis
        local txt
        if [[ $IGNORE_DEV ]]; then
                txt="$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE,MOUNTPOINT | awk "!/$IGNORE_DEV/"' && /disk|part|lvm|crypt|NAME/')"
@@ -861,75 +795,74 @@ part_show()
 part_swap()
 {
        if [[ $1 == "$MNT/swapfile" && $SWAP_SIZE ]]; then
-               fallocate -l $SWAP_SIZE $1 2>$ERR
+               fallocate -l $SWAP_SIZE "$1" 2>$ERR
                errshow "fallocate -l $SWAP_SIZE $1"
-               chmod 600 $1 2>$ERR
+               chmod 600 "$1" 2>$ERR
                errshow "chmod 600 $1"
        fi
-       mkswap $1 >/dev/null 2>$ERR
+       mkswap "$1" >/dev/null 2>$ERR
        errshow "mkswap $1"
-       swapon $1 >/dev/null 2>$ERR
+       swapon "$1" >/dev/null 2>$ERR
        errshow "swapon $1"
        return 0
 }
 
 part_auto()
 {
-       local device="$1" table="$2" boot_fs="$3" size="$4"
-       local dev_info="$(parted -s $device print)"
+       local device="$1" table="$2" boot_fs="$3" size="$4" dev_info=""
+       dev_info="$(parted -s "$device" print)"
 
        msg "Auto Partition" "\nRemoving partitions on $device and setting table to $table\n" 1
 
        swapoff -a
        while read -r PART; do
-               parted -s $device rm $PART >/dev/null 2>&1
+               parted -s "$device" rm "$PART" >/dev/null 2>&1
        done <<< "$(awk '/^ [1-9][0-9]?/ {print $1}' <<< "$dev_info" | sort -r)"
 
-       [[ $(awk '/Table:/ {print $3}' <<< "$dev_info") != "$table" ]] && parted -s $device mklabel $table >/dev/null 2>&1
+       [[ $(awk '/Table:/ {print $3}' <<< "$dev_info") != "$table" ]] && parted -s "$device" mklabel "$table" >/dev/null 2>&1
 
        msg "Auto Partition" "\nCreating a 512M $boot_fs boot partition.\n" 1
        if [[ $SYS == "BIOS" ]]; then
-               parted -s $device mkpart primary $boot_fs 1MiB 513MiB >/dev/null 2>&1
+               parted -s "$device" mkpart primary "$boot_fs" 1MiB 513MiB >/dev/null 2>&1
        else
-               parted -s $device mkpart ESP $boot_fs 1MiB 513MiB >/dev/null 2>&1
+               parted -s "$device" mkpart ESP "$boot_fs" 1MiB 513MiB >/dev/null 2>&1
        fi
 
        sleep 0.5
        BOOT_DEV="$device"
-       AUTO_BOOT_PART=$(lsblk -lno NAME,TYPE $device | awk 'NR==2 {print "/dev/" $1}')
+       AUTO_BOOT_PART=$(lsblk -lno NAME,TYPE "$device" | awk 'NR==2 {print "/dev/" $1}')
 
        if [[ $SYS == "BIOS" ]]; then
-               mkfs.ext4 -q $AUTO_BOOT_PART >/dev/null 2>&1
+               mkfs.ext4 -q "$AUTO_BOOT_PART" >/dev/null 2>&1
        else
-               mkfs.vfat -F32 $AUTO_BOOT_PART >/dev/null 2>&1
+               mkfs.vfat -F32 "$AUTO_BOOT_PART" >/dev/null 2>&1
        fi
 
        msg "Auto Partition" "\nCreating a $size ext4 root partition.\n" 0
-       parted -s $device mkpart primary ext4 513MiB 100% >/dev/null 2>&1
+       parted -s "$device" mkpart primary ext4 513MiB 100% >/dev/null 2>&1
        sleep 0.5
-       AUTO_ROOT_PART="$(lsblk -lno NAME,TYPE $device | awk 'NR==3 {print "/dev/" $1}')"
-       mkfs.ext4 -q $AUTO_ROOT_PART >/dev/null 2>&1
-       tput civis
+       AUTO_ROOT_PART="$(lsblk -lno NAME,TYPE "$device" | awk 'NR==3 {print "/dev/" $1}')"
+       mkfs.ext4 -q "$AUTO_ROOT_PART" >/dev/null 2>&1
        sleep 0.5
        FORMATTED+="$AUTO_BOOT_PART $AUTO_ROOT_PART "
-       msg "Auto Partition" "\nProcess complete.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE $device)\n"
+       msg "Auto Partition" "\nProcess complete.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE "$device")\n"
 }
 
 part_find()
 {
-       local str="$1" err=''
+       local regexp="$1" err=''
 
        # string of partitions as /TYPE/PART SIZE
        if [[ $IGNORE_DEV ]]; then
                PARTS="$(lsblk -lno TYPE,NAME,SIZE |
-                       awk "/$str/"' && !'"/$IGNORE_DEV/"' {
+                       awk "/$regexp/"' && !'"/$IGNORE_DEV/"' {
                                sub(/^part/, "/dev/")
                                sub(/^lvm|^crypt/, "/dev/mapper/")
                                print $1$2, $3
                        }')"
        else
                PARTS="$(lsblk -lno TYPE,NAME,SIZE |
-                       awk "/$str/"' {
+                       awk "/$regexp/"' {
                                sub(/^part/, "/dev/")
                                sub(/^lvm|^crypt/, "/dev/mapper/")
                                print $1$2 " " $3
@@ -937,11 +870,10 @@ part_find()
        fi
 
        # number of partitions total
-       if [[ $PARTS ]]; then
-               COUNT=$(wc -l <<< "$PARTS")
-       else
-               COUNT=0
-       fi
+       COUNT=0
+       while read -r line; do
+               (( COUNT++ ))
+       done <<< "$PARTS"
 
        # ensure we have enough partitions for the system and action type
        case "$str" in
@@ -958,18 +890,17 @@ part_find()
 
 part_mount()
 {
-       local part="$1"
-       local mountp="${MNT}$2"
-       local fs="$(lsblk -lno FSTYPE $part)"
+       local part="$1" mountp="${MNT}$2" fs=""
+       fs="$(lsblk -lno FSTYPE "$part")"
        mkdir -p "$mountp"
 
        if [[ $fs && ${FS_OPTS[$fs]} && $part != "$BOOT_PART" ]] && select_mntopts "$fs"; then
-               mount -o $MNT_OPTS "$part" "$mountp" >/dev/null 2>&1
+               mount -o "$MNT_OPTS" "$part" "$mountp" >/dev/null 2>&1
        else
                mount "$part" "$mountp" >/dev/null 2>&1
        fi
 
-       part_mountconf $part "$mountp" || return 1
+       part_mountconf "$part" "$mountp" || return 1
        part_cryptlv "$part"
 
        return 0
@@ -977,15 +908,77 @@ part_mount()
 
 part_format()
 {
-       local part="$1" fs="$2" delay="$3" fscmd="${FS_CMDS[$2]}"
+       local part="$1" fs="$2" delay="$3"
 
        msg "Format" "\nFormatting $part as $fs\n" 0
+       ${FS_CMDS[$fs]} "$part" >/dev/null 2>$ERR
+       errshow "${FS_CMDS[$fs]} $part" || return 1
+       FORMATTED+="$part "
+       sleep "${delay:-0}"
+}
 
-       $fscmd "$part" >/dev/null 2>$ERR
-       errshow "$fscmd $part" || return 1
+part_shrink()
+{
+       part=""
+       typeset -i size num
+       local device="$1" fs=""
 
-       FORMATTED+="$part "
-       sleep ${delay:-0}
+       part_find "${device##*/}[^ ]" || return 1
+       (( COUNT == 1 )) && part="$(awk '{print $1}' <<< "${PARTS[@]}" )"
+       
+       if (( COUNT == 1 )) || dlg part menu "Resize" "\nWhich partition on $device do you want to resize?" $PARTS; then
+               fs=$(lsblk -lno FSTYPE "$part")
+               case "$fs" in
+                       ext*|ntfs)
+                               msg "Resize" "\nGathering device size info.\n" 0
+                               num="${part: -1}"
+                               end=$(parted -s "$device" unit KiB print | awk '/^\s*'"$num"'/ {print $3}')                    # part size in KiB
+                               devsize=$(parted -s "$device" unit KiB print | awk '/Disk '"${device//\//\\/}"':/ {print $3}') # whole device size in KiB
+                               mount "$part" $MNT >/dev/null 2>&1; sleep 0.5
+                               min=$(df --output=used --block-size=MiB "$part" | awk 'NR == 2 {print int($1) + 256}')
+                               max=$(df --output=avail --block-size=MiB "$part" | awk 'NR == 2 {print int($1)}')
+                               umount_dir $MNT
+                               tput cnorm
+                               if dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " Resize: $part " --rangebox "$_resize" 17 "$COLUMNS" "$min" "$max" $((max / 2)) 2>$ANS; then
+                                       size=$(< "$ANS")
+                                       size=$((size * 1024))
+                               else
+                                       return 1
+                               fi
+                               clear
+                               case "$fs" in
+                                       ntfs)
+                                               if ntfsresize -fc "$part"; then
+                                                       ntfsresize -ff --size $(( (size * 1024) / 1000 ))k "$part" 2>$ERR # k=10^3 bytes
+                                                       errshow "ntfsresize -f -s $(( (size * 1024) / 1000 ))k $part" || return 1
+                                               else
+                                                       msg "Resize" "\nThe ntfs partition $part cannot be resized because it is scheduled for a consistency check.\n\nTo do a consistency check in windows open command prompt as admin and run:\n\n\tchkdsk /f /r /x\n"
+                                                       return 1
+                                               fi
+                                               ;;
+                                       *)
+                                               e2fsck -f "$part"; sleep 0.5
+                                               resize2fs -f "$part" ${size}K 2>$ERR # K=2^10 bytes
+                                               errshow "resize2fs -f $part ${size}K" || return 1
+                                               ;;
+                               esac
+                               sleep 0.5
+                               parted "$device" resizepart "$num" ${size}KiB || return 1
+                               (( size++ ))
+                               sleep 0.5
+                               if [[ $devsize == "$end" ]]; then
+                                       parted -s "$device" mkpart primary ext4 ${size}KiB 100% 2>$ERR
+                                       errshow "parted -s $device mkpart primary ext4 ${size}KiB 100%" || return 1
+                               else
+                                       parted -s "$device" mkpart primary ext4 ${size}KiB ${end}KiB 2>$ERR
+                                       errshow "parted -s $device mkpart primary ext4 ${size}KiB ${end}KiB" || return 1
+                               fi
+                               msg "Resize Complete" "\n$part has been successfully resized to $((size / 1024))M.\n" 1
+                               ;;
+                       "") msg "No Filesystem" "\nFor unformatted partitions, cfdisk can be used in the partition menu.\n" ;;
+                       *) msg "Invalid Filesystem: $fs" "\nResizing only supports ext and ntfs.\n" ;;
+               esac
+       fi
 }
 
 part_device()
@@ -993,7 +986,6 @@ part_device()
        if [[ $DEV_COUNT -eq 1 && $SYS_DEVS ]]; then
                DEVICE="$(awk '{print $1}' <<< "$SYS_DEVS")"
        elif (( DEV_COUNT > 1 )); then
-               tput civis
                if [[ $1 ]]; then
                        dlg DEVICE menu "Boot Device" "\nSelect the device to use for bootloader install." $SYS_DEVS
                else
@@ -1001,7 +993,7 @@ part_device()
                fi
                [[ $DEVICE ]] || return 1
        elif [[ $DEV_COUNT -lt 1 && ! $1 ]]; then
-               msg "Installation Error" "\nNo available devices.\n\nExiting..\n" 2; die 1
+               msg "Device Error" "\nNo available devices.\n\nExiting..\n" 2; die 1
        fi
 
        [[ $1 ]] && BOOT_DEV="$DEVICE"
@@ -1011,9 +1003,9 @@ part_device()
 
 part_bootdev()
 {
-       msg "Boot Device" "\nSetting device flags for: $BOOT_PART\n" 1
-       [[ $BOOT_PART = /dev/nvme* ]] && BOOT_DEV="${BOOT_PART%p[1-9]}" || BOOT_DEV="${BOOT_PART%[1-9]}"
+       BOOT_DEV="${BOOT_PART%[1-9]}"
        BOOT_PART_NUM="${BOOT_PART: -1}"
+       [[ $BOOT_PART = /dev/nvme* ]] && BOOT_DEV="${BOOT_PART%p[1-9]}"
        if [[ $SYS == 'UEFI' ]]; then
                parted -s $BOOT_DEV set $BOOT_PART_NUM esp on >/dev/null 2>&1
        else
@@ -1024,8 +1016,8 @@ part_bootdev()
 
 part_cryptlv()
 {
-       local part="$1"
-       local devs="$(lsblk -lno NAME,FSTYPE,TYPE)"
+       local part="$1" devs=""
+       devs="$(lsblk -lno NAME,FSTYPE,TYPE)"
 
        # Identify if $part is LUKS+LVM, LVM+LUKS, LVM alone, or LUKS alone
        if lsblk -lno TYPE "$part" | grep -q 'crypt'; then
@@ -1097,7 +1089,7 @@ part_mountconf()
 
 select_menu()
 {
-       check_background_install || return 0
+       is_bg_install || return 0
        lvm_detect
        umount_dir $MNT
        part_find 'part|lvm|crypt' || { SEL=2; return 1; }
@@ -1120,7 +1112,6 @@ select_menu()
 
        select_swap || return 1
        select_extra_partitions || return 1
-
        install_background || return 1
 
        return 0
@@ -1128,7 +1119,6 @@ select_menu()
 
 select_swap()
 {
-       tput civis
        dlg SWAP_PART menu "Swap Setup" "\nSelect whether to use a swapfile, swap partition, or none." \
                "none" "Don't allocate any swap space" \
                "swapfile" "Allocate $SYS_MEM at /swapfile" \
@@ -1138,12 +1128,10 @@ select_swap()
                SWAP_PART=''
                return 0
        elif [[ $SWAP_PART == "swapfile" ]]; then
-               tput cnorm
                local i=0
                until [[ ${SWAP_SIZE:0:1} =~ [1-9] && ${SWAP_SIZE: -1} =~ (M|G) ]]; do
                        (( i > 0 )) && msg "Swap Size Error" "\nSwap size must be 1(M|G) or greater, and can only contain whole numbers\n\nSize entered: $SWAP_SIZE\n" 2
-                       dlg SWAP_SIZE input "Swap Setup" "$_swapsize" "$SYS_MEM"
-                       [ $? -eq 0 ] || { SWAP_PART=''; SWAP_SIZE=''; return 1; }
+                       dlg SWAP_SIZE input "Swap Setup" "$_swapsize" "$SYS_MEM" || { SWAP_PART=''; SWAP_SIZE=''; return 1; }
                        (( i++ ))
                done
                part_swap "$MNT/$SWAP_PART"
@@ -1181,12 +1169,10 @@ select_mntopts()
 select_mountpoint()
 {
        EXMNT=''
-       tput cnorm
        until [[ $EXMNT ]]; do
-               dlg EXMNT input "Extra Mount $part" "$_exmnt" "/"
-               [ $? -eq 0 ] || return 1
+               dlg EXMNT input "Extra Mount $part" "$_exmnt" "/" || return 1
                if [[ ${EXMNT:0:1} != "/" || ${#EXMNT} -le 1 || $EXMNT =~ \ |\' || $EXMNTS == *"$EXMNT"* ]]; then
-                       msg "Installation Error" "$_errexpart"
+                       msg "Mountpoint Error" "$_errexpart"
                        EXMNT=''
                fi
        done
@@ -1195,17 +1181,16 @@ select_mountpoint()
 
 select_filesystem()
 {
-       local part="$1" fs=''
-       local cur="$(lsblk -lno FSTYPE "$part" 2>/dev/null)"
+       local part="$1" fs='' cur=''
        local txt="\nSelect which filesystem to use for: $part\n\nDefault:  ext4"
+       cur="$(lsblk -lno FSTYPE "$part" 2>/dev/null)"
 
        until [[ $fs ]]; do
                if [[ $cur && ($part != "$ROOT_PART" || $FORMATTED == *"$part"*) ]]; then
-                       dlg fs menu "Filesystem" "$txt\nCurrent:  $cur" skip - ext4 - ext3 - ext2 - vfat - ntfs - f2fs - jfs - xfs - nilfs2 - reiserfs -
+                       dlg fs menu "Filesystem" "$txt\nCurrent:  $cur" skip - ext4 - ext3 - ext2 - vfat - ntfs - f2fs - jfs - xfs - nilfs2 - reiserfs - || return 1
                else
-                       dlg fs menu "Filesystem" "$txt" ext4 - ext3 - ext2 - vfat - ntfs - f2fs - jfs - xfs - nilfs2 - reiserfs -
+                       dlg fs menu "Filesystem" "$txt" ext4 - ext3 - ext2 - vfat - ntfs - f2fs - jfs - xfs - nilfs2 - reiserfs - || return 1
                fi
-               [ $? -eq 0 ] || return 1
                [[ $fs == 'skip' ]] && return 0
                yesno "Filesystem" "\nFormat $part as $fs?\n" || fs=''
        done
@@ -1214,15 +1199,22 @@ select_filesystem()
 
 select_efi_partition()
 {
-       tput civis
+       local pts size dev isize bsize ptcount=0
 
-       if (( COUNT == 1 )); then
-               BOOT_PART="$(awk 'NF > 0 {print $1}' <<< "$PARTS")"
-       elif [[ $AUTO_BOOT_PART ]]; then
-               BOOT_PART="$AUTO_BOOT_PART"
-               return 0 # were done here
+       # walk partition list and skip ones that are too small/big for boot
+       while read -r dev size; do
+               size_t="${size: -1:1}"  # size type eg. K, M, G, T
+               isize=${size:0:-1}      # remove trailing size type character
+               isize=${isize%.*}       # remove any decimal (round down)
+               [[ $size_t =~ [KT] || ($size_t == 'G' && $isize -gt 2) || ($size_t == 'M' && $isize -lt 100) ]] || { pts+="$dev $size "; (( ptcount++ )); }
+       done <<< "$PARTS"
+
+       if [[ $AUTO_BOOT_PART ]]; then
+               BOOT_PART="$AUTO_BOOT_PART"; return 0 # were done here
+       elif (( ptcount == 1 )); then
+               BOOT_PART="$(awk 'NF > 0 {print $1}' <<< "$pts")"
        else
-               dlg BOOT_PART menu "EFI Partition" "$_uefi" $PARTS
+               dlg BOOT_PART menu "EFI Partition" "$_uefi" $pts
        fi
 
        [[ $BOOT_PART ]] || return 1
@@ -1241,13 +1233,23 @@ select_efi_partition()
 
 select_boot_partition()
 {
+       local pts size dev isize bsize ptcount=0
+
+       # walk partition list and skip ones that are too small/big for boot
+       while read -r dev size; do
+               size_t="${size: -1:1}"  # size type eg. K, M, G, T
+               isize=${size:0:-1}      # remove trailing size type character
+               isize=${isize%.*}       # remove any decimal (round down)
+               [[ $size_t =~ [KT] || ($size_t == 'G' && $isize -gt 2) || ($size_t == 'M' && $isize -lt 100) ]] || { pts+="$dev $size "; (( ptcount++ )); }
+       done <<< "$PARTS"
+
        if [[ $AUTO_BOOT_PART && ! $LVM ]]; then
                BOOT_PART="$AUTO_BOOT_PART"; return 0 # were done here
        elif [[ $LUKS && ! $LVM ]]; then
-               dlg BOOT_PART menu "Boot Partition" "$_biosluks" $PARTS
+               dlg BOOT_PART menu "Boot Partition" "$_biosluks" $pts
                [[ $BOOT_PART ]] || return 1
        else
-               dlg BOOT_PART menu "Boot Partition" "$_bios" "skip" "don't use a separate boot" $PARTS
+               dlg BOOT_PART menu "Boot Partition" "$_bios" "skip" "don't use a separate boot" $pts
                [[ -z $BOOT_PART || $BOOT_PART == "skip" ]] && { BOOT_PART=''; return 0; }
        fi
 
@@ -1264,14 +1266,25 @@ select_boot_partition()
 
 select_root_partition()
 {
-       if [[ $AUTO_ROOT_PART && ! $LVM && ! $LUKS ]]; then
+       local pts size dev isize bsize ptcount=0
+
+       # walk partition list and skip ones that are too small for / (root)
+       while read -r dev size; do
+               size_t="${size: -1:1}"  # size type eg. K, M, G, T
+               isize=${size:0:-1}      # remove trailing size type character
+               isize=${isize%.*}       # remove any decimal (round down)
+               [[ $size_t =~ [MK] || ($size_t == 'G' && $isize -lt 4) ]] || { pts+="$dev $size "; (( ptcount++ )); }
+       done <<< "$PARTS"
+
+       if [[ $AUTO_ROOT_PART && -z $LVM && -z $LUKS ]]; then
                ROOT_PART="$AUTO_ROOT_PART"
-       elif (( COUNT == 1 )); then
-               ROOT_PART="$(awk 'NR==1 {print $1}' <<< "$PARTS")"
+               part_mount "$ROOT_PART" || { ROOT_PART=''; return 1; }
+               return 0  # we're done here
+       elif (( ptcount == 1 )); then  # only one available device
+               ROOT_PART="$(awk 'NR==1 {print $1}' <<< "$pts")"
        else
-               dlg ROOT_PART menu "Mount Root" "\nSelect the root (/) partition, this is where $DIST will be installed." $PARTS
+               dlg ROOT_PART menu "Mount Root" "\nSelect the root (/) partition, this is where $DIST will be installed.\n\nDevices smaller than 8G will not be shown here." $pts
        fi
-
        [[ $ROOT_PART ]] || return 1
 
        select_filesystem "$ROOT_PART" || { ROOT_PART=''; return 1; }
@@ -1282,13 +1295,17 @@ select_root_partition()
 
 select_extra_partitions()
 {
-       local part
+       local part pts size dev isize bsize ptcount=0
 
-       while (( COUNT > 0 )); do
+       # walk partition list and skip ones that are too small to be usable
+       while read -r dev size; do
+               [[ ${size: -1:1} =~ [KM] ]] || { pts+="$dev $size "; (( ptcount++ )); }
+       done <<< "$PARTS"
+
+       while (( ptcount > 0 )); do
                part=''
-               tput civis
-               dlg part menu 'Mount Boot' "$_expart" 'done' 'finish mounting step' $PARTS
-               if [[ $part == 'done' || -z $part ]]; then
+               dlg part menu 'Mount Extra' "$_expart" 'done' 'finish mounting step' $pts || break
+               if [[ $part == 'done' ]]; then
                        break
                elif select_filesystem "$part" && select_mountpoint && part_mount "$part" "$EXMNT"; then
                        EXMNTS+="$part: $EXMNT "
@@ -1297,7 +1314,6 @@ select_extra_partitions()
                        return 1
                fi
        done
-
        return 0
 }
 
@@ -1312,7 +1328,6 @@ install_main()
        genfstab -U $MNT >$MNT/etc/fstab 2>$ERR
        errshow 1 "genfstab -U $MNT >$MNT/etc/fstab"
        [[ -f $MNT/swapfile ]] && sed -i "s~${MNT}~~" $MNT/etc/fstab
-       install_mirrorlist
        install_packages
        install_mkinitcpio
        install_boot
@@ -1322,7 +1337,7 @@ install_main()
        chrun "chown -Rf $NEWUSER:users /home/$NEWUSER"
        sleep 1
 
-       while true; do
+       while :; do
                dlg choice menu "Finalization" "$_edit" \
                        finished   "exit the installer and reboot" \
                        keyboard   "${EDIT_FILES[keyboard]}" \
@@ -1337,7 +1352,7 @@ install_main()
                        pacman     "${EDIT_FILES[pacman]}" \
                        login      "${EDIT_FILES[login]}"
 
-               if [[ -z $choice || $choice == "finished" ]]; then
+               if [[ -z $choice || $choice == 'finished' ]]; then
                        [[ $DEBUG == true && -r $DBG ]] && vim $DBG
                        die 127
                else
@@ -1348,7 +1363,7 @@ install_main()
                        if [[ $exists ]]; then
                                vim -O $exists
                        else
-                               msg "File Error" "\nFile(s) do not exist.\n"
+                               msg "File Missing" "\nThe file(s) selected do not exist:\n\n${EDIT_FILES[$choice]}\n"
                        fi
                fi
        done
@@ -1356,31 +1371,39 @@ install_main()
 
 install_base()
 {
-       if [[ $RSYNC_PID ]]; then
-               while kill -0 $RSYNC_PID 2>/dev/null; do
-                       clear
-                       printf "\nSystem base is still unpacking...\n"
-                       sleep 1
+       if [[ $RSYNC_PID || $MIRROR_PID ]]; then
+               clear
+               printf "\nOne or more background install processes are still running, grabbing their output...\n"
+               sleep 2
+               while kill -0 "$RSYNC_PID" 2>/dev/null || kill -0 "$MIRROR_PID" 2>/dev/null; do
+                       tail -n 1 /tmp/bg_out
+                       sleep 0.5
                done
                trap - EXIT
-               unset RSYNC_PID
-       elif [[ -d /run/archiso/sfs/airootfs/etc/skel ]]; then
+               unset RSYNC_PID MIRROR_PID
+       elif hash rsync >/dev/null 2>&1 && [[ -d /run/archiso/sfs/airootfs/etc/skel ]]; then
                rsync -ahv /run/archiso/sfs/airootfs/ $MNT/ 2>$ERR
                errshow 1 "rsync -ahv /run/archiso/sfs/airootfs/ $MNT/"
+               install_mirrorlist "$MNT/etc/pacman.d/mirrorlist"
+               chrun "pacman -Syyu --noconfirm && pacman -S $BASE_PKGS --needed --noconfirm"
        else
-               install_mirrorlist
-               pacstrap $MNT base $KERNEL $UCODE $ISO_BASE 2>$ERR
-               errshow 1 "pacstrap $MNT base $KERNEL $UCODE $ISO_BASE"
+               mkdir -p /etc/pacman.d/mirrorlist
+               install_mirrorlist "/etc/pacman.d/mirrorlist"
+               pacstrap "$MNT" base $ISO_BASE 2>$ERR
+               errshow 1 "pacstrap $MNT base $KERNEL $ISO_BASE"
+               mkdir -p "$MNT/etc/pacman.d/mirrorlist"
+               cp -f /etc/pacman.d/mirrorlist "$MNT/etc/pacman.d/mirrorlist"
+               chrun "pacman -Syyu --noconfirm && pacman -S $BASE_PKGS --needed --noconfirm"
        fi
 
        rm -rf $MNT/etc/mkinitcpio-archiso.conf
        find $MNT/usr/lib/initcpio -name 'archiso*' -type f -delete
        sed -i 's/volatile/auto/g' $MNT/etc/systemd/journald.conf
+       find $MNT/boot -name '*-ucode.img' -delete
 
        if [[ $VM ]]; then
-               rm -rfv $MNT/etc/X11/xorg.conf.d/*?.conf
-               sleep 1
-       elif [[ "$(lspci | grep ' VGA ' | grep 'Intel')" ]]; then
+               find $MNT/etc/X11/xorg.conf.d/ -name '*.conf' -delete
+       elif lspci | grep ' VGA ' | grep -q 'Intel'; then
                cat > $MNT/etc/X11/xorg.conf.d/20-intel.conf << EOF
 Section "Device"
        Identifier  "Intel Graphics"
@@ -1390,18 +1413,13 @@ EndSection
 EOF
        fi
 
-       if [[ -e /run/archiso/sfs/airootfs ]]; then
-               [[ $KERNEL == 'linux' ]] && cp -vf $RUN/x86_64/vmlinuz $MNT/boot/vmlinuz-linux
-               [[ $UCODE ]] && cp -vf $RUN/${UCODE/-/_}.img $MNT/boot/$UCODE.img
-       fi
+       [[ -e /run/archiso/sfs/airootfs && $KERNEL == 'linux' ]] && cp -vf $RUN/x86_64/vmlinuz $MNT/boot/vmlinuz-linux
 
        cp -fv /etc/resolv.conf $MNT/etc/
-       if [[ -e /etc/NetworkManager/system-connections ]]; then
-               cp -rvf /etc/NetworkManager/system-connections $MNT/etc/NetworkManager/
-       fi
+       [[ -e /etc/NetworkManager/system-connections ]] && cp -rvf /etc/NetworkManager/system-connections $MNT/etc/NetworkManager/
 
        echo "LANG=$MYLOCALE" > $MNT/etc/locale.conf
-       echo "LANG=$MYLOCALE" > $MNT/etc/default/locale
+       cp -f $MNT/etc/locale.conf $MNT/etc/default/locale
        sed -i "s/#en_US.UTF-8/en_US.UTF-8/g; s/#${MYLOCALE}/${MYLOCALE}/g" $MNT/etc/locale.gen
        chrun "locale-gen"
        chrun "ln -svf /usr/share/zoneinfo/$ZONE/$SUBZ /etc/localtime"
@@ -1437,7 +1455,6 @@ EOF
 ff02::1                ip6-allnodes
 ff02::2                ip6-allrouters
 EOF
-
 }
 
 install_boot()
@@ -1451,8 +1468,10 @@ install_boot()
        fi
 
        if [[ $SYS == 'UEFI' ]]; then
-               find $MNT/$BOOTDIR/EFI/ -maxdepth 1 -mindepth 1 -iname "$DIST" -type d -delete >/dev/null 2>&1
-               find $MNT/$BOOTDIR/EFI/ -maxdepth 1 -mindepth 1 -iname 'boot' -type d -delete >/dev/null 2>&1
+               # our old installs
+               find $MNT/$BOOTDIR/EFI/ -maxdepth 1 -mindepth 1 -iname "$DIST" -type d -delete
+               # generic BOOT/ dir
+               find $MNT/$BOOTDIR/EFI/ -maxdepth 1 -mindepth 1 -iname 'BOOT' -type d -delete
        fi
 
        prerun_$BOOTLDR
@@ -1460,8 +1479,8 @@ install_boot()
        errshow 1 "${BCMDS[$BOOTLDR]}"
 
        if [[ -d $MNT/hostrun ]]; then
-               umount $MNT/hostrun/udev >/dev/null 2>&1
-               umount $MNT/hostrun/lvm >/dev/null 2>&1
+               # cleanup the bind mounts we made earlier for the grub-probe module
+               umount_dir $MNT/hostrun/{udev,lvm}
                rm -rf $MNT/hostrun >/dev/null 2>&1
        fi
 
@@ -1486,12 +1505,11 @@ install_user()
 {
        chrun "chpasswd <<< 'root:$ROOT_PASS'" 2>$ERR
        errshow 1 "set root password"
-       if [[ $MYSHELL != *zsh ]]; then
+       if [[ $MYSHELL != "/usr/bin/zsh" ]]; then
+               # root uses zsh by default, change it if something else was chosen
                chrun "usermod -s $MYSHELL root" 2>$ERR
                errshow 1 "usermod -s $MYSHELL root"
-               if [[ $MYSHELL == "/usr/bin/mksh" ]]; then
-                       cp -fv $MNT/etc/skel/.mkshrc /root/.mkshrc
-               fi
+               [[ $MYSHELL == '/usr/bin/mksh' ]] && cp -fv $MNT/etc/skel/.mkshrc $MNT/root/.mkshrc
        fi
 
        local groups='audio,autologin,floppy,log,network,rfkill,scanner,storage,optical,power,wheel'
@@ -1503,57 +1521,27 @@ install_user()
        chrun "chpasswd <<< '$NEWUSER:$USER_PASS'" 2>$ERR
        errshow 1 "set $NEWUSER password"
 
-       if [[ $USER_PKGS == *neovim* ]]; then
+       if [[ $USER_PKGS == *neovim* && -d $MNT/home/$NEWUSER/.vim ]]; then
                mkdir -p $MNT/home/$NEWUSER/.config/nvim
                cp -fv $MNT/home/$NEWUSER/.vimrc $MNT/home/$NEWUSER/.config/nvim/init.vim
                cp -rfv $MNT/home/$NEWUSER/.vim/colors $MNT/home/$NEWUSER/.config/nvim/colors
        fi
 
-       if [[ $MYSHELL == '/usr/bin/mksh' ]]; then
-               cat >> $MNT/home/$NEWUSER/.mkshrc << EOF
-# colors in less (manpager)
-export LESS_TERMCAP_mb=$'\e[01;31m'
-export LESS_TERMCAP_md=$'\e[01;31m'
-export LESS_TERMCAP_me=$'\e[0m'
-export LESS_TERMCAP_se=$'\e[0m'
-export LESS_TERMCAP_so=$'\e[01;44;33m'
-export LESS_TERMCAP_ue=$'\e[0m'
-export LESS_TERMCAP_us=$'\e[01;32m'
-
-export EDITOR=$([[ $USER_PKGS == *neovim* ]] && printf "n")vim
-
-# source shell configs
-for f in "\$HOME/.mksh/"*?.sh; do
-       . "\$f"
-done
-
-al-info
-EOF
-       fi
-
        [[ $INSTALL_WMS == *dwm* ]] && install_suckless
-       [[ $LOGIN_WM =~ (startkde|gnome-session) ]] && sed -i '/super/d' $HOME/.xprofile /root/.xprofile
+       [[ $INSTALL_WMS == *awesome* ]] && install_awesome
+       [[ $WM_PKGS == *xfce* ]] && echo 'volumeicon &' >> $MNT/home/$NEWUSER/.xprofile
 
+       # remove some commands from ~/.xprofile when using KDE or Gnome as the login session
+       if [[ $LOGIN_WM =~ (startkde|gnome-session) || ($LOGIN_TYPE == 'lightdm' && $WM_PKGS =~ (plasma|gnome)) ]]; then
+               sed -i '/super/d' $MNT/home/$NEWUSER/.xprofile $MNT/root/.xprofile
+               sed -i '/nitrogen/d' $MNT/home/$NEWUSER/.xprofile $MNT/root/.xprofile
+               sed -i '/al-compositor/d' $MNT/home/$NEWUSER/.xprofile $MNT/root/.xprofile
+               sed -i '/compton/d' $MNT/home/$NEWUSER/.xprofile $MNT/root/.xprofile
+       fi
+       
        return 0
 }
 
-install_login()
-{
-       SERVICE="$MNT/etc/systemd/system/getty@tty1.service.d"
-
-       # remove welcome message
-       sed -i '/printf/d' $MNT/root/.zshrc
-
-       # remove unneeded shell files from installation
-       case $MYSHELL in
-               "/bin/bash") rm -rf $MNT/home/$NEWUSER/.{zsh,mksh}* $MNT/root/.{zsh,mksh}* ;;
-               "/usr/bin/mksh") rm -rf $MNT/home/$NEWUSER/.{zsh,bash}* $MNT/home/$NEWUSER/.inputrc $MNT/root/.{zsh,bash}* $MNT/root/.inputrc ;;
-               "/usr/bin/zsh") rm -rf $MNT/home/$NEWUSER/.{bash,mksh}* $MNT/home/$NEWUSER/.inputrc $MNT/root/.{bash,mksh}* $MNT/root/.inputrc ;;
-       esac
-
-       install_${LOGIN_TYPE:-xinit}
-}
-
 install_xinit()
 {
        if [[ -e $MNT/home/$NEWUSER/.xinitrc ]] && grep -q 'exec' $MNT/home/$NEWUSER/.xinitrc; then
@@ -1566,19 +1554,27 @@ install_xinit()
 
        if [[ $AUTOLOGIN ]]; then
                sed -i "s/root/${NEWUSER}/g" $SERVICE/autologin.conf
-               cat > $MNT/home/$NEWUSER/$LOGINRC << EOF
+               cat > $MNT/home/$NEWUSER/$LOGINRC <<EOF
 # ~/$LOGINRC
 # sourced by ${MYSHELL##*/} when used as a login shell
 
 # automatically run startx when logging in on tty1
-[[ -z \$DISPLAY && \$XDG_VTNR -eq 1 ]] && exec startx -- vt1
+if [ -z \$DISPLAY ] && [ \$XDG_VTNR -eq 1 ]; then
+    exec startx
+fi
 EOF
        else
                rm -rf $SERVICE
-               rm -rf $MNT/home/$NEWUSER/.{profile,zprofile,bash_profile}
        fi
 }
 
+install_login()
+{
+       SERVICE="$MNT/etc/systemd/system/getty@tty1.service.d"
+       sed -i '/printf/d' $MNT/root/.zshrc
+       install_${LOGIN_TYPE:-xinit}
+}
+
 install_lightdm()
 {
        rm -rf $SERVICE
@@ -1589,7 +1585,6 @@ install_lightdm()
 # LightDM GTK+ Configuration
 
 [greeter]
-active-monitor=0
 default-user-image=/usr/share/icons/ArchLabs-Dark/64x64/places/distributor-logo-archlabs.png
 background=/usr/share/backgrounds/archlabs/archlabs.jpg
 theme-name=Adwaita-dark
@@ -1599,41 +1594,84 @@ position=30%,end 50%,end
 EOF
 }
 
+install_awesome()
+{
+       # downloads and sets up @elenapan's awesome WM config hosted on github
+
+       if chrun "git clone https://github.com/elenapan/archlabs-awesome /home/$NEWUSER/archlabs-awesome"; then
+               cp -rT "/mnt/home/$NEWUSER/archlabs-awesome" "/mnt/home/$NEWUSER"
+               cp -rT "/mnt/home/$NEWUSER/archlabs-awesome" /mnt/etc/skel
+               rm -rf "/home/$NEWUSER/"{.git,archlabs-awesome,screenshots}
+               printf "You will need to instal pamac seperately if needed using: 'baph -i pamac-aur'\n"
+               sleep 3
+       else
+               printf "failed to clone awesome config repo\n"
+       fi
+}
+
 install_packages()
 {
-       local inpkg="$BASE_PKGS $PACKAGES $USER_PKGS"
        local rmpkg=""
+       local inpkg="$PACKAGES $USER_PKGS"
+
+       [[ -x $MNT/usr/bin/X ]] || inpkg+=" $BASE_PKGS"
 
        if pacman -Qsq 'archlabs-installer' >/dev/null 2>&1; then
-               rmpkg+="archlabs-installer"
+               rmpkg+=" archlabs-installer"
        elif [[ -e "$MNT/usr/bin/archlabs-installer" ]]; then
                rm -f "$MNT/usr/bin/archlabs-installer"
        fi
 
-       [[ $MYSHELL == *mksh ]] && inpkg+=" mksh"
+       # add extras or missed packages gathered throughout the install
+       [[ $UCODE ]] && inpkg+=" $UCODE"
        [[ $KERNEL == 'linux' ]] || { inpkg+=" $KERNEL"; rmpkg+=" linux"; }
+       [[ $MYSHELL == "/usr/bin/mksh" ]] && inpkg+=" mksh"
+       if [[ $MYSHELL == '/usr/bin/zsh' ]]; then
+               inpkg+=" zsh-completions"
+       else
+               rmpkg+=" zsh"
+       fi
 
-       # add xterm when not installing a terminal emulator or de that provides one
-       [[ $inpkg =~ (term|urxvt|tilix|alacritty|sakura|tilda|plasma|cinnamon) || $INSTALL_WMS == *dwm* ]] || inpkg+=" xterm"
-
-       [[ $MYSHELL == '/usr/bin/zsh' ]] && inpkg+=" zsh-completions"
-       [[ $INSTALL_WMS =~ (openbox|bspwm|i3-gaps|dwm|fluxbox) ]] && inpkg+=" $WM_BASE_PKGS"
+       # packages only installed for certain WM/DE
        [[ $INSTALL_WMS =~ ^(plasma|gnome|cinnamon)$ ]] || inpkg+=" archlabs-ksuperkey"
+       [[ $INSTALL_WMS =~ (openbox|bspwm|i3-gaps|dwm|fluxbox) ]] && inpkg+=" $WM_BASE_PKGS"
+
+       # ensure a terminal gets installed
+       [[ $inpkg =~ (term|urxvt|tilix|alacritty|sakura|tilda|plasma|cinnamon) || $INSTALL_WMS == *dwm* ]] || inpkg+=" xterm"
 
+       # update fully first to avoid issues
        chrun "pacman -Syyu --noconfirm"
-       chrun "pacman -Rns $rmpkg --noconfirm"
+
+       # remove packages we no longer want
+       [[ $rmpkg ]] && chrun "pacman -Rns $rmpkg --noconfirm"
+
+       # for some reason the user has "no network" after install even though the
+       # system is connected, reinstalling iputils fixes it
        chrun "pacman -S iputils --noconfirm"
-       chrun "pacman -S $inpkg --needed --noconfirm"
 
+       # install all the packages chosen throughout the install
+       chrun "pacman -S $inpkg --needed --noconfirm" 2>$ERR
+       errshow 1 "pacman -S $inpkg --needed --noconfirm"
+
+       # extras for bootloaders
        if [[ $BOOTLDR == 'grub' ]]; then
-               chrun "pacman -S grub os-prober efibootmgr --needed --noconfirm"
+               if [[ $SYS == 'BIOS' ]]; then
+                       chrun "pacman -S grub os-prober --needed --noconfirm" 2>$ERR
+                       errshow 1 "pacman -S grub os-prober --needed --noconfirm"
+               else
+                       chrun "pacman -S grub os-prober efibootmgr --needed --noconfirm" 2>$ERR
+                       errshow 1 "pacman -S grub os-prober efibootmgr --needed --noconfirm"
+               fi
        elif [[ $BOOTLDR == 'refind-efi' ]]; then
-               chrun "pacman -S refind-efi efibootmgr --needed --noconfirm"
+               chrun "pacman -S refind-efi efibootmgr --needed --noconfirm" 2>$ERR
+               errshow 1 "pacman -S refind-efi efibootmgr --needed --noconfirm"
        elif [[ $SYS == 'UEFI' ]]; then
-               chrun "pacman -S efibootmgr --needed --noconfirm"
+               chrun "pacman -S efibootmgr --needed --noconfirm" 2>$ERR
+               errshow 1 "pacman -S efibootmgr --needed --noconfirm"
        fi
 
        sed -i "s/# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/g" $MNT/etc/sudoers
+
        return 0
 }
 
@@ -1642,34 +1680,28 @@ install_suckless()
        mkdir -pv $MNT/home/$NEWUSER/suckless
 
        for i in dwm dmenu st; do
-               if chrun "git clone https://bitbucket.org/natemaia/$i /home/$NEWUSER/suckless/$i"; then
-                       chrun "cd /home/$NEWUSER/suckless/$i; rm -f config.h; make clean install; make clean"
+               if chrun "git clone https://git.suckless.org/$i /home/$NEWUSER/suckless/$i"; then
+                       chrun "cd /home/$NEWUSER/suckless/$i; make PREFIX=/usr install; make clean; rm config.h"
                else
-                       printf "failed to clone $i repo\n"
+                       printf "failed to clone %s repo\n" "$i"
                fi
        done
 
        if [[ -d $MNT/home/$NEWUSER/suckless/dwm && -x $MNT/usr/bin/dwm ]]; then
-               printf "To configure dwm edit /home/$NEWUSER/suckless/dwm/config.h\n"
+               printf "To configure dwm edit %s\n" "/home/$NEWUSER/suckless/dwm/config.h"
                printf "You can then recompile it with 'sudo make clean install'\n"
                sleep 2
        fi
 }
 
-install_mirrorlist()
-{
-       if hash reflector >/dev/null 2>&1; then
-               $MIRROR_CMD --save $MNT/etc/pacman.d/mirrorlist --verbose || reflector --score 100 -l 50 -f 10 --sort rate --verbose --save $MNT/etc/pacman.d/mirrorlist
-       else
-               { eval $MIRROR_CMD || curl -s 'https://www.archlinux.org/mirrorlist/all/'; } |
-                       sed -e 's/^#Server/Server/' -e '/^#/d' | rankmirrors -v -t -n 10 - > $MNT/etc/pacman.d/mirrorlist
-       fi
-}
-
 install_mkinitcpio()
 {
        local add=''
+
+       # luks keyfile creation
+       # currently not used due to not prompting for passphrase on startup
        # [[ $LUKS_UUID && $LUKS_PASS && $SYS == 'UEFI' && $BOOTLDR == 'grub' ]] && luks_keyfile
+
        [[ $LUKS ]] && add="encrypt"
        [[ $LVM ]] && { [[ $add ]] && add+=" lvm2" || add+="lvm2"; }
        sed -i "s/block filesystems/block ${add} filesystems ${HOOKS}/g" $MNT/etc/mkinitcpio.conf
@@ -1677,13 +1709,45 @@ install_mkinitcpio()
        errshow 1 "mkinitcpio -p $KERNEL"
 }
 
+install_mirrorlist()
+{
+       local mfile="$1"  # output mirrorlist file
+
+       if hash reflector >/dev/null 2>&1; then
+               reflector --score 120 -l 50 -f 5 --sort rate --save "$mfile"
+       elif hash rankmirrors >/dev/null 2>&1; then
+               ip_add="$(curl -fsSL "http://api.ipstack.com/check&?access_key=5f29642060ab983b31fdf4c2935d8c56&fields=ip" |
+                       python -c "import sys, json; print(json.load(sys.stdin)['ip'])")"
+               country="$(curl -fsSL "http://api.ipstack.com/${ip_add}?access_key=5f29642060ab983b31fdf4c2935d8c56&fields=country_code" |
+                       python -c "import sys, json; print(json.load(sys.stdin)['country_code'])")"
+               if [[ "$country" ]]; then
+                       if [[ $country =~ (CA|US) ]]; then
+                               mirror="https://www.archlinux.org/mirrorlist/?country=US&country=CA&use_mirror_status=on"
+                       elif [[ $country =~ (AU|NZ) ]]; then
+                               mirror="https://www.archlinux.org/mirrorlist/?country=AU&country=NZ&use_mirror_status=on"
+                       else
+                               mirror="https://www.archlinux.org/mirrorlist/?country=${country}&use_mirror_status=on"
+                       fi
+               else
+                       mirror="https://www.archlinux.org/mirrorlist/?country=all&use_mirror_status=on"
+               fi
+
+               curl -fsSL "$mirror" | sed -e 's/^#Server/Server/' -e '/^#/d' | rankmirrors -n 6 - >"$mfile"
+       fi
+
+       return 0
+}
+
 install_background()
 {
        if [[ -d /run/archiso/sfs/airootfs/etc/skel ]] && grep -qw "$MNT" /proc/mounts && (grep -qw "$MNT/$BOOTDIR" /proc/mounts || [[ $SYS == 'BIOS' && -z $LUKS ]]); then
-               msg "Background Install" "\nThe system base will now be unpacked in the background.\n" 2
-               rsync -a /run/archiso/sfs/airootfs/ $MNT/ >/dev/null 2>&1 &
+               yesno "Background Install" "\nBegin install in the background?\n" || return 0
+               rsync -a /run/archiso/sfs/airootfs/ $MNT/ &
                RSYNC_PID=$!
-               trap "kill $RSYNC_PID 2>/dev/null" EXIT
+               ( install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" && sleep 1 && mkdir -p $MNT/var/lib/pacman && chrun "pacman -Syyu $BASE_PKGS --needed --noconfirm" >> /tmp/bg_out 2>&1 ) &
+               MIRROR_PID=$!
+               # end the background processes before exiting
+               trap "kill $RSYNC_PID $MIRROR_PID 2>/dev/null" EXIT
        fi
        return 0
 }
@@ -1699,12 +1763,11 @@ setup_grub()
                [[ $BOOT_DEV ]] || { part_device 1 || return 1; }
                BCMDS[grub]="grub-install --recheck --force --target=i386-pc $BOOT_DEV"
        else
-               if [[ $ROOT_PART == */dev/mapper/* && ! $LVM && ! $LUKS_PASS ]]; then
-                       luks_pass "$_luksopen" 1 || return 1
-               fi
+               # if [[ $ROOT_PART == */dev/mapper/* && -z $LVM && -z $LUKS_PASS ]]; then
+               #       luks_pass "$_luksopen" 1 || return 1
+               fi
                BCMDS[grub]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars >/dev/null 2>&1
                grub-install --recheck --force --target=x86_64-efi --efi-directory=/$BOOTDIR --bootloader-id=$DIST"
-
                grep -q /sys/firmware/efi/efivars /proc/mounts || mount -t efivarfs efivarfs /sys/firmware/efi/efivars >/dev/null 2>&1
        fi
 
@@ -1722,20 +1785,21 @@ prerun_grub()
 {
        sed -i "s/GRUB_DISTRIBUTOR=.*/GRUB_DISTRIBUTOR=\"${DIST}\"/g;
        s/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"\"/g" $MNT/etc/default/grub
+
        if [[ $LUKS_DEV ]]; then
                sed -i "s~#GRUB_ENABLE_CRYPTODISK~GRUB_ENABLE_CRYPTODISK~g;
                s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"${LUKS_DEV}\"~g" $MNT/etc/default/grub 2>$ERR
                errshow 1 "sed -i 's~#GRUB_ENABLE_CRYPTODISK~GRUB_ENABLE_CRYPTODISK~g;
                s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"${LUKS_DEV}\"~g' $MNT/etc/default/grub"
        fi
+
        if [[ $SYS == 'BIOS' && $LVM && -z $SEP_BOOT ]]; then
                sed -i "s/GRUB_PRELOAD_MODULES=.*/GRUB_PRELOAD_MODULES=\"lvm\"/g" $MNT/etc/default/grub 2>$ERR
                errshow 1 "sed -i 's/GRUB_PRELOAD_MODULES=.*/GRUB_PRELOAD_MODULES=\"lvm\"/g' $MNT/etc/default/grub"
        fi
 
        # setup for os-prober module
-       mkdir -p /run/{lvm,udev}
-       mkdir -p $MNT/hostrun/{lvm,udev}
+       mkdir -p /run/{lvm,udev} $MNT/hostrun/{lvm,udev}
        mount --bind /run/lvm $MNT/hostrun/lvm
        mount --bind /run/udev $MNT/hostrun/udev
 
@@ -1752,8 +1816,6 @@ prerun_efistub()
        BCMDS[systemd-boot]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars >/dev/null 2>&1
                efibootmgr -v -d $BOOT_DEV -p $BOOT_PART_NUM -c -L '${DIST} Linux' -l /vmlinuz-${KERNEL} \
                -u 'root=$ROOT_PART_ID rw $([[ $UCODE ]] && printf 'initrd=\%s.img ' "$UCODE")initrd=\initramfs-${KERNEL}.img'"
-
-       return 0
 }
 
 setup_syslinux()
@@ -1764,7 +1826,6 @@ setup_syslinux()
                EDIT_FILES[bootloader]="/boot/EFI/syslinux/syslinux.cfg"
                BCMDS[syslinux]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars >/dev/null 2>&1
                efibootmgr -v -c -d $BOOT_DEV -p $BOOT_PART_NUM -l /EFI/syslinux/syslinux.efi -L $DIST"
-
        fi
 }
 
@@ -1906,7 +1967,7 @@ EOF
 
 lvm_menu()
 {
-       check_background_install || return 1
+       is_bg_install || return 1
        lvm_detect
        local choice
        dlg choice menu "Logical Volume Management" "$_lvmmenu" \
@@ -1918,7 +1979,7 @@ lvm_menu()
        case "$choice" in
                "$_lvmnew") lvm_create || return 1 ;;
                "$_lvmdel") lvm_delgroup && yesno "$_lvmdel" "$_lvmdelask" && vgremove -f "$DEL_VG" >/dev/null 2>&1 ;;
-               "$_LvMDelAll") lvm_del_all ;;
+               "$_lvmdelall") lvm_del_all ;;
        esac
 
        return 0
@@ -1926,8 +1987,9 @@ lvm_menu()
 
 lvm_detect()
 {
-       local pv="$(pvs -o pv_name --noheading 2>/dev/null)"
-       local v="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)"
+       local v pv
+       pv="$(pvs -o pv_name --noheading 2>/dev/null)"
+       v="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)"
        VGROUP="$(vgs -o vg_name --noheading 2>/dev/null)"
 
        if [[ $VGROUP && $v && $pv ]]; then
@@ -1960,7 +2022,8 @@ lvm_create()
 get_lv_size()
 {
        local txt="${VGROUP}: ${SIZE}$SIZE_UNIT (${VGROUP_MB}MB remaining).$_lvmlvsize"
-       while true; do
+
+       while :; do
                ERR_SIZE=0
                dlg VOLUME_SIZE input "$_lvmnew (LV:$VOL_COUNT)" "$txt" ''
                if [[ -z $VOLUME_SIZE ]]; then
@@ -1986,7 +2049,11 @@ get_lv_size()
                                esac
                        fi
                fi
-               (( ! ERR_SIZE )) && break || msg "Invalid Logical Volume Size" "$_lvmerrlvsize"
+               if (( ERR_SIZE )); then
+                       msg "Invalid Logical Volume Size" "$_lvmerrlvsize"
+               else
+                       break
+               fi
        done
 
        return $ERR_SIZE
@@ -2021,8 +2088,9 @@ lvm_mkgroup()
 
 lvm_del_all()
 {
-       local pv="$(pvs -o pv_name --noheading 2>/dev/null)"
-       local v="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)"
+       local v pv
+       pv="$(pvs -o pv_name --noheading 2>/dev/null)"
+       v="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)"
        VGROUP="$(vgs -o vg_name --noheading 2>/dev/null)"
 
        if [[ $VGROUP || $v || $pv ]]; then
@@ -2046,7 +2114,7 @@ lvm_delgroup()
        for i in $(lvs --noheadings | awk '{print $2}' | uniq); do
                VOL_GROUP_LIST+="$i $(vgdisplay "$i" | awk '/VG Size/ {print $3$4}') "
        done
-       [[ $VOL_GROUP_LIST ]] || { msg "Installation Error" "\nNo volume groups found."; return 1; }
+       [[ $VOL_GROUP_LIST ]] || { msg "No Groups" "\nNo volume groups found."; return 1; }
 
        dlg DEL_VG menu "Logical Volume Management" "\nSelect volume group to delete.\n\nAll logical volumes within will also be deleted." $VOL_GROUP_LIST
        [[ $DEL_VG ]]
@@ -2075,17 +2143,15 @@ lvm_partitions()
 lvm_group_name()
 {
        VGROUP=''
-
        until [[ $VGROUP ]]; do
                dlg VGROUP input "$_lvmnew" "$_lvmvgname" "mygroup"
                if [[ -z $VGROUP ]]; then
                        return 1
-               elif [[ ${VGROUP:0:1} == "/" || $VGROUP =~ \ |\' ]] || grep -q "$VGROUP" <<< "$(lsblk)"; then
-                       msg "Installation Error" "$_lvmerrvgname"
+               elif [[ ${VGROUP:0:1} == "/" || $VGROUP =~ \ |\' ]] || lsblk | grep -q "$VGROUP"; then
+                       msg "LVM Name Error" "$_lvmerrvgname"
                        VGROUP=''
                fi
        done
-
        return 0
 }
 
@@ -2098,8 +2164,8 @@ lvm_volume_name()
                dlg VNAME input "$_lvmnew (LV:$VOL_COUNT)" "\n$txt" "$default"
                if [[ -z $VNAME ]]; then
                        return 1
-               elif [[ ${VNAME:0:1} == "/" || $VNAME =~ \ |\' ]] || grep -q "$VNAME" <<< "$(lsblk)"; then
-                       msg "Installation Error" "$_lvmerlvname"
+               elif [[ ${VNAME:0:1} == "/" || $VNAME =~ \ |\' ]] || lsblk | grep -q "$VNAME"; then
+                       msg "LVM Name Error" "$_lvmerlvname"
                        VNAME=''
                fi
        done
@@ -2112,7 +2178,7 @@ lvm_volume_name()
 luks_menu()
 {
        local choice
-       check_background_install || return 1
+       is_bg_install || return 1
        dlg choice menu "LUKS Encryption" "$_luksmenu" \
                "$_luksnew"  "cryptsetup -q luksFormat" \
                "$_luksopen" "cryptsetup open --type luks" \
@@ -2130,7 +2196,7 @@ luks_menu()
 
 luks_open()
 {
-       modprobe -a dm-mod dm_crypt
+       modprobe -a dm-mod dm_crypt >/dev/null 2>&1
        umount_dir $MNT
        part_find 'part|crypt|lvm' || return 1
 
@@ -2144,7 +2210,7 @@ luks_open()
 
        luks_pass "$_luksopen" || return 1
        msg "$_luksopen" "\nOpening encrypted partition: $LUKS_NAME\n\nDevice or volume used: $LUKS_PART\n" 0
-       cryptsetup open --type luks $LUKS_PART "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR
+       cryptsetup open --type luks "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR
        errshow "cryptsetup open --type luks $LUKS_PART $LUKS_NAME" || return 1
        LUKS='encrypted'; luks_show
        return 0
@@ -2159,17 +2225,16 @@ luks_pass()
                i=0
                tput cnorm
                if [[ $op ]]; then
-                       dialog --cr-wrap --insecure --backtitle "$DIST Installer - $SYS - v$VER" --separator $'\n' --title " $title " \
+                       dialog --insecure --backtitle "$DIST Installer - $SYS - v$VER" --separator $'\n' --title " $t " \
                                --mixedform "\nEnter the password to decrypt $ROOT_PART\n\nThis is needed to create a keyfile." 0 0 0 \
-                               "Password:"  1 1 '' 1 11 $COLUMNS 0 1 \
-                               "Password2:" 2 1 '' 2 12 $COLUMNS 0 1 2>"$ANS" || return 1
+                               "Password:"  1 1 '' 1 11 "$COLUMNS" 0 1 \
+                               "Password2:" 2 1 '' 2 12 "$COLUMNS" 0 1 2>"$ANS" || return 1
 
                else
-                       dialog --cr-wrap --insecure --backtitle "$DIST Installer - $SYS - v$VER" \
-                               --separator $'\n' --title " $title " --mixedform "$_luksomenu" 0 0 0 \
-                               "Name:"      1 1 "${LUKS_NAME:-cryptroot}" 1 7 $COLUMNS 0 0 \
-                               "Password:"  2 1 ''                        2 11 $COLUMNS 0 1 \
-                               "Password2:" 3 1 ''                        3 12 $COLUMNS 0 1 2>"$ANS" || return 1
+                       dialog --insecure --backtitle "$DIST Installer - $SYS - v$VER" --separator $'\n' --title " $t " --mixedform "$_luksomenu" 0 0 0 \
+                               "Name:"      1 1 "${LUKS_NAME:-cryptroot}" 1  7 "$COLUMNS" 0 0 \
+                               "Password:"  2 1 ''                        2 11 "$COLUMNS" 0 1 \
+                               "Password2:" 3 1 ''                        3 12 "$COLUMNS" 0 1 2>"$ANS" || return 1
 
                fi
 
@@ -2206,12 +2271,12 @@ luks_pass()
 luks_show()
 {
        sleep 0.5
-       msg "$_luksnew" "\nEncrypted partition opened and ready for mounting.\n\n$(lsblk $LUKS_PART -o NAME,MODEL,SIZE,TYPE,FSTYPE)\n\n"
+       msg "$_luksnew" "\nEncrypted partition opened and ready for mounting.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE "$LUKS_PART")\n\n"
 }
 
 luks_setup()
 {
-       modprobe -a dm-mod dm_crypt
+       modprobe -a dm-mod dm_crypt >/dev/null 2>&1
        umount_dir $MNT
        part_find 'part|lvm' || return 1
 
@@ -2231,9 +2296,9 @@ luks_basic()
 {
        luks_setup || return 1
        msg "$_luksnew" "\nCreating encrypted partition: $LUKS_NAME\n\nDevice or volume used: $LUKS_PART\n" 0
-       cryptsetup -q luksFormat $LUKS_PART <<< "$LUKS_PASS" 2>$ERR
+       cryptsetup -q luksFormat "$LUKS_PART" <<< "$LUKS_PASS" 2>$ERR
        errshow "cryptsetup -q luksFormat $LUKS_PART" || return 1
-       cryptsetup open $LUKS_PART "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR
+       cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR
        errshow "cryptsetup open $LUKS_PART $LUKS_NAME" || return 1
        LUKS='encrypted'; luks_show
        return 0
@@ -2262,9 +2327,9 @@ luks_advanced()
                dlg cipher input "LUKS Encryption" "$_lukskey" "-s 512 -c aes-xts-plain64"
                [[ $cipher ]] || return 1
                msg "$_luksadv" "\nCreating encrypted partition: $LUKS_NAME\n\nDevice or volume used: $LUKS_PART\n" 0
-               cryptsetup -q $cipher luksFormat $LUKS_PART <<< "$LUKS_PASS" 2>$ERR
+               cryptsetup -q $cipher luksFormat "$LUKS_PART" <<< "$LUKS_PASS" 2>$ERR
                errshow "cryptsetup -q $cipher luksFormat $LUKS_PART" || return 1
-               cryptsetup open $LUKS_PART "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR
+               cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR
                errshow "cryptsetup open $LUKS_PART $LUKS_NAME" || return 1
                luks_show
                return 0
@@ -2282,94 +2347,67 @@ ofn()
 
 die()
 {
-       local exitcode="$1"
+       local ecode="$1"
 
        trap - INT
        tput cnorm
        if [[ -d $MNT ]] && command cd /; then
                umount_dir $MNT
-               if (( exitcode == 127 )); then
-                       umount -l /run/archiso/bootmnt
+               if (( ecode == 127 )); then
+                       umount_dir /run/archiso/bootmnt
                        sleep 0.5
-                       systemctl -i reboot
+                       reboot -f
                fi
        fi
-
-       # restore custom linux console 0-15 colors when not rebooting
-       if [[ $TERM == 'linux' ]]; then
-               colors=("\e]P0191919" "\e]P1D15355" "\e]P2609960" "\e]P3FFCC66"
-               "\e]P4255A9B" "\e]P5AF86C8" "\e]P62EC8D3" "\e]P7949494" "\e]P8191919" "\e]P9D15355"
-               "\e]PA609960" "\e]PBFF9157" "\e]PC4E88CF" "\e]PDAF86C8" "\e]PE2ec8d3" "\e]PFE1E1E1")
-               printf "%b" "${colors[@]}" && clear && unset col
-       fi
-
-       exit $exitcode
+       termcol
+       exit "$ecode"
 }
 
 dlg()
 {
-       local var="$1" btype="$2" title="$3" body="$4" n=0
+       local var="$1" dialog_type="$2" title="$3" body="$4" n=0
        shift 4
        (( ($# / 2) > SHL )) && n=$SHL
        
-       case "$btype" in
-               menu)
-                       tput civis
-                       dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \
-                               --title " $title " --menu "$body" 0 0 $n "$@" 2>"$ANS"
-                       ;;
-               check)
-                       tput civis
-                       dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \
-                               --title " $title " --checklist "$body" 0 0 $n "$@" 2>"$ANS"
-                       ;;
+       tput civis
+       case "$dialog_type" in
+               menu) dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --menu "$body" 0 0 $n "$@" 2>"$ANS" || return 1 ;;
+               check) dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --checklist "$body" 0 0 $n "$@" 2>"$ANS" || return 1 ;;
                input)
                        tput cnorm
-                       local default="$1"
+                       local def="$1"
                        shift
                        if [[ $1 == 'limit' ]]; then
-                               dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \
-                                       --max-input 63 --title " $title " --inputbox "$body" 0 0 "$default" 2>"$ANS"
+                               dialog --backtitle "$DIST Installer - $SYS - v$VER" --max-input 63 --title " $title " --inputbox "$body" 0 0 "$def" 2>"$ANS" || return 1
                        else
-                               dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \
-                                       --title " $title " --inputbox "$body" 0 0 "$default" 2>"$ANS"
+                               dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --inputbox "$body" 0 0 "$def" 2>"$ANS" || return 1
                        fi
                        ;;
        esac
-       [ $? -eq 0 ] && [ -s "$ANS" ] && printf -v $var "%s" "$(< "$ANS")"
+       [[ -s "$ANS" ]] && printf -v "$var" "%s" "$(< "$ANS")"
 }
 
 msg()
 {
        local title="$1" body="$2"
-
        tput civis
        if (( $# == 3 )); then
-               dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" --sleep $3 --title " $title " --infobox "$body\n" 0 0
+               dialog --backtitle "$DIST Installer - $SYS - v$VER" --sleep "$3" --title " $title " --infobox "$body\n" 0 0
        else
-               dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --msgbox "$body\n" 0 0
+               dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --msgbox "$body\n" 0 0
        fi
 }
 
-json()
-{
-       curl -s "http://api.ipstack.com/$2" | python3 -c "import sys, json; print(json.load(sys.stdin)['$1'])"
-}
-
 yesno()
 {
        local title="$1" body="$2" yes='Yes' no='No'
-
-       (( $# >= 3 )) && local yes="$3"
-       (( $# >= 4 )) && local no="$4"
-
+       (( $# >= 3 )) && yes="$3"
+       (( $# >= 4 )) && no="$4"
        tput civis
        if (( $# == 5 )); then
-               dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" --defaultno \
-                       --title " $title " --yes-label "$yes" --no-label "$no" --yesno "$body\n" 0 0
+               dialog --backtitle "$DIST Installer - $SYS - v$VER" --defaultno --title " $title " --yes-label "$yes" --no-label "$no" --yesno "$body\n" 0 0
        else
-               dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \
-                       --title " $title " --yes-label "$yes" --no-label "$no" --yesno "$body\n" 0 0
+               dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --yes-label "$yes" --no-label "$no" --yesno "$body\n" 0 0
        fi
 }
 
@@ -2396,6 +2434,7 @@ sigint()
 print4()
 {
        local str="$*"
+
        if [[ $COLUMNS -ge 110 && ${#str} -gt $((COLUMNS - 30)) ]]; then
                str="$(awk '{
                        i = 2; p1 = p2 = p3 = p4 = ""; p1 = $1; q = int(NF / 4)
@@ -2411,12 +2450,36 @@ print4()
        fi
 }
 
+termcol()
+{
+       local colors=(
+       "\e]P0191919" # #191919
+       "\e]P1D15355" # #D15355
+       "\e]P2609960" # #609960
+       "\e]P3FFCC66" # #FFCC66
+       "\e]P4255A9B" # #255A9B
+       "\e]P5AF86C8" # #AF86C8
+       "\e]P62EC8D3" # #2EC8D3
+       "\e]P7949494" # #949494
+       "\e]P8191919" # #191919
+       "\e]P9D15355" # #D15355
+       "\e]PA609960" # #609960
+       "\e]PBFF9157" # #FF9157
+       "\e]PC4E88CF" # #4E88CF
+       "\e]PDAF86C8" # #AF86C8
+       "\e]PE2ec8d3" # #2ec8d3
+       "\e]PFE1E1E1" # #E1E1E1
+       )
+
+       [[ $TERM == 'linux' ]] && printf "%b" "${colors[@]}" && clear
+}
+
 errshow()
 {
        [ $? -eq 0 ] && return 0
 
-       local fatal=0
-       local err="$(sed 's/[^[:print:]]//g; s/\[[0-9\;:]*\?m//g; s/==> //g; s/] ERROR:/]\nERROR:/g' "$ERR")"
+       local fatal=0 err=""
+       err="$(sed 's/[^[:print:]]//g; s/\[[0-9\;:]*\?m//g; s/==> //g; s/] ERROR:/]\nERROR:/g' "$ERR")"
 
        (( $1 == 1 )) && { fatal=1; shift; }
 
@@ -2428,15 +2491,14 @@ errshow()
                txt+="With no error message:\n\n"
        fi
 
-       if (( fatal == 1 )); then
+       if (( fatal )); then
                txt+="Errors at this stage are fatal and the install cannot continue.\n"
        else
                txt+="Errors at this stage are non-fatal and can be either fixed or ignored depending on the error.\n"
        fi
-
        msg "Install Error" "$txt"
 
-       if (( fatal == 1 )); then
+       if (( fatal )); then
                [[ -r $DBG && $TERM == 'linux' ]] && less "$DBG"
                die 1
        fi
@@ -2453,31 +2515,31 @@ load_bcm()
 
 prechecks()
 {
-       if [[ $1 -ge 0 ]] && ! grep -qw "$MNT" /proc/mounts; then
+       local i=1
+
+       if (( $1 >= 0 )) && ! grep -qw "$MNT" /proc/mounts; then
                msg "Not Mounted" "\nPartition(s) must be mounted first.\n" 2
-               SEL=4
-               return 1
+               SEL=4 i=0
        elif [[ $1 -ge 1 && -z $BOOTLDR ]]; then
                msg "No Bootloader" "\nBootloader must be selected first.\n" 2
-               SEL=5
-               return 1
+               SEL=5 i=0
        elif [[ $1 -ge 2 && (-z $NEWUSER || -z $USER_PASS) ]]; then
                msg "No User" "\nA user must be created first.\n" 2
-               SEL=6
-               return 1
+               SEL=6 i=0
        elif [[ $1 -ge 3 && -z $CONFIG_DONE ]]; then
                msg "Not Configured" "\nSystem configuration must be done first.\n" 2
-               SEL=7
-               return 1
+               SEL=7 i=0
        fi
-       return 0
+       (( i )) # return code
 }
 
 umount_dir()
 {
-       swapoff -a
-       [[ -d $1 ]] && umount -R $1 >/dev/null 2>&1
-       return 0
+       mount | grep -q 'swap' && swapoff -a
+       for dir; do
+               [[ -d $dir && "$(mount | grep "on $dir ")" ]] || continue
+               umount "$dir" 2>/dev/null || { sleep 0.5; umount -f "$dir" 2>/dev/null || umount -l "$dir"; }
+       done
 }
 
 chk_connect()
@@ -2493,9 +2555,13 @@ net_connect()
        else
                if hash nmtui >/dev/null 2>&1; then
                        tput civis
-                       [[ $TERM == 'linux' ]] && printf "%b" "\e]P1191919" "\e]P4191919"
-                       nmtui-connect
-                       [[ $TERM == 'linux' ]] && printf "%b" "\e]P1D15355" "\e]P4255a9b"
+                       if [[ $TERM == 'linux' ]]; then
+                               printf "%b" "\e]P1191919" "\e]P4191919"
+                               nmtui-connect
+                               printf "%b" "\e]P1D15355" "\e]P4255a9b"
+                       else
+                               nmtui-connect
+                       fi
                        chk_connect
                else
                        return 1
@@ -2503,6 +2569,13 @@ net_connect()
        fi
 }
 
+is_bg_install()
+{
+       [[ $RSYNC_PID || $MIRROR_PID ]] || return 0
+       msg "Install Running" "\nA background install process is currently running.\n" 2
+       return 1
+}
+
 system_devices()
 {
        IGNORE_DEV="$(lsblk -lno NAME,MOUNTPOINT | awk '/\/run\/archiso\/bootmnt/ {sub(/[1-9]/, ""); print $1}')"
@@ -2514,7 +2587,7 @@ system_devices()
        fi
 
        if [[ -z $SYS_DEVS ]]; then
-               msg "Installation Error" "\nNo available devices...\n\nExiting..\n" 2
+               msg "Device Error" "\nNo available devices...\n\nExiting..\n" 2
                die 1
        fi
 
@@ -2534,13 +2607,9 @@ system_identify()
                UCODE="intel-ucode"
        fi
 
-       if grep -qi 'apple' /sys/class/dmi/id/sys_vendor; then
-               modprobe -r -q efivars
-       else
-               modprobe -q efivarfs
-       fi
+       modprobe -q efivarfs >/dev/null 2>&1
 
-       _prep="\nTo begin the install you must first have:\n\n  - A root (/) partition mounted."
+       _prep="\nOnce a step is finished a step you will be returned here, if the step was successful the cursor will be advanced to the next step.\nIf a step is unsuccessful the cursor will be placed on the step required to advance (when possible).\n\nTo begin the install you should have:\n\n  - A root (/) partition mounted."
        if [[ -d /sys/firmware/efi/efivars ]]; then
                export SYS="UEFI"
                grep -q /sys/firmware/efi/efivars /proc/mounts || mount -t efivarfs efivarfs /sys/firmware/efi/efivars
@@ -2548,20 +2617,17 @@ system_identify()
        else
                export SYS="BIOS"
        fi
-       _prep+="\n  - The system bootloader selected.\n  - A new user created and passwords set."
-       _prep+="\n  - The system configuration finished.\n\nOnce the above are met the install can be started."
-}
-
-check_background_install()
-{
-       [[ $RSYNC_PID ]] || return 0
-       msg "Install Running" "\nA background install process is currently running.\n" 2
-       return 1
+       _prep+="\n\nOnce finished mounting, a portion of the install can be done in the background while you continue configuring the system:\n"
+       _prep+="\n  - Choose the system bootloader.\n  - Create a user and password."
+       _prep+="\n  - Basic system configuration, kernel, shell, login, packages, etc..\n\nOnce you're happy with the choices and the required steps are complete, the main install can be started."
 }
 
 ###############################################################################
 # entry point
 
+# enable some nicer colours in the linux console
+termcol
+
 if (( UID != 0 )); then
        msg "Not Root" "\nThis installer must be run as root or using sudo.\n\nExiting..\n" 2
        die 1
@@ -2572,25 +2638,22 @@ elif [[ $1 =~ (-d|--debug) ]]; then
        debug
 fi
 
+# trap ^C to perform cleanup
 trap sigint INT
 
 system_identify
 system_devices
 
-msg "Welcome to the $DIST Installer" "\nThis will help you get $DIST setup on your system.\nHaving GNU/Linux experience is an asset, however we try our best to keep things simple.\n\nIf you are unsure about an option, a default will be listed or\nthe first selected option will be the default (excluding language and timezone).\n\n\nMenu Navigation:\n\n - Select items with the arrow keys or the option number.\n - Use [Space] to toggle options and [Enter] to confirm.\n - Switch between buttons using [Tab] or the arrow keys.\n - Use [Page Up] and [Page Down] to jump whole pages\n - Press the highlighted key of an option to select it.\n"
+msg "Welcome to the $DIST Installer" "\nThis will help you get $DIST setup on your system.\nHaving previous GNU/Linux and shell experience will be an asset, however we try our best to keep things simple.\n\nIf you are unsure about an option, a default will be listed or\nthe first selected option will usually be the default (excluding language and timezone).\n\n\nMenu Navigation:\n\n - Select items with the arrow keys or the option number.\n - Use [Space] to toggle options and [Enter] to confirm.\n - Switch between buttons using [Tab] or the arrow keys.\n - Use [Page Up] and [Page Down] to jump whole pages\n - Press the highlighted key of an option to select it.\n"
 
 select_keymap || { clear; die 0; }
 
-if lspci -vnn -d 14e4: | grep -q 'BCM4352'; then
-       load_bcm
-fi
+# try to fix problematic broadcom wireless chipset before network check
+lspci -vnn -d 14e4: | grep -q 'BCM4352' && load_bcm
 
-if ! net_connect; then
-       msg "Not Connected" "\nThis installer requires an active internet connection.\n\nExiting..\n" 2
-       die 1
-fi
+net_connect || { msg "Not Connected" "\nThis installer requires an active internet connection.\n\nExiting..\n" 2; die 1; }
 
-while true; do
+while :; do
        select_main
 done