diff --git a/.clang-format b/.clang-format
index 2cd8d678acdceb15b68eae0cb08da590304f072a..0965e5724a3b3d141bcd3578a3ca05a6ad304316 100644
--- a/.clang-format
+++ b/.clang-format
@@ -28,8 +28,9 @@ PointerAlignment: Left
 ReflowComments: "false"
 SortIncludes: "true"
 SpaceAfterCStyleCast: "false"
+SpaceInEmptyBlock: "false"
 SpacesBeforeTrailingComments: "2"
 SpacesInAngles: "true"
 SpacesInParentheses: "true"
 SpacesInSquareBrackets: "true"
-Standard: Cpp11
+Standard: c++17
diff --git a/.clang-format.base b/.clang-format.base
deleted file mode 100644
index 2cd8d678acdceb15b68eae0cb08da590304f072a..0000000000000000000000000000000000000000
--- a/.clang-format.base
+++ /dev/null
@@ -1,35 +0,0 @@
-#   SPDX-FileCopyrightText: no
-#   SPDX-License-Identifier: CC0-1.0
----
-BasedOnStyle: WebKit
-
-AlignAfterOpenBracket: Align
-AlignEscapedNewlines: DontAlign
-AllowAllParametersOfDeclarationOnNextLine: "false"
-AllowShortFunctionsOnASingleLine: Inline
-AllowShortIfStatementsOnASingleLine: "false"
-AllowShortLambdasOnASingleLine: All
-AllowShortLoopsOnASingleLine: "false"
-AlwaysBreakAfterReturnType: TopLevelDefinitions
-AlwaysBreakTemplateDeclarations: Yes
-BinPackArguments: "false"
-BinPackParameters: "false"
-BreakBeforeBraces: Allman
-BreakBeforeTernaryOperators: "true"
-BreakConstructorInitializers: BeforeComma
-ColumnLimit: 120
-Cpp11BracedListStyle: "false"
-FixNamespaceComments: "true"
-IncludeBlocks: Preserve
-IndentWidth: "4"
-MaxEmptyLinesToKeep: "2"
-NamespaceIndentation: None
-PointerAlignment: Left
-ReflowComments: "false"
-SortIncludes: "true"
-SpaceAfterCStyleCast: "false"
-SpacesBeforeTrailingComments: "2"
-SpacesInAngles: "true"
-SpacesInParentheses: "true"
-SpacesInSquareBrackets: "true"
-Standard: Cpp11
diff --git a/CHANGES-3.2 b/CHANGES-3.2
index baaf261d44db569028b4b013e94a2cbf67bc9a6b..01da2a00e51b28fbe0abc441c6858cfc0d91852e 100644
--- a/CHANGES-3.2
+++ b/CHANGES-3.2
@@ -7,6 +7,116 @@ contributors are listed. Note that Calamares does not have a historical
 changelog -- this log starts with version 3.2.0. The release notes on the
 website will have to do for older versions.
 
+# 3.2.52 (unreleased) #
+
+This release contains contributions from (alphabetically by first name):
+ - No external contributors yet
+
+## Core ##
+ - No core changes yet
+
+## Modules ##
+ - No module changes yet
+
+
+# 3.2.51 (2022-02-01) #
+
+This release contains contributions from (alphabetically by first name):
+ - Evan James
+
+**WARNING** The *umount* module has been rewritten in C++. Check your
+configuration if you previously used the copy-a-log functionality.
+
+## Core ##
+ - Evan has made a start on documenting which Global Storage keys there
+   are and how they tie modules together. This can be found in the
+   `src/modules/README.md` documentation.
+
+## Modules ##
+ - *bootloader* can now be configured to try to generate a unique
+   suffix for the bootloader-id. #1820
+ - *grubcfg* now has a configurable default for kernel parameters,
+   which allows distributions to change the value from `quiet`.
+   The default, if nothing is set, remains `quiet`. Use an explicitly-
+   empty list to specify no-arguments-at-all.
+ - *packagechooser* can now export its choices for use by the *netinstall*
+   module. This makes it possible to use *packagechooser* for large-scale
+   choices, followed by *netinstall* for fine-grained control. (Thanks Evan)
+ - When the *partition* module has a conflicting configuration for the
+   swap choices, it prints a warning and uses the configured choice, rather
+   than always using "suspend". #1881
+ - The *umount* module has been re-written in C++. The copy-a-log-file
+   functionality has been removed. Use the *preservefiles* module for that.
+
+
+# 3.2.50 (2022-01-18) #
+
+This release contains contributions from (alphabetically by first name):
+ - Anke Boersma
+ - Erik Dubois
+ - Evan James
+ - Johannes Kamprad
+ - Taejun Park (new contributor, welcome!)
+
+**Replacement notice:** The *umount* module will be replaced by a C++
+implementation in the next release. The "preserve log file" feature
+will be removed in that release. Use the *preservefiles* module instead.
+
+## Core ##
+ - No core changes yet
+
+## Modules ##
+ - *initcpiocfg* mentioned a special kernel-name "all", which did not work,
+   and a special kernel-name "$uname" which cannot work. Fixed the former
+   and removed the "$uname" special key. (Thanks Evan)
+ - *luksswaphookcfg* has been converted to a C++ module.
+ - *networkcfg* could fail to update the NetworkManager configuration
+   if the SSID or username contained non-ASCII characters **and** the
+   default Python text-file encoding was set to ASCII. The files are
+   now read and written in UTF-8, explicitly. #1848
+ - *partition* always sets *bigtime* option on XFS filesystems, if possible.
+   Requires sufficiently-recent xfsprogs. #1874
+ - *preservefiles* was missing some necessary features, needed for it
+   to replace the deprecated log-file-saving functionality in the *umount*
+   module. (Thanks Erik and Joe for testing) #1851
+ - *umount* is now marked as an emergency module in the example configuration,
+   since it should **probably** be run as a cleanup. (Thanks Evan)
+ - *welcome* and *locale* could be confusing, together, and configure
+   the target system with a language that does not match the installer
+   language, even though the user did not make any explicit choice.
+   (Thanks Taejun) #1864
+
+
+# 3.2.49.1 (2021-12-11) #
+
+This is a hot-fix release, to fix a regression in the calculation of
+swap-size. Reported by EndeavourOS (Joe Kamprad) and Xero Linux.
+
+
+# 3.2.49 (2021-12-10) #
+
+This release contains contributions from (alphabetically by first name):
+ - Artem Grinev
+ - Evan James
+
+Distributions are **specifically** reminded to update the *umount* module
+configuration (and to use *preservefiles* if needed).
+
+## Core ##
+ - Errors (e.g. when an installation fails for whatever reason) are displayed
+   in a dialog with a scrollable details panel, rather than growing up
+   to the size of the screen. (Thanks Artem)
+
+## Modules ##
+ - *bootloader* better supports multiple installations of the same OS.
+ - *mount* supports btrfs subvolumes on subdirectories of / now.
+ - *partition* now supports "deep" btrfs subvolume names, e.g. a
+   separate subvolume for `/usr/local`. (Thanks Evan)
+ - The *umount* module now warns if the "preserve log file" feature is used.
+   This has been deprecated for a long time: use the *preservefiles* module
+   instead. A future release will turn this into an error.
+
+
 # 3.2.48 (2021-12-03) #
 
 This release contains contributions from (alphabetically by first name):
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c998d43d08e001cded5057572db8b9baf5d9c312..dd46148d8a445c16acf11609266ce891f3114756 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -41,11 +41,11 @@
 # TODO:3.3: Require CMake 3.12
 cmake_minimum_required( VERSION 3.3 FATAL_ERROR )
 project( CALAMARES
-    VERSION 3.2.48
+    VERSION 3.2.52
     LANGUAGES C CXX
 )
 
-set( CALAMARES_VERSION_RC 0 )  # Set to 0 during release cycle, 1 during development
+set( CALAMARES_VERSION_RC 1 )  # Set to 0 during release cycle, 1 during development
 if( CALAMARES_VERSION_RC EQUAL 1 AND CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
     message( FATAL_ERROR "Do not build development versions in the source-directory." )
 endif()
@@ -135,15 +135,15 @@ set( CALAMARES_DESCRIPTION_SUMMARY
 # NOTE: update these lines by running `txstats.py`, or for full automation
 #       `txstats.py -e`. See also
 #
-# Total 81 languages
-set( _tx_complete az az_AZ ca de fa fi_FI he hr ja ko lt pt_PT si
-    sq tr_TR uk zh_TW )
-set( _tx_good as be ca@valencia cs_CZ da fr fur hi it_IT ml nl
-    pt_BR ru sk sv tg vi zh_CN )
+# Total 74 languages
+set( _tx_complete az az_AZ ca de fa fi_FI he hi hr ja ko lt pt_BR
+    pt_PT si sq sv tr_TR uk zh_TW )
+set( _tx_good as be ca@valencia cs_CZ da fr fur it_IT ml nl ru sk
+    tg vi zh_CN )
 set( _tx_ok ar ast bg bn el en_GB es es_MX et eu gl hu id is mr nb
     pl ro sl sr sr@latin th )
-set( _tx_incomplete en_HK en_IN eo es_PE es_PR fr_CH gu hi_IN id_ID
-    ie kk kn ko_KR lo lv mk ne ne_NP te te_IN ur zh zh_HK )
+set( _tx_incomplete eo es_PR gu ie kk kn lo lv mk ne ne_NP ta_IN te
+    ur zh zh_HK )
 
 ### Required versions
 #
diff --git a/README.md b/README.md
index 8fa2dfda7896074264493e10a1d5863c6304b7a9..3e79d9a72dea36dc2dd35aa38ae19bb38f7abb61 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 [![Current issue](https://img.shields.io/badge/issue-in_progress-FE9B48)](https://github.com/calamares/calamares/labels/hacking%3A%20in-progress)
 [![GitHub release](https://img.shields.io/github/release/calamares/calamares.svg)](https://github.com/calamares/calamares/releases)
 [![GitHub Build Status](https://img.shields.io/github/workflow/status/calamares/calamares/ci?label=GH%20build)](https://github.com/calamares/calamares/actions?query=workflow%3Aci)
-[![GitHub license](https://img.shields.io/github/license/calamares/calamares.svg)](https://github.com/calamares/calamares/blob/calamares/LICENSE)
+[![GitHub license](https://img.shields.io/github/license/calamares/calamares.svg)](https://github.com/calamares/calamares/blob/calamares/LICENSES/GPL-3.0-or-later.txt)
 
 
 | [Report a Bug](https://github.com/calamares/calamares/issues/new) | [Translate](https://www.transifex.com/projects/p/calamares/) | [Contribute](CONTRIBUTING.md) | [Matrix: #calamares:kde.org](https://webchat.kde.org/#/room/%23calamares:kde.org) | [IRC: Libera.Chat #calamares](https://kiwiirc.com/client/irc.libera.chat/#calamares) | [Wiki](https://github.com/calamares/calamares/wiki) |
diff --git a/calamares.desktop b/calamares.desktop
index bfe3955b146dd5c22a22b5ead01dc4981cf44722..4db30049519860b2cc1f380afb296e09152c5098 100644
--- a/calamares.desktop
+++ b/calamares.desktop
@@ -21,10 +21,18 @@ Name[as]=চিছটেম ইনস্তল কৰক
 Icon[as]=কেলামাৰেচ
 GenericName[as]=চিছটেম ইনস্তলাৰ
 Comment[as]=কেলামাৰেচ — চিছটেম​ ইনস্তলাৰ
+Name[ast]=Instalar el sistema
+Icon[ast]=calamares
+GenericName[ast]=Instalador del sistema
+Comment[ast]=Calamares — Instalador del sistema
 Name[az]=Sistemi Quraşdırmaq
 Icon[az]=calamares
 GenericName[az]=Sistem Quraşdırıcısı
 Comment[az]=Calamares Sistem Quraşdırıcısı
+Name[az_AZ]=Sistemi quraşdırmaq
+Icon[az_AZ]=calamares
+GenericName[az_AZ]=Sistem quraşdırcısı
+Comment[az_AZ]=Calamares — Sistem Quraşdırıcısı
 Name[be]=Усталяваць сістэму
 Icon[be]=calamares
 GenericName[be]=Усталёўшчык сістэмы
@@ -41,6 +49,10 @@ Name[ca]=Instal·la el sistema
 Icon[ca]=calamares
 GenericName[ca]=Instal·lador de sistema
 Comment[ca]=Calamares — Instal·lador de sistema
+Name[cs_CZ]=Nainstalovat systém
+Icon[cs_CZ]=calamares
+GenericName[cs_CZ]=Instalátor systému
+Comment[cs_CZ]=Calamares – instalátor operačních systémů
 Name[da]=Installér system
 Icon[da]=calamares
 GenericName[da]=Systeminstallationsprogram
@@ -57,10 +69,19 @@ Name[en_GB]=Install System
 Icon[en_GB]=calamares
 GenericName[en_GB]=System Installer
 Comment[en_GB]=Calamares — System Installer
+Name[eo]=Instali Sistemo
+Icon[eo]=calamares
+GenericName[eo]=Sistema Instalilo
+Comment[eo]=Calamares — Sistema Instalilo
 Name[es]=Instalar Sistema
 Icon[es]=calamares
 GenericName[es]=Instalador del Sistema
 Comment[es]=Calamares — Instalador del Sistema
+Name[es_MX]=Instalar el Sistema
+Icon[es_MX]=calamares
+GenericName[es_MX]=Instalador del sistema
+Comment[es_MX]=Calamares - Instalador del sistema
+Name[es_PR]=Instalar el sistema
 Name[et]=Paigalda süsteem
 Icon[et]=calamares
 GenericName[et]=Süsteemipaigaldaja
@@ -73,7 +94,10 @@ Name[fa]=نصب سامانه
 Icon[fa]=کالامارس
 GenericName[fa]=نصب‌کننده سامانه
 Comment[fa]=کالامارس — نصب‌کننده سامانه
-Name[es_PR]=Instalar el sistema
+Name[fi_FI]=Asenna järjestelmä
+Icon[fi_FI]=calamares
+GenericName[fi_FI]=Järjestelmän asennusohjelma
+Comment[fi_FI]=Calamares — Järjestelmän asentaja
 Name[fr]=Installer le système
 Icon[fr]=calamares
 GenericName[fr]=Installateur système
@@ -98,10 +122,6 @@ Name[hr]=Instaliraj sustav
 Icon[hr]=calamares
 GenericName[hr]=Instalacija sustava
 Comment[hr]=Calamares — Instalacija sustava
-Name[ie]=Installar li sistema
-Icon[ie]=calamares
-GenericName[ie]=Installator del sistema
-Comment[ie]=Calamares — Installator del sistema
 Name[hu]=Rendszer telepítése
 Icon[hu]=calamares
 GenericName[hu]=Rendszertelepítő
@@ -110,14 +130,18 @@ Name[id]=Instal Sistem
 Icon[id]=calamares
 GenericName[id]=Pemasang
 Comment[id]=Calamares — Pemasang Sistem
+Name[ie]=Installar li sistema
+Icon[ie]=calamares
+GenericName[ie]=Installator del sistema
+Comment[ie]=Calamares — Installator del sistema
 Name[is]=Setja upp kerfið
 Icon[is]=calamares
 GenericName[is]=Kerfis uppsetning
 Comment[is]=Calamares — Kerfis uppsetning
-Name[cs_CZ]=Nainstalovat systém
-Icon[cs_CZ]=calamares
-GenericName[cs_CZ]=Instalátor systému
-Comment[cs_CZ]=Calamares – instalátor operačních systémů
+Name[it_IT]=Installa il sistema
+Icon[it_IT]=calamares
+GenericName[it_IT]=Programma d'installazione del sistema
+Comment[it_IT]=Calamares — Programma d'installazione del sistema
 Name[ja]=システムをインストール
 Icon[ja]=calamares
 GenericName[ja]=システムインストーラー
@@ -130,10 +154,6 @@ Name[lt]=Įdiegti Sistemą
 Icon[lt]=calamares
 GenericName[lt]=Sistemos diegimas į kompiuterį
 Comment[lt]=Calamares — Sistemos diegimo programa
-Name[it_IT]=Installa il sistema
-Icon[it_IT]=calamares
-GenericName[it_IT]=Programma d'installazione del sistema
-Comment[it_IT]=Calamares — Programma d'installazione del sistema
 Name[mk]=Инсталирај го системот
 Icon[mk]=calamares
 GenericName[mk]=Системен Инсталер
@@ -146,14 +166,14 @@ Name[nb]=Installer System
 Icon[nb]=calamares
 GenericName[nb]=Systeminstallatør
 Comment[nb]=Calamares-systeminstallatør
+Name[ne_NP]= सिस्टम इन्स्टल गर्नुहोस्
+Icon[ne_NP]=Calamares
+GenericName[ne_NP]=सिस्टम इन्स्टलर
+Comment[ne_NP]=Calamares - सिस्टम इन्स्टलर
 Name[nl]=Installeer systeem
 Icon[nl]=calamares
 GenericName[nl]=Installatieprogramma
 Comment[nl]=Calamares — Installatieprogramma
-Name[az_AZ]=Sistemi quraşdırmaq
-Icon[az_AZ]=calamares
-GenericName[az_AZ]=Sistem quraşdırcısı
-Comment[az_AZ]=Calamares — Sistem Quraşdırıcısı
 Name[pl]=Zainstaluj system
 Icon[pl]=calamares
 GenericName[pl]=Instalator systemu
@@ -162,6 +182,10 @@ Name[pt_BR]=Sistema de Instalação
 Icon[pt_BR]=calamares
 GenericName[pt_BR]=Instalador de Sistema
 Comment[pt_BR]=Calamares — Instalador de Sistema
+Name[pt_PT]=Instalar Sistema
+Icon[pt_PT]=calamares
+GenericName[pt_PT]=Instalador de Sistema
+Comment[pt_PT]=Instalador de Sistema - Calamares
 Name[ro]=Instalează sistemul
 Icon[ro]=calamares
 GenericName[ro]=Instalator de sistem
@@ -183,15 +207,11 @@ Name[sq]=Instalo Sistemin
 Icon[sq]=calamares
 GenericName[sq]=Instalues Sistemi
 Comment[sq]=Calamares — Instalues Sistemi
-Name[fi_FI]=Asenna järjestelmä
-Icon[fi_FI]=calamares
-GenericName[fi_FI]=Järjestelmän asennusohjelma
-Comment[fi_FI]=Calamares — Järjestelmän asentaja
-Name[sr@latin]=Instaliraj sistem
 Name[sr]=Инсталирај систем
 Icon[sr]=calamares
 GenericName[sr]=Инсталатер система
 Comment[sr]=Каламарес — инсталатер система
+Name[sr@latin]=Instaliraj sistem
 Name[sv]=Installera system
 Icon[sv]=calamares
 GenericName[sv]=Systeminstallerare
@@ -201,6 +221,10 @@ Icon[tg]=calamares
 GenericName[tg]=Насбкунандаи низомӣ
 Comment[tg]=Calamares — Насбкунандаи низомӣ
 Name[th]=ติดตั้งระบบ
+Name[tr_TR]=Sistemi Yükle
+Icon[tr_TR]=calamares
+GenericName[tr_TR]=Sistem Yükleyici
+Comment[tr_TR]=Calamares — Sistem Yükleyici
 Name[uk]=Встановити Систему
 Icon[uk]=calamares
 GenericName[uk]=Встановлювач системи
@@ -217,27 +241,3 @@ Name[zh_TW]=安裝系統
 Icon[zh_TW]=calamares
 GenericName[zh_TW]=系統安裝程式
 Comment[zh_TW]=Calamares ── 系統安裝程式
-Name[ast]=Instalar el sistema
-Icon[ast]=calamares
-GenericName[ast]=Instalador del sistema
-Comment[ast]=Calamares — Instalador del sistema
-Name[eo]=Instali Sistemo
-Icon[eo]=calamares
-GenericName[eo]=Sistema Instalilo
-Comment[eo]=Calamares — Sistema Instalilo
-Name[ne_NP]= सिस्टम इन्स्टल गर्नुहोस्
-Icon[ne_NP]=Calamares
-GenericName[ne_NP]=सिस्टम इन्स्टलर
-Comment[ne_NP]=Calamares - सिस्टम इन्स्टलर
-Name[es_MX]=Instalar el Sistema
-Icon[es_MX]=calamares
-GenericName[es_MX]=Instalador del sistema
-Comment[es_MX]=Calamares - Instalador del sistema
-Name[pt_PT]=Instalar Sistema
-Icon[pt_PT]=calamares
-GenericName[pt_PT]=Instalador de Sistema
-Comment[pt_PT]=Instalador de Sistema - Calamares
-Name[tr_TR]=Sistemi Yükle
-Icon[tr_TR]=calamares
-GenericName[tr_TR]=Sistem Yükleyici
-Comment[tr_TR]=Calamares — Sistem Yükleyici
diff --git a/ci/RELEASE.sh b/ci/RELEASE.sh
index f09285fb7b66b22ce5624deaf2a98bd94f32fa09..e46ca2cc2ab2245719054bfb15772d74f18312ec 100755
--- a/ci/RELEASE.sh
+++ b/ci/RELEASE.sh
@@ -75,7 +75,7 @@ fi
 #
 #
 BUILDDIR=$(mktemp -d --suffix=-build --tmpdir=.)
-KEY_ID="CFDDC96F12B1915C"
+KEY_ID="328D742D8807A435"
 
 # Try to make gpg cache the signing key, so we can leave the process
 # to run and sign.
diff --git a/ci/calamaresstyle b/ci/calamaresstyle
index ffcfe09026942cf2b1cd967509fb97f026292995..f5bcd2bb9beaf519c0689891b3d8eb6465ac15ac 100755
--- a/ci/calamaresstyle
+++ b/ci/calamaresstyle
@@ -19,12 +19,12 @@ BASEDIR=$(dirname $0)
 TOPDIR=$( cd $BASEDIR/.. && pwd -P )
 test -d "$BASEDIR" || { echo "! Could not determine base for $0" ; exit 1 ; }
 test -d "$TOPDIR" || { echo "! Cound not determine top-level source dir" ; exit 1 ; }
-test -f "$TOPDIR/.clang-format.base" || { echo "! No .clang-format support files in $TOPDIR" ; exit 1 ; }
+test -f "$TOPDIR/.clang-format" || { echo "! No .clang-format support files in $TOPDIR" ; exit 1 ; }
 
 AS=$( which astyle )
 
 # Allow specifying CF_VERSIONS outside already
-CF_VERSIONS="$CF_VERSIONS clang-format-8 clang-format80 clang-format90 clang-format-9.0.1 clang-format"
+CF_VERSIONS="$CF_VERSIONS clang-format13 clang-format12 clang-format"
 for _cf in $CF_VERSIONS
 do
 	# Not an error if this particular clang-format isn't found
@@ -40,31 +40,19 @@ test -x "$CF" || { echo "! $CF is not executable."; exit 1 ; }
 ### CLANG-FORMAT-WRANGLING
 #
 # Version 7 and earlier doesn't understand all the options we would like
-# Version 8 is ok
-# Version 9 is ok
-# Later versions change some defaults so need extra wrangling.
-# .. there are extra files that are appended to the settings, per
-# .. clang-format version.
+# Version 12 handles lambdas nicely, so use that.
+# Version 13 is also ok.
 
 format_version=`"$CF" --version | tr -dc '[^.0-9]' | cut  -d . -f 1`
 case "$format_version" in
-	[0-7] )
-		echo "! Clang-format version 8+ required"
-		exit 1
-		;;
-	[89] )
+	12|13 )
 		:
 		;;
 	* )
-		echo "! Clang-format version '$format_version' unsupported."
+		echo "! Clang-format version '$format_version' unsupported, version 12 required."
 		exit 1
 		;;
 esac
-_fmt="$TOPDIR/.clang-format"
-cp "$_fmt.base" "$_fmt"
-for f in "$extra_settings" ; do
-	test -f "$_fmt.$f" && cat "$_fmt.$f" >> "$_fmt"
-done
 
 
 ### FILE PROCESSING
@@ -98,8 +86,3 @@ if test "x$any_dirs" = "xyes" ; then
 else
 	style_some "$@"
 fi
-
-### CLANG-FORMAT-WRANGLING
-#
-# Restore the original .clang-format
-cp "$_fmt.base" "$_fmt"
diff --git a/ci/txpull.sh b/ci/txpull.sh
index f688145604d7ba0f67829f3315991ee01cb21ef9..a6e4127af1900f9b9257d2fd26cab1166e02164f 100755
--- a/ci/txpull.sh
+++ b/ci/txpull.sh
@@ -108,6 +108,21 @@ awk '
 		skip=0; print $0;
 	}}' < calamares.desktop > calamares.desktop.new
 mv calamares.desktop.new calamares.desktop
+# Now group translated key-names (Name, Icon, Description, ..) by sorted
+# language key rather than random-ish language-key order (which shuffles
+# entries around).
+#
+# First, the non-translated lines
+grep -v '\[.*\]=' calamares.desktop  > calamares.desktop.new
+# The translated lines:
+# - replace (the first) [] by | so we have a consistent field separator
+# - sort based on field 2, then 1 (language code, then reversed key-name)
+# - replace the first | by [, the first (remaining) | by ]
+# Effectively this puts the fields in this order: Name, Icon, Generic Name,
+# Comment -- within each language key. This keeps churn down since the
+# language codes and key-names are constant.
+grep '\[.*\]=' calamares.desktop | sed -e 's/\[/|/' -e 's/\]/|/' | sort -t '|' -k 2,2 -k 1,1r | sed -e 's/|/\[/' | sed -e 's/|/\]/' >> calamares.desktop.new
+mv calamares.desktop.new calamares.desktop
 git add --verbose calamares.desktop
 git commit "$AUTHOR" --message="i18n: [desktop] $BOILERPLATE" | true
 
@@ -116,6 +131,19 @@ git commit "$AUTHOR" --message="i18n: [desktop] $BOILERPLATE" | true
 # PO-Created line). This applies only to modules which use po-files.
 git diff --numstat src/modules | awk '($1==1 && $2==1){print $3}' | xargs git checkout --
 
+# sed either wants -i'' (GNU sed) or -i '' (BSD sed) to
+# replace in a file, with no backup extension. Define
+# a `reinplace` command to deal with the difference.
+if test FreeBSD = `uname` ; then
+	reinplace() { 
+		sed -i '' "$@"
+	}
+else
+	reinplace() { 
+		sed -i'' "$@"
+	}
+fi
+
 # Go through the Python modules; those with a lang/ subdir have their
 # own complete gettext-based setup.
 for MODULE_DIR in $(find src/modules -maxdepth 1 -mindepth 1 -type d) ; do
@@ -125,7 +153,7 @@ for MODULE_DIR in $(find src/modules -maxdepth 1 -mindepth 1 -type d) ; do
 		if [ -d ${MODULE_DIR}/lang ]; then
 			# Convert PO files to MO files
 			for POFILE in $(find ${MODULE_DIR} -name "*.po") ; do
-				sed -i'' '/^"Content-Type/s/CHARSET/UTF-8/' $POFILE
+				reinplace '/^"Content-Type/s/CHARSET/UTF-8/' $POFILE
 				# msgfmt -o ${POFILE%.po}.mo $POFILE
 			done
 			git add --verbose ${MODULE_DIR}/lang/*
@@ -135,7 +163,7 @@ for MODULE_DIR in $(find src/modules -maxdepth 1 -mindepth 1 -type d) ; do
 done
 
 for POFILE in $(find lang -name "python.po") ; do
-	sed -i'' '/^"Content-Type/s/CHARSET/UTF-8/' $POFILE
+	reinplace '/^"Content-Type/s/CHARSET/UTF-8/' $POFILE
 	# msgfmt -o ${POFILE%.po}.mo $POFILE
 done
 git add --verbose lang/python*
diff --git a/lang/calamares_cs_CZ.ts b/lang/calamares_cs_CZ.ts
index 4525d74189c53e580eda759d08f715bf22a841d1..b61f36b81b903509ec7e7ded4518d39d149af50f 100644
--- a/lang/calamares_cs_CZ.ts
+++ b/lang/calamares_cs_CZ.ts
@@ -693,27 +693,27 @@ Instalační program bude ukončen a všechny změny ztraceny.</translation>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="259"/>
       <source>Successfully unmounted %1.</source>
-      <translation type="unfinished"/>
+      <translation>Úspěšně odpojeno %1.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="266"/>
       <source>Successfully disabled swap %1.</source>
-      <translation type="unfinished"/>
+      <translation>Úspěšně vypnut swap %1.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="292"/>
       <source>Successfully cleared swap %1.</source>
-      <translation type="unfinished"/>
+      <translation>Úspěšně vyčištěn swap %1.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="306"/>
       <source>Successfully closed mapper device %1.</source>
-      <translation type="unfinished"/>
+      <translation>Úspěšně zavřeno mapper zařízení %1.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="319"/>
       <source>Successfully disabled volume group %1.</source>
-      <translation type="unfinished"/>
+      <translation>Úspěšně vypnuta skupina svazků %1.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="358"/>
diff --git a/lang/calamares_en.ts b/lang/calamares_en.ts
index 544fd4e71eeabb1c62e3a89c44b750c7bee7f3f3..f92210abdfdd46b601e00b7d1c3200c993c7fc11 100644
--- a/lang/calamares_en.ts
+++ b/lang/calamares_en.ts
@@ -171,7 +171,7 @@
   <context>
     <name>Calamares::JobThread</name>
     <message>
-      <location filename="../src/libcalamares/JobQueue.cpp" line="201"/>
+      <location filename="../src/libcalamares/JobQueue.cpp" line="202"/>
       <source>Done</source>
       <translation>Done</translation>
     </message>
@@ -187,17 +187,17 @@
   <context>
     <name>Calamares::ProcessJob</name>
     <message>
-      <location filename="../src/libcalamares/ProcessJob.cpp" line="43"/>
+      <location filename="../src/libcalamares/ProcessJob.cpp" line="42"/>
       <source>Run command '%1' in target system.</source>
       <translation>Run command '%1' in target system.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/ProcessJob.cpp" line="43"/>
+      <location filename="../src/libcalamares/ProcessJob.cpp" line="42"/>
       <source> Run command '%1'.</source>
       <translation> Run command '%1'.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/ProcessJob.cpp" line="50"/>
+      <location filename="../src/libcalamares/ProcessJob.cpp" line="49"/>
       <source>Running command %1 %2</source>
       <translation>Running command %1 %2</translation>
     </message>
@@ -205,32 +205,32 @@
   <context>
     <name>Calamares::PythonJob</name>
     <message>
-      <location filename="../src/libcalamares/PythonJob.cpp" line="194"/>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="233"/>
       <source>Running %1 operation.</source>
       <translation>Running %1 operation.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/PythonJob.cpp" line="223"/>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="262"/>
       <source>Bad working directory path</source>
       <translation>Bad working directory path</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/PythonJob.cpp" line="224"/>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="263"/>
       <source>Working directory %1 for python job %2 is not readable.</source>
       <translation>Working directory %1 for python job %2 is not readable.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/PythonJob.cpp" line="230"/>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="269"/>
       <source>Bad main script file</source>
       <translation>Bad main script file</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/PythonJob.cpp" line="231"/>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="270"/>
       <source>Main script file %1 for python job %2 is not readable.</source>
       <translation>Main script file %1 for python job %2 is not readable.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/PythonJob.cpp" line="304"/>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="343"/>
       <source>Boost.Python error in job "%1".</source>
       <translation>Boost.Python error in job "%1".</translation>
     </message>
@@ -285,52 +285,47 @@
   <context>
     <name>Calamares::ViewManager</name>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="162"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="160"/>
       <source>Setup Failed</source>
       <translation>Setup Failed</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="162"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="160"/>
       <source>Installation Failed</source>
       <translation>Installation Failed</translation>
     </message>
     <message>
       <location filename="../src/libcalamaresui/ViewManager.cpp" line="163"/>
-      <source>Would you like to paste the install log to the web?</source>
-      <translation>Would you like to paste the install log to the web?</translation>
-    </message>
-    <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="179"/>
       <source>Error</source>
       <translation>Error</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="88"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="90"/>
       <source>&amp;Yes</source>
       <translation>&amp;Yes</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="89"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="91"/>
       <source>&amp;No</source>
       <translation>&amp;No</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="90"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="92"/>
       <source>&amp;Close</source>
       <translation>&amp;Close</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="183"/>
+      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="184"/>
       <source>Install Log Paste URL</source>
       <translation>Install Log Paste URL</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="165"/>
+      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="166"/>
       <source>The upload was unsuccessful. No web-paste was done.</source>
       <translation>The upload was unsuccessful. No web-paste was done.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="177"/>
+      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="178"/>
       <source>Install log posted to
 
 %1
@@ -343,124 +338,124 @@ Link copied to clipboard</source>
 Link copied to clipboard</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="211"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="189"/>
       <source>Calamares Initialization Failed</source>
       <translation>Calamares Initialization Failed</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="212"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="190"/>
       <source>%1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution.</source>
       <translation>%1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="218"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="196"/>
       <source>&lt;br/&gt;The following modules could not be loaded:</source>
       <translation>&lt;br/&gt;The following modules could not be loaded:</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="332"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="310"/>
       <source>Continue with setup?</source>
       <translation>Continue with setup?</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="332"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="310"/>
       <source>Continue with installation?</source>
       <translation>Continue with installation?</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="334"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="312"/>
       <source>The %1 setup program is about to make changes to your disk in order to set up %2.&lt;br/&gt;&lt;strong&gt;You will not be able to undo these changes.&lt;/strong&gt;</source>
       <translation>The %1 setup program is about to make changes to your disk in order to set up %2.&lt;br/&gt;&lt;strong&gt;You will not be able to undo these changes.&lt;/strong&gt;</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="337"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="315"/>
       <source>The %1 installer is about to make changes to your disk in order to install %2.&lt;br/&gt;&lt;strong&gt;You will not be able to undo these changes.&lt;/strong&gt;</source>
       <translation>The %1 installer is about to make changes to your disk in order to install %2.&lt;br/&gt;&lt;strong&gt;You will not be able to undo these changes.&lt;/strong&gt;</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="340"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="318"/>
       <source>&amp;Set up now</source>
       <translation>&amp;Set up now</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="340"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="318"/>
       <source>&amp;Install now</source>
       <translation>&amp;Install now</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="348"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="326"/>
       <source>Go &amp;back</source>
       <translation>Go &amp;back</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="398"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="376"/>
       <source>&amp;Set up</source>
       <translation>&amp;Set up</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="398"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="376"/>
       <source>&amp;Install</source>
       <translation>&amp;Install</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="400"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="378"/>
       <source>Setup is complete. Close the setup program.</source>
       <translation>Setup is complete. Close the setup program.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="401"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="379"/>
       <source>The installation is complete. Close the installer.</source>
       <translation>The installation is complete. Close the installer.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="403"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="381"/>
       <source>Cancel setup without changing the system.</source>
       <translation>Cancel setup without changing the system.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="404"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="382"/>
       <source>Cancel installation without changing the system.</source>
       <translation>Cancel installation without changing the system.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="414"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="392"/>
       <source>&amp;Next</source>
       <translation>&amp;Next</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="419"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="397"/>
       <source>&amp;Back</source>
       <translation>&amp;Back</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="425"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="403"/>
       <source>&amp;Done</source>
       <translation>&amp;Done</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="444"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="422"/>
       <source>&amp;Cancel</source>
       <translation>&amp;Cancel</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="517"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="495"/>
       <source>Cancel setup?</source>
       <translation>Cancel setup?</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="517"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="495"/>
       <source>Cancel installation?</source>
       <translation>Cancel installation?</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="518"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="496"/>
       <source>Do you really want to cancel the current setup process?
 The setup program will quit and all changes will be lost.</source>
       <translation>Do you really want to cancel the current setup process?
 The setup program will quit and all changes will be lost.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/ViewManager.cpp" line="520"/>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="498"/>
       <source>Do you really want to cancel the current install process?
 The installer will quit and all changes will be lost.</source>
       <translation>Do you really want to cancel the current install process?
@@ -470,22 +465,22 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>CalamaresPython::Helper</name>
     <message>
-      <location filename="../src/libcalamares/PythonHelper.cpp" line="294"/>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="302"/>
       <source>Unknown exception type</source>
       <translation>Unknown exception type</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/PythonHelper.cpp" line="312"/>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="320"/>
       <source>unparseable Python error</source>
       <translation>unparseable Python error</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/PythonHelper.cpp" line="356"/>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="364"/>
       <source>unparseable Python traceback</source>
       <translation>unparseable Python traceback</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/PythonHelper.cpp" line="363"/>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="371"/>
       <source>Unfetchable Python error.</source>
       <translation>Unfetchable Python error.</translation>
     </message>
@@ -537,149 +532,149 @@ The installer will quit and all changes will be lost.</translation>
       <translation>Form</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="139"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="137"/>
       <source>Select storage de&amp;vice:</source>
       <translation>Select storage de&amp;vice:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="140"/>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="996"/>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1042"/>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1133"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="138"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1014"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1062"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1159"/>
       <source>Current:</source>
       <translation>Current:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="141"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="139"/>
       <source>After:</source>
       <translation>After:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1671"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1723"/>
       <source>&lt;strong&gt;Manual partitioning&lt;/strong&gt;&lt;br/&gt;You can create or resize partitions yourself.</source>
       <translation>&lt;strong&gt;Manual partitioning&lt;/strong&gt;&lt;br/&gt;You can create or resize partitions yourself.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="861"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="879"/>
       <source>Reuse %1 as home partition for %2.</source>
       <translation>Reuse %1 as home partition for %2.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="997"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1015"/>
       <source>&lt;strong&gt;Select a partition to shrink, then drag the bottom bar to resize&lt;/strong&gt;</source>
       <translation>&lt;strong&gt;Select a partition to shrink, then drag the bottom bar to resize&lt;/strong&gt;</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1014"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1033"/>
       <source>%1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4.</source>
       <translation>%1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1071"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1091"/>
       <source>Boot loader location:</source>
       <translation>Boot loader location:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1124"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1150"/>
       <source>&lt;strong&gt;Select a partition to install on&lt;/strong&gt;</source>
       <translation>&lt;strong&gt;Select a partition to install on&lt;/strong&gt;</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1183"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1209"/>
       <source>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</source>
       <translation>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1191"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1217"/>
       <source>The EFI system partition at %1 will be used for starting %2.</source>
       <translation>The EFI system partition at %1 will be used for starting %2.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1199"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1225"/>
       <source>EFI system partition:</source>
       <translation>EFI system partition:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1334"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1385"/>
       <source>This storage device does not seem to have an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
       <translation>This storage device does not seem to have an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1339"/>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1376"/>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1398"/>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1423"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1390"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1427"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1449"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1474"/>
       <source>&lt;strong&gt;Erase disk&lt;/strong&gt;&lt;br/&gt;This will &lt;font color="red"&gt;delete&lt;/font&gt; all data currently present on the selected storage device.</source>
       <translation>&lt;strong&gt;Erase disk&lt;/strong&gt;&lt;br/&gt;This will &lt;font color="red"&gt;delete&lt;/font&gt; all data currently present on the selected storage device.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1343"/>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1372"/>
       <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1394"/>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1419"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1423"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1445"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1470"/>
       <source>&lt;strong&gt;Install alongside&lt;/strong&gt;&lt;br/&gt;The installer will shrink a partition to make room for %1.</source>
       <translation>&lt;strong&gt;Install alongside&lt;/strong&gt;&lt;br/&gt;The installer will shrink a partition to make room for %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1347"/>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1381"/>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1402"/>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1427"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1398"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1432"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1453"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1478"/>
       <source>&lt;strong&gt;Replace a partition&lt;/strong&gt;&lt;br/&gt;Replaces a partition with %1.</source>
       <translation>&lt;strong&gt;Replace a partition&lt;/strong&gt;&lt;br/&gt;Replaces a partition with %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1366"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1417"/>
       <source>This storage device has %1 on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
       <translation>This storage device has %1 on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1389"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1440"/>
       <source>This storage device already has an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
       <translation>This storage device already has an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1414"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1465"/>
       <source>This storage device has multiple operating systems on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
       <translation>This storage device has multiple operating systems on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1486"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1537"/>
       <source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
       <translation>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1509"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1560"/>
       <source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
       <translation>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1514"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1565"/>
       <source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
       <translation>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1641"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1692"/>
       <source>No Swap</source>
       <translation>No Swap</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1649"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1701"/>
       <source>Reuse Swap</source>
       <translation>Reuse Swap</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1652"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1704"/>
       <source>Swap (no Hibernate)</source>
       <translation>Swap (no Hibernate)</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1655"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1707"/>
       <source>Swap (with Hibernate)</source>
       <translation>Swap (with Hibernate)</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1658"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1710"/>
       <source>Swap to file</source>
       <translation>Swap to file</translation>
     </message>
@@ -687,42 +682,42 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>ClearMountsJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="259"/>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="272"/>
       <source>Successfully unmounted %1.</source>
       <translation>Successfully unmounted %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="266"/>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="279"/>
       <source>Successfully disabled swap %1.</source>
       <translation>Successfully disabled swap %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="292"/>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="305"/>
       <source>Successfully cleared swap %1.</source>
       <translation>Successfully cleared swap %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="306"/>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="319"/>
       <source>Successfully closed mapper device %1.</source>
       <translation>Successfully closed mapper device %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="319"/>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="332"/>
       <source>Successfully disabled volume group %1.</source>
       <translation>Successfully disabled volume group %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="358"/>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="371"/>
       <source>Clear mounts for partitioning operations on %1</source>
       <translation>Clear mounts for partitioning operations on %1</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="364"/>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="377"/>
       <source>Clearing mounts for partitioning operations on %1.</source>
       <translation>Clearing mounts for partitioning operations on %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="383"/>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="396"/>
       <source>Cleared all mounts for %1</source>
       <translation>Cleared all mounts for %1</translation>
     </message>
@@ -730,22 +725,17 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>ClearTempMountsJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="32"/>
+      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="33"/>
       <source>Clear all temporary mounts.</source>
       <translation>Clear all temporary mounts.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="39"/>
+      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="40"/>
       <source>Clearing all temporary mounts.</source>
       <translation>Clearing all temporary mounts.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="52"/>
-      <source>Cannot get list of temporary mounts.</source>
-      <translation>Cannot get list of temporary mounts.</translation>
-    </message>
-    <message>
-      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="97"/>
+      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="70"/>
       <source>Cleared all temporary mounts.</source>
       <translation>Cleared all temporary mounts.</translation>
     </message>
@@ -782,17 +772,17 @@ The installer will quit and all changes will be lost.</translation>
       <translation>Set keyboard layout to %1/%2.</translation>
     </message>
     <message>
-      <location filename="../src/modules/locale/Config.cpp" line="342"/>
+      <location filename="../src/modules/locale/Config.cpp" line="353"/>
       <source>Set timezone to %1/%2.</source>
       <translation>Set timezone to %1/%2.</translation>
     </message>
     <message>
-      <location filename="../src/modules/locale/Config.cpp" line="380"/>
+      <location filename="../src/modules/locale/Config.cpp" line="391"/>
       <source>The system language will be set to %1.</source>
       <translation>The system language will be set to %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/locale/Config.cpp" line="387"/>
+      <location filename="../src/modules/locale/Config.cpp" line="398"/>
       <source>The numbers and dates locale will be set to %1.</source>
       <translation>The numbers and dates locale will be set to %1.</translation>
     </message>
@@ -962,22 +952,22 @@ The installer will quit and all changes will be lost.</translation>
       <translation>The installation of %1 is complete.</translation>
     </message>
     <message>
-      <location filename="../src/modules/packagechooser/Config.cpp" line="86"/>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="111"/>
       <source>Package Selection</source>
       <translation>Package Selection</translation>
     </message>
     <message>
-      <location filename="../src/modules/packagechooser/Config.cpp" line="88"/>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="113"/>
       <source>Please pick a product from the list. The selected product will be installed.</source>
       <translation>Please pick a product from the list. The selected product will be installed.</translation>
     </message>
     <message>
-      <location filename="../src/modules/packagechooser/Config.cpp" line="177"/>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="243"/>
       <source>Install option: &lt;strong&gt;%1&lt;/strong&gt;</source>
       <translation>Install option: &lt;strong&gt;%1&lt;/strong&gt;</translation>
     </message>
     <message>
-      <location filename="../src/modules/packagechooser/Config.cpp" line="177"/>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="243"/>
       <source>None</source>
       <translation>None</translation>
     </message>
@@ -1029,8 +1019,8 @@ The installer will quit and all changes will be lost.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="71"/>
-      <source>&amp;Primary</source>
-      <translation>&amp;Primary</translation>
+      <source>Primar&amp;y</source>
+      <translation type="unfinished"/>
     </message>
     <message>
       <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="81"/>
@@ -1053,86 +1043,91 @@ The installer will quit and all changes will be lost.</translation>
       <translation>&amp;Mount Point:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="192"/>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="191"/>
       <source>Flags:</source>
       <translation>Flags:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="231"/>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="224"/>
       <source>Label for the filesystem</source>
       <translation>Label for the filesystem</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="241"/>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="234"/>
       <source>FS Label:</source>
       <translation>FS Label:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="65"/>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="66"/>
       <source>En&amp;crypt</source>
       <translation>En&amp;crypt</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="191"/>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="194"/>
       <source>Logical</source>
       <translation>Logical</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="196"/>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="199"/>
       <source>Primary</source>
       <translation>Primary</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="215"/>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="218"/>
       <source>GPT</source>
       <translation>GPT</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="301"/>
+      <location filename="../src/modules/partition/gui/PartitionDialogHelpers.cpp" line="91"/>
       <source>Mountpoint already in use. Please select another one.</source>
       <translation>Mountpoint already in use. Please select another one.</translation>
     </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionDialogHelpers.cpp" line="96"/>
+      <source>Mountpoint must start with a &lt;tt&gt;/&lt;/tt&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
   </context>
   <context>
     <name>CreatePartitionJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="113"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="187"/>
       <source>Create new %1MiB partition on %3 (%2) with entries %4.</source>
       <translation>Create new %1MiB partition on %3 (%2) with entries %4.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="121"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="195"/>
       <source>Create new %1MiB partition on %3 (%2).</source>
       <translation>Create new %1MiB partition on %3 (%2).</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="128"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="202"/>
       <source>Create new %2MiB partition on %4 (%3) with file system %1.</source>
       <translation>Create new %2MiB partition on %4 (%3) with file system %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="145"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="219"/>
       <source>Create new &lt;strong&gt;%1MiB&lt;/strong&gt; partition on &lt;strong&gt;%3&lt;/strong&gt; (%2) with entries &lt;em&gt;%4&lt;/em&gt;.</source>
       <translation>Create new &lt;strong&gt;%1MiB&lt;/strong&gt; partition on &lt;strong&gt;%3&lt;/strong&gt; (%2) with entries &lt;em&gt;%4&lt;/em&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="154"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="228"/>
       <source>Create new &lt;strong&gt;%1MiB&lt;/strong&gt; partition on &lt;strong&gt;%3&lt;/strong&gt; (%2).</source>
       <translation>Create new &lt;strong&gt;%1MiB&lt;/strong&gt; partition on &lt;strong&gt;%3&lt;/strong&gt; (%2).</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="161"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="235"/>
       <source>Create new &lt;strong&gt;%2MiB&lt;/strong&gt; partition on &lt;strong&gt;%4&lt;/strong&gt; (%3) with file system &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Create new &lt;strong&gt;%2MiB&lt;/strong&gt; partition on &lt;strong&gt;%4&lt;/strong&gt; (%3) with file system &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="186"/>
-      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="189"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="260"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="263"/>
       <source>Creating new %1 partition on %2.</source>
       <translation>Creating new %1 partition on %2.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="201"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="280"/>
       <source>The installer failed to create partition on disk '%1'.</source>
       <translation>The installer failed to create partition on disk '%1'.</translation>
     </message>
@@ -1168,22 +1163,22 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>CreatePartitionTableJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="39"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="41"/>
       <source>Create new %1 partition table on %2.</source>
       <translation>Create new %1 partition table on %2.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="47"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="49"/>
       <source>Create new &lt;strong&gt;%1&lt;/strong&gt; partition table on &lt;strong&gt;%2&lt;/strong&gt; (%3).</source>
       <translation>Create new &lt;strong&gt;%1&lt;/strong&gt; partition table on &lt;strong&gt;%2&lt;/strong&gt; (%3).</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="57"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="59"/>
       <source>Creating new %1 partition table on %2.</source>
       <translation>Creating new %1 partition table on %2.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="67"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="88"/>
       <source>The installer failed to create a partition table on %1.</source>
       <translation>The installer failed to create a partition table on %1.</translation>
     </message>
@@ -1191,33 +1186,33 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>CreateUserJob</name>
     <message>
-      <location filename="../src/modules/users/CreateUserJob.cpp" line="36"/>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="35"/>
       <source>Create user %1</source>
       <translation>Create user %1</translation>
     </message>
     <message>
-      <location filename="../src/modules/users/CreateUserJob.cpp" line="43"/>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="42"/>
       <source>Create user &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Create user &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/users/CreateUserJob.cpp" line="126"/>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="125"/>
       <source>Preserving home directory</source>
       <translation>Preserving home directory</translation>
     </message>
     <message>
-      <location filename="../src/modules/users/CreateUserJob.cpp" line="50"/>
-      <location filename="../src/modules/users/CreateUserJob.cpp" line="143"/>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="49"/>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="142"/>
       <source>Creating user %1</source>
       <translation>Creating user %1</translation>
     </message>
     <message>
-      <location filename="../src/modules/users/CreateUserJob.cpp" line="151"/>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="150"/>
       <source>Configuring user %1</source>
       <translation>Configuring user %1</translation>
     </message>
     <message>
-      <location filename="../src/modules/users/CreateUserJob.cpp" line="159"/>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="158"/>
       <source>Setting file permissions</source>
       <translation>Setting file permissions</translation>
     </message>
@@ -1233,22 +1228,22 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>CreateVolumeGroupJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="31"/>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="32"/>
       <source>Create new volume group named %1.</source>
       <translation>Create new volume group named %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="37"/>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="38"/>
       <source>Create new volume group named &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Create new volume group named &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="43"/>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="44"/>
       <source>Creating new volume group named %1.</source>
       <translation>Creating new volume group named %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="55"/>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="51"/>
       <source>The installer failed to create a volume group named '%1'.</source>
       <translation>The installer failed to create a volume group named '%1'.</translation>
     </message>
@@ -1256,18 +1251,18 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>DeactivateVolumeGroupJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="24"/>
-      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="36"/>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="26"/>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="38"/>
       <source>Deactivate volume group named %1.</source>
       <translation>Deactivate volume group named %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="30"/>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="32"/>
       <source>Deactivate volume group named &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Deactivate volume group named &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="48"/>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="46"/>
       <source>The installer failed to deactivate a volume group named %1.</source>
       <translation>The installer failed to deactivate a volume group named %1.</translation>
     </message>
@@ -1275,22 +1270,22 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>DeletePartitionJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="71"/>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="73"/>
       <source>Delete partition %1.</source>
       <translation>Delete partition %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="78"/>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="80"/>
       <source>Delete partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Delete partition &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="85"/>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="87"/>
       <source>Deleting partition %1.</source>
       <translation>Deleting partition %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="103"/>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="102"/>
       <source>The installer failed to delete partition %1.</source>
       <translation>The installer failed to delete partition %1.</translation>
     </message>
@@ -1298,32 +1293,32 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>DeviceInfoWidget</name>
     <message>
-      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="97"/>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="143"/>
       <source>This device has a &lt;strong&gt;%1&lt;/strong&gt; partition table.</source>
       <translation>This device has a &lt;strong&gt;%1&lt;/strong&gt; partition table.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="104"/>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="97"/>
       <source>This is a &lt;strong&gt;loop&lt;/strong&gt; device.&lt;br&gt;&lt;br&gt;It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem.</source>
       <translation>This is a &lt;strong&gt;loop&lt;/strong&gt; device.&lt;br&gt;&lt;br&gt;It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="111"/>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="108"/>
       <source>This installer &lt;strong&gt;cannot detect a partition table&lt;/strong&gt; on the selected storage device.&lt;br&gt;&lt;br&gt;The device either has no partition table, or the partition table is corrupted or of an unknown type.&lt;br&gt;This installer can create a new partition table for you, either automatically, or through the manual partitioning page.</source>
       <translation>This installer &lt;strong&gt;cannot detect a partition table&lt;/strong&gt; on the selected storage device.&lt;br&gt;&lt;br&gt;The device either has no partition table, or the partition table is corrupted or of an unknown type.&lt;br&gt;This installer can create a new partition table for you, either automatically, or through the manual partitioning page.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="121"/>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="91"/>
       <source>&lt;br&gt;&lt;br&gt;This is the recommended partition table type for modern systems which start from an &lt;strong&gt;EFI&lt;/strong&gt; boot environment.</source>
       <translation>&lt;br&gt;&lt;br&gt;This is the recommended partition table type for modern systems which start from an &lt;strong&gt;EFI&lt;/strong&gt; boot environment.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="127"/>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="80"/>
       <source>&lt;br&gt;&lt;br&gt;This partition table type is only advisable on older systems which start from a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment. GPT is recommended in most other cases.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Warning:&lt;/strong&gt; the MBR partition table is an obsolete MS-DOS era standard.&lt;br&gt;Only 4 &lt;em&gt;primary&lt;/em&gt; partitions may be created, and of those 4, one can be an &lt;em&gt;extended&lt;/em&gt; partition, which may in turn contain many &lt;em&gt;logical&lt;/em&gt; partitions.</source>
       <translation>&lt;br&gt;&lt;br&gt;This partition table type is only advisable on older systems which start from a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment. GPT is recommended in most other cases.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Warning:&lt;/strong&gt; the MBR partition table is an obsolete MS-DOS era standard.&lt;br&gt;Only 4 &lt;em&gt;primary&lt;/em&gt; partitions may be created, and of those 4, one can be an &lt;em&gt;extended&lt;/em&gt; partition, which may in turn contain many &lt;em&gt;logical&lt;/em&gt; partitions.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="140"/>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="151"/>
       <source>The type of &lt;strong&gt;partition table&lt;/strong&gt; on the selected storage device.&lt;br&gt;&lt;br&gt;The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.&lt;br&gt;This installer will keep the current partition table unless you explicitly choose otherwise.&lt;br&gt;If unsure, on modern systems GPT is preferred.</source>
       <translation>The type of &lt;strong&gt;partition table&lt;/strong&gt; on the selected storage device.&lt;br&gt;&lt;br&gt;The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.&lt;br&gt;This installer will keep the current partition table unless you explicitly choose otherwise.&lt;br&gt;If unsure, on modern systems GPT is preferred.</translation>
     </message>
@@ -1331,13 +1326,13 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>DeviceModel</name>
     <message>
-      <location filename="../src/modules/partition/core/DeviceModel.cpp" line="84"/>
+      <location filename="../src/modules/partition/core/DeviceModel.cpp" line="82"/>
       <source>%1 - %2 (%3)</source>
       <extracomment>device[name] - size[number] (device-node[name])</extracomment>
       <translation>%1 - %2 (%3)</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/core/DeviceModel.cpp" line="95"/>
+      <location filename="../src/modules/partition/core/DeviceModel.cpp" line="93"/>
       <source>%1 - (%2)</source>
       <extracomment>device[name] - (device-node[name])</extracomment>
       <translation>%1 - (%2)</translation>
@@ -1364,7 +1359,7 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>DummyCppJob</name>
     <message>
-      <location filename="../src/modules/dummycpp/DummyCppJob.cpp" line="37"/>
+      <location filename="../src/modules/dummycpp/DummyCppJob.cpp" line="36"/>
       <source>Dummy C++ Job</source>
       <translation>Dummy C++ Job</translation>
     </message>
@@ -1378,8 +1373,8 @@ The installer will quit and all changes will be lost.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="54"/>
-      <source>Content:</source>
-      <translation>Content:</translation>
+      <source>Con&amp;tent:</source>
+      <translation type="unfinished"/>
     </message>
     <message>
       <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="64"/>
@@ -1402,40 +1397,35 @@ The installer will quit and all changes will be lost.</translation>
       <translation>&amp;Mount Point:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="123"/>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="129"/>
       <source>Si&amp;ze:</source>
       <translation>Si&amp;ze:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="133"/>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="139"/>
       <source> MiB</source>
       <translation> MiB</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="140"/>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="146"/>
       <source>Fi&amp;le System:</source>
       <translation>Fi&amp;le System:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="153"/>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="159"/>
       <source>Flags:</source>
       <translation>Flags:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="186"/>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="179"/>
       <source>Label for the filesystem</source>
       <translation>Label for the filesystem</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="196"/>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="189"/>
       <source>FS Label:</source>
       <translation>FS Label:</translation>
     </message>
-    <message>
-      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.cpp" line="291"/>
-      <source>Mountpoint already in use. Please select another one.</source>
-      <translation>Mountpoint already in use. Please select another one.</translation>
-    </message>
   </context>
   <context>
     <name>EncryptWidget</name>
@@ -1450,76 +1440,94 @@ The installer will quit and all changes will be lost.</translation>
       <translation>En&amp;crypt system</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="46"/>
+      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="43"/>
+      <source>Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="59"/>
       <source>Passphrase</source>
       <translation>Passphrase</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="56"/>
+      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="69"/>
       <source>Confirm passphrase</source>
       <translation>Confirm passphrase</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/EncryptWidget.cpp" line="104"/>
-      <location filename="../src/modules/partition/gui/EncryptWidget.cpp" line="114"/>
+      <location filename="../src/modules/partition/gui/EncryptWidget.cpp" line="134"/>
+      <location filename="../src/modules/partition/gui/EncryptWidget.cpp" line="144"/>
       <source>Please enter the same passphrase in both boxes.</source>
       <translation>Please enter the same passphrase in both boxes.</translation>
     </message>
   </context>
+  <context>
+    <name>ErrorDialog</name>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/ErrorDialog.ui" line="36"/>
+      <source>Details:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/ErrorDialog.ui" line="52"/>
+      <source>Would you like to paste the install log to the web?</source>
+      <translation type="unfinished">Would you like to paste the install log to the web?</translation>
+    </message>
+  </context>
   <context>
     <name>FillGlobalStorageJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="167"/>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="172"/>
       <source>Set partition information</source>
       <translation>Set partition information</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="196"/>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="201"/>
       <source>Install %1 on &lt;strong&gt;new&lt;/strong&gt; %2 system partition with features &lt;em&gt;%3&lt;/em&gt;</source>
       <translation>Install %1 on &lt;strong&gt;new&lt;/strong&gt; %2 system partition with features &lt;em&gt;%3&lt;/em&gt;</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="204"/>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="209"/>
       <source>Install %1 on &lt;strong&gt;new&lt;/strong&gt; %2 system partition.</source>
       <translation>Install %1 on &lt;strong&gt;new&lt;/strong&gt; %2 system partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="213"/>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="218"/>
       <source>Set up &lt;strong&gt;new&lt;/strong&gt; %2 partition with mount point &lt;strong&gt;%1&lt;/strong&gt; and features &lt;em&gt;%3&lt;/em&gt;.</source>
       <translation>Set up &lt;strong&gt;new&lt;/strong&gt; %2 partition with mount point &lt;strong&gt;%1&lt;/strong&gt; and features &lt;em&gt;%3&lt;/em&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="221"/>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="226"/>
       <source>Set up &lt;strong&gt;new&lt;/strong&gt; %2 partition with mount point &lt;strong&gt;%1&lt;/strong&gt;%3.</source>
       <translation>Set up &lt;strong&gt;new&lt;/strong&gt; %2 partition with mount point &lt;strong&gt;%1&lt;/strong&gt;%3.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="235"/>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="240"/>
       <source>Install %2 on %3 system partition &lt;strong&gt;%1&lt;/strong&gt; with features &lt;em&gt;%4&lt;/em&gt;.</source>
       <translation>Install %2 on %3 system partition &lt;strong&gt;%1&lt;/strong&gt; with features &lt;em&gt;%4&lt;/em&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="254"/>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="259"/>
       <source>Set up %3 partition &lt;strong&gt;%1&lt;/strong&gt; with mount point &lt;strong&gt;%2&lt;/strong&gt; and features &lt;em&gt;%4&lt;/em&gt;.</source>
       <translation>Set up %3 partition &lt;strong&gt;%1&lt;/strong&gt; with mount point &lt;strong&gt;%2&lt;/strong&gt; and features &lt;em&gt;%4&lt;/em&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="263"/>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="268"/>
       <source>Set up %3 partition &lt;strong&gt;%1&lt;/strong&gt; with mount point &lt;strong&gt;%2&lt;/strong&gt;%4.</source>
       <translation>Set up %3 partition &lt;strong&gt;%1&lt;/strong&gt; with mount point &lt;strong&gt;%2&lt;/strong&gt;%4.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="244"/>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="249"/>
       <source>Install %2 on %3 system partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Install %2 on %3 system partition &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="278"/>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="283"/>
       <source>Install boot loader on &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Install boot loader on &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="287"/>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="292"/>
       <source>Setting up mount points.</source>
       <translation>Setting up mount points.</translation>
     </message>
@@ -1586,22 +1594,22 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>FormatPartitionJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="36"/>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="39"/>
       <source>Format partition %1 (file system: %2, size: %3 MiB) on %4.</source>
       <translation>Format partition %1 (file system: %2, size: %3 MiB) on %4.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="47"/>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="50"/>
       <source>Format &lt;strong&gt;%3MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; with file system &lt;strong&gt;%2&lt;/strong&gt;.</source>
       <translation>Format &lt;strong&gt;%3MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; with file system &lt;strong&gt;%2&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="58"/>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="61"/>
       <source>Formatting partition %1 with file system %2.</source>
       <translation>Formatting partition %1 with file system %2.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="72"/>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="73"/>
       <source>The installer failed to format partition %1 on disk '%2'.</source>
       <translation>The installer failed to format partition %1 on disk '%2'.</translation>
     </message>
@@ -1716,7 +1724,7 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>InitcpioJob</name>
     <message>
-      <location filename="../src/modules/initcpio/InitcpioJob.cpp" line="31"/>
+      <location filename="../src/modules/initcpio/InitcpioJob.cpp" line="32"/>
       <source>Creating initramfs with mkinitcpio.</source>
       <translation>Creating initramfs with mkinitcpio.</translation>
     </message>
@@ -1732,17 +1740,17 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>InteractiveTerminalPage</name>
     <message>
-      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="45"/>
+      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="46"/>
       <source>Konsole not installed</source>
       <translation>Konsole not installed</translation>
     </message>
     <message>
-      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="45"/>
+      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="47"/>
       <source>Please install KDE Konsole and try again!</source>
       <translation>Please install KDE Konsole and try again!</translation>
     </message>
     <message>
-      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="106"/>
+      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="118"/>
       <source>Executing script: &amp;nbsp;&lt;code&gt;%1&lt;/code&gt;</source>
       <translation>Executing script: &amp;nbsp;&lt;code&gt;%1&lt;/code&gt;</translation>
     </message>
@@ -1794,6 +1802,29 @@ The installer will quit and all changes will be lost.</translation>
       <translation>&amp;OK</translation>
     </message>
   </context>
+  <context>
+    <name>LOSHJob</name>
+    <message>
+      <location filename="../src/modules/luksopenswaphookcfg/LOSHJob.cpp" line="36"/>
+      <source>Configuring encrypted swap.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksopenswaphookcfg/LOSHJob.cpp" line="88"/>
+      <source>No target system available.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksopenswaphookcfg/LOSHJob.cpp" line="96"/>
+      <source>No rootMountPoint is set.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksopenswaphookcfg/LOSHJob.cpp" line="101"/>
+      <source>No configFilePath is set.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
   <context>
     <name>LicensePage</name>
     <message>
@@ -2513,12 +2544,12 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>PackageModel</name>
     <message>
-      <location filename="../src/modules/netinstall/PackageModel.cpp" line="168"/>
+      <location filename="../src/modules/netinstall/PackageModel.cpp" line="205"/>
       <source>Name</source>
       <translation>Name</translation>
     </message>
     <message>
-      <location filename="../src/modules/netinstall/PackageModel.cpp" line="168"/>
+      <location filename="../src/modules/netinstall/PackageModel.cpp" line="205"/>
       <source>Description</source>
       <translation>Description</translation>
     </message>
@@ -2641,42 +2672,42 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>PartitionLabelsView</name>
     <message>
-      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="190"/>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="189"/>
       <source>Root</source>
       <translation>Root</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="194"/>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="193"/>
       <source>Home</source>
       <translation>Home</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="198"/>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="197"/>
       <source>Boot</source>
       <translation>Boot</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="203"/>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="202"/>
       <source>EFI system</source>
       <translation>EFI system</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="207"/>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="206"/>
       <source>Swap</source>
       <translation>Swap</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="211"/>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="210"/>
       <source>New partition for %1</source>
       <translation>New partition for %1</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="215"/>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="214"/>
       <source>New partition</source>
       <translation>New partition</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="239"/>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="238"/>
       <source>%1  %2</source>
       <extracomment>size[number] filesystem[name]</extracomment>
       <translation>%1  %2</translation>
@@ -2685,39 +2716,39 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>PartitionModel</name>
     <message>
-      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="159"/>
-      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="203"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="157"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="201"/>
       <source>Free Space</source>
       <translation>Free Space</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="163"/>
-      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="207"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="161"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="205"/>
       <source>New partition</source>
       <translation>New partition</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="300"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="298"/>
       <source>Name</source>
       <translation>Name</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="302"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="300"/>
       <source>File System</source>
       <translation>File System</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="304"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="302"/>
       <source>File System Label</source>
       <translation>File System Label</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="306"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="304"/>
       <source>Mount Point</source>
       <translation>Mount Point</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="308"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="306"/>
       <source>Size</source>
       <translation>Size</translation>
     </message>
@@ -2813,82 +2844,82 @@ The installer will quit and all changes will be lost.</translation>
       <translation>Partitions</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="303"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="297"/>
       <source>Current:</source>
       <translation>Current:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="321"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="315"/>
       <source>After:</source>
       <translation>After:</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="530"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="524"/>
       <source>No EFI system partition configured</source>
       <translation>No EFI system partition configured</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="534"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="528"/>
       <source>EFI system partition configured incorrectly</source>
       <translation>EFI system partition configured incorrectly</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="539"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="533"/>
       <source>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;To configure an EFI system partition, go back and select or create a suitable filesystem.</source>
       <translation>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;To configure an EFI system partition, go back and select or create a suitable filesystem.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="550"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="544"/>
       <source>The filesystem must be mounted on &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>The filesystem must be mounted on &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="556"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="550"/>
       <source>The filesystem must have type FAT32.</source>
       <translation>The filesystem must have type FAT32.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="564"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="558"/>
       <source>The filesystem must be at least %1 MiB in size.</source>
       <translation>The filesystem must be at least %1 MiB in size.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="570"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="564"/>
       <source>The filesystem must have flag &lt;strong&gt;%1&lt;/strong&gt; set.</source>
       <translation>The filesystem must have flag &lt;strong&gt;%1&lt;/strong&gt; set.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="576"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="570"/>
       <source>You can continue without setting up an EFI system partition but your system may fail to start.</source>
       <translation>You can continue without setting up an EFI system partition but your system may fail to start.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="593"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="587"/>
       <source>Option to use GPT on BIOS</source>
       <translation>Option to use GPT on BIOS</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="594"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="588"/>
       <source>A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.&lt;br/&gt;&lt;br/&gt;To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the &lt;strong&gt;bios_grub&lt;/strong&gt; flag enabled.&lt;br/&gt;&lt;br/&gt;An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT.</source>
       <translation>A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.&lt;br/&gt;&lt;br/&gt;To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the &lt;strong&gt;bios_grub&lt;/strong&gt; flag enabled.&lt;br/&gt;&lt;br/&gt;An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="626"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="620"/>
       <source>Boot partition not encrypted</source>
       <translation>Boot partition not encrypted</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="627"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="621"/>
       <source>A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.&lt;br/&gt;&lt;br/&gt;There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.&lt;br/&gt;You may continue if you wish, but filesystem unlocking will happen later during system startup.&lt;br/&gt;To encrypt the boot partition, go back and recreate it, selecting &lt;strong&gt;Encrypt&lt;/strong&gt; in the partition creation window.</source>
       <translation>A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.&lt;br/&gt;&lt;br/&gt;There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.&lt;br/&gt;You may continue if you wish, but filesystem unlocking will happen later during system startup.&lt;br/&gt;To encrypt the boot partition, go back and recreate it, selecting &lt;strong&gt;Encrypt&lt;/strong&gt; in the partition creation window.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="714"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="712"/>
       <source>has at least one disk device available.</source>
       <translation>has at least one disk device available.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="715"/>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="713"/>
       <source>There are no partitions to install on.</source>
       <translation>There are no partitions to install on.</translation>
     </message>
@@ -2936,17 +2967,17 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>PreserveFiles</name>
     <message>
-      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="79"/>
+      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="53"/>
       <source>Saving files for later ...</source>
       <translation>Saving files for later ...</translation>
     </message>
     <message>
-      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="118"/>
+      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="61"/>
       <source>No files configured to save for later.</source>
       <translation>No files configured to save for later.</translation>
     </message>
     <message>
-      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="172"/>
+      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="85"/>
       <source>Not all of the configured files could be preserved.</source>
       <translation>Not all of the configured files could be preserved.</translation>
     </message>
@@ -2954,14 +2985,14 @@ The installer will quit and all changes will be lost.</translation>
   <context>
     <name>ProcessResult</name>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="425"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="309"/>
       <source>
 There was no output from the command.</source>
       <translation>
 There was no output from the command.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="426"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="310"/>
       <source>
 Output:
 </source>
@@ -2970,52 +3001,52 @@ Output:
 </translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="430"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="314"/>
       <source>External command crashed.</source>
       <translation>External command crashed.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="431"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="315"/>
       <source>Command &lt;i&gt;%1&lt;/i&gt; crashed.</source>
       <translation>Command &lt;i&gt;%1&lt;/i&gt; crashed.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="436"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="320"/>
       <source>External command failed to start.</source>
       <translation>External command failed to start.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="437"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="321"/>
       <source>Command &lt;i&gt;%1&lt;/i&gt; failed to start.</source>
       <translation>Command &lt;i&gt;%1&lt;/i&gt; failed to start.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="441"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="325"/>
       <source>Internal error when starting command.</source>
       <translation>Internal error when starting command.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="442"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="326"/>
       <source>Bad parameters for process job call.</source>
       <translation>Bad parameters for process job call.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="446"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="330"/>
       <source>External command failed to finish.</source>
       <translation>External command failed to finish.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="447"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="331"/>
       <source>Command &lt;i&gt;%1&lt;/i&gt; failed to finish in %2 seconds.</source>
       <translation>Command &lt;i&gt;%1&lt;/i&gt; failed to finish in %2 seconds.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="454"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="338"/>
       <source>External command finished with errors.</source>
       <translation>External command finished with errors.</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="455"/>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="339"/>
       <source>Command &lt;i&gt;%1&lt;/i&gt; finished with exit code %2.</source>
       <translation>Command &lt;i&gt;%1&lt;/i&gt; finished with exit code %2.</translation>
     </message>
@@ -3028,22 +3059,22 @@ Output:
       <translation>%1 (%2)</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="28"/>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="33"/>
       <source>unknown</source>
       <translation>unknown</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="30"/>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="35"/>
       <source>extended</source>
       <translation>extended</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="32"/>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="37"/>
       <source>unformatted</source>
       <translation>unformatted</translation>
     </message>
     <message>
-      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="34"/>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="39"/>
       <source>swap</source>
       <translation>swap</translation>
     </message>
@@ -3078,12 +3109,12 @@ Output:
       <translation>Could not create new random file &lt;pre&gt;%1&lt;/pre&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/packagechooser/PackageModel.cpp" line="63"/>
+      <location filename="../src/modules/packagechooser/PackageModel.cpp" line="74"/>
       <source>No product</source>
       <translation>No product</translation>
     </message>
     <message>
-      <location filename="../src/modules/packagechooser/PackageModel.cpp" line="71"/>
+      <location filename="../src/modules/packagechooser/PackageModel.cpp" line="82"/>
       <source>No description provided.</source>
       <translation>No description provided.</translation>
     </message>
@@ -3093,7 +3124,7 @@ Output:
       <translation>(no mount point)</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="41"/>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="40"/>
       <source>Unpartitioned space or unknown partition table</source>
       <translation>Unpartitioned space or unknown partition table</translation>
     </message>
@@ -3119,18 +3150,18 @@ Output:
   <context>
     <name>RemoveVolumeGroupJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="24"/>
-      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="36"/>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="26"/>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="38"/>
       <source>Remove Volume Group named %1.</source>
       <translation>Remove Volume Group named %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="30"/>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="32"/>
       <source>Remove Volume Group named &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Remove Volume Group named &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="48"/>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="46"/>
       <source>The installer failed to remove a volume group named '%1'.</source>
       <translation>The installer failed to remove a volume group named '%1'.</translation>
     </message>
@@ -3143,69 +3174,69 @@ Output:
       <translation>Form</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="127"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="128"/>
       <source>Select where to install %1.&lt;br/&gt;&lt;font color="red"&gt;Warning: &lt;/font&gt;this will delete all files on the selected partition.</source>
       <translation>Select where to install %1.&lt;br/&gt;&lt;font color="red"&gt;Warning: &lt;/font&gt;this will delete all files on the selected partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="149"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="150"/>
       <source>The selected item does not appear to be a valid partition.</source>
       <translation>The selected item does not appear to be a valid partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="157"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="158"/>
       <source>%1 cannot be installed on empty space. Please select an existing partition.</source>
       <translation>%1 cannot be installed on empty space. Please select an existing partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="167"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="168"/>
       <source>%1 cannot be installed on an extended partition. Please select an existing primary or logical partition.</source>
       <translation>%1 cannot be installed on an extended partition. Please select an existing primary or logical partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="177"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="178"/>
       <source>%1 cannot be installed on this partition.</source>
       <translation>%1 cannot be installed on this partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="183"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="184"/>
       <source>Data partition (%1)</source>
       <translation>Data partition (%1)</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="203"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="204"/>
       <source>Unknown system partition (%1)</source>
       <translation>Unknown system partition (%1)</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="207"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="208"/>
       <source>%1 system partition (%2)</source>
       <translation>%1 system partition (%2)</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="218"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="220"/>
       <source>&lt;strong&gt;%4&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB.</source>
       <translation>&lt;strong&gt;%4&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="240"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="242"/>
       <source>&lt;strong&gt;%2&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</source>
       <translation>&lt;strong&gt;%2&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="251"/>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="267"/>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="292"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="253"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="269"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="294"/>
       <source>&lt;strong&gt;%3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;%1 will be installed on %2.&lt;br/&gt;&lt;font color="red"&gt;Warning: &lt;/font&gt;all data on partition %2 will be lost.</source>
       <translation>&lt;strong&gt;%3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;%1 will be installed on %2.&lt;br/&gt;&lt;font color="red"&gt;Warning: &lt;/font&gt;all data on partition %2 will be lost.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="259"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="261"/>
       <source>The EFI system partition at %1 will be used for starting %2.</source>
       <translation>The EFI system partition at %1 will be used for starting %2.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="275"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="277"/>
       <source>EFI system partition:</source>
       <translation>EFI system partition:</translation>
     </message>
@@ -3230,68 +3261,68 @@ Output:
   <context>
     <name>ResizeFSJob</name>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="46"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="45"/>
       <source>Resize Filesystem Job</source>
       <translation>Resize Filesystem Job</translation>
     </message>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="169"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="168"/>
       <source>Invalid configuration</source>
       <translation>Invalid configuration</translation>
     </message>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="170"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="169"/>
       <source>The file-system resize job has an invalid configuration and will not run.</source>
       <translation>The file-system resize job has an invalid configuration and will not run.</translation>
     </message>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="175"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="174"/>
       <source>KPMCore not Available</source>
       <translation>KPMCore not Available</translation>
     </message>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="176"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="175"/>
       <source>Calamares cannot start KPMCore for the file-system resize job.</source>
       <translation>Calamares cannot start KPMCore for the file-system resize job.</translation>
     </message>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="184"/>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="193"/>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="204"/>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="213"/>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="231"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="183"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="192"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="203"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="212"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="230"/>
       <source>Resize Failed</source>
       <translation>Resize Failed</translation>
     </message>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="186"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="185"/>
       <source>The filesystem %1 could not be found in this system, and cannot be resized.</source>
       <translation>The filesystem %1 could not be found in this system, and cannot be resized.</translation>
     </message>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="187"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="186"/>
       <source>The device %1 could not be found in this system, and cannot be resized.</source>
       <translation>The device %1 could not be found in this system, and cannot be resized.</translation>
     </message>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="195"/>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="206"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="194"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="205"/>
       <source>The filesystem %1 cannot be resized.</source>
       <translation>The filesystem %1 cannot be resized.</translation>
     </message>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="196"/>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="207"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="195"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="206"/>
       <source>The device %1 cannot be resized.</source>
       <translation>The device %1 cannot be resized.</translation>
     </message>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="214"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="213"/>
       <source>The filesystem %1 must be resized, but cannot.</source>
       <translation>The filesystem %1 must be resized, but cannot.</translation>
     </message>
     <message>
-      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="215"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="214"/>
       <source>The device %1 must be resized, but cannot</source>
       <translation>The device %1 must be resized, but cannot</translation>
     </message>
@@ -3299,17 +3330,17 @@ Output:
   <context>
     <name>ResizePartitionJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="40"/>
+      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="41"/>
       <source>Resize partition %1.</source>
       <translation>Resize partition %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="47"/>
+      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="48"/>
       <source>Resize &lt;strong&gt;%2MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; to &lt;strong&gt;%3MiB&lt;/strong&gt;.</source>
       <translation>Resize &lt;strong&gt;%2MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; to &lt;strong&gt;%3MiB&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="58"/>
+      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="59"/>
       <source>Resizing %2MiB partition %1 to %3MiB.</source>
       <translation>Resizing %2MiB partition %1 to %3MiB.</translation>
     </message>
@@ -3330,18 +3361,18 @@ Output:
   <context>
     <name>ResizeVolumeGroupJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="27"/>
-      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="45"/>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="28"/>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="46"/>
       <source>Resize volume group named %1 from %2 to %3.</source>
       <translation>Resize volume group named %1 from %2 to %3.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="36"/>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="37"/>
       <source>Resize volume group named &lt;strong&gt;%1&lt;/strong&gt; from &lt;strong&gt;%2&lt;/strong&gt; to &lt;strong&gt;%3&lt;/strong&gt;.</source>
       <translation>Resize volume group named &lt;strong&gt;%1&lt;/strong&gt; from &lt;strong&gt;%2&lt;/strong&gt; to &lt;strong&gt;%3&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="60"/>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="57"/>
       <source>The installer failed to resize a volume group named '%1'.</source>
       <translation>The installer failed to resize a volume group named '%1'.</translation>
     </message>
@@ -3362,12 +3393,12 @@ Output:
   <context>
     <name>ScanningDialog</name>
     <message>
-      <location filename="../src/modules/partition/gui/ScanningDialog.cpp" line="64"/>
+      <location filename="../src/modules/partition/gui/ScanningDialog.cpp" line="68"/>
       <source>Scanning storage devices...</source>
       <translation>Scanning storage devices...</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/gui/ScanningDialog.cpp" line="64"/>
+      <location filename="../src/modules/partition/gui/ScanningDialog.cpp" line="68"/>
       <source>Partitioning</source>
       <translation>Partitioning</translation>
     </message>
@@ -3435,82 +3466,82 @@ Output:
   <context>
     <name>SetPartFlagsJob</name>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="43"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="45"/>
       <source>Set flags on partition %1.</source>
       <translation>Set flags on partition %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="49"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="51"/>
       <source>Set flags on %1MiB %2 partition.</source>
       <translation>Set flags on %1MiB %2 partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="53"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="55"/>
       <source>Set flags on new partition.</source>
       <translation>Set flags on new partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="65"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="67"/>
       <source>Clear flags on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Clear flags on partition &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="71"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="73"/>
       <source>Clear flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</source>
       <translation>Clear flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="75"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="77"/>
       <source>Clear flags on new partition.</source>
       <translation>Clear flags on new partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="80"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="82"/>
       <source>Flag partition &lt;strong&gt;%1&lt;/strong&gt; as &lt;strong&gt;%2&lt;/strong&gt;.</source>
       <translation>Flag partition &lt;strong&gt;%1&lt;/strong&gt; as &lt;strong&gt;%2&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="89"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="91"/>
       <source>Flag %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition as &lt;strong&gt;%3&lt;/strong&gt;.</source>
       <translation>Flag %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition as &lt;strong&gt;%3&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="96"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="98"/>
       <source>Flag new partition as &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Flag new partition as &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="108"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="110"/>
       <source>Clearing flags on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Clearing flags on partition &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="114"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="116"/>
       <source>Clearing flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</source>
       <translation>Clearing flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="119"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="121"/>
       <source>Clearing flags on new partition.</source>
       <translation>Clearing flags on new partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="124"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="126"/>
       <source>Setting flags &lt;strong&gt;%2&lt;/strong&gt; on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
       <translation>Setting flags &lt;strong&gt;%2&lt;/strong&gt; on partition &lt;strong&gt;%1&lt;/strong&gt;.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="133"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="135"/>
       <source>Setting flags &lt;strong&gt;%3&lt;/strong&gt; on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</source>
       <translation>Setting flags &lt;strong&gt;%3&lt;/strong&gt; on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="140"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="142"/>
       <source>Setting flags &lt;strong&gt;%1&lt;/strong&gt; on new partition.</source>
       <translation>Setting flags &lt;strong&gt;%1&lt;/strong&gt; on new partition.</translation>
     </message>
     <message>
-      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="157"/>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="156"/>
       <source>The installer failed to set flags on partition %1.</source>
       <translation>The installer failed to set flags on partition %1.</translation>
     </message>
@@ -3636,7 +3667,7 @@ Output:
   <context>
     <name>ShellProcessJob</name>
     <message>
-      <location filename="../src/modules/shellprocess/ShellProcessJob.cpp" line="41"/>
+      <location filename="../src/modules/shellprocess/ShellProcessJob.cpp" line="40"/>
       <source>Shell Processes Job</source>
       <translation>Shell Processes Job</translation>
     </message>
@@ -3653,27 +3684,27 @@ Output:
   <context>
     <name>StandardButtons</name>
     <message>
-      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="28"/>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="23"/>
       <source>&amp;OK</source>
       <translation>&amp;OK</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="29"/>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="24"/>
       <source>&amp;Yes</source>
       <translation>&amp;Yes</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="30"/>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="25"/>
       <source>&amp;No</source>
       <translation>&amp;No</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="31"/>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="26"/>
       <source>&amp;Cancel</source>
       <translation>&amp;Cancel</translation>
     </message>
     <message>
-      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="32"/>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="27"/>
       <source>&amp;Close</source>
       <translation>&amp;Close</translation>
     </message>
@@ -3681,12 +3712,12 @@ Output:
   <context>
     <name>TrackingInstallJob</name>
     <message>
-      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="102"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="101"/>
       <source>Installation feedback</source>
       <translation>Installation feedback</translation>
     </message>
     <message>
-      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="108"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="107"/>
       <source>Sending installation feedback.</source>
       <translation>Sending installation feedback.</translation>
     </message>
@@ -3704,28 +3735,28 @@ Output:
   <context>
     <name>TrackingKUserFeedbackJob</name>
     <message>
-      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="187"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="193"/>
       <source>KDE user feedback</source>
       <translation>KDE user feedback</translation>
     </message>
     <message>
-      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="193"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="199"/>
       <source>Configuring KDE user feedback.</source>
       <translation>Configuring KDE user feedback.</translation>
     </message>
     <message>
-      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="215"/>
       <location filename="../src/modules/tracking/TrackingJobs.cpp" line="221"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="229"/>
       <source>Error in KDE user feedback configuration.</source>
       <translation>Error in KDE user feedback configuration.</translation>
     </message>
     <message>
-      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="216"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="222"/>
       <source>Could not configure KDE user feedback correctly, script error %1.</source>
       <translation>Could not configure KDE user feedback correctly, script error %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="222"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="230"/>
       <source>Could not configure KDE user feedback correctly, Calamares error %1.</source>
       <translation>Could not configure KDE user feedback correctly, Calamares error %1.</translation>
     </message>
@@ -3744,17 +3775,17 @@ Output:
     </message>
     <message>
       <location filename="../src/modules/tracking/TrackingJobs.cpp" line="165"/>
-      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="171"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="174"/>
       <source>Error in machine feedback configuration.</source>
       <translation>Error in machine feedback configuration.</translation>
     </message>
     <message>
-      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="166"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="167"/>
       <source>Could not configure machine feedback correctly, script error %1.</source>
       <translation>Could not configure machine feedback correctly, script error %1.</translation>
     </message>
     <message>
-      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="172"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="176"/>
       <source>Could not configure machine feedback correctly, Calamares error %1.</source>
       <translation>Could not configure machine feedback correctly, Calamares error %1.</translation>
     </message>
@@ -3810,6 +3841,24 @@ Output:
       <translation>Feedback</translation>
     </message>
   </context>
+  <context>
+    <name>UmountJob</name>
+    <message>
+      <location filename="../src/modules/umount/UmountJob.cpp" line="39"/>
+      <source>Unmount file systems.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/umount/UmountJob.cpp" line="122"/>
+      <source>No target system available.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/umount/UmountJob.cpp" line="130"/>
+      <source>No rootMountPoint is set.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
   <context>
     <name>UsersPage</name>
     <message>
@@ -4022,6 +4071,50 @@ Output:
       <translation>Welcome</translation>
     </message>
   </context>
+  <context>
+    <name>ZfsJob</name>
+    <message>
+      <location filename="../src/modules/zfs/ZfsJob.cpp" line="101"/>
+      <source>Create ZFS pools and datasets</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/zfs/ZfsJob.cpp" line="162"/>
+      <source>Failed to create zpool on </source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/zfs/ZfsJob.cpp" line="180"/>
+      <source>Configuration Error</source>
+      <translation type="unfinished">Configuration Error</translation>
+    </message>
+    <message>
+      <location filename="../src/modules/zfs/ZfsJob.cpp" line="181"/>
+      <source>No partitions are available for Zfs.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/zfs/ZfsJob.cpp" line="192"/>
+      <source>Internal data missing</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/zfs/ZfsJob.cpp" line="192"/>
+      <location filename="../src/modules/zfs/ZfsJob.cpp" line="257"/>
+      <source>Failed to create zpool</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/zfs/ZfsJob.cpp" line="329"/>
+      <source>Failed to create dataset</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/zfs/ZfsJob.cpp" line="330"/>
+      <source>The output was: </source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
   <context>
     <name>about</name>
     <message>
@@ -4097,6 +4190,30 @@ Output:
             This log is copied to /var/log/installation.log of the target system.&lt;/p&gt;</translation>
     </message>
   </context>
+  <context>
+    <name>finishedq@mobile</name>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq@mobile.qml" line="36"/>
+      <source>Installation Completed</source>
+      <translation type="unfinished">Installation Completed</translation>
+    </message>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq@mobile.qml" line="43"/>
+      <source>%1 has been installed on your computer.&lt;br/&gt;
+            You may now restart your device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq@mobile.qml" line="65"/>
+      <source>Close</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq@mobile.qml" line="71"/>
+      <source>Restart</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
   <context>
     <name>i18n</name>
     <message>
diff --git a/lang/calamares_en_GB.ts b/lang/calamares_en_GB.ts
index 3578d4554f16741c3200b544f8e2b442d661a92f..b8ddc023f3e0bf9492c5711adbf8f7fe98aff5bc 100644
--- a/lang/calamares_en_GB.ts
+++ b/lang/calamares_en_GB.ts
@@ -1989,7 +1989,7 @@ The installer will quit and all changes will be lost.</translation>
     <message>
       <location filename="../src/modules/machineid/MachineIdJob.cpp" line="53"/>
       <source>Configuration Error</source>
-      <translation type="unfinished"/>
+      <translation>Configuration  Error </translation>
     </message>
     <message>
       <location filename="../src/modules/machineid/MachineIdJob.cpp" line="54"/>
diff --git a/lang/calamares_hi.ts b/lang/calamares_hi.ts
index 7f20e8bcdab1dc3077b94efb6b20643ee54b809b..16eee77b533d243f505732b237989e95c936f292 100644
--- a/lang/calamares_hi.ts
+++ b/lang/calamares_hi.ts
@@ -689,27 +689,27 @@ The installer will quit and all changes will be lost.</source>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="259"/>
       <source>Successfully unmounted %1.</source>
-      <translation type="unfinished"/>
+      <translation>%1 को माउंट से हटाना सफल।</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="266"/>
       <source>Successfully disabled swap %1.</source>
-      <translation type="unfinished"/>
+      <translation>%1 स्वैप निष्क्रिय करना सफल।</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="292"/>
       <source>Successfully cleared swap %1.</source>
-      <translation type="unfinished"/>
+      <translation>%1 स्वैप रिक्त करना सफल।</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="306"/>
       <source>Successfully closed mapper device %1.</source>
-      <translation type="unfinished"/>
+      <translation>प्रतिचित्रण उपकरण %1 बंद करना सफल।</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="319"/>
       <source>Successfully disabled volume group %1.</source>
-      <translation type="unfinished"/>
+      <translation>वॉल्यूम समूह %1 निष्क्रिय करना सफल।</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="358"/>
diff --git a/lang/calamares_id.ts b/lang/calamares_id.ts
index d3a29ac4283b0f46de7c194d61e31c84ddaa68f7..a8b1d4cbf464bd8560127682342b4c1baf6e0bd3 100644
--- a/lang/calamares_id.ts
+++ b/lang/calamares_id.ts
@@ -6,7 +6,7 @@
     <message>
       <location filename="../src/modules/partition/jobs/AutoMountManagementJob.cpp" line="22"/>
       <source>Manage auto-mount settings</source>
-      <translation type="unfinished"/>
+      <translation>Kelola pengaturan mount otomatis</translation>
     </message>
   </context>
   <context>
@@ -114,12 +114,12 @@
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="141"/>
       <source>Uploads the session log to the configured pastebin.</source>
-      <translation type="unfinished"/>
+      <translation>Unggah catatan sesi ke pastebin yang telah dikonfigurasi.</translation>
     </message>
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="144"/>
       <source>Send Session Log</source>
-      <translation type="unfinished"/>
+      <translation>Kirim Catatan Sesi</translation>
     </message>
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="118"/>
@@ -165,7 +165,7 @@
     <message>
       <location filename="../src/libcalamares/JobExample.cpp" line="30"/>
       <source>Programmed job failure was explicitly requested.</source>
-      <translation type="unfinished"/>
+      <translation>Kegagalan pekerjaan diprogram diminta secara eksplisit. </translation>
     </message>
   </context>
   <context>
@@ -189,7 +189,7 @@
     <message>
       <location filename="../src/libcalamares/ProcessJob.cpp" line="43"/>
       <source>Run command '%1' in target system.</source>
-      <translation>Jalankan perintah '%1' di dalam sistem target.</translation>
+      <translation>Jalankan perintah '%1' pada sistem target.</translation>
     </message>
     <message>
       <location filename="../src/libcalamares/ProcessJob.cpp" line="43"/>
@@ -245,7 +245,7 @@
     <message>
       <location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="88"/>
       <source>QML Step &lt;i&gt;%1&lt;/i&gt;.</source>
-      <translation type="unfinished"/>
+      <translation>QML Langkah &lt;i&gt;%1&lt;/i&gt;.</translation>
     </message>
     <message>
       <location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="268"/>
@@ -277,7 +277,7 @@
     <message>
       <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="121"/>
       <source>System-requirements checking is complete.</source>
-      <translation type="unfinished"/>
+      <translation>Pengecekan kebutuhan sistem telah selesai.</translation>
     </message>
   </context>
   <context>
@@ -295,7 +295,7 @@
     <message>
       <location filename="../src/libcalamaresui/ViewManager.cpp" line="163"/>
       <source>Would you like to paste the install log to the web?</source>
-      <translation>Maukah anda untuk menempelkan log instalasi ke situs?</translation>
+      <translation>Maukah anda menempelkan log instalasi ke situs?</translation>
     </message>
     <message>
       <location filename="../src/libcalamaresui/ViewManager.cpp" line="179"/>
@@ -429,7 +429,7 @@ Link copied to clipboard</source>
     <message>
       <location filename="../src/libcalamaresui/ViewManager.cpp" line="425"/>
       <source>&amp;Done</source>
-      <translation>&amp;Kelar</translation>
+      <translation>&amp;Selesai</translation>
     </message>
     <message>
       <location filename="../src/libcalamaresui/ViewManager.cpp" line="444"/>
@@ -1054,12 +1054,12 @@ Instalasi dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan.</translat
     <message>
       <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="231"/>
       <source>Label for the filesystem</source>
-      <translation type="unfinished"/>
+      <translation>Label untuk filesystem</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="241"/>
       <source>FS Label:</source>
-      <translation type="unfinished"/>
+      <translation>Label FS:</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="65"/>
@@ -1418,12 +1418,12 @@ Instalasi dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan.</translat
     <message>
       <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="186"/>
       <source>Label for the filesystem</source>
-      <translation type="unfinished"/>
+      <translation>Label untuk filesystem</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="196"/>
       <source>FS Label:</source>
-      <translation type="unfinished"/>
+      <translation>Label FS:</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.cpp" line="291"/>
@@ -1582,7 +1582,7 @@ Instalasi dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan.</translat
     <message>
       <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="36"/>
       <source>Format partition %1 (file system: %2, size: %3 MiB) on %4.</source>
-      <translation type="unfinished"/>
+      <translation>Format partisi %1 (file system: %2, ukuran %3 MiB) pada %4.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="47"/>
@@ -1645,12 +1645,12 @@ Instalasi dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan.</translat
     <message>
       <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="193"/>
       <source>is running the installer as an administrator (root)</source>
-      <translation type="unfinished"/>
+      <translation>menjalankan installer sebagai administrator (root)</translation>
     </message>
     <message>
       <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="196"/>
       <source>The setup program is not running with administrator rights.</source>
-      <translation type="unfinished"/>
+      <translation>Installer tidak dijalankan dengan kewenangan administrator.</translation>
     </message>
     <message>
       <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="197"/>
@@ -1699,7 +1699,7 @@ Instalasi dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan.</translat
     <message>
       <location filename="../src/modules/oemid/IDJob.cpp" line="53"/>
       <source>Could not open file &lt;code&gt;%1&lt;/code&gt;.</source>
-      <translation type="unfinished"/>
+      <translation>Tidak dapat membuka berkas &lt;code&gt;%1&lt;/code&gt;.</translation>
     </message>
     <message>
       <location filename="../src/modules/oemid/IDJob.cpp" line="60"/>
@@ -1712,7 +1712,7 @@ Instalasi dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan.</translat
     <message>
       <location filename="../src/modules/initcpio/InitcpioJob.cpp" line="31"/>
       <source>Creating initramfs with mkinitcpio.</source>
-      <translation type="unfinished"/>
+      <translation>Membuat initramfs menggunakan mkinitcpio.</translation>
     </message>
   </context>
   <context>
@@ -1720,7 +1720,7 @@ Instalasi dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan.</translat
     <message>
       <location filename="../src/modules/initramfs/InitramfsJob.cpp" line="28"/>
       <source>Creating initramfs.</source>
-      <translation type="unfinished"/>
+      <translation>Membuat initramfs.</translation>
     </message>
   </context>
   <context>
@@ -2031,12 +2031,12 @@ Instalasi dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan.</translat
     <message>
       <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="52"/>
       <source>Browser software</source>
-      <translation>Peramban perangkat lunak</translation>
+      <translation>Perangkat lunak peramban</translation>
     </message>
     <message>
       <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="53"/>
       <source>Browser package</source>
-      <translation>Peramban paket</translation>
+      <translation>Paket peramban</translation>
     </message>
     <message>
       <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="54"/>
@@ -2046,12 +2046,12 @@ Instalasi dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan.</translat
     <message>
       <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="55"/>
       <source>Kernel</source>
-      <translation>Inti</translation>
+      <translation>Kernel</translation>
     </message>
     <message>
       <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="56"/>
       <source>Services</source>
-      <translation>Jasa</translation>
+      <translation>Servis</translation>
     </message>
     <message>
       <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="57"/>
@@ -2587,12 +2587,12 @@ Instalasi dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan.</translat
       <location filename="../src/modules/users/page_usersetup.ui" line="380"/>
       <location filename="../src/modules/users/page_usersetup.ui" line="550"/>
       <source>Repeat Password</source>
-      <translation type="unfinished"/>
+      <translation>Ulangi Kata Sandi</translation>
     </message>
     <message>
       <location filename="../src/modules/users/page_usersetup.ui" line="455"/>
       <source>When this box is checked, password-strength checking is done and you will not be able to use a weak password.</source>
-      <translation type="unfinished"/>
+      <translation>Ketikan kotak ini dicentang, pengecekan kekuatan kata sandi akan dilakukan dan anda tidak akan dapat menggunakan kata sandi yang lemah.</translation>
     </message>
     <message>
       <location filename="../src/modules/users/page_usersetup.ui" line="458"/>
@@ -4252,7 +4252,7 @@ Keluaran:
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="136"/>
       <source>root is not allowed as username.</source>
-      <translation type="unfinished"/>
+      <translation>root tidak boleh digunakan sebagai nama pengguna.</translation>
     </message>
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="145"/>
@@ -4287,7 +4287,7 @@ Keluaran:
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="234"/>
       <source>Repeat Password</source>
-      <translation type="unfinished"/>
+      <translation>Ulangi Kata Sandi</translation>
     </message>
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="261"/>
@@ -4297,27 +4297,27 @@ Keluaran:
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="406"/>
       <source>Validate passwords quality</source>
-      <translation type="unfinished"/>
+      <translation>Validasi kualitas kata sandi</translation>
     </message>
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="416"/>
       <source>When this box is checked, password-strength checking is done and you will not be able to use a weak password.</source>
-      <translation type="unfinished"/>
+      <translation>Ketikan kotak ini dicentang, pengecekan kekuatan kata sandi akan dilakukan dan anda tidak akan dapat menggunakan kata sandi yang lemah.</translation>
     </message>
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="398"/>
       <source>Log in automatically without asking for the password</source>
-      <translation type="unfinished"/>
+      <translation>Masuk ke dalam sesi secara otomatis tanpa menanyakan kata sandi</translation>
     </message>
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="190"/>
       <source>Only letters, numbers, underscore and hyphen are allowed, minimal of two characters.</source>
-      <translation type="unfinished"/>
+      <translation>Hanya huruf, angka, garis bawah, dan tanda hubung yang diperbolehkan, minimal dua karakter.</translation>
     </message>
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="293"/>
       <source>Reuse user password as root password</source>
-      <translation type="unfinished"/>
+      <translation>Gunakan kata sandi pengguna sebagai kata sandi root</translation>
     </message>
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="301"/>
@@ -4332,12 +4332,12 @@ Keluaran:
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="324"/>
       <source>Root Password</source>
-      <translation type="unfinished"/>
+      <translation>Kata Sandi Root</translation>
     </message>
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="342"/>
       <source>Repeat Root Password</source>
-      <translation type="unfinished"/>
+      <translation>Ulangi Kata Sandi</translation>
     </message>
     <message>
       <location filename="../src/modules/usersq/usersq.qml" line="368"/>
diff --git a/lang/calamares_ja-Hira.ts b/lang/calamares_ja-Hira.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ce8d59bf4f2a168831a4ce09396a8b6e8a7fa2a5
--- /dev/null
+++ b/lang/calamares_ja-Hira.ts
@@ -0,0 +1,4366 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS language="ja-Hira" version="2.1">
+  <context>
+    <name>AutoMountManagementJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/AutoMountManagementJob.cpp" line="22"/>
+      <source>Manage auto-mount settings</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>BootInfoWidget</name>
+    <message>
+      <location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="62"/>
+      <source>The &lt;strong&gt;boot environment&lt;/strong&gt; of this system.&lt;br&gt;&lt;br&gt;Older x86 systems only support &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Modern systems usually use &lt;strong&gt;EFI&lt;/strong&gt;, but may also show up as BIOS if started in compatibility mode.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="72"/>
+      <source>This system was started with an &lt;strong&gt;EFI&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from an EFI environment, this installer must deploy a boot loader application, like &lt;strong&gt;GRUB&lt;/strong&gt; or &lt;strong&gt;systemd-boot&lt;/strong&gt; on an &lt;strong&gt;EFI System Partition&lt;/strong&gt;. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="84"/>
+      <source>This system was started with a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from a BIOS environment, this installer must install a boot loader, like &lt;strong&gt;GRUB&lt;/strong&gt;, either at the beginning of a partition or on the &lt;strong&gt;Master Boot Record&lt;/strong&gt; near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>BootLoaderModel</name>
+    <message>
+      <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="59"/>
+      <source>Master Boot Record of %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="92"/>
+      <source>Boot Partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="99"/>
+      <source>System Partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="129"/>
+      <source>Do not install a boot loader</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="147"/>
+      <source>%1 (%2)</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::BlankViewStep</name>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/BlankViewStep.cpp" line="61"/>
+      <source>Blank Page</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::DebugWindow</name>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="28"/>
+      <source>GlobalStorage</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="38"/>
+      <source>JobQueue</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="48"/>
+      <source>Modules</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="61"/>
+      <source>Type:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="68"/>
+      <location filename="../src/calamares/DebugWindow.ui" line="82"/>
+      <source>none</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="75"/>
+      <source>Interface:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="102"/>
+      <source>Crashes Calamares, so that Dr. Konqui can look at it.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="115"/>
+      <source>Reloads the stylesheet from the branding directory.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="141"/>
+      <source>Uploads the session log to the configured pastebin.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="144"/>
+      <source>Send Session Log</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="118"/>
+      <source>Reload Stylesheet</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="128"/>
+      <source>Displays the tree of widget names in the log (for stylesheet debugging).</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="131"/>
+      <source>Widget Tree</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.cpp" line="221"/>
+      <source>Debug information</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::ExecutionViewStep</name>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/ExecutionViewStep.cpp" line="88"/>
+      <source>Set up</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/ExecutionViewStep.cpp" line="88"/>
+      <source>Install</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::FailJob</name>
+    <message>
+      <location filename="../src/libcalamares/JobExample.cpp" line="29"/>
+      <source>Job failed (%1)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/JobExample.cpp" line="30"/>
+      <source>Programmed job failure was explicitly requested.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::JobThread</name>
+    <message>
+      <location filename="../src/libcalamares/JobQueue.cpp" line="201"/>
+      <source>Done</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::NamedJob</name>
+    <message>
+      <location filename="../src/libcalamares/JobExample.cpp" line="17"/>
+      <source>Example job (%1)</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::ProcessJob</name>
+    <message>
+      <location filename="../src/libcalamares/ProcessJob.cpp" line="43"/>
+      <source>Run command '%1' in target system.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/ProcessJob.cpp" line="43"/>
+      <source> Run command '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/ProcessJob.cpp" line="50"/>
+      <source>Running command %1 %2</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::PythonJob</name>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="194"/>
+      <source>Running %1 operation.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="223"/>
+      <source>Bad working directory path</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="224"/>
+      <source>Working directory %1 for python job %2 is not readable.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="230"/>
+      <source>Bad main script file</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="231"/>
+      <source>Main script file %1 for python job %2 is not readable.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="304"/>
+      <source>Boost.Python error in job "%1".</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::QmlViewStep</name>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="67"/>
+      <source>Loading ...</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="88"/>
+      <source>QML Step &lt;i&gt;%1&lt;/i&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="268"/>
+      <source>Loading failed.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::RequirementsChecker</name>
+    <message>
+      <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="94"/>
+      <source>Requirements checking for module &lt;i&gt;%1&lt;/i&gt; is complete.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="115"/>
+      <source>Waiting for %n module(s).</source>
+      <translation type="unfinished">
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="116"/>
+      <source>(%n second(s))</source>
+      <translation type="unfinished">
+        <numerusform/>
+      </translation>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="121"/>
+      <source>System-requirements checking is complete.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::ViewManager</name>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="162"/>
+      <source>Setup Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="162"/>
+      <source>Installation Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="163"/>
+      <source>Would you like to paste the install log to the web?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="179"/>
+      <source>Error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="88"/>
+      <source>&amp;Yes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="89"/>
+      <source>&amp;No</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="90"/>
+      <source>&amp;Close</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="183"/>
+      <source>Install Log Paste URL</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="165"/>
+      <source>The upload was unsuccessful. No web-paste was done.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="177"/>
+      <source>Install log posted to
+
+%1
+
+Link copied to clipboard</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="211"/>
+      <source>Calamares Initialization Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="212"/>
+      <source>%1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="218"/>
+      <source>&lt;br/&gt;The following modules could not be loaded:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="332"/>
+      <source>Continue with setup?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="332"/>
+      <source>Continue with installation?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="334"/>
+      <source>The %1 setup program is about to make changes to your disk in order to set up %2.&lt;br/&gt;&lt;strong&gt;You will not be able to undo these changes.&lt;/strong&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="337"/>
+      <source>The %1 installer is about to make changes to your disk in order to install %2.&lt;br/&gt;&lt;strong&gt;You will not be able to undo these changes.&lt;/strong&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="340"/>
+      <source>&amp;Set up now</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="340"/>
+      <source>&amp;Install now</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="348"/>
+      <source>Go &amp;back</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="398"/>
+      <source>&amp;Set up</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="398"/>
+      <source>&amp;Install</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="400"/>
+      <source>Setup is complete. Close the setup program.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="401"/>
+      <source>The installation is complete. Close the installer.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="403"/>
+      <source>Cancel setup without changing the system.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="404"/>
+      <source>Cancel installation without changing the system.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="414"/>
+      <source>&amp;Next</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="419"/>
+      <source>&amp;Back</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="425"/>
+      <source>&amp;Done</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="444"/>
+      <source>&amp;Cancel</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="517"/>
+      <source>Cancel setup?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="517"/>
+      <source>Cancel installation?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="518"/>
+      <source>Do you really want to cancel the current setup process?
+The setup program will quit and all changes will be lost.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="520"/>
+      <source>Do you really want to cancel the current install process?
+The installer will quit and all changes will be lost.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CalamaresPython::Helper</name>
+    <message>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="294"/>
+      <source>Unknown exception type</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="312"/>
+      <source>unparseable Python error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="356"/>
+      <source>unparseable Python traceback</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="363"/>
+      <source>Unfetchable Python error.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CalamaresWindow</name>
+    <message>
+      <location filename="../src/calamares/CalamaresWindow.cpp" line="370"/>
+      <source>%1 Setup Program</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/CalamaresWindow.cpp" line="371"/>
+      <source>%1 Installer</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ChangeFilesystemLabelJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/ChangeFilesystemLabelJob.cpp" line="32"/>
+      <source>Set filesystem label on %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ChangeFilesystemLabelJob.cpp" line="39"/>
+      <source>Set filesystem label &lt;strong&gt;%1&lt;/strong&gt; to partition &lt;strong&gt;%2&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ChangeFilesystemLabelJob.cpp" line="70"/>
+      <source>The installer failed to update partition table on disk '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CheckerContainer</name>
+    <message>
+      <location filename="../src/modules/welcome/checker/CheckerContainer.cpp" line="38"/>
+      <source>Gathering system information...</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ChoicePage</name>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="139"/>
+      <source>Select storage de&amp;vice:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="140"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="996"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1042"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1133"/>
+      <source>Current:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="141"/>
+      <source>After:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1671"/>
+      <source>&lt;strong&gt;Manual partitioning&lt;/strong&gt;&lt;br/&gt;You can create or resize partitions yourself.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="861"/>
+      <source>Reuse %1 as home partition for %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="997"/>
+      <source>&lt;strong&gt;Select a partition to shrink, then drag the bottom bar to resize&lt;/strong&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1014"/>
+      <source>%1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1071"/>
+      <source>Boot loader location:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1124"/>
+      <source>&lt;strong&gt;Select a partition to install on&lt;/strong&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1183"/>
+      <source>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1191"/>
+      <source>The EFI system partition at %1 will be used for starting %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1199"/>
+      <source>EFI system partition:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1334"/>
+      <source>This storage device does not seem to have an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1339"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1376"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1398"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1423"/>
+      <source>&lt;strong&gt;Erase disk&lt;/strong&gt;&lt;br/&gt;This will &lt;font color="red"&gt;delete&lt;/font&gt; all data currently present on the selected storage device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1343"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1372"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1394"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1419"/>
+      <source>&lt;strong&gt;Install alongside&lt;/strong&gt;&lt;br/&gt;The installer will shrink a partition to make room for %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1347"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1381"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1402"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1427"/>
+      <source>&lt;strong&gt;Replace a partition&lt;/strong&gt;&lt;br/&gt;Replaces a partition with %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1366"/>
+      <source>This storage device has %1 on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1389"/>
+      <source>This storage device already has an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1414"/>
+      <source>This storage device has multiple operating systems on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1486"/>
+      <source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1509"/>
+      <source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1514"/>
+      <source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1641"/>
+      <source>No Swap</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1649"/>
+      <source>Reuse Swap</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1652"/>
+      <source>Swap (no Hibernate)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1655"/>
+      <source>Swap (with Hibernate)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1658"/>
+      <source>Swap to file</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ClearMountsJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="259"/>
+      <source>Successfully unmounted %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="266"/>
+      <source>Successfully disabled swap %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="292"/>
+      <source>Successfully cleared swap %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="306"/>
+      <source>Successfully closed mapper device %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="319"/>
+      <source>Successfully disabled volume group %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="358"/>
+      <source>Clear mounts for partitioning operations on %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="364"/>
+      <source>Clearing mounts for partitioning operations on %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="383"/>
+      <source>Cleared all mounts for %1</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ClearTempMountsJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="32"/>
+      <source>Clear all temporary mounts.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="39"/>
+      <source>Clearing all temporary mounts.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="52"/>
+      <source>Cannot get list of temporary mounts.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="97"/>
+      <source>Cleared all temporary mounts.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CommandList</name>
+    <message>
+      <location filename="../src/libcalamares/utils/CommandList.cpp" line="142"/>
+      <location filename="../src/libcalamares/utils/CommandList.cpp" line="155"/>
+      <source>Could not run command.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CommandList.cpp" line="143"/>
+      <source>The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CommandList.cpp" line="156"/>
+      <source>The command needs to know the user's name, but no username is defined.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Config</name>
+    <message>
+      <location filename="../src/modules/keyboard/Config.cpp" line="354"/>
+      <source>Set keyboard model to %1.&lt;br/&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/Config.cpp" line="361"/>
+      <source>Set keyboard layout to %1/%2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/Config.cpp" line="342"/>
+      <source>Set timezone to %1/%2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/Config.cpp" line="380"/>
+      <source>The system language will be set to %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/Config.cpp" line="387"/>
+      <source>The numbers and dates locale will be set to %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="53"/>
+      <source>Network Installation. (Disabled: Incorrect configuration)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="55"/>
+      <source>Network Installation. (Disabled: Received invalid groups data)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="57"/>
+      <source>Network Installation. (Disabled: Internal error)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="61"/>
+      <source>Network Installation. (Disabled: No package list)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="77"/>
+      <source>Package selection</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="59"/>
+      <source>Network Installation. (Disabled: Unable to fetch package lists, check your network connection)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="55"/>
+      <source>This computer does not satisfy the minimum requirements for setting up %1.&lt;br/&gt;Setup cannot continue. &lt;a href="#details"&gt;Details...&lt;/a&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="59"/>
+      <source>This computer does not satisfy the minimum requirements for installing %1.&lt;br/&gt;Installation cannot continue. &lt;a href="#details"&gt;Details...&lt;/a&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="66"/>
+      <source>This computer does not satisfy some of the recommended requirements for setting up %1.&lt;br/&gt;Setup can continue, but some features might be disabled.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="70"/>
+      <source>This computer does not satisfy some of the recommended requirements for installing %1.&lt;br/&gt;Installation can continue, but some features might be disabled.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="80"/>
+      <source>This program will ask you some questions and set up %2 on your computer.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="250"/>
+      <source>&lt;h1&gt;Welcome to the Calamares setup program for %1&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="251"/>
+      <source>&lt;h1&gt;Welcome to %1 setup&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="255"/>
+      <source>&lt;h1&gt;Welcome to the Calamares installer for %1&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="256"/>
+      <source>&lt;h1&gt;Welcome to the %1 installer&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="217"/>
+      <source>Your username is too long.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="223"/>
+      <source>'%1' is not allowed as username.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="230"/>
+      <source>Your username must start with a lowercase letter or underscore.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="234"/>
+      <source>Only lowercase letters, numbers, underscore and hyphen are allowed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="279"/>
+      <source>Your hostname is too short.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="283"/>
+      <source>Your hostname is too long.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="289"/>
+      <source>'%1' is not allowed as hostname.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="295"/>
+      <source>Only letters, numbers, underscore and hyphen are allowed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="534"/>
+      <source>Your passwords do not match!</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="548"/>
+      <source>OK!</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="145"/>
+      <source>Setup Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="145"/>
+      <source>Installation Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="147"/>
+      <source>The setup of %1 did not complete successfully.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="148"/>
+      <source>The installation of %1 did not complete successfully.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="152"/>
+      <source>Setup Complete</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="153"/>
+      <source>Installation Complete</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="154"/>
+      <source>The setup of %1 is complete.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="155"/>
+      <source>The installation of %1 is complete.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="86"/>
+      <source>Package Selection</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="88"/>
+      <source>Please pick a product from the list. The selected product will be installed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="177"/>
+      <source>Install option: &lt;strong&gt;%1&lt;/strong&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="177"/>
+      <source>None</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/summary/Config.cpp" line="94"/>
+      <source>Summary</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/summary/Config.cpp" line="98"/>
+      <source>This is an overview of what will happen once you start the setup procedure.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/summary/Config.cpp" line="103"/>
+      <source>This is an overview of what will happen once you start the install procedure.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ContextualProcessJob</name>
+    <message>
+      <location filename="../src/modules/contextualprocess/ContextualProcessJob.cpp" line="119"/>
+      <source>Contextual Processes Job</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreatePartitionDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="18"/>
+      <source>Create a Partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="42"/>
+      <source>Si&amp;ze:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="52"/>
+      <source> MiB</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="59"/>
+      <source>Partition &amp;Type:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="71"/>
+      <source>&amp;Primary</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="81"/>
+      <source>E&amp;xtended</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="123"/>
+      <source>Fi&amp;le System:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="155"/>
+      <source>LVM LV name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="165"/>
+      <source>&amp;Mount Point:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="192"/>
+      <source>Flags:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="231"/>
+      <source>Label for the filesystem</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="241"/>
+      <source>FS Label:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="65"/>
+      <source>En&amp;crypt</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="191"/>
+      <source>Logical</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="196"/>
+      <source>Primary</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="215"/>
+      <source>GPT</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="301"/>
+      <source>Mountpoint already in use. Please select another one.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreatePartitionJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="113"/>
+      <source>Create new %1MiB partition on %3 (%2) with entries %4.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="121"/>
+      <source>Create new %1MiB partition on %3 (%2).</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="128"/>
+      <source>Create new %2MiB partition on %4 (%3) with file system %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="145"/>
+      <source>Create new &lt;strong&gt;%1MiB&lt;/strong&gt; partition on &lt;strong&gt;%3&lt;/strong&gt; (%2) with entries &lt;em&gt;%4&lt;/em&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="154"/>
+      <source>Create new &lt;strong&gt;%1MiB&lt;/strong&gt; partition on &lt;strong&gt;%3&lt;/strong&gt; (%2).</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="161"/>
+      <source>Create new &lt;strong&gt;%2MiB&lt;/strong&gt; partition on &lt;strong&gt;%4&lt;/strong&gt; (%3) with file system &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="186"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="189"/>
+      <source>Creating new %1 partition on %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="201"/>
+      <source>The installer failed to create partition on disk '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreatePartitionTableDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="24"/>
+      <source>Create Partition Table</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="43"/>
+      <source>Creating a new partition table will delete all existing data on the disk.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="69"/>
+      <source>What kind of partition table do you want to create?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="76"/>
+      <source>Master Boot Record (MBR)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="86"/>
+      <source>GUID Partition Table (GPT)</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreatePartitionTableJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="39"/>
+      <source>Create new %1 partition table on %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="47"/>
+      <source>Create new &lt;strong&gt;%1&lt;/strong&gt; partition table on &lt;strong&gt;%2&lt;/strong&gt; (%3).</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="57"/>
+      <source>Creating new %1 partition table on %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="67"/>
+      <source>The installer failed to create a partition table on %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreateUserJob</name>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="36"/>
+      <source>Create user %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="43"/>
+      <source>Create user &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="126"/>
+      <source>Preserving home directory</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="50"/>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="143"/>
+      <source>Creating user %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="151"/>
+      <source>Configuring user %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="159"/>
+      <source>Setting file permissions</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreateVolumeGroupDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/CreateVolumeGroupDialog.cpp" line="28"/>
+      <source>Create Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreateVolumeGroupJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="31"/>
+      <source>Create new volume group named %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="37"/>
+      <source>Create new volume group named &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="43"/>
+      <source>Creating new volume group named %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="55"/>
+      <source>The installer failed to create a volume group named '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DeactivateVolumeGroupJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="24"/>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="36"/>
+      <source>Deactivate volume group named %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="30"/>
+      <source>Deactivate volume group named &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="48"/>
+      <source>The installer failed to deactivate a volume group named %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DeletePartitionJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="71"/>
+      <source>Delete partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="78"/>
+      <source>Delete partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="85"/>
+      <source>Deleting partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="103"/>
+      <source>The installer failed to delete partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DeviceInfoWidget</name>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="97"/>
+      <source>This device has a &lt;strong&gt;%1&lt;/strong&gt; partition table.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="104"/>
+      <source>This is a &lt;strong&gt;loop&lt;/strong&gt; device.&lt;br&gt;&lt;br&gt;It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="111"/>
+      <source>This installer &lt;strong&gt;cannot detect a partition table&lt;/strong&gt; on the selected storage device.&lt;br&gt;&lt;br&gt;The device either has no partition table, or the partition table is corrupted or of an unknown type.&lt;br&gt;This installer can create a new partition table for you, either automatically, or through the manual partitioning page.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="121"/>
+      <source>&lt;br&gt;&lt;br&gt;This is the recommended partition table type for modern systems which start from an &lt;strong&gt;EFI&lt;/strong&gt; boot environment.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="127"/>
+      <source>&lt;br&gt;&lt;br&gt;This partition table type is only advisable on older systems which start from a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment. GPT is recommended in most other cases.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Warning:&lt;/strong&gt; the MBR partition table is an obsolete MS-DOS era standard.&lt;br&gt;Only 4 &lt;em&gt;primary&lt;/em&gt; partitions may be created, and of those 4, one can be an &lt;em&gt;extended&lt;/em&gt; partition, which may in turn contain many &lt;em&gt;logical&lt;/em&gt; partitions.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="140"/>
+      <source>The type of &lt;strong&gt;partition table&lt;/strong&gt; on the selected storage device.&lt;br&gt;&lt;br&gt;The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.&lt;br&gt;This installer will keep the current partition table unless you explicitly choose otherwise.&lt;br&gt;If unsure, on modern systems GPT is preferred.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DeviceModel</name>
+    <message>
+      <location filename="../src/modules/partition/core/DeviceModel.cpp" line="84"/>
+      <source>%1 - %2 (%3)</source>
+      <extracomment>device[name] - size[number] (device-node[name])</extracomment>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/DeviceModel.cpp" line="95"/>
+      <source>%1 - (%2)</source>
+      <extracomment>device[name] - (device-node[name])</extracomment>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DracutLuksCfgJob</name>
+    <message>
+      <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="117"/>
+      <source>Write LUKS configuration for Dracut to %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="121"/>
+      <source>Skip writing LUKS configuration for Dracut: "/" partition is not encrypted</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="138"/>
+      <source>Failed to open %1</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DummyCppJob</name>
+    <message>
+      <location filename="../src/modules/dummycpp/DummyCppJob.cpp" line="37"/>
+      <source>Dummy C++ Job</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>EditExistingPartitionDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="24"/>
+      <source>Edit Existing Partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="54"/>
+      <source>Content:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="64"/>
+      <source>&amp;Keep</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="74"/>
+      <source>Format</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="93"/>
+      <source>Warning: Formatting the partition will erase all existing data.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="103"/>
+      <source>&amp;Mount Point:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="123"/>
+      <source>Si&amp;ze:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="133"/>
+      <source> MiB</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="140"/>
+      <source>Fi&amp;le System:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="153"/>
+      <source>Flags:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="186"/>
+      <source>Label for the filesystem</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="196"/>
+      <source>FS Label:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.cpp" line="291"/>
+      <source>Mountpoint already in use. Please select another one.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>EncryptWidget</name>
+    <message>
+      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="36"/>
+      <source>En&amp;crypt system</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="46"/>
+      <source>Passphrase</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="56"/>
+      <source>Confirm passphrase</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EncryptWidget.cpp" line="104"/>
+      <location filename="../src/modules/partition/gui/EncryptWidget.cpp" line="114"/>
+      <source>Please enter the same passphrase in both boxes.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>FillGlobalStorageJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="167"/>
+      <source>Set partition information</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="196"/>
+      <source>Install %1 on &lt;strong&gt;new&lt;/strong&gt; %2 system partition with features &lt;em&gt;%3&lt;/em&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="204"/>
+      <source>Install %1 on &lt;strong&gt;new&lt;/strong&gt; %2 system partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="213"/>
+      <source>Set up &lt;strong&gt;new&lt;/strong&gt; %2 partition with mount point &lt;strong&gt;%1&lt;/strong&gt; and features &lt;em&gt;%3&lt;/em&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="221"/>
+      <source>Set up &lt;strong&gt;new&lt;/strong&gt; %2 partition with mount point &lt;strong&gt;%1&lt;/strong&gt;%3.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="235"/>
+      <source>Install %2 on %3 system partition &lt;strong&gt;%1&lt;/strong&gt; with features &lt;em&gt;%4&lt;/em&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="254"/>
+      <source>Set up %3 partition &lt;strong&gt;%1&lt;/strong&gt; with mount point &lt;strong&gt;%2&lt;/strong&gt; and features &lt;em&gt;%4&lt;/em&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="263"/>
+      <source>Set up %3 partition &lt;strong&gt;%1&lt;/strong&gt; with mount point &lt;strong&gt;%2&lt;/strong&gt;%4.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="244"/>
+      <source>Install %2 on %3 system partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="278"/>
+      <source>Install boot loader on &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="287"/>
+      <source>Setting up mount points.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>FinishedPage</name>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.ui" line="102"/>
+      <source>&amp;Restart now</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="72"/>
+      <source>&lt;h1&gt;All done.&lt;/h1&gt;&lt;br/&gt;%1 has been set up on your computer.&lt;br/&gt;You may now start using your new system.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="76"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, your system will restart immediately when you click on &lt;span style="font-style:italic;"&gt;Done&lt;/span&gt; or close the setup program.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="84"/>
+      <source>&lt;h1&gt;All done.&lt;/h1&gt;&lt;br/&gt;%1 has been installed on your computer.&lt;br/&gt;You may now restart into your new system, or continue using the %2 Live environment.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="89"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, your system will restart immediately when you click on &lt;span style="font-style:italic;"&gt;Done&lt;/span&gt; or close the installer.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="102"/>
+      <source>&lt;h1&gt;Setup Failed&lt;/h1&gt;&lt;br/&gt;%1 has not been set up on your computer.&lt;br/&gt;The error message was: %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="110"/>
+      <source>&lt;h1&gt;Installation Failed&lt;/h1&gt;&lt;br/&gt;%1 has not been installed on your computer.&lt;br/&gt;The error message was: %2.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>FinishedQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/finishedq/FinishedQmlViewStep.cpp" line="35"/>
+      <source>Finish</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>FinishedViewStep</name>
+    <message>
+      <location filename="../src/modules/finished/FinishedViewStep.cpp" line="46"/>
+      <source>Finish</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>FormatPartitionJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="36"/>
+      <source>Format partition %1 (file system: %2, size: %3 MiB) on %4.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="47"/>
+      <source>Format &lt;strong&gt;%3MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; with file system &lt;strong&gt;%2&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="58"/>
+      <source>Formatting partition %1 with file system %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="72"/>
+      <source>The installer failed to format partition %1 on disk '%2'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>GeneralRequirements</name>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="155"/>
+      <source>has at least %1 GiB available drive space</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="157"/>
+      <source>There is not enough drive space. At least %1 GiB is required.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="166"/>
+      <source>has at least %1 GiB working memory</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="168"/>
+      <source>The system does not have enough working memory. At least %1 GiB is required.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="177"/>
+      <source>is plugged in to a power source</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="178"/>
+      <source>The system is not plugged in to a power source.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="185"/>
+      <source>is connected to the Internet</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="186"/>
+      <source>The system is not connected to the Internet.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="193"/>
+      <source>is running the installer as an administrator (root)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="196"/>
+      <source>The setup program is not running with administrator rights.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="197"/>
+      <source>The installer is not running with administrator rights.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="205"/>
+      <source>has a screen large enough to show the whole installer</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="208"/>
+      <source>The screen is too small to display the setup program.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="209"/>
+      <source>The screen is too small to display the installer.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>HostInfoJob</name>
+    <message>
+      <location filename="../src/modules/hostinfo/HostInfoJob.cpp" line="42"/>
+      <source>Collecting information about your machine.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>IDJob</name>
+    <message>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="30"/>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="39"/>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="52"/>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="59"/>
+      <source>OEM Batch Identifier</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="40"/>
+      <source>Could not create directories &lt;code&gt;%1&lt;/code&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="53"/>
+      <source>Could not open file &lt;code&gt;%1&lt;/code&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="60"/>
+      <source>Could not write to file &lt;code&gt;%1&lt;/code&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>InitcpioJob</name>
+    <message>
+      <location filename="../src/modules/initcpio/InitcpioJob.cpp" line="31"/>
+      <source>Creating initramfs with mkinitcpio.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>InitramfsJob</name>
+    <message>
+      <location filename="../src/modules/initramfs/InitramfsJob.cpp" line="28"/>
+      <source>Creating initramfs.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>InteractiveTerminalPage</name>
+    <message>
+      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="45"/>
+      <source>Konsole not installed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="45"/>
+      <source>Please install KDE Konsole and try again!</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="106"/>
+      <source>Executing script: &amp;nbsp;&lt;code&gt;%1&lt;/code&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>InteractiveTerminalViewStep</name>
+    <message>
+      <location filename="../src/modules/interactiveterminal/InteractiveTerminalViewStep.cpp" line="41"/>
+      <source>Script</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>KeyboardQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/keyboardq/KeyboardQmlViewStep.cpp" line="32"/>
+      <source>Keyboard</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>KeyboardViewStep</name>
+    <message>
+      <location filename="../src/modules/keyboard/KeyboardViewStep.cpp" line="42"/>
+      <source>Keyboard</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LCLocaleDialog</name>
+    <message>
+      <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="23"/>
+      <source>System locale setting</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="30"/>
+      <source>The system locale setting affects the language and character set for some command line user interface elements.&lt;br/&gt;The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="54"/>
+      <source>&amp;Cancel</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="55"/>
+      <source>&amp;OK</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LicensePage</name>
+    <message>
+      <location filename="../src/modules/license/LicensePage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.ui" line="26"/>
+      <source>&lt;h1&gt;License Agreement&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="135"/>
+      <source>I accept the terms and conditions above.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="137"/>
+      <source>Please review the End User License Agreements (EULAs).</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="142"/>
+      <source>This setup procedure will install proprietary software that is subject to licensing terms.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="145"/>
+      <source>If you do not agree with the terms, the setup procedure cannot continue.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="150"/>
+      <source>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="155"/>
+      <source>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LicenseViewStep</name>
+    <message>
+      <location filename="../src/modules/license/LicenseViewStep.cpp" line="43"/>
+      <source>License</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LicenseWidget</name>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="88"/>
+      <source>URL: %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="109"/>
+      <source>&lt;strong&gt;%1 driver&lt;/strong&gt;&lt;br/&gt;by %2</source>
+      <extracomment>%1 is an untranslatable product name, example: Creative Audigy driver</extracomment>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="116"/>
+      <source>&lt;strong&gt;%1 graphics driver&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
+      <extracomment>%1 is usually a vendor name, example: Nvidia graphics driver</extracomment>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="122"/>
+      <source>&lt;strong&gt;%1 browser plugin&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="128"/>
+      <source>&lt;strong&gt;%1 codec&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="134"/>
+      <source>&lt;strong&gt;%1 package&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="140"/>
+      <source>&lt;strong&gt;%1&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="163"/>
+      <source>File: %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="186"/>
+      <source>Hide license text</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="186"/>
+      <source>Show the license text</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="190"/>
+      <source>Open license agreement in browser.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LocalePage</name>
+    <message>
+      <location filename="../src/modules/locale/LocalePage.cpp" line="130"/>
+      <source>Region:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/LocalePage.cpp" line="131"/>
+      <source>Zone:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/LocalePage.cpp" line="132"/>
+      <location filename="../src/modules/locale/LocalePage.cpp" line="133"/>
+      <source>&amp;Change...</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LocaleQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/localeq/LocaleQmlViewStep.cpp" line="32"/>
+      <source>Location</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LocaleTests</name>
+    <message>
+      <location filename="../src/libcalamares/locale/Tests.cpp" line="273"/>
+      <source>Quit</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LocaleViewStep</name>
+    <message>
+      <location filename="../src/modules/locale/LocaleViewStep.cpp" line="76"/>
+      <source>Location</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LuksBootKeyFileJob</name>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="30"/>
+      <source>Configuring LUKS key file.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="186"/>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="194"/>
+      <source>No partitions are defined.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="229"/>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="236"/>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="244"/>
+      <source>Encrypted rootfs setup error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="230"/>
+      <source>Root partition %1 is LUKS but no passphrase has been set.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="237"/>
+      <source>Could not create LUKS key file for root partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="245"/>
+      <source>Could not configure LUKS key file on partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>MachineIdJob</name>
+    <message>
+      <location filename="../src/modules/machineid/MachineIdJob.cpp" line="37"/>
+      <source>Generate machine-id.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/MachineIdJob.cpp" line="53"/>
+      <source>Configuration Error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/MachineIdJob.cpp" line="54"/>
+      <source>No root mount point is set for MachineId.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Map</name>
+    <message>
+      <location filename="../src/modules/localeq/Map.qml" line="243"/>
+      <source>Timezone: %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/Map.qml" line="264"/>
+      <source>Please select your preferred location on the map so the installer can suggest the locale
+            and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging
+            to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>NetInstallViewStep</name>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="49"/>
+      <source>Package selection</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="50"/>
+      <source>Office software</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="51"/>
+      <source>Office package</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="52"/>
+      <source>Browser software</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="53"/>
+      <source>Browser package</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="54"/>
+      <source>Web browser</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="55"/>
+      <source>Kernel</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="56"/>
+      <source>Services</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="57"/>
+      <source>Login</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="58"/>
+      <source>Desktop</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="59"/>
+      <source>Applications</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="60"/>
+      <source>Communication</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="61"/>
+      <source>Development</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="62"/>
+      <source>Office</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="63"/>
+      <source>Multimedia</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="64"/>
+      <source>Internet</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="65"/>
+      <source>Theming</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="66"/>
+      <source>Gaming</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="67"/>
+      <source>Utilities</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>NotesQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/notesqml/NotesQmlViewStep.cpp" line="23"/>
+      <source>Notes</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>OEMPage</name>
+    <message>
+      <location filename="../src/modules/oemid/OEMPage.ui" line="32"/>
+      <source>Ba&amp;tch:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/OEMPage.ui" line="42"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter a batch-identifier here. This will be stored in the target system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/OEMPage.ui" line="52"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;h1&gt;OEM Configuration&lt;/h1&gt;&lt;p&gt;Calamares will use OEM settings while configuring the target system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>OEMViewStep</name>
+    <message>
+      <location filename="../src/modules/oemid/OEMViewStep.cpp" line="122"/>
+      <source>OEM Configuration</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/OEMViewStep.cpp" line="128"/>
+      <source>Set the OEM Batch Identifier to &lt;code&gt;%1&lt;/code&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Offline</name>
+    <message>
+      <location filename="../src/modules/localeq/Offline.qml" line="41"/>
+      <source>Select your preferred Region, or use the default settings.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/Offline.qml" line="98"/>
+      <location filename="../src/modules/localeq/Offline.qml" line="173"/>
+      <location filename="../src/modules/localeq/Offline.qml" line="217"/>
+      <source>Timezone: %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/Offline.qml" line="115"/>
+      <source>Select your preferred Zone within your Region.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/Offline.qml" line="186"/>
+      <source>Zones</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/Offline.qml" line="233"/>
+      <source>You can fine-tune Language and Locale settings below.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PWQ</name>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="51"/>
+      <source>Password is too short</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="67"/>
+      <source>Password is too long</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="188"/>
+      <source>Password is too weak</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="196"/>
+      <source>Memory allocation error when setting '%1'</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="199"/>
+      <source>Memory allocation error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="201"/>
+      <source>The password is the same as the old one</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="203"/>
+      <source>The password is a palindrome</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="205"/>
+      <source>The password differs with case changes only</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="207"/>
+      <source>The password is too similar to the old one</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="209"/>
+      <source>The password contains the user name in some form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="211"/>
+      <source>The password contains words from the real name of the user in some form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="214"/>
+      <source>The password contains forbidden words in some form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="221"/>
+      <source>The password contains too few digits</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="228"/>
+      <source>The password contains too few uppercase letters</source>
+      <translation type="unfinished"/>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="232"/>
+      <source>The password contains fewer than %n lowercase letters</source>
+      <translation type="unfinished">
+        <numerusform/>
+      </translation>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="235"/>
+      <source>The password contains too few lowercase letters</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="242"/>
+      <source>The password contains too few non-alphanumeric characters</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="249"/>
+      <source>The password is too short</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="258"/>
+      <source>The password does not contain enough character classes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="265"/>
+      <source>The password contains too many same characters consecutively</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="275"/>
+      <source>The password contains too many characters of the same class consecutively</source>
+      <translation type="unfinished"/>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="218"/>
+      <source>The password contains fewer than %n digits</source>
+      <translation type="unfinished">
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="225"/>
+      <source>The password contains fewer than %n uppercase letters</source>
+      <translation type="unfinished">
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="239"/>
+      <source>The password contains fewer than %n non-alphanumeric characters</source>
+      <translation type="unfinished">
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="246"/>
+      <source>The password is shorter than %n characters</source>
+      <translation type="unfinished">
+        <numerusform/>
+      </translation>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="251"/>
+      <source>The password is a rotated version of the previous one</source>
+      <translation type="unfinished"/>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="255"/>
+      <source>The password contains fewer than %n character classes</source>
+      <translation type="unfinished">
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="262"/>
+      <source>The password contains more than %n same characters consecutively</source>
+      <translation type="unfinished">
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="269"/>
+      <source>The password contains more than %n characters of the same class consecutively</source>
+      <translation type="unfinished">
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="280"/>
+      <source>The password contains monotonic sequence longer than %n characters</source>
+      <translation type="unfinished">
+        <numerusform/>
+      </translation>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="286"/>
+      <source>The password contains too long of a monotonic character sequence</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="289"/>
+      <source>No password supplied</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="291"/>
+      <source>Cannot obtain random numbers from the RNG device</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="293"/>
+      <source>Password generation failed - required entropy too low for settings</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="298"/>
+      <source>The password fails the dictionary check - %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="301"/>
+      <source>The password fails the dictionary check</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="305"/>
+      <source>Unknown setting - %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="307"/>
+      <source>Unknown setting</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="311"/>
+      <source>Bad integer value of setting - %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="313"/>
+      <source>Bad integer value</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="317"/>
+      <source>Setting %1 is not of integer type</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="319"/>
+      <source>Setting is not of integer type</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="323"/>
+      <source>Setting %1 is not of string type</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="325"/>
+      <source>Setting is not of string type</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="327"/>
+      <source>Opening the configuration file failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="329"/>
+      <source>The configuration file is malformed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="331"/>
+      <source>Fatal failure</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="333"/>
+      <source>Unknown error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="782"/>
+      <source>Password is empty</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PackageChooserPage</name>
+    <message>
+      <location filename="../src/modules/packagechooser/page_package.ui" line="24"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/page_package.ui" line="50"/>
+      <source>Product Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/page_package.ui" line="63"/>
+      <source>TextLabel</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/page_package.ui" line="79"/>
+      <source>Long Product Description</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/PackageChooserPage.cpp" line="25"/>
+      <source>Package Selection</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/PackageChooserPage.cpp" line="26"/>
+      <source>Please pick a product from the list. The selected product will be installed.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PackageChooserQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/packagechooserq/PackageChooserQmlViewStep.cpp" line="32"/>
+      <source>Packages</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PackageChooserViewStep</name>
+    <message>
+      <location filename="../src/modules/packagechooser/PackageChooserViewStep.cpp" line="51"/>
+      <source>Packages</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PackageModel</name>
+    <message>
+      <location filename="../src/modules/netinstall/PackageModel.cpp" line="168"/>
+      <source>Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/PackageModel.cpp" line="168"/>
+      <source>Description</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Page_Keyboard</name>
+    <message>
+      <location filename="../src/modules/keyboard/KeyboardPage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/KeyboardPage.ui" line="74"/>
+      <source>Keyboard Model:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/KeyboardPage.ui" line="135"/>
+      <source>Type here to test your keyboard</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Page_UserSetup</name>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="40"/>
+      <source>What is your name?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="55"/>
+      <source>Your Full Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="124"/>
+      <source>What name do you want to use to log in?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="148"/>
+      <source>login</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="223"/>
+      <source>What is the name of this computer?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="247"/>
+      <source>&lt;small&gt;This name will be used if you make the computer visible to others on a network.&lt;/small&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="250"/>
+      <source>Computer Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="325"/>
+      <source>Choose a password to keep your account safe.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="349"/>
+      <location filename="../src/modules/users/page_usersetup.ui" line="374"/>
+      <source>&lt;small&gt;Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.&lt;/small&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="355"/>
+      <location filename="../src/modules/users/page_usersetup.ui" line="525"/>
+      <source>Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="380"/>
+      <location filename="../src/modules/users/page_usersetup.ui" line="550"/>
+      <source>Repeat Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="455"/>
+      <source>When this box is checked, password-strength checking is done and you will not be able to use a weak password.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="458"/>
+      <source>Require strong passwords.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="465"/>
+      <source>Log in automatically without asking for the password.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="472"/>
+      <source>Use the same password for the administrator account.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="495"/>
+      <source>Choose a password for the administrator account.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="519"/>
+      <location filename="../src/modules/users/page_usersetup.ui" line="544"/>
+      <source>&lt;small&gt;Enter the same password twice, so that it can be checked for typing errors.&lt;/small&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PartitionLabelsView</name>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="190"/>
+      <source>Root</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="194"/>
+      <source>Home</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="198"/>
+      <source>Boot</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="203"/>
+      <source>EFI system</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="207"/>
+      <source>Swap</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="211"/>
+      <source>New partition for %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="215"/>
+      <source>New partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="239"/>
+      <source>%1  %2</source>
+      <extracomment>size[number] filesystem[name]</extracomment>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PartitionModel</name>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="159"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="203"/>
+      <source>Free Space</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="163"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="207"/>
+      <source>New partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="300"/>
+      <source>Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="302"/>
+      <source>File System</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="304"/>
+      <source>File System Label</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="306"/>
+      <source>Mount Point</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="308"/>
+      <source>Size</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PartitionPage</name>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="26"/>
+      <source>Storage de&amp;vice:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="55"/>
+      <source>&amp;Revert All Changes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="91"/>
+      <source>New Partition &amp;Table</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="111"/>
+      <source>Cre&amp;ate</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="118"/>
+      <source>&amp;Edit</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="125"/>
+      <source>&amp;Delete</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="136"/>
+      <source>New Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="143"/>
+      <source>Resize Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="150"/>
+      <source>Deactivate Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="157"/>
+      <source>Remove Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="184"/>
+      <source>I&amp;nstall boot loader on:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="228"/>
+      <source>Are you sure you want to create a new partition table on %1?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="263"/>
+      <source>Can not create new partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="264"/>
+      <source>The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PartitionViewStep</name>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="56"/>
+      <source>Gathering system information...</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="111"/>
+      <source>Partitions</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="303"/>
+      <source>Current:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="321"/>
+      <source>After:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="530"/>
+      <source>No EFI system partition configured</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="534"/>
+      <source>EFI system partition configured incorrectly</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="539"/>
+      <source>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;To configure an EFI system partition, go back and select or create a suitable filesystem.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="550"/>
+      <source>The filesystem must be mounted on &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="556"/>
+      <source>The filesystem must have type FAT32.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="564"/>
+      <source>The filesystem must be at least %1 MiB in size.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="570"/>
+      <source>The filesystem must have flag &lt;strong&gt;%1&lt;/strong&gt; set.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="576"/>
+      <source>You can continue without setting up an EFI system partition but your system may fail to start.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="593"/>
+      <source>Option to use GPT on BIOS</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="594"/>
+      <source>A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.&lt;br/&gt;&lt;br/&gt;To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the &lt;strong&gt;bios_grub&lt;/strong&gt; flag enabled.&lt;br/&gt;&lt;br/&gt;An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="626"/>
+      <source>Boot partition not encrypted</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="627"/>
+      <source>A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.&lt;br/&gt;&lt;br/&gt;There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.&lt;br/&gt;You may continue if you wish, but filesystem unlocking will happen later during system startup.&lt;br/&gt;To encrypt the boot partition, go back and recreate it, selecting &lt;strong&gt;Encrypt&lt;/strong&gt; in the partition creation window.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="714"/>
+      <source>has at least one disk device available.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="715"/>
+      <source>There are no partitions to install on.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PlasmaLnfJob</name>
+    <message>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="33"/>
+      <source>Plasma Look-and-Feel Job</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="57"/>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="58"/>
+      <source>Could not select KDE Plasma Look-and-Feel package</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PlasmaLnfPage</name>
+    <message>
+      <location filename="../src/modules/plasmalnf/page_plasmalnf.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfPage.cpp" line="79"/>
+      <source>Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfPage.cpp" line="84"/>
+      <source>Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PlasmaLnfViewStep</name>
+    <message>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfViewStep.cpp" line="43"/>
+      <source>Look-and-Feel</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PreserveFiles</name>
+    <message>
+      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="79"/>
+      <source>Saving files for later ...</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="118"/>
+      <source>No files configured to save for later.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="172"/>
+      <source>Not all of the configured files could be preserved.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ProcessResult</name>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="425"/>
+      <source>
+There was no output from the command.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="426"/>
+      <source>
+Output:
+</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="430"/>
+      <source>External command crashed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="431"/>
+      <source>Command &lt;i&gt;%1&lt;/i&gt; crashed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="436"/>
+      <source>External command failed to start.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="437"/>
+      <source>Command &lt;i&gt;%1&lt;/i&gt; failed to start.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="441"/>
+      <source>Internal error when starting command.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="442"/>
+      <source>Bad parameters for process job call.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="446"/>
+      <source>External command failed to finish.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="447"/>
+      <source>Command &lt;i&gt;%1&lt;/i&gt; failed to finish in %2 seconds.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="454"/>
+      <source>External command finished with errors.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="455"/>
+      <source>Command &lt;i&gt;%1&lt;/i&gt; finished with exit code %2.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>QObject</name>
+    <message>
+      <location filename="../src/libcalamares/locale/Translation.cpp" line="74"/>
+      <source>%1 (%2)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="28"/>
+      <source>unknown</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="30"/>
+      <source>extended</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="32"/>
+      <source>unformatted</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="34"/>
+      <source>swap</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="130"/>
+      <location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="167"/>
+      <source>Default</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/Workers.cpp" line="64"/>
+      <location filename="../src/modules/machineid/Workers.cpp" line="72"/>
+      <location filename="../src/modules/machineid/Workers.cpp" line="76"/>
+      <location filename="../src/modules/machineid/Workers.cpp" line="93"/>
+      <source>File not found</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/Workers.cpp" line="65"/>
+      <source>Path &lt;pre&gt;%1&lt;/pre&gt; must be an absolute path.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/MachineIdJob.cpp" line="83"/>
+      <source>Directory not found</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/MachineIdJob.cpp" line="84"/>
+      <location filename="../src/modules/machineid/Workers.cpp" line="94"/>
+      <source>Could not create new random file &lt;pre&gt;%1&lt;/pre&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/PackageModel.cpp" line="63"/>
+      <source>No product</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/PackageModel.cpp" line="71"/>
+      <source>No description provided.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionDialogHelpers.cpp" line="44"/>
+      <source>(no mount point)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="41"/>
+      <source>Unpartitioned space or unknown partition table</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Recommended</name>
+    <message>
+      <location filename="../src/modules/welcomeq/Recommended.qml" line="40"/>
+      <source>&lt;p&gt;This computer does not satisfy some of the recommended requirements for setting up %1.&lt;br/&gt;
+        Setup can continue, but some features might be disabled.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>RemoveUserJob</name>
+    <message>
+      <location filename="../src/modules/removeuser/RemoveUserJob.cpp" line="34"/>
+      <source>Remove live user from target system</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>RemoveVolumeGroupJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="24"/>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="36"/>
+      <source>Remove Volume Group named %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="30"/>
+      <source>Remove Volume Group named &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="48"/>
+      <source>The installer failed to remove a volume group named '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ReplaceWidget</name>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="127"/>
+      <source>Select where to install %1.&lt;br/&gt;&lt;font color="red"&gt;Warning: &lt;/font&gt;this will delete all files on the selected partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="149"/>
+      <source>The selected item does not appear to be a valid partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="157"/>
+      <source>%1 cannot be installed on empty space. Please select an existing partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="167"/>
+      <source>%1 cannot be installed on an extended partition. Please select an existing primary or logical partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="177"/>
+      <source>%1 cannot be installed on this partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="183"/>
+      <source>Data partition (%1)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="203"/>
+      <source>Unknown system partition (%1)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="207"/>
+      <source>%1 system partition (%2)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="218"/>
+      <source>&lt;strong&gt;%4&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="240"/>
+      <source>&lt;strong&gt;%2&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="251"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="267"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="292"/>
+      <source>&lt;strong&gt;%3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;%1 will be installed on %2.&lt;br/&gt;&lt;font color="red"&gt;Warning: &lt;/font&gt;all data on partition %2 will be lost.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="259"/>
+      <source>The EFI system partition at %1 will be used for starting %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="275"/>
+      <source>EFI system partition:</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Requirements</name>
+    <message>
+      <location filename="../src/modules/welcomeq/Requirements.qml" line="38"/>
+      <source>&lt;p&gt;This computer does not satisfy the minimum requirements for installing %1.&lt;br/&gt;
+        Installation cannot continue.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/Requirements.qml" line="40"/>
+      <source>&lt;p&gt;This computer does not satisfy some of the recommended requirements for setting up %1.&lt;br/&gt;
+        Setup can continue, but some features might be disabled.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ResizeFSJob</name>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="46"/>
+      <source>Resize Filesystem Job</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="169"/>
+      <source>Invalid configuration</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="170"/>
+      <source>The file-system resize job has an invalid configuration and will not run.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="175"/>
+      <source>KPMCore not Available</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="176"/>
+      <source>Calamares cannot start KPMCore for the file-system resize job.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="184"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="193"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="204"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="213"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="231"/>
+      <source>Resize Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="186"/>
+      <source>The filesystem %1 could not be found in this system, and cannot be resized.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="187"/>
+      <source>The device %1 could not be found in this system, and cannot be resized.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="195"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="206"/>
+      <source>The filesystem %1 cannot be resized.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="196"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="207"/>
+      <source>The device %1 cannot be resized.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="214"/>
+      <source>The filesystem %1 must be resized, but cannot.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="215"/>
+      <source>The device %1 must be resized, but cannot</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ResizePartitionJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="40"/>
+      <source>Resize partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="47"/>
+      <source>Resize &lt;strong&gt;%2MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; to &lt;strong&gt;%3MiB&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="58"/>
+      <source>Resizing %2MiB partition %1 to %3MiB.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="77"/>
+      <source>The installer failed to resize partition %1 on disk '%2'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ResizeVolumeGroupDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/ResizeVolumeGroupDialog.cpp" line="30"/>
+      <source>Resize Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ResizeVolumeGroupJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="27"/>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="45"/>
+      <source>Resize volume group named %1 from %2 to %3.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="36"/>
+      <source>Resize volume group named &lt;strong&gt;%1&lt;/strong&gt; from &lt;strong&gt;%2&lt;/strong&gt; to &lt;strong&gt;%3&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="60"/>
+      <source>The installer failed to resize a volume group named '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ResultsListDialog</name>
+    <message>
+      <location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="137"/>
+      <source>For best results, please ensure that this computer:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="138"/>
+      <source>System requirements</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ScanningDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/ScanningDialog.cpp" line="64"/>
+      <source>Scanning storage devices...</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ScanningDialog.cpp" line="64"/>
+      <source>Partitioning</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetHostNameJob</name>
+    <message>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="37"/>
+      <source>Set hostname %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="44"/>
+      <source>Set hostname &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="51"/>
+      <source>Setting hostname %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="122"/>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="129"/>
+      <source>Internal Error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="137"/>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="146"/>
+      <source>Cannot write hostname to target system</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetKeyboardLayoutJob</name>
+    <message>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="55"/>
+      <source>Set keyboard model to %1, layout to %2-%3</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="368"/>
+      <source>Failed to write keyboard configuration for the virtual console.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="369"/>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="397"/>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="414"/>
+      <source>Failed to write to %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="396"/>
+      <source>Failed to write keyboard configuration for X11.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="413"/>
+      <source>Failed to write keyboard configuration to existing /etc/default directory.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetPartFlagsJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="43"/>
+      <source>Set flags on partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="49"/>
+      <source>Set flags on %1MiB %2 partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="53"/>
+      <source>Set flags on new partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="65"/>
+      <source>Clear flags on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="71"/>
+      <source>Clear flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="75"/>
+      <source>Clear flags on new partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="80"/>
+      <source>Flag partition &lt;strong&gt;%1&lt;/strong&gt; as &lt;strong&gt;%2&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="89"/>
+      <source>Flag %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition as &lt;strong&gt;%3&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="96"/>
+      <source>Flag new partition as &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="108"/>
+      <source>Clearing flags on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="114"/>
+      <source>Clearing flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="119"/>
+      <source>Clearing flags on new partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="124"/>
+      <source>Setting flags &lt;strong&gt;%2&lt;/strong&gt; on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="133"/>
+      <source>Setting flags &lt;strong&gt;%3&lt;/strong&gt; on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="140"/>
+      <source>Setting flags &lt;strong&gt;%1&lt;/strong&gt; on new partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="157"/>
+      <source>The installer failed to set flags on partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetPasswordJob</name>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="40"/>
+      <source>Set password for user %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="47"/>
+      <source>Setting password for user %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="81"/>
+      <source>Bad destination system path.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="82"/>
+      <source>rootMountPoint is %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="88"/>
+      <source>Cannot disable root account.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="89"/>
+      <source>passwd terminated with error code %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="97"/>
+      <source>Cannot set password for user %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="98"/>
+      <source>usermod terminated with error code %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetTimezoneJob</name>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="34"/>
+      <source>Set timezone to %1/%2</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="62"/>
+      <source>Cannot access selected timezone path.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="63"/>
+      <source>Bad path: %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="71"/>
+      <source>Cannot set timezone.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="72"/>
+      <source>Link creation failed, target: %1; link name: %2</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="77"/>
+      <source>Cannot set timezone,</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="78"/>
+      <source>Cannot open /etc/timezone for writing</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetupGroupsJob</name>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="166"/>
+      <source>Preparing groups.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="178"/>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="183"/>
+      <source>Could not create groups in target system</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="184"/>
+      <source>These groups are missing in the target system: %1</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetupSudoJob</name>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="33"/>
+      <source>Configure &lt;pre&gt;sudo&lt;/pre&gt; users.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="55"/>
+      <source>Cannot chmod sudoers file.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="60"/>
+      <source>Cannot create sudoers file for writing.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ShellProcessJob</name>
+    <message>
+      <location filename="../src/modules/shellprocess/ShellProcessJob.cpp" line="41"/>
+      <source>Shell Processes Job</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SlideCounter</name>
+    <message>
+      <location filename="../src/qml/calamares/slideshow/SlideCounter.qml" line="27"/>
+      <source>%L1 / %L2</source>
+      <extracomment>slide counter, %1 of %2 (numeric)</extracomment>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>StandardButtons</name>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="28"/>
+      <source>&amp;OK</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="29"/>
+      <source>&amp;Yes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="30"/>
+      <source>&amp;No</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="31"/>
+      <source>&amp;Cancel</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="32"/>
+      <source>&amp;Close</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>TrackingInstallJob</name>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="102"/>
+      <source>Installation feedback</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="108"/>
+      <source>Sending installation feedback.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="125"/>
+      <source>Internal error in install-tracking.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="126"/>
+      <source>HTTP request timed out.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>TrackingKUserFeedbackJob</name>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="187"/>
+      <source>KDE user feedback</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="193"/>
+      <source>Configuring KDE user feedback.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="215"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="221"/>
+      <source>Error in KDE user feedback configuration.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="216"/>
+      <source>Could not configure KDE user feedback correctly, script error %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="222"/>
+      <source>Could not configure KDE user feedback correctly, Calamares error %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>TrackingMachineUpdateManagerJob</name>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="136"/>
+      <source>Machine feedback</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="142"/>
+      <source>Configuring machine feedback.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="165"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="171"/>
+      <source>Error in machine feedback configuration.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="166"/>
+      <source>Could not configure machine feedback correctly, script error %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="172"/>
+      <source>Could not configure machine feedback correctly, Calamares error %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>TrackingPage</name>
+    <message>
+      <location filename="../src/modules/tracking/page_trackingstep.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/page_trackingstep.ui" line="28"/>
+      <source>Placeholder</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/page_trackingstep.ui" line="76"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Click here to send &lt;span style=" font-weight:600;"&gt;no information at all&lt;/span&gt; about your installation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/page_trackingstep.ui" line="275"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href="placeholder"&gt;&lt;span style=" text-decoration: underline; color:#2980b9;"&gt;Click here for more information about user feedback&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingPage.cpp" line="86"/>
+      <source>Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingPage.cpp" line="91"/>
+      <source>By selecting this you will send information about your installation and hardware. This information will only be sent &lt;b&gt;once&lt;/b&gt; after the installation finishes.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingPage.cpp" line="94"/>
+      <source>By selecting this you will periodically send information about your &lt;b&gt;machine&lt;/b&gt; installation, hardware and applications, to %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingPage.cpp" line="98"/>
+      <source>By selecting this you will regularly send information about your &lt;b&gt;user&lt;/b&gt; installation, hardware, applications and application usage patterns, to %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>TrackingViewStep</name>
+    <message>
+      <location filename="../src/modules/tracking/TrackingViewStep.cpp" line="49"/>
+      <source>Feedback</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>UsersPage</name>
+    <message>
+      <location filename="../src/modules/users/UsersPage.cpp" line="167"/>
+      <source>&lt;small&gt;If more than one person will use this computer, you can create multiple accounts after setup.&lt;/small&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/UsersPage.cpp" line="173"/>
+      <source>&lt;small&gt;If more than one person will use this computer, you can create multiple accounts after installation.&lt;/small&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>UsersQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/usersq/UsersQmlViewStep.cpp" line="35"/>
+      <source>Users</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>UsersViewStep</name>
+    <message>
+      <location filename="../src/modules/users/UsersViewStep.cpp" line="48"/>
+      <source>Users</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>VariantModel</name>
+    <message>
+      <location filename="../src/calamares/VariantModel.cpp" line="232"/>
+      <source>Key</source>
+      <comment>Column header for key/value</comment>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/VariantModel.cpp" line="236"/>
+      <source>Value</source>
+      <comment>Column header for key/value</comment>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>VolumeGroupBaseDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="18"/>
+      <source>Create Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="24"/>
+      <source>List of Physical Volumes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="34"/>
+      <source>Volume Group Name:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="47"/>
+      <source>Volume Group Type:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="60"/>
+      <source>Physical Extent Size:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="70"/>
+      <source> MiB</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="86"/>
+      <source>Total Size:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="106"/>
+      <source>Used Size:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="126"/>
+      <source>Total Sectors:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="146"/>
+      <source>Quantity of LVs:</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>WelcomePage</name>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="79"/>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="98"/>
+      <source>Select application and system language</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="140"/>
+      <source>&amp;About</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="150"/>
+      <source>Open donations website</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="153"/>
+      <source>&amp;Donate</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="163"/>
+      <source>Open help and support website</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="166"/>
+      <source>&amp;Support</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="176"/>
+      <source>Open issues and bug-tracking website</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="179"/>
+      <source>&amp;Known issues</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="189"/>
+      <source>Open release notes website</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="192"/>
+      <source>&amp;Release notes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="216"/>
+      <source>&lt;h1&gt;Welcome to the Calamares setup program for %1.&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="217"/>
+      <source>&lt;h1&gt;Welcome to %1 setup.&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="222"/>
+      <source>&lt;h1&gt;Welcome to the Calamares installer for %1.&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="223"/>
+      <source>&lt;h1&gt;Welcome to the %1 installer.&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="228"/>
+      <source>%1 support</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="235"/>
+      <source>About %1 setup</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="235"/>
+      <source>About %1 installer</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="238"/>
+      <source>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;for %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Copyright 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;Copyright 2017-2020 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;Thanks to &lt;a href="https://calamares.io/team/"&gt;the Calamares team&lt;/a&gt; and the &lt;a href="https://www.transifex.com/calamares/calamares/"&gt;Calamares translators team&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; development is sponsored by &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>WelcomeQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/welcomeq/WelcomeQmlViewStep.cpp" line="40"/>
+      <source>Welcome</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>WelcomeViewStep</name>
+    <message>
+      <location filename="../src/modules/welcome/WelcomeViewStep.cpp" line="46"/>
+      <source>Welcome</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>about</name>
+    <message>
+      <location filename="../src/modules/welcomeq/about.qml" line="47"/>
+      <source>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;
+                        &lt;strong&gt;%2&lt;br/&gt;
+                        for %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;
+                        Copyright 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;
+                        Copyright 2017-2020 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;
+                        Thanks to &lt;a href='https://calamares.io/team/'&gt;the Calamares team&lt;/a&gt;
+                        and the &lt;a href='https://www.transifex.com/calamares/calamares/'&gt;Calamares
+                        translators team&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;
+                        &lt;a href='https://calamares.io/'&gt;Calamares&lt;/a&gt;
+                        development is sponsored by &lt;br/&gt;
+                        &lt;a href='http://www.blue-systems.com/'&gt;Blue Systems&lt;/a&gt; -
+                        Liberating Software.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/about.qml" line="96"/>
+      <source>Back</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>calamares-sidebar</name>
+    <message>
+      <location filename="../src/calamares/calamares-sidebar.qml" line="79"/>
+      <source>Show debug information</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>finishedq</name>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq.qml" line="36"/>
+      <source>Installation Completed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq.qml" line="43"/>
+      <source>%1 has been installed on your computer.&lt;br/&gt;
+            You may now restart into your new system, or continue using the Live environment.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq.qml" line="65"/>
+      <source>Close Installer</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq.qml" line="71"/>
+      <source>Restart System</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq.qml" line="89"/>
+      <source>&lt;p&gt;A full log of the install is available as installation.log in the home directory of the Live user.&lt;br/&gt;
+            This log is copied to /var/log/installation.log of the target system.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>i18n</name>
+    <message>
+      <location filename="../src/modules/localeq/i18n.qml" line="50"/>
+      <source>&lt;h1&gt;Languages&lt;/h1&gt; &lt;/br&gt;
+                    The system locale setting affects the language and character set for some command line user interface elements. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/i18n.qml" line="123"/>
+      <source>&lt;h1&gt;Locales&lt;/h1&gt; &lt;/br&gt;
+                    The system locale setting affects the numbers and dates format. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/i18n.qml" line="189"/>
+      <source>Back</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>keyboardq</name>
+    <message>
+      <location filename="../src/modules/keyboardq/keyboardq.qml" line="60"/>
+      <source>To activate keyboard preview, select a layout.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboardq/keyboardq.qml" line="86"/>
+      <source>Keyboard Model:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboardq/keyboardq.qml" line="254"/>
+      <source>Layouts</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboardq/keyboardq.qml" line="263"/>
+      <source>Type here to test your keyboard</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboardq/keyboardq.qml" line="179"/>
+      <source>Variants</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>localeq</name>
+    <message>
+      <location filename="../src/modules/localeq/localeq.qml" line="81"/>
+      <source>Change</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>notesqml</name>
+    <message>
+      <location filename="../src/modules/notesqml/notesqml.qml" line="50"/>
+      <source>&lt;h3&gt;%1&lt;/h3&gt;
+            &lt;p&gt;These are example release notes.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>packagechooserq</name>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="45"/>
+      <source>LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.&lt;br/&gt;
+                    Default option.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="59"/>
+      <source>LibreOffice</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="108"/>
+      <source>If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="121"/>
+      <source>No Office Suite</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="172"/>
+      <source>Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support.  It will be just a desktop, file browser, package manager, text editor and simple web-browser.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="185"/>
+      <source>Minimal Install</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="233"/>
+      <source>Please select an option for your install, or use the default: LibreOffice included.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>release_notes</name>
+    <message>
+      <location filename="../src/modules/welcomeq/release_notes.qml" line="45"/>
+      <source>&lt;h3&gt;%1&lt;/h3&gt;
+            &lt;p&gt;This an example QML file, showing options in RichText with Flickable content.&lt;/p&gt;
+
+            &lt;p&gt;QML with RichText can use HTML tags, Flickable content is useful for touchscreens.&lt;/p&gt;
+
+            &lt;p&gt;&lt;b&gt;This is bold text&lt;/b&gt;&lt;/p&gt;
+            &lt;p&gt;&lt;i&gt;This is italic text&lt;/i&gt;&lt;/p&gt;
+            &lt;p&gt;&lt;u&gt;This is underlined text&lt;/u&gt;&lt;/p&gt;
+            &lt;p&gt;&lt;center&gt;This text will be center-aligned.&lt;/center&gt;&lt;/p&gt;
+            &lt;p&gt;&lt;s&gt;This is strikethrough&lt;/s&gt;&lt;/p&gt;
+
+            &lt;p&gt;Code example:
+            &lt;code&gt;ls -l /home&lt;/code&gt;&lt;/p&gt;
+
+            &lt;p&gt;&lt;b&gt;Lists:&lt;/b&gt;&lt;/p&gt;
+            &lt;ul&gt;
+                &lt;li&gt;Intel CPU systems&lt;/li&gt;
+                &lt;li&gt;AMD CPU systems&lt;/li&gt;
+            &lt;/ul&gt;
+
+            &lt;p&gt;The vertical scrollbar is adjustable, current width set to 10.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/release_notes.qml" line="76"/>
+      <source>Back</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>usersq</name>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="43"/>
+      <source>Pick your user name and credentials to login and perform admin tasks</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="56"/>
+      <source>What is your name?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="63"/>
+      <source>Your Full Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="80"/>
+      <source>What name do you want to use to log in?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="87"/>
+      <source>Login Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="116"/>
+      <source>If more than one person will use this computer, you can create multiple accounts after installation.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="128"/>
+      <source>Only lowercase letters, numbers, underscore and hyphen are allowed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="136"/>
+      <source>root is not allowed as username.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="145"/>
+      <source>What is the name of this computer?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="151"/>
+      <source>Computer Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="178"/>
+      <source>This name will be used if you make the computer visible to others on a network.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="198"/>
+      <source>localhost is not allowed as hostname.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="207"/>
+      <source>Choose a password to keep your account safe.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="217"/>
+      <source>Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="234"/>
+      <source>Repeat Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="261"/>
+      <source>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="406"/>
+      <source>Validate passwords quality</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="416"/>
+      <source>When this box is checked, password-strength checking is done and you will not be able to use a weak password.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="398"/>
+      <source>Log in automatically without asking for the password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="190"/>
+      <source>Only letters, numbers, underscore and hyphen are allowed, minimal of two characters.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="293"/>
+      <source>Reuse user password as root password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="301"/>
+      <source>Use the same password for the administrator account.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="314"/>
+      <source>Choose a root password to keep your account safe.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="324"/>
+      <source>Root Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="342"/>
+      <source>Repeat Root Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="368"/>
+      <source>Enter the same password twice, so that it can be checked for typing errors.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>welcomeq</name>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="35"/>
+      <source>&lt;h3&gt;Welcome to the %1 &lt;quote&gt;%2&lt;/quote&gt; installer&lt;/h3&gt;
+            &lt;p&gt;This program will ask you some questions and set up %1 on your computer.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="66"/>
+      <source>About</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="80"/>
+      <source>Support</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="91"/>
+      <source>Known issues</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="102"/>
+      <source>Release notes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="114"/>
+      <source>Donate</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+</TS>
diff --git a/lang/calamares_pt_PT.ts b/lang/calamares_pt_PT.ts
index 951645ab1559d2fd067838b49a628f43400e5780..3ec8b295e23b951d50efcac5a4e0e0cc379d9ae1 100644
--- a/lang/calamares_pt_PT.ts
+++ b/lang/calamares_pt_PT.ts
@@ -2014,7 +2014,7 @@ O instalador será encerrado e todas as alterações serão perdidas.</translati
       <source>Please select your preferred location on the map so the installer can suggest the locale
             and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging
             to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming.</source>
-      <translation>Por favor selecione o seu local preferido no mapa para que o instalador possa sugerir a localização
+      <translation>Selecione o seu local preferido no mapa para que o instalador possa sugerir a localização
             e fuso horário para si. Pode ajustar as definições sugeridas abaixo. Procure no mapa arrastando
             para mover e utilizando os botões +/- para aumentar/diminuir ou utilize a roda do rato para dar zoom.</translation>
     </message>
@@ -4003,7 +4003,7 @@ Saída de Dados:
     <message>
       <location filename="../src/modules/welcome/WelcomePage.cpp" line="238"/>
       <source>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;for %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Copyright 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;Copyright 2017-2020 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;Thanks to &lt;a href="https://calamares.io/team/"&gt;the Calamares team&lt;/a&gt; and the &lt;a href="https://www.transifex.com/calamares/calamares/"&gt;Calamares translators team&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; development is sponsored by &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</source>
-      <translation>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;para %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Copyright 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;Copyright 2017-2020 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;Obrigado à &lt;a href="https://calamares.io/team/"&gt;equipa Calamares&lt;/a&gt; e à &lt;a href="https://www.transifex.com/calamares/calamares/"&gt;equipa de tradutores do Calamares&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;O desenvolvimento do &lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; é patrocinado pela &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</translation>
+      <translation>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;para o %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Copyright 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;Copyright 2017-2020 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;Obrigado à &lt;a href="https://calamares.io/team/"&gt;equipa Calamares&lt;/a&gt; e à &lt;a href="https://www.transifex.com/calamares/calamares/"&gt;equipa de tradutores do Calamares&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;O desenvolvimento do &lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; é patrocinado pela &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</translation>
     </message>
   </context>
   <context>
diff --git a/lang/calamares_ro.ts b/lang/calamares_ro.ts
index a6872e55bc41cbea5bf85948be5353a8045a1b00..a4ac28ce6d4230cf58b722b42d9338f0774bd7bf 100644
--- a/lang/calamares_ro.ts
+++ b/lang/calamares_ro.ts
@@ -104,17 +104,17 @@
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="102"/>
       <source>Crashes Calamares, so that Dr. Konqui can look at it.</source>
-      <translation type="unfinished"/>
+      <translation>Dă crash lui Calamares, pentru ca doctorul Konqui să se uite la el.</translation>
     </message>
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="115"/>
       <source>Reloads the stylesheet from the branding directory.</source>
-      <translation type="unfinished"/>
+      <translation>Reîncarcă foaia de stil din directorul branding.</translation>
     </message>
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="141"/>
       <source>Uploads the session log to the configured pastebin.</source>
-      <translation type="unfinished"/>
+      <translation>Încarcă jurnalul sesiunii pe pastebin-ul configurat.</translation>
     </message>
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="144"/>
@@ -134,7 +134,7 @@
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="131"/>
       <source>Widget Tree</source>
-      <translation>Lista widget</translation>
+      <translation>Arborele de widget</translation>
     </message>
     <message>
       <location filename="../src/calamares/DebugWindow.cpp" line="221"/>
@@ -1991,7 +1991,7 @@ Programul de instalare va ieși, iar toate modificările vor fi pierdute.</trans
     <message>
       <location filename="../src/modules/machineid/MachineIdJob.cpp" line="53"/>
       <source>Configuration Error</source>
-      <translation type="unfinished"/>
+      <translation>Eroare de configurare</translation>
     </message>
     <message>
       <location filename="../src/modules/machineid/MachineIdJob.cpp" line="54"/>
diff --git a/lang/calamares_sv.ts b/lang/calamares_sv.ts
index 5fdcce0ebe1b51f963559756fb664f9bc23faea4..bd6add603da6f7db1ec14c1e943ee865ba07d70e 100644
--- a/lang/calamares_sv.ts
+++ b/lang/calamares_sv.ts
@@ -688,27 +688,27 @@ Alla ändringar kommer att gå förlorade.</translation>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="259"/>
       <source>Successfully unmounted %1.</source>
-      <translation type="unfinished"/>
+      <translation>Framgångsrikt avmonterade %1.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="266"/>
       <source>Successfully disabled swap %1.</source>
-      <translation type="unfinished"/>
+      <translation>Framgångsrikt inaktiverade swap %1.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="292"/>
       <source>Successfully cleared swap %1.</source>
-      <translation type="unfinished"/>
+      <translation>Framgångsrikt rensade swap %1.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="306"/>
       <source>Successfully closed mapper device %1.</source>
-      <translation type="unfinished"/>
+      <translation>Framgångsrikt stängde krypterad enhet %1.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="319"/>
       <source>Successfully disabled volume group %1.</source>
-      <translation type="unfinished"/>
+      <translation>Framgångsrikt inaktiverade volymgrupp %1.</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="358"/>
diff --git a/lang/calamares_ta_IN.ts b/lang/calamares_ta_IN.ts
new file mode 100644
index 0000000000000000000000000000000000000000..165321f17e206de1b56c0fc1cdbc830e9bd61605
--- /dev/null
+++ b/lang/calamares_ta_IN.ts
@@ -0,0 +1,4377 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS language="ta_IN" version="2.1">
+  <context>
+    <name>AutoMountManagementJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/AutoMountManagementJob.cpp" line="22"/>
+      <source>Manage auto-mount settings</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>BootInfoWidget</name>
+    <message>
+      <location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="62"/>
+      <source>The &lt;strong&gt;boot environment&lt;/strong&gt; of this system.&lt;br&gt;&lt;br&gt;Older x86 systems only support &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Modern systems usually use &lt;strong&gt;EFI&lt;/strong&gt;, but may also show up as BIOS if started in compatibility mode.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="72"/>
+      <source>This system was started with an &lt;strong&gt;EFI&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from an EFI environment, this installer must deploy a boot loader application, like &lt;strong&gt;GRUB&lt;/strong&gt; or &lt;strong&gt;systemd-boot&lt;/strong&gt; on an &lt;strong&gt;EFI System Partition&lt;/strong&gt;. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="84"/>
+      <source>This system was started with a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from a BIOS environment, this installer must install a boot loader, like &lt;strong&gt;GRUB&lt;/strong&gt;, either at the beginning of a partition or on the &lt;strong&gt;Master Boot Record&lt;/strong&gt; near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>BootLoaderModel</name>
+    <message>
+      <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="59"/>
+      <source>Master Boot Record of %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="92"/>
+      <source>Boot Partition</source>
+      <translation>இயக்கப் பகுதிப்பிரிப்பு </translation>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="99"/>
+      <source>System Partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="129"/>
+      <source>Do not install a boot loader</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="147"/>
+      <source>%1 (%2)</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::BlankViewStep</name>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/BlankViewStep.cpp" line="61"/>
+      <source>Blank Page</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::DebugWindow</name>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="28"/>
+      <source>GlobalStorage</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="38"/>
+      <source>JobQueue</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="48"/>
+      <source>Modules</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="61"/>
+      <source>Type:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="68"/>
+      <location filename="../src/calamares/DebugWindow.ui" line="82"/>
+      <source>none</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="75"/>
+      <source>Interface:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="102"/>
+      <source>Crashes Calamares, so that Dr. Konqui can look at it.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="115"/>
+      <source>Reloads the stylesheet from the branding directory.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="141"/>
+      <source>Uploads the session log to the configured pastebin.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="144"/>
+      <source>Send Session Log</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="118"/>
+      <source>Reload Stylesheet</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="128"/>
+      <source>Displays the tree of widget names in the log (for stylesheet debugging).</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.ui" line="131"/>
+      <source>Widget Tree</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/DebugWindow.cpp" line="221"/>
+      <source>Debug information</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::ExecutionViewStep</name>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/ExecutionViewStep.cpp" line="88"/>
+      <source>Set up</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/ExecutionViewStep.cpp" line="88"/>
+      <source>Install</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::FailJob</name>
+    <message>
+      <location filename="../src/libcalamares/JobExample.cpp" line="29"/>
+      <source>Job failed (%1)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/JobExample.cpp" line="30"/>
+      <source>Programmed job failure was explicitly requested.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::JobThread</name>
+    <message>
+      <location filename="../src/libcalamares/JobQueue.cpp" line="201"/>
+      <source>Done</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::NamedJob</name>
+    <message>
+      <location filename="../src/libcalamares/JobExample.cpp" line="17"/>
+      <source>Example job (%1)</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::ProcessJob</name>
+    <message>
+      <location filename="../src/libcalamares/ProcessJob.cpp" line="43"/>
+      <source>Run command '%1' in target system.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/ProcessJob.cpp" line="43"/>
+      <source> Run command '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/ProcessJob.cpp" line="50"/>
+      <source>Running command %1 %2</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::PythonJob</name>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="194"/>
+      <source>Running %1 operation.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="223"/>
+      <source>Bad working directory path</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="224"/>
+      <source>Working directory %1 for python job %2 is not readable.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="230"/>
+      <source>Bad main script file</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="231"/>
+      <source>Main script file %1 for python job %2 is not readable.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonJob.cpp" line="304"/>
+      <source>Boost.Python error in job "%1".</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::QmlViewStep</name>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="67"/>
+      <source>Loading ...</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="88"/>
+      <source>QML Step &lt;i&gt;%1&lt;/i&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="268"/>
+      <source>Loading failed.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::RequirementsChecker</name>
+    <message>
+      <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="94"/>
+      <source>Requirements checking for module &lt;i&gt;%1&lt;/i&gt; is complete.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="115"/>
+      <source>Waiting for %n module(s).</source>
+      <translation type="unfinished">
+        <numerusform/>
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="116"/>
+      <source>(%n second(s))</source>
+      <translation type="unfinished">
+        <numerusform/>
+        <numerusform/>
+      </translation>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="121"/>
+      <source>System-requirements checking is complete.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Calamares::ViewManager</name>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="162"/>
+      <source>Setup Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="162"/>
+      <source>Installation Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="163"/>
+      <source>Would you like to paste the install log to the web?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="179"/>
+      <source>Error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="88"/>
+      <source>&amp;Yes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="89"/>
+      <source>&amp;No</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="90"/>
+      <source>&amp;Close</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="183"/>
+      <source>Install Log Paste URL</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="165"/>
+      <source>The upload was unsuccessful. No web-paste was done.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/utils/Paste.cpp" line="177"/>
+      <source>Install log posted to
+
+%1
+
+Link copied to clipboard</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="211"/>
+      <source>Calamares Initialization Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="212"/>
+      <source>%1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="218"/>
+      <source>&lt;br/&gt;The following modules could not be loaded:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="332"/>
+      <source>Continue with setup?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="332"/>
+      <source>Continue with installation?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="334"/>
+      <source>The %1 setup program is about to make changes to your disk in order to set up %2.&lt;br/&gt;&lt;strong&gt;You will not be able to undo these changes.&lt;/strong&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="337"/>
+      <source>The %1 installer is about to make changes to your disk in order to install %2.&lt;br/&gt;&lt;strong&gt;You will not be able to undo these changes.&lt;/strong&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="340"/>
+      <source>&amp;Set up now</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="340"/>
+      <source>&amp;Install now</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="348"/>
+      <source>Go &amp;back</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="398"/>
+      <source>&amp;Set up</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="398"/>
+      <source>&amp;Install</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="400"/>
+      <source>Setup is complete. Close the setup program.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="401"/>
+      <source>The installation is complete. Close the installer.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="403"/>
+      <source>Cancel setup without changing the system.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="404"/>
+      <source>Cancel installation without changing the system.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="414"/>
+      <source>&amp;Next</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="419"/>
+      <source>&amp;Back</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="425"/>
+      <source>&amp;Done</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="444"/>
+      <source>&amp;Cancel</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="517"/>
+      <source>Cancel setup?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="517"/>
+      <source>Cancel installation?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="518"/>
+      <source>Do you really want to cancel the current setup process?
+The setup program will quit and all changes will be lost.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/ViewManager.cpp" line="520"/>
+      <source>Do you really want to cancel the current install process?
+The installer will quit and all changes will be lost.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CalamaresPython::Helper</name>
+    <message>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="294"/>
+      <source>Unknown exception type</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="312"/>
+      <source>unparseable Python error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="356"/>
+      <source>unparseable Python traceback</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/PythonHelper.cpp" line="363"/>
+      <source>Unfetchable Python error.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CalamaresWindow</name>
+    <message>
+      <location filename="../src/calamares/CalamaresWindow.cpp" line="370"/>
+      <source>%1 Setup Program</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/CalamaresWindow.cpp" line="371"/>
+      <source>%1 Installer</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ChangeFilesystemLabelJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/ChangeFilesystemLabelJob.cpp" line="32"/>
+      <source>Set filesystem label on %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ChangeFilesystemLabelJob.cpp" line="39"/>
+      <source>Set filesystem label &lt;strong&gt;%1&lt;/strong&gt; to partition &lt;strong&gt;%2&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ChangeFilesystemLabelJob.cpp" line="70"/>
+      <source>The installer failed to update partition table on disk '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CheckerContainer</name>
+    <message>
+      <location filename="../src/modules/welcome/checker/CheckerContainer.cpp" line="38"/>
+      <source>Gathering system information...</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ChoicePage</name>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="139"/>
+      <source>Select storage de&amp;vice:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="140"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="996"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1042"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1133"/>
+      <source>Current:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="141"/>
+      <source>After:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1671"/>
+      <source>&lt;strong&gt;Manual partitioning&lt;/strong&gt;&lt;br/&gt;You can create or resize partitions yourself.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="861"/>
+      <source>Reuse %1 as home partition for %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="997"/>
+      <source>&lt;strong&gt;Select a partition to shrink, then drag the bottom bar to resize&lt;/strong&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1014"/>
+      <source>%1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1071"/>
+      <source>Boot loader location:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1124"/>
+      <source>&lt;strong&gt;Select a partition to install on&lt;/strong&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1183"/>
+      <source>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1191"/>
+      <source>The EFI system partition at %1 will be used for starting %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1199"/>
+      <source>EFI system partition:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1334"/>
+      <source>This storage device does not seem to have an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1339"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1376"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1398"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1423"/>
+      <source>&lt;strong&gt;Erase disk&lt;/strong&gt;&lt;br/&gt;This will &lt;font color="red"&gt;delete&lt;/font&gt; all data currently present on the selected storage device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1343"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1372"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1394"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1419"/>
+      <source>&lt;strong&gt;Install alongside&lt;/strong&gt;&lt;br/&gt;The installer will shrink a partition to make room for %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1347"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1381"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1402"/>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1427"/>
+      <source>&lt;strong&gt;Replace a partition&lt;/strong&gt;&lt;br/&gt;Replaces a partition with %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1366"/>
+      <source>This storage device has %1 on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1389"/>
+      <source>This storage device already has an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1414"/>
+      <source>This storage device has multiple operating systems on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1486"/>
+      <source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1509"/>
+      <source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1514"/>
+      <source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1641"/>
+      <source>No Swap</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1649"/>
+      <source>Reuse Swap</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1652"/>
+      <source>Swap (no Hibernate)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1655"/>
+      <source>Swap (with Hibernate)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1658"/>
+      <source>Swap to file</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ClearMountsJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="259"/>
+      <source>Successfully unmounted %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="266"/>
+      <source>Successfully disabled swap %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="292"/>
+      <source>Successfully cleared swap %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="306"/>
+      <source>Successfully closed mapper device %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="319"/>
+      <source>Successfully disabled volume group %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="358"/>
+      <source>Clear mounts for partitioning operations on %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="364"/>
+      <source>Clearing mounts for partitioning operations on %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="383"/>
+      <source>Cleared all mounts for %1</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ClearTempMountsJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="32"/>
+      <source>Clear all temporary mounts.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="39"/>
+      <source>Clearing all temporary mounts.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="52"/>
+      <source>Cannot get list of temporary mounts.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="97"/>
+      <source>Cleared all temporary mounts.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CommandList</name>
+    <message>
+      <location filename="../src/libcalamares/utils/CommandList.cpp" line="142"/>
+      <location filename="../src/libcalamares/utils/CommandList.cpp" line="155"/>
+      <source>Could not run command.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CommandList.cpp" line="143"/>
+      <source>The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CommandList.cpp" line="156"/>
+      <source>The command needs to know the user's name, but no username is defined.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Config</name>
+    <message>
+      <location filename="../src/modules/keyboard/Config.cpp" line="354"/>
+      <source>Set keyboard model to %1.&lt;br/&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/Config.cpp" line="361"/>
+      <source>Set keyboard layout to %1/%2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/Config.cpp" line="342"/>
+      <source>Set timezone to %1/%2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/Config.cpp" line="380"/>
+      <source>The system language will be set to %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/Config.cpp" line="387"/>
+      <source>The numbers and dates locale will be set to %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="53"/>
+      <source>Network Installation. (Disabled: Incorrect configuration)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="55"/>
+      <source>Network Installation. (Disabled: Received invalid groups data)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="57"/>
+      <source>Network Installation. (Disabled: Internal error)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="61"/>
+      <source>Network Installation. (Disabled: No package list)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="77"/>
+      <source>Package selection</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/Config.cpp" line="59"/>
+      <source>Network Installation. (Disabled: Unable to fetch package lists, check your network connection)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="55"/>
+      <source>This computer does not satisfy the minimum requirements for setting up %1.&lt;br/&gt;Setup cannot continue. &lt;a href="#details"&gt;Details...&lt;/a&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="59"/>
+      <source>This computer does not satisfy the minimum requirements for installing %1.&lt;br/&gt;Installation cannot continue. &lt;a href="#details"&gt;Details...&lt;/a&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="66"/>
+      <source>This computer does not satisfy some of the recommended requirements for setting up %1.&lt;br/&gt;Setup can continue, but some features might be disabled.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="70"/>
+      <source>This computer does not satisfy some of the recommended requirements for installing %1.&lt;br/&gt;Installation can continue, but some features might be disabled.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="80"/>
+      <source>This program will ask you some questions and set up %2 on your computer.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="250"/>
+      <source>&lt;h1&gt;Welcome to the Calamares setup program for %1&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="251"/>
+      <source>&lt;h1&gt;Welcome to %1 setup&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="255"/>
+      <source>&lt;h1&gt;Welcome to the Calamares installer for %1&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/Config.cpp" line="256"/>
+      <source>&lt;h1&gt;Welcome to the %1 installer&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="217"/>
+      <source>Your username is too long.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="223"/>
+      <source>'%1' is not allowed as username.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="230"/>
+      <source>Your username must start with a lowercase letter or underscore.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="234"/>
+      <source>Only lowercase letters, numbers, underscore and hyphen are allowed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="279"/>
+      <source>Your hostname is too short.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="283"/>
+      <source>Your hostname is too long.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="289"/>
+      <source>'%1' is not allowed as hostname.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="295"/>
+      <source>Only letters, numbers, underscore and hyphen are allowed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="534"/>
+      <source>Your passwords do not match!</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="548"/>
+      <source>OK!</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="145"/>
+      <source>Setup Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="145"/>
+      <source>Installation Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="147"/>
+      <source>The setup of %1 did not complete successfully.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="148"/>
+      <source>The installation of %1 did not complete successfully.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="152"/>
+      <source>Setup Complete</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="153"/>
+      <source>Installation Complete</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="154"/>
+      <source>The setup of %1 is complete.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/Config.cpp" line="155"/>
+      <source>The installation of %1 is complete.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="86"/>
+      <source>Package Selection</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="88"/>
+      <source>Please pick a product from the list. The selected product will be installed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="177"/>
+      <source>Install option: &lt;strong&gt;%1&lt;/strong&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/Config.cpp" line="177"/>
+      <source>None</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/summary/Config.cpp" line="94"/>
+      <source>Summary</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/summary/Config.cpp" line="98"/>
+      <source>This is an overview of what will happen once you start the setup procedure.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/summary/Config.cpp" line="103"/>
+      <source>This is an overview of what will happen once you start the install procedure.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ContextualProcessJob</name>
+    <message>
+      <location filename="../src/modules/contextualprocess/ContextualProcessJob.cpp" line="119"/>
+      <source>Contextual Processes Job</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreatePartitionDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="18"/>
+      <source>Create a Partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="42"/>
+      <source>Si&amp;ze:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="52"/>
+      <source> MiB</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="59"/>
+      <source>Partition &amp;Type:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="71"/>
+      <source>&amp;Primary</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="81"/>
+      <source>E&amp;xtended</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="123"/>
+      <source>Fi&amp;le System:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="155"/>
+      <source>LVM LV name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="165"/>
+      <source>&amp;Mount Point:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="192"/>
+      <source>Flags:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="231"/>
+      <source>Label for the filesystem</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="241"/>
+      <source>FS Label:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="65"/>
+      <source>En&amp;crypt</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="191"/>
+      <source>Logical</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="196"/>
+      <source>Primary</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="215"/>
+      <source>GPT</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="301"/>
+      <source>Mountpoint already in use. Please select another one.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreatePartitionJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="113"/>
+      <source>Create new %1MiB partition on %3 (%2) with entries %4.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="121"/>
+      <source>Create new %1MiB partition on %3 (%2).</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="128"/>
+      <source>Create new %2MiB partition on %4 (%3) with file system %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="145"/>
+      <source>Create new &lt;strong&gt;%1MiB&lt;/strong&gt; partition on &lt;strong&gt;%3&lt;/strong&gt; (%2) with entries &lt;em&gt;%4&lt;/em&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="154"/>
+      <source>Create new &lt;strong&gt;%1MiB&lt;/strong&gt; partition on &lt;strong&gt;%3&lt;/strong&gt; (%2).</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="161"/>
+      <source>Create new &lt;strong&gt;%2MiB&lt;/strong&gt; partition on &lt;strong&gt;%4&lt;/strong&gt; (%3) with file system &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="186"/>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="189"/>
+      <source>Creating new %1 partition on %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="201"/>
+      <source>The installer failed to create partition on disk '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreatePartitionTableDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="24"/>
+      <source>Create Partition Table</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="43"/>
+      <source>Creating a new partition table will delete all existing data on the disk.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="69"/>
+      <source>What kind of partition table do you want to create?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="76"/>
+      <source>Master Boot Record (MBR)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="86"/>
+      <source>GUID Partition Table (GPT)</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreatePartitionTableJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="39"/>
+      <source>Create new %1 partition table on %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="47"/>
+      <source>Create new &lt;strong&gt;%1&lt;/strong&gt; partition table on &lt;strong&gt;%2&lt;/strong&gt; (%3).</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="57"/>
+      <source>Creating new %1 partition table on %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="67"/>
+      <source>The installer failed to create a partition table on %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreateUserJob</name>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="36"/>
+      <source>Create user %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="43"/>
+      <source>Create user &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="126"/>
+      <source>Preserving home directory</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="50"/>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="143"/>
+      <source>Creating user %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="151"/>
+      <source>Configuring user %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CreateUserJob.cpp" line="159"/>
+      <source>Setting file permissions</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreateVolumeGroupDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/CreateVolumeGroupDialog.cpp" line="28"/>
+      <source>Create Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>CreateVolumeGroupJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="31"/>
+      <source>Create new volume group named %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="37"/>
+      <source>Create new volume group named &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="43"/>
+      <source>Creating new volume group named %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="55"/>
+      <source>The installer failed to create a volume group named '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DeactivateVolumeGroupJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="24"/>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="36"/>
+      <source>Deactivate volume group named %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="30"/>
+      <source>Deactivate volume group named &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="48"/>
+      <source>The installer failed to deactivate a volume group named %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DeletePartitionJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="71"/>
+      <source>Delete partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="78"/>
+      <source>Delete partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="85"/>
+      <source>Deleting partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="103"/>
+      <source>The installer failed to delete partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DeviceInfoWidget</name>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="97"/>
+      <source>This device has a &lt;strong&gt;%1&lt;/strong&gt; partition table.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="104"/>
+      <source>This is a &lt;strong&gt;loop&lt;/strong&gt; device.&lt;br&gt;&lt;br&gt;It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="111"/>
+      <source>This installer &lt;strong&gt;cannot detect a partition table&lt;/strong&gt; on the selected storage device.&lt;br&gt;&lt;br&gt;The device either has no partition table, or the partition table is corrupted or of an unknown type.&lt;br&gt;This installer can create a new partition table for you, either automatically, or through the manual partitioning page.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="121"/>
+      <source>&lt;br&gt;&lt;br&gt;This is the recommended partition table type for modern systems which start from an &lt;strong&gt;EFI&lt;/strong&gt; boot environment.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="127"/>
+      <source>&lt;br&gt;&lt;br&gt;This partition table type is only advisable on older systems which start from a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment. GPT is recommended in most other cases.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Warning:&lt;/strong&gt; the MBR partition table is an obsolete MS-DOS era standard.&lt;br&gt;Only 4 &lt;em&gt;primary&lt;/em&gt; partitions may be created, and of those 4, one can be an &lt;em&gt;extended&lt;/em&gt; partition, which may in turn contain many &lt;em&gt;logical&lt;/em&gt; partitions.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="140"/>
+      <source>The type of &lt;strong&gt;partition table&lt;/strong&gt; on the selected storage device.&lt;br&gt;&lt;br&gt;The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.&lt;br&gt;This installer will keep the current partition table unless you explicitly choose otherwise.&lt;br&gt;If unsure, on modern systems GPT is preferred.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DeviceModel</name>
+    <message>
+      <location filename="../src/modules/partition/core/DeviceModel.cpp" line="84"/>
+      <source>%1 - %2 (%3)</source>
+      <extracomment>device[name] - size[number] (device-node[name])</extracomment>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/DeviceModel.cpp" line="95"/>
+      <source>%1 - (%2)</source>
+      <extracomment>device[name] - (device-node[name])</extracomment>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DracutLuksCfgJob</name>
+    <message>
+      <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="117"/>
+      <source>Write LUKS configuration for Dracut to %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="121"/>
+      <source>Skip writing LUKS configuration for Dracut: "/" partition is not encrypted</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="138"/>
+      <source>Failed to open %1</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>DummyCppJob</name>
+    <message>
+      <location filename="../src/modules/dummycpp/DummyCppJob.cpp" line="37"/>
+      <source>Dummy C++ Job</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>EditExistingPartitionDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="24"/>
+      <source>Edit Existing Partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="54"/>
+      <source>Content:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="64"/>
+      <source>&amp;Keep</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="74"/>
+      <source>Format</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="93"/>
+      <source>Warning: Formatting the partition will erase all existing data.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="103"/>
+      <source>&amp;Mount Point:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="123"/>
+      <source>Si&amp;ze:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="133"/>
+      <source> MiB</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="140"/>
+      <source>Fi&amp;le System:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="153"/>
+      <source>Flags:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="186"/>
+      <source>Label for the filesystem</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="196"/>
+      <source>FS Label:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.cpp" line="291"/>
+      <source>Mountpoint already in use. Please select another one.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>EncryptWidget</name>
+    <message>
+      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="36"/>
+      <source>En&amp;crypt system</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="46"/>
+      <source>Passphrase</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="56"/>
+      <source>Confirm passphrase</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/EncryptWidget.cpp" line="104"/>
+      <location filename="../src/modules/partition/gui/EncryptWidget.cpp" line="114"/>
+      <source>Please enter the same passphrase in both boxes.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>FillGlobalStorageJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="167"/>
+      <source>Set partition information</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="196"/>
+      <source>Install %1 on &lt;strong&gt;new&lt;/strong&gt; %2 system partition with features &lt;em&gt;%3&lt;/em&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="204"/>
+      <source>Install %1 on &lt;strong&gt;new&lt;/strong&gt; %2 system partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="213"/>
+      <source>Set up &lt;strong&gt;new&lt;/strong&gt; %2 partition with mount point &lt;strong&gt;%1&lt;/strong&gt; and features &lt;em&gt;%3&lt;/em&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="221"/>
+      <source>Set up &lt;strong&gt;new&lt;/strong&gt; %2 partition with mount point &lt;strong&gt;%1&lt;/strong&gt;%3.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="235"/>
+      <source>Install %2 on %3 system partition &lt;strong&gt;%1&lt;/strong&gt; with features &lt;em&gt;%4&lt;/em&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="254"/>
+      <source>Set up %3 partition &lt;strong&gt;%1&lt;/strong&gt; with mount point &lt;strong&gt;%2&lt;/strong&gt; and features &lt;em&gt;%4&lt;/em&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="263"/>
+      <source>Set up %3 partition &lt;strong&gt;%1&lt;/strong&gt; with mount point &lt;strong&gt;%2&lt;/strong&gt;%4.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="244"/>
+      <source>Install %2 on %3 system partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="278"/>
+      <source>Install boot loader on &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="287"/>
+      <source>Setting up mount points.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>FinishedPage</name>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.ui" line="102"/>
+      <source>&amp;Restart now</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="72"/>
+      <source>&lt;h1&gt;All done.&lt;/h1&gt;&lt;br/&gt;%1 has been set up on your computer.&lt;br/&gt;You may now start using your new system.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="76"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, your system will restart immediately when you click on &lt;span style="font-style:italic;"&gt;Done&lt;/span&gt; or close the setup program.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="84"/>
+      <source>&lt;h1&gt;All done.&lt;/h1&gt;&lt;br/&gt;%1 has been installed on your computer.&lt;br/&gt;You may now restart into your new system, or continue using the %2 Live environment.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="89"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, your system will restart immediately when you click on &lt;span style="font-style:italic;"&gt;Done&lt;/span&gt; or close the installer.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="102"/>
+      <source>&lt;h1&gt;Setup Failed&lt;/h1&gt;&lt;br/&gt;%1 has not been set up on your computer.&lt;br/&gt;The error message was: %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finished/FinishedPage.cpp" line="110"/>
+      <source>&lt;h1&gt;Installation Failed&lt;/h1&gt;&lt;br/&gt;%1 has not been installed on your computer.&lt;br/&gt;The error message was: %2.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>FinishedQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/finishedq/FinishedQmlViewStep.cpp" line="35"/>
+      <source>Finish</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>FinishedViewStep</name>
+    <message>
+      <location filename="../src/modules/finished/FinishedViewStep.cpp" line="46"/>
+      <source>Finish</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>FormatPartitionJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="36"/>
+      <source>Format partition %1 (file system: %2, size: %3 MiB) on %4.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="47"/>
+      <source>Format &lt;strong&gt;%3MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; with file system &lt;strong&gt;%2&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="58"/>
+      <source>Formatting partition %1 with file system %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="72"/>
+      <source>The installer failed to format partition %1 on disk '%2'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>GeneralRequirements</name>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="155"/>
+      <source>has at least %1 GiB available drive space</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="157"/>
+      <source>There is not enough drive space. At least %1 GiB is required.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="166"/>
+      <source>has at least %1 GiB working memory</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="168"/>
+      <source>The system does not have enough working memory. At least %1 GiB is required.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="177"/>
+      <source>is plugged in to a power source</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="178"/>
+      <source>The system is not plugged in to a power source.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="185"/>
+      <source>is connected to the Internet</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="186"/>
+      <source>The system is not connected to the Internet.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="193"/>
+      <source>is running the installer as an administrator (root)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="196"/>
+      <source>The setup program is not running with administrator rights.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="197"/>
+      <source>The installer is not running with administrator rights.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="205"/>
+      <source>has a screen large enough to show the whole installer</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="208"/>
+      <source>The screen is too small to display the setup program.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="209"/>
+      <source>The screen is too small to display the installer.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>HostInfoJob</name>
+    <message>
+      <location filename="../src/modules/hostinfo/HostInfoJob.cpp" line="42"/>
+      <source>Collecting information about your machine.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>IDJob</name>
+    <message>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="30"/>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="39"/>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="52"/>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="59"/>
+      <source>OEM Batch Identifier</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="40"/>
+      <source>Could not create directories &lt;code&gt;%1&lt;/code&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="53"/>
+      <source>Could not open file &lt;code&gt;%1&lt;/code&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/IDJob.cpp" line="60"/>
+      <source>Could not write to file &lt;code&gt;%1&lt;/code&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>InitcpioJob</name>
+    <message>
+      <location filename="../src/modules/initcpio/InitcpioJob.cpp" line="31"/>
+      <source>Creating initramfs with mkinitcpio.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>InitramfsJob</name>
+    <message>
+      <location filename="../src/modules/initramfs/InitramfsJob.cpp" line="28"/>
+      <source>Creating initramfs.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>InteractiveTerminalPage</name>
+    <message>
+      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="45"/>
+      <source>Konsole not installed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="45"/>
+      <source>Please install KDE Konsole and try again!</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="106"/>
+      <source>Executing script: &amp;nbsp;&lt;code&gt;%1&lt;/code&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>InteractiveTerminalViewStep</name>
+    <message>
+      <location filename="../src/modules/interactiveterminal/InteractiveTerminalViewStep.cpp" line="41"/>
+      <source>Script</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>KeyboardQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/keyboardq/KeyboardQmlViewStep.cpp" line="32"/>
+      <source>Keyboard</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>KeyboardViewStep</name>
+    <message>
+      <location filename="../src/modules/keyboard/KeyboardViewStep.cpp" line="42"/>
+      <source>Keyboard</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LCLocaleDialog</name>
+    <message>
+      <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="23"/>
+      <source>System locale setting</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="30"/>
+      <source>The system locale setting affects the language and character set for some command line user interface elements.&lt;br/&gt;The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="54"/>
+      <source>&amp;Cancel</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="55"/>
+      <source>&amp;OK</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LicensePage</name>
+    <message>
+      <location filename="../src/modules/license/LicensePage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.ui" line="26"/>
+      <source>&lt;h1&gt;License Agreement&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="135"/>
+      <source>I accept the terms and conditions above.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="137"/>
+      <source>Please review the End User License Agreements (EULAs).</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="142"/>
+      <source>This setup procedure will install proprietary software that is subject to licensing terms.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="145"/>
+      <source>If you do not agree with the terms, the setup procedure cannot continue.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="150"/>
+      <source>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicensePage.cpp" line="155"/>
+      <source>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LicenseViewStep</name>
+    <message>
+      <location filename="../src/modules/license/LicenseViewStep.cpp" line="43"/>
+      <source>License</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LicenseWidget</name>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="88"/>
+      <source>URL: %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="109"/>
+      <source>&lt;strong&gt;%1 driver&lt;/strong&gt;&lt;br/&gt;by %2</source>
+      <extracomment>%1 is an untranslatable product name, example: Creative Audigy driver</extracomment>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="116"/>
+      <source>&lt;strong&gt;%1 graphics driver&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
+      <extracomment>%1 is usually a vendor name, example: Nvidia graphics driver</extracomment>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="122"/>
+      <source>&lt;strong&gt;%1 browser plugin&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="128"/>
+      <source>&lt;strong&gt;%1 codec&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="134"/>
+      <source>&lt;strong&gt;%1 package&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="140"/>
+      <source>&lt;strong&gt;%1&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="163"/>
+      <source>File: %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="186"/>
+      <source>Hide license text</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="186"/>
+      <source>Show the license text</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/license/LicenseWidget.cpp" line="190"/>
+      <source>Open license agreement in browser.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LocalePage</name>
+    <message>
+      <location filename="../src/modules/locale/LocalePage.cpp" line="130"/>
+      <source>Region:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/LocalePage.cpp" line="131"/>
+      <source>Zone:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/LocalePage.cpp" line="132"/>
+      <location filename="../src/modules/locale/LocalePage.cpp" line="133"/>
+      <source>&amp;Change...</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LocaleQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/localeq/LocaleQmlViewStep.cpp" line="32"/>
+      <source>Location</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LocaleTests</name>
+    <message>
+      <location filename="../src/libcalamares/locale/Tests.cpp" line="273"/>
+      <source>Quit</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LocaleViewStep</name>
+    <message>
+      <location filename="../src/modules/locale/LocaleViewStep.cpp" line="76"/>
+      <source>Location</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>LuksBootKeyFileJob</name>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="30"/>
+      <source>Configuring LUKS key file.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="186"/>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="194"/>
+      <source>No partitions are defined.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="229"/>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="236"/>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="244"/>
+      <source>Encrypted rootfs setup error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="230"/>
+      <source>Root partition %1 is LUKS but no passphrase has been set.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="237"/>
+      <source>Could not create LUKS key file for root partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="245"/>
+      <source>Could not configure LUKS key file on partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>MachineIdJob</name>
+    <message>
+      <location filename="../src/modules/machineid/MachineIdJob.cpp" line="37"/>
+      <source>Generate machine-id.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/MachineIdJob.cpp" line="53"/>
+      <source>Configuration Error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/MachineIdJob.cpp" line="54"/>
+      <source>No root mount point is set for MachineId.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Map</name>
+    <message>
+      <location filename="../src/modules/localeq/Map.qml" line="243"/>
+      <source>Timezone: %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/Map.qml" line="264"/>
+      <source>Please select your preferred location on the map so the installer can suggest the locale
+            and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging
+            to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>NetInstallViewStep</name>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="49"/>
+      <source>Package selection</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="50"/>
+      <source>Office software</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="51"/>
+      <source>Office package</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="52"/>
+      <source>Browser software</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="53"/>
+      <source>Browser package</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="54"/>
+      <source>Web browser</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="55"/>
+      <source>Kernel</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="56"/>
+      <source>Services</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="57"/>
+      <source>Login</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="58"/>
+      <source>Desktop</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="59"/>
+      <source>Applications</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="60"/>
+      <source>Communication</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="61"/>
+      <source>Development</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="62"/>
+      <source>Office</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="63"/>
+      <source>Multimedia</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="64"/>
+      <source>Internet</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="65"/>
+      <source>Theming</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="66"/>
+      <source>Gaming</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="67"/>
+      <source>Utilities</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>NotesQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/notesqml/NotesQmlViewStep.cpp" line="23"/>
+      <source>Notes</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>OEMPage</name>
+    <message>
+      <location filename="../src/modules/oemid/OEMPage.ui" line="32"/>
+      <source>Ba&amp;tch:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/OEMPage.ui" line="42"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter a batch-identifier here. This will be stored in the target system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/OEMPage.ui" line="52"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;h1&gt;OEM Configuration&lt;/h1&gt;&lt;p&gt;Calamares will use OEM settings while configuring the target system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>OEMViewStep</name>
+    <message>
+      <location filename="../src/modules/oemid/OEMViewStep.cpp" line="122"/>
+      <source>OEM Configuration</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/oemid/OEMViewStep.cpp" line="128"/>
+      <source>Set the OEM Batch Identifier to &lt;code&gt;%1&lt;/code&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Offline</name>
+    <message>
+      <location filename="../src/modules/localeq/Offline.qml" line="41"/>
+      <source>Select your preferred Region, or use the default settings.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/Offline.qml" line="98"/>
+      <location filename="../src/modules/localeq/Offline.qml" line="173"/>
+      <location filename="../src/modules/localeq/Offline.qml" line="217"/>
+      <source>Timezone: %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/Offline.qml" line="115"/>
+      <source>Select your preferred Zone within your Region.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/Offline.qml" line="186"/>
+      <source>Zones</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/Offline.qml" line="233"/>
+      <source>You can fine-tune Language and Locale settings below.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PWQ</name>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="51"/>
+      <source>Password is too short</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="67"/>
+      <source>Password is too long</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="188"/>
+      <source>Password is too weak</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="196"/>
+      <source>Memory allocation error when setting '%1'</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="199"/>
+      <source>Memory allocation error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="201"/>
+      <source>The password is the same as the old one</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="203"/>
+      <source>The password is a palindrome</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="205"/>
+      <source>The password differs with case changes only</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="207"/>
+      <source>The password is too similar to the old one</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="209"/>
+      <source>The password contains the user name in some form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="211"/>
+      <source>The password contains words from the real name of the user in some form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="214"/>
+      <source>The password contains forbidden words in some form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="221"/>
+      <source>The password contains too few digits</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="228"/>
+      <source>The password contains too few uppercase letters</source>
+      <translation type="unfinished"/>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="232"/>
+      <source>The password contains fewer than %n lowercase letters</source>
+      <translation type="unfinished">
+        <numerusform/>
+        <numerusform/>
+      </translation>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="235"/>
+      <source>The password contains too few lowercase letters</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="242"/>
+      <source>The password contains too few non-alphanumeric characters</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="249"/>
+      <source>The password is too short</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="258"/>
+      <source>The password does not contain enough character classes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="265"/>
+      <source>The password contains too many same characters consecutively</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="275"/>
+      <source>The password contains too many characters of the same class consecutively</source>
+      <translation type="unfinished"/>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="218"/>
+      <source>The password contains fewer than %n digits</source>
+      <translation type="unfinished">
+        <numerusform/>
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="225"/>
+      <source>The password contains fewer than %n uppercase letters</source>
+      <translation type="unfinished">
+        <numerusform/>
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="239"/>
+      <source>The password contains fewer than %n non-alphanumeric characters</source>
+      <translation type="unfinished">
+        <numerusform/>
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="246"/>
+      <source>The password is shorter than %n characters</source>
+      <translation type="unfinished">
+        <numerusform/>
+        <numerusform/>
+      </translation>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="251"/>
+      <source>The password is a rotated version of the previous one</source>
+      <translation type="unfinished"/>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="255"/>
+      <source>The password contains fewer than %n character classes</source>
+      <translation type="unfinished">
+        <numerusform/>
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="262"/>
+      <source>The password contains more than %n same characters consecutively</source>
+      <translation type="unfinished">
+        <numerusform/>
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="269"/>
+      <source>The password contains more than %n characters of the same class consecutively</source>
+      <translation type="unfinished">
+        <numerusform/>
+        <numerusform/>
+      </translation>
+    </message>
+    <message numerus="yes">
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="280"/>
+      <source>The password contains monotonic sequence longer than %n characters</source>
+      <translation type="unfinished">
+        <numerusform/>
+        <numerusform/>
+      </translation>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="286"/>
+      <source>The password contains too long of a monotonic character sequence</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="289"/>
+      <source>No password supplied</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="291"/>
+      <source>Cannot obtain random numbers from the RNG device</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="293"/>
+      <source>Password generation failed - required entropy too low for settings</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="298"/>
+      <source>The password fails the dictionary check - %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="301"/>
+      <source>The password fails the dictionary check</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="305"/>
+      <source>Unknown setting - %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="307"/>
+      <source>Unknown setting</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="311"/>
+      <source>Bad integer value of setting - %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="313"/>
+      <source>Bad integer value</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="317"/>
+      <source>Setting %1 is not of integer type</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="319"/>
+      <source>Setting is not of integer type</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="323"/>
+      <source>Setting %1 is not of string type</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="325"/>
+      <source>Setting is not of string type</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="327"/>
+      <source>Opening the configuration file failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="329"/>
+      <source>The configuration file is malformed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="331"/>
+      <source>Fatal failure</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/CheckPWQuality.cpp" line="333"/>
+      <source>Unknown error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/Config.cpp" line="782"/>
+      <source>Password is empty</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PackageChooserPage</name>
+    <message>
+      <location filename="../src/modules/packagechooser/page_package.ui" line="24"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/page_package.ui" line="50"/>
+      <source>Product Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/page_package.ui" line="63"/>
+      <source>TextLabel</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/page_package.ui" line="79"/>
+      <source>Long Product Description</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/PackageChooserPage.cpp" line="25"/>
+      <source>Package Selection</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/PackageChooserPage.cpp" line="26"/>
+      <source>Please pick a product from the list. The selected product will be installed.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PackageChooserQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/packagechooserq/PackageChooserQmlViewStep.cpp" line="32"/>
+      <source>Packages</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PackageChooserViewStep</name>
+    <message>
+      <location filename="../src/modules/packagechooser/PackageChooserViewStep.cpp" line="51"/>
+      <source>Packages</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PackageModel</name>
+    <message>
+      <location filename="../src/modules/netinstall/PackageModel.cpp" line="168"/>
+      <source>Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/netinstall/PackageModel.cpp" line="168"/>
+      <source>Description</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Page_Keyboard</name>
+    <message>
+      <location filename="../src/modules/keyboard/KeyboardPage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/KeyboardPage.ui" line="74"/>
+      <source>Keyboard Model:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/KeyboardPage.ui" line="135"/>
+      <source>Type here to test your keyboard</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Page_UserSetup</name>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="40"/>
+      <source>What is your name?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="55"/>
+      <source>Your Full Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="124"/>
+      <source>What name do you want to use to log in?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="148"/>
+      <source>login</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="223"/>
+      <source>What is the name of this computer?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="247"/>
+      <source>&lt;small&gt;This name will be used if you make the computer visible to others on a network.&lt;/small&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="250"/>
+      <source>Computer Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="325"/>
+      <source>Choose a password to keep your account safe.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="349"/>
+      <location filename="../src/modules/users/page_usersetup.ui" line="374"/>
+      <source>&lt;small&gt;Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.&lt;/small&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="355"/>
+      <location filename="../src/modules/users/page_usersetup.ui" line="525"/>
+      <source>Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="380"/>
+      <location filename="../src/modules/users/page_usersetup.ui" line="550"/>
+      <source>Repeat Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="455"/>
+      <source>When this box is checked, password-strength checking is done and you will not be able to use a weak password.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="458"/>
+      <source>Require strong passwords.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="465"/>
+      <source>Log in automatically without asking for the password.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="472"/>
+      <source>Use the same password for the administrator account.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="495"/>
+      <source>Choose a password for the administrator account.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/page_usersetup.ui" line="519"/>
+      <location filename="../src/modules/users/page_usersetup.ui" line="544"/>
+      <source>&lt;small&gt;Enter the same password twice, so that it can be checked for typing errors.&lt;/small&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PartitionLabelsView</name>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="190"/>
+      <source>Root</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="194"/>
+      <source>Home</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="198"/>
+      <source>Boot</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="203"/>
+      <source>EFI system</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="207"/>
+      <source>Swap</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="211"/>
+      <source>New partition for %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="215"/>
+      <source>New partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="239"/>
+      <source>%1  %2</source>
+      <extracomment>size[number] filesystem[name]</extracomment>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PartitionModel</name>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="159"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="203"/>
+      <source>Free Space</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="163"/>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="207"/>
+      <source>New partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="300"/>
+      <source>Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="302"/>
+      <source>File System</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="304"/>
+      <source>File System Label</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="306"/>
+      <source>Mount Point</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/core/PartitionModel.cpp" line="308"/>
+      <source>Size</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PartitionPage</name>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="26"/>
+      <source>Storage de&amp;vice:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="55"/>
+      <source>&amp;Revert All Changes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="91"/>
+      <source>New Partition &amp;Table</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="111"/>
+      <source>Cre&amp;ate</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="118"/>
+      <source>&amp;Edit</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="125"/>
+      <source>&amp;Delete</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="136"/>
+      <source>New Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="143"/>
+      <source>Resize Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="150"/>
+      <source>Deactivate Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="157"/>
+      <source>Remove Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.ui" line="184"/>
+      <source>I&amp;nstall boot loader on:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="228"/>
+      <source>Are you sure you want to create a new partition table on %1?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="263"/>
+      <source>Can not create new partition</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="264"/>
+      <source>The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PartitionViewStep</name>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="56"/>
+      <source>Gathering system information...</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="111"/>
+      <source>Partitions</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="303"/>
+      <source>Current:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="321"/>
+      <source>After:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="530"/>
+      <source>No EFI system partition configured</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="534"/>
+      <source>EFI system partition configured incorrectly</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="539"/>
+      <source>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;To configure an EFI system partition, go back and select or create a suitable filesystem.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="550"/>
+      <source>The filesystem must be mounted on &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="556"/>
+      <source>The filesystem must have type FAT32.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="564"/>
+      <source>The filesystem must be at least %1 MiB in size.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="570"/>
+      <source>The filesystem must have flag &lt;strong&gt;%1&lt;/strong&gt; set.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="576"/>
+      <source>You can continue without setting up an EFI system partition but your system may fail to start.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="593"/>
+      <source>Option to use GPT on BIOS</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="594"/>
+      <source>A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.&lt;br/&gt;&lt;br/&gt;To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the &lt;strong&gt;bios_grub&lt;/strong&gt; flag enabled.&lt;br/&gt;&lt;br/&gt;An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="626"/>
+      <source>Boot partition not encrypted</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="627"/>
+      <source>A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.&lt;br/&gt;&lt;br/&gt;There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.&lt;br/&gt;You may continue if you wish, but filesystem unlocking will happen later during system startup.&lt;br/&gt;To encrypt the boot partition, go back and recreate it, selecting &lt;strong&gt;Encrypt&lt;/strong&gt; in the partition creation window.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="714"/>
+      <source>has at least one disk device available.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/PartitionViewStep.cpp" line="715"/>
+      <source>There are no partitions to install on.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PlasmaLnfJob</name>
+    <message>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="33"/>
+      <source>Plasma Look-and-Feel Job</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="57"/>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="58"/>
+      <source>Could not select KDE Plasma Look-and-Feel package</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PlasmaLnfPage</name>
+    <message>
+      <location filename="../src/modules/plasmalnf/page_plasmalnf.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfPage.cpp" line="79"/>
+      <source>Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfPage.cpp" line="84"/>
+      <source>Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PlasmaLnfViewStep</name>
+    <message>
+      <location filename="../src/modules/plasmalnf/PlasmaLnfViewStep.cpp" line="43"/>
+      <source>Look-and-Feel</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>PreserveFiles</name>
+    <message>
+      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="79"/>
+      <source>Saving files for later ...</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="118"/>
+      <source>No files configured to save for later.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="172"/>
+      <source>Not all of the configured files could be preserved.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ProcessResult</name>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="425"/>
+      <source>
+There was no output from the command.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="426"/>
+      <source>
+Output:
+</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="430"/>
+      <source>External command crashed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="431"/>
+      <source>Command &lt;i&gt;%1&lt;/i&gt; crashed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="436"/>
+      <source>External command failed to start.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="437"/>
+      <source>Command &lt;i&gt;%1&lt;/i&gt; failed to start.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="441"/>
+      <source>Internal error when starting command.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="442"/>
+      <source>Bad parameters for process job call.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="446"/>
+      <source>External command failed to finish.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="447"/>
+      <source>Command &lt;i&gt;%1&lt;/i&gt; failed to finish in %2 seconds.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="454"/>
+      <source>External command finished with errors.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="455"/>
+      <source>Command &lt;i&gt;%1&lt;/i&gt; finished with exit code %2.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>QObject</name>
+    <message>
+      <location filename="../src/libcalamares/locale/Translation.cpp" line="74"/>
+      <source>%1 (%2)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="28"/>
+      <source>unknown</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="30"/>
+      <source>extended</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="32"/>
+      <source>unformatted</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamares/partition/FileSystem.cpp" line="34"/>
+      <source>swap</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="130"/>
+      <location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="167"/>
+      <source>Default</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/Workers.cpp" line="64"/>
+      <location filename="../src/modules/machineid/Workers.cpp" line="72"/>
+      <location filename="../src/modules/machineid/Workers.cpp" line="76"/>
+      <location filename="../src/modules/machineid/Workers.cpp" line="93"/>
+      <source>File not found</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/Workers.cpp" line="65"/>
+      <source>Path &lt;pre&gt;%1&lt;/pre&gt; must be an absolute path.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/MachineIdJob.cpp" line="83"/>
+      <source>Directory not found</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/machineid/MachineIdJob.cpp" line="84"/>
+      <location filename="../src/modules/machineid/Workers.cpp" line="94"/>
+      <source>Could not create new random file &lt;pre&gt;%1&lt;/pre&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/PackageModel.cpp" line="63"/>
+      <source>No product</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooser/PackageModel.cpp" line="71"/>
+      <source>No description provided.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionDialogHelpers.cpp" line="44"/>
+      <source>(no mount point)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="41"/>
+      <source>Unpartitioned space or unknown partition table</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Recommended</name>
+    <message>
+      <location filename="../src/modules/welcomeq/Recommended.qml" line="40"/>
+      <source>&lt;p&gt;This computer does not satisfy some of the recommended requirements for setting up %1.&lt;br/&gt;
+        Setup can continue, but some features might be disabled.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>RemoveUserJob</name>
+    <message>
+      <location filename="../src/modules/removeuser/RemoveUserJob.cpp" line="34"/>
+      <source>Remove live user from target system</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>RemoveVolumeGroupJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="24"/>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="36"/>
+      <source>Remove Volume Group named %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="30"/>
+      <source>Remove Volume Group named &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="48"/>
+      <source>The installer failed to remove a volume group named '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ReplaceWidget</name>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="127"/>
+      <source>Select where to install %1.&lt;br/&gt;&lt;font color="red"&gt;Warning: &lt;/font&gt;this will delete all files on the selected partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="149"/>
+      <source>The selected item does not appear to be a valid partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="157"/>
+      <source>%1 cannot be installed on empty space. Please select an existing partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="167"/>
+      <source>%1 cannot be installed on an extended partition. Please select an existing primary or logical partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="177"/>
+      <source>%1 cannot be installed on this partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="183"/>
+      <source>Data partition (%1)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="203"/>
+      <source>Unknown system partition (%1)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="207"/>
+      <source>%1 system partition (%2)</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="218"/>
+      <source>&lt;strong&gt;%4&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="240"/>
+      <source>&lt;strong&gt;%2&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="251"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="267"/>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="292"/>
+      <source>&lt;strong&gt;%3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;%1 will be installed on %2.&lt;br/&gt;&lt;font color="red"&gt;Warning: &lt;/font&gt;all data on partition %2 will be lost.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="259"/>
+      <source>The EFI system partition at %1 will be used for starting %2.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="275"/>
+      <source>EFI system partition:</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>Requirements</name>
+    <message>
+      <location filename="../src/modules/welcomeq/Requirements.qml" line="38"/>
+      <source>&lt;p&gt;This computer does not satisfy the minimum requirements for installing %1.&lt;br/&gt;
+        Installation cannot continue.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/Requirements.qml" line="40"/>
+      <source>&lt;p&gt;This computer does not satisfy some of the recommended requirements for setting up %1.&lt;br/&gt;
+        Setup can continue, but some features might be disabled.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ResizeFSJob</name>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="46"/>
+      <source>Resize Filesystem Job</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="169"/>
+      <source>Invalid configuration</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="170"/>
+      <source>The file-system resize job has an invalid configuration and will not run.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="175"/>
+      <source>KPMCore not Available</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="176"/>
+      <source>Calamares cannot start KPMCore for the file-system resize job.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="184"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="193"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="204"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="213"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="231"/>
+      <source>Resize Failed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="186"/>
+      <source>The filesystem %1 could not be found in this system, and cannot be resized.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="187"/>
+      <source>The device %1 could not be found in this system, and cannot be resized.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="195"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="206"/>
+      <source>The filesystem %1 cannot be resized.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="196"/>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="207"/>
+      <source>The device %1 cannot be resized.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="214"/>
+      <source>The filesystem %1 must be resized, but cannot.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="215"/>
+      <source>The device %1 must be resized, but cannot</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ResizePartitionJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="40"/>
+      <source>Resize partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="47"/>
+      <source>Resize &lt;strong&gt;%2MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; to &lt;strong&gt;%3MiB&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="58"/>
+      <source>Resizing %2MiB partition %1 to %3MiB.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="77"/>
+      <source>The installer failed to resize partition %1 on disk '%2'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ResizeVolumeGroupDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/ResizeVolumeGroupDialog.cpp" line="30"/>
+      <source>Resize Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ResizeVolumeGroupJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="27"/>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="45"/>
+      <source>Resize volume group named %1 from %2 to %3.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="36"/>
+      <source>Resize volume group named &lt;strong&gt;%1&lt;/strong&gt; from &lt;strong&gt;%2&lt;/strong&gt; to &lt;strong&gt;%3&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="60"/>
+      <source>The installer failed to resize a volume group named '%1'.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ResultsListDialog</name>
+    <message>
+      <location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="137"/>
+      <source>For best results, please ensure that this computer:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="138"/>
+      <source>System requirements</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ScanningDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/ScanningDialog.cpp" line="64"/>
+      <source>Scanning storage devices...</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/ScanningDialog.cpp" line="64"/>
+      <source>Partitioning</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetHostNameJob</name>
+    <message>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="37"/>
+      <source>Set hostname %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="44"/>
+      <source>Set hostname &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="51"/>
+      <source>Setting hostname %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="122"/>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="129"/>
+      <source>Internal Error</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="137"/>
+      <location filename="../src/modules/users/SetHostNameJob.cpp" line="146"/>
+      <source>Cannot write hostname to target system</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetKeyboardLayoutJob</name>
+    <message>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="55"/>
+      <source>Set keyboard model to %1, layout to %2-%3</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="368"/>
+      <source>Failed to write keyboard configuration for the virtual console.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="369"/>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="397"/>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="414"/>
+      <source>Failed to write to %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="396"/>
+      <source>Failed to write keyboard configuration for X11.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="413"/>
+      <source>Failed to write keyboard configuration to existing /etc/default directory.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetPartFlagsJob</name>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="43"/>
+      <source>Set flags on partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="49"/>
+      <source>Set flags on %1MiB %2 partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="53"/>
+      <source>Set flags on new partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="65"/>
+      <source>Clear flags on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="71"/>
+      <source>Clear flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="75"/>
+      <source>Clear flags on new partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="80"/>
+      <source>Flag partition &lt;strong&gt;%1&lt;/strong&gt; as &lt;strong&gt;%2&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="89"/>
+      <source>Flag %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition as &lt;strong&gt;%3&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="96"/>
+      <source>Flag new partition as &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="108"/>
+      <source>Clearing flags on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="114"/>
+      <source>Clearing flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="119"/>
+      <source>Clearing flags on new partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="124"/>
+      <source>Setting flags &lt;strong&gt;%2&lt;/strong&gt; on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="133"/>
+      <source>Setting flags &lt;strong&gt;%3&lt;/strong&gt; on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="140"/>
+      <source>Setting flags &lt;strong&gt;%1&lt;/strong&gt; on new partition.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="157"/>
+      <source>The installer failed to set flags on partition %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetPasswordJob</name>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="40"/>
+      <source>Set password for user %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="47"/>
+      <source>Setting password for user %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="81"/>
+      <source>Bad destination system path.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="82"/>
+      <source>rootMountPoint is %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="88"/>
+      <source>Cannot disable root account.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="89"/>
+      <source>passwd terminated with error code %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="97"/>
+      <source>Cannot set password for user %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/SetPasswordJob.cpp" line="98"/>
+      <source>usermod terminated with error code %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetTimezoneJob</name>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="34"/>
+      <source>Set timezone to %1/%2</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="62"/>
+      <source>Cannot access selected timezone path.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="63"/>
+      <source>Bad path: %1</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="71"/>
+      <source>Cannot set timezone.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="72"/>
+      <source>Link creation failed, target: %1; link name: %2</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="77"/>
+      <source>Cannot set timezone,</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="78"/>
+      <source>Cannot open /etc/timezone for writing</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetupGroupsJob</name>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="166"/>
+      <source>Preparing groups.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="178"/>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="183"/>
+      <source>Could not create groups in target system</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="184"/>
+      <source>These groups are missing in the target system: %1</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SetupSudoJob</name>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="33"/>
+      <source>Configure &lt;pre&gt;sudo&lt;/pre&gt; users.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="55"/>
+      <source>Cannot chmod sudoers file.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/MiscJobs.cpp" line="60"/>
+      <source>Cannot create sudoers file for writing.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>ShellProcessJob</name>
+    <message>
+      <location filename="../src/modules/shellprocess/ShellProcessJob.cpp" line="41"/>
+      <source>Shell Processes Job</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>SlideCounter</name>
+    <message>
+      <location filename="../src/qml/calamares/slideshow/SlideCounter.qml" line="27"/>
+      <source>%L1 / %L2</source>
+      <extracomment>slide counter, %1 of %2 (numeric)</extracomment>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>StandardButtons</name>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="28"/>
+      <source>&amp;OK</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="29"/>
+      <source>&amp;Yes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="30"/>
+      <source>&amp;No</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="31"/>
+      <source>&amp;Cancel</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="32"/>
+      <source>&amp;Close</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>TrackingInstallJob</name>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="102"/>
+      <source>Installation feedback</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="108"/>
+      <source>Sending installation feedback.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="125"/>
+      <source>Internal error in install-tracking.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="126"/>
+      <source>HTTP request timed out.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>TrackingKUserFeedbackJob</name>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="187"/>
+      <source>KDE user feedback</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="193"/>
+      <source>Configuring KDE user feedback.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="215"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="221"/>
+      <source>Error in KDE user feedback configuration.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="216"/>
+      <source>Could not configure KDE user feedback correctly, script error %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="222"/>
+      <source>Could not configure KDE user feedback correctly, Calamares error %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>TrackingMachineUpdateManagerJob</name>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="136"/>
+      <source>Machine feedback</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="142"/>
+      <source>Configuring machine feedback.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="165"/>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="171"/>
+      <source>Error in machine feedback configuration.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="166"/>
+      <source>Could not configure machine feedback correctly, script error %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingJobs.cpp" line="172"/>
+      <source>Could not configure machine feedback correctly, Calamares error %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>TrackingPage</name>
+    <message>
+      <location filename="../src/modules/tracking/page_trackingstep.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/page_trackingstep.ui" line="28"/>
+      <source>Placeholder</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/page_trackingstep.ui" line="76"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Click here to send &lt;span style=" font-weight:600;"&gt;no information at all&lt;/span&gt; about your installation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/page_trackingstep.ui" line="275"/>
+      <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href="placeholder"&gt;&lt;span style=" text-decoration: underline; color:#2980b9;"&gt;Click here for more information about user feedback&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingPage.cpp" line="86"/>
+      <source>Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingPage.cpp" line="91"/>
+      <source>By selecting this you will send information about your installation and hardware. This information will only be sent &lt;b&gt;once&lt;/b&gt; after the installation finishes.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingPage.cpp" line="94"/>
+      <source>By selecting this you will periodically send information about your &lt;b&gt;machine&lt;/b&gt; installation, hardware and applications, to %1.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/tracking/TrackingPage.cpp" line="98"/>
+      <source>By selecting this you will regularly send information about your &lt;b&gt;user&lt;/b&gt; installation, hardware, applications and application usage patterns, to %1.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>TrackingViewStep</name>
+    <message>
+      <location filename="../src/modules/tracking/TrackingViewStep.cpp" line="49"/>
+      <source>Feedback</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>UsersPage</name>
+    <message>
+      <location filename="../src/modules/users/UsersPage.cpp" line="167"/>
+      <source>&lt;small&gt;If more than one person will use this computer, you can create multiple accounts after setup.&lt;/small&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/users/UsersPage.cpp" line="173"/>
+      <source>&lt;small&gt;If more than one person will use this computer, you can create multiple accounts after installation.&lt;/small&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>UsersQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/usersq/UsersQmlViewStep.cpp" line="35"/>
+      <source>Users</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>UsersViewStep</name>
+    <message>
+      <location filename="../src/modules/users/UsersViewStep.cpp" line="48"/>
+      <source>Users</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>VariantModel</name>
+    <message>
+      <location filename="../src/calamares/VariantModel.cpp" line="232"/>
+      <source>Key</source>
+      <comment>Column header for key/value</comment>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/calamares/VariantModel.cpp" line="236"/>
+      <source>Value</source>
+      <comment>Column header for key/value</comment>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>VolumeGroupBaseDialog</name>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="18"/>
+      <source>Create Volume Group</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="24"/>
+      <source>List of Physical Volumes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="34"/>
+      <source>Volume Group Name:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="47"/>
+      <source>Volume Group Type:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="60"/>
+      <source>Physical Extent Size:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="70"/>
+      <source> MiB</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="86"/>
+      <source>Total Size:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="106"/>
+      <source>Used Size:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="126"/>
+      <source>Total Sectors:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="146"/>
+      <source>Quantity of LVs:</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>WelcomePage</name>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="18"/>
+      <source>Form</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="79"/>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="98"/>
+      <source>Select application and system language</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="140"/>
+      <source>&amp;About</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="150"/>
+      <source>Open donations website</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="153"/>
+      <source>&amp;Donate</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="163"/>
+      <source>Open help and support website</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="166"/>
+      <source>&amp;Support</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="176"/>
+      <source>Open issues and bug-tracking website</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="179"/>
+      <source>&amp;Known issues</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="189"/>
+      <source>Open release notes website</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.ui" line="192"/>
+      <source>&amp;Release notes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="216"/>
+      <source>&lt;h1&gt;Welcome to the Calamares setup program for %1.&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="217"/>
+      <source>&lt;h1&gt;Welcome to %1 setup.&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="222"/>
+      <source>&lt;h1&gt;Welcome to the Calamares installer for %1.&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="223"/>
+      <source>&lt;h1&gt;Welcome to the %1 installer.&lt;/h1&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="228"/>
+      <source>%1 support</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="235"/>
+      <source>About %1 setup</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="235"/>
+      <source>About %1 installer</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcome/WelcomePage.cpp" line="238"/>
+      <source>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;for %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Copyright 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;Copyright 2017-2020 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;Thanks to &lt;a href="https://calamares.io/team/"&gt;the Calamares team&lt;/a&gt; and the &lt;a href="https://www.transifex.com/calamares/calamares/"&gt;Calamares translators team&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; development is sponsored by &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>WelcomeQmlViewStep</name>
+    <message>
+      <location filename="../src/modules/welcomeq/WelcomeQmlViewStep.cpp" line="40"/>
+      <source>Welcome</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>WelcomeViewStep</name>
+    <message>
+      <location filename="../src/modules/welcome/WelcomeViewStep.cpp" line="46"/>
+      <source>Welcome</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>about</name>
+    <message>
+      <location filename="../src/modules/welcomeq/about.qml" line="47"/>
+      <source>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;
+                        &lt;strong&gt;%2&lt;br/&gt;
+                        for %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;
+                        Copyright 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;
+                        Copyright 2017-2020 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;
+                        Thanks to &lt;a href='https://calamares.io/team/'&gt;the Calamares team&lt;/a&gt;
+                        and the &lt;a href='https://www.transifex.com/calamares/calamares/'&gt;Calamares
+                        translators team&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;
+                        &lt;a href='https://calamares.io/'&gt;Calamares&lt;/a&gt;
+                        development is sponsored by &lt;br/&gt;
+                        &lt;a href='http://www.blue-systems.com/'&gt;Blue Systems&lt;/a&gt; -
+                        Liberating Software.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/about.qml" line="96"/>
+      <source>Back</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>calamares-sidebar</name>
+    <message>
+      <location filename="../src/calamares/calamares-sidebar.qml" line="79"/>
+      <source>Show debug information</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>finishedq</name>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq.qml" line="36"/>
+      <source>Installation Completed</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq.qml" line="43"/>
+      <source>%1 has been installed on your computer.&lt;br/&gt;
+            You may now restart into your new system, or continue using the Live environment.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq.qml" line="65"/>
+      <source>Close Installer</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq.qml" line="71"/>
+      <source>Restart System</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/finishedq/finishedq.qml" line="89"/>
+      <source>&lt;p&gt;A full log of the install is available as installation.log in the home directory of the Live user.&lt;br/&gt;
+            This log is copied to /var/log/installation.log of the target system.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>i18n</name>
+    <message>
+      <location filename="../src/modules/localeq/i18n.qml" line="50"/>
+      <source>&lt;h1&gt;Languages&lt;/h1&gt; &lt;/br&gt;
+                    The system locale setting affects the language and character set for some command line user interface elements. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/i18n.qml" line="123"/>
+      <source>&lt;h1&gt;Locales&lt;/h1&gt; &lt;/br&gt;
+                    The system locale setting affects the numbers and dates format. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/localeq/i18n.qml" line="189"/>
+      <source>Back</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>keyboardq</name>
+    <message>
+      <location filename="../src/modules/keyboardq/keyboardq.qml" line="60"/>
+      <source>To activate keyboard preview, select a layout.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboardq/keyboardq.qml" line="86"/>
+      <source>Keyboard Model:</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboardq/keyboardq.qml" line="254"/>
+      <source>Layouts</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboardq/keyboardq.qml" line="263"/>
+      <source>Type here to test your keyboard</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/keyboardq/keyboardq.qml" line="179"/>
+      <source>Variants</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>localeq</name>
+    <message>
+      <location filename="../src/modules/localeq/localeq.qml" line="81"/>
+      <source>Change</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>notesqml</name>
+    <message>
+      <location filename="../src/modules/notesqml/notesqml.qml" line="50"/>
+      <source>&lt;h3&gt;%1&lt;/h3&gt;
+            &lt;p&gt;These are example release notes.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>packagechooserq</name>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="45"/>
+      <source>LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.&lt;br/&gt;
+                    Default option.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="59"/>
+      <source>LibreOffice</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="108"/>
+      <source>If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="121"/>
+      <source>No Office Suite</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="172"/>
+      <source>Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support.  It will be just a desktop, file browser, package manager, text editor and simple web-browser.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="185"/>
+      <source>Minimal Install</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="233"/>
+      <source>Please select an option for your install, or use the default: LibreOffice included.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>release_notes</name>
+    <message>
+      <location filename="../src/modules/welcomeq/release_notes.qml" line="45"/>
+      <source>&lt;h3&gt;%1&lt;/h3&gt;
+            &lt;p&gt;This an example QML file, showing options in RichText with Flickable content.&lt;/p&gt;
+
+            &lt;p&gt;QML with RichText can use HTML tags, Flickable content is useful for touchscreens.&lt;/p&gt;
+
+            &lt;p&gt;&lt;b&gt;This is bold text&lt;/b&gt;&lt;/p&gt;
+            &lt;p&gt;&lt;i&gt;This is italic text&lt;/i&gt;&lt;/p&gt;
+            &lt;p&gt;&lt;u&gt;This is underlined text&lt;/u&gt;&lt;/p&gt;
+            &lt;p&gt;&lt;center&gt;This text will be center-aligned.&lt;/center&gt;&lt;/p&gt;
+            &lt;p&gt;&lt;s&gt;This is strikethrough&lt;/s&gt;&lt;/p&gt;
+
+            &lt;p&gt;Code example:
+            &lt;code&gt;ls -l /home&lt;/code&gt;&lt;/p&gt;
+
+            &lt;p&gt;&lt;b&gt;Lists:&lt;/b&gt;&lt;/p&gt;
+            &lt;ul&gt;
+                &lt;li&gt;Intel CPU systems&lt;/li&gt;
+                &lt;li&gt;AMD CPU systems&lt;/li&gt;
+            &lt;/ul&gt;
+
+            &lt;p&gt;The vertical scrollbar is adjustable, current width set to 10.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/release_notes.qml" line="76"/>
+      <source>Back</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>usersq</name>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="43"/>
+      <source>Pick your user name and credentials to login and perform admin tasks</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="56"/>
+      <source>What is your name?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="63"/>
+      <source>Your Full Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="80"/>
+      <source>What name do you want to use to log in?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="87"/>
+      <source>Login Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="116"/>
+      <source>If more than one person will use this computer, you can create multiple accounts after installation.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="128"/>
+      <source>Only lowercase letters, numbers, underscore and hyphen are allowed.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="136"/>
+      <source>root is not allowed as username.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="145"/>
+      <source>What is the name of this computer?</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="151"/>
+      <source>Computer Name</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="178"/>
+      <source>This name will be used if you make the computer visible to others on a network.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="198"/>
+      <source>localhost is not allowed as hostname.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="207"/>
+      <source>Choose a password to keep your account safe.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="217"/>
+      <source>Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="234"/>
+      <source>Repeat Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="261"/>
+      <source>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="406"/>
+      <source>Validate passwords quality</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="416"/>
+      <source>When this box is checked, password-strength checking is done and you will not be able to use a weak password.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="398"/>
+      <source>Log in automatically without asking for the password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="190"/>
+      <source>Only letters, numbers, underscore and hyphen are allowed, minimal of two characters.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="293"/>
+      <source>Reuse user password as root password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="301"/>
+      <source>Use the same password for the administrator account.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="314"/>
+      <source>Choose a root password to keep your account safe.</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="324"/>
+      <source>Root Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="342"/>
+      <source>Repeat Root Password</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/usersq/usersq.qml" line="368"/>
+      <source>Enter the same password twice, so that it can be checked for typing errors.</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+  <context>
+    <name>welcomeq</name>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="35"/>
+      <source>&lt;h3&gt;Welcome to the %1 &lt;quote&gt;%2&lt;/quote&gt; installer&lt;/h3&gt;
+            &lt;p&gt;This program will ask you some questions and set up %1 on your computer.&lt;/p&gt;</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="66"/>
+      <source>About</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="80"/>
+      <source>Support</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="91"/>
+      <source>Known issues</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="102"/>
+      <source>Release notes</source>
+      <translation type="unfinished"/>
+    </message>
+    <message>
+      <location filename="../src/modules/welcomeq/welcomeq.qml" line="114"/>
+      <source>Donate</source>
+      <translation type="unfinished"/>
+    </message>
+  </context>
+</TS>
diff --git a/lang/calamares_tg.ts b/lang/calamares_tg.ts
index 1c64c5d8c35be02c97919fa56cec812abf2f0b67..b4124be17d861a45136b4898ff233b2c5b65a12c 100644
--- a/lang/calamares_tg.ts
+++ b/lang/calamares_tg.ts
@@ -6,7 +6,7 @@
     <message>
       <location filename="../src/modules/partition/jobs/AutoMountManagementJob.cpp" line="22"/>
       <source>Manage auto-mount settings</source>
-      <translation type="unfinished"/>
+      <translation>Идора кардани танзимоти васлкунии худкор</translation>
     </message>
   </context>
   <context>
diff --git a/lang/calamares_vi.ts b/lang/calamares_vi.ts
index 9e59b527d50cf3ce837143c0ec583ac99362c636..14d93dade819a8eba8e805338923c22a0c70637e 100644
--- a/lang/calamares_vi.ts
+++ b/lang/calamares_vi.ts
@@ -6,7 +6,7 @@
     <message>
       <location filename="../src/modules/partition/jobs/AutoMountManagementJob.cpp" line="22"/>
       <source>Manage auto-mount settings</source>
-      <translation type="unfinished"/>
+      <translation>Quản lý cài đặt tự động gắn kết(auto-mount)</translation>
     </message>
   </context>
   <context>
@@ -104,22 +104,22 @@
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="102"/>
       <source>Crashes Calamares, so that Dr. Konqui can look at it.</source>
-      <translation type="unfinished"/>
+      <translation>Gây crash Calamares, để Dr. Konqui có thể xem nó.</translation>
     </message>
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="115"/>
       <source>Reloads the stylesheet from the branding directory.</source>
-      <translation type="unfinished"/>
+      <translation>Tải lại stylesheet từ thư mục branding</translation>
     </message>
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="141"/>
       <source>Uploads the session log to the configured pastebin.</source>
-      <translation type="unfinished"/>
+      <translation>Đăng tải log của phiên này lên pastebin đã được cấu hình</translation>
     </message>
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="144"/>
       <source>Send Session Log</source>
-      <translation type="unfinished"/>
+      <translation>Gửi log của phiên này</translation>
     </message>
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="118"/>
@@ -129,7 +129,7 @@
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="128"/>
       <source>Displays the tree of widget names in the log (for stylesheet debugging).</source>
-      <translation type="unfinished"/>
+      <translation>Hiễn thị cây của tên widget trong log(để gỡ lỗi stylesheet)</translation>
     </message>
     <message>
       <location filename="../src/calamares/DebugWindow.ui" line="131"/>
diff --git a/lang/calamares_zh_CN.ts b/lang/calamares_zh_CN.ts
index 5b58024ad7226b1a36bf16e3ade72b9bdae7188c..df04d1dd6acd8b56fc9da3ceeab563dce82ace38 100644
--- a/lang/calamares_zh_CN.ts
+++ b/lang/calamares_zh_CN.ts
@@ -688,27 +688,27 @@ The installer will quit and all changes will be lost.</source>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="259"/>
       <source>Successfully unmounted %1.</source>
-      <translation type="unfinished"/>
+      <translation>成功卸载了 %1。</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="266"/>
       <source>Successfully disabled swap %1.</source>
-      <translation type="unfinished"/>
+      <translation>成功禁用了交换空间 %1。</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="292"/>
       <source>Successfully cleared swap %1.</source>
-      <translation type="unfinished"/>
+      <translation>成功清理了交换空间 %1。</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="306"/>
       <source>Successfully closed mapper device %1.</source>
-      <translation type="unfinished"/>
+      <translation>成功关闭了映射设备 %1。</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="319"/>
       <source>Successfully disabled volume group %1.</source>
-      <translation type="unfinished"/>
+      <translation>成功禁用了卷组  %1。</translation>
     </message>
     <message>
       <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="358"/>
diff --git a/lang/python.pot b/lang/python.pot
index 63372044ecf842d4ed31f3f56d589b82bb8a14f3..86647241b637bdebcfd15f6946511ec59acc5542 100644
--- a/lang/python.pot
+++ b/lang/python.pot
@@ -2,409 +2,403 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-# 
+#
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-11-02 15:45+0100\n"
+"POT-Creation-Date: 2022-02-01 17:27+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: \n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
 #: src/modules/initramfscfg/main.py:32
 msgid "Configuring initramfs."
-msgstr "Configuring initramfs."
+msgstr ""
 
 #: src/modules/initramfscfg/main.py:85 src/modules/initramfscfg/main.py:89
-#: src/modules/fstab/main.py:355 src/modules/fstab/main.py:361
-#: src/modules/fstab/main.py:388 src/modules/networkcfg/main.py:105
-#: src/modules/initcpiocfg/main.py:227 src/modules/initcpiocfg/main.py:231
-#: src/modules/localecfg/main.py:135 src/modules/mount/main.py:144
+#: src/modules/fstab/main.py:360 src/modules/fstab/main.py:366
+#: src/modules/fstab/main.py:393 src/modules/networkcfg/main.py:105
+#: src/modules/initcpiocfg/main.py:235 src/modules/initcpiocfg/main.py:239
+#: src/modules/localecfg/main.py:135 src/modules/mount/main.py:229
 #: src/modules/rawfs/main.py:164 src/modules/openrcdmcryptcfg/main.py:72
 #: src/modules/openrcdmcryptcfg/main.py:76
-#: src/modules/luksopenswaphookcfg/main.py:86
-#: src/modules/luksopenswaphookcfg/main.py:90
 msgid "Configuration Error"
-msgstr "Configuration Error"
+msgstr ""
 
-#: src/modules/initramfscfg/main.py:86 src/modules/fstab/main.py:356
-#: src/modules/initcpiocfg/main.py:228 src/modules/mount/main.py:145
+#: src/modules/initramfscfg/main.py:86 src/modules/fstab/main.py:361
+#: src/modules/initcpiocfg/main.py:236 src/modules/mount/main.py:230
 #: src/modules/rawfs/main.py:165 src/modules/openrcdmcryptcfg/main.py:73
-#: src/modules/luksopenswaphookcfg/main.py:87
 msgid "No partitions are defined for <pre>{!s}</pre> to use."
-msgstr "No partitions are defined for <pre>{!s}</pre> to use."
+msgstr ""
 
-#: src/modules/initramfscfg/main.py:90 src/modules/fstab/main.py:362
-#: src/modules/networkcfg/main.py:106 src/modules/initcpiocfg/main.py:232
+#: src/modules/initramfscfg/main.py:90 src/modules/fstab/main.py:367
+#: src/modules/networkcfg/main.py:106 src/modules/initcpiocfg/main.py:240
 #: src/modules/localecfg/main.py:136 src/modules/openrcdmcryptcfg/main.py:77
-#: src/modules/luksopenswaphookcfg/main.py:91
 msgid "No root mount point is given for <pre>{!s}</pre> to use."
-msgstr "No root mount point is given for <pre>{!s}</pre> to use."
+msgstr ""
 
 #: src/modules/grubcfg/main.py:28
 msgid "Configure GRUB."
-msgstr "Configure GRUB."
+msgstr ""
 
 #: src/modules/bootloader/main.py:43
 msgid "Install bootloader."
-msgstr "Install bootloader."
+msgstr ""
+
+#: src/modules/bootloader/main.py:612
+msgid "Failed to install grub, no partitions defined in global storage"
+msgstr ""
 
-#: src/modules/bootloader/main.py:508
+#: src/modules/bootloader/main.py:780
 msgid "Bootloader installation error"
-msgstr "Bootloader installation error"
+msgstr ""
 
-#: src/modules/bootloader/main.py:509
+#: src/modules/bootloader/main.py:781
 msgid ""
-"The bootloader could not be installed. The installation command "
-"<pre>{!s}</pre> returned error code {!s}."
+"The bootloader could not be installed. The installation command <pre>{!s}</"
+"pre> returned error code {!s}."
 msgstr ""
-"The bootloader could not be installed. The installation command "
-"<pre>{!s}</pre> returned error code {!s}."
 
 #: src/modules/fstab/main.py:29
 msgid "Writing fstab."
-msgstr "Writing fstab."
+msgstr ""
 
-#: src/modules/fstab/main.py:389
+#: src/modules/fstab/main.py:394
 msgid "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use."
-msgstr "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use."
+msgstr ""
 
 #: src/modules/dracut/main.py:27
 msgid "Creating initramfs with dracut."
-msgstr "Creating initramfs with dracut."
+msgstr ""
 
 #: src/modules/dracut/main.py:49
 msgid "Failed to run dracut on the target"
-msgstr "Failed to run dracut on the target"
+msgstr ""
 
 #: src/modules/dracut/main.py:50 src/modules/mkinitfs/main.py:50
 msgid "The exit code was {}"
-msgstr "The exit code was {}"
+msgstr ""
 
-#: src/modules/displaymanager/main.py:526
+#: src/modules/displaymanager/main.py:524
 msgid "Cannot write KDM configuration file"
-msgstr "Cannot write KDM configuration file"
+msgstr ""
 
-#: src/modules/displaymanager/main.py:527
+#: src/modules/displaymanager/main.py:525
 msgid "KDM config file {!s} does not exist"
-msgstr "KDM config file {!s} does not exist"
+msgstr ""
 
-#: src/modules/displaymanager/main.py:588
+#: src/modules/displaymanager/main.py:586
 msgid "Cannot write LXDM configuration file"
-msgstr "Cannot write LXDM configuration file"
+msgstr ""
 
-#: src/modules/displaymanager/main.py:589
+#: src/modules/displaymanager/main.py:587
 msgid "LXDM config file {!s} does not exist"
-msgstr "LXDM config file {!s} does not exist"
+msgstr ""
 
-#: src/modules/displaymanager/main.py:672
+#: src/modules/displaymanager/main.py:670
 msgid "Cannot write LightDM configuration file"
-msgstr "Cannot write LightDM configuration file"
+msgstr ""
 
-#: src/modules/displaymanager/main.py:673
+#: src/modules/displaymanager/main.py:671
 msgid "LightDM config file {!s} does not exist"
-msgstr "LightDM config file {!s} does not exist"
+msgstr ""
 
-#: src/modules/displaymanager/main.py:747
+#: src/modules/displaymanager/main.py:745
 msgid "Cannot configure LightDM"
-msgstr "Cannot configure LightDM"
+msgstr ""
 
-#: src/modules/displaymanager/main.py:748
+#: src/modules/displaymanager/main.py:746
 msgid "No LightDM greeter installed."
-msgstr "No LightDM greeter installed."
+msgstr ""
 
-#: src/modules/displaymanager/main.py:779
+#: src/modules/displaymanager/main.py:777
 msgid "Cannot write SLIM configuration file"
-msgstr "Cannot write SLIM configuration file"
+msgstr ""
 
-#: src/modules/displaymanager/main.py:780
+#: src/modules/displaymanager/main.py:778
 msgid "SLIM config file {!s} does not exist"
-msgstr "SLIM config file {!s} does not exist"
+msgstr ""
 
-#: src/modules/displaymanager/main.py:906
+#: src/modules/displaymanager/main.py:991
 msgid "No display managers selected for the displaymanager module."
-msgstr "No display managers selected for the displaymanager module."
+msgstr ""
 
-#: src/modules/displaymanager/main.py:907
+#: src/modules/displaymanager/main.py:992
 msgid ""
 "The displaymanagers list is empty or undefined in both globalstorage and "
 "displaymanager.conf."
 msgstr ""
-"The displaymanagers list is empty or undefined in both globalstorage and "
-"displaymanager.conf."
 
-#: src/modules/displaymanager/main.py:989
+#: src/modules/displaymanager/main.py:1074
 msgid "Display manager configuration was incomplete"
-msgstr "Display manager configuration was incomplete"
+msgstr ""
 
 #: src/modules/services-openrc/main.py:29
 msgid "Configure OpenRC services"
-msgstr "Configure OpenRC services"
+msgstr ""
 
 #: src/modules/services-openrc/main.py:57
 msgid "Cannot add service {name!s} to run-level {level!s}."
-msgstr "Cannot add service {name!s} to run-level {level!s}."
+msgstr ""
 
 #: src/modules/services-openrc/main.py:59
 msgid "Cannot remove service {name!s} from run-level {level!s}."
-msgstr "Cannot remove service {name!s} from run-level {level!s}."
+msgstr ""
 
 #: src/modules/services-openrc/main.py:61
 msgid ""
 "Unknown service-action <code>{arg!s}</code> for service {name!s} in run-"
 "level {level!s}."
 msgstr ""
-"Unknown service-action <code>{arg!s}</code> for service {name!s} in run-"
-"level {level!s}."
 
 #: src/modules/services-openrc/main.py:93
 #: src/modules/services-systemd/main.py:59
 msgid "Cannot modify service"
-msgstr "Cannot modify service"
+msgstr ""
 
 #: src/modules/services-openrc/main.py:94
 msgid ""
 "<code>rc-update {arg!s}</code> call in chroot returned error code {num!s}."
 msgstr ""
-"<code>rc-update {arg!s}</code> call in chroot returned error code {num!s}."
 
 #: src/modules/services-openrc/main.py:101
 msgid "Target runlevel does not exist"
-msgstr "Target runlevel does not exist"
+msgstr ""
 
 #: src/modules/services-openrc/main.py:102
 msgid ""
 "The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
 "exist."
 msgstr ""
-"The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
-"exist."
 
 #: src/modules/services-openrc/main.py:110
 msgid "Target service does not exist"
-msgstr "Target service does not exist"
+msgstr ""
 
 #: src/modules/services-openrc/main.py:111
 msgid ""
-"The path for service {name!s} is <code>{path!s}</code>, which does not "
-"exist."
+"The path for service {name!s} is <code>{path!s}</code>, which does not exist."
 msgstr ""
-"The path for service {name!s} is <code>{path!s}</code>, which does not "
-"exist."
 
 #: src/modules/networkcfg/main.py:29
 msgid "Saving network configuration."
-msgstr "Saving network configuration."
+msgstr ""
 
-#: src/modules/packages/main.py:50 src/modules/packages/main.py:59
-#: src/modules/packages/main.py:69
+#: src/modules/packages/main.py:54 src/modules/packages/main.py:65
+#: src/modules/packages/main.py:75
 msgid "Install packages."
-msgstr "Install packages."
+msgstr ""
 
-#: src/modules/packages/main.py:57
+#: src/modules/packages/main.py:63
 #, python-format
 msgid "Processing packages (%(count)d / %(total)d)"
-msgstr "Processing packages (%(count)d / %(total)d)"
+msgstr ""
 
-#: src/modules/packages/main.py:62
+#: src/modules/packages/main.py:68
 #, python-format
 msgid "Installing one package."
 msgid_plural "Installing %(num)d packages."
-msgstr[0] "Installing one package."
-msgstr[1] "Installing %(num)d packages."
+msgstr[0] ""
+msgstr[1] ""
 
-#: src/modules/packages/main.py:65
+#: src/modules/packages/main.py:71
 #, python-format
 msgid "Removing one package."
 msgid_plural "Removing %(num)d packages."
-msgstr[0] "Removing one package."
-msgstr[1] "Removing %(num)d packages."
+msgstr[0] ""
+msgstr[1] ""
 
-#: src/modules/packages/main.py:638 src/modules/packages/main.py:650
-#: src/modules/packages/main.py:678
+#: src/modules/packages/main.py:725 src/modules/packages/main.py:737
+#: src/modules/packages/main.py:765
 msgid "Package Manager error"
-msgstr "Package Manager error"
+msgstr ""
 
-#: src/modules/packages/main.py:639
+#: src/modules/packages/main.py:726
 msgid ""
 "The package manager could not prepare updates. The command <pre>{!s}</pre> "
 "returned error code {!s}."
 msgstr ""
-"The package manager could not prepare updates. The command <pre>{!s}</pre> "
-"returned error code {!s}."
 
-#: src/modules/packages/main.py:651
+#: src/modules/packages/main.py:738
 msgid ""
-"The package manager could not update the system. The command <pre>{!s}</pre>"
-" returned error code {!s}."
+"The package manager could not update the system. The command <pre>{!s}</pre> "
+"returned error code {!s}."
 msgstr ""
-"The package manager could not update the system. The command <pre>{!s}</pre>"
-" returned error code {!s}."
 
-#: src/modules/packages/main.py:679
+#: src/modules/packages/main.py:766
 msgid ""
 "The package manager could not make changes to the installed system. The "
 "command <pre>{!s}</pre> returned error code {!s}."
 msgstr ""
-"The package manager could not make changes to the installed system. The "
-"command <pre>{!s}</pre> returned error code {!s}."
 
 #: src/modules/plymouthcfg/main.py:27
 msgid "Configure Plymouth theme"
-msgstr "Configure Plymouth theme"
+msgstr ""
 
 #: src/modules/initcpiocfg/main.py:28
 msgid "Configuring mkinitcpio."
-msgstr "Configuring mkinitcpio."
+msgstr ""
 
 #: src/modules/localecfg/main.py:30
 msgid "Configuring locales."
-msgstr "Configuring locales."
+msgstr ""
 
-#: src/modules/mount/main.py:30
+#: src/modules/mount/main.py:42
 msgid "Mounting partitions."
-msgstr "Mounting partitions."
+msgstr ""
+
+#: src/modules/mount/main.py:88 src/modules/mount/main.py:124
+msgid "Internal error mounting zfs datasets"
+msgstr ""
+
+#: src/modules/mount/main.py:100
+msgid "Failed to import zpool"
+msgstr ""
+
+#: src/modules/mount/main.py:116
+msgid "Failed to unlock zpool"
+msgstr ""
+
+#: src/modules/mount/main.py:133 src/modules/mount/main.py:138
+msgid "Failed to set zfs mountpoint"
+msgstr ""
+
+#: src/modules/mount/main.py:253
+msgid "zfs mounting error"
+msgstr ""
 
 #: src/modules/rawfs/main.py:26
 msgid "Installing data."
-msgstr "Installing data."
+msgstr ""
 
 #: src/modules/dummypython/main.py:35
 msgid "Dummy python job."
-msgstr "Dummy python job."
+msgstr ""
 
 #: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93
 #: src/modules/dummypython/main.py:94
 msgid "Dummy python step {}"
-msgstr "Dummy python step {}"
+msgstr ""
 
 #: src/modules/hwclock/main.py:26
 msgid "Setting hardware clock."
-msgstr "Setting hardware clock."
-
-#: src/modules/umount/main.py:31
-msgid "Unmount file systems."
-msgstr "Unmount file systems."
+msgstr ""
 
 #: src/modules/openrcdmcryptcfg/main.py:26
 msgid "Configuring OpenRC dmcrypt service."
-msgstr "Configuring OpenRC dmcrypt service."
+msgstr ""
 
 #: src/modules/services-systemd/main.py:26
 msgid "Configure systemd services"
-msgstr "Configure systemd services"
+msgstr ""
 
 #: src/modules/services-systemd/main.py:60
 msgid ""
 "<code>systemctl {arg!s}</code> call in chroot returned error code {num!s}."
 msgstr ""
-"<code>systemctl {arg!s}</code> call in chroot returned error code {num!s}."
 
 #: src/modules/services-systemd/main.py:63
 #: src/modules/services-systemd/main.py:69
 msgid "Cannot enable systemd service <code>{name!s}</code>."
-msgstr "Cannot enable systemd service <code>{name!s}</code>."
+msgstr ""
 
 #: src/modules/services-systemd/main.py:65
 msgid "Cannot enable systemd target <code>{name!s}</code>."
-msgstr "Cannot enable systemd target <code>{name!s}</code>."
+msgstr ""
 
 #: src/modules/services-systemd/main.py:67
 msgid "Cannot enable systemd timer <code>{name!s}</code>."
-msgstr "Cannot enable systemd timer <code>{name!s}</code>."
+msgstr ""
 
 #: src/modules/services-systemd/main.py:71
 msgid "Cannot disable systemd target <code>{name!s}</code>."
-msgstr "Cannot disable systemd target <code>{name!s}</code>."
+msgstr ""
 
 #: src/modules/services-systemd/main.py:73
 msgid "Cannot mask systemd unit <code>{name!s}</code>."
-msgstr "Cannot mask systemd unit <code>{name!s}</code>."
+msgstr ""
 
 #: src/modules/services-systemd/main.py:75
 msgid ""
-"Unknown systemd commands <code>{command!s}</code> and "
-"<code>{suffix!s}</code> for unit {name!s}."
+"Unknown systemd commands <code>{command!s}</code> and <code>{suffix!s}</"
+"code> for unit {name!s}."
 msgstr ""
-"Unknown systemd commands <code>{command!s}</code> and "
-"<code>{suffix!s}</code> for unit {name!s}."
 
 #: src/modules/mkinitfs/main.py:27
 msgid "Creating initramfs with mkinitfs."
-msgstr "Creating initramfs with mkinitfs."
+msgstr ""
 
 #: src/modules/mkinitfs/main.py:49
 msgid "Failed to run mkinitfs on the target"
-msgstr "Failed to run mkinitfs on the target"
+msgstr ""
 
 #: src/modules/unpackfs/main.py:34
 msgid "Filling up filesystems."
-msgstr "Filling up filesystems."
+msgstr ""
 
 #: src/modules/unpackfs/main.py:254
 msgid "rsync failed with error code {}."
-msgstr "rsync failed with error code {}."
+msgstr ""
 
 #: src/modules/unpackfs/main.py:299
 msgid "Unpacking image {}/{}, file {}/{}"
-msgstr "Unpacking image {}/{}, file {}/{}"
+msgstr ""
 
 #: src/modules/unpackfs/main.py:314
 msgid "Starting to unpack {}"
-msgstr "Starting to unpack {}"
+msgstr ""
 
-#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:465
+#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:467
 msgid "Failed to unpack image \"{}\""
-msgstr "Failed to unpack image \"{}\""
+msgstr ""
 
 #: src/modules/unpackfs/main.py:430
 msgid "No mount point for root partition"
-msgstr "No mount point for root partition"
+msgstr ""
 
 #: src/modules/unpackfs/main.py:431
-msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing"
-msgstr "globalstorage does not contain a \"rootMountPoint\" key, doing nothing"
+msgid "globalstorage does not contain a \"rootMountPoint\" key."
+msgstr ""
 
-#: src/modules/unpackfs/main.py:436
+#: src/modules/unpackfs/main.py:434
 msgid "Bad mount point for root partition"
-msgstr "Bad mount point for root partition"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:435
+msgid "rootMountPoint is \"{}\", which does not exist."
+msgstr ""
 
-#: src/modules/unpackfs/main.py:437
-msgid "rootMountPoint is \"{}\", which does not exist, doing nothing"
-msgstr "rootMountPoint is \"{}\", which does not exist, doing nothing"
+#: src/modules/unpackfs/main.py:439 src/modules/unpackfs/main.py:455
+#: src/modules/unpackfs/main.py:459 src/modules/unpackfs/main.py:465
+#: src/modules/unpackfs/main.py:480
+msgid "Bad unpackfs configuration"
+msgstr ""
 
-#: src/modules/unpackfs/main.py:453 src/modules/unpackfs/main.py:457
-#: src/modules/unpackfs/main.py:463 src/modules/unpackfs/main.py:478
-msgid "Bad unsquash configuration"
-msgstr "Bad unsquash configuration"
+#: src/modules/unpackfs/main.py:440
+msgid "There is no configuration information."
+msgstr ""
 
-#: src/modules/unpackfs/main.py:454
+#: src/modules/unpackfs/main.py:456
 msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel"
-msgstr "The filesystem for \"{}\" ({}) is not supported by your current kernel"
+msgstr ""
 
-#: src/modules/unpackfs/main.py:458
+#: src/modules/unpackfs/main.py:460
 msgid "The source filesystem \"{}\" does not exist"
-msgstr "The source filesystem \"{}\" does not exist"
+msgstr ""
 
-#: src/modules/unpackfs/main.py:464
+#: src/modules/unpackfs/main.py:466
 msgid ""
 "Failed to find unsquashfs, make sure you have the squashfs-tools package "
 "installed."
 msgstr ""
-"Failed to find unsquashfs, make sure you have the squashfs-tools package "
-"installed."
 
-#: src/modules/unpackfs/main.py:479
+#: src/modules/unpackfs/main.py:481
 msgid "The destination \"{}\" in the target system is not a directory"
-msgstr "The destination \"{}\" in the target system is not a directory"
-
-#: src/modules/luksopenswaphookcfg/main.py:26
-msgid "Configuring encrypted swap."
-msgstr "Configuring encrypted swap."
+msgstr ""
diff --git a/lang/python/cs_CZ/LC_MESSAGES/python.po b/lang/python/cs_CZ/LC_MESSAGES/python.po
index 70e9d5b77a4cf7d2c4113611aa41f8390e117c1f..23737551a60da93d239a47e4b6deaa1e9f2c4f80 100644
--- a/lang/python/cs_CZ/LC_MESSAGES/python.po
+++ b/lang/python/cs_CZ/LC_MESSAGES/python.po
@@ -6,7 +6,7 @@
 # Translators:
 # pavelrz, 2017
 # LiberteCzech <martin.kriz.czech@gmail.com>, 2020
-# Pavel Borecki <pavel.borecki@gmail.com>, 2021
+# Pavel Borecki <pavel.borecki@gmail.com>, 2022
 # 
 #, fuzzy
 msgid ""
@@ -15,7 +15,7 @@ msgstr ""
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2021-11-02 15:45+0100\n"
 "PO-Revision-Date: 2017-08-09 10:34+0000\n"
-"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>, 2021\n"
+"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>, 2022\n"
 "Language-Team: Czech (Czech Republic) (https://www.transifex.com/calamares/teams/20061/cs_CZ/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -331,7 +331,7 @@ msgstr "Nedaří se zapnout systemd službu <code>{name!s}</code>."
 
 #: src/modules/services-systemd/main.py:67
 msgid "Cannot enable systemd timer <code>{name!s}</code>."
-msgstr ""
+msgstr "Nedaří se zapnout systemd časovač <code>{name!s}</code>."
 
 #: src/modules/services-systemd/main.py:71
 msgid "Cannot disable systemd target <code>{name!s}</code>."
@@ -413,6 +413,8 @@ msgid ""
 "Failed to find unsquashfs, make sure you have the squashfs-tools package "
 "installed."
 msgstr ""
+"Nepodařilo se nalézt nástroj unsquashfs – ověřte, že je nainstalovaný "
+"balíček squashfs-tools."
 
 #: src/modules/unpackfs/main.py:479
 msgid "The destination \"{}\" in the target system is not a directory"
diff --git a/lang/python/en_GB/LC_MESSAGES/python.po b/lang/python/en_GB/LC_MESSAGES/python.po
index 34fcd2d7afd3e9c0097e50b7a86735fa1db9ee91..c2d93d0f89bfea2b3b56cbc0f27c28fa63d5dc90 100644
--- a/lang/python/en_GB/LC_MESSAGES/python.po
+++ b/lang/python/en_GB/LC_MESSAGES/python.po
@@ -5,6 +5,7 @@
 # 
 # Translators:
 # Jason Collins <JasonPCollins@protonmail.com>, 2018
+# Karthik Balan, 2021
 # 
 #, fuzzy
 msgid ""
@@ -13,7 +14,7 @@ msgstr ""
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2021-11-02 15:45+0100\n"
 "PO-Revision-Date: 2017-08-09 10:34+0000\n"
-"Last-Translator: Jason Collins <JasonPCollins@protonmail.com>, 2018\n"
+"Last-Translator: Karthik Balan, 2021\n"
 "Language-Team: English (United Kingdom) (https://www.transifex.com/calamares/teams/20061/en_GB/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -35,7 +36,7 @@ msgstr ""
 #: src/modules/luksopenswaphookcfg/main.py:86
 #: src/modules/luksopenswaphookcfg/main.py:90
 msgid "Configuration Error"
-msgstr ""
+msgstr "Configuration  Error "
 
 #: src/modules/initramfscfg/main.py:86 src/modules/fstab/main.py:356
 #: src/modules/initcpiocfg/main.py:228 src/modules/mount/main.py:145
@@ -61,7 +62,7 @@ msgstr ""
 
 #: src/modules/bootloader/main.py:508
 msgid "Bootloader installation error"
-msgstr ""
+msgstr "Bootloader installation error"
 
 #: src/modules/bootloader/main.py:509
 msgid ""
@@ -91,7 +92,7 @@ msgstr ""
 
 #: src/modules/displaymanager/main.py:526
 msgid "Cannot write KDM configuration file"
-msgstr ""
+msgstr "Cannot write KDM configuration file"
 
 #: src/modules/displaymanager/main.py:527
 msgid "KDM config file {!s} does not exist"
@@ -145,7 +146,7 @@ msgstr ""
 
 #: src/modules/services-openrc/main.py:29
 msgid "Configure OpenRC services"
-msgstr ""
+msgstr "Configure OpenRC services"
 
 #: src/modules/services-openrc/main.py:57
 msgid "Cannot add service {name!s} to run-level {level!s}."
@@ -173,7 +174,7 @@ msgstr ""
 
 #: src/modules/services-openrc/main.py:101
 msgid "Target runlevel does not exist"
-msgstr ""
+msgstr "Target runlevel does not exist"
 
 #: src/modules/services-openrc/main.py:102
 msgid ""
@@ -193,7 +194,7 @@ msgstr ""
 
 #: src/modules/networkcfg/main.py:29
 msgid "Saving network configuration."
-msgstr ""
+msgstr "Saving network configuration "
 
 #: src/modules/packages/main.py:50 src/modules/packages/main.py:59
 #: src/modules/packages/main.py:69
@@ -222,7 +223,7 @@ msgstr[1] "Removing %(num)d packages."
 #: src/modules/packages/main.py:638 src/modules/packages/main.py:650
 #: src/modules/packages/main.py:678
 msgid "Package Manager error"
-msgstr ""
+msgstr "Package Manager error"
 
 #: src/modules/packages/main.py:639
 msgid ""
diff --git a/lang/python/hi/LC_MESSAGES/python.po b/lang/python/hi/LC_MESSAGES/python.po
index c80f08842522459018b692a691f06ad88a24660c..00914664c848100a6b372e7bb66f9b2256d1b0b0 100644
--- a/lang/python/hi/LC_MESSAGES/python.po
+++ b/lang/python/hi/LC_MESSAGES/python.po
@@ -319,7 +319,7 @@ msgstr "systemd लक्ष्य <code>{name!s}</code>सक्रिय क
 
 #: src/modules/services-systemd/main.py:67
 msgid "Cannot enable systemd timer <code>{name!s}</code>."
-msgstr ""
+msgstr "systemd टाइमर <code>{name!s}</code>सक्रिय करना विफल।"
 
 #: src/modules/services-systemd/main.py:71
 msgid "Cannot disable systemd target <code>{name!s}</code>."
@@ -399,6 +399,8 @@ msgid ""
 "Failed to find unsquashfs, make sure you have the squashfs-tools package "
 "installed."
 msgstr ""
+"unsqaushfs खोजने में विफल, सुनिश्चित करें कि squashfs-tools पैकेज इंस्टॉल "
+"है।"
 
 #: src/modules/unpackfs/main.py:479
 msgid "The destination \"{}\" in the target system is not a directory"
diff --git a/lang/python/ja-Hira/LC_MESSAGES/python.po b/lang/python/ja-Hira/LC_MESSAGES/python.po
new file mode 100644
index 0000000000000000000000000000000000000000..9a869c5bcd743194113d95beda208e42f1285bc8
--- /dev/null
+++ b/lang/python/ja-Hira/LC_MESSAGES/python.po
@@ -0,0 +1,385 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-11-02 15:45+0100\n"
+"PO-Revision-Date: 2017-08-09 10:34+0000\n"
+"Language-Team: Japanese (Hiragana) (https://www.transifex.com/calamares/teams/20061/ja-Hira/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ja-Hira\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: src/modules/initramfscfg/main.py:32
+msgid "Configuring initramfs."
+msgstr ""
+
+#: src/modules/initramfscfg/main.py:85 src/modules/initramfscfg/main.py:89
+#: src/modules/fstab/main.py:355 src/modules/fstab/main.py:361
+#: src/modules/fstab/main.py:388 src/modules/networkcfg/main.py:105
+#: src/modules/initcpiocfg/main.py:227 src/modules/initcpiocfg/main.py:231
+#: src/modules/localecfg/main.py:135 src/modules/mount/main.py:144
+#: src/modules/rawfs/main.py:164 src/modules/openrcdmcryptcfg/main.py:72
+#: src/modules/openrcdmcryptcfg/main.py:76
+#: src/modules/luksopenswaphookcfg/main.py:86
+#: src/modules/luksopenswaphookcfg/main.py:90
+msgid "Configuration Error"
+msgstr ""
+
+#: src/modules/initramfscfg/main.py:86 src/modules/fstab/main.py:356
+#: src/modules/initcpiocfg/main.py:228 src/modules/mount/main.py:145
+#: src/modules/rawfs/main.py:165 src/modules/openrcdmcryptcfg/main.py:73
+#: src/modules/luksopenswaphookcfg/main.py:87
+msgid "No partitions are defined for <pre>{!s}</pre> to use."
+msgstr ""
+
+#: src/modules/initramfscfg/main.py:90 src/modules/fstab/main.py:362
+#: src/modules/networkcfg/main.py:106 src/modules/initcpiocfg/main.py:232
+#: src/modules/localecfg/main.py:136 src/modules/openrcdmcryptcfg/main.py:77
+#: src/modules/luksopenswaphookcfg/main.py:91
+msgid "No root mount point is given for <pre>{!s}</pre> to use."
+msgstr ""
+
+#: src/modules/grubcfg/main.py:28
+msgid "Configure GRUB."
+msgstr ""
+
+#: src/modules/bootloader/main.py:43
+msgid "Install bootloader."
+msgstr ""
+
+#: src/modules/bootloader/main.py:508
+msgid "Bootloader installation error"
+msgstr ""
+
+#: src/modules/bootloader/main.py:509
+msgid ""
+"The bootloader could not be installed. The installation command "
+"<pre>{!s}</pre> returned error code {!s}."
+msgstr ""
+
+#: src/modules/fstab/main.py:29
+msgid "Writing fstab."
+msgstr ""
+
+#: src/modules/fstab/main.py:389
+msgid "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use."
+msgstr ""
+
+#: src/modules/dracut/main.py:27
+msgid "Creating initramfs with dracut."
+msgstr ""
+
+#: src/modules/dracut/main.py:49
+msgid "Failed to run dracut on the target"
+msgstr ""
+
+#: src/modules/dracut/main.py:50 src/modules/mkinitfs/main.py:50
+msgid "The exit code was {}"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:526
+msgid "Cannot write KDM configuration file"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:527
+msgid "KDM config file {!s} does not exist"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:588
+msgid "Cannot write LXDM configuration file"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:589
+msgid "LXDM config file {!s} does not exist"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:672
+msgid "Cannot write LightDM configuration file"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:673
+msgid "LightDM config file {!s} does not exist"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:747
+msgid "Cannot configure LightDM"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:748
+msgid "No LightDM greeter installed."
+msgstr ""
+
+#: src/modules/displaymanager/main.py:779
+msgid "Cannot write SLIM configuration file"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:780
+msgid "SLIM config file {!s} does not exist"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:906
+msgid "No display managers selected for the displaymanager module."
+msgstr ""
+
+#: src/modules/displaymanager/main.py:907
+msgid ""
+"The displaymanagers list is empty or undefined in both globalstorage and "
+"displaymanager.conf."
+msgstr ""
+
+#: src/modules/displaymanager/main.py:989
+msgid "Display manager configuration was incomplete"
+msgstr ""
+
+#: src/modules/services-openrc/main.py:29
+msgid "Configure OpenRC services"
+msgstr ""
+
+#: src/modules/services-openrc/main.py:57
+msgid "Cannot add service {name!s} to run-level {level!s}."
+msgstr ""
+
+#: src/modules/services-openrc/main.py:59
+msgid "Cannot remove service {name!s} from run-level {level!s}."
+msgstr ""
+
+#: src/modules/services-openrc/main.py:61
+msgid ""
+"Unknown service-action <code>{arg!s}</code> for service {name!s} in run-"
+"level {level!s}."
+msgstr ""
+
+#: src/modules/services-openrc/main.py:93
+#: src/modules/services-systemd/main.py:59
+msgid "Cannot modify service"
+msgstr ""
+
+#: src/modules/services-openrc/main.py:94
+msgid ""
+"<code>rc-update {arg!s}</code> call in chroot returned error code {num!s}."
+msgstr ""
+
+#: src/modules/services-openrc/main.py:101
+msgid "Target runlevel does not exist"
+msgstr ""
+
+#: src/modules/services-openrc/main.py:102
+msgid ""
+"The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
+"exist."
+msgstr ""
+
+#: src/modules/services-openrc/main.py:110
+msgid "Target service does not exist"
+msgstr ""
+
+#: src/modules/services-openrc/main.py:111
+msgid ""
+"The path for service {name!s} is <code>{path!s}</code>, which does not "
+"exist."
+msgstr ""
+
+#: src/modules/networkcfg/main.py:29
+msgid "Saving network configuration."
+msgstr ""
+
+#: src/modules/packages/main.py:50 src/modules/packages/main.py:59
+#: src/modules/packages/main.py:69
+msgid "Install packages."
+msgstr ""
+
+#: src/modules/packages/main.py:57
+#, python-format
+msgid "Processing packages (%(count)d / %(total)d)"
+msgstr ""
+
+#: src/modules/packages/main.py:62
+#, python-format
+msgid "Installing one package."
+msgid_plural "Installing %(num)d packages."
+msgstr[0] ""
+
+#: src/modules/packages/main.py:65
+#, python-format
+msgid "Removing one package."
+msgid_plural "Removing %(num)d packages."
+msgstr[0] ""
+
+#: src/modules/packages/main.py:638 src/modules/packages/main.py:650
+#: src/modules/packages/main.py:678
+msgid "Package Manager error"
+msgstr ""
+
+#: src/modules/packages/main.py:639
+msgid ""
+"The package manager could not prepare updates. The command <pre>{!s}</pre> "
+"returned error code {!s}."
+msgstr ""
+
+#: src/modules/packages/main.py:651
+msgid ""
+"The package manager could not update the system. The command <pre>{!s}</pre>"
+" returned error code {!s}."
+msgstr ""
+
+#: src/modules/packages/main.py:679
+msgid ""
+"The package manager could not make changes to the installed system. The "
+"command <pre>{!s}</pre> returned error code {!s}."
+msgstr ""
+
+#: src/modules/plymouthcfg/main.py:27
+msgid "Configure Plymouth theme"
+msgstr ""
+
+#: src/modules/initcpiocfg/main.py:28
+msgid "Configuring mkinitcpio."
+msgstr ""
+
+#: src/modules/localecfg/main.py:30
+msgid "Configuring locales."
+msgstr ""
+
+#: src/modules/mount/main.py:30
+msgid "Mounting partitions."
+msgstr ""
+
+#: src/modules/rawfs/main.py:26
+msgid "Installing data."
+msgstr ""
+
+#: src/modules/dummypython/main.py:35
+msgid "Dummy python job."
+msgstr ""
+
+#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93
+#: src/modules/dummypython/main.py:94
+msgid "Dummy python step {}"
+msgstr ""
+
+#: src/modules/hwclock/main.py:26
+msgid "Setting hardware clock."
+msgstr ""
+
+#: src/modules/umount/main.py:31
+msgid "Unmount file systems."
+msgstr ""
+
+#: src/modules/openrcdmcryptcfg/main.py:26
+msgid "Configuring OpenRC dmcrypt service."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:26
+msgid "Configure systemd services"
+msgstr ""
+
+#: src/modules/services-systemd/main.py:60
+msgid ""
+"<code>systemctl {arg!s}</code> call in chroot returned error code {num!s}."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:63
+#: src/modules/services-systemd/main.py:69
+msgid "Cannot enable systemd service <code>{name!s}</code>."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:65
+msgid "Cannot enable systemd target <code>{name!s}</code>."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:67
+msgid "Cannot enable systemd timer <code>{name!s}</code>."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:71
+msgid "Cannot disable systemd target <code>{name!s}</code>."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:73
+msgid "Cannot mask systemd unit <code>{name!s}</code>."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:75
+msgid ""
+"Unknown systemd commands <code>{command!s}</code> and "
+"<code>{suffix!s}</code> for unit {name!s}."
+msgstr ""
+
+#: src/modules/mkinitfs/main.py:27
+msgid "Creating initramfs with mkinitfs."
+msgstr ""
+
+#: src/modules/mkinitfs/main.py:49
+msgid "Failed to run mkinitfs on the target"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:34
+msgid "Filling up filesystems."
+msgstr ""
+
+#: src/modules/unpackfs/main.py:254
+msgid "rsync failed with error code {}."
+msgstr ""
+
+#: src/modules/unpackfs/main.py:299
+msgid "Unpacking image {}/{}, file {}/{}"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:314
+msgid "Starting to unpack {}"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:465
+msgid "Failed to unpack image \"{}\""
+msgstr ""
+
+#: src/modules/unpackfs/main.py:430
+msgid "No mount point for root partition"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:431
+msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:436
+msgid "Bad mount point for root partition"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:437
+msgid "rootMountPoint is \"{}\", which does not exist, doing nothing"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:453 src/modules/unpackfs/main.py:457
+#: src/modules/unpackfs/main.py:463 src/modules/unpackfs/main.py:478
+msgid "Bad unsquash configuration"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:454
+msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:458
+msgid "The source filesystem \"{}\" does not exist"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:464
+msgid ""
+"Failed to find unsquashfs, make sure you have the squashfs-tools package "
+"installed."
+msgstr ""
+
+#: src/modules/unpackfs/main.py:479
+msgid "The destination \"{}\" in the target system is not a directory"
+msgstr ""
+
+#: src/modules/luksopenswaphookcfg/main.py:26
+msgid "Configuring encrypted swap."
+msgstr ""
diff --git a/lang/python/pl/LC_MESSAGES/python.po b/lang/python/pl/LC_MESSAGES/python.po
index ea9756e2bdb02a0509135a54f372dc72b34c179d..7d4100a03ac6a9a179178a5d6a1befca93fd67b1 100644
--- a/lang/python/pl/LC_MESSAGES/python.po
+++ b/lang/python/pl/LC_MESSAGES/python.po
@@ -4,7 +4,7 @@
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 # 
 # Translators:
-# Marcin Mikołajczak <me@mkljczk.pl>, 2017
+# marcin mikołajczak <me@mkljczk.pl>, 2017
 # KagiSame, 2018
 # Piotr Strębski <strebski@gmail.com>, 2020
 # Jacob B. <brickminerplyt@gmail.com>, 2021
diff --git a/lang/python/ro/LC_MESSAGES/python.po b/lang/python/ro/LC_MESSAGES/python.po
index ab6e35e7fffd93929ffda43903e13d7aebe56b95..91be0dd5afbf91b42c06f24066bcd03960b87ec6 100644
--- a/lang/python/ro/LC_MESSAGES/python.po
+++ b/lang/python/ro/LC_MESSAGES/python.po
@@ -6,6 +6,7 @@
 # Translators:
 # Jobava Jobava <jobaval10n@gmail.com>, 2018
 # Sebastian Brici <bricisebastian@gmail.com>, 2018
+# Chele Ion <krovyoll@gmail.com>, 2021
 # 
 #, fuzzy
 msgid ""
@@ -14,7 +15,7 @@ msgstr ""
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2021-11-02 15:45+0100\n"
 "PO-Revision-Date: 2017-08-09 10:34+0000\n"
-"Last-Translator: Sebastian Brici <bricisebastian@gmail.com>, 2018\n"
+"Last-Translator: Chele Ion <krovyoll@gmail.com>, 2021\n"
 "Language-Team: Romanian (https://www.transifex.com/calamares/teams/20061/ro/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -24,7 +25,7 @@ msgstr ""
 
 #: src/modules/initramfscfg/main.py:32
 msgid "Configuring initramfs."
-msgstr ""
+msgstr "Configurare initramfs"
 
 #: src/modules/initramfscfg/main.py:85 src/modules/initramfscfg/main.py:89
 #: src/modules/fstab/main.py:355 src/modules/fstab/main.py:361
@@ -36,21 +37,21 @@ msgstr ""
 #: src/modules/luksopenswaphookcfg/main.py:86
 #: src/modules/luksopenswaphookcfg/main.py:90
 msgid "Configuration Error"
-msgstr ""
+msgstr "Eroare de configurare"
 
 #: src/modules/initramfscfg/main.py:86 src/modules/fstab/main.py:356
 #: src/modules/initcpiocfg/main.py:228 src/modules/mount/main.py:145
 #: src/modules/rawfs/main.py:165 src/modules/openrcdmcryptcfg/main.py:73
 #: src/modules/luksopenswaphookcfg/main.py:87
 msgid "No partitions are defined for <pre>{!s}</pre> to use."
-msgstr ""
+msgstr "Nu sunt partiţii  definite ca  1{!s}1 ."
 
 #: src/modules/initramfscfg/main.py:90 src/modules/fstab/main.py:362
 #: src/modules/networkcfg/main.py:106 src/modules/initcpiocfg/main.py:232
 #: src/modules/localecfg/main.py:136 src/modules/openrcdmcryptcfg/main.py:77
 #: src/modules/luksopenswaphookcfg/main.py:91
 msgid "No root mount point is given for <pre>{!s}</pre> to use."
-msgstr ""
+msgstr "Nu este definită o partiţie rădăcină pentru 1{!s}1 ."
 
 #: src/modules/grubcfg/main.py:28
 msgid "Configure GRUB."
diff --git a/lang/python/ta_IN/LC_MESSAGES/python.po b/lang/python/ta_IN/LC_MESSAGES/python.po
new file mode 100644
index 0000000000000000000000000000000000000000..666703fafc63da1fa80e56cc423c9c394bff48b7
--- /dev/null
+++ b/lang/python/ta_IN/LC_MESSAGES/python.po
@@ -0,0 +1,387 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-11-02 15:45+0100\n"
+"PO-Revision-Date: 2017-08-09 10:34+0000\n"
+"Language-Team: Tamil (India) (https://www.transifex.com/calamares/teams/20061/ta_IN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ta_IN\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/modules/initramfscfg/main.py:32
+msgid "Configuring initramfs."
+msgstr ""
+
+#: src/modules/initramfscfg/main.py:85 src/modules/initramfscfg/main.py:89
+#: src/modules/fstab/main.py:355 src/modules/fstab/main.py:361
+#: src/modules/fstab/main.py:388 src/modules/networkcfg/main.py:105
+#: src/modules/initcpiocfg/main.py:227 src/modules/initcpiocfg/main.py:231
+#: src/modules/localecfg/main.py:135 src/modules/mount/main.py:144
+#: src/modules/rawfs/main.py:164 src/modules/openrcdmcryptcfg/main.py:72
+#: src/modules/openrcdmcryptcfg/main.py:76
+#: src/modules/luksopenswaphookcfg/main.py:86
+#: src/modules/luksopenswaphookcfg/main.py:90
+msgid "Configuration Error"
+msgstr ""
+
+#: src/modules/initramfscfg/main.py:86 src/modules/fstab/main.py:356
+#: src/modules/initcpiocfg/main.py:228 src/modules/mount/main.py:145
+#: src/modules/rawfs/main.py:165 src/modules/openrcdmcryptcfg/main.py:73
+#: src/modules/luksopenswaphookcfg/main.py:87
+msgid "No partitions are defined for <pre>{!s}</pre> to use."
+msgstr ""
+
+#: src/modules/initramfscfg/main.py:90 src/modules/fstab/main.py:362
+#: src/modules/networkcfg/main.py:106 src/modules/initcpiocfg/main.py:232
+#: src/modules/localecfg/main.py:136 src/modules/openrcdmcryptcfg/main.py:77
+#: src/modules/luksopenswaphookcfg/main.py:91
+msgid "No root mount point is given for <pre>{!s}</pre> to use."
+msgstr ""
+
+#: src/modules/grubcfg/main.py:28
+msgid "Configure GRUB."
+msgstr ""
+
+#: src/modules/bootloader/main.py:43
+msgid "Install bootloader."
+msgstr ""
+
+#: src/modules/bootloader/main.py:508
+msgid "Bootloader installation error"
+msgstr ""
+
+#: src/modules/bootloader/main.py:509
+msgid ""
+"The bootloader could not be installed. The installation command "
+"<pre>{!s}</pre> returned error code {!s}."
+msgstr ""
+
+#: src/modules/fstab/main.py:29
+msgid "Writing fstab."
+msgstr ""
+
+#: src/modules/fstab/main.py:389
+msgid "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use."
+msgstr ""
+
+#: src/modules/dracut/main.py:27
+msgid "Creating initramfs with dracut."
+msgstr ""
+
+#: src/modules/dracut/main.py:49
+msgid "Failed to run dracut on the target"
+msgstr ""
+
+#: src/modules/dracut/main.py:50 src/modules/mkinitfs/main.py:50
+msgid "The exit code was {}"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:526
+msgid "Cannot write KDM configuration file"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:527
+msgid "KDM config file {!s} does not exist"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:588
+msgid "Cannot write LXDM configuration file"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:589
+msgid "LXDM config file {!s} does not exist"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:672
+msgid "Cannot write LightDM configuration file"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:673
+msgid "LightDM config file {!s} does not exist"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:747
+msgid "Cannot configure LightDM"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:748
+msgid "No LightDM greeter installed."
+msgstr ""
+
+#: src/modules/displaymanager/main.py:779
+msgid "Cannot write SLIM configuration file"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:780
+msgid "SLIM config file {!s} does not exist"
+msgstr ""
+
+#: src/modules/displaymanager/main.py:906
+msgid "No display managers selected for the displaymanager module."
+msgstr ""
+
+#: src/modules/displaymanager/main.py:907
+msgid ""
+"The displaymanagers list is empty or undefined in both globalstorage and "
+"displaymanager.conf."
+msgstr ""
+
+#: src/modules/displaymanager/main.py:989
+msgid "Display manager configuration was incomplete"
+msgstr ""
+
+#: src/modules/services-openrc/main.py:29
+msgid "Configure OpenRC services"
+msgstr ""
+
+#: src/modules/services-openrc/main.py:57
+msgid "Cannot add service {name!s} to run-level {level!s}."
+msgstr ""
+
+#: src/modules/services-openrc/main.py:59
+msgid "Cannot remove service {name!s} from run-level {level!s}."
+msgstr ""
+
+#: src/modules/services-openrc/main.py:61
+msgid ""
+"Unknown service-action <code>{arg!s}</code> for service {name!s} in run-"
+"level {level!s}."
+msgstr ""
+
+#: src/modules/services-openrc/main.py:93
+#: src/modules/services-systemd/main.py:59
+msgid "Cannot modify service"
+msgstr ""
+
+#: src/modules/services-openrc/main.py:94
+msgid ""
+"<code>rc-update {arg!s}</code> call in chroot returned error code {num!s}."
+msgstr ""
+
+#: src/modules/services-openrc/main.py:101
+msgid "Target runlevel does not exist"
+msgstr ""
+
+#: src/modules/services-openrc/main.py:102
+msgid ""
+"The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
+"exist."
+msgstr ""
+
+#: src/modules/services-openrc/main.py:110
+msgid "Target service does not exist"
+msgstr ""
+
+#: src/modules/services-openrc/main.py:111
+msgid ""
+"The path for service {name!s} is <code>{path!s}</code>, which does not "
+"exist."
+msgstr ""
+
+#: src/modules/networkcfg/main.py:29
+msgid "Saving network configuration."
+msgstr ""
+
+#: src/modules/packages/main.py:50 src/modules/packages/main.py:59
+#: src/modules/packages/main.py:69
+msgid "Install packages."
+msgstr ""
+
+#: src/modules/packages/main.py:57
+#, python-format
+msgid "Processing packages (%(count)d / %(total)d)"
+msgstr ""
+
+#: src/modules/packages/main.py:62
+#, python-format
+msgid "Installing one package."
+msgid_plural "Installing %(num)d packages."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/modules/packages/main.py:65
+#, python-format
+msgid "Removing one package."
+msgid_plural "Removing %(num)d packages."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/modules/packages/main.py:638 src/modules/packages/main.py:650
+#: src/modules/packages/main.py:678
+msgid "Package Manager error"
+msgstr ""
+
+#: src/modules/packages/main.py:639
+msgid ""
+"The package manager could not prepare updates. The command <pre>{!s}</pre> "
+"returned error code {!s}."
+msgstr ""
+
+#: src/modules/packages/main.py:651
+msgid ""
+"The package manager could not update the system. The command <pre>{!s}</pre>"
+" returned error code {!s}."
+msgstr ""
+
+#: src/modules/packages/main.py:679
+msgid ""
+"The package manager could not make changes to the installed system. The "
+"command <pre>{!s}</pre> returned error code {!s}."
+msgstr ""
+
+#: src/modules/plymouthcfg/main.py:27
+msgid "Configure Plymouth theme"
+msgstr ""
+
+#: src/modules/initcpiocfg/main.py:28
+msgid "Configuring mkinitcpio."
+msgstr ""
+
+#: src/modules/localecfg/main.py:30
+msgid "Configuring locales."
+msgstr ""
+
+#: src/modules/mount/main.py:30
+msgid "Mounting partitions."
+msgstr ""
+
+#: src/modules/rawfs/main.py:26
+msgid "Installing data."
+msgstr ""
+
+#: src/modules/dummypython/main.py:35
+msgid "Dummy python job."
+msgstr ""
+
+#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93
+#: src/modules/dummypython/main.py:94
+msgid "Dummy python step {}"
+msgstr ""
+
+#: src/modules/hwclock/main.py:26
+msgid "Setting hardware clock."
+msgstr ""
+
+#: src/modules/umount/main.py:31
+msgid "Unmount file systems."
+msgstr ""
+
+#: src/modules/openrcdmcryptcfg/main.py:26
+msgid "Configuring OpenRC dmcrypt service."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:26
+msgid "Configure systemd services"
+msgstr ""
+
+#: src/modules/services-systemd/main.py:60
+msgid ""
+"<code>systemctl {arg!s}</code> call in chroot returned error code {num!s}."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:63
+#: src/modules/services-systemd/main.py:69
+msgid "Cannot enable systemd service <code>{name!s}</code>."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:65
+msgid "Cannot enable systemd target <code>{name!s}</code>."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:67
+msgid "Cannot enable systemd timer <code>{name!s}</code>."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:71
+msgid "Cannot disable systemd target <code>{name!s}</code>."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:73
+msgid "Cannot mask systemd unit <code>{name!s}</code>."
+msgstr ""
+
+#: src/modules/services-systemd/main.py:75
+msgid ""
+"Unknown systemd commands <code>{command!s}</code> and "
+"<code>{suffix!s}</code> for unit {name!s}."
+msgstr ""
+
+#: src/modules/mkinitfs/main.py:27
+msgid "Creating initramfs with mkinitfs."
+msgstr ""
+
+#: src/modules/mkinitfs/main.py:49
+msgid "Failed to run mkinitfs on the target"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:34
+msgid "Filling up filesystems."
+msgstr ""
+
+#: src/modules/unpackfs/main.py:254
+msgid "rsync failed with error code {}."
+msgstr ""
+
+#: src/modules/unpackfs/main.py:299
+msgid "Unpacking image {}/{}, file {}/{}"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:314
+msgid "Starting to unpack {}"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:465
+msgid "Failed to unpack image \"{}\""
+msgstr ""
+
+#: src/modules/unpackfs/main.py:430
+msgid "No mount point for root partition"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:431
+msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:436
+msgid "Bad mount point for root partition"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:437
+msgid "rootMountPoint is \"{}\", which does not exist, doing nothing"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:453 src/modules/unpackfs/main.py:457
+#: src/modules/unpackfs/main.py:463 src/modules/unpackfs/main.py:478
+msgid "Bad unsquash configuration"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:454
+msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:458
+msgid "The source filesystem \"{}\" does not exist"
+msgstr ""
+
+#: src/modules/unpackfs/main.py:464
+msgid ""
+"Failed to find unsquashfs, make sure you have the squashfs-tools package "
+"installed."
+msgstr ""
+
+#: src/modules/unpackfs/main.py:479
+msgid "The destination \"{}\" in the target system is not a directory"
+msgstr ""
+
+#: src/modules/luksopenswaphookcfg/main.py:26
+msgid "Configuring encrypted swap."
+msgstr ""
diff --git a/lang/python/vi/LC_MESSAGES/python.po b/lang/python/vi/LC_MESSAGES/python.po
index 900b9945479216745e06c47c2530179fe45f2f97..8948806ae4e01932296943bb6286b92f555dd4c4 100644
--- a/lang/python/vi/LC_MESSAGES/python.po
+++ b/lang/python/vi/LC_MESSAGES/python.po
@@ -5,7 +5,7 @@
 # 
 # Translators:
 # T. Tran <transifex@emiu.net>, 2020
-# Th1nhhdk, 2021
+# th1nhhdk <th1nhhdk@tutanota.com>, 2021
 # 
 #, fuzzy
 msgid ""
@@ -14,7 +14,7 @@ msgstr ""
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2021-11-02 15:45+0100\n"
 "PO-Revision-Date: 2017-08-09 10:34+0000\n"
-"Last-Translator: Th1nhhdk, 2021\n"
+"Last-Translator: th1nhhdk <th1nhhdk@tutanota.com>, 2021\n"
 "Language-Team: Vietnamese (https://www.transifex.com/calamares/teams/20061/vi/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
diff --git a/lang/python/zh_CN/LC_MESSAGES/python.po b/lang/python/zh_CN/LC_MESSAGES/python.po
index 706b02d24419f78f524381fd48502ac60f1e3b12..c6972b0f5cf3845ae9981d9ea43bf08966178c5c 100644
--- a/lang/python/zh_CN/LC_MESSAGES/python.po
+++ b/lang/python/zh_CN/LC_MESSAGES/python.po
@@ -9,6 +9,7 @@
 # Feng Chao <chaofeng111@qq.com>, 2020
 # Bobby Rong <admin@bobby285271.top>, 2020
 # 玉堂白鹤 <yjwork@qq.com>, 2021
+# Giovanni Schiano-Moriello, 2022
 # 
 #, fuzzy
 msgid ""
@@ -17,7 +18,7 @@ msgstr ""
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2021-11-02 15:45+0100\n"
 "PO-Revision-Date: 2017-08-09 10:34+0000\n"
-"Last-Translator: 玉堂白鹤 <yjwork@qq.com>, 2021\n"
+"Last-Translator: Giovanni Schiano-Moriello, 2022\n"
 "Language-Team: Chinese (China) (https://www.transifex.com/calamares/teams/20061/zh_CN/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -305,7 +306,7 @@ msgstr "无法启用 systemd 目标 <code>{name!s}</code>."
 
 #: src/modules/services-systemd/main.py:67
 msgid "Cannot enable systemd timer <code>{name!s}</code>."
-msgstr ""
+msgstr "无法启用 systemd 计时器 <code>{name!s}</code>。"
 
 #: src/modules/services-systemd/main.py:71
 msgid "Cannot disable systemd target <code>{name!s}</code>."
@@ -384,7 +385,7 @@ msgstr "源文件系统 \"{}\" 不存在"
 msgid ""
 "Failed to find unsquashfs, make sure you have the squashfs-tools package "
 "installed."
-msgstr ""
+msgstr "寻找 unsquashfs 失败,请确定您已安装 squashfs-tools 软体包。"
 
 #: src/modules/unpackfs/main.py:479
 msgid "The destination \"{}\" in the target system is not a directory"
diff --git a/src/calamares/testmain.cpp b/src/calamares/testmain.cpp
index 9d018903154cc2316601f8facc8b2fdf148328fe..ecbf77888360ea79bbecd1db612238047909072c 100644
--- a/src/calamares/testmain.cpp
+++ b/src/calamares/testmain.cpp
@@ -485,7 +485,7 @@ main( int argc, char* argv[] )
         return 1;
     }
 
-    cDebug() << Logger::SubEntry << " .. got" << m->name() << m->typeString() << m->interfaceString();
+    cDebug() << Logger::SubEntry << "got" << m->name() << m->typeString() << m->interfaceString();
     if ( m->type() == Calamares::Module::Type::View )
     {
         // If we forgot the --ui, any ViewModule will core dump as it
@@ -535,7 +535,7 @@ main( int argc, char* argv[] )
 
     using TR = Logger::DebugRow< const char*, const QString >;
 
-    cDebug() << "Module metadata" << TR( "name", m->name() ) << TR( "type", m->typeString() )
+    cDebug() << Logger::SubEntry << "Module metadata" << TR( "name", m->name() ) << TR( "type", m->typeString() )
              << TR( "interface", m->interfaceString() );
 
     Calamares::JobList jobList = m->jobs();
@@ -543,6 +543,8 @@ main( int argc, char* argv[] )
     unsigned int count = 1;
     for ( const auto& p : jobList )
     {
+        // This doesn't get a SubEntry because the jobs may log a bunch of
+        // things; print the function-header to make clear that we're back in main.
         cDebug() << "Job #" << count << "name" << p->prettyName();
         Calamares::JobResult r = p->exec();
         if ( !r )
diff --git a/src/libcalamares/Job.h b/src/libcalamares/Job.h
index 33965e15f43546fa6ceaa6d55258d40d6d8d96f4..dc89f1c495a607383f38c0cccc06ce027adf627e 100644
--- a/src/libcalamares/Job.h
+++ b/src/libcalamares/Job.h
@@ -47,7 +47,7 @@ public:
 
     /** @brief Is this JobResult a success?
      *
-     * Equivalent to errorCode() == 0, might be named  isValid().
+     * Equivalent to errorCode() == 0, see succeeded().
      */
     virtual operator bool() const;
 
@@ -58,6 +58,11 @@ public:
     virtual void setDetails( const QString& details );
 
     int errorCode() const { return m_number; }
+    /** @brief Is this JobResult a success?
+     *
+     * Equivalent to errorCode() == 0.
+     */
+    bool succeeded() const { return this->operator bool(); }
 
     /// @brief an "ok status" result
     static JobResult ok();
diff --git a/src/libcalamares/JobQueue.cpp b/src/libcalamares/JobQueue.cpp
index 039a28e2646d046e79071dd97d01c2d5f4c271d0..d7078c6d25b11e8009ab946f454aae3596591da8 100644
--- a/src/libcalamares/JobQueue.cpp
+++ b/src/libcalamares/JobQueue.cpp
@@ -122,8 +122,9 @@ public:
             }
             else
             {
-                cDebug() << o << "Starting" << ( failureEncountered ? "EMERGENCY JOB" : "job" ) << jobitem.job->prettyName()
-                         << '(' << ( m_jobIndex + 1 ) << '/' << m_runningJobs->count() << ')';
+                cDebug() << o << "Starting" << ( failureEncountered ? "EMERGENCY JOB" : "job" )
+                         << jobitem.job->prettyName() << '(' << ( m_jobIndex + 1 ) << '/' << m_runningJobs->count()
+                         << ')';
                 o.refresh();  // So next time it shows the function header again
                 emitProgress( 0.0 );  // 0% for *this job*
                 connect( jobitem.job.data(), &Job::progress, this, &JobThread::emitProgress );
diff --git a/src/libcalamares/PythonHelper.cpp b/src/libcalamares/PythonHelper.cpp
index d6e61b3aa820f21c1d57bdf45f74e917c7c91ec8..ca004ab5fd0b2ee256c7352028fc357a18295168 100644
--- a/src/libcalamares/PythonHelper.cpp
+++ b/src/libcalamares/PythonHelper.cpp
@@ -26,6 +26,11 @@ namespace CalamaresPython
 boost::python::object
 variantToPyObject( const QVariant& variant )
 {
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wswitch-enum"
+#endif
+    // 49 enumeration values not handled
     switch ( variant.type() )
     {
     case QVariant::Map:
@@ -62,6 +67,9 @@ variantToPyObject( const QVariant& variant )
     default:
         return bp::object();
     }
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
 }
 
 
diff --git a/src/libcalamares/PythonJob.cpp b/src/libcalamares/PythonJob.cpp
index 291adbc54cc71e66857864cf02216282abe6fc86..ec17c31f3e78e82a3e034e045f390553482e6639 100644
--- a/src/libcalamares/PythonJob.cpp
+++ b/src/libcalamares/PythonJob.cpp
@@ -23,6 +23,11 @@ static const char* s_preScript = nullptr;
 
 namespace bp = boost::python;
 
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdisabled-macro-expansion"
+#endif
+
 BOOST_PYTHON_FUNCTION_OVERLOADS( mount_overloads, CalamaresPython::mount, 2, 4 );
 BOOST_PYTHON_FUNCTION_OVERLOADS( target_env_call_str_overloads, CalamaresPython::target_env_call, 1, 3 );
 BOOST_PYTHON_FUNCTION_OVERLOADS( target_env_call_list_overloads, CalamaresPython::target_env_call, 1, 3 );
@@ -42,6 +47,10 @@ BOOST_PYTHON_FUNCTION_OVERLOADS( target_env_process_output_overloads,
                                  4 );
 BOOST_PYTHON_FUNCTION_OVERLOADS( host_env_process_output_overloads, CalamaresPython::host_env_process_output, 1, 4 );
 
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
 BOOST_PYTHON_MODULE( libcalamares )
 {
     bp::object package = bp::scope();
@@ -91,7 +100,7 @@ BOOST_PYTHON_MODULE( libcalamares )
              bp::args( "s" ),
              "Writes the given string to the Calamares warning stream." );
     bp::def(
-        "error", &CalamaresPython::warning, bp::args( "s" ), "Writes the given string to the Calamares error stream." );
+        "error", &CalamaresPython::error, bp::args( "s" ), "Writes the given string to the Calamares error stream." );
 
 
     // .. YAML functions
diff --git a/src/libcalamares/partition/FileSystem.cpp b/src/libcalamares/partition/FileSystem.cpp
index ad4df31edfb7845a1e06fc06e87f08f866e5b836..0dcd6fd32133e7ec45de43885938b63106ebf022 100644
--- a/src/libcalamares/partition/FileSystem.cpp
+++ b/src/libcalamares/partition/FileSystem.cpp
@@ -22,6 +22,11 @@ namespace Partition
 QString
 prettyNameForFileSystemType( FileSystem::Type t )
 {
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wswitch-enum"
+#endif
+    // 13 enumeration values not handled
     switch ( t )
     {
     case FileSystem::Unknown:
@@ -60,11 +65,19 @@ prettyNameForFileSystemType( FileSystem::Type t )
     default:
         return FileSystem::nameForType( t );
     }
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
 }
 
 QString
 untranslatedFS( FileSystem::Type t )
 {
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wswitch-enum"
+#endif
+    // 34 enumeration values not handled
     switch ( t )
     {
     case FileSystem::Type::ReiserFS:
@@ -72,6 +85,9 @@ untranslatedFS( FileSystem::Type t )
     default:
         return FileSystem::nameForType( t, { QStringLiteral( "C" ) } );
     }
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
 }
 
 }  // namespace Partition
diff --git a/src/libcalamares/partition/Mount.cpp b/src/libcalamares/partition/Mount.cpp
index 89e17a885ba49ccee2dbc1f07d41c5687d3dbf7a..6bc3a7cd2ffb3c21fd6a8c2754f1083d37141252 100644
--- a/src/libcalamares/partition/Mount.cpp
+++ b/src/libcalamares/partition/Mount.cpp
@@ -14,6 +14,7 @@
 #include "partition/Sync.h"
 #include "utils/CalamaresUtilsSystem.h"
 #include "utils/Logger.h"
+#include "utils/String.h"
 
 #include <QDir>
 #include <QTemporaryDir>
@@ -92,7 +93,7 @@ struct TemporaryMount::Private
 
 
 TemporaryMount::TemporaryMount( const QString& devicePath, const QString& filesystemName, const QString& options )
-    : m_d( std::make_unique<Private>() )
+    : m_d( std::make_unique< Private >() )
 {
     m_d->m_devicePath = devicePath;
     m_d->m_mountDir.setAutoRemove( false );
@@ -123,5 +124,32 @@ TemporaryMount::path() const
     return m_d ? m_d->m_mountDir.path() : QString();
 }
 
+QList< MtabInfo >
+MtabInfo::fromMtabFilteredByPrefix( const QString& mountPrefix, const QString& mtabPath )
+{
+    QFile f( mtabPath.isEmpty() ? "/etc/mtab" : mtabPath );
+    if ( !f.open( QIODevice::ReadOnly ) )
+    {
+        return {};
+    }
+
+    QTextStream in( &f );
+    QList< MtabInfo > l;
+    while ( !f.atEnd() )
+    {
+        QStringList line = in.readLine().split( ' ', SplitSkipEmptyParts );
+        if ( line.length() == 3 && !line[ 0 ].startsWith( '#' ) )
+        {
+            // Lines have format: <device> <mountpoint> <options>, so check
+            // the mountpoint field. Everything starts with an empty string.
+            if ( line[ 1 ].startsWith( mountPrefix ) )
+            {
+                l.append( { line[ 0 ], line[ 1 ] } );
+            }
+        }
+    }
+    return l;
+}
+
 }  // namespace Partition
 }  // namespace CalamaresUtils
diff --git a/src/libcalamares/partition/Mount.h b/src/libcalamares/partition/Mount.h
index d088b108fcc127595d2aa5b41fd8795011ec2d8f..f772c33a4c18ada76dcfac96e1fabff6356c6559 100644
--- a/src/libcalamares/partition/Mount.h
+++ b/src/libcalamares/partition/Mount.h
@@ -14,6 +14,7 @@
 
 #include "DllMacro.h"
 
+#include <QList>
 #include <QString>
 #include <QStringList>
 
@@ -50,6 +51,13 @@ DLLEXPORT int mount( const QString& devicePath,
  */
 DLLEXPORT int unmount( const QString& path, const QStringList& options = QStringList() );
 
+
+/** @brief Mount and automatically unmount a device
+ *
+ * The TemporaryMount object mounts a filesystem, and is like calling
+ * the mount() function, above. When the object is destroyed, unmount()
+ * is called with suitable options to undo the original mount.
+ */
 class DLLEXPORT TemporaryMount
 {
 public:
@@ -68,6 +76,36 @@ private:
     std::unique_ptr< Private > m_d;
 };
 
+
+/** @brief Information about a mount point from /etc/mtab
+ *
+ * Entries in /etc/mtab are of the form: <device> <mountpoint> <other>
+ * This struct only stores device and mountpoint.
+ *
+ * The main way of getting these structs is to call fromMtab() to read
+ * an /etc/mtab-like file and storing all of the entries from it.
+ */
+struct DLLEXPORT MtabInfo
+{
+    QString device;
+    QString mountPoint;
+
+    /** @brief Reads an mtab-like file and returns the entries from it
+     *
+     * When @p mtabPath is given, that file is read. If the given name is
+     * empty (e.g. the default) then /etc/mtab is read, instead.
+     *
+     * If @p mountPrefix is given, then only entries that have a mount point
+     * that starts with that prefix are returned.
+     */
+    static QList< MtabInfo > fromMtabFilteredByPrefix( const QString& mountPrefix = QString(),
+                                                       const QString& mtabPath = QString() );
+    /// @brief Predicate to sort MtabInfo objects by device-name
+    static bool deviceOrder( const MtabInfo& a, const MtabInfo& b ) { return a.device > b.device; }
+    /// @brief Predicate to sort MtabInfo objects by mount-point
+    static bool mountPointOrder( const MtabInfo& a, const MtabInfo& b ) { return a.mountPoint > b.mountPoint; }
+};
+
 }  // namespace Partition
 }  // namespace CalamaresUtils
 
diff --git a/src/libcalamares/utils/CalamaresUtilsSystem.cpp b/src/libcalamares/utils/CalamaresUtilsSystem.cpp
index b290b62c58e8a926a029c4ba14281561252fdea7..9a4ba990f393d7e1b42579f9497ad5d3a2c1c299 100644
--- a/src/libcalamares/utils/CalamaresUtilsSystem.cpp
+++ b/src/libcalamares/utils/CalamaresUtilsSystem.cpp
@@ -115,12 +115,14 @@ System::createTargetFile( const QString& path, const QByteArray& contents, Write
     QString completePath = targetPath( path );
     if ( completePath.isEmpty() )
     {
+        cWarning() << "No target path for" << path;
         return CreationResult( CreationResult::Code::Invalid );
     }
 
     QFile f( completePath );
     if ( ( mode == WriteMode::KeepExisting ) && f.exists() )
     {
+        cWarning() << "Target file" << completePath << "already exists";
         return CreationResult( CreationResult::Code::AlreadyExists );
     }
 
@@ -133,13 +135,16 @@ System::createTargetFile( const QString& path, const QByteArray& contents, Write
 
     if ( !f.open( m ) )
     {
+        cWarning() << "Could not open target file" << completePath;
         return CreationResult( CreationResult::Code::Failed );
     }
 
-    if ( f.write( contents ) != contents.size() )
+    auto written = f.write( contents );
+    if ( written != contents.size() )
     {
         f.close();
         f.remove();
+        cWarning() << "Short write (" << written << "out of" << contents.size() << "bytes) to" << completePath;
         return CreationResult( CreationResult::Code::Failed );
     }
 
@@ -147,6 +152,30 @@ System::createTargetFile( const QString& path, const QByteArray& contents, Write
     return CreationResult( QFileInfo( f ).canonicalFilePath() );
 }
 
+QStringList
+System::readTargetFile( const QString& path ) const
+{
+    const QString completePath = targetPath( path );
+    if ( completePath.isEmpty() )
+    {
+        return QStringList();
+    }
+
+    QFile f( completePath );
+    if ( !f.open( QIODevice::ReadOnly ) )
+    {
+        return QStringList();
+    }
+
+    QTextStream in( &f );
+    QStringList l;
+    while ( !f.atEnd() )
+    {
+        l << in.readLine();
+    }
+    return l;
+}
+
 void
 System::removeTargetFile( const QString& path ) const
 {
diff --git a/src/libcalamares/utils/CalamaresUtilsSystem.h b/src/libcalamares/utils/CalamaresUtilsSystem.h
index e11ecae051c1f3bd25ef8e08bb294c3556c540fa..1bb5629d1f90ed6a031b98cdf728e26e8aa1483a 100644
--- a/src/libcalamares/utils/CalamaresUtilsSystem.h
+++ b/src/libcalamares/utils/CalamaresUtilsSystem.h
@@ -287,6 +287,24 @@ public:
      */
     DLLEXPORT void removeTargetFile( const QString& path ) const;
 
+    /** @brief Reads a file from the target system.
+     *
+     * @param path Path to the file; this is interpreted from the root of
+     *      the target system (@see targetPath()).
+     *
+     * Does no error checking, and returns an empty list if the file does
+     * not exist.
+     *
+     * NOTE: This function is now basically the same as QFile::readAll(),
+     *       splitting into lines, but Calamares may need to change
+     *       permissions or raise privileges to actually read the file,
+     *       which is why there is an API.
+     *
+     * NOTE: Since this buffers the whole file in memory, reading big files
+     *       is not recommended.
+     */
+    DLLEXPORT QStringList readTargetFile( const QString& path ) const;
+
     /** @brief Ensure that the directory @p path exists
      *
      * @param path a full pathname to a desired directory.
diff --git a/src/libcalamares/utils/Logger.cpp b/src/libcalamares/utils/Logger.cpp
index d35d6891b634ca532a06fac4c34c8644dd1f4ac5..adb0826875f02fa346c9c6a6f2dab40782dd7480 100644
--- a/src/libcalamares/utils/Logger.cpp
+++ b/src/libcalamares/utils/Logger.cpp
@@ -259,21 +259,22 @@ operator<<( QDebug& s, const RedactedCommand& l )
  * Identical strings with the same context will be hashed the same,
  * so that they can be logged and still recognized as the-same.
  */
-static uint insertRedactedName( const QString& context, const QString& s )
+static uint
+insertRedactedName( const QString& context, const QString& s )
 {
     static uint salt = QRandomGenerator::global()->generate();  // Just once
 
-    uint val = qHash(context, salt);
-    return qHash(s, val);
+    uint val = qHash( context, salt );
+    return qHash( s, val );
 }
 
 RedactedName::RedactedName( const QString& context, const QString& s )
-    : m_id( insertRedactedName(context, s) ),
-      m_context(context)
+    : m_id( insertRedactedName( context, s ) )
+    , m_context( context )
 {
 }
 
-RedactedName::RedactedName(const char *context, const QString& s )
+RedactedName::RedactedName( const char* context, const QString& s )
     : RedactedName( QString::fromLatin1( context ), s )
 {
 }
diff --git a/src/libcalamares/utils/Logger.h b/src/libcalamares/utils/Logger.h
index 0d7d5c870c4e810d220b7d4e5e2fe94be1467e3c..f4079388d5224b1cdd13aca4ad0f30bed0390b8a 100644
--- a/src/libcalamares/utils/Logger.h
+++ b/src/libcalamares/utils/Logger.h
@@ -71,8 +71,11 @@ private:
 inline CDebug&
 operator<<( CDebug&& s, const FuncSuppressor& f )
 {
-    s.m_funcinfo = nullptr;
-    s << f.m_s;
+    if ( s.m_funcinfo )
+    {
+        s.m_funcinfo = nullptr;
+        s.m_msg = QString( f.m_s );
+    }
     return s;
 }
 
@@ -244,7 +247,8 @@ private:
     const QString m_context;
 };
 
-inline QDebug& operator<<( QDebug& s, const RedactedName& n )
+inline QDebug&
+operator<<( QDebug& s, const RedactedName& n )
 {
     return s << NoQuote << QString( n ) << Quote;
 }
diff --git a/src/libcalamares/utils/Retranslator.h b/src/libcalamares/utils/Retranslator.h
index efe12ef8ac9a4ca9da80d42b0897b8b07e4ea0a9..8bb044983f4efb6d17ca1f739eae0a133642dbce 100644
--- a/src/libcalamares/utils/Retranslator.h
+++ b/src/libcalamares/utils/Retranslator.h
@@ -29,7 +29,8 @@ namespace CalamaresUtils
  * @param locale the new locale (names as defined by Calamares).
  * @param brandingTranslationsPrefix the branding path prefix, from Calamares::Branding.
  */
-DLLEXPORT void installTranslator( const CalamaresUtils::Locale::Translation::Id& locale, const QString& brandingTranslationsPrefix );
+DLLEXPORT void installTranslator( const CalamaresUtils::Locale::Translation::Id& locale,
+                                  const QString& brandingTranslationsPrefix );
 
 /** @brief Initializes the translations with the current system settings
  */
@@ -56,7 +57,8 @@ DLLEXPORT CalamaresUtils::Locale::Translation::Id translatorLocaleName();
  *
  * @returns @c true on success
  */
-DLLEXPORT bool loadTranslator( const CalamaresUtils::Locale::Translation::Id& locale, const QString& prefix, QTranslator* translator );
+DLLEXPORT bool
+loadTranslator( const CalamaresUtils::Locale::Translation::Id& locale, const QString& prefix, QTranslator* translator );
 
 /** @brief Set @p allow to true to load translations from current dir.
  *
@@ -88,7 +90,7 @@ public:
     static Retranslator* instance();
 
     /// @brief Helper function for attaching lambdas
-    static void attach( QObject* o, std::function< void( void ) > f);
+    static void attach( QObject* o, std::function< void( void ) > f );
 
 signals:
     void languageChanged();
@@ -138,8 +140,11 @@ private:
 #define CALAMARES_RETRANSLATE_SLOT( slotfunc ) \
     do \
     { \
-        connect( CalamaresUtils::Retranslator::instance(), &CalamaresUtils::Retranslator::languageChanged, this, slotfunc ); \
-        (this->*slotfunc)(); \
+        connect( CalamaresUtils::Retranslator::instance(), \
+                 &CalamaresUtils::Retranslator::languageChanged, \
+                 this, \
+                 slotfunc ); \
+        ( this->*slotfunc )(); \
     } while ( false )
 
 #endif
diff --git a/src/libcalamares/utils/String.cpp b/src/libcalamares/utils/String.cpp
index 615d30309c43fd45dbe9638282630ae9ff76a897..c88c2369354a9a615cbdf4432a514fa67a707d12 100644
--- a/src/libcalamares/utils/String.cpp
+++ b/src/libcalamares/utils/String.cpp
@@ -224,5 +224,26 @@ truncateMultiLine( const QString& string, CalamaresUtils::LinesStartEnd lines, C
     return front + back.right( chars.total / 2 );
 }
 
+void
+removeLeading( QString& string, QChar c )
+{
+    int count = 0;
+    while ( string.length() > count && string[ count ] == c )
+    {
+        count++;
+    }
+    string.remove( 0, count );
+}
+
+void
+removeTrailing( QString& string, QChar c )
+{
+    int lastIndex = string.length();
+    while ( lastIndex > 0 && string[ lastIndex - 1 ] == c )
+    {
+        lastIndex--;
+    }
+    string.remove( lastIndex, string.length() );
+}
 
 }  // namespace CalamaresUtils
diff --git a/src/libcalamares/utils/String.h b/src/libcalamares/utils/String.h
index e08255f86f007b832843bd44d3421d6e38bf4738..1adc2336ad1f1357f8a29614014bfdd4cf4118e0 100644
--- a/src/libcalamares/utils/String.h
+++ b/src/libcalamares/utils/String.h
@@ -100,6 +100,19 @@ DLLEXPORT QString truncateMultiLine( const QString& string,
                                      LinesStartEnd lines = LinesStartEnd { 3, 5 },
                                      CharCount chars = CharCount { 812 } );
 
+/** @brief Remove all @p c at the beginning of @p string
+ *
+ * Modifies the @p string in-place. If @p c is not the first character
+ * of @p string, the string is left unchanged; otherwise the first character
+ * is removed and the process repeats.
+ */
+DLLEXPORT void removeLeading( QString& string, QChar c );
+/** @brief Remove all @p c at the end of @p string
+ *
+ * Like removeLeading(), but at the end of the string.
+ */
+DLLEXPORT void removeTrailing( QString& string, QChar c );
+
 }  // namespace CalamaresUtils
 
 #endif
diff --git a/src/libcalamares/utils/Tests.cpp b/src/libcalamares/utils/Tests.cpp
index 12b72cb4ce25b5d059524024707ce1fe150bcaa5..3dde75338c771a5419cd622e8376c22164f8c522 100644
--- a/src/libcalamares/utils/Tests.cpp
+++ b/src/libcalamares/utils/Tests.cpp
@@ -70,12 +70,19 @@ private Q_SLOTS:
     void testStringTruncation();
     void testStringTruncationShorter();
     void testStringTruncationDegenerate();
+    void testStringRemoveLeading_data();
+    void testStringRemoveLeading();
+    void testStringRemoveTrailing_data();
+    void testStringRemoveTrailing();
 
     /** @section Test Runner directory-manipulation. */
     void testRunnerDirs();
     void testCalculateWorkingDirectory();
     void testRunnerOutput();
 
+    /** @section Test file-functions */
+    void testReadWriteFile();
+
 private:
     void recursiveCompareMap( const QVariantMap& a, const QVariantMap& b, int depth );
 };
@@ -751,6 +758,64 @@ LibCalamaresTests::testStringTruncationDegenerate()
     }
 }
 
+void
+LibCalamaresTests::testStringRemoveLeading_data()
+{
+    QTest::addColumn< QString >( "string" );
+    QTest::addColumn< char >( "c" );
+    QTest::addColumn< QString >( "result" );
+
+    QTest::newRow( "empty" ) << QString() << '/' << QString();
+    QTest::newRow( "one-slash" ) << QStringLiteral( "/tmp" ) << '/' << QStringLiteral( "tmp" );
+    QTest::newRow( "two-slash" ) << QStringLiteral( "//tmp" ) << '/' << QStringLiteral( "tmp" );
+    QTest::newRow( "multi-slash" ) << QStringLiteral( "/tmp/p" ) << '/' << QStringLiteral( "tmp/p" );
+    QTest::newRow( "later-slash" ) << QStringLiteral( "@/tmp" ) << '/' << QStringLiteral( "@/tmp" );
+    QTest::newRow( "all-one-slash" ) << QStringLiteral( "/" ) << '/' << QString();
+    QTest::newRow( "all-many-slash" ) << QStringLiteral( "////////////////////" ) << '/' << QString();
+    QTest::newRow( "trailing" ) << QStringLiteral( "tmp/" ) << '/' << QStringLiteral( "tmp/" );
+}
+
+void
+LibCalamaresTests::testStringRemoveLeading()
+{
+    QFETCH( QString, string );
+    QFETCH( char, c );
+    QFETCH( QString, result );
+
+    const QString initial = string;
+    CalamaresUtils::removeLeading( string, c );
+    QCOMPARE( string, result );
+}
+
+void
+LibCalamaresTests::testStringRemoveTrailing_data()
+{
+    QTest::addColumn< QString >( "string" );
+    QTest::addColumn< char >( "c" );
+    QTest::addColumn< QString >( "result" );
+
+    QTest::newRow( "empty" ) << QString() << '/' << QString();
+    QTest::newRow( "one-slash" ) << QStringLiteral( "/tmp" ) << '/' << QStringLiteral( "/tmp" );
+    QTest::newRow( "two-slash" ) << QStringLiteral( "//tmp" ) << '/' << QStringLiteral( "//tmp" );
+    QTest::newRow( "multi-slash" ) << QStringLiteral( "/tmp//p/" ) << '/' << QStringLiteral( "/tmp//p" );
+    QTest::newRow( "later-slash" ) << QStringLiteral( "@/tmp/@" ) << '/' << QStringLiteral( "@/tmp/@" );
+    QTest::newRow( "later-slash2" ) << QStringLiteral( "@/tmp/@//" ) << '/' << QStringLiteral( "@/tmp/@" );
+    QTest::newRow( "all-one-slash" ) << QStringLiteral( "/" ) << '/' << QString();
+    QTest::newRow( "all-many-slash" ) << QStringLiteral( "////////////////////" ) << '/' << QString();
+    QTest::newRow( "trailing" ) << QStringLiteral( "tmp/" ) << '/' << QStringLiteral( "tmp" );
+}
+
+void
+LibCalamaresTests::testStringRemoveTrailing()
+{
+    QFETCH( QString, string );
+    QFETCH( char, c );
+    QFETCH( QString, result );
+
+    const QString initial = string;
+    CalamaresUtils::removeTrailing( string, c );
+    QCOMPARE( string, result );
+}
 
 static QString
 dirname( const QTemporaryDir& d )
@@ -950,6 +1015,84 @@ LibCalamaresTests::testRunnerOutput()
 }
 
 
+CalamaresUtils::System*
+file_setup( const QTemporaryDir& tempRoot )
+{
+    CalamaresUtils::System* ss = CalamaresUtils::System::instance();
+    if ( !ss )
+    {
+        ss = new CalamaresUtils::System( true );
+    }
+
+    Calamares::GlobalStorage* gs
+        = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
+    if ( !gs )
+    {
+        cDebug() << "Creating new JobQueue";
+        (void)new Calamares::JobQueue();
+        gs = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
+    }
+    if ( gs )
+    {
+        // Working with a rootMountPoint set
+        gs->insert( "rootMountPoint", tempRoot.path() );
+    }
+    return ss;
+}
+
+void
+LibCalamaresTests::testReadWriteFile()
+{
+    static const QByteArray otherContents( "derp\n" );
+
+    QTemporaryDir tempRoot( QDir::tempPath() + QStringLiteral( "/test-job-XXXXXX" ) );
+    auto* ss = file_setup( tempRoot );
+
+    QVERIFY( ss );
+    {
+        auto fullPath = ss->createTargetFile( "test0", QByteArray(), CalamaresUtils::System::WriteMode::Overwrite );
+        QVERIFY( fullPath );
+        QVERIFY( !fullPath.path().isEmpty() );
+
+        QFileInfo fi( fullPath.path() );
+        QVERIFY( fi.exists() );
+        QVERIFY( fi.isFile() );
+        QCOMPARE( fi.size(), 0 );
+    }
+    // It won't overwrite unless you ask for it
+    {
+        auto fullPath = ss->createTargetFile( "test0", otherContents );
+        QVERIFY( !fullPath );  // Failed, because it won't overwrite
+        QCOMPARE( fullPath.code(), decltype( fullPath )::Code::AlreadyExists );
+        QVERIFY( fullPath.path().isEmpty() );  // Because it wasn't written
+
+        QFileInfo fi( tempRoot.filePath( "test0" ) );  // Compute the name some other way
+        QVERIFY( fi.exists() );
+        QVERIFY( fi.isFile() );
+        QCOMPARE( fi.size(), 0 );
+    }
+    // But it will if you say so explicitly
+    {
+        auto fullPath = ss->createTargetFile( "test0", otherContents, CalamaresUtils::System::WriteMode::Overwrite );
+        QVERIFY( fullPath );
+        QVERIFY( !fullPath.path().isEmpty() );
+
+        QFileInfo fi( fullPath.path() );
+        QVERIFY( fi.exists() );
+        QVERIFY( fi.isFile() );
+        QCOMPARE( fi.size(), 5 );
+    }
+
+    // Now it's been written, we can read it, too
+    {
+        auto contents = ss->readTargetFile( "test0" );
+        QVERIFY( !contents.isEmpty() );
+        QCOMPARE( contents.count(), 1 );
+        QCOMPARE( contents[ 0 ], QStringLiteral( "derp" ) );  // No trailing \n
+    }
+}
+
+
 QTEST_GUILESS_MAIN( LibCalamaresTests )
 
 #include "utils/moc-warnings.h"
diff --git a/src/libcalamaresui/Branding.cpp b/src/libcalamaresui/Branding.cpp
index 5894c723d6d95abbd08cbc5bd9d22117a543275d..b723f5dc7f536862500872a6b6f512b2b6a64654 100644
--- a/src/libcalamaresui/Branding.cpp
+++ b/src/libcalamaresui/Branding.cpp
@@ -162,14 +162,15 @@ uploadServerFromMap( const QVariantMap& map )
 
     if ( typestring.isEmpty() || urlstring.isEmpty() )
     {
-        return Branding::UploadServerInfo( Branding::UploadServerType::None, QUrl(), 0 );
+        return Branding::UploadServerInfo { Branding::UploadServerType::None, QUrl(), 0 };
     }
 
     bool bogus = false;  // we don't care about type-name lookup success here
-    return Branding::UploadServerInfo(
+    return Branding::UploadServerInfo {
         names.find( typestring, bogus ),
         QUrl( urlstring, QUrl::ParsingMode::StrictMode ),
-        sizeLimitKiB >= 0 ? CalamaresUtils::KiBtoBytes( static_cast< unsigned long long >( sizeLimitKiB ) ) : -1 );
+        sizeLimitKiB >= 0 ? CalamaresUtils::KiBtoBytes( static_cast< unsigned long long >( sizeLimitKiB ) ) : -1
+    };
 }
 
 /** @brief Load the @p map with strings from @p config
diff --git a/src/libcalamaresui/Branding.h b/src/libcalamaresui/Branding.h
index ba49f87c3d5ee350c23de09ce531d6309d98abb0..899b14c78a3d56e4909c95a6f89f9f785cfdc92e 100644
--- a/src/libcalamaresui/Branding.h
+++ b/src/libcalamaresui/Branding.h
@@ -227,7 +227,14 @@ public:
      * is irrelevant and usually empty), the URL for the upload and the size limit of upload
      * in bytes (for configuration value < 0, it serves -1, which stands for having no limit).
      */
-    using UploadServerInfo = std::tuple< UploadServerType, QUrl, qint64 >;
+    struct UploadServerInfo
+    {
+        UploadServerType type;
+        QUrl url;
+        qint64 size;
+
+        operator bool() const { return type != Calamares::Branding::UploadServerType::None && size != 0; }
+    };
     UploadServerInfo uploadServer() const { return m_uploadServer; }
 
     /**
diff --git a/src/libcalamaresui/CMakeLists.txt b/src/libcalamaresui/CMakeLists.txt
index a704b748442892b876e097686b33e177ea837d11..bd2e79f10036e469fbf588e95f09f87f2cbc1ed0 100644
--- a/src/libcalamaresui/CMakeLists.txt
+++ b/src/libcalamaresui/CMakeLists.txt
@@ -27,6 +27,7 @@ set( calamaresui_SOURCES
     viewpages/ViewStep.cpp
 
     widgets/ClickableLabel.cpp
+    widgets/ErrorDialog.cpp
     widgets/FixedAspectRatioLabel.cpp
     widgets/PrettyRadioButton.cpp
     widgets/TranslationFix.cpp
@@ -39,8 +40,6 @@ set( calamaresui_SOURCES
 
 # Don't warn about third-party sources
 mark_thirdparty_code(
-    ${CMAKE_SOURCE_DIR}/3rdparty/qjsonitem.cpp
-    ${CMAKE_SOURCE_DIR}/3rdparty/qjsonmodel.cpp
     ${CMAKE_SOURCE_DIR}/3rdparty/waitingspinnerwidget.cpp
 )
 
@@ -75,6 +74,8 @@ calamares_add_library( calamaresui
         Qt5::Svg
     RESOURCES libcalamaresui.qrc
     EXPORT Calamares
+    UI
+        utils/ErrorDialog/ErrorDialog.ui
     VERSION ${CALAMARES_VERSION_SHORT}
 )
 target_link_libraries( calamaresui PRIVATE yamlcpp::yamlcpp )
diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp
index 57570ad64c05adb88c3a0c17ffffe493b6c84699..44afafb15a15f30d3ad64b796c7d5841ca09969c 100644
--- a/src/libcalamaresui/ViewManager.cpp
+++ b/src/libcalamaresui/ViewManager.cpp
@@ -24,11 +24,13 @@
 #include "viewpages/BlankViewStep.h"
 #include "viewpages/ExecutionViewStep.h"
 #include "viewpages/ViewStep.h"
+#include "widgets/ErrorDialog.h"
 #include "widgets/TranslationFix.h"
 
 #include <QApplication>
 #include <QBoxLayout>
 #include <QClipboard>
+#include <QDialogButtonBox>
 #include <QFile>
 #include <QMessageBox>
 #include <QMetaObject>
@@ -150,56 +152,32 @@ ViewManager::insertViewStep( int before, ViewStep* step )
 void
 ViewManager::onInstallationFailed( const QString& message, const QString& details )
 {
-    bool shouldOfferWebPaste = std::get< 0 >( Calamares::Branding::instance()->uploadServer() )
-            != Calamares::Branding::UploadServerType::None
-        and std::get< 2 >( Calamares::Branding::instance()->uploadServer() ) != 0;
-
     cError() << "Installation failed:" << message;
     cDebug() << Logger::SubEntry << "- message:" << message;
     cDebug() << Logger::SubEntry << "- details:" << Logger::NoQuote << details;
 
     QString heading
         = Calamares::Settings::instance()->isSetupMode() ? tr( "Setup Failed" ) : tr( "Installation Failed" );
-    QString pasteMsg = tr( "Would you like to paste the install log to the web?" );
-    QString text = "<p>" + message + "</p>";
-    if ( !details.isEmpty() )
-    {
-        text += "<p>"
-            + CalamaresUtils::truncateMultiLine( details, CalamaresUtils::LinesStartEnd { 6, 2 } )
-                  .replace( '\n', QStringLiteral( "<br/>" ) )
-            + "</p>";
-    }
-    if ( shouldOfferWebPaste )
-    {
-        text += "<p>" + pasteMsg + "</p>";
-    }
 
-    QMessageBox* msgBox = new QMessageBox();
-    msgBox->setIcon( QMessageBox::Critical );
-    msgBox->setWindowTitle( tr( "Error" ) );
-    msgBox->setText( "<strong>" + heading + "</strong>" );
-    msgBox->setInformativeText( text );
-    if ( shouldOfferWebPaste )
-    {
-        msgBox->setStandardButtons( QMessageBox::Yes | QMessageBox::No );
-        msgBox->setDefaultButton( QMessageBox::No );
-    }
-    else
-    {
-        msgBox->setStandardButtons( QMessageBox::Close );
-        msgBox->setDefaultButton( QMessageBox::Close );
-    }
-    Calamares::fixButtonLabels( msgBox );
-    msgBox->show();
+    ErrorDialog* errorDialog = new ErrorDialog();
+    errorDialog->setWindowTitle( tr( "Error" ) );
+    errorDialog->setHeading( "<strong>" + heading + "</strong>" );
+    errorDialog->setInformativeText( message );
+    errorDialog->setShouldOfferWebPaste( Calamares::Branding::instance()->uploadServer() );
+    errorDialog->setDetails( details );
+    errorDialog->show();
 
     cDebug() << "Calamares will quit when the dialog closes.";
-    connect( msgBox, &QMessageBox::buttonClicked, [msgBox]( QAbstractButton* button ) {
-        if ( msgBox->buttonRole( button ) == QMessageBox::ButtonRole::YesRole )
-        {
-            CalamaresUtils::Paste::doLogUploadUI( msgBox );
-        }
-        QApplication::quit();
-    } );
+    connect( errorDialog,
+             &QDialog::finished,
+             [ errorDialog ]( int result )
+             {
+                 if ( result == QDialog::Accepted && errorDialog->shouldOfferWebPaste() )
+                 {
+                     CalamaresUtils::Paste::doLogUploadUI( errorDialog );
+                 }
+                 QApplication::quit();
+             } );
 }
 
 
diff --git a/src/libcalamaresui/utils/Paste.cpp b/src/libcalamaresui/utils/Paste.cpp
index 519dc0133c5a9fa8e51857b48ecdf817d3ff6edd..d782d138e8ce4bfad9ab6807c381f619e4843f24 100644
--- a/src/libcalamaresui/utils/Paste.cpp
+++ b/src/libcalamaresui/utils/Paste.cpp
@@ -69,7 +69,8 @@ STATICTEST QString
 ficheLogUpload( const QByteArray& pasteData, const QUrl& serverUrl, QObject* parent )
 {
     QTcpSocket* socket = new QTcpSocket( parent );
-    socket->connectToHost( serverUrl.host(), serverUrl.port() );
+    // 16 bits of port-number
+    socket->connectToHost( serverUrl.host(), quint16( serverUrl.port() ) );
 
     if ( !socket->waitForConnected() )
     {
diff --git a/src/libcalamaresui/widgets/ErrorDialog.cpp b/src/libcalamaresui/widgets/ErrorDialog.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8c682f964d7324d0188eb84a18d9cb628c1f09c3
--- /dev/null
+++ b/src/libcalamaresui/widgets/ErrorDialog.cpp
@@ -0,0 +1,106 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *   SPDX-FileCopyrightText: 2021 Artem Grinev <agrinev@manjaro.org>
+ *   SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ *   Calamares is Free Software: see the License-Identifier above.
+ *
+ */
+
+#include "ErrorDialog.h"
+#include "ui_ErrorDialog.h"
+
+#include "widgets/TranslationFix.h"
+#include <QDialogButtonBox>
+#include <QIcon>
+
+namespace Calamares
+{
+
+ErrorDialog::ErrorDialog( QWidget* parent )
+    : QDialog( parent )
+    , ui( new Ui::ErrorDialog )
+{
+    ui->setupUi( this );
+    ui->iconLabel->setPixmap( QIcon::fromTheme( "dialog-error" ).pixmap( 64 ) );
+    ui->detailsWidget->hide();
+    ui->offerWebPasteLabel->hide();
+}
+
+ErrorDialog::~ErrorDialog()
+{
+    delete ui;
+}
+
+QString
+ErrorDialog::heading() const
+{
+    return ui->headingLabel->text();
+}
+
+QString
+ErrorDialog::informativeText() const
+{
+    return ui->informativeTextLabel->text();
+}
+
+QString
+ErrorDialog::details() const
+{
+    return ui->detailsBrowser->toPlainText();
+}
+
+void
+ErrorDialog::setHeading( const QString& newHeading )
+{
+    if ( ui->headingLabel->text() != newHeading )
+    {
+        ui->headingLabel->setText( newHeading );
+        emit headingChanged();
+    }
+}
+
+void
+ErrorDialog::setInformativeText( const QString& newInformativeText )
+{
+    if ( ui->informativeTextLabel->text() != newInformativeText )
+    {
+        ui->informativeTextLabel->setText( newInformativeText );
+        emit informativeTextChanged();
+    }
+}
+
+void
+ErrorDialog::setDetails( const QString& newDetails )
+{
+    if ( ui->detailsBrowser->toPlainText() != newDetails )
+    {
+        ui->detailsBrowser->setPlainText( newDetails );
+        ui->detailsWidget->setVisible( !ui->detailsBrowser->toPlainText().trimmed().isEmpty() );
+        emit detailsChanged();
+    }
+}
+
+bool
+ErrorDialog::shouldOfferWebPaste() const
+{
+    return m_shouldOfferWebPaste;
+}
+
+void
+ErrorDialog::setShouldOfferWebPaste( bool newShouldOfferWebPaste )
+{
+    if ( m_shouldOfferWebPaste != newShouldOfferWebPaste )
+    {
+        m_shouldOfferWebPaste = newShouldOfferWebPaste;
+
+        ui->offerWebPasteLabel->setVisible( m_shouldOfferWebPaste );
+        ui->buttonBox->setStandardButtons( m_shouldOfferWebPaste ? ( QDialogButtonBox::Yes | QDialogButtonBox::No )
+                                                                 : QDialogButtonBox::Close );
+        fixButtonLabels( ui->buttonBox );
+
+        emit shouldOfferWebPasteChanged();
+    }
+}
+
+}  // namespace Calamares
diff --git a/src/libcalamaresui/widgets/ErrorDialog.h b/src/libcalamaresui/widgets/ErrorDialog.h
new file mode 100644
index 0000000000000000000000000000000000000000..c4949a89c624cc6b80d7ab248c886c78d6c0e0ec
--- /dev/null
+++ b/src/libcalamaresui/widgets/ErrorDialog.h
@@ -0,0 +1,83 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *   SPDX-FileCopyrightText: 2021 Artem Grinev <agrinev@manjaro.org>
+ *   SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ *   Calamares is Free Software: see the License-Identifier above.
+ *
+ */
+
+#ifndef LIBCALAMARESUI_ERRORDIALOG_H
+#define LIBCALAMARESUI_ERRORDIALOG_H
+
+#include <QDialog>
+
+namespace Ui
+{
+class ErrorDialog;
+}
+
+namespace Calamares
+{
+class ErrorDialog : public QDialog
+{
+    Q_OBJECT
+
+    Q_PROPERTY( QString heading READ heading WRITE setHeading NOTIFY headingChanged )
+    Q_PROPERTY( QString informativeText READ informativeText WRITE setInformativeText NOTIFY informativeTextChanged )
+    Q_PROPERTY( QString details READ details WRITE setDetails NOTIFY detailsChanged )
+    Q_PROPERTY( bool shouldOfferWebPaste READ shouldOfferWebPaste WRITE setShouldOfferWebPaste NOTIFY
+                    shouldOfferWebPasteChanged )
+
+public:
+    explicit ErrorDialog( QWidget* parent = nullptr );
+    ~ErrorDialog() override;
+
+    /** @brief The heading (title) of the error dialog
+     *
+     * This is a short (one-line) title. It is human-readable, so should
+     * be translated at the time it is set.
+     */
+    QString heading() const;
+    void setHeading( const QString& newHeading );
+
+    /** @brief The description of the problem
+     *
+     * Longer, human-readable, description of the problem. This text
+     * is word-wrapped as necessary.
+     */
+    QString informativeText() const;
+    void setInformativeText( const QString& newInformativeText );
+
+    /** @brief Details of the problem
+     *
+     * This is generally command-output; it might not be translated
+     * when set. It should be considered "background to the informative
+     * text", or maybe "the reasons". Write the informative text for
+     * the end-user.
+     */
+    QString details() const;
+    void setDetails( const QString& newDetails );
+
+    /** @brief Enable web-paste button
+     *
+     * The web-paste button can be configured at a global level,
+     * but each individual error dialog can be set separately.
+     */
+    bool shouldOfferWebPaste() const;
+    void setShouldOfferWebPaste( bool newShouldOfferWebPaste );
+
+signals:
+    void headingChanged();
+    void informativeTextChanged();
+    void detailsChanged();
+    void shouldOfferWebPasteChanged();
+
+private:
+    Ui::ErrorDialog* ui;
+    bool m_shouldOfferWebPaste = false;
+};
+
+};  // namespace Calamares
+
+#endif  // LIBCALAMARESUI_ERRORDIALOG_H
diff --git a/src/libcalamaresui/widgets/ErrorDialog.ui b/src/libcalamaresui/widgets/ErrorDialog.ui
new file mode 100644
index 0000000000000000000000000000000000000000..cb480034e9fe2a524bb8527671b7e3d32c943595
--- /dev/null
+++ b/src/libcalamaresui/widgets/ErrorDialog.ui
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ErrorDialog</class>
+ <widget class="QDialog" name="ErrorDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>425</width>
+    <height>262</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string notr="true">Dialog</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="5" column="0" colspan="2">
+    <widget class="QWidget" name="detailsWidget" native="true">
+     <layout class="QVBoxLayout" name="verticalLayout_3">
+      <item>
+       <widget class="QLabel" name="informativeTextLabel">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="text">
+         <string notr="true"/>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="label">
+        <property name="text">
+         <string>Details:</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QTextBrowser" name="detailsBrowser"/>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="7" column="0">
+    <widget class="QLabel" name="offerWebPasteLabel">
+     <property name="toolTip">
+      <string/>
+     </property>
+     <property name="text">
+      <string>Would you like to paste the install log to the web?</string>
+     </property>
+    </widget>
+   </item>
+   <item row="8" column="0" colspan="2">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close</set>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLabel" name="iconLabel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string notr="true"/>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="headingLabel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string notr="true"/>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>ErrorDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>ErrorDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/src/libcalamaresui/widgets/TranslationFix.cpp b/src/libcalamaresui/widgets/TranslationFix.cpp
index 1262fceb539f6359304f674e3dca348f982d5803..dbfd0bd83a8d180b6492bd0683d8c4d12212dc17 100644
--- a/src/libcalamaresui/widgets/TranslationFix.cpp
+++ b/src/libcalamaresui/widgets/TranslationFix.cpp
@@ -11,30 +11,34 @@
 
 #include <QAbstractButton>
 #include <QCoreApplication>
+#include <QDialogButtonBox>
 #include <QMessageBox>
+#include <QPushButton>
 
 namespace Calamares
 {
 
+//Using QMessageBox's StandardButton enum here but according to headers they should be kept in-sync between multiple classes.
+static std::pair< decltype( QMessageBox::Ok ), const char* > maps[] = {
+    { QMessageBox::Ok, QT_TRANSLATE_NOOP( "StandardButtons", "&OK" ) },
+    { QMessageBox::Yes, QT_TRANSLATE_NOOP( "StandardButtons", "&Yes" ) },
+    { QMessageBox::No, QT_TRANSLATE_NOOP( "StandardButtons", "&No" ) },
+    { QMessageBox::Cancel, QT_TRANSLATE_NOOP( "StandardButtons", "&Cancel" ) },
+    { QMessageBox::Close, QT_TRANSLATE_NOOP( "StandardButtons", "&Close" ) },
+};
+
+template < typename TButtonBox >
 void
-fixButtonLabels( QMessageBox* box )
+fixButtonLabels( TButtonBox* box )
 {
     if ( !box )
     {
         return;
     }
 
-    static std::pair< decltype( QMessageBox::Ok ), const char* > maps[] = {
-        { QMessageBox::Ok, QT_TRANSLATE_NOOP( "StandardButtons", "&OK" ) },
-        { QMessageBox::Yes, QT_TRANSLATE_NOOP( "StandardButtons", "&Yes" ) },
-        { QMessageBox::No, QT_TRANSLATE_NOOP( "StandardButtons", "&No" ) },
-        { QMessageBox::Cancel, QT_TRANSLATE_NOOP( "StandardButtons", "&Cancel" ) },
-        { QMessageBox::Close, QT_TRANSLATE_NOOP( "StandardButtons", "&Close" ) },
-    };
-
     for ( auto [ sb, label ] : maps )
     {
-        auto* button = box->button( sb );
+        auto* button = box->button( static_cast< typename TButtonBox::StandardButton >( int( sb ) ) );
         if ( button )
         {
             button->setText( QCoreApplication::translate( "StandardButtons", label ) );
@@ -42,4 +46,16 @@ fixButtonLabels( QMessageBox* box )
     }
 }
 
+void
+fixButtonLabels( QMessageBox* box )
+{
+    fixButtonLabels< QMessageBox >( box );
+}
+
+void
+fixButtonLabels( QDialogButtonBox* box )
+{
+    fixButtonLabels< QDialogButtonBox >( box );
+}
+
 }  // namespace Calamares
diff --git a/src/libcalamaresui/widgets/TranslationFix.h b/src/libcalamaresui/widgets/TranslationFix.h
index 107dad67d1279db6191f79c766d72b65cc193991..89ee9a51ad26a66e68cd1c5ea5fe40a16e39a4b2 100644
--- a/src/libcalamaresui/widgets/TranslationFix.h
+++ b/src/libcalamaresui/widgets/TranslationFix.h
@@ -13,6 +13,7 @@
 #include "DllMacro.h"
 
 class QMessageBox;
+class QDialogButtonBox;
 
 namespace Calamares
 {
@@ -26,6 +27,8 @@ namespace Calamares
  * guess the context.
  */
 void UIDLLEXPORT fixButtonLabels( QMessageBox* );
+
+void UIDLLEXPORT fixButtonLabels( QDialogButtonBox* );
 }  // namespace Calamares
 
 #endif
diff --git a/src/modules/README.md b/src/modules/README.md
index 7b4d4b3a3b4dc9c4e61c18943ccac646933d9835..62d92c2604531e7140b6baff7384655dad7f6dd4 100644
--- a/src/modules/README.md
+++ b/src/modules/README.md
@@ -67,7 +67,7 @@ Note that process modules are not recommended.
 
 Module descriptors **may** have the following keys:
 - *emergency* (a boolean value, set to true to mark the module
-  as an emergency module)
+  as an emergency module; see the section *Emergency Modules*, below)
 - *noconfig* (a boolean value, set to true to state that the module
   has no configuration file; defaults to false)
 - *requiredModules* (a list of modules which are required for this module
@@ -86,24 +86,30 @@ it needs those keys.
 
 ### Emergency Modules
 
-Only C++ modules and job modules may be emergency modules. If, during an
-*exec* step in the sequence, a module fails, installation as a whole fails
-and the install is aborted. If there are emergency modules in the **same**
-exec block, those will be executed before the installation is aborted.
-Non-emergency modules are not executed.
+If, during an *exec* step in the sequence, a module fails, installation as
+a whole fails and the install is aborted. If there are emergency modules
+in the **same** exec block, those will be executed before the installation
+is aborted. Non-emergency modules are not executed.
 
 If an emergency-module fails while processing emergency-modules for
 another failed module, that failure is ignored and emergency-module
 processing continues.
 
 Use the EMERGENCY keyword in the CMake description of a C++ module
-to generate a suitable `module.desc`.
+to generate a suitable `module.desc`.  For Python modules, manually add
+`emergency:  true` to `module.desc`.
 
 A module that is marked as an emergency module in its module.desc
 must **also** set the *emergency* key to *true* in its configuration file
 (see below). If it does not, the module is not considered to be an emergency
-module after all (this is so that you can have modules that have several
-instances, only some of which are actually needed for emergencies).
+module after all. This is so that you can have modules that have several
+instances, only some of which are actually needed for emergencies.
+
+In summary:
+- in `module.desc`, write `emergency: true` to make it **possible** to
+  run the module in emergency mode,
+- in `<modulename>.conf`, write `emergency: true` to make that specific
+  module run in emergency mode.
 
 ### Module-specific configuration
 
@@ -112,6 +118,10 @@ named `<modulename>.conf`. If such a file is present in the
 module's directory, it can be shipped as a *default* configuration file.
 This only happens if the CMake-time option `INSTALL_CONFIG` is on.
 
+The name of the configuration file for a given module can be
+influenced by the `settings.conf` of the overall Calamares configuration.
+By default, though, the module's own name is used.
+
 Modules that have *noconfig* set to true will not attempt to
 read a configuration file, and will not warn that one is missing;
 conversely if *noconfig* is set to false (or is missing, since
@@ -169,6 +179,26 @@ it is possible to take the whole installation-process into account
 for determining the relative weights there.
 
 
+## Global storage keys
+Some modules place values in global storage so that they can be referenced later by other modules or even other parts of the same module.  The following table represents a partial list of the values available as well as where they originate from and which module consume them.
+
+Key|Source|Consumers|Description
+---|---|---|---
+btrfsSubvolumes|mount|fstab|List of maps containing the mountpoint and btrtfs subvolume
+btrfsRootSubvolume|mount|bootloader, luksopenswaphook|String containing the subvolume mounted at root
+efiSystemPartition|partition|bootloader, fstab|String containing the path to the ESP relative to the installed system
+extraMounts|mount|unpackfs|List of maps holding metadata for the temporary mountpoints used by the installer
+hostname|users||A string containing the hostname of the new system
+netinstallAdd|packagechooser|netinstall|Data to add to netinstall tree. Same format as netinstall.yaml
+netinstallSelect|packagechooser|netinstall|List of group names to select in the netinstall tree
+partitions|partition, rawfs|numerous modules|List of maps of metadata about each partition
+rootMountPoint|mount|numerous modules|A string with the absolute path to the root mountpoint
+username|users|networkcfg, plasmainf, preservefiles|A string containing the username of the new user
+zfsDatasets|zfs|bootloader, grubcfg, mount|List of maps of zfs datasets including the name and mount information
+zfsInfo|partition|mount, zfs|List of encrypted zfs partitions and the encription info
+zfsPoolInfo|zfs|mount, umount|List of maps of zfs pool info including the name and mountpoint
+
+
 ## C++ modules
 
 > Type: viewmodule, jobmodule
diff --git a/src/modules/bootloader/bootloader.conf b/src/modules/bootloader/bootloader.conf
index 9f9ad84aabcc5a33b28522c357520e68031ba05e..b28412b0f1ba0022f79a4b1319e7d0540da38f66 100644
--- a/src/modules/bootloader/bootloader.conf
+++ b/src/modules/bootloader/bootloader.conf
@@ -46,6 +46,16 @@ efiBootMgr: "efibootmgr"
 # setting the option here, keep in mind that the name is sanitized
 # (problematic characters, see above, are replaced).
 #
+# There are some special words possible at the end of *efiBootloaderId*:
+#   @@SERIAL@@ can be used to obtain a uniquely-numbered suffix
+#       that is added to the Id (yielding, e.g., `dirname1` or `dirname72`)
+#   @@RANDOM@@ can be used to obtain a unique 4-digit hex suffix
+#   @@PHRASE@@ can be used to obtain a unique 1-to-3-word suffix
+#       from a dictionary of space-themed words
+# Note that these must be at the **end** of the *efiBootloaderId* value.
+# There must also be at most one of them. If there is none, no suffix-
+# processing is done and the *efiBootloaderId* is used unchanged.
+#
 # efiBootloaderId: "dirname"
 
 # Optionally install a copy of the GRUB EFI bootloader as the EFI
diff --git a/src/modules/bootloader/main.py b/src/modules/bootloader/main.py
index 25c7e0d9b1a7229aa010e007bfa8e33189617c1e..c7bc741dea3f24fd0bb792adeecac7832d8cddd6 100644
--- a/src/modules/bootloader/main.py
+++ b/src/modules/bootloader/main.py
@@ -224,7 +224,7 @@ def create_systemd_boot_conf(install_path, efi_dir, uuid, entry, entry_name, ker
 
     # Copy kernel and initramfs to a subdirectory of /efi partition
     files_dir = os.path.join(install_path + efi_dir, entry_name)
-    os.mkdir(files_dir)
+    os.makedirs(files_dir, exist_ok=True)
 
     kernel_path = install_path + kernel
     kernel_name = os.path.basename(kernel_path)
@@ -268,10 +268,166 @@ def create_loader(loader_path, entry):
             loader_file.write(line)
 
 
-def efi_label():
+class suffix_iterator(object):
+    """
+    Wrapper for one of the "generator" classes below to behave like
+    a proper Python iterator. The iterator is initialized with a
+    maximum number of attempts to generate a new suffix.
+    """
+    def __init__(self, attempts, generator):
+        self.generator = generator
+        self.attempts = attempts
+        self.counter = 0
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        self.counter += 1
+        if self.counter <= self.attempts:
+            return self.generator.next()
+        raise StopIteration
+
+
+class serialEfi(object):
+    """
+    EFI Id generator that appends a serial number to the given name.
+    """
+    def __init__(self, name):
+        self.name = name
+        # So the first call to next() will bump it to 0
+        self.counter = -1
+
+    def next(self):
+        self.counter += 1
+        if self.counter > 0:
+            return "{!s}{!s}".format(self.name, self.counter)
+        else:
+            return self.name
+
+
+def render_in_base(value, base_values, length=-1):
+    """
+    Renders @p value in base-N, where N is the number of
+    items in @p base_values. When rendering, use the items
+    of @p base_values (e.g. use "0123456789" to get regular decimal
+    rendering, or "ABCDEFGHIJ" for letters-as-numbers 'encoding').
+
+    If length is positive, pads out to at least that long with
+    leading "zeroes", whatever base_values[0] is.
+    """
+    if value < 0:
+        raise ValueError("Cannot render negative values")
+    if len(base_values) < 2:
+        raise ValueError("Insufficient items for base-N rendering")
+    if length < 1:
+        length = 1
+    digits = []
+    base = len(base_values)
+    while value > 0:
+        place = value % base
+        value = value // base
+        digits.append(base_values[place])
+    while len(digits) < length:
+        digits.append(base_values[0])
+    return "".join(reversed(digits))
+
+
+class randomEfi(object):
+    """
+    EFI Id generator that appends a random 4-digit hex number to the given name.
+    """
+    def __init__(self, name):
+        self.name = name
+        # So the first call to next() will bump it to 0
+        self.counter = -1
+
+    def next(self):
+        self.counter += 1
+        if self.counter > 0:
+            import random
+            v = random.randint(0, 65535)  # 16 bits
+            return "{!s}{!s}".format(self.name, render_in_base(v, "0123456789ABCDEF", 4))
+        else:
+            return self.name
+
+
+class phraseEfi(object):
+    """
+    EFI Id generator that appends a random phrase to the given name.
+    """
+    words = ("Sun", "Moon", "Mars", "Soyuz", "Falcon", "Kuaizhou", "Gaganyaan")
+
+    def __init__(self, name):
+        self.name = name
+        # So the first call to next() will bump it to 0
+        self.counter = -1
+
+    def next(self):
+        self.counter += 1
+        if self.counter > 0:
+            import random
+            desired_length = 1 + self.counter // 5
+            v = random.randint(0, len(self.words) ** desired_length)
+            return "{!s}{!s}".format(self.name, render_in_base(v, self.words))
+        else:
+            return self.name
+
+
+def get_efi_suffix_generator(name):
+    """
+    Handle EFI bootloader Ids with @@<something>@@ for suffix-processing.
+    """
+    if "@@" not in name:
+        raise ValueError("Misplaced call to get_efi_suffix_generator, no @@")
+    parts = name.split("@@")
+    if len(parts) != 3:
+        raise ValueError("EFI Id {!r} is malformed".format(name))
+    if parts[2]:
+        # Supposed to be empty because the string ends with "@@"
+        raise ValueError("EFI Id {!r} is malformed".format(name))
+    if parts[1] not in ("SERIAL", "RANDOM", "PHRASE"):
+        raise ValueError("EFI suffix {!r} is unknown".format(parts[1]))
+
+    generator = None
+    if parts[1] == "SERIAL":
+        generator = serialEfi(parts[0])
+    elif parts[1] == "RANDOM":
+        generator = randomEfi(parts[0])
+    elif parts[1] == "PHRASE":
+        generator = phraseEfi(parts[0])
+    if generator is None:
+        raise ValueError("EFI suffix {!r} is unsupported".format(parts[1]))
+
+    return generator
+
+
+def change_efi_suffix(efi_directory, bootloader_id):
+    """
+    Returns a label based on @p bootloader_id that is usable within
+    @p efi_directory. If there is a @@<something>@@ suffix marker
+    in the given id, tries to generate a unique label.
+    """
+    if bootloader_id.endswith("@@"):
+        # Do 10 attempts with any suffix generator
+        g = suffix_iterator(10, get_efi_suffix_generator(bootloader_id))
+    else:
+        # Just one attempt
+        g = [bootloader_id]
+
+    for candidate_name in g:
+        if not os.path.exists(os.path.join(efi_directory, candidate_name)):
+            return candidate_name
+    return bootloader_id
+
+
+def efi_label(efi_directory):
+    """
+    Returns a sanitized label, possibly unique, that can be
+    used within @p efi_directory.
+    """
     if "efiBootloaderId" in libcalamares.job.configuration:
-        efi_bootloader_id = libcalamares.job.configuration[
-                                "efiBootloaderId"]
+        efi_bootloader_id = change_efi_suffix( efi_directory, libcalamares.job.configuration["efiBootloaderId"] )
     else:
         branding = libcalamares.globalstorage.value("branding")
         efi_bootloader_id = branding["bootloaderEntryName"]
@@ -390,7 +546,7 @@ def run_grub_mkconfig(partitions, output_file):
         check_target_env_call([libcalamares.job.configuration["grubMkconfig"], "-o", output_file])
 
 
-def run_grub_install(fw_type, partitions, efi_directory=None):
+def run_grub_install(fw_type, partitions, efi_directory):
     """
     Runs grub-install in the target environment
 
@@ -407,7 +563,8 @@ def run_grub_install(fw_type, partitions, efi_directory=None):
         check_target_env_call(["sh", "-c", "echo ZPOOL_VDEV_NAME_PATH=1 >> /etc/environment"])
 
     if fw_type == "efi":
-        efi_bootloader_id = efi_label()
+        assert efi_directory is not None
+        efi_bootloader_id = efi_label(efi_directory)
         efi_target, efi_grub_file, efi_boot_file = get_grub_efi_parameters()
 
         if is_zfs:
@@ -421,6 +578,7 @@ def run_grub_install(fw_type, partitions, efi_directory=None):
                                    "--bootloader-id=" + efi_bootloader_id,
                                    "--force"])
     else:
+        assert efi_directory is None
         if libcalamares.globalstorage.value("bootLoader") is None:
             return
 
@@ -462,7 +620,7 @@ def install_grub(efi_directory, fw_type):
         if not os.path.isdir(install_efi_directory):
             os.makedirs(install_efi_directory)
 
-        efi_bootloader_id = efi_label()
+        efi_bootloader_id = efi_label(efi_directory)
 
         efi_target, efi_grub_file, efi_boot_file = get_grub_efi_parameters()
 
@@ -497,7 +655,7 @@ def install_grub(efi_directory, fw_type):
             shutil.copy2(efi_file_source, efi_file_target)
     else:
         libcalamares.utils.debug("Bootloader: grub (bios)")
-        run_grub_install(fw_type, partitions)
+        run_grub_install(fw_type, partitions, None)
 
     run_grub_mkconfig(partitions, libcalamares.job.configuration["grubCfg"])
 
@@ -506,7 +664,7 @@ def install_secureboot(efi_directory):
     """
     Installs the secureboot shim in the system by calling efibootmgr.
     """
-    efi_bootloader_id = efi_label()
+    efi_bootloader_id = efi_label(efi_directory)
 
     install_path = libcalamares.globalstorage.value("rootMountPoint")
     install_efi_directory = install_path + efi_directory
diff --git a/src/modules/bootloader/tests/CMakeTests.txt b/src/modules/bootloader/tests/CMakeTests.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5b16d5009443bebff09e526eebb52b44e9648815
--- /dev/null
+++ b/src/modules/bootloader/tests/CMakeTests.txt
@@ -0,0 +1,7 @@
+# We have tests to exercise some of the module internals.
+# Those tests conventionally live in Python files here in the tests/ directory. Add them.
+add_test(
+    NAME test-bootloader-efiname
+    COMMAND env PYTHONPATH=.: python3 ${CMAKE_CURRENT_LIST_DIR}/test-bootloader-efiname.py
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+)
diff --git a/src/modules/bootloader/tests/test-bootloader-efiname.py b/src/modules/bootloader/tests/test-bootloader-efiname.py
new file mode 100644
index 0000000000000000000000000000000000000000..67cb917471a9819b9aed23e2c61573f6859936f2
--- /dev/null
+++ b/src/modules/bootloader/tests/test-bootloader-efiname.py
@@ -0,0 +1,64 @@
+# Calamares Boilerplate
+import libcalamares
+libcalamares.globalstorage = libcalamares.GlobalStorage(None)
+libcalamares.globalstorage.insert("testing", True)
+
+# Module prep-work
+from src.modules.bootloader import main
+
+# Specific Bootloader test
+g = main.get_efi_suffix_generator("derp@@SERIAL@@")
+assert g is not None
+assert g.next() == "derp"  # First time, no suffix
+for n in range(9):
+    print(g.next())
+# We called next() 10 times in total, starting from 0
+assert g.next() == "derp10"
+
+g = main.get_efi_suffix_generator("derp@@RANDOM@@")
+assert g is not None
+for n in range(10):
+    print(g.next())
+# it's random, nothing to assert
+
+g = main.get_efi_suffix_generator("derp@@PHRASE@@")
+assert g is not None
+for n in range(10):
+    print(g.next())
+# it's random, nothing to assert
+
+# Check invalid things
+try:
+    g = main.get_efi_suffix_generator("derp")
+    raise TypeError("Shouldn't get generator (no indicator)")
+except ValueError as e:
+    pass
+
+try:
+    g = main.get_efi_suffix_generator("derp@@HEX@@")
+    raise TypeError("Shouldn't get generator (unknown indicator)")
+except ValueError as e:
+    pass
+
+try:
+    g = main.get_efi_suffix_generator("derp@@SERIAL@@x")
+    raise TypeError("Shouldn't get generator (trailing garbage)")
+except ValueError as e:
+    pass
+
+try:
+    g = main.get_efi_suffix_generator("derp@@SERIAL@@@@RANDOM@@")
+    raise TypeError("Shouldn't get generator (multiple indicators)")
+except ValueError as e:
+    pass
+
+
+# Try the generator (assuming no calamares- test files exist in /tmp)
+import os
+assert "calamares-single" == main.change_efi_suffix("/tmp", "calamares-single")
+assert "calamares-serial" == main.change_efi_suffix("/tmp", "calamares-serial@@SERIAL@@")
+try:
+    os.makedirs("/tmp/calamares-serial", exist_ok=True)
+    assert "calamares-serial1" == main.change_efi_suffix("/tmp", "calamares-serial@@SERIAL@@")
+finally:
+    os.rmdir("/tmp/calamares-serial")
diff --git a/src/modules/fstab/fstab.conf b/src/modules/fstab/fstab.conf
index 9c76f0c46bbe4dda30b86e578fd5552eeb6facea..1e87acddc293fa763ba9c67ebaf61f59ab8b9dce 100644
--- a/src/modules/fstab/fstab.conf
+++ b/src/modules/fstab/fstab.conf
@@ -18,10 +18,16 @@
 #
 # btrfs_swap options are used when a swapfile is chosen with a btrfs root
 # the options are applied to the subvolume which holds the swap partition
+#
+# The settings shown here apply only the btrfs defaults; these
+# are generally the right ones. Commented-out lines show other
+# options wich **might** be applicable for specific situations.
 mountOptions:
     default: defaults,noatime
-    btrfs: defaults,noatime,autodefrag,compress=zstd
-    btrfs_swap: defaults,noatime
+    # btrfs: defaults,noatime,autodefrag,compress=zstd
+    btrfs: defaults
+    # btrfs_swap: defaults,noatime
+    btrfs_swap: defaults
 
 # Mount options to use for the EFI System Partition. If not defined, the
 # *mountOptions* for *vfat* are used, or if that is not set either,
@@ -49,7 +55,7 @@ efiMountOptions: umask=0077
 # The standard configuration applies asynchronous discard support and ssd optimizations to btrfs
 # and does nothing for other filesystems.
 ssdExtraMountOptions:
-    btrfs: discard=async,ssd,commit=120
+    btrfs: discard=async
 
 # Additional options added to each line in /etc/crypttab
 crypttabOptions: luks
diff --git a/src/modules/fstab/test2.yaml b/src/modules/fstab/test2.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0e91bf649114b69d281e9d40739e010ae3fe596f
--- /dev/null
+++ b/src/modules/fstab/test2.yaml
@@ -0,0 +1,25 @@
+# SPDX-FileCopyrightText: no
+# SPDX-License-Identifier: CC0-1.0
+#
+# This test shows how btrfs root would work
+rootMountPoint: /tmp/mount
+partitions:
+    - device: /dev/sda1
+      fs: btrfs
+      mountPoint: /
+      uuid: 2a00f1d5-1217-49a7-bedd-b55c85764732
+    - device: /dev/sda2
+      fs: swap
+      uuid: 59406569-446f-4730-a874-9f6b4b44fee3
+      mountPoint:
+    - device: /dev/sdb1
+      fs: btrfs
+      mountPoint: /home
+      uuid: 59406569-abcd-1234-a874-9f6b4b44fee3
+btrfsSubvolumes:
+    - mountPoint: /
+      subvolume: "@ROOT"
+    - mountPoint: /var
+      subvolume: "@var"
+    - mountPoint: /usr/local
+      subvolume: "@local"
diff --git a/src/modules/grubcfg/grubcfg.conf b/src/modules/grubcfg/grubcfg.conf
index 33c2a72ab681bb8a297f78600bed029554d63b92..afc5e89b89d574a9a25e1690504d5a8d1dfddcec 100644
--- a/src/modules/grubcfg/grubcfg.conf
+++ b/src/modules/grubcfg/grubcfg.conf
@@ -29,8 +29,16 @@ prefer_grub_d: false
 # kept, not updated to the *bootloaderEntryName* from the branding file.
 # Use this if the GRUB_DISTRIBUTOR setting in the file is "smart" in
 # some way (e.g. uses shell-command substitution).
+#
+# TODO:3.3:snake-case this key
 keepDistributor: false
 
+# The default kernel params that should always be applied.
+# This is an array of strings. If it is unset, the default is
+# `["quiet"]`. To avoid the default, explicitly set this key
+# to an empty list, `[]`.
+kernel_params: [ "quiet" ]
+
 # Default entries to write to /etc/default/grub if it does not exist yet or if
 # we are overwriting it.
 #
diff --git a/src/modules/grubcfg/grubcfg.schema.yaml b/src/modules/grubcfg/grubcfg.schema.yaml
index f1bf2cc03c4a0620afc3bdd5d0a4a2b2e80d3e99..35d63c0634d72eff81c6882e6eba30cec47a9cfd 100644
--- a/src/modules/grubcfg/grubcfg.schema.yaml
+++ b/src/modules/grubcfg/grubcfg.schema.yaml
@@ -7,8 +7,10 @@ additionalProperties: false
 type: object
 properties:
     overwrite: { type: boolean, default: false }
+    # TODO:3.3:snake-case this key
     keepDistributor: { type: boolean, default: false }
     prefer_grub_d: { type: boolean, default: false }
+    kernel_params: { type: array, items: { type: string } }
     defaults:
         type: object
         additionalProperties: true  # Other fields are acceptable
diff --git a/src/modules/grubcfg/main.py b/src/modules/grubcfg/main.py
index 521293bf91b3a0d616351d17f93280bdb320db74..45018642cec4d68b9b477fba8667d5112a96b9b1 100644
--- a/src/modules/grubcfg/main.py
+++ b/src/modules/grubcfg/main.py
@@ -174,7 +174,7 @@ def modify_grub_default(partitions, root_mount_point, distributor):
             if partition["fs"] == "zfs" and partition["mountPoint"] == "/":
                 zfs_root_path = get_zfs_root()
 
-    kernel_params = ["quiet"]
+    kernel_params = libcalamares.job.configuration.get("kernel_params", ["quiet"])
 
     # Currently, grub doesn't detect this properly so it must be set manually
     if zfs_root_path:
diff --git a/src/modules/initcpio/InitcpioJob.cpp b/src/modules/initcpio/InitcpioJob.cpp
index b96f3b3168748b53ef8d5347a4802476516158d3..df995ccbf6df49e9379ccbc766c739475418038f 100644
--- a/src/modules/initcpio/InitcpioJob.cpp
+++ b/src/modules/initcpio/InitcpioJob.cpp
@@ -1,6 +1,7 @@
 /* === This file is part of Calamares - <https://calamares.io> ===
  *
  *   SPDX-FileCopyrightText: 2019 Adriaan de Groot <groot@kde.org>
+ *   SPDX-FileCopyrightText: 2022 Evan James <dalto@fastmail.com>
  *   SPDX-License-Identifier: GPL-3.0-or-later
  *
  *   Calamares is Free Software: see the License-Identifier above.
@@ -31,15 +32,22 @@ InitcpioJob::prettyName() const
     return tr( "Creating initramfs with mkinitcpio." );
 }
 
+/** @brief Sets secure permissions on each initramfs
+ *
+ * Iterates over each initramfs contained directly in the directory @p d.
+ * For each initramfs found, the permissions are set to owner read/write only.
+ *
+ */
 void
 fixPermissions( const QDir& d )
 {
-    for ( const auto& fi : d.entryInfoList( { "initramfs*" }, QDir::Files ) )
+    const auto initramList = d.entryInfoList( { "initramfs*" }, QDir::Files );
+    for ( const auto& fi : initramList )
     {
         QFile f( fi.absoluteFilePath() );
         if ( f.exists() )
         {
-            cDebug() << "initcpio fixing permissions for" << f.fileName();
+            cDebug() << "initcpio setting permissions for" << f.fileName();
             f.setPermissions( QFileDevice::ReadOwner | QFileDevice::WriteOwner );
         }
     }
@@ -63,9 +71,19 @@ InitcpioJob::exec()
         }
     }
 
+    // If the kernel option isn't set to a specific kernel, run mkinitcpio on all kernels
+    QStringList command = { "mkinitcpio" };
+    if ( m_kernel.isEmpty() || m_kernel == "all" )
+    {
+        command.append( "-P" );
+    }
+    else
+    {
+        command.append( { "-p", m_kernel } );
+    }
+
     cDebug() << "Updating initramfs with kernel" << m_kernel;
-    auto r = CalamaresUtils::System::instance()->targetEnvCommand(
-        { "mkinitcpio", "-p", m_kernel }, QString(), QString() /* no timeout , 0 */ );
+    auto r = CalamaresUtils::System::instance()->targetEnvCommand( command, QString(), QString() /* no timeout , 0 */ );
     return r.explainProcess( "mkinitcpio", std::chrono::seconds( 10 ) /* fake timeout */ );
 }
 
@@ -73,28 +91,6 @@ void
 InitcpioJob::setConfigurationMap( const QVariantMap& configurationMap )
 {
     m_kernel = CalamaresUtils::getString( configurationMap, "kernel" );
-    if ( m_kernel.isEmpty() )
-    {
-        m_kernel = QStringLiteral( "all" );
-    }
-    else if ( m_kernel == "$uname" )
-    {
-        auto r = CalamaresUtils::System::runCommand( CalamaresUtils::System::RunLocation::RunInHost,
-                                                     { "/bin/uname", "-r" },
-                                                     QString(),
-                                                     QString(),
-                                                     std::chrono::seconds( 3 ) );
-        if ( r.getExitCode() == 0 )
-        {
-            m_kernel = r.getOutput();
-            cDebug() << "*initcpio* using running kernel" << m_kernel;
-        }
-        else
-        {
-            cWarning() << "*initcpio* could not determine running kernel, using 'all'." << Logger::Continuation
-                       << r.getExitCode() << r.getOutput();
-        }
-    }
 
     m_unsafe = CalamaresUtils::getBool( configurationMap, "be_unsafe", false );
 }
diff --git a/src/modules/initcpio/initcpio.conf b/src/modules/initcpio/initcpio.conf
index 717a511df71e4bdfb6144f502599b654e29292f5..d2a126864714fe16205df2acbea2e0fd7103d629 100644
--- a/src/modules/initcpio/initcpio.conf
+++ b/src/modules/initcpio/initcpio.conf
@@ -5,21 +5,22 @@
 ---
 # This key defines the kernel to be loaded.
 # It can have the following values:
-#  - empty or unset, interpreted as "all"
-#  - the literal string "$uname" (without quotes, with dollar),
-#    which will use the output of `uname -r` to determine the
-#    running kernel, and use that.
-#  - any other string.
+#  - the name of a single mkinitcpio preset
+#  - empty or unset
+#  - the literal string "all"
 #
-# Whatever is set, that string is passed as *preset* argument to the
-# `-p` option of *mkinitcpio*. Take care that both "$uname" operates
-# in the host system, and might not be correct if the target system is
-# updated (to a newer kernel) as part of the installation.
+# If kernel is set to "all" or empty/unset then mkinitpio is called for all
+# kernels.  Otherwise it is called with a single preset with the value
+# contained in kernel.
 #
-# Note that "all" is probably not a good preset to use either.
-kernel: linux312
+kernel: linux
 
 # Set this to true to turn off mitigations for lax file
 # permissions on initramfs (which, in turn, can compromise
 # your LUKS encryption keys, CVS-2019-13179).
+#
+# If your initramfs are stored in the EFI partition or another non-POSIX
+# filesystem, this has no effect as the file permissions cannot be changed.
+# In this case, ensure the partition is mounted securely.
+#
 be_unsafe: false
diff --git a/src/modules/initcpiocfg/main.py b/src/modules/initcpiocfg/main.py
index 8fc30582901e336e0791bf83ce23f87f9369b9fc..1fd4af714c37a9701df803406933523bf3cce23d 100644
--- a/src/modules/initcpiocfg/main.py
+++ b/src/modules/initcpiocfg/main.py
@@ -180,7 +180,8 @@ def find_initcpio_features(partitions, root_mount_point):
         if partition["fs"] == "btrfs":
             uses_btrfs = True
 
-        if partition["fs"] == "zfs":
+        # In addition to checking the filesystem, check to ensure that zfs is enabled
+        if partition["fs"] == "zfs" and libcalamares.globalstorage.contains("zfsPoolInfo"):
             uses_zfs = True
 
         if "lvm2" in partition["fs"]:
diff --git a/src/modules/initramfs/InitramfsJob.cpp b/src/modules/initramfs/InitramfsJob.cpp
index 1b10a1a05a7c23d978fc50f57485970683dc46f4..d83b4673cfe482671281f64bd1d295a81023e1ae 100644
--- a/src/modules/initramfs/InitramfsJob.cpp
+++ b/src/modules/initramfs/InitramfsJob.cpp
@@ -81,6 +81,7 @@ InitramfsJob::setConfigurationMap( const QVariantMap& configurationMap )
         }
         else
         {
+            m_kernel = QStringLiteral( "all" );
             cWarning() << "*initramfs* could not determine running kernel, using 'all'." << Logger::Continuation
                        << r.getExitCode() << r.getOutput();
         }
diff --git a/src/modules/interactiveterminal/InteractiveTerminalPage.cpp b/src/modules/interactiveterminal/InteractiveTerminalPage.cpp
index afd39936b5cdfe192c8e32c145fb023348f7db99..ea30c21ef6435ee1185fbe0bc868799a0a24ce6c 100644
--- a/src/modules/interactiveterminal/InteractiveTerminalPage.cpp
+++ b/src/modules/interactiveterminal/InteractiveTerminalPage.cpp
@@ -18,6 +18,7 @@
 #include <KParts/ReadOnlyPart>
 #include <KParts/kde_terminal_interface.h>
 #include <KService>
+#include <kcoreaddons_version.h>
 
 #include <QApplication>
 #include <QDir>
@@ -41,8 +42,10 @@ InteractiveTerminalPage::InteractiveTerminalPage( QWidget* parent )
 void
 InteractiveTerminalPage::errorKonsoleNotInstalled()
 {
-    QMessageBox mb(QMessageBox::Critical,
-        tr( "Konsole not installed" ), tr( "Please install KDE Konsole and try again!" ), QMessageBox::Ok );
+    QMessageBox mb( QMessageBox::Critical,
+                    tr( "Konsole not installed" ),
+                    tr( "Please install KDE Konsole and try again!" ),
+                    QMessageBox::Ok );
     Calamares::fixButtonLabels( &mb );
     mb.exec();
 }
@@ -54,20 +57,30 @@ InteractiveTerminalPage::onActivate()
     {
         return;
     }
-    // For whatever reason, instead of simply linking against a library we
-    // need to do a runtime query to KService just to get a sodding terminal
-    // widget.
+
+#if KCOREADDONS_VERSION_MAJOR != 5
+#error Incompatible with not-KF5
+#endif
+#if KCOREADDONS_VERSION_MINOR >= 86
+    // 5.86 deprecated a bunch of KService and PluginFactory and related methods
+    auto md = KPluginMetaData::findPluginById( QString(), "konsolepart" );
+    if ( !md.isValid() )
+    {
+        errorKonsoleNotInstalled();
+        return;
+    }
+    auto* p = KPluginFactory::instantiatePlugin< KParts::ReadOnlyPart >( md, this ).plugin;
+#else
     KService::Ptr service = KService::serviceByDesktopName( "konsolepart" );
     if ( !service )
     {
-        // And all of this hoping the Konsole application is installed. If not,
-        // tough cookies.
         errorKonsoleNotInstalled();
         return;
     }
 
     // Create one instance of konsolepart.
     KParts::ReadOnlyPart* p = service->createInstance< KParts::ReadOnlyPart >( this, this, {} );
+#endif
     if ( !p )
     {
         // One more opportunity for the loading operation to fail.
@@ -91,7 +104,6 @@ InteractiveTerminalPage::onActivate()
 
     m_termHostWidget = p->widget();
     m_layout->addWidget( m_termHostWidget );
-    cDebug() << "Part widget ought to be" << m_termHostWidget->metaObject()->className();
 
     t->showShellInDir( QDir::home().path() );
     t->sendInput( QString( "%1\n" ).arg( m_command ) );
diff --git a/src/modules/locale/Config.cpp b/src/modules/locale/Config.cpp
index ce48edd8242db2f3cbc1cdbefd784972ea46a188..8593f83857853202d66f8a8b2f060cbb094b7ad4 100644
--- a/src/modules/locale/Config.cpp
+++ b/src/modules/locale/Config.cpp
@@ -221,6 +221,11 @@ Config::setCurrentLocation()
     {
         setCurrentLocation( m_startingTimezone.first, m_startingTimezone.second );
     }
+    if ( !m_selectedLocaleConfiguration.explicit_lang )
+    {
+        auto newLocale = automaticLocaleConfiguration();
+        setLanguage( newLocale.language() );
+    }
 }
 
 void
@@ -252,15 +257,21 @@ Config::setCurrentLocation( const QString& regionName, const QString& zoneName )
 void
 Config::setCurrentLocation( const CalamaresUtils::Locale::TimeZoneData* location )
 {
-    if ( location != m_currentLocation )
+    const bool updateLocation = ( location != m_currentLocation );
+    if ( updateLocation )
     {
         m_currentLocation = location;
-        // Overwrite those settings that have not been made explicit.
-        auto newLocale = automaticLocaleConfiguration();
-        if ( !m_selectedLocaleConfiguration.explicit_lang )
-        {
-            setLanguage( newLocale.language() );
-        }
+    }
+
+    // lang should be always be updated
+    auto newLocale = automaticLocaleConfiguration();
+    if ( !m_selectedLocaleConfiguration.explicit_lang )
+    {
+        setLanguage( newLocale.language() );
+    }
+
+    if ( updateLocation )
+    {
         if ( !m_selectedLocaleConfiguration.explicit_lc )
         {
             m_selectedLocaleConfiguration.lc_numeric = newLocale.lc_numeric;
diff --git a/src/modules/luksopenswaphookcfg/CMakeLists.txt b/src/modules/luksopenswaphookcfg/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..caede06a7b0be6ac4ed53c0e17116ca9da3a20fa
--- /dev/null
+++ b/src/modules/luksopenswaphookcfg/CMakeLists.txt
@@ -0,0 +1,22 @@
+# === This file is part of Calamares - <https://calamares.io> ===
+#
+#   SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
+#   SPDX-License-Identifier: BSD-2-Clause
+#
+
+# Because LUKS Open Swap Hook (Job) is such a mouthful, we'll
+# use LOSH all over the place as a shorthand.
+calamares_add_plugin( luksopenswaphookcfg
+    TYPE job
+    EXPORT_MACRO PLUGINDLLEXPORT_PRO
+    SOURCES
+        LOSHJob.cpp
+    SHARED_LIB
+)
+
+calamares_add_test(
+    luksopenswaphooktest
+    SOURCES
+        LOSHJob.cpp
+        Tests.cpp
+)
diff --git a/src/modules/luksopenswaphookcfg/LOSHInfo.h b/src/modules/luksopenswaphookcfg/LOSHInfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..1a87f4e612396694e0ec77ec5f82cc2d278fad10
--- /dev/null
+++ b/src/modules/luksopenswaphookcfg/LOSHInfo.h
@@ -0,0 +1,66 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *  SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
+ *  SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+#ifndef LUKSOPENSWAPHOOKCFG_LOSHINFO_H
+#define LUKSOPENSWAPHOOKCFG_LOSHINFO_H
+
+#include <QString>
+
+/** @brief Information needed to create a suitable config file
+ *
+ * The LUKS swap configuration has a handful of keys that need to
+ * be written to the config file. This struct holds those keys
+ * and can find the key values from Global Storage (where the
+ * *partition* module sets them).
+ */
+struct LOSHInfo
+{
+    // Member names copied from Python code
+    QString swap_outer_uuid;
+    QString swap_mapper_name;
+    QString mountable_keyfile_device;
+    QString swap_device_path;
+    QString keyfile_device_mount_options;
+
+    bool isValid() const { return !swap_device_path.isEmpty(); }
+
+    /** @brief Helper method for doing key-value replacements
+     *
+     * Given a named @p key (e.g. "duck", or "swap_device"), returns the
+     * value set for that key. Invalid keys (e.g. "duck") return an empty string.
+     */
+    QString replacementFor( const QString& key ) const
+    {
+        if ( key == QStringLiteral( "swap_device" ) )
+        {
+            return swap_device_path;
+        }
+        if ( key == QStringLiteral( "crypt_swap_name" ) )
+        {
+            return swap_mapper_name;
+        }
+        if ( key == QStringLiteral( "keyfile_device" ) )
+        {
+            return mountable_keyfile_device;
+        }
+        if ( key == QStringLiteral( "keyfile_filename" ) )
+        {
+            return QStringLiteral( "crypto_keyfile.bin" );
+        }
+        if ( key == QStringLiteral( "keyfile_device_mount_options" ) )
+        {
+            return keyfile_device_mount_options;
+        }
+        return QString();
+    }
+
+    /** @brief Creates a struct from information already set in GS
+     *
+     */
+    static LOSHInfo fromGlobalStorage();
+};
+
+#endif
diff --git a/src/modules/luksopenswaphookcfg/LOSHJob.cpp b/src/modules/luksopenswaphookcfg/LOSHJob.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..42f160460d677eac423bada75f97b8464f008aac
--- /dev/null
+++ b/src/modules/luksopenswaphookcfg/LOSHJob.cpp
@@ -0,0 +1,181 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *  SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
+ *  SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+#include "LOSHJob.h"
+
+#include "LOSHInfo.h"
+
+#include "GlobalStorage.h"
+#include "JobQueue.h"
+#include "utils/CalamaresUtilsSystem.h"
+#include "utils/Logger.h"
+#include "utils/Permissions.h"
+#include "utils/PluginFactory.h"
+#include "utils/String.h"
+#include "utils/Variant.h"
+
+#include <QList>
+#include <QObject>
+#include <QRegularExpression>
+#include <QVariantMap>
+
+LOSHJob::LOSHJob( QObject* parent )
+    : Calamares::CppJob( parent )
+{
+}
+
+LOSHJob::~LOSHJob() {}
+
+
+QString
+LOSHJob::prettyName() const
+{
+    return tr( "Configuring encrypted swap." );
+}
+
+STATICTEST QString
+get_assignment_part( const QString& line )
+{
+    static QRegularExpression re( "^[# \\t]*([A-Za-z_]+)[ \\t]*=" );
+    auto m = re.match( line );
+    if ( m.hasMatch() )
+    {
+        return m.captured( 1 );
+    }
+    return QString();
+}
+
+/** Writes the config file at @p path
+ *
+ * NOTE: @p path is relative to the target system, not an absolute path.
+ */
+STATICTEST void
+write_openswap_conf( const QString& path, QStringList& contents, const LOSHInfo& info )
+{
+    if ( info.isValid() )
+    {
+        for ( auto& line : contents )
+        {
+            const QString key = get_assignment_part( line );
+            QString replacement = info.replacementFor( key );
+            if ( !replacement.isEmpty() )
+            {
+                line.clear();
+                line.append( QStringLiteral( "%1=%2" ).arg( key, replacement ) );
+            }
+        }
+        cDebug() << "Writing" << contents.length() << "line configuration to" << path;
+        // \n between each two lines, and a \n at the end
+        CalamaresUtils::System::instance()->createTargetFile(
+            path, contents.join( '\n' ).append( '\n' ).toUtf8(), CalamaresUtils::System::WriteMode::Overwrite );
+    }
+    else
+    {
+        cDebug() << "Will not write an invalid configuration to" << path;
+    }
+}
+
+Calamares::JobResult
+LOSHJob::exec()
+{
+    const auto* sys = CalamaresUtils::System::instance();
+    if ( !sys )
+    {
+        return Calamares::JobResult::internalError(
+            "LuksOpenSwapHook", tr( "No target system available." ), Calamares::JobResult::InvalidConfiguration );
+    }
+
+    Calamares::GlobalStorage* gs
+        = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
+    if ( !gs || gs->value( "rootMountPoint" ).toString().isEmpty() )
+    {
+        return Calamares::JobResult::internalError(
+            "LuksOpenSwapHook", tr( "No rootMountPoint is set." ), Calamares::JobResult::InvalidConfiguration );
+    }
+    if ( m_configFilePath.isEmpty() )
+    {
+        return Calamares::JobResult::internalError(
+            "LuksOpenSwapHook", tr( "No configFilePath is set." ), Calamares::JobResult::InvalidConfiguration );
+    }
+
+    QStringList contents = sys->readTargetFile( m_configFilePath );
+    if ( contents.isEmpty() )
+    {
+        contents << QStringLiteral( "# swap_device=" ) << QStringLiteral( "# crypt_swap_name=" )
+                 << QStringLiteral( "# keyfile_device=" ) << QStringLiteral( "# keyfile_filename=" )
+                 << QStringLiteral( "# keyfile_device_mount_options" );
+    }
+
+    write_openswap_conf( m_configFilePath, contents, LOSHInfo::fromGlobalStorage() );
+    return Calamares::JobResult::ok();
+}
+
+void
+LOSHJob::setConfigurationMap( const QVariantMap& configurationMap )
+{
+    m_configFilePath = CalamaresUtils::getString(
+        configurationMap, QStringLiteral( "configFilePath" ), QStringLiteral( "/etc/openswap.conf" ) );
+}
+
+STATICTEST void
+globalStoragePartitionInfo( Calamares::GlobalStorage* gs, LOSHInfo& info )
+{
+    if ( !gs )
+    {
+        return;
+    }
+    QVariantList l = gs->value( "partitions" ).toList();
+    if ( l.isEmpty() )
+    {
+        return;
+    }
+
+    for ( const auto& pv : l )
+    {
+        const QVariantMap partition = pv.toMap();
+        if ( !partition.isEmpty() )
+        {
+            QString mountPoint = partition.value( "mountPoint" ).toString();
+            QString fileSystem = partition.value( "fs" ).toString();
+            QString luksMapperName = partition.value( "luksMapperName" ).toString();
+            // if partition["fs"] == "linuxswap" and "luksMapperName" in partition:
+            if ( fileSystem == QStringLiteral( "linuxswap" ) && !luksMapperName.isEmpty() )
+            {
+                info.swap_outer_uuid = partition.value( "luksUuid" ).toString();
+                info.swap_mapper_name = luksMapperName;
+            }
+            else if ( mountPoint == QStringLiteral( "/" ) && !luksMapperName.isEmpty() )
+            {
+
+                info.mountable_keyfile_device = QStringLiteral( "/dev/mapper/" ) + luksMapperName;
+            }
+        }
+    }
+
+    if ( !info.mountable_keyfile_device.isEmpty() && !info.swap_outer_uuid.isEmpty() )
+    {
+        info.swap_device_path = QStringLiteral( "/dev/disk/by-uuid/" ) + info.swap_outer_uuid;
+    }
+
+    QString btrfsRootSubvolume = gs->value( "btrfsRootSubvolume" ).toString();
+    if ( !btrfsRootSubvolume.isEmpty() )
+    {
+        CalamaresUtils::removeLeading( btrfsRootSubvolume, '/' );
+        info.keyfile_device_mount_options
+            = QStringLiteral( "keyfile_device_mount_options=--options=subvol=" ) + btrfsRootSubvolume;
+    }
+}
+
+LOSHInfo
+LOSHInfo::fromGlobalStorage()
+{
+    LOSHInfo i {};
+    globalStoragePartitionInfo(
+        Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr, i );
+    return i;
+}
+
+CALAMARES_PLUGIN_FACTORY_DEFINITION( LOSHJobFactory, registerPlugin< LOSHJob >(); )
diff --git a/src/modules/luksopenswaphookcfg/LOSHJob.h b/src/modules/luksopenswaphookcfg/LOSHJob.h
new file mode 100644
index 0000000000000000000000000000000000000000..4a435a9357ef51b31fe9d180b91e44c92b05ffa9
--- /dev/null
+++ b/src/modules/luksopenswaphookcfg/LOSHJob.h
@@ -0,0 +1,37 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *  SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
+ *  SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+#ifndef LUKSOPENSWAPHOOKCFG_LOSHJOB_H
+#define LUKSOPENSWAPHOOKCFG_LOSHJOB_H
+
+#include "CppJob.h"
+#include "DllMacro.h"
+#include "utils/PluginFactory.h"
+
+#include <QString>
+#include <QVariantMap>
+
+class PLUGINDLLEXPORT LOSHJob : public Calamares::CppJob
+{
+    Q_OBJECT
+
+public:
+    explicit LOSHJob( QObject* parent = nullptr );
+    ~LOSHJob() override;
+
+    QString prettyName() const override;
+
+    Calamares::JobResult exec() override;
+
+    void setConfigurationMap( const QVariantMap& configurationMap ) override;
+
+private:
+    QString m_configFilePath;
+};
+
+CALAMARES_PLUGIN_FACTORY_DECLARATION( LOSHJobFactory )
+
+#endif
diff --git a/src/modules/luksopenswaphookcfg/Tests.cpp b/src/modules/luksopenswaphookcfg/Tests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..840bd93553ed8a2f520350915af1c146eea425b5
--- /dev/null
+++ b/src/modules/luksopenswaphookcfg/Tests.cpp
@@ -0,0 +1,253 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *  SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
+ *  SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+
+#include "LOSHInfo.h"
+#include "LOSHJob.h"
+
+#include "GlobalStorage.h"
+#include "JobQueue.h"
+#include "utils/CalamaresUtilsSystem.h"
+#include "utils/Logger.h"
+
+#include <QtTest/QtTest>
+
+// LOSH = LUKS Open Swap Hook (Job)
+
+// Implementation details
+extern QString get_assignment_part( const QString& line );
+extern void write_openswap_conf( const QString& path, QStringList& contents, const LOSHInfo& info );
+
+class LOSHTests : public QObject
+{
+    Q_OBJECT
+public:
+    LOSHTests();
+    ~LOSHTests() override {}
+
+private Q_SLOTS:
+    void initTestCase();
+
+    void testAssignmentExtraction_data();
+    void testAssignmentExtraction();
+
+    void testLOSHInfo();
+    void testConfigWriting();
+    void testJob();
+};
+
+LOSHTests::LOSHTests() {}
+
+void
+LOSHTests::initTestCase()
+{
+    Logger::setupLogLevel( Logger::LOGDEBUG );
+    cDebug() << "LOSH test started.";
+}
+
+
+void
+LOSHTests::testAssignmentExtraction_data()
+{
+    QTest::addColumn< QString >( "line" );
+    QTest::addColumn< QString >( "match" );
+
+    QTest::newRow( "empty" ) << QString() << QString();
+    QTest::newRow( "comment-only1" ) << QStringLiteral( "#  " ) << QString();
+    QTest::newRow( "comment-only2" ) << QStringLiteral( "###" ) << QString();
+    QTest::newRow( "comment-only3" ) << QStringLiteral( "# # #" ) << QString();
+
+    QTest::newRow( "comment-text" ) << QStringLiteral( "#   NOTE:" ) << QString();
+    QTest::newRow( "comment-story" ) << QStringLiteral( "# This is a shell comment" ) << QString();
+    // We look for assignments, but only for single-words
+    QTest::newRow( "comment-space-eq" ) << QStringLiteral( "# Check that a = b" ) << QString();
+
+
+    QTest::newRow( "assignment1" ) << QStringLiteral( "a=1" ) << QStringLiteral( "a" );
+    QTest::newRow( "assignment2" ) << QStringLiteral( "a = 1" ) << QStringLiteral( "a" );
+    QTest::newRow( "assignment3" ) << QStringLiteral( "#   a=1" ) << QStringLiteral( "a" );
+    QTest::newRow( "assignment4" ) << QStringLiteral( "cows   = 12" ) << QStringLiteral( "cows" );
+    QTest::newRow( "assignment5" ) << QStringLiteral( "#   # cows=1" ) << QStringLiteral( "cows" );
+    QTest::newRow( "assignment6" ) << QStringLiteral( "# moose='cool'  # not cows" ) << QStringLiteral( "moose" );
+    QTest::newRow( "assignment7" ) << QStringLiteral( " moose=cows=42" ) << QStringLiteral( "moose" );
+    QTest::newRow( "assignment8" ) << QStringLiteral( "#swap_device=/dev/something" )
+                                   << QStringLiteral( "swap_device" );
+    QTest::newRow( "assignment9" ) << QStringLiteral( "# swap_device=/dev/something" )
+                                   << QStringLiteral( "swap_device" );
+    QTest::newRow( "assignment10" ) << QStringLiteral( "swap_device=/dev/something" )
+                                    << QStringLiteral( "swap_device" );
+}
+
+void
+LOSHTests::testAssignmentExtraction()
+{
+    QFETCH( QString, line );
+    QFETCH( QString, match );
+
+    QCOMPARE( get_assignment_part( line ), match );
+}
+
+static CalamaresUtils::System*
+file_setup( const QTemporaryDir& tempRoot )
+{
+    CalamaresUtils::System* ss = CalamaresUtils::System::instance();
+    if ( !ss )
+    {
+        ss = new CalamaresUtils::System( true );
+    }
+
+    Calamares::GlobalStorage* gs
+        = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
+    if ( !gs )
+    {
+        cDebug() << "Creating new JobQueue";
+        (void)new Calamares::JobQueue();
+        gs = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
+    }
+    if ( gs )
+    {
+        // Working with a rootMountPoint set
+        gs->insert( "rootMountPoint", tempRoot.path() );
+    }
+    return ss;
+}
+
+static void
+make_valid_loshinfo( LOSHInfo& i )
+{
+    i.swap_outer_uuid = QStringLiteral( "UUID-0000" );
+    i.swap_mapper_name = QStringLiteral( "/dev/mapper/0000" );
+    i.swap_device_path = QStringLiteral( "/dev/sda0" );
+    i.mountable_keyfile_device = QStringLiteral( "/dev/ada0p0s0" );
+}
+
+void
+LOSHTests::testLOSHInfo()
+{
+    LOSHInfo i {};
+    QVERIFY( !i.isValid() );
+
+    make_valid_loshinfo( i );
+    QVERIFY( i.isValid() );
+    QCOMPARE( i.replacementFor( QStringLiteral( "swap_device" ) ), QStringLiteral( "/dev/sda0" ) );
+    QCOMPARE( i.replacementFor( QStringLiteral( "duck" ) ), QString() );
+}
+
+
+void
+LOSHTests::testConfigWriting()
+{
+    QTemporaryDir tempRoot( QDir::tempPath() + QStringLiteral( "/test-job-XXXXXX" ) );
+    QVERIFY( tempRoot.isValid() );
+    auto* ss = file_setup( tempRoot );
+    QVERIFY( ss );
+    QVERIFY( Calamares::JobQueue::instance()->globalStorage() );
+    QVERIFY( QFile::exists( tempRoot.path() ) );
+    QVERIFY( QFileInfo( tempRoot.path() ).isDir() );
+
+    const QString targetFilePath = QStringLiteral( "losh.conf" );
+    const QString filePath = tempRoot.filePath( targetFilePath );
+    QStringList contents { QStringLiteral( "# Calamares demo" ),
+                           QStringLiteral( "#  swap_device=a thing" ),
+                           QStringLiteral( "#  duck duck swap_device=another" ) };
+
+    // When the information is invalid, file contents are unchanged,
+    // and no file is written either.
+    LOSHInfo i {};
+    QVERIFY( !i.isValid() );
+    QVERIFY( !QFile::exists( filePath ) );
+    write_openswap_conf( targetFilePath, contents, i );  // Invalid i
+    QVERIFY( !QFile::exists( filePath ) );
+    QCOMPARE( contents.length(), 3 );
+    QCOMPARE( contents.at( 1 ).left( 4 ), QStringLiteral( "#  s" ) );
+
+    // Can we write there at all?
+    QFile derp( filePath );
+    QVERIFY( derp.open( QIODevice::WriteOnly ) );
+    QVERIFY( derp.write( "xx", 2 ) );
+    derp.close();
+    QVERIFY( QFile::exists( filePath ) );
+    QVERIFY( QFile::remove( filePath ) );
+
+    // Once the information is valid, though, the file is written
+    make_valid_loshinfo( i );
+    QVERIFY( i.isValid() );
+    QVERIFY( !QFile::exists( filePath ) );
+    write_openswap_conf( targetFilePath, contents, i );  // Now it is valid
+    QVERIFY( QFile::exists( filePath ) );
+    QCOMPARE( contents.length(), 3 );
+    QCOMPARE( i.swap_device_path, QStringLiteral( "/dev/sda0" ) );  // expected key value
+    QCOMPARE( contents.at( 1 ), QStringLiteral( "swap_device=/dev/sda0" ) );  // expected line
+
+    // readLine() returns with newlines-added
+    QFile f( filePath );
+    QVERIFY( f.open( QIODevice::ReadOnly ) );
+    QCOMPARE( f.readLine(), QStringLiteral( "# Calamares demo\n" ) );
+    QCOMPARE( f.readLine(), QStringLiteral( "swap_device=/dev/sda0\n" ) );
+    QCOMPARE( f.readLine(), QStringLiteral( "#  duck duck swap_device=another\n" ) );
+    QCOMPARE( f.readLine(), QString() );
+    QVERIFY( f.atEnd() );
+
+    // Note how the contents is updated on every write_openswap_conf()
+    i.swap_device_path = QStringLiteral( "/dev/zram/0.zram" );
+    write_openswap_conf( targetFilePath, contents, i );  // Still valid
+    QCOMPARE( contents.length(), 3 );
+    QCOMPARE( i.swap_device_path, QStringLiteral( "/dev/zram/0.zram" ) );  // expected key value
+    QCOMPARE( contents.at( 1 ), QStringLiteral( "swap_device=/dev/zram/0.zram" ) );  // expected line
+}
+
+
+void
+LOSHTests::testJob()
+{
+    QTemporaryDir tempRoot( QDir::tempPath() + QStringLiteral( "/test-job-XXXXXX" ) );
+    QVERIFY( tempRoot.isValid() );
+    auto* ss = file_setup( tempRoot );
+    QVERIFY( ss );
+    Calamares::GlobalStorage* gs
+        = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
+    QVERIFY( gs );
+
+    {
+        QDir d( tempRoot.path() );
+        d.mkdir( "etc" );
+    }
+
+    QVERIFY( !LOSHInfo::fromGlobalStorage().isValid() );
+    QVariantList outerPartition;
+    QVariantMap innerPartition;
+    innerPartition.insert( "mountPoint", "/" );
+    innerPartition.insert( "fs", "ext4" );
+    innerPartition.insert( "luksMapperName", "root" );
+    innerPartition.insert( "luksUUID", "0000" );
+    outerPartition.append( innerPartition );
+    innerPartition.remove( "mountPoint" );
+    innerPartition.insert( "fs", "linuxswap" );
+    innerPartition.insert( "luksMapperName", "swap" );
+    innerPartition.insert( "luksUuid", "0001" );
+    outerPartition.append( innerPartition );
+    gs->insert( "partitions", outerPartition );
+    QVERIFY( LOSHInfo::fromGlobalStorage().isValid() );
+
+    LOSHJob j;
+    j.setConfigurationMap( QVariantMap() );
+    auto jobresult = j.exec();
+    QVERIFY( jobresult );
+
+    {
+        QFile f( tempRoot.filePath( "etc/openswap.conf" ) );
+        QVERIFY( f.exists() );
+        QVERIFY( f.open( QIODevice::ReadOnly ) );
+        cDebug() << f.readAll();
+    }
+}
+
+
+QTEST_GUILESS_MAIN( LOSHTests )
+
+#include "utils/moc-warnings.h"
+
+#include "Tests.moc"
diff --git a/src/modules/luksopenswaphookcfg/main.py b/src/modules/luksopenswaphookcfg/main.py
deleted file mode 100644
index ec09a631bea85827c1045885e9ffaedcfdacd5b2..0000000000000000000000000000000000000000
--- a/src/modules/luksopenswaphookcfg/main.py
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-#
-# === This file is part of Calamares - <https://calamares.io> ===
-#
-#   SPDX-FileCopyrightText: 2016 Teo Mrnjavac <teo@kde.org>
-#   SPDX-FileCopyrightText: 2017 Alf Gaida <agaida@siduction.org>
-#   SPDX-FileCopyrightText: 2019 Adriaan de Groot <groot@kde.org>
-#   SPDX-License-Identifier: GPL-3.0-or-later
-#
-#   Calamares is Free Software: see the License-Identifier above.
-#
-
-import libcalamares
-import os.path
-
-
-import gettext
-_ = gettext.translation("calamares-python",
-                        localedir=libcalamares.utils.gettext_path(),
-                        languages=libcalamares.utils.gettext_languages(),
-                        fallback=True).gettext
-
-
-def pretty_name():
-    return _("Configuring encrypted swap.")
-
-
-def write_openswap_conf(partitions, root_mount_point, openswap_conf_path):
-    swap_outer_uuid = ""
-    swap_mapper_name = ""
-    mountable_keyfile_device = ""
-
-    for partition in partitions:
-        if partition["fs"] == "linuxswap" and "luksMapperName" in partition:
-            swap_outer_uuid = partition["luksUuid"]
-            swap_mapper_name = partition["luksMapperName"]
-
-        elif partition["mountPoint"] == "/" and "luksMapperName" in partition:
-            mountable_keyfile_device = (
-                "/dev/mapper/{!s}".format(partition["luksMapperName"])
-                )
-
-    if not mountable_keyfile_device or not swap_outer_uuid:
-        return None
-
-    swap_device_path = "/dev/disk/by-uuid/{!s}".format(swap_outer_uuid)
-
-    lines = []
-    with open(os.path.join(root_mount_point,
-                           openswap_conf_path), 'r') as openswap_file:
-        lines = [x.strip() for x in openswap_file.readlines()]
-
-    for i in range(len(lines)):
-        if lines[i].startswith("swap_device"):
-            lines[i] = "swap_device={!s}".format(swap_device_path)
-
-        elif lines[i].startswith("crypt_swap_name"):
-            lines[i] = "crypt_swap_name={!s}".format(swap_mapper_name)
-
-        elif lines[i].startswith("keyfile_device"):
-            lines[i] = "keyfile_device={!s}".format(mountable_keyfile_device)
-
-        elif lines[i].startswith("keyfile_filename"):
-            lines[i] = "keyfile_filename=crypto_keyfile.bin"
-
-    with open(os.path.join(root_mount_point,
-                           openswap_conf_path), 'w') as openswap_file:
-        openswap_file.write("\n".join(lines) + "\n")
-
-    return None
-
-
-def run():
-    """
-    This module sets up the openswap hook for a resumable encrypted swap.
-    :return:
-    """
-
-    root_mount_point = libcalamares.globalstorage.value("rootMountPoint")
-    openswap_conf_path = libcalamares.job.configuration["configFilePath"]
-    partitions = libcalamares.globalstorage.value("partitions")
-
-    if not partitions:
-        libcalamares.utils.warning("partitions is empty, {!s}".format(partitions))
-        return (_("Configuration Error"),
-                _("No partitions are defined for <pre>{!s}</pre> to use." ).format("luksopenswaphookcfg"))
-    if not root_mount_point:
-        libcalamares.utils.warning("rootMountPoint is empty, {!s}".format(root_mount_point))
-        return (_("Configuration Error"),
-                _("No root mount point is given for <pre>{!s}</pre> to use." ).format("luksopenswaphookcfg"))
-
-    openswap_conf_path = openswap_conf_path.lstrip('/')
-
-    return write_openswap_conf(partitions, root_mount_point, openswap_conf_path)
diff --git a/src/modules/luksopenswaphookcfg/module.desc b/src/modules/luksopenswaphookcfg/module.desc
deleted file mode 100644
index 919a92792434930949e581001ad3a2b33058a06d..0000000000000000000000000000000000000000
--- a/src/modules/luksopenswaphookcfg/module.desc
+++ /dev/null
@@ -1,7 +0,0 @@
-# SPDX-FileCopyrightText: no
-# SPDX-License-Identifier: CC0-1.0
----
-type:       "job"
-name:       "luksopenswaphookcfg"
-interface:  "python"
-script:     "main.py"
diff --git a/src/modules/mount/main.py b/src/modules/mount/main.py
index f186b0d26000c340a5878cacd5f187432a4d7828..a3318d1a05a29567cabc77c7ac4244461a8492fb 100644
--- a/src/modules/mount/main.py
+++ b/src/modules/mount/main.py
@@ -193,6 +193,7 @@ def mount_partition(root_mount_point, partition, partitions):
         for s in btrfs_subvolumes:
             if not s["subvolume"]:
                 continue
+            os.makedirs(root_mount_point + os.path.dirname(s["subvolume"]), exist_ok=True)
             subprocess.check_call(["btrfs", "subvolume", "create",
                                    root_mount_point + s["subvolume"]])
             if s["mountPoint"] == "/":
diff --git a/src/modules/netinstall/NetInstallPage.cpp b/src/modules/netinstall/NetInstallPage.cpp
index a1a86294ef4f1cfe05ae913046a3939d58737b71..f7a2f66fc0cbe9e50b81757ec7f22f478a4a07df 100644
--- a/src/modules/netinstall/NetInstallPage.cpp
+++ b/src/modules/netinstall/NetInstallPage.cpp
@@ -15,6 +15,7 @@
 #include "PackageModel.h"
 #include "ui_page_netinst.h"
 
+#include "GlobalStorage.h"
 #include "JobQueue.h"
 
 #include "network/Manager.h"
@@ -62,4 +63,19 @@ void
 NetInstallPage::onActivate()
 {
     ui->groupswidget->setFocus();
+
+    // The netinstallSelect global storage value can be used to make additional items selected by default
+    Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
+    const QStringList selectNames = gs->value( "netinstallSelect" ).toStringList();
+    if ( !selectNames.isEmpty() )
+    {
+        m_config->model()->setSelections( selectNames );
+    }
+
+    // If NetInstallAdd is found in global storage, add those items to the tree
+    const QVariantList groups = gs->value( "netinstallAdd" ).toList();
+    if ( !groups.isEmpty() )
+    {
+        m_config->model()->appendModelData( groups );
+    }
 }
diff --git a/src/modules/netinstall/PackageModel.cpp b/src/modules/netinstall/PackageModel.cpp
index d4887b6c25d0b58c76a060554620b2c2bb9b3ba5..256a77afdf78c925f3d71daf5c5ca1d09536e085 100644
--- a/src/modules/netinstall/PackageModel.cpp
+++ b/src/modules/netinstall/PackageModel.cpp
@@ -14,6 +14,43 @@
 #include "utils/Variant.h"
 #include "utils/Yaml.h"
 
+/// Recursive helper for setSelections()
+static void
+setSelections( const QStringList& selectNames, PackageTreeItem* item )
+{
+    for ( int i = 0; i < item->childCount(); i++ )
+    {
+        auto* child = item->child( i );
+        setSelections( selectNames, child );
+    }
+    if ( item->isGroup() && selectNames.contains( item->name() ) )
+    {
+        item->setSelected( Qt::CheckState::Checked );
+    }
+}
+
+/** @brief Collects all the "source" values from @p groupList
+ *
+ * Iterates over @p groupList and returns all nonempty "source"
+ * values from the maps.
+ *
+ */
+static QStringList
+collectSources( const QVariantList& groupList )
+{
+    QStringList sources;
+    for ( const QVariant& group : groupList )
+    {
+        QVariantMap groupMap = group.toMap();
+        if ( !groupMap[ "source" ].toString().isEmpty() )
+        {
+            sources.append( groupMap[ "source" ].toString() );
+        }
+    }
+
+    return sources;
+}
+
 PackageModel::PackageModel( QObject* parent )
     : QAbstractItemModel( parent )
 {
@@ -170,6 +207,15 @@ PackageModel::headerData( int section, Qt::Orientation orientation, int role ) c
     return QVariant();
 }
 
+void
+PackageModel::setSelections( const QStringList& selectNames )
+{
+    if ( m_rootItem )
+    {
+        ::setSelections( selectNames, m_rootItem );
+    }
+}
+
 PackageTreeItem::List
 PackageModel::getPackages() const
 {
@@ -303,9 +349,43 @@ PackageModel::setupModelData( const QVariantList& groupList, PackageTreeItem* pa
 void
 PackageModel::setupModelData( const QVariantList& l )
 {
-    emit beginResetModel();
+    Q_EMIT beginResetModel();
     delete m_rootItem;
     m_rootItem = new PackageTreeItem();
     setupModelData( l, m_rootItem );
-    emit endResetModel();
+    Q_EMIT endResetModel();
+}
+
+void
+PackageModel::appendModelData( const QVariantList& groupList )
+{
+    if ( m_rootItem )
+    {
+        Q_EMIT beginResetModel();
+
+        const QStringList sources = collectSources( groupList );
+
+        if ( !sources.isEmpty() )
+        {
+            // Prune any existing data from the same source
+            QList< int > removeList;
+            for ( int i = 0; i < m_rootItem->childCount(); i++ )
+            {
+                PackageTreeItem* child = m_rootItem->child( i );
+                if ( sources.contains( child->source() ) )
+                {
+                    removeList.insert( 0, i );
+                }
+            }
+            for ( const int& item : qAsConst( removeList ) )
+            {
+                m_rootItem->removeChild( item );
+            }
+        }
+
+        // Add the new data to the model
+        setupModelData( groupList, m_rootItem );
+
+        Q_EMIT endResetModel();
+    }
 }
diff --git a/src/modules/netinstall/PackageModel.h b/src/modules/netinstall/PackageModel.h
index 998f42c38c277c5eb1406d7b2bedeeab446e1b30..e97359a46371a978c4b7e3004f50ef51e0f3c2b9 100644
--- a/src/modules/netinstall/PackageModel.h
+++ b/src/modules/netinstall/PackageModel.h
@@ -54,9 +54,33 @@ public:
     int rowCount( const QModelIndex& parent = QModelIndex() ) const override;
     int columnCount( const QModelIndex& parent = QModelIndex() ) const override;
 
+    /** @brief Sets the checked flag on matching groups in the tree
+     *
+     * Recursively traverses the tree pointed to by m_rootItem and
+     * checks if a group name matches any of the items in @p selectNames.
+     * If a match is found, set check the box for that group and it's children.
+     *
+     * Individual packages will not be matched.
+     *
+     */
+    void setSelections( const QStringList& selectNames );
+
     PackageTreeItem::List getPackages() const;
     PackageTreeItem::List getItemPackages( PackageTreeItem* item ) const;
 
+    /** @brief Appends groups to the tree
+     *
+     * Uses the data from @p groupList to add elements to the
+     * existing tree that m_rootItem points to.  If m_rootItem
+     * is not valid, it does nothing
+     *
+     * Before adding anything to the model, it ensures that there
+     * is no existing data from the same source.  If there is, that
+     * data is pruned first
+     *
+     */
+    void appendModelData( const QVariantList& groupList );
+
 private:
     friend class ItemTests;
 
diff --git a/src/modules/netinstall/PackageTreeItem.cpp b/src/modules/netinstall/PackageTreeItem.cpp
index b30cdf91516486221fa4b51e614071f11e460405..5841606c4072788cb124ab5f0fba1f18b113e9c9 100644
--- a/src/modules/netinstall/PackageTreeItem.cpp
+++ b/src/modules/netinstall/PackageTreeItem.cpp
@@ -70,6 +70,7 @@ PackageTreeItem::PackageTreeItem( const QVariantMap& groupData, GroupTag&& paren
     , m_description( CalamaresUtils::getString( groupData, "description" ) )
     , m_preScript( CalamaresUtils::getString( groupData, "pre-install" ) )
     , m_postScript( CalamaresUtils::getString( groupData, "post-install" ) )
+    , m_source( CalamaresUtils::getString( groupData, "source" ) )
     , m_isGroup( true )
     , m_isCritical( parentCriticality( groupData, parent.parent ) )
     , m_isHidden( CalamaresUtils::getBool( groupData, "hidden", false ) )
@@ -248,6 +249,19 @@ PackageTreeItem::setChildrenSelected( Qt::CheckState isSelected )
         }
 }
 
+void
+PackageTreeItem::removeChild( int row )
+{
+    if ( 0 <= row && row < m_childItems.count() )
+    {
+        m_childItems.removeAt( row );
+    }
+    else
+    {
+        cWarning() << "Attempt to remove invalid child in removeChild() at row " << row;
+    }
+}
+
 int
 PackageTreeItem::type() const
 {
diff --git a/src/modules/netinstall/PackageTreeItem.h b/src/modules/netinstall/PackageTreeItem.h
index c04b9a21d39ec178db85eee549c64913f3330ae9..2a0fca83ecd49748d9fada3ca6763d9565560123 100644
--- a/src/modules/netinstall/PackageTreeItem.h
+++ b/src/modules/netinstall/PackageTreeItem.h
@@ -56,6 +56,7 @@ public:
     QString description() const { return m_description; }
     QString preScript() const { return m_preScript; }
     QString postScript() const { return m_postScript; }
+    QString source() const { return m_source; }
 
     /** @brief Is this item a group-item?
      *
@@ -124,6 +125,8 @@ public:
     void setSelected( Qt::CheckState isSelected );
     void setChildrenSelected( Qt::CheckState isSelected );
 
+    void removeChild( int row );
+
     /** @brief Update selectedness based on the children's states
      *
      * This only makes sense for groups, which might have packages
@@ -157,6 +160,7 @@ private:
     QString m_description;
     QString m_preScript;
     QString m_postScript;
+    QString m_source;
     bool m_isGroup = false;
     bool m_isCritical = false;
     bool m_isHidden = false;
diff --git a/src/modules/netinstall/Tests.cpp b/src/modules/netinstall/Tests.cpp
index df5d5ad60941c1f47002e9d04486c3556cc3528d..6b1db020c132daa1b2f57eec20a3fb7615e21e5c 100644
--- a/src/modules/netinstall/Tests.cpp
+++ b/src/modules/netinstall/Tests.cpp
@@ -410,7 +410,7 @@ ItemTests::testUrlFallback()
     QEventLoop loop;
     connect( &c, &Config::statusReady, &loop, &QEventLoop::quit );
     QSignalSpy spy( &c, &Config::statusReady );
-    QTimer::singleShot( std::chrono::seconds(1), &loop, &QEventLoop::quit );
+    QTimer::singleShot( std::chrono::seconds( 1 ), &loop, &QEventLoop::quit );
     loop.exec();
 
     // Check it didn't time out
diff --git a/src/modules/networkcfg/main.py b/src/modules/networkcfg/main.py
index 0ee47c1aa7005e72be7b5eab7a0e0386cab90b97..807fdf6136ea0bfac97b0a0bcae37a540e068033 100644
--- a/src/modules/networkcfg/main.py
+++ b/src/modules/networkcfg/main.py
@@ -73,12 +73,12 @@ def replace_username(nm_config_filename, live_user, target_user):
     if not os.path.exists(nm_config_filename):
         return
 
-    with open(nm_config_filename, "r") as network_conf:
+    with open(nm_config_filename, "r", encoding="UTF-8") as network_conf:
         text = network_conf.readlines()
 
     live_permissions = 'permissions=user:{}:;'.format(live_user)
     target_permissions = 'permissions=user:{}:;\n'.format(target_user)
-    with open(nm_config_filename, "w") as network_conf:
+    with open(nm_config_filename, "w", encoding="UTF-8") as network_conf:
         for line in text:
             if live_permissions in line:
                 line = target_permissions
diff --git a/src/modules/packagechooser/Config.cpp b/src/modules/packagechooser/Config.cpp
index 5c0db5d91f6474b8b3d0874209f69e7551e9b88e..491fe5c250bdf7ba4561f32fc430f078d9e45ab7 100644
--- a/src/modules/packagechooser/Config.cpp
+++ b/src/modules/packagechooser/Config.cpp
@@ -27,6 +27,29 @@
 #include "utils/Logger.h"
 #include "utils/Variant.h"
 
+/** @brief This removes any values from @p groups that match @p source
+ *
+ * This is used to remove duplicates from the netinstallAdd structure
+ * It iterates over @p groups and for each map in the list, if the
+ * "source" element matches @p source, it is removed from the returned
+ * list.
+ */
+static QVariantList
+pruneNetinstallAdd( const QString& source, const QVariant& groups )
+{
+    QVariantList newGroupList;
+    const QVariantList groupList = groups.toList();
+    for ( const QVariant& group : groupList )
+    {
+        QVariantMap groupMap = group.toMap();
+        if ( groupMap.value( "source", "" ).toString() != source )
+        {
+            newGroupList.append( groupMap );
+        }
+    }
+    return newGroupList;
+}
+
 const NamedEnumTable< PackageChooserMode >&
 packageChooserModeNames()
 {
@@ -55,6 +78,8 @@ PackageChooserMethodNames()
         { "custom", PackageChooserMethod::Legacy },
         { "contextualprocess", PackageChooserMethod::Legacy },
         { "packages", PackageChooserMethod::Packages },
+        { "netinstall-add", PackageChooserMethod::NetAdd },
+        { "netinstall-select", PackageChooserMethod::NetSelect },
     };
     return names;
 }
@@ -121,6 +146,47 @@ Config::updateGlobalStorage( const QStringList& selected ) const
         CalamaresUtils::Packages::setGSPackageAdditions(
             Calamares::JobQueue::instance()->globalStorage(), m_defaultId, packageNames );
     }
+    else if ( m_method == PackageChooserMethod::NetAdd )
+    {
+        QVariantList netinstallDataList = m_model->getNetinstallDataForNames( selected );
+        if ( netinstallDataList.isEmpty() )
+        {
+            cWarning() << "No netinstall information found for " << selected;
+        }
+        else
+        {
+            // If an earlier packagechooser instance added this data to global storage, combine them
+            auto* gs = Calamares::JobQueue::instance()->globalStorage();
+            if ( gs->contains( "netinstallAdd" ) )
+            {
+                netinstallDataList
+                    += pruneNetinstallAdd( QStringLiteral( "packageChooser" ), gs->value( "netinstallAdd" ) );
+            }
+            gs->insert( "netinstallAdd", netinstallDataList );
+        }
+    }
+    else if ( m_method == PackageChooserMethod::NetSelect )
+    {
+        cDebug() << m_defaultId << "groups to select in netinstall" << selected;
+        QStringList newSelected = selected;
+        auto* gs = Calamares::JobQueue::instance()->globalStorage();
+
+        // If an earlier packagechooser instance added this data to global storage, combine them
+        if ( gs->contains( "netinstallSelect" ) )
+        {
+            auto selectedOrig = gs->value( "netinstallSelect" );
+            if ( selectedOrig.canConvert( QVariant::StringList ) )
+            {
+                newSelected += selectedOrig.toStringList();
+            }
+            else
+            {
+                cWarning() << "Invalid NetinstallSelect data in global storage.  Earlier selections purged";
+            }
+            gs->remove( "netinstallSelect" );
+        }
+        gs->insert( "netinstallSelect", newSelected );
+    }
     else
     {
         cWarning() << "Unknown packagechooser method" << smash( m_method );
diff --git a/src/modules/packagechooser/Config.h b/src/modules/packagechooser/Config.h
index 32f1e8b572b78306e6c83f5b0743947e6368fe12..b04b1c30bdea056f677573c44da377d4ccaacae1 100644
--- a/src/modules/packagechooser/Config.h
+++ b/src/modules/packagechooser/Config.h
@@ -33,6 +33,8 @@ enum class PackageChooserMethod
 {
     Legacy,  // use contextualprocess or other custom
     Packages,  // use the packages module
+    NetAdd,  // adds packages to the netinstall module
+    NetSelect,  // makes selections in the netinstall module
 };
 
 const NamedEnumTable< PackageChooserMethod >& PackageChooserMethodNames();
diff --git a/src/modules/packagechooser/PackageModel.cpp b/src/modules/packagechooser/PackageModel.cpp
index 8a0b13e515142a425fa5f0a5c35a2e895e8d019a..f1d1184ad25f908ba7bd1471c908b6af7139ac7a 100644
--- a/src/modules/packagechooser/PackageModel.cpp
+++ b/src/modules/packagechooser/PackageModel.cpp
@@ -15,6 +15,16 @@
 
 #include <QFileInfo>
 
+/** @brief A wrapper for CalamaresUtils::getSubMap that excludes the success param
+ */
+static QVariantMap
+getSubMap( const QVariantMap& map, const QString& key )
+{
+    bool success;
+
+    return CalamaresUtils::getSubMap( map, key, success );
+}
+
 static QPixmap
 loadScreenshot( const QString& path )
 {
@@ -51,12 +61,13 @@ PackageItem::PackageItem( const QString& a_id,
 {
 }
 
-PackageItem::PackageItem::PackageItem( const QVariantMap& item_map )
+PackageItem::PackageItem( const QVariantMap& item_map )
     : id( CalamaresUtils::getString( item_map, "id" ) )
     , name( CalamaresUtils::Locale::TranslatedString( item_map, "name" ) )
     , description( CalamaresUtils::Locale::TranslatedString( item_map, "description" ) )
     , screenshot( loadScreenshot( CalamaresUtils::getString( item_map, "screenshot" ) ) )
     , packageNames( CalamaresUtils::getStringList( item_map, "packages" ) )
+    , netinstallData( getSubMap( item_map, "netinstall" ) )
 {
     if ( name.isEmpty() && id.isEmpty() )
     {
@@ -125,6 +136,25 @@ PackageListModel::getInstallPackagesForNames( const QStringList& ids ) const
     return l;
 }
 
+QVariantList
+PackageListModel::getNetinstallDataForNames( const QStringList& ids ) const
+{
+    QVariantList l;
+    for ( auto& p : m_packages )
+    {
+        if ( ids.contains( p.id ) )
+        {
+            if ( !p.netinstallData.isEmpty() )
+            {
+                QVariantMap newData = p.netinstallData;
+                newData[ "source" ] = QStringLiteral( "packageChooser" );
+                l.append( newData );
+            }
+        }
+    }
+    return l;
+}
+
 int
 PackageListModel::rowCount( const QModelIndex& index ) const
 {
diff --git a/src/modules/packagechooser/PackageModel.h b/src/modules/packagechooser/PackageModel.h
index 71003197de71bdecd00018709208ee6b1b43dab4..18682a12176aed9217a4b3d125285a264496e7b9 100644
--- a/src/modules/packagechooser/PackageModel.h
+++ b/src/modules/packagechooser/PackageModel.h
@@ -26,6 +26,7 @@ struct PackageItem
     CalamaresUtils::Locale::TranslatedString description;
     QPixmap screenshot;
     QStringList packageNames;
+    QVariantMap netinstallData;
 
     /// @brief Create blank PackageItem
     PackageItem();
@@ -111,6 +112,14 @@ public:
      */
     QStringList getInstallPackagesForNames( const QStringList& ids ) const;
 
+    /** @brief Does a name lookup (based on id) and returns the netinstall data
+     *
+     * If there is a package with an id in @p ids, returns their netinstall data
+     *
+     * returns a list of netinstall data or an emply list if none is found
+     */
+    QVariantList getNetinstallDataForNames( const QStringList& ids ) const;
+
     enum Roles : int
     {
         NameRole = Qt::DisplayRole,
diff --git a/src/modules/packagechooser/packagechooser.conf b/src/modules/packagechooser/packagechooser.conf
index 6461376bf947907ec2e16544f64b1af318f8ff2f..1fa5187aea3ab1e0eb9808cb5f8d5dbecd69f0dd 100644
--- a/src/modules/packagechooser/packagechooser.conf
+++ b/src/modules/packagechooser/packagechooser.conf
@@ -33,6 +33,15 @@ mode: required
 #   in the `exec` section. These package settings will then be handed
 #   off to whatever package manager is configured there.
 #
+# - "netinstall-select"
+#   When this is set, the id(s) selected are passed to the netinstall module.
+#   Any id that matches a group name in that module is set to checked
+#
+# - "netinstall-add"
+#   With this method, the packagechooser module is used to add groups to the
+#   netinstall module.  For this to hav=e any effect.  You must set netinstall,
+#   which is described below.
+#
 # There is no need to put this module in the `exec` section. There
 # are no jobs that this module provides. You should put **other**
 # modules, either *contextualprocess* or *packages* or some custom
@@ -101,13 +110,19 @@ labels:
 #       an additional attempt is made to load the image from the **branding**
 #       directory.
 #
-# The following field is **optional** for an item:
+# The following fields are **optional** for an item:
 #
 #  - *packages* :
 #       List of package names for the product. If using the *method*
 #       "packages", consider this item mandatory (because otherwise
 #       selecting the item would install no packages).
 #
+#  - *netinstall* :
+#       The data in this field should follow the format of a group
+#       from the netinstall module documented in
+#       src/modules/netinstall/netinstall.conf.  This is only used
+#       when method is set to "netinstall-add"
+#
 # # AppData Items #
 #
 # For data provided by AppData XML: the item has an *appdata*
diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py
index 10371777e6276b18882d2765265ca9bc51f01105..59777cedbc88dc0f2cf1bcfb7b68e21ce9a40c1f 100644
--- a/src/modules/packages/main.py
+++ b/src/modules/packages/main.py
@@ -382,7 +382,7 @@ class PMPacman(PackageManager):
 
         def line_cb(line):
             if line.startswith(":: "):
-                self.in_package_changes = "package changes" in line
+                self.in_package_changes = "package" in line or "hooks" in line
             else:
                 if self.in_package_changes and line.endswith("...\n"):
                     # Update the message, untranslated; do not change the
@@ -392,7 +392,7 @@ class PMPacman(PackageManager):
                     global custom_status_message
                     custom_status_message = "pacman: " + line.strip()
                     libcalamares.job.setprogress(self.progress_fraction)
-                    libcalamares.utils.debug(line)
+            libcalamares.utils.debug(line)
 
         self.in_package_changes = False
         self.line_cb = line_cb
@@ -444,8 +444,12 @@ class PMPacman(PackageManager):
         else:
             command.append("-S")
 
+        # Don't ask for user intervention, take the default action
         command.append("--noconfirm")
 
+        # Don't report download progress for each file
+        command.append("--noprogressbar")
+
         if self.pacman_needed_only is True:
             command.append("--needed")
 
diff --git a/src/modules/partition/Config.cpp b/src/modules/partition/Config.cpp
index 155622570a0abf5be4e82d7bcf1b56e3390d2e03..550e17460cce0d34759f592e3e056f58ce0a13a6 100644
--- a/src/modules/partition/Config.cpp
+++ b/src/modules/partition/Config.cpp
@@ -345,6 +345,11 @@ Config::setConfigurationMap( const QVariantMap& configurationMap )
     if ( !m_swapChoices.contains( m_initialSwapChoice ) )
     {
         cWarning() << "Configuration for *initialSwapChoice* is not one of the *userSwapChoices*";
+        if ( nameFound )
+        {
+            cWarning() << Logger::SubEntry << "Choice" << swapChoiceNames().find( m_initialSwapChoice ) << "added.";
+            m_swapChoices.insert( m_initialSwapChoice );
+        }
         m_initialSwapChoice = pickOne( m_swapChoices );
     }
     setSwapChoice( m_initialSwapChoice );
diff --git a/src/modules/partition/PartitionViewStep.cpp b/src/modules/partition/PartitionViewStep.cpp
index a6b5e1dd8b887fd0340fcfc54c0bff83c0bf983d..5e8bf2ef06fb9c913e7f45b76095e4368e1d9090 100644
--- a/src/modules/partition/PartitionViewStep.cpp
+++ b/src/modules/partition/PartitionViewStep.cpp
@@ -146,15 +146,12 @@ modeDescription( Config::InstallChoice choice )
     case Config::InstallChoice::Alongside:
         return QCoreApplication::translate( context, "Install %1 <strong>alongside</strong> another operating system." )
             .arg( branding->shortVersionedName() );
-        break;
     case Config::InstallChoice::Erase:
         return QCoreApplication::translate( context, "<strong>Erase</strong> disk and install %1." )
             .arg( branding->shortVersionedName() );
-        break;
     case Config::InstallChoice::Replace:
         return QCoreApplication::translate( context, "<strong>Replace</strong> a partition with %1." )
             .arg( branding->shortVersionedName() );
-        break;
     case Config::InstallChoice::NoChoice:
     case Config::InstallChoice::Manual:
         return QCoreApplication::translate( context, "<strong>Manual</strong> partitioning." );
@@ -187,21 +184,18 @@ diskDescription( int listLength, const PartitionCoreModule::SummaryInfo& info, C
                 .arg( branding->shortVersionedName() )
                 .arg( info.deviceNode )
                 .arg( info.deviceName );
-            break;
         case Config::Erase:
             return QCoreApplication::translate( context,
                                                 "<strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1." )
                 .arg( branding->shortVersionedName() )
                 .arg( info.deviceNode )
                 .arg( info.deviceName );
-            break;
         case Config::Replace:
             return QCoreApplication::translate(
                        context, "<strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1." )
                 .arg( branding->shortVersionedName() )
                 .arg( info.deviceNode )
                 .arg( info.deviceName );
-            break;
         case Config::NoChoice:
         case Config::Manual:
             return QCoreApplication::translate(
@@ -558,7 +552,7 @@ PartitionViewStep::onLeave()
             if ( !okSize )
             {
                 cDebug() << o << "ESP too small";
-                const auto atLeastBytes = PartUtils::efiFilesystemMinimumSize();
+                const qint64 atLeastBytes = static_cast< qint64 >( PartUtils::efiFilesystemMinimumSize() );
                 const auto atLeastMiB = CalamaresUtils::BytesToMiB( atLeastBytes );
                 description.append( ' ' );
                 description.append( tr( "The filesystem must be at least %1 MiB in size." ).arg( atLeastMiB ) );
@@ -681,11 +675,15 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap )
     // because it could take a while. Then when it's done, we can set up the widgets
     // and remove the spinner.
     m_future = new QFutureWatcher< void >();
-    connect( m_future, &QFutureWatcher< void >::finished, this, [this] {
-        continueLoading();
-        this->m_future->deleteLater();
-        this->m_future = nullptr;
-    } );
+    connect( m_future,
+             &QFutureWatcher< void >::finished,
+             this,
+             [ this ]
+             {
+                 continueLoading();
+                 this->m_future->deleteLater();
+                 this->m_future = nullptr;
+             } );
 
     QFuture< void > future = QtConcurrent::run( this, &PartitionViewStep::initPartitionCoreModule );
     m_future->setFuture( future );
diff --git a/src/modules/partition/core/DeviceList.cpp b/src/modules/partition/core/DeviceList.cpp
index c7de12e88757fa176127aaa5b1df51238fcaad84..adbbddd685a830060ca3d9d38108b63b29107eee 100644
--- a/src/modules/partition/core/DeviceList.cpp
+++ b/src/modules/partition/core/DeviceList.cpp
@@ -11,6 +11,7 @@
 #include "DeviceList.h"
 
 #include "partition/PartitionIterator.h"
+#include "utils/CalamaresUtilsSystem.h"
 #include "utils/Logger.h"
 
 #include <kpmcore/backend/corebackend.h>
@@ -40,16 +41,30 @@ hasRootPartition( Device* device )
     return false;
 }
 
+/** @brief Check if @p path holds an iso9660 filesystem
+ *
+ * The @p path should point to a device; blkid is used to check the FS type.
+ */
 static bool
 blkIdCheckIso9660( const QString& path )
 {
-    QProcess blkid;
-    blkid.start( "blkid", { path } );
-    blkid.waitForFinished();
-    QString output = QString::fromLocal8Bit( blkid.readAllStandardOutput() );
-    return output.contains( "iso9660" );
+    // If blkid fails, there's no output, but we don't care
+    auto r = CalamaresUtils::System::runCommand( { "blkid", path }, std::chrono::seconds( 30 ) );
+    return r.getOutput().contains( "iso9660" );
+}
+
+/// @brief Convenience to check if @p partition holds an iso9660 filesystem
+static bool
+blkIdCheckIso9660P( const Partition* partition )
+{
+    return blkIdCheckIso9660( partition->partitionPath() );
 }
 
+/** @brief Check if the @p device is an iso9660 device
+ *
+ * An iso9660 device is **probably** a CD-ROM. If the device holds an
+ * iso9660 FS, or any of its partitions do, then we call it an iso9660 device.
+ */
 static bool
 isIso9660( const Device* device )
 {
@@ -65,13 +80,8 @@ isIso9660( const Device* device )
 
     if ( device->partitionTable() && !device->partitionTable()->children().isEmpty() )
     {
-        for ( const Partition* partition : device->partitionTable()->children() )
-        {
-            if ( blkIdCheckIso9660( partition->partitionPath() ) )
-            {
-                return true;
-            }
-        }
+        const auto& p = device->partitionTable()->children();
+        return std::any_of( p.cbegin(), p.cend(), blkIdCheckIso9660P );
     }
     return false;
 }
diff --git a/src/modules/partition/core/DeviceModel.cpp b/src/modules/partition/core/DeviceModel.cpp
index 33aae20c04d3ca2510129930e2fb15e6269b37aa..6959ac9c22c449c47f4803e06a80e53040323a54 100644
--- a/src/modules/partition/core/DeviceModel.cpp
+++ b/src/modules/partition/core/DeviceModel.cpp
@@ -8,9 +8,10 @@
  *   Calamares is Free Software: see the License-Identifier above.
  *
  */
-#include "core/DeviceModel.h"
+#include "DeviceModel.h"
 
 #include "core/PartitionModel.h"
+#include "core/SizeUtils.h"
 
 #include "utils/CalamaresUtilsGui.h"
 #include "utils/Logger.h"
@@ -18,9 +19,6 @@
 // KPMcore
 #include <kpmcore/core/device.h>
 
-// KF5
-#include <KFormat>
-
 #include <QIcon>
 #include <QStandardItemModel>
 
@@ -30,9 +28,9 @@
 static void
 sortDevices( DeviceModel::DeviceList& l )
 {
-    std::sort( l.begin(), l.end(), []( const Device* dev1, const Device* dev2 ) {
-        return dev1->deviceNode() < dev2->deviceNode();
-    } );
+    std::sort( l.begin(),
+               l.end(),
+               []( const Device* dev1, const Device* dev2 ) { return dev1->deviceNode() < dev2->deviceNode(); } );
 }
 
 DeviceModel::DeviceModel( QObject* parent )
@@ -83,7 +81,7 @@ DeviceModel::data( const QModelIndex& index, int role ) const
                 //: device[name] - size[number] (device-node[name])
                 return tr( "%1 - %2 (%3)" )
                     .arg( device->name() )
-                    .arg( KFormat().formatByteSize( device->capacity() ) )
+                    .arg( formatByteSize( device->capacity() ) )
                     .arg( device->deviceNode() );
             }
             else
diff --git a/src/modules/partition/core/KPMHelpers.cpp b/src/modules/partition/core/KPMHelpers.cpp
index ed105e28b4476ff7a1a7b685aea8ea122b7b10fd..d5086ef21ef8ec84ab7a00a4105b8c0944286523 100644
--- a/src/modules/partition/core/KPMHelpers.cpp
+++ b/src/modules/partition/core/KPMHelpers.cpp
@@ -15,8 +15,8 @@
 
 #include "partition/PartitionIterator.h"
 #include "utils/Logger.h"
+#include "utils/String.h"
 
-// KPMcore
 #include <kpmcore/backend/corebackendmanager.h>
 #include <kpmcore/core/device.h>
 #include <kpmcore/core/partition.h>
@@ -127,4 +127,23 @@ clonePartition( Device* device, Partition* partition )
                           partition->activeFlags() );
 }
 
+Calamares::JobResult
+execute( Operation& operation, const QString& failureMessage )
+{
+    operation.setStatus( Operation::StatusRunning );
+
+    Report report( nullptr );
+    if ( operation.execute( report ) )
+    {
+        return Calamares::JobResult::ok();
+    }
+
+    // Remove the === lines from the report by trimming them to empty
+    QStringList l = report.toText().split( '\n' );
+    std::for_each( l.begin(), l.end(), []( QString& s ) { CalamaresUtils::removeLeading( s, '=' ); } );
+
+    return Calamares::JobResult::error( failureMessage, l.join( '\n' ) );
+}
+
+
 }  // namespace KPMHelpers
diff --git a/src/modules/partition/core/KPMHelpers.h b/src/modules/partition/core/KPMHelpers.h
index 89a019f6cfed57791dc2a42036b1df4748739e8c..2f867bc25e2c4325d9d92df1d19c9bfc90dd0517 100644
--- a/src/modules/partition/core/KPMHelpers.h
+++ b/src/modules/partition/core/KPMHelpers.h
@@ -11,11 +11,13 @@
 #ifndef KPMHELPERS_H
 #define KPMHELPERS_H
 
-// KPMcore
+#include "Job.h"
+
 #include <kpmcore/core/partitiontable.h>
 #include <kpmcore/fs/filesystem.h>
+#include <kpmcore/ops/operation.h>
+#include <kpmcore/util/report.h>
 
-// Qt
 #include <QList>
 
 #include <functional>
@@ -72,6 +74,24 @@ Partition* createNewEncryptedPartition( PartitionNode* parent,
 
 Partition* clonePartition( Device* device, Partition* partition );
 
+/** @brief Return a result for an @p operation
+ *
+ * Executes the operation, and if successful, returns a success result.
+ * Otherwise returns an error using @p failureMessage as the primary part
+ * of the error, and details obtained from the operation.
+ */
+Calamares::JobResult execute( Operation& operation, const QString& failureMessage );
+/** @brief Return a result for an @p operation
+ *
+ * It's acceptable to use an rvalue: the operation-running is the effect
+ * you're interested in, rather than keeping the temporary around.
+ */
+static inline Calamares::JobResult
+execute( Operation&& operation, const QString& failureMessage )
+{
+    return execute( operation, failureMessage );
+}
+
 }  // namespace KPMHelpers
 
 #endif /* KPMHELPERS_H */
diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp
index 507330a80b6edb4e540fa4f72892a6ccdf88a763..cb7c8a01d34df0b7c9a3c28165d19a28dbe79a49 100644
--- a/src/modules/partition/core/PartUtils.cpp
+++ b/src/modules/partition/core/PartUtils.cpp
@@ -451,6 +451,8 @@ isEfiFilesystemSuitableType( const Partition* candidate )
 {
     auto type = candidate->fileSystem().type();
 
+    QT_WARNING_PUSH
+    QT_WARNING_DISABLE_CLANG( "-Wswitch-enum" )
     switch ( type )
     {
     case FileSystem::Type::Fat32:
@@ -465,6 +467,7 @@ isEfiFilesystemSuitableType( const Partition* candidate )
         cWarning() << "EFI boot partition must be FAT32";
         return false;
     }
+    QT_WARNING_POP
 }
 
 bool
@@ -526,14 +529,15 @@ efiFilesystemMinimumSize()
 {
     using CalamaresUtils::Units::operator""_MiB;
 
-    auto uefisys_part_sizeB = 300_MiB;
+    size_t uefisys_part_sizeB = 300_MiB;
 
     // The default can be overridden; the key used here comes
     // from the partition module Config.cpp
     auto* gs = Calamares::JobQueue::instance()->globalStorage();
     if ( gs->contains( "efiSystemPartitionSize_i" ) )
     {
-        uefisys_part_sizeB = gs->value( "efiSystemPartitionSize_i" ).toLongLong();
+        qint64 v = gs->value( "efiSystemPartitionSize_i" ).toLongLong();
+        uefisys_part_sizeB = v > 0 ? static_cast< size_t >( v ) : 0;
     }
     // There is a lower limit of what can be configured
     if ( uefisys_part_sizeB < 32_MiB )
diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp
index 8514bbe2cdc1cff9b9f13698a950b2a676cefc25..a56446a391c0319782cc54b5adeee1c1dd761525 100644
--- a/src/modules/partition/core/PartitionActions.cpp
+++ b/src/modules/partition/core/PartitionActions.cpp
@@ -71,15 +71,15 @@ swapSuggestion( const qint64 availableSpaceB, Config::SwapChoice swap )
 
 
     // Allow for a fudge factor
-    suggestedSwapSizeB *= overestimationFactor;
+    suggestedSwapSizeB = qRound64( suggestedSwapSizeB * overestimationFactor );
 
     // don't use more than 10% of available space
     if ( !ensureSuspendToDisk )
     {
-        suggestedSwapSizeB = qMin( suggestedSwapSizeB, qint64( 0.10 * availableSpaceB ) );
+        suggestedSwapSizeB = qMin( suggestedSwapSizeB, availableSpaceB / 10 /* 10% is 0.1 */ );
     }
 
-    cDebug() << "Suggested swap size:" << suggestedSwapSizeB / 1024. / 1024. / 1024. << "GiB";
+    cDebug() << "Suggested swap size:" << CalamaresUtils::BytesToGiB( suggestedSwapSizeB ) << "GiB";
 
     return suggestedSwapSizeB;
 }
diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp
index 16e5a7ea17eb337e0e2e783b4cceda4cdd4a1d28..989327ef0412341cace123fb911dd36cc6d6e3fa 100644
--- a/src/modules/partition/core/PartitionCoreModule.cpp
+++ b/src/modules/partition/core/PartitionCoreModule.cpp
@@ -262,11 +262,9 @@ PartitionCoreModule::doInit()
             // Gives ownership of the Device* to the DeviceInfo object
             auto deviceInfo = new DeviceInfo( device );
             m_deviceInfos << deviceInfo;
-            cDebug() << Logger::SubEntry
-                << device->deviceNode()
-                << device->capacity()
-                << Logger::RedactedName( "DevName", device->name() )
-                << Logger::RedactedName( "DevNamePretty", device->prettyName() );
+            cDebug() << Logger::SubEntry << device->deviceNode() << device->capacity()
+                     << Logger::RedactedName( "DevName", device->name() )
+                     << Logger::RedactedName( "DevNamePretty", device->prettyName() );
         }
         else
         {
@@ -685,9 +683,8 @@ PartitionCoreModule::lvmPVs() const
 bool
 PartitionCoreModule::hasVGwithThisName( const QString& name ) const
 {
-    auto condition = [name]( DeviceInfo* d ) {
-        return dynamic_cast< LvmDevice* >( d->device.data() ) && d->device.data()->name() == name;
-    };
+    auto condition = [ name ]( DeviceInfo* d )
+    { return dynamic_cast< LvmDevice* >( d->device.data() ) && d->device.data()->name() == name; };
 
     return std::find_if( m_deviceInfos.begin(), m_deviceInfos.end(), condition ) != m_deviceInfos.end();
 }
@@ -695,7 +692,8 @@ PartitionCoreModule::hasVGwithThisName( const QString& name ) const
 bool
 PartitionCoreModule::isInVG( const Partition* partition ) const
 {
-    auto condition = [partition]( DeviceInfo* d ) {
+    auto condition = [ partition ]( DeviceInfo* d )
+    {
         LvmDevice* vg = dynamic_cast< LvmDevice* >( d->device.data() );
         return vg && vg->physicalVolumes().contains( partition );
     };
@@ -964,9 +962,9 @@ PartitionCoreModule::layoutApply( Device* dev,
     const QString boot = QStringLiteral( "/boot" );
     const QString root = QStringLiteral( "/" );
     const auto is_boot
-        = [&]( Partition* p ) -> bool { return PartitionInfo::mountPoint( p ) == boot || p->mountPoint() == boot; };
+        = [ & ]( Partition* p ) -> bool { return PartitionInfo::mountPoint( p ) == boot || p->mountPoint() == boot; };
     const auto is_root
-        = [&]( Partition* p ) -> bool { return PartitionInfo::mountPoint( p ) == root || p->mountPoint() == root; };
+        = [ & ]( Partition* p ) -> bool { return PartitionInfo::mountPoint( p ) == root || p->mountPoint() == root; };
 
     const bool separate_boot_partition
         = std::find_if( partList.constBegin(), partList.constEnd(), is_boot ) != partList.constEnd();
@@ -1089,10 +1087,14 @@ void
 PartitionCoreModule::asyncRevertDevice( Device* dev, std::function< void() > callback )
 {
     QFutureWatcher< void >* watcher = new QFutureWatcher< void >();
-    connect( watcher, &QFutureWatcher< void >::finished, this, [watcher, callback] {
-        callback();
-        watcher->deleteLater();
-    } );
+    connect( watcher,
+             &QFutureWatcher< void >::finished,
+             this,
+             [ watcher, callback ]
+             {
+                 callback();
+                 watcher->deleteLater();
+             } );
 
     QFuture< void > future = QtConcurrent::run( this, &PartitionCoreModule::revertDevice, dev, true );
     watcher->setFuture( future );
diff --git a/src/modules/partition/core/PartitionLayout.cpp b/src/modules/partition/core/PartitionLayout.cpp
index f60952643fd2d31866d604f1c4173dd5be18ffb0..765d9fffa7888f4e8ec66f9a3bc73280b82a67a7 100644
--- a/src/modules/partition/core/PartitionLayout.cpp
+++ b/src/modules/partition/core/PartitionLayout.cpp
@@ -141,6 +141,8 @@ void
 PartitionLayout::setDefaultFsType( FileSystem::Type defaultFsType )
 {
     using FileSystem = FileSystem::Type;
+    QT_WARNING_PUSH
+    QT_WARNING_DISABLE_CLANG( "-Wswitch-enum" )
     switch ( defaultFsType )
     {
     case FileSystem::Unknown:
@@ -196,6 +198,7 @@ PartitionLayout::setDefaultFsType( FileSystem::Type defaultFsType )
                    << "Using ext4 instead.";
         defaultFsType = FileSystem::Ext4;
     }
+    QT_WARNING_POP
 
     m_defaultFsType = defaultFsType;
 }
@@ -280,7 +283,7 @@ PartitionLayout::createPartitions( Device* dev,
         }
     }
 
-    auto correctFS = [d = m_defaultFsType]( FileSystem::Type t ) { return t == FileSystem::Type::Unknown ? d : t; };
+    auto correctFS = [ d = m_defaultFsType ]( FileSystem::Type t ) { return t == FileSystem::Type::Unknown ? d : t; };
 
     // Create the partitions.
     currentSector = firstSector;
diff --git a/src/modules/partition/core/PartitionModel.cpp b/src/modules/partition/core/PartitionModel.cpp
index e310eee5e153d37ee4b61a22ff53de87ae689cb9..19dbcd0763879ffa651a64465180d61e9a59a086 100644
--- a/src/modules/partition/core/PartitionModel.cpp
+++ b/src/modules/partition/core/PartitionModel.cpp
@@ -8,11 +8,12 @@
  *
  */
 
-#include "core/PartitionModel.h"
+#include "PartitionModel.h"
 
 #include "core/ColorUtils.h"
 #include "core/KPMHelpers.h"
 #include "core/PartitionInfo.h"
+#include "core/SizeUtils.h"
 
 #include "partition/FileSystem.h"
 #include "partition/PartitionQuery.h"
@@ -24,9 +25,6 @@
 #include <kpmcore/core/partitiontable.h>
 #include <kpmcore/fs/filesystem.h>
 
-// KF5
-#include <KFormat>
-
 // Qt
 #include <QColor>
 
@@ -178,7 +176,7 @@ PartitionModel::data( const QModelIndex& index, int role ) const
         if ( col == SizeColumn )
         {
             qint64 size = ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSize();
-            return KFormat().formatByteSize( size );
+            return formatByteSize( size );
         }
         cDebug() << "Unknown column" << col;
         return QVariant();
@@ -210,7 +208,7 @@ PartitionModel::data( const QModelIndex& index, int role ) const
         QString prettyFileSystem
             = CalamaresUtils::Partition::prettyNameForFileSystemType( partition->fileSystem().type() );
         qint64 size = ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSize();
-        QString prettySize = KFormat().formatByteSize( size );
+        QString prettySize = formatByteSize( size );
         return QVariant( name + " " + prettyFileSystem + " " + prettySize );
     }
     case SizeRole:
diff --git a/src/modules/partition/core/SizeUtils.h b/src/modules/partition/core/SizeUtils.h
new file mode 100644
index 0000000000000000000000000000000000000000..155cbd92397b1c74dd57752720e97f512a3c450a
--- /dev/null
+++ b/src/modules/partition/core/SizeUtils.h
@@ -0,0 +1,28 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *   SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
+ *   SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ *   Calamares is Free Software: see the License-Identifier above.
+ *
+ */
+
+#ifndef PARTITION_CORE_SIZEUTILS_H
+#define PARTITION_CORE_SIZEUTILS_H
+
+#include <kpmcore/util/capacity.h>
+
+/** @brief Helper function for printing sizes consistently.
+ *
+ * Most of Calamares uses a qint64 for partition sizes, so use that
+ * parameter type. However, the human-visible formatting doesn't need
+ * to bother with one-byte accuracy (and anyway, a double has at least 50 bits
+ * at which point we're printing giga (or gibi) bytes).
+ */
+static inline QString
+formatByteSize( qint64 sizeValue )
+{
+    return Capacity::formatByteSize( static_cast< double >( sizeValue ) );
+}
+
+#endif  // PARTITION_CORE_SIZEUTILS_H
diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp
index 9226eb3b633ecf15e1e109a5349a5e39bd060001..588c1b6437e919e8d5a1433b828f90a07a610dd0 100644
--- a/src/modules/partition/gui/ChoicePage.cpp
+++ b/src/modules/partition/gui/ChoicePage.cpp
@@ -176,10 +176,14 @@ ChoicePage::init( PartitionCoreModule* core )
 
 
     // We need to do this because a PCM revert invalidates the deviceModel.
-    connect( core, &PartitionCoreModule::reverted, this, [=] {
-        setModelToComboBox( m_drivesCombo, core->deviceModel() );
-        m_drivesCombo->setCurrentIndex( m_lastSelectedDeviceIndex );
-    } );
+    connect( core,
+             &PartitionCoreModule::reverted,
+             this,
+             [ = ]
+             {
+                 setModelToComboBox( m_drivesCombo, core->deviceModel() );
+                 m_drivesCombo->setCurrentIndex( m_lastSelectedDeviceIndex );
+             } );
     setModelToComboBox( m_drivesCombo, core->deviceModel() );
 
     connect( m_drivesCombo, qOverload< int >( &QComboBox::currentIndexChanged ), this, &ChoicePage::applyDeviceChoice );
@@ -303,26 +307,30 @@ ChoicePage::setupChoices()
 #else
     auto buttonSignal = &QButtonGroup::idToggled;
 #endif
-    connect( m_grp, buttonSignal, this, [this]( int id, bool checked ) {
-        if ( checked )  // An action was picked.
-        {
-            m_config->setInstallChoice( id );
-            updateNextEnabled();
-
-            Q_EMIT actionChosen();
-        }
-        else  // An action was unpicked, either on its own or because of another selection.
-        {
-            if ( m_grp->checkedButton() == nullptr )  // If no other action is chosen, we must
-            {
-                // set m_choice to NoChoice and reset previews.
-                m_config->setInstallChoice( InstallChoice::NoChoice );
-                updateNextEnabled();
-
-                Q_EMIT actionChosen();
-            }
-        }
-    } );
+    connect( m_grp,
+             buttonSignal,
+             this,
+             [ this ]( int id, bool checked )
+             {
+                 if ( checked )  // An action was picked.
+                 {
+                     m_config->setInstallChoice( id );
+                     updateNextEnabled();
+
+                     Q_EMIT actionChosen();
+                 }
+                 else  // An action was unpicked, either on its own or because of another selection.
+                 {
+                     if ( m_grp->checkedButton() == nullptr )  // If no other action is chosen, we must
+                     {
+                         // set m_choice to NoChoice and reset previews.
+                         m_config->setInstallChoice( InstallChoice::NoChoice );
+                         updateNextEnabled();
+
+                         Q_EMIT actionChosen();
+                     }
+                 }
+             } );
 
     m_rightLayout->setStretchFactor( m_itemsLayout, 1 );
     m_rightLayout->setStretchFactor( m_previewBeforeFrame, 0 );
@@ -401,11 +409,13 @@ ChoicePage::applyDeviceChoice()
     if ( m_core->isDirty() )
     {
         ScanningDialog::run(
-            QtConcurrent::run( [=] {
-                QMutexLocker locker( &m_coreMutex );
-                m_core->revertAllDevices();
-            } ),
-            [this] { continueApplyDeviceChoice(); },
+            QtConcurrent::run(
+                [ = ]
+                {
+                    QMutexLocker locker( &m_coreMutex );
+                    m_core->revertAllDevices();
+                } ),
+            [ this ] { continueApplyDeviceChoice(); },
             this );
     }
     else
@@ -493,11 +503,14 @@ ChoicePage::applyActionChoice( InstallChoice choice )
         if ( m_core->isDirty() )
         {
             ScanningDialog::run(
-                QtConcurrent::run( [=] {
-                    QMutexLocker locker( &m_coreMutex );
-                    m_core->revertDevice( selectedDevice() );
-                } ),
-                [=] {
+                QtConcurrent::run(
+                    [ = ]
+                    {
+                        QMutexLocker locker( &m_coreMutex );
+                        m_core->revertDevice( selectedDevice() );
+                    } ),
+                [ = ]
+                {
                     PartitionActions::doAutopartition( m_core, selectedDevice(), options );
                     Q_EMIT deviceChosen();
                 },
@@ -514,10 +527,12 @@ ChoicePage::applyActionChoice( InstallChoice choice )
         if ( m_core->isDirty() )
         {
             ScanningDialog::run(
-                QtConcurrent::run( [=] {
-                    QMutexLocker locker( &m_coreMutex );
-                    m_core->revertDevice( selectedDevice() );
-                } ),
+                QtConcurrent::run(
+                    [ = ]
+                    {
+                        QMutexLocker locker( &m_coreMutex );
+                        m_core->revertDevice( selectedDevice() );
+                    } ),
                 [] {},
                 this );
         }
@@ -532,11 +547,14 @@ ChoicePage::applyActionChoice( InstallChoice choice )
         if ( m_core->isDirty() )
         {
             ScanningDialog::run(
-                QtConcurrent::run( [=] {
-                    QMutexLocker locker( &m_coreMutex );
-                    m_core->revertDevice( selectedDevice() );
-                } ),
-                [this] {
+                QtConcurrent::run(
+                    [ = ]
+                    {
+                        QMutexLocker locker( &m_coreMutex );
+                        m_core->revertDevice( selectedDevice() );
+                    } ),
+                [ this ]
+                {
                     // We need to reupdate after reverting because the splitter widget is
                     // not a true view.
                     updateActionChoicePreview( m_config->installChoice() );
@@ -772,7 +790,8 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current )
 
     ScanningDialog::run(
         QtConcurrent::run(
-            [this, current, homePartitionPath]( bool doReuseHomePartition ) {
+            [ this, current, homePartitionPath ]( bool doReuseHomePartition )
+            {
                 QMutexLocker locker( &m_coreMutex );
 
                 if ( m_core->isDirty() )
@@ -853,7 +872,8 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current )
                 }
             },
             m_reuseHomeCheckBox->isChecked() ),
-        [this, homePartitionPath] {
+        [ this, homePartitionPath ]
+        {
             m_reuseHomeCheckBox->setVisible( !homePartitionPath->isEmpty() );
             if ( !homePartitionPath->isEmpty() )
                 m_reuseHomeCheckBox->setText( tr( "Reuse %1 as home partition for %2." )
@@ -1006,7 +1026,8 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice )
         connect( m_afterPartitionSplitterWidget,
                  &PartitionSplitterWidget::partitionResized,
                  this,
-                 [this, sizeLabel]( const QString& path, qint64 size, qint64 sizeNext ) {
+                 [ this, sizeLabel ]( const QString& path, qint64 size, qint64 sizeNext )
+                 {
                      Q_UNUSED( path )
                      sizeLabel->setText(
                          tr( "%1 will be shrunk to %2MiB and a new "
@@ -1020,7 +1041,8 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice )
         m_previewAfterFrame->show();
         m_previewAfterLabel->show();
 
-        SelectionFilter filter = []( const QModelIndex& index ) {
+        SelectionFilter filter = []( const QModelIndex& index )
+        {
             return PartUtils::canBeResized(
                 static_cast< Partition* >( index.data( PartitionModel::PartitionPtrRole ).value< void* >() ),
                 Logger::Once() );
@@ -1069,17 +1091,22 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice )
             eraseBootloaderLabel->setText( tr( "Boot loader location:" ) );
 
             m_bootloaderComboBox = createBootloaderComboBox( eraseWidget );
-            connect( m_core->bootLoaderModel(), &QAbstractItemModel::modelReset, [this]() {
-                if ( !m_bootloaderComboBox.isNull() )
-                {
-                    Calamares::restoreSelectedBootLoader( *m_bootloaderComboBox, m_core->bootLoaderInstallPath() );
-                }
-            } );
+            connect( m_core->bootLoaderModel(),
+                     &QAbstractItemModel::modelReset,
+                     [ this ]()
+                     {
+                         if ( !m_bootloaderComboBox.isNull() )
+                         {
+                             Calamares::restoreSelectedBootLoader( *m_bootloaderComboBox,
+                                                                   m_core->bootLoaderInstallPath() );
+                         }
+                     } );
             connect(
                 m_core,
                 &PartitionCoreModule::deviceReverted,
                 this,
-                [this]( Device* dev ) {
+                [ this ]( Device* dev )
+                {
                     Q_UNUSED( dev )
                     if ( !m_bootloaderComboBox.isNull() )
                     {
@@ -1110,7 +1137,8 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice )
         }
         else
         {
-            SelectionFilter filter = []( const QModelIndex& index ) {
+            SelectionFilter filter = []( const QModelIndex& index )
+            {
                 return PartUtils::canBeReplaced(
                     static_cast< Partition* >( index.data( PartitionModel::PartitionPtrRole ).value< void* >() ),
                     Logger::Once() );
@@ -1217,18 +1245,22 @@ ChoicePage::createBootloaderComboBox( QWidget* parent )
     comboForBootloader->setModel( m_core->bootLoaderModel() );
 
     // When the chosen bootloader device changes, we update the choice in the PCM
-    connect( comboForBootloader, QOverload< int >::of( &QComboBox::currentIndexChanged ), this, [this]( int newIndex ) {
-        QComboBox* bootloaderCombo = qobject_cast< QComboBox* >( sender() );
-        if ( bootloaderCombo )
-        {
-            QVariant var = bootloaderCombo->itemData( newIndex, BootLoaderModel::BootLoaderPathRole );
-            if ( !var.isValid() )
-            {
-                return;
-            }
-            m_core->setBootLoaderInstallPath( var.toString() );
-        }
-    } );
+    connect( comboForBootloader,
+             QOverload< int >::of( &QComboBox::currentIndexChanged ),
+             this,
+             [ this ]( int newIndex )
+             {
+                 QComboBox* bootloaderCombo = qobject_cast< QComboBox* >( sender() );
+                 if ( bootloaderCombo )
+                 {
+                     QVariant var = bootloaderCombo->itemData( newIndex, BootLoaderModel::BootLoaderPathRole );
+                     if ( !var.isValid() )
+                     {
+                         return;
+                     }
+                     m_core->setBootLoaderInstallPath( var.toString() );
+                 }
+             } );
 
     return comboForBootloader;
 }
diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp
index 6bde9a1484dc5590d0ef2b87d07024bff19ac655..c5b17c69e0c27cdb34ad6f2cb93babfdd2334234 100644
--- a/src/modules/partition/gui/CreatePartitionDialog.cpp
+++ b/src/modules/partition/gui/CreatePartitionDialog.cpp
@@ -325,16 +325,10 @@ CreatePartitionDialog::updateMountPointUi()
 void
 CreatePartitionDialog::checkMountPointSelection()
 {
-    if ( m_usedMountPoints.contains( selectedMountPoint( m_ui->mountPointComboBox ) ) )
-    {
-        m_ui->labelMountPoint->setText( tr( "Mountpoint already in use. Please select another one." ) );
-        m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( false );
-    }
-    else
-    {
-        m_ui->labelMountPoint->setText( QString() );
-        m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( true );
-    }
+    validateMountPoint( selectedMountPoint( m_ui->mountPointComboBox ),
+                        m_usedMountPoints,
+                        m_ui->mountPointExplanation,
+                        m_ui->buttonBox->button( QDialogButtonBox::Ok ) );
 }
 
 void
diff --git a/src/modules/partition/gui/CreatePartitionDialog.ui b/src/modules/partition/gui/CreatePartitionDialog.ui
index dad932101d0c9b78dc75fa9ca816a794a163fb4a..0ee715fe05dc0a3d495f6252bd18f26f87dc6aa3 100644
--- a/src/modules/partition/gui/CreatePartitionDialog.ui
+++ b/src/modules/partition/gui/CreatePartitionDialog.ui
@@ -68,7 +68,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
        <item>
         <widget class="QRadioButton" name="primaryRadioButton">
          <property name="text">
-          <string>&amp;Primary</string>
+          <string>Primar&amp;y</string>
          </property>
          <property name="checked">
           <bool>true</bool>
@@ -171,6 +171,12 @@ SPDX-License-Identifier: GPL-3.0-or-later
      </item>
      <item row="8" column="1">
       <widget class="QComboBox" name="mountPointComboBox">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
        <property name="editable">
         <bool>true</bool>
        </property>
@@ -179,21 +185,14 @@ SPDX-License-Identifier: GPL-3.0-or-later
        </property>
       </widget>
      </item>
-     <item row="10" column="1">
-      <widget class="QLabel" name="labelMountPoint">
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-     <item row="11" column="0">
+     <item row="12" column="0">
       <widget class="QLabel" name="label_3">
        <property name="text">
         <string>Flags:</string>
        </property>
       </widget>
      </item>
-     <item row="11" column="1">
+     <item row="12" column="1">
       <widget class="QListWidget" name="m_listFlags">
        <property name="alternatingRowColors">
         <bool>true</bool>
@@ -206,7 +205,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
        </property>
       </widget>
      </item>
-     <item row="12" column="0">
+     <item row="13" column="0">
       <spacer name="verticalSpacer">
        <property name="orientation">
         <enum>Qt::Vertical</enum>
@@ -219,14 +218,8 @@ SPDX-License-Identifier: GPL-3.0-or-later
        </property>
       </spacer>
      </item>
-     <item row="9" column="1">
+     <item row="10" column="1">
       <widget class="QLineEdit" name="filesystemLabelEdit">
-       <property name="maximumSize">
-        <size>
-         <width>150</width>
-         <height>16777215</height>
-        </size>
-       </property>
        <property name="toolTip">
         <string>Label for the filesystem</string>
        </property>
@@ -235,13 +228,20 @@ SPDX-License-Identifier: GPL-3.0-or-later
        </property>
       </widget>
      </item>
-     <item row="9" column="0">
+     <item row="10" column="0">
       <widget class="QLabel" name="label_4">
        <property name="text">
         <string>FS Label:</string>
        </property>
       </widget>
      </item>
+     <item row="9" column="1">
+      <widget class="QLabel" name="mountPointExplanation">
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
    <item>
diff --git a/src/modules/partition/gui/DeviceInfoWidget.cpp b/src/modules/partition/gui/DeviceInfoWidget.cpp
index bbc8ce74ce0bf5a18d8ca9dfbbf13e6d6976ee9a..39d9413e149e88c34f2ae7d9ea85e28948a3140b 100644
--- a/src/modules/partition/gui/DeviceInfoWidget.cpp
+++ b/src/modules/partition/gui/DeviceInfoWidget.cpp
@@ -68,7 +68,8 @@ DeviceInfoWidget::setPartitionTableType( PartitionTable::TableType type )
 void
 DeviceInfoWidget::retranslateUi()
 {
-    QString typeString = PartitionTable::tableTypeToName( m_tableType ).toUpper();
+    QString typeString;
+    QString toolTipString;
 
     // fix up if the name shouldn't be uppercase:
     switch ( m_tableType )
@@ -76,38 +77,34 @@ DeviceInfoWidget::retranslateUi()
     case PartitionTable::msdos:
     case PartitionTable::msdos_sectorbased:
         typeString = "MBR";
+        toolTipString += tr( "<br><br>This partition table type is only advisable on older "
+                             "systems which start from a <strong>BIOS</strong> boot "
+                             "environment. GPT is recommended in most other cases.<br><br>"
+                             "<strong>Warning:</strong> the MBR partition table "
+                             "is an obsolete MS-DOS era standard.<br>"
+                             "Only 4 <em>primary</em> partitions may be created, and of "
+                             "those 4, one can be an <em>extended</em> partition, which "
+                             "may in turn contain many <em>logical</em> partitions." );
         break;
-    case PartitionTable::loop:
-        typeString = "loop";
-        break;
-    case PartitionTable::mac:
-        typeString = "Mac";
-        break;
-    case PartitionTable::amiga:
-        typeString = "Amiga";
-        break;
-    case PartitionTable::sun:
-        typeString = "Sun";
+    case PartitionTable::gpt:
+        // TypeString is ok
+        toolTipString += tr( "<br><br>This is the recommended partition table type for modern "
+                             "systems which start from an <strong>EFI</strong> boot "
+                             "environment." );
         break;
-    case PartitionTable::unknownTableType:
-        typeString = " ? ";
-    }
-
-
-    QString toolTipString = tr( "This device has a <strong>%1</strong> partition "
-                                "table." )
-                                .arg( typeString );
-
-    switch ( m_tableType )
-    {
     case PartitionTable::loop:
+        typeString = "loop";
         toolTipString = tr( "This is a <strong>loop</strong> "
                             "device.<br><br>"
                             "It is a pseudo-device with no partition table "
                             "that makes a file accessible as a block device. "
                             "This kind of setup usually only contains a single filesystem." );
         break;
+#if defined( WITH_KPMCORE42API )
+    case PartitionTable::none:
+#endif
     case PartitionTable::unknownTableType:
+        typeString = " ? ";
         toolTipString = tr( "This installer <strong>cannot detect a partition table</strong> on the "
                             "selected storage device.<br><br>"
                             "The device either has no partition "
@@ -117,21 +114,35 @@ DeviceInfoWidget::retranslateUi()
                             "either automatically, or through the manual partitioning "
                             "page." );
         break;
-    case PartitionTable::gpt:
-        toolTipString += tr( "<br><br>This is the recommended partition table type for modern "
-                             "systems which start from an <strong>EFI</strong> boot "
-                             "environment." );
+    // The next ones need to have the name adjusted, but the default tooltip is OK
+    case PartitionTable::mac:
+        typeString = "Mac";
         break;
-    case PartitionTable::msdos:
-    case PartitionTable::msdos_sectorbased:
-        toolTipString += tr( "<br><br>This partition table type is only advisable on older "
-                             "systems which start from a <strong>BIOS</strong> boot "
-                             "environment. GPT is recommended in most other cases.<br><br>"
-                             "<strong>Warning:</strong> the MBR partition table "
-                             "is an obsolete MS-DOS era standard.<br>"
-                             "Only 4 <em>primary</em> partitions may be created, and of "
-                             "those 4, one can be an <em>extended</em> partition, which "
-                             "may in turn contain many <em>logical</em> partitions." );
+    case PartitionTable::amiga:
+        typeString = "Amiga";
+        break;
+    case PartitionTable::sun:
+        typeString = "Sun";
+        break;
+    // Peculiar tables, do nothing and use default type and tooltip strings
+    case PartitionTable::aix:
+    case PartitionTable::bsd:
+    case PartitionTable::dasd:
+    case PartitionTable::dvh:
+    case PartitionTable::pc98:
+    case PartitionTable::vmd:
+        break;
+    }
+
+    if ( typeString.isEmpty() )
+    {
+        typeString = PartitionTable::tableTypeToName( m_tableType ).toUpper();
+    }
+    if ( toolTipString.isEmpty() )
+    {
+        toolTipString = tr( "This device has a <strong>%1</strong> partition "
+                            "table." )
+                            .arg( typeString );
     }
 
     m_ptLabel->setText( typeString );
diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp
index a3052b3b7b37f10d08e9ed665ae16ff2034fec3c..0bc35cabe861bbaba5ca0540def6006c2b41387e 100644
--- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp
+++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp
@@ -69,22 +69,25 @@ EditExistingPartitionDialog::EditExistingPartitionDialog( Device* device,
 
     replacePartResizerWidget();
 
-    connect( m_ui->formatRadioButton, &QAbstractButton::toggled, [this]( bool doFormat ) {
-        replacePartResizerWidget();
+    connect( m_ui->formatRadioButton,
+             &QAbstractButton::toggled,
+             [ this ]( bool doFormat )
+             {
+                 replacePartResizerWidget();
 
-        m_ui->fileSystemLabel->setEnabled( doFormat );
-        m_ui->fileSystemComboBox->setEnabled( doFormat );
+                 m_ui->fileSystemLabel->setEnabled( doFormat );
+                 m_ui->fileSystemComboBox->setEnabled( doFormat );
 
-        if ( !doFormat )
-        {
-            m_ui->fileSystemComboBox->setCurrentText( userVisibleFS( m_partition->fileSystem() ) );
-        }
+                 if ( !doFormat )
+                 {
+                     m_ui->fileSystemComboBox->setCurrentText( userVisibleFS( m_partition->fileSystem() ) );
+                 }
 
-        updateMountPointPicker();
-    } );
+                 updateMountPointPicker();
+             } );
 
     connect(
-        m_ui->fileSystemComboBox, &QComboBox::currentTextChanged, [this]( QString ) { updateMountPointPicker(); } );
+        m_ui->fileSystemComboBox, &QComboBox::currentTextChanged, [ this ]( QString ) { updateMountPointPicker(); } );
 
     // File system
     QStringList fsNames;
@@ -295,14 +298,8 @@ EditExistingPartitionDialog::updateMountPointPicker()
 void
 EditExistingPartitionDialog::checkMountPointSelection()
 {
-    if ( m_usedMountPoints.contains( selectedMountPoint( m_ui->mountPointComboBox ) ) )
-    {
-        m_ui->labelMountPoint->setText( tr( "Mountpoint already in use. Please select another one." ) );
-        m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( false );
-    }
-    else
-    {
-        m_ui->labelMountPoint->setText( QString() );
-        m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( true );
-    }
+    validateMountPoint( selectedMountPoint( m_ui->mountPointComboBox ),
+                        m_usedMountPoints,
+                        m_ui->mountPointExplanation,
+                        m_ui->buttonBox->button( QDialogButtonBox::Ok ) );
 }
diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.ui b/src/modules/partition/gui/EditExistingPartitionDialog.ui
index 7599bc77202b8b01f433a6252da47f601ae3b270..4a9982656532266d9ef959d70353a1e8663aba1c 100644
--- a/src/modules/partition/gui/EditExistingPartitionDialog.ui
+++ b/src/modules/partition/gui/EditExistingPartitionDialog.ui
@@ -51,7 +51,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
      <item row="2" column="0">
       <widget class="QLabel" name="label_3">
        <property name="text">
-        <string>Content:</string>
+        <string>Con&amp;tent:</string>
        </property>
        <property name="buddy">
         <cstring>keepRadioButton</cstring>
@@ -109,6 +109,12 @@ SPDX-License-Identifier: GPL-3.0-or-later
      </item>
      <item row="6" column="1">
       <widget class="QComboBox" name="mountPointComboBox">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
        <property name="editable">
         <bool>true</bool>
        </property>
@@ -147,14 +153,14 @@ SPDX-License-Identifier: GPL-3.0-or-later
      <item row="5" column="1">
       <widget class="QComboBox" name="fileSystemComboBox"/>
      </item>
-     <item row="9" column="0">
+     <item row="10" column="0">
       <widget class="QLabel" name="label_4">
        <property name="text">
         <string>Flags:</string>
        </property>
       </widget>
      </item>
-     <item row="9" column="1">
+     <item row="10" column="1">
       <widget class="QListWidget" name="m_listFlags">
        <property name="alternatingRowColors">
         <bool>true</bool>
@@ -168,20 +174,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
       </widget>
      </item>
      <item row="8" column="1">
-      <widget class="QLabel" name="labelMountPoint">
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-     <item row="7" column="1">
       <widget class="QLineEdit" name="fileSystemLabelEdit">
-       <property name="maximumSize">
-        <size>
-         <width>150</width>
-         <height>16777215</height>
-        </size>
-       </property>
        <property name="toolTip">
         <string>Label for the filesystem</string>
        </property>
@@ -190,13 +183,20 @@ SPDX-License-Identifier: GPL-3.0-or-later
        </property>
       </widget>
      </item>
-     <item row="7" column="0">
+     <item row="8" column="0">
       <widget class="QLabel" name="fileSystemLabelLabel">
        <property name="text">
         <string>FS Label:</string>
        </property>
       </widget>
      </item>
+     <item row="7" column="1">
+      <widget class="QLabel" name="mountPointExplanation">
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
    <item>
diff --git a/src/modules/partition/gui/EncryptWidget.cpp b/src/modules/partition/gui/EncryptWidget.cpp
index ee50e7d6642b8a695a19b77b56012cd9b219bbdc..fe76230509b4cb5952634280391afc4111954150 100644
--- a/src/modules/partition/gui/EncryptWidget.cpp
+++ b/src/modules/partition/gui/EncryptWidget.cpp
@@ -13,9 +13,27 @@
 
 #include "ui_EncryptWidget.h"
 
+#include "Branding.h"
 #include "utils/CalamaresUtilsGui.h"
 #include "utils/Retranslator.h"
 
+/** @brief Does this system support whole-disk encryption?
+ *
+ * Returns @c true if the system is likely to support encryption
+ * with sufficient performance to be usable. A machine that can't
+ * doe hardware-assisted AES is **probably** too slow, so we could
+ * warn the user that ticking the "encrypt system" box is a bad
+ * idea.
+ *
+ * Since we don't have an oracle that can answer that question,
+ * just pretend every system can do it.
+ */
+static inline bool
+systemSupportsEncryptionAcceptably()
+{
+    return true;
+}
+
 EncryptWidget::EncryptWidget( QWidget* parent )
     : QWidget( parent )
     , m_ui( new Ui::EncryptWidget )
@@ -27,6 +45,18 @@ EncryptWidget::EncryptWidget( QWidget* parent )
     m_ui->m_passphraseLineEdit->hide();
     m_ui->m_confirmLineEdit->hide();
     m_ui->m_iconLabel->hide();
+    // TODO: this deserves better rendering, an icon or something, but that will
+    //       depend on having a non-bogus implementation of systemSupportsEncryptionAcceptably
+    if ( systemSupportsEncryptionAcceptably() )
+    {
+        m_ui->m_encryptionUnsupportedLabel->hide();
+    }
+    else
+    {
+        // This is really ugly, but the character is unicode "unlocked"
+        m_ui->m_encryptionUnsupportedLabel->setText( QStringLiteral( "🔓" ) );
+        m_ui->m_encryptionUnsupportedLabel->show();
+    }
 
     connect( m_ui->m_encryptCheckBox, &QCheckBox::stateChanged, this, &EncryptWidget::onCheckBoxStateChanged );
     connect( m_ui->m_passphraseLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited );
diff --git a/src/modules/partition/gui/EncryptWidget.ui b/src/modules/partition/gui/EncryptWidget.ui
index 212300291f4fe1a4e80198a60b03cd5b2fd34d26..a629163d39b2f9c1c2107cfa304f85b511549c3b 100644
--- a/src/modules/partition/gui/EncryptWidget.ui
+++ b/src/modules/partition/gui/EncryptWidget.ui
@@ -37,6 +37,19 @@ SPDX-License-Identifier: GPL-3.0-or-later
      </property>
     </widget>
    </item>
+   <item>
+    <widget class="QLabel" name="m_encryptionUnsupportedLabel">
+     <property name="toolTip">
+      <string>Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer.</string>
+     </property>
+     <property name="text">
+      <string notr="true">🔓</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
    <item>
     <widget class="QLineEdit" name="m_passphraseLineEdit">
      <property name="echoMode">
@@ -57,6 +70,19 @@ SPDX-License-Identifier: GPL-3.0-or-later
      </property>
     </widget>
    </item>
+   <item>
+    <spacer name="horizontalSpacer">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>40</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
    <item>
     <widget class="QLabel" name="m_iconLabel">
      <property name="text">
diff --git a/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.cpp b/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.cpp
index 1e8a9e57377708599538c201fe4bf093e81c5297..8eeafcbf4b97d146d82dc87c298561577abcc0fd 100644
--- a/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.cpp
+++ b/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.cpp
@@ -9,11 +9,10 @@
 
 #include "ListPhysicalVolumeWidgetItem.h"
 
-#include <kpmcore/util/capacity.h>
+#include "core/SizeUtils.h"
 
 ListPhysicalVolumeWidgetItem::ListPhysicalVolumeWidgetItem( const Partition* partition, bool checked )
-    : QListWidgetItem(
-        QString( "%1 | %2" ).arg( partition->deviceNode(), Capacity::formatByteSize( partition->capacity() ) ) )
+    : QListWidgetItem( QString( "%1 | %2" ).arg( partition->deviceNode(), formatByteSize( partition->capacity() ) ) )
     , m_partition( partition )
 {
     setToolTip( partition->deviceNode() );
@@ -26,3 +25,5 @@ ListPhysicalVolumeWidgetItem::partition() const
 {
     return m_partition;
 }
+
+ListPhysicalVolumeWidgetItem::~ListPhysicalVolumeWidgetItem() {}
diff --git a/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.h b/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.h
index 6e0b1c85adc2df65d513c0bbcff4030b791f288b..5d7fdcb764268d45bba4306258153880e994d89f 100644
--- a/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.h
+++ b/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.h
@@ -18,6 +18,7 @@ class ListPhysicalVolumeWidgetItem : public QListWidgetItem
 {
 public:
     ListPhysicalVolumeWidgetItem( const Partition* partition, bool checked );
+    ~ListPhysicalVolumeWidgetItem() override;
 
     const Partition* partition() const;
 
diff --git a/src/modules/partition/gui/PartitionBarsView.cpp b/src/modules/partition/gui/PartitionBarsView.cpp
index 81f518acc69e1969dc5a1415f6192a387d950456..305184b13c25becf523a9f7481d6097fb78ff3b5 100644
--- a/src/modules/partition/gui/PartitionBarsView.cpp
+++ b/src/modules/partition/gui/PartitionBarsView.cpp
@@ -54,9 +54,10 @@ PartitionBarsView::PartitionBarsView( QWidget* parent )
     setSelectionMode( QAbstractItemView::SingleSelection );
 
     // Debug
-    connect( this, &PartitionBarsView::clicked, this, [=]( const QModelIndex& index ) {
-        cDebug() << "Clicked row" << index.row();
-    } );
+    connect( this,
+             &PartitionBarsView::clicked,
+             this,
+             [ = ]( const QModelIndex& index ) { cDebug() << "Clicked row" << index.row(); } );
     setMouseTracking( true );
 }
 
@@ -399,7 +400,7 @@ void
 PartitionBarsView::setSelectionModel( QItemSelectionModel* selectionModel )
 {
     QAbstractItemView::setSelectionModel( selectionModel );
-    connect( selectionModel, &QItemSelectionModel::selectionChanged, this, [=] { viewport()->repaint(); } );
+    connect( selectionModel, &QItemSelectionModel::selectionChanged, this, [ = ] { viewport()->repaint(); } );
 }
 
 
@@ -410,7 +411,8 @@ PartitionBarsView::setSelectionFilter( std::function< bool( const QModelIndex& )
 }
 
 
-QModelIndex PartitionBarsView::moveCursor( CursorAction, Qt::KeyboardModifiers )
+QModelIndex
+PartitionBarsView::moveCursor( CursorAction, Qt::KeyboardModifiers )
 {
     return QModelIndex();
 }
diff --git a/src/modules/partition/gui/PartitionDialogHelpers.cpp b/src/modules/partition/gui/PartitionDialogHelpers.cpp
index 65e88f8984c83e5c5ae3537dcb51fe2c1186a778..1ba110338ea49288d990f70561cec0e98eae41e0 100644
--- a/src/modules/partition/gui/PartitionDialogHelpers.cpp
+++ b/src/modules/partition/gui/PartitionDialogHelpers.cpp
@@ -12,13 +12,17 @@
 #include "PartitionDialogHelpers.h"
 
 #include "core/PartUtils.h"
+#include "gui/CreatePartitionDialog.h"
 
 #include "GlobalStorage.h"
 #include "JobQueue.h"
 #include "utils/Logger.h"
 
 #include <QComboBox>
+#include <QLabel>
+#include <QLineEdit>
 #include <QListWidget>
+#include <QPushButton>
 
 QStringList
 standardMountPoints()
@@ -37,7 +41,7 @@ void
 standardMountPoints( QComboBox& combo )
 {
     combo.clear();
-    combo.addItem( QObject::tr( "(no mount point)" ) );
+    combo.lineEdit()->setPlaceholderText( QObject::tr( "(no mount point)" ) );
     combo.addItems( standardMountPoints() );
 }
 
@@ -51,10 +55,6 @@ standardMountPoints( QComboBox& combo, const QString& selected )
 QString
 selectedMountPoint( QComboBox& combo )
 {
-    if ( combo.currentIndex() == 0 )
-    {
-        return QString();
-    }
     return combo.currentText();
 }
 
@@ -63,7 +63,7 @@ setSelectedMountPoint( QComboBox& combo, const QString& selected )
 {
     if ( selected.isEmpty() )
     {
-        combo.setCurrentIndex( 0 );  // (no mount point)
+        combo.setCurrentIndex( -1 );  // (no mount point)
     }
     else
     {
@@ -80,6 +80,34 @@ setSelectedMountPoint( QComboBox& combo, const QString& selected )
     }
 }
 
+bool
+validateMountPoint( const QString& mountPoint, const QStringList& inUse, QLabel* label, QPushButton* button )
+{
+    QString msg;
+    bool ok = true;
+
+    if ( inUse.contains( mountPoint ) )
+    {
+        msg = CreatePartitionDialog::tr( "Mountpoint already in use. Please select another one." );
+        ok = false;
+    }
+    else if ( !mountPoint.isEmpty() && !mountPoint.startsWith( '/' ) )
+    {
+        msg = CreatePartitionDialog::tr( "Mountpoint must start with a <tt>/</tt>." );
+        ok = false;
+    }
+
+    if ( label )
+    {
+        label->setText( msg );
+    }
+    if ( button )
+    {
+        button->setEnabled( ok );
+    }
+    return ok;
+}
+
 
 PartitionTable::Flags
 flagsFromList( const QListWidget& list )
diff --git a/src/modules/partition/gui/PartitionDialogHelpers.h b/src/modules/partition/gui/PartitionDialogHelpers.h
index 7761004b53c7ed7daae26b7525502d2fc1619b4c..eea0998c4bde4b0f561cd30333c1c0116635fb25 100644
--- a/src/modules/partition/gui/PartitionDialogHelpers.h
+++ b/src/modules/partition/gui/PartitionDialogHelpers.h
@@ -16,7 +16,9 @@
 
 #include <QStringList>
 
+class QPushButton;
 class QComboBox;
+class QLabel;
 class QListWidget;
 
 /**
@@ -58,6 +60,16 @@ setSelectedMountPoint( QComboBox* combo, const QString& selected )
     setSelectedMountPoint( *combo, selected );
 }
 
+/** @brief Validate a @p mountPoint and adjust the UI
+ *
+ * If @p mountPoint is valid -- unused and starts with a /, for instance --
+ * then the button is enabled, label is cleared, and returns @c true.
+ *
+ * If it is not valid, returns @c false and sets the UI
+ * to explain why.
+ */
+bool validateMountPoint( const QString& mountPoint, const QStringList& inUse, QLabel* label, QPushButton* button );
+
 /**
  * Get the flags that have been checked in the list widget.
  */
diff --git a/src/modules/partition/gui/PartitionLabelsView.cpp b/src/modules/partition/gui/PartitionLabelsView.cpp
index 5803d59a2832db2474032d3a7127d5a759830f1b..e3a50c576907c4c26daedb6c1d620b6a8301768e 100644
--- a/src/modules/partition/gui/PartitionLabelsView.cpp
+++ b/src/modules/partition/gui/PartitionLabelsView.cpp
@@ -12,6 +12,7 @@
 
 #include "core/ColorUtils.h"
 #include "core/PartitionModel.h"
+#include "core/SizeUtils.h"
 
 #include "utils/CalamaresUtilsGui.h"
 #include "utils/Logger.h"
@@ -20,8 +21,6 @@
 #include <kpmcore/core/device.h>
 #include <kpmcore/fs/filesystem.h>
 
-#include <KFormat>
-
 // Qt
 #include <QGuiApplication>
 #include <QMouseEvent>
@@ -39,7 +38,7 @@ static QStringList
 buildUnknownDisklabelTexts( Device* dev )
 {
     QStringList texts = { QObject::tr( "Unpartitioned space or unknown partition table" ),
-                          KFormat().formatByteSize( dev->totalLogical() * dev->logicalSize() ) };
+                          formatByteSize( dev->totalLogical() * dev->logicalSize() ) };
     return texts;
 }
 
@@ -520,7 +519,7 @@ void
 PartitionLabelsView::setSelectionModel( QItemSelectionModel* selectionModel )
 {
     QAbstractItemView::setSelectionModel( selectionModel );
-    connect( selectionModel, &QItemSelectionModel::selectionChanged, this, [=] { viewport()->repaint(); } );
+    connect( selectionModel, &QItemSelectionModel::selectionChanged, this, [ = ] { viewport()->repaint(); } );
 }
 
 
diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp
index 9d7a2f0d75dffd87acd5ae3bb3317839a2a6bd82..0b3cf2478a902249bbf2e7d23d35887331653c92 100644
--- a/src/modules/partition/gui/PartitionPage.cpp
+++ b/src/modules/partition/gui/PartitionPage.cpp
@@ -451,15 +451,18 @@ void
 PartitionPage::onRevertClicked()
 {
     ScanningDialog::run(
-        QtConcurrent::run( [this] {
-            QMutexLocker locker( &m_revertMutex );
-
-            int oldIndex = m_ui->deviceComboBox->currentIndex();
-            m_core->revertAllDevices();
-            m_ui->deviceComboBox->setCurrentIndex( ( oldIndex < 0 ) ? 0 : oldIndex );
-            updateFromCurrentDevice();
-        } ),
-        [this] {
+        QtConcurrent::run(
+            [ this ]
+            {
+                QMutexLocker locker( &m_revertMutex );
+
+                int oldIndex = m_ui->deviceComboBox->currentIndex();
+                m_core->revertAllDevices();
+                m_ui->deviceComboBox->setCurrentIndex( ( oldIndex < 0 ) ? 0 : oldIndex );
+                updateFromCurrentDevice();
+            } ),
+        [ this ]
+        {
             m_lastSelectedBootLoaderIndex = -1;
             if ( m_ui->bootLoaderComboBox->currentIndex() < 0 )
             {
@@ -606,7 +609,8 @@ PartitionPage::updateFromCurrentDevice()
         m_ui->partitionBarsView->selectionModel(),
         &QItemSelectionModel::currentChanged,
         this,
-        [=] {
+        [ = ]
+        {
             QModelIndex selectedIndex = m_ui->partitionBarsView->selectionModel()->currentIndex();
             selectedIndex = selectedIndex.sibling( selectedIndex.row(), 0 );
             m_ui->partitionBarsView->setCurrentIndex( selectedIndex );
@@ -625,7 +629,7 @@ PartitionPage::updateFromCurrentDevice()
     // model changes
     connect( m_ui->partitionTreeView->selectionModel(),
              &QItemSelectionModel::currentChanged,
-             [this]( const QModelIndex&, const QModelIndex& ) { updateButtons(); } );
+             [ this ]( const QModelIndex&, const QModelIndex& ) { updateButtons(); } );
     connect( model, &QAbstractItemModel::modelReset, this, &PartitionPage::onPartitionModelReset );
 }
 
diff --git a/src/modules/partition/gui/PartitionSplitterWidget.cpp b/src/modules/partition/gui/PartitionSplitterWidget.cpp
index 0cafe7814f5a35718f2be53d6609be6abf9d2851..e52afaa74809fa190caa471a25f5c804941889a2 100644
--- a/src/modules/partition/gui/PartitionSplitterWidget.cpp
+++ b/src/modules/partition/gui/PartitionSplitterWidget.cpp
@@ -159,14 +159,16 @@ PartitionSplitterWidget::setSplitPartition( const QString& path, qint64 minSize,
         m_itemToResizePath.clear();
     }
 
-    PartitionSplitterItem itemToResize = _findItem( m_items, [path]( PartitionSplitterItem& item ) -> bool {
-        if ( path == item.itemPath )
-        {
-            item.status = PartitionSplitterItem::Resizing;
-            return true;
-        }
-        return false;
-    } );
+    PartitionSplitterItem itemToResize = _findItem( m_items,
+                                                    [ path ]( PartitionSplitterItem& item ) -> bool
+                                                    {
+                                                        if ( path == item.itemPath )
+                                                        {
+                                                            item.status = PartitionSplitterItem::Resizing;
+                                                            return true;
+                                                        }
+                                                        return false;
+                                                    } );
 
     if ( itemToResize.isNull() )
     {
@@ -184,14 +186,16 @@ PartitionSplitterWidget::setSplitPartition( const QString& path, qint64 minSize,
 
     qint64 newSize = m_itemToResize.size - preferredSize;
     m_itemToResize.size = preferredSize;
-    int opCount = _eachItem( m_items, [preferredSize]( PartitionSplitterItem& item ) -> bool {
-        if ( item.status == PartitionSplitterItem::Resizing )
-        {
-            item.size = preferredSize;
-            return true;
-        }
-        return false;
-    } );
+    int opCount = _eachItem( m_items,
+                             [ preferredSize ]( PartitionSplitterItem& item ) -> bool
+                             {
+                                 if ( item.status == PartitionSplitterItem::Resizing )
+                                 {
+                                     item.size = preferredSize;
+                                     return true;
+                                 }
+                                 return false;
+                             } );
     cDebug() << "each splitter item opcount:" << opCount;
     m_itemMinSize = minSize;
     m_itemMaxSize = maxSize;
@@ -358,19 +362,21 @@ PartitionSplitterWidget::mouseMoveEvent( QMouseEvent* event )
 
         m_itemToResize.size = qRound64( span * percent );
         m_itemToResizeNext.size -= m_itemToResize.size - oldsize;
-        _eachItem( m_items, [this]( PartitionSplitterItem& item ) -> bool {
-            if ( item.status == PartitionSplitterItem::Resizing )
-            {
-                item.size = m_itemToResize.size;
-                return true;
-            }
-            else if ( item.status == PartitionSplitterItem::ResizingNext )
-            {
-                item.size = m_itemToResizeNext.size;
-                return true;
-            }
-            return false;
-        } );
+        _eachItem( m_items,
+                   [ this ]( PartitionSplitterItem& item ) -> bool
+                   {
+                       if ( item.status == PartitionSplitterItem::Resizing )
+                       {
+                           item.size = m_itemToResize.size;
+                           return true;
+                       }
+                       else if ( item.status == PartitionSplitterItem::ResizingNext )
+                       {
+                           item.size = m_itemToResizeNext.size;
+                           return true;
+                       }
+                       return false;
+                   } );
 
         repaint();
 
diff --git a/src/modules/partition/gui/ReplaceWidget.cpp b/src/modules/partition/gui/ReplaceWidget.cpp
index 94f5276463a0de5e924453fa2386363aa027bba0..76f9ff96349a90aeef137743799d5b94b0a6690f 100644
--- a/src/modules/partition/gui/ReplaceWidget.cpp
+++ b/src/modules/partition/gui/ReplaceWidget.cpp
@@ -46,9 +46,10 @@ ReplaceWidget::ReplaceWidget( PartitionCoreModule* core, QComboBox* devicesCombo
     m_ui->bootStatusLabel->clear();
 
     updateFromCurrentDevice( devicesComboBox );
-    connect( devicesComboBox, &QComboBox::currentTextChanged, this, [=]( const QString& /* text */ ) {
-        updateFromCurrentDevice( devicesComboBox );
-    } );
+    connect( devicesComboBox,
+             &QComboBox::currentTextChanged,
+             this,
+             [ = ]( const QString& /* text */ ) { updateFromCurrentDevice( devicesComboBox ); } );
 
     CALAMARES_RETRANSLATE( onPartitionSelected(); );
 }
@@ -212,7 +213,8 @@ ReplaceWidget::onPartitionSelected()
             }
         }
 
-        if ( partition->capacity() < requiredSpaceB )
+        // The loss of precision is ok; we're not going to fall over from a single byte
+        if ( static_cast< double >( partition->capacity() ) < requiredSpaceB )
         {
             updateStatus( CalamaresUtils::Fail,
                           tr( "<strong>%4</strong><br/><br/>"
diff --git a/src/modules/partition/gui/ScanningDialog.cpp b/src/modules/partition/gui/ScanningDialog.cpp
index 4dffa922b562edd05729ad606a548d4189effd25..56133e21f9d7e3675eb335f74915ad2c0bf0a21c 100644
--- a/src/modules/partition/gui/ScanningDialog.cpp
+++ b/src/modules/partition/gui/ScanningDialog.cpp
@@ -47,12 +47,16 @@ ScanningDialog::run( const QFuture< void >& future,
     theDialog->show();
 
     QFutureWatcher< void >* watcher = new QFutureWatcher< void >();
-    connect( watcher, &QFutureWatcher< void >::finished, theDialog, [watcher, theDialog, callback] {
-        watcher->deleteLater();
-        theDialog->hide();
-        theDialog->deleteLater();
-        callback();
-    } );
+    connect( watcher,
+             &QFutureWatcher< void >::finished,
+             theDialog,
+             [ watcher, theDialog, callback ]
+             {
+                 watcher->deleteLater();
+                 theDialog->hide();
+                 theDialog->deleteLater();
+                 callback();
+             } );
 
     watcher->setFuture( future );
 }
diff --git a/src/modules/partition/gui/VolumeGroupBaseDialog.cpp b/src/modules/partition/gui/VolumeGroupBaseDialog.cpp
index 6277c30e597a619a24a628f306543bb39a2d1227..818a60483f07358ae77e98282c22530e31bfefed 100644
--- a/src/modules/partition/gui/VolumeGroupBaseDialog.cpp
+++ b/src/modules/partition/gui/VolumeGroupBaseDialog.cpp
@@ -10,10 +10,9 @@
 #include "VolumeGroupBaseDialog.h"
 #include "ui_VolumeGroupBaseDialog.h"
 
+#include "core/SizeUtils.h"
 #include "gui/ListPhysicalVolumeWidgetItem.h"
 
-#include <kpmcore/util/capacity.h>
-
 #include <QComboBox>
 #include <QDialogButtonBox>
 #include <QLabel>
@@ -46,17 +45,25 @@ VolumeGroupBaseDialog::VolumeGroupBaseDialog( QString& vgName, QVector< const Pa
     updateOkButton();
     updateTotalSize();
 
-    connect( ui->pvList, &QListWidget::itemChanged, this, [&]( QListWidgetItem* ) {
-        updateTotalSize();
-        updateOkButton();
-    } );
-
-    connect( ui->peSize, qOverload< int >( &QSpinBox::valueChanged ), this, [&]( int ) {
-        updateTotalSectors();
-        updateOkButton();
-    } );
-
-    connect( ui->vgName, &QLineEdit::textChanged, this, [&]( const QString& ) { updateOkButton(); } );
+    connect( ui->pvList,
+             &QListWidget::itemChanged,
+             this,
+             [ & ]( QListWidgetItem* )
+             {
+                 updateTotalSize();
+                 updateOkButton();
+             } );
+
+    connect( ui->peSize,
+             qOverload< int >( &QSpinBox::valueChanged ),
+             this,
+             [ & ]( int )
+             {
+                 updateTotalSectors();
+                 updateOkButton();
+             } );
+
+    connect( ui->vgName, &QLineEdit::textChanged, this, [ & ]( const QString& ) { updateOkButton(); } );
 }
 
 VolumeGroupBaseDialog::~VolumeGroupBaseDialog()
@@ -100,7 +107,7 @@ VolumeGroupBaseDialog::setUsedSizeValue( qint64 usedSize )
 {
     m_usedSizeValue = usedSize;
 
-    ui->usedSize->setText( Capacity::formatByteSize( m_usedSizeValue ) );
+    ui->usedSize->setText( formatByteSize( m_usedSizeValue ) );
 }
 
 void
@@ -121,7 +128,7 @@ VolumeGroupBaseDialog::updateTotalSize()
                 % ( ui->peSize->value() * Capacity::unitFactor( Capacity::Unit::Byte, Capacity::Unit::MiB ) );
     }
 
-    ui->totalSize->setText( Capacity::formatByteSize( m_totalSizeValue ) );
+    ui->totalSize->setText( formatByteSize( m_totalSizeValue ) );
 
     updateTotalSectors();
 }
diff --git a/src/modules/partition/jobs/AutoMountManagementJob.cpp b/src/modules/partition/jobs/AutoMountManagementJob.cpp
index e276447db3f0f400124222dbccd2659b8c93b37f..29b19793302b0fe57dfb7918aa1a6b209c28cf1e 100644
--- a/src/modules/partition/jobs/AutoMountManagementJob.cpp
+++ b/src/modules/partition/jobs/AutoMountManagementJob.cpp
@@ -26,7 +26,9 @@ Calamares::JobResult
 AutoMountManagementJob::exec()
 {
     cVerbose() << "this" << Logger::Pointer( this ) << "value" << Logger::Pointer( m_stored )
-               << ( m_stored ? "restore" : m_disable ? "disable" : "enable" );
+               << ( m_stored        ? "restore"
+                        : m_disable ? "disable"
+                                    : "enable" );
     if ( m_stored )
     {
         CalamaresUtils::Partition::automountRestore( m_stored );
diff --git a/src/modules/partition/jobs/ClearMountsJob.cpp b/src/modules/partition/jobs/ClearMountsJob.cpp
index 831a1e868b5cc083aa515179a803bde9cea8ed74..3d7b9d0de10a0398373c1ad75f05fd118f6f1898 100644
--- a/src/modules/partition/jobs/ClearMountsJob.cpp
+++ b/src/modules/partition/jobs/ClearMountsJob.cpp
@@ -157,9 +157,11 @@ getLVMVolumes()
         QStringList lvscanLines = QString::fromLocal8Bit( process.readAllStandardOutput() ).split( '\n' );
         // Get the second column (`value(1)`) sinec that is the device name,
         // remove quoting.
-        std::transform( lvscanLines.begin(), lvscanLines.end(), lvscanLines.begin(), []( const QString& lvscanLine ) {
-            return lvscanLine.simplified().split( ' ' ).value( 1 ).replace( '\'', "" );
-        } );
+        std::transform( lvscanLines.begin(),
+                        lvscanLines.end(),
+                        lvscanLines.begin(),
+                        []( const QString& lvscanLine )
+                        { return lvscanLine.simplified().split( ' ' ).value( 1 ).replace( '\'', "" ); } );
         return lvscanLines;
     }
     else
@@ -243,14 +245,8 @@ public:
     }
 
 private:
-#if ( QT_VERSION < QT_VERSION_CHECK( 5, 15, 0 ) )
-    // TODO: 3.3 remove because newer Qt does support constness
     const char* m_message = nullptr;
     QString m_path;
-#else
-    const char* const m_message = nullptr;
-    QString const m_path;
-#endif
 };
 
 STATICTEST inline QDebug&
diff --git a/src/modules/partition/jobs/ClearTempMountsJob.cpp b/src/modules/partition/jobs/ClearTempMountsJob.cpp
index ffbc35044d14de7a5ba65f1925ae84e7c49aaa4f..6219de004a4698a8098ea1397c14d3ba0d1a60e3 100644
--- a/src/modules/partition/jobs/ClearTempMountsJob.cpp
+++ b/src/modules/partition/jobs/ClearTempMountsJob.cpp
@@ -9,6 +9,7 @@
 
 #include "ClearTempMountsJob.h"
 
+#include "partition/Mount.h"
 #include "utils/Logger.h"
 #include "utils/String.h"
 
@@ -45,51 +46,23 @@ ClearTempMountsJob::exec()
 {
     Logger::Once o;
     // Fetch a list of current mounts to Calamares temporary directories.
-    QList< QPair< QString, QString > > lst;
-    QFile mtab( "/etc/mtab" );
-    if ( !mtab.open( QFile::ReadOnly | QFile::Text ) )
-    {
-        return Calamares::JobResult::error( tr( "Cannot get list of temporary mounts." ) );
-    }
+    using MtabInfo = CalamaresUtils::Partition::MtabInfo;
+    auto targetMounts = MtabInfo::fromMtabFilteredByPrefix( QStringLiteral( "/tmp/calamares-" ) );
 
-    cVerbose() << o << "Opened mtab. Lines:";
-    QTextStream in( &mtab );
-    QString lineIn = in.readLine();
-    while ( !lineIn.isNull() )
-    {
-        QStringList line = lineIn.split( ' ', SplitSkipEmptyParts );
-        cVerbose() << o << line.join( ' ' );
-        QString device = line.at( 0 );
-        QString mountPoint = line.at( 1 );
-        if ( mountPoint.startsWith( "/tmp/calamares-" ) )
-        {
-            lst.append( qMakePair( device, mountPoint ) );
-        }
-        lineIn = in.readLine();
-    }
-
-    if ( lst.empty() )
+    if ( targetMounts.isEmpty() )
     {
         return Calamares::JobResult::ok();
     }
-
-    std::sort(
-        lst.begin(), lst.end(), []( const QPair< QString, QString >& a, const QPair< QString, QString >& b ) -> bool {
-            return a.first > b.first;
-        } );
+    std::sort( targetMounts.begin(), targetMounts.end(), MtabInfo::mountPointOrder );
 
     QStringList goodNews;
-    QProcess process;
-
-    for ( const auto& line : qAsConst( lst ) )
+    for ( const auto& m : qAsConst( targetMounts ) )
     {
-        QString partPath = line.second;
-        cDebug() << o << "Will try to umount path" << partPath;
-        process.start( "umount", { "-lv", partPath } );
-        process.waitForFinished();
-        if ( process.exitCode() == 0 )
+        cDebug() << o << "Will try to umount path" << m.mountPoint;
+        if ( CalamaresUtils::Partition::unmount( m.mountPoint, { "-lv" } ) == 0 )
         {
-            goodNews.append( QString( "Successfully unmounted %1." ).arg( partPath ) );
+            // Returns the program's exit code, so 0 is success
+            goodNews.append( QString( "Successfully unmounted %1." ).arg( m.mountPoint ) );
         }
     }
 
diff --git a/src/modules/partition/jobs/CreatePartitionJob.cpp b/src/modules/partition/jobs/CreatePartitionJob.cpp
index 83ebc0509e406d338dad0c0e92036c6c6245bd24..fe7c6f3508a6116c3a00f240273c71b6b371c696 100644
--- a/src/modules/partition/jobs/CreatePartitionJob.cpp
+++ b/src/modules/partition/jobs/CreatePartitionJob.cpp
@@ -11,7 +11,9 @@
 
 #include "CreatePartitionJob.h"
 
+#include "core/KPMHelpers.h"
 #include "core/PartitionInfo.h"
+
 #include "partition/FileSystem.h"
 #include "partition/PartitionQuery.h"
 #include "utils/CalamaresUtilsSystem.h"
@@ -60,24 +62,24 @@ createZfs( Partition* partition, Device* device )
     // Now we need to do some things that would normally be done by kpmcore
 
     // First we get the device node from the output and set it as the partition path
-    QRegularExpression re( QStringLiteral( "Created a new partition (\\d+)" ) );
-    QRegularExpressionMatch rem = re.match( r.getOutput() );
-
     QString deviceNode;
-    if ( rem.hasMatch() )
     {
-        if ( partition->devicePath().back().isDigit() )
-        {
-            deviceNode = partition->devicePath() + QLatin1Char( 'p' ) + rem.captured( 1 );
-        }
-        else
+        QRegularExpression re( QStringLiteral( "Created a new partition (\\d+)" ) );
+        QRegularExpressionMatch rem = re.match( r.getOutput() );
+
+        if ( rem.hasMatch() )
         {
-            deviceNode = partition->devicePath() + rem.captured( 1 );
+            if ( partition->devicePath().back().isDigit() )
+            {
+                deviceNode = partition->devicePath() + QLatin1Char( 'p' ) + rem.captured( 1 );
+            }
+            else
+            {
+                deviceNode = partition->devicePath() + rem.captured( 1 );
+            }
         }
+        partition->setPartitionPath( deviceNode );
     }
-
-    partition->setPartitionPath( deviceNode );
-
     // If it is a gpt device, set the partition UUID
     if ( device->partitionTable()->type() == PartitionTable::gpt && partition->uuid().isEmpty() )
     {
@@ -273,17 +275,9 @@ CreatePartitionJob::exec()
         return createZfs( m_partition, m_device );
     }
 
-    Report report( nullptr );
-    NewOperation op( *m_device, m_partition );
-    op.setStatus( Operation::StatusRunning );
-
-    QString message = tr( "The installer failed to create partition on disk '%1'." ).arg( m_device->name() );
-    if ( op.execute( report ) )
-    {
-        return Calamares::JobResult::ok();
-    }
-
-    return Calamares::JobResult::error( message, report.toText() );
+    return KPMHelpers::execute(
+        NewOperation( *m_device, m_partition ),
+        tr( "The installer failed to create partition on disk '%1'." ).arg( m_device->name() ) );
 }
 
 void
diff --git a/src/modules/partition/jobs/CreatePartitionTableJob.cpp b/src/modules/partition/jobs/CreatePartitionTableJob.cpp
index 118ec88233a525d98408c7047bd6e65903b22cab..3b9415d1a1cfc15262ce21a16ae7e24149eeee29 100644
--- a/src/modules/partition/jobs/CreatePartitionTableJob.cpp
+++ b/src/modules/partition/jobs/CreatePartitionTableJob.cpp
@@ -12,9 +12,11 @@
 #include "CreatePartitionTableJob.h"
 
 #include "partition/PartitionIterator.h"
+#include "utils/CalamaresUtilsSystem.h"
 #include "utils/Logger.h"
 
-// KPMcore
+#include "core/KPMHelpers.h"
+
 #include <kpmcore/core/device.h>
 #include <kpmcore/core/partition.h>
 #include <kpmcore/core/partitiontable.h>
@@ -63,8 +65,6 @@ CreatePartitionTableJob::prettyStatusMessage() const
 Calamares::JobResult
 CreatePartitionTableJob::exec()
 {
-    Report report( nullptr );
-    QString message = tr( "The installer failed to create a partition table on %1." ).arg( m_device->name() );
 
     PartitionTable* table = m_device->partitionTable();
 
@@ -76,30 +76,16 @@ CreatePartitionTableJob::exec()
             cDebug() << Logger::SubEntry << ( ( *it ) ? ( *it )->deviceNode() : QString( "<null device>" ) );
         }
 
-        QProcess lsblk;
-        lsblk.setProgram( "lsblk" );
-        lsblk.setProcessChannelMode( QProcess::MergedChannels );
-        lsblk.start();
-        lsblk.waitForFinished();
-        cDebug() << Logger::SubEntry << "lsblk output:\n" << Logger::NoQuote << lsblk.readAllStandardOutput();
-
-        QProcess mount;
-        mount.setProgram( "mount" );  // Debug output only, not mounting something
-        mount.setProcessChannelMode( QProcess::MergedChannels );
-        mount.start();
-        mount.waitForFinished();
-        cDebug() << Logger::SubEntry << "mount output:\n" << Logger::NoQuote << mount.readAllStandardOutput();
-    }
-
-    CreatePartitionTableOperation op( *m_device, table );
-    op.setStatus( Operation::StatusRunning );
+        auto lsblkResult = CalamaresUtils::System::runCommand( { "lsblk" }, std::chrono::seconds( 30 ) );
+        cDebug() << Logger::SubEntry << "lsblk output:\n" << Logger::NoQuote << lsblkResult.getOutput();
 
-    if ( op.execute( report ) )
-    {
-        return Calamares::JobResult::ok();
+        auto mountResult = CalamaresUtils::System::runCommand( { "mount" }, std::chrono::seconds( 30 ) );
+        cDebug() << Logger::SubEntry << "mount output:\n" << Logger::NoQuote << mountResult.getOutput();
     }
 
-    return Calamares::JobResult::error( message, report.toText() );
+    return KPMHelpers::execute(
+        CreatePartitionTableOperation( *m_device, table ),
+        tr( "The installer failed to create a partition table on %1." ).arg( m_device->name() ) );
 }
 
 void
diff --git a/src/modules/partition/jobs/CreateVolumeGroupJob.cpp b/src/modules/partition/jobs/CreateVolumeGroupJob.cpp
index 36d79b7b7f434fddf24b8e27857cf02e8fa7b91d..683913b7f3487bc9a8ac612e275543854b124231 100644
--- a/src/modules/partition/jobs/CreateVolumeGroupJob.cpp
+++ b/src/modules/partition/jobs/CreateVolumeGroupJob.cpp
@@ -9,7 +9,8 @@
 
 #include "CreateVolumeGroupJob.h"
 
-// KPMcore
+#include "core/KPMHelpers.h"
+
 #include <kpmcore/core/lvmdevice.h>
 #include <kpmcore/core/partition.h>
 #include <kpmcore/ops/createvolumegroupoperation.h>
@@ -46,19 +47,8 @@ CreateVolumeGroupJob::prettyStatusMessage() const
 Calamares::JobResult
 CreateVolumeGroupJob::exec()
 {
-    Report report( nullptr );
-
-    CreateVolumeGroupOperation op( m_vgName, m_pvList, m_peSize );
-
-    op.setStatus( Operation::StatusRunning );
-
-    QString message = tr( "The installer failed to create a volume group named '%1'." ).arg( m_vgName );
-    if ( op.execute( report ) )
-    {
-        return Calamares::JobResult::ok();
-    }
-
-    return Calamares::JobResult::error( message, report.toText() );
+    return KPMHelpers::execute( CreateVolumeGroupOperation( m_vgName, m_pvList, m_peSize ),
+                                tr( "The installer failed to create a volume group named '%1'." ).arg( m_vgName ) );
 }
 
 void
diff --git a/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp b/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp
index 92086015de2127f42ab61f8150edcde69e02c432..65920a84ea8e7e9a29a0adae24c620cb0ab07a83 100644
--- a/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp
+++ b/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp
@@ -9,6 +9,8 @@
 
 #include "DeactivateVolumeGroupJob.h"
 
+#include "core/KPMHelpers.h"
+
 #include <kpmcore/core/lvmdevice.h>
 #include <kpmcore/ops/deactivatevolumegroupoperation.h>
 #include <kpmcore/util/report.h>
@@ -39,18 +41,12 @@ DeactivateVolumeGroupJob::prettyStatusMessage() const
 Calamares::JobResult
 DeactivateVolumeGroupJob::exec()
 {
-    Report report( nullptr );
-
     DeactivateVolumeGroupOperation op( *m_device );
-
-    op.setStatus( Operation::OperationStatus::StatusRunning );
-
-    QString message = tr( "The installer failed to deactivate a volume group named %1." ).arg( m_device->name() );
-    if ( op.execute( report ) )
+    auto r = KPMHelpers::execute(
+        op, tr( "The installer failed to deactivate a volume group named %1." ).arg( m_device->name() ) );
+    if ( r )
     {
         op.preview();
-        return Calamares::JobResult::ok();
     }
-
-    return Calamares::JobResult::error( message, report.toText() );
+    return r;
 }
diff --git a/src/modules/partition/jobs/DeletePartitionJob.cpp b/src/modules/partition/jobs/DeletePartitionJob.cpp
index a678b5e9071c47c59bdfe5577f6ecc5d0a6ed28a..d61bb955e1d84231e27076de4f7d4ca8ec626b8d 100644
--- a/src/modules/partition/jobs/DeletePartitionJob.cpp
+++ b/src/modules/partition/jobs/DeletePartitionJob.cpp
@@ -10,9 +10,11 @@
  */
 
 #include "DeletePartitionJob.h"
+
+#include "core/KPMHelpers.h"
+
 #include "utils/CalamaresUtilsSystem.h"
 
-// KPMcore
 #include <kpmcore/core/device.h>
 #include <kpmcore/core/partition.h>
 #include <kpmcore/core/partitiontable.h>
@@ -45,7 +47,7 @@ removePartition( Partition* partition )
     auto r = CalamaresUtils::System::instance()->runCommand(
         { "sfdisk", "--delete", "--force", partition->devicePath(), QString::number( partition->number() ) },
         std::chrono::seconds( 5 ) );
-    if ( r.getExitCode() !=0 || r.getOutput().contains("failed") )
+    if ( r.getExitCode() != 0 || r.getOutput().contains( "failed" ) )
     {
         return Calamares::JobResult::error(
             QCoreApplication::translate( DeletePartitionJob::staticMetaObject.className(), "Deletion Failed" ),
@@ -96,17 +98,8 @@ DeletePartitionJob::exec()
         return removePartition( m_partition );
     }
 
-    Report report( nullptr );
-    DeleteOperation op( *m_device, m_partition );
-    op.setStatus( Operation::StatusRunning );
-
-    QString message = tr( "The installer failed to delete partition %1." ).arg( m_partition->devicePath() );
-    if ( op.execute( report ) )
-    {
-        return Calamares::JobResult::ok();
-    }
-
-    return Calamares::JobResult::error( message, report.toText() );
+    return KPMHelpers::execute( DeleteOperation( *m_device, m_partition ),
+                                tr( "The installer failed to delete partition %1." ).arg( m_partition->devicePath() ) );
 }
 
 void
diff --git a/src/modules/partition/jobs/FormatPartitionJob.cpp b/src/modules/partition/jobs/FormatPartitionJob.cpp
index 4dadacf9c5e84ec4183e928c455f629240933e20..63d23342616ceb65cd97be314b3dc2def6392c2a 100644
--- a/src/modules/partition/jobs/FormatPartitionJob.cpp
+++ b/src/modules/partition/jobs/FormatPartitionJob.cpp
@@ -11,7 +11,10 @@
 
 #include "FormatPartitionJob.h"
 
+#include "core/KPMHelpers.h"
+
 #include "partition/FileSystem.h"
+#include "utils/CalamaresUtilsSystem.h"
 #include "utils/Logger.h"
 
 #include <kpmcore/core/device.h>
@@ -65,17 +68,18 @@ FormatPartitionJob::prettyStatusMessage() const
 Calamares::JobResult
 FormatPartitionJob::exec()
 {
-    Report report( nullptr );  // Root of the report tree, no parent
-    CreateFileSystemOperation op( *m_device, *m_partition, m_partition->fileSystem().type() );
-    op.setStatus( Operation::StatusRunning );
-
-    QString message = tr( "The installer failed to format partition %1 on disk '%2'." )
-                          .arg( m_partition->partitionPath(), m_device->name() );
-
-    if ( op.execute( report ) )
+    const auto fsType = m_partition->fileSystem().type();
+    auto r = KPMHelpers::execute( CreateFileSystemOperation( *m_device, *m_partition, fsType ),
+                                  tr( "The installer failed to format partition %1 on disk '%2'." )
+                                      .arg( m_partition->partitionPath(), m_device->name() ) );
+    if ( fsType == FileSystem::Xfs && r.succeeded() )
     {
-        return Calamares::JobResult::ok();
+        // We are going to try to set modern timestamps for the filesystem,
+        // (ignoring whether this succeeds). Requires a sufficiently-new
+        // xfs_admin and xfs_repair and might be made obsolete by newer
+        // kpmcore releases.
+        CalamaresUtils::System::runCommand( { "xfs_admin", "-O", "bigtime=1", m_partition->partitionPath() },
+                                            std::chrono::seconds( 60 ) );
     }
-
-    return Calamares::JobResult::error( message, report.toText() );
+    return r;
 }
diff --git a/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp b/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp
index 3c4e7b036c8ce448b10185d6f2d8d6fdcf21f45e..2273510640283181908bc49c3095ee14bc7a3978 100644
--- a/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp
+++ b/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp
@@ -9,6 +9,8 @@
 
 #include "RemoveVolumeGroupJob.h"
 
+#include "core/KPMHelpers.h"
+
 #include <kpmcore/core/lvmdevice.h>
 #include <kpmcore/ops/removevolumegroupoperation.h>
 #include <kpmcore/util/report.h>
@@ -39,17 +41,7 @@ RemoveVolumeGroupJob::prettyStatusMessage() const
 Calamares::JobResult
 RemoveVolumeGroupJob::exec()
 {
-    Report report( nullptr );
-
-    RemoveVolumeGroupOperation op( *m_device );
-
-    op.setStatus( Operation::OperationStatus::StatusRunning );
-
-    QString message = tr( "The installer failed to remove a volume group named '%1'." ).arg( m_device->name() );
-    if ( op.execute( report ) )
-    {
-        return Calamares::JobResult::ok();
-    }
-
-    return Calamares::JobResult::error( message, report.toText() );
+    return KPMHelpers::execute(
+        RemoveVolumeGroupOperation( *m_device ),
+        tr( "The installer failed to remove a volume group named '%1'." ).arg( m_device->name() ) );
 }
diff --git a/src/modules/partition/jobs/ResizePartitionJob.cpp b/src/modules/partition/jobs/ResizePartitionJob.cpp
index 87b87c1c0a4eda857664e586188c0d332279286b..fe1ceca4cfa0f0705434a44bbbba002b570f946e 100644
--- a/src/modules/partition/jobs/ResizePartitionJob.cpp
+++ b/src/modules/partition/jobs/ResizePartitionJob.cpp
@@ -11,9 +11,10 @@
 
 #include "ResizePartitionJob.h"
 
+#include "core/KPMHelpers.h"
+
 #include "utils/Units.h"
 
-// KPMcore
 #include <kpmcore/core/device.h>
 #include <kpmcore/ops/resizeoperation.h>
 #include <kpmcore/util/report.h>
@@ -66,23 +67,16 @@ ResizePartitionJob::prettyStatusMessage() const
 Calamares::JobResult
 ResizePartitionJob::exec()
 {
-    Report report( nullptr );
     // Restore partition sectors that were modified for preview
     m_partition->setFirstSector( m_oldFirstSector );
     m_partition->setLastSector( m_oldLastSector );
+
     ResizeOperation op( *m_device, *m_partition, m_newFirstSector, m_newLastSector );
-    op.setStatus( Operation::StatusRunning );
     connect( &op, &Operation::progress, this, &ResizePartitionJob::iprogress );
-
-    QString errorMessage = tr( "The installer failed to resize partition %1 on disk '%2'." )
-                               .arg( m_partition->partitionPath() )
-                               .arg( m_device->name() );
-    if ( op.execute( report ) )
-    {
-        return Calamares::JobResult::ok();
-    }
-
-    return Calamares::JobResult::error( errorMessage, report.toText() );
+    return KPMHelpers::execute( op,
+                                tr( "The installer failed to resize partition %1 on disk '%2'." )
+                                    .arg( m_partition->partitionPath() )
+                                    .arg( m_device->name() ) );
 }
 
 void
diff --git a/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp b/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp
index 1aa4541b88143795c27c6251219ede12cccc3cfc..f7a21d80dc904f142e6ba517a698a7421016eb96 100644
--- a/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp
+++ b/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp
@@ -9,7 +9,8 @@
 
 #include "ResizeVolumeGroupJob.h"
 
-// KPMcore
+#include "core/KPMHelpers.h"
+
 #include <kpmcore/core/lvmdevice.h>
 #include <kpmcore/core/partition.h>
 #include <kpmcore/ops/resizevolumegroupoperation.h>
@@ -51,19 +52,9 @@ ResizeVolumeGroupJob::prettyStatusMessage() const
 Calamares::JobResult
 ResizeVolumeGroupJob::exec()
 {
-    Report report( nullptr );
-
-    ResizeVolumeGroupOperation op( *m_device, m_partitionList );
-
-    op.setStatus( Operation::OperationStatus::StatusRunning );
-
-    QString message = tr( "The installer failed to resize a volume group named '%1'." ).arg( m_device->name() );
-    if ( op.execute( report ) )
-    {
-        return Calamares::JobResult::ok();
-    }
-
-    return Calamares::JobResult::error( message, report.toText() );
+    return KPMHelpers::execute(
+        ResizeVolumeGroupOperation( *m_device, m_partitionList ),
+        tr( "The installer failed to resize a volume group named '%1'." ).arg( m_device->name() ) );
 }
 
 QString
diff --git a/src/modules/partition/jobs/SetPartitionFlagsJob.cpp b/src/modules/partition/jobs/SetPartitionFlagsJob.cpp
index de77d86f8708361927b8bc5a60cf8034d9013419..50777328822b35a20b3c36346edea8c006087c1d 100644
--- a/src/modules/partition/jobs/SetPartitionFlagsJob.cpp
+++ b/src/modules/partition/jobs/SetPartitionFlagsJob.cpp
@@ -13,6 +13,8 @@
 
 #include "SetPartitionFlagsJob.h"
 
+#include "core/KPMHelpers.h"
+
 #include "partition/FileSystem.h"
 #include "utils/Logger.h"
 #include "utils/Units.h"
@@ -148,17 +150,8 @@ SetPartFlagsJob::exec()
     cDebug() << "Setting flags on" << m_device->deviceNode() << "partition" << partition()->deviceNode()
              << Logger::DebugList( flagsList );
 
-    Report report( nullptr );
     SetPartFlagsOperation op( *m_device, *partition(), m_flags );
-    op.setStatus( Operation::StatusRunning );
     connect( &op, &Operation::progress, this, &SetPartFlagsJob::iprogress );
-
-    QString errorMessage
-        = tr( "The installer failed to set flags on partition %1." ).arg( m_partition->partitionPath() );
-    if ( op.execute( report ) )
-    {
-        return Calamares::JobResult::ok();
-    }
-
-    return Calamares::JobResult::error( errorMessage, report.toText() );
+    return KPMHelpers::execute(
+        op, tr( "The installer failed to set flags on partition %1." ).arg( m_partition->partitionPath() ) );
 }
diff --git a/src/modules/partition/tests/AutoMountTests.cpp b/src/modules/partition/tests/AutoMountTests.cpp
index 45a7b4f127ffeb0918daa78fc8c4ec754fb56589..103fe6f828f030ae2356721fb3e17009c239b7d8 100644
--- a/src/modules/partition/tests/AutoMountTests.cpp
+++ b/src/modules/partition/tests/AutoMountTests.cpp
@@ -69,8 +69,8 @@ AutoMountJobTests::testRunQueue()
     QVERIFY( !q.isRunning() );
 
     QEventLoop loop;
-    QTimer::singleShot( std::chrono::milliseconds( 100 ), [&q]() { q.start(); } );
-    QTimer::singleShot( std::chrono::milliseconds( 5000 ), [&loop]() { loop.quit(); } );
+    QTimer::singleShot( std::chrono::milliseconds( 100 ), [ &q ]() { q.start(); } );
+    QTimer::singleShot( std::chrono::milliseconds( 5000 ), [ &loop ]() { loop.quit(); } );
     connect( &q, &Calamares::JobQueue::finished, &loop, &QEventLoop::quit );
     loop.exec();
 
diff --git a/src/modules/partition/tests/CMakeLists.txt b/src/modules/partition/tests/CMakeLists.txt
index 2839270fbbdd90400454425d389de98747dc0003..da017d96ffbfbf7bf4f8aa7a3f02976d43e2e57d 100644
--- a/src/modules/partition/tests/CMakeLists.txt
+++ b/src/modules/partition/tests/CMakeLists.txt
@@ -61,6 +61,7 @@ calamares_add_test(
     SOURCES
         ${PartitionModule_SOURCE_DIR}/jobs/AutoMountManagementJob.cpp
         AutoMountTests.cpp
+    DEFINITIONS ${_partition_defs}
 )
 
 calamares_add_test(
@@ -70,4 +71,5 @@ calamares_add_test(
         ${PartitionModule_SOURCE_DIR}/core/DeviceList.cpp
     LIBRARIES
         kpmcore
+    DEFINITIONS ${_partition_defs}
 )
diff --git a/src/modules/partition/tests/ClearMountsJobTests.cpp b/src/modules/partition/tests/ClearMountsJobTests.cpp
index 3af400fde9bd85e4ef769933b7cbadca9f4f2a86..17565e756cea9825353da11d31907c3c4fbdaddf 100644
--- a/src/modules/partition/tests/ClearMountsJobTests.cpp
+++ b/src/modules/partition/tests/ClearMountsJobTests.cpp
@@ -32,10 +32,10 @@ getPartitionsForDevice_other( const QString& deviceName )
 {
     QProcess process;
     process.setProgram( "sh" );
-    process.setArguments(
-        { "-c",
-          QString( "echo $(awk '{print \"/dev/\"$4}' /proc/partitions | sed -e '/name/d' -e '/^$/d' -e '/[1-9]/!d' | grep %1)" )
-              .arg( deviceName ) } );
+    process.setArguments( { "-c",
+                            QString( "echo $(awk '{print \"/dev/\"$4}' /proc/partitions | sed -e '/name/d' -e '/^$/d' "
+                                     "-e '/[1-9]/!d' | grep %1)" )
+                                .arg( deviceName ) } );
     process.start();
     process.waitForFinished();
 
diff --git a/src/modules/preservefiles/CMakeLists.txt b/src/modules/preservefiles/CMakeLists.txt
index 820c50a2b99ae8af3512abe6ed0ddfc296c25e58..5df637321a699396cec304d6637c65b8fabd1813 100644
--- a/src/modules/preservefiles/CMakeLists.txt
+++ b/src/modules/preservefiles/CMakeLists.txt
@@ -3,14 +3,20 @@
 #   SPDX-FileCopyrightText: 2020 Adriaan de Groot <groot@kde.org>
 #   SPDX-License-Identifier: BSD-2-Clause
 #
-include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui )
-
 calamares_add_plugin( preservefiles
     TYPE job
     EXPORT_MACRO PLUGINDLLEXPORT_PRO
     SOURCES
+        Item.cpp
         PreserveFiles.cpp
     # REQUIRES mount  # To set the rootMountPoint
     SHARED_LIB
     EMERGENCY
 )
+
+calamares_add_test(
+    preservefilestest
+    SOURCES
+        Item.cpp
+        Tests.cpp
+)
diff --git a/src/modules/preservefiles/Item.cpp b/src/modules/preservefiles/Item.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2ae929e67ade8bc2eeb4603a74b55fe8dcc91d04
--- /dev/null
+++ b/src/modules/preservefiles/Item.cpp
@@ -0,0 +1,159 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *  SPDX-FileCopyrightText: 2018, 2021 Adriaan de Groot <groot@kde.org>
+ *  SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+
+#include "Item.h"
+
+#include "GlobalStorage.h"
+#include "JobQueue.h"
+#include "utils/CalamaresUtilsSystem.h"
+#include "utils/Logger.h"
+#include "utils/Units.h"
+#include "utils/Variant.h"
+
+#include <QFile>
+
+using namespace CalamaresUtils::Units;
+
+static bool
+copy_file( const QString& source, const QString& dest )
+{
+    QFile sourcef( source );
+    if ( !sourcef.open( QFile::ReadOnly ) )
+    {
+        cWarning() << "Could not read" << source;
+        return false;
+    }
+
+    QFile destf( dest );
+    if ( !destf.open( QFile::WriteOnly ) )
+    {
+        sourcef.close();
+        cWarning() << "Could not open" << destf.fileName() << "for writing; could not copy" << source;
+        return false;
+    }
+
+    QByteArray b;
+    do
+    {
+        b = sourcef.read( 1_MiB );
+        destf.write( b );
+    } while ( b.count() > 0 );
+
+    sourcef.close();
+    destf.close();
+
+    return true;
+}
+
+Item
+Item::fromVariant( const QVariant& v, const CalamaresUtils::Permissions& defaultPermissions )
+{
+    if ( v.type() == QVariant::String )
+    {
+        QString filename = v.toString();
+        if ( !filename.isEmpty() )
+        {
+            return { filename, filename, defaultPermissions, ItemType::Path, false };
+        }
+        else
+        {
+            cWarning() << "Empty filename for preservefiles, item" << v;
+            return {};
+        }
+    }
+    else if ( v.type() == QVariant::Map )
+    {
+        const auto map = v.toMap();
+
+        CalamaresUtils::Permissions perm( defaultPermissions );
+        ItemType t = ItemType::None;
+        bool optional = CalamaresUtils::getBool( map, "optional", false );
+
+        {
+            QString perm_string = map[ "perm" ].toString();
+            if ( !perm_string.isEmpty() )
+            {
+                perm = CalamaresUtils::Permissions( perm_string );
+            }
+        }
+
+        {
+            QString from = map[ "from" ].toString();
+            t = ( from == "log" ) ? ItemType::Log : ( from == "config" ) ? ItemType::Config : ItemType::None;
+
+            if ( t == ItemType::None && !map[ "src" ].toString().isEmpty() )
+            {
+                t = ItemType::Path;
+            }
+        }
+
+        QString dest = map[ "dest" ].toString();
+        if ( dest.isEmpty() )
+        {
+            cWarning() << "Empty dest for preservefiles, item" << v;
+            return {};
+        }
+
+        switch ( t )
+        {
+        case ItemType::Config:
+            return { QString(), dest, perm, t, optional };
+        case ItemType::Log:
+            return { QString(), dest, perm, t, optional };
+        case ItemType::Path:
+            return { map[ "src" ].toString(), dest, perm, t, optional };
+        case ItemType::None:
+            cWarning() << "Invalid type for preservefiles, item" << v;
+            return {};
+        }
+    }
+    cWarning() << "Invalid type for preservefiles, item" << v;
+    return {};
+}
+
+
+bool
+Item::exec( const std::function< QString( QString ) >& replacements ) const
+{
+    QString expanded_dest = replacements( dest );
+    QString full_dest = CalamaresUtils::System::instance()->targetPath( expanded_dest );
+
+    bool success = false;
+    switch ( m_type )
+    {
+    case ItemType::None:
+        cWarning() << "Invalid item for preservefiles skipped.";
+        return false;
+    case ItemType::Config:
+        if ( !( success = Calamares::JobQueue::instance()->globalStorage()->saveJson( full_dest ) ) )
+        {
+            cWarning() << "Could not write a JSON dump of global storage to" << full_dest;
+        }
+        break;
+    case ItemType::Log:
+        if ( !( success = copy_file( Logger::logFile(), full_dest ) ) )
+        {
+            cWarning() << "Could not preserve log file to" << full_dest;
+        }
+        break;
+    case ItemType::Path:
+        if ( !( success = copy_file( source, full_dest ) ) )
+        {
+            cWarning() << "Could not preserve" << source << "to" << full_dest;
+        }
+        break;
+    }
+    if ( !success )
+    {
+        CalamaresUtils::System::instance()->removeTargetFile( expanded_dest );
+        return false;
+    }
+    else
+    {
+        return perm.apply( full_dest );
+    }
+}
diff --git a/src/modules/preservefiles/Item.h b/src/modules/preservefiles/Item.h
new file mode 100644
index 0000000000000000000000000000000000000000..896b9471f7bb07df7a247e279b4bdc9834fccb92
--- /dev/null
+++ b/src/modules/preservefiles/Item.h
@@ -0,0 +1,76 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *  SPDX-FileCopyrightText: 2018, 2021 Adriaan de Groot <groot@kde.org>
+ *  SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+#ifndef PRESERVEFILES_ITEM_H
+#define PRESERVEFILES_ITEM_H
+
+#include "utils/Permissions.h"
+
+#include <QString>
+#include <QVariant>
+
+#include <memory>
+
+enum class ItemType
+{
+    None,
+    Path,
+    Log,
+    Config
+};
+
+/** @brief Represents one item to copy
+ *
+ * All item types need a destination (to place the data), this is
+ * intepreted within the target system. All items need a permission,
+ * which is applied to the data once written.
+ *
+ * The source may be a path, but not all types need a source.
+ */
+class Item
+{
+    QString source;
+    QString dest;
+    CalamaresUtils::Permissions perm;
+    ItemType m_type = ItemType::None;
+    bool m_optional = false;
+
+public:
+    Item( const QString& src, const QString& d, CalamaresUtils::Permissions p, ItemType t, bool optional )
+        : source( src )
+        , dest( d )
+        , perm( std::move( p ) )
+        , m_type( t )
+        , m_optional( optional )
+    {
+    }
+
+    Item()
+        : m_type( ItemType::None )
+    {
+    }
+
+    operator bool() const { return m_type != ItemType::None; }
+    ItemType type() const { return m_type; }
+    bool isOptional() const { return m_optional; }
+
+    bool exec( const std::function< QString( QString ) >& replacements ) const;
+
+
+    /** @brief Create an Item -- or one of its subclasses -- from @p v
+     *
+     * Depending on the structure and contents of @p v, a pointer
+     * to an Item is returned. If @p v cannot be interpreted meaningfully,
+     * then a nullptr is returned.
+     *
+     * When the entry contains a *perm* key, use that permission, otherwise
+     * apply @p defaultPermissions to the item.
+     */
+    static Item fromVariant( const QVariant& v, const CalamaresUtils::Permissions& defaultPermissions );
+};
+
+
+#endif
diff --git a/src/modules/preservefiles/PreserveFiles.cpp b/src/modules/preservefiles/PreserveFiles.cpp
index b235aac9334fb7a8790f86aebd22e82c38771a1a..f904ded8c714191a442f0396d7f0f1e45631ccfa 100644
--- a/src/modules/preservefiles/PreserveFiles.cpp
+++ b/src/modules/preservefiles/PreserveFiles.cpp
@@ -7,46 +7,20 @@
 
 #include "PreserveFiles.h"
 
+#include "Item.h"
+
 #include "CalamaresVersion.h"
 #include "GlobalStorage.h"
 #include "JobQueue.h"
 #include "utils/CalamaresUtilsSystem.h"
 #include "utils/CommandList.h"
 #include "utils/Logger.h"
-#include "utils/Permissions.h"
 #include "utils/Units.h"
 
 #include <QFile>
 
 using namespace CalamaresUtils::Units;
 
-QString
-targetPrefix()
-{
-    if ( CalamaresUtils::System::instance()->doChroot() )
-    {
-        Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
-        if ( gs && gs->contains( "rootMountPoint" ) )
-        {
-            QString r = gs->value( "rootMountPoint" ).toString();
-            if ( !r.isEmpty() )
-            {
-                return r;
-            }
-            else
-            {
-                cDebug() << "RootMountPoint is empty";
-            }
-        }
-        else
-        {
-            cDebug() << "No rootMountPoint defined, preserving files to '/'";
-        }
-    }
-
-    return QLatin1String( "/" );
-}
-
 QString
 atReplacements( QString s )
 {
@@ -79,95 +53,34 @@ PreserveFiles::prettyName() const
     return tr( "Saving files for later ..." );
 }
 
-static bool
-copy_file( const QString& source, const QString& dest )
-{
-    QFile sourcef( source );
-    if ( !sourcef.open( QFile::ReadOnly ) )
-    {
-        cWarning() << "Could not read" << source;
-        return false;
-    }
-
-    QFile destf( dest );
-    if ( !destf.open( QFile::WriteOnly ) )
-    {
-        sourcef.close();
-        cWarning() << "Could not open" << destf.fileName() << "for writing; could not copy" << source;
-        return false;
-    }
-
-    QByteArray b;
-    do
-    {
-        b = sourcef.read( 1_MiB );
-        destf.write( b );
-    } while ( b.count() > 0 );
-
-    sourcef.close();
-    destf.close();
-
-    return true;
-}
-
 Calamares::JobResult
 PreserveFiles::exec()
 {
-    if ( m_items.isEmpty() )
+    if ( m_items.empty() )
     {
         return Calamares::JobResult::error( tr( "No files configured to save for later." ) );
     }
 
-    QString prefix = targetPrefix();
-    if ( !prefix.endsWith( '/' ) )
-    {
-        prefix.append( '/' );
-    }
-
     int count = 0;
-    for ( const auto& it : m_items )
+    for ( const auto& it : qAsConst( m_items ) )
     {
-        QString source = it.source;
-        QString bare_dest = atReplacements( it.dest );
-        QString dest = prefix + bare_dest;
-
-        if ( it.type == ItemType::Log )
-        {
-            source = Logger::logFile();
-        }
-        if ( it.type == ItemType::Config )
+        if ( !it )
         {
-            if ( !Calamares::JobQueue::instance()->globalStorage()->saveJson( dest ) )
-            {
-                cWarning() << "Could not write a JSON dump of global storage to" << dest;
-            }
-            else
-            {
-                ++count;
-            }
+            // Invalid entries are nullptr, ignore them but count as a success
+            // because they shouldn't block the installation. There are
+            // warnings in the log showing what the configuration problem is.
+            ++count;
+            continue;
         }
-        else if ( source.isEmpty() )
+        // Try to preserve the file. If it's marked as optional, count it
+        // as a success regardless.
+        if ( it.exec( atReplacements ) || it.isOptional() )
         {
-            cWarning() << "Skipping unnamed source file for" << dest;
-        }
-        else
-        {
-            if ( copy_file( source, dest ) )
-            {
-                if ( it.perm.isValid() )
-                {
-                    if ( !it.perm.apply( CalamaresUtils::System::instance()->targetPath( bare_dest ) ) )
-                    {
-                        cWarning() << "Could not set attributes of" << bare_dest;
-                    }
-                }
-
-                ++count;
-            }
+            ++count;
         }
     }
 
-    return count == m_items.count()
+    return count == m_items.size()
         ? Calamares::JobResult::ok()
         : Calamares::JobResult::error( tr( "Not all of the configured files could be preserved." ) );
 }
@@ -193,53 +106,11 @@ PreserveFiles::setConfigurationMap( const QVariantMap& configurationMap )
     {
         defaultPermissions = QStringLiteral( "root:root:0400" );
     }
+    CalamaresUtils::Permissions perm( defaultPermissions );
 
-    QVariantList l = files.toList();
-    unsigned int c = 0;
-    for ( const auto& li : l )
+    for ( const auto& li : files.toList() )
     {
-        if ( li.type() == QVariant::String )
-        {
-            QString filename = li.toString();
-            if ( !filename.isEmpty() )
-                m_items.append(
-                    Item { filename, filename, CalamaresUtils::Permissions( defaultPermissions ), ItemType::Path } );
-            else
-            {
-                cDebug() << "Empty filename for preservefiles, item" << c;
-            }
-        }
-        else if ( li.type() == QVariant::Map )
-        {
-            const auto map = li.toMap();
-            QString dest = map[ "dest" ].toString();
-            QString from = map[ "from" ].toString();
-            ItemType t = ( from == "log" ) ? ItemType::Log : ( from == "config" ) ? ItemType::Config : ItemType::None;
-            QString perm = map[ "perm" ].toString();
-            if ( perm.isEmpty() )
-            {
-                perm = defaultPermissions;
-            }
-
-            if ( dest.isEmpty() )
-            {
-                cDebug() << "Empty dest for preservefiles, item" << c;
-            }
-            else if ( t == ItemType::None )
-            {
-                cDebug() << "Invalid type for preservefiles, item" << c;
-            }
-            else
-            {
-                m_items.append( Item { QString(), dest, CalamaresUtils::Permissions( perm ), t } );
-            }
-        }
-        else
-        {
-            cDebug() << "Invalid type for preservefiles, item" << c;
-        }
-
-        ++c;
+        m_items.push_back( Item::fromVariant( li, perm ) );
     }
 }
 
diff --git a/src/modules/preservefiles/PreserveFiles.h b/src/modules/preservefiles/PreserveFiles.h
index 7a0aab34d9bf0945ed660f824203750dd25d577e..dfd2804e3fec478421f0360c2a92ec851b98092e 100644
--- a/src/modules/preservefiles/PreserveFiles.h
+++ b/src/modules/preservefiles/PreserveFiles.h
@@ -10,33 +10,14 @@
 
 #include "CppJob.h"
 #include "DllMacro.h"
-#include "utils/Permissions.h"
 #include "utils/PluginFactory.h"
 
-#include <QList>
-#include <QObject>
-#include <QVariantMap>
+class Item;
 
 class PLUGINDLLEXPORT PreserveFiles : public Calamares::CppJob
 {
     Q_OBJECT
 
-    enum class ItemType
-    {
-        None,
-        Path,
-        Log,
-        Config
-    };
-
-    struct Item
-    {
-        QString source;
-        QString dest;
-        CalamaresUtils::Permissions perm;
-        ItemType type;
-    };
-
     using ItemList = QList< Item >;
 
 public:
diff --git a/src/modules/preservefiles/Tests.cpp b/src/modules/preservefiles/Tests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..57cefcf9d1d65dfbcd3cc12322092190e1c7ab1a
--- /dev/null
+++ b/src/modules/preservefiles/Tests.cpp
@@ -0,0 +1,93 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *   SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
+ *   SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ *   Calamares is Free Software: see the License-Identifier above.
+ *
+ */
+
+#include "Item.h"
+
+#include "Settings.h"
+#include "utils/CalamaresUtilsSystem.h"
+#include "utils/Logger.h"
+#include "utils/NamedEnum.h"
+#include "utils/Yaml.h"
+
+#include <QtTest/QtTest>
+
+class PreserveFilesTests : public QObject
+{
+    Q_OBJECT
+public:
+    PreserveFilesTests();
+    ~PreserveFilesTests() override {}
+
+private Q_SLOTS:
+    void initTestCase();
+
+    void testItems_data();
+    void testItems();
+};
+
+PreserveFilesTests::PreserveFilesTests() {}
+
+void
+PreserveFilesTests::initTestCase()
+{
+    Logger::setupLogLevel( Logger::LOGDEBUG );
+    cDebug() << "PreserveFiles test started.";
+
+    // Ensure we have a system object, expect it to be a "bogus" one
+    CalamaresUtils::System* system = CalamaresUtils::System::instance();
+    QVERIFY( system );
+    cDebug() << Logger::SubEntry << "System @" << Logger::Pointer( system );
+
+    const auto* settings = Calamares::Settings::instance();
+    if ( !settings )
+    {
+        (void)new Calamares::Settings( true );
+    }
+}
+
+void
+PreserveFilesTests::testItems_data()
+{
+    QTest::addColumn< QString >( "filename" );
+    QTest::addColumn< bool >( "ok" );
+    QTest::addColumn< int >( "type_i" );
+
+    QTest::newRow( "log     " ) << QString( "1a-log.conf" ) << true << smash( ItemType::Log );
+    QTest::newRow( "config  " ) << QString( "1b-config.conf" ) << true << smash( ItemType::Config );
+    QTest::newRow( "src     " ) << QString( "1c-src.conf" ) << true << smash( ItemType::Path );
+    QTest::newRow( "filename" ) << QString( "1d-filename.conf" ) << true << smash( ItemType::Path );
+    QTest::newRow( "empty   " ) << QString( "1e-empty.conf" ) << false << smash( ItemType::None );
+    QTest::newRow( "bad     " ) << QString( "1f-bad.conf" ) << false << smash( ItemType::None );
+}
+
+void
+PreserveFilesTests::testItems()
+{
+    QFETCH( QString, filename );
+    QFETCH( bool, ok );
+    QFETCH( int, type_i );
+
+    QFile fi( QString( "%1/tests/%2" ).arg( BUILD_AS_TEST, filename ) );
+    QVERIFY( fi.exists() );
+
+    bool config_file_ok = false;
+    const auto map = CalamaresUtils::loadYaml( fi, &config_file_ok );
+    QVERIFY( config_file_ok );
+
+    CalamaresUtils::Permissions perm( QStringLiteral( "adridg:adridg:0750" ) );
+    auto i = Item::fromVariant( map[ "item" ], perm );
+    QCOMPARE( bool( i ), ok );
+    QCOMPARE( smash( i.type() ), type_i );
+}
+
+QTEST_GUILESS_MAIN( PreserveFilesTests )
+
+#include "utils/moc-warnings.h"
+
+#include "Tests.moc"
diff --git a/src/modules/preservefiles/preservefiles.conf b/src/modules/preservefiles/preservefiles.conf
index 6af0872d74b5af353daec0f1e400a14cbc4e4188..4fb393b2e10685ad8287307f7b40c270df2e020c 100644
--- a/src/modules/preservefiles/preservefiles.conf
+++ b/src/modules/preservefiles/preservefiles.conf
@@ -7,42 +7,58 @@
 # the list should have one of these forms:
 #
 # - an absolute path (probably within the host system). This will be preserved
-#   as the same path within the target system (chroot). If, globally, dontChroot
-#   is true, then these items are ignored (since the destination is the same
-#   as the source).
+#   as the same path within the target system (chroot). If, globally,
+#   *dontChroot* is true, then these items will be ignored (since the
+#   destination is the same as the source).
 # - a map with a *dest* key. The *dest* value is a path interpreted in the
-#   target system (if dontChroot is true, in the host system). Relative paths
-#   are not recommended. There are three possible other keys in the map:
+#   target system (if the global *dontChroot* is true, then the host is the
+#   target as well). Relative paths are not recommended. There are two
+#   ways to select the source data for the file:
 #   - *from*, which must have one of the values, below; it is used to
 #     preserve files whose pathname is known to Calamares internally.
 #   - *src*, to refer to a path interpreted in the host system. Relative
 #     paths are not recommended, and are interpreted relative to where
 #     Calamares is being run.
+#   Exactly one of the two source keys (either *from* or *src*) must be set.
+#
+#   Special values for the key *from* are:
+#     - *log*, for the complete log file (up to the moment the preservefiles
+#       module is run),
+#     - *config*, for a JSON dump of the contents of global storage.
+#       Note that this may contain sensitive information, and should be
+#       given restrictive permissions.
+#
+#  A map with a *dest* key can have these additional fields:
 #   - *perm*, is a colon-separated tuple of <user>:<group>:<mode>
 #     where <mode> is in octal (e.g. 4777 for wide-open, 0400 for read-only
 #     by owner). If set, the file's ownership and permissions are set to
 #     those values within the target system; if not set, no permissions
 #     are changed.
-#   Only one of the two source keys (either *from* or *src*) may be set.
+#   - *optional*, is a boolean; if this is set to `true` then failure to
+#     preserve the file will **not** be counted as a failure of the
+#     module, and installation will proceed. Set this for files that might
+#     not exist in the host system (e.g. nvidia configuration files that
+#     are created in some boot scenarios and not in others).
 #
-# The target filename is modified as follows:
-#   - `@@ROOT@@` is replaced by the path to the target root (may be /)
+# The target path (*dest*) is modified as follows:
+#   - `@@ROOT@@` is replaced by the path to the target root (may be /).
+#     There is never any reason to use this, since the *dest* is already
+#     interpreted in the target system.
 #   - `@@USER@@` is replaced by the username entered by on the user
 #       page (may be empty, for instance if no user page is enabled)
 #
-# Special values for the key *from* are:
-#   - *log*, for the complete log file (up to the moment the preservefiles
-#     module is run),
-#   - *config*, for a JSON dump of the contents of global storage
----
+#
+#
 files:
-  - /etc/oem-information
   - from: log
-    dest: /root/install.log
-    perm: root:wheel:644
+    dest: /var/log/Calamares.log
+    perm: root:wheel:600
   - from: config
-    dest: /root/install.json
-    perm: root:wheel:400
+    dest: /var/log/Calamares-install.json
+    perm: root:wheel:600
+# - src: /var/log/nvidia.conf
+#   dest: /var/log/Calamares-nvidia.conf
+#   optional: true
 
 # The *perm* key contains a default value to apply to all files listed
 # above that do not have a *perm* key of their own. If not set,
diff --git a/src/modules/preservefiles/preservefiles.schema.yaml b/src/modules/preservefiles/preservefiles.schema.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..65067ea9724300568cdc3662c39b6d52d9838d85
--- /dev/null
+++ b/src/modules/preservefiles/preservefiles.schema.yaml
@@ -0,0 +1,37 @@
+# SPDX-FileCopyrightText: 2020 Adriaan de Groot <groot@kde.org>
+# SPDX-License-Identifier: GPL-3.0-or-later
+---
+$schema: https://json-schema.org/schema#
+$id: https://calamares.io/schemas/preservefiles
+additionalProperties: false
+type: object
+properties:
+    # TODO: it's a particularly-formatted string
+    perm: { type: string }
+    files:
+        type: array
+        items:
+            # There are three entries here because: string, or an entry with
+            # a src (but no from) or an entry with from (but no src).
+            anyOf:
+              - type: string
+              - type: object
+                properties:
+                    dest: { type: string }
+                    src: { type: string }
+                    # TODO: it's a particularly-formatted string
+                    perm: { type: string }
+                    optional: { type: boolean }
+                required: [ dest ]
+                additionalProperties: false
+              - type: object
+                properties:
+                    dest: { type: string }
+                    from: { type: string, enum: [config, log] }
+                    # TODO: it's a particularly-formatted string
+                    perm: { type: string }
+                    optional: { type: boolean }
+                required: [ dest ]
+                additionalProperties: false
+
+required: [ files ]
diff --git a/src/modules/preservefiles/tests/1a-log.conf b/src/modules/preservefiles/tests/1a-log.conf
new file mode 100644
index 0000000000000000000000000000000000000000..d589d4dfbdf8bde2a4b4b9a2835d21f1df879f01
--- /dev/null
+++ b/src/modules/preservefiles/tests/1a-log.conf
@@ -0,0 +1,7 @@
+# SPDX-FileCopyrightText: no
+# SPDX-License-Identifier: CC0-1.0
+#
+item:
+    from: log
+    dest: /var/log/Calamares.log
+    perm: root:wheel:601
diff --git a/src/modules/preservefiles/tests/1b-config.conf b/src/modules/preservefiles/tests/1b-config.conf
new file mode 100644
index 0000000000000000000000000000000000000000..409dc89d9e2c698437e09292787899b6281d2745
--- /dev/null
+++ b/src/modules/preservefiles/tests/1b-config.conf
@@ -0,0 +1,6 @@
+# SPDX-FileCopyrightText: no
+# SPDX-License-Identifier: CC0-1.0
+item:
+    from: config
+    dest: /var/log/Calamares-install.json
+    perm: root:wheel:600
diff --git a/src/modules/preservefiles/tests/1c-src.conf b/src/modules/preservefiles/tests/1c-src.conf
new file mode 100644
index 0000000000000000000000000000000000000000..130ddd06fe25f4425393443a0097ebc82a74abcf
--- /dev/null
+++ b/src/modules/preservefiles/tests/1c-src.conf
@@ -0,0 +1,6 @@
+# SPDX-FileCopyrightText: no
+# SPDX-License-Identifier: CC0-1.0
+item:
+    src: /root/.cache/calamares/session.log
+    dest: /var/log/Calamares.log
+    perm: root:wheel:600
diff --git a/src/modules/preservefiles/tests/1d-filename.conf b/src/modules/preservefiles/tests/1d-filename.conf
new file mode 100644
index 0000000000000000000000000000000000000000..130ddd06fe25f4425393443a0097ebc82a74abcf
--- /dev/null
+++ b/src/modules/preservefiles/tests/1d-filename.conf
@@ -0,0 +1,6 @@
+# SPDX-FileCopyrightText: no
+# SPDX-License-Identifier: CC0-1.0
+item:
+    src: /root/.cache/calamares/session.log
+    dest: /var/log/Calamares.log
+    perm: root:wheel:600
diff --git a/src/modules/preservefiles/tests/1e-empty.conf b/src/modules/preservefiles/tests/1e-empty.conf
new file mode 100644
index 0000000000000000000000000000000000000000..183d4e456ea7da14512d3bf074ce40d60674da95
--- /dev/null
+++ b/src/modules/preservefiles/tests/1e-empty.conf
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: no
+# SPDX-License-Identifier: CC0-1.0
+item: []
diff --git a/src/modules/preservefiles/tests/1f-bad.conf b/src/modules/preservefiles/tests/1f-bad.conf
new file mode 100644
index 0000000000000000000000000000000000000000..b2c008955022a4d29759afdb14a8bcd636812829
--- /dev/null
+++ b/src/modules/preservefiles/tests/1f-bad.conf
@@ -0,0 +1,4 @@
+# SPDX-FileCopyrightText: no
+# SPDX-License-Identifier: CC0-1.0
+item:
+    bop: 1
diff --git a/src/modules/tracking/TrackingJobs.cpp b/src/modules/tracking/TrackingJobs.cpp
index 5e3cd12b5fa47613f560dab3c24a30e8a60332f8..7430bd57b8d4f5f8667b943dbcce270ecdc717e5 100644
--- a/src/modules/tracking/TrackingJobs.cpp
+++ b/src/modules/tracking/TrackingJobs.cpp
@@ -19,6 +19,8 @@
 
 #include <KMacroExpander>
 
+#include <QCoreApplication>
+
 #include <chrono>
 
 
@@ -37,7 +39,6 @@ namespace
  */
 class TrackingInstallJob : public Calamares::Job
 {
-    Q_OBJECT
 public:
     TrackingInstallJob( const QString& url );
     ~TrackingInstallJob() override;
@@ -58,7 +59,6 @@ private:
  */
 class TrackingMachineUpdateManagerJob : public Calamares::Job
 {
-    Q_OBJECT
 public:
     ~TrackingMachineUpdateManagerJob() override;
 
@@ -75,7 +75,6 @@ public:
  */
 class TrackingKUserFeedbackJob : public Calamares::Job
 {
-    Q_OBJECT
 public:
     TrackingKUserFeedbackJob( const QString& username, const QStringList& areas );
     ~TrackingKUserFeedbackJob() override;
@@ -99,13 +98,13 @@ TrackingInstallJob::~TrackingInstallJob() {}
 QString
 TrackingInstallJob::prettyName() const
 {
-    return tr( "Installation feedback" );
+    return QCoreApplication::translate( "TrackingInstallJob", "Installation feedback" );
 }
 
 QString
 TrackingInstallJob::prettyStatusMessage() const
 {
-    return tr( "Sending installation feedback." );
+    return QCoreApplication::translate( "TrackingInstallJob", "Sending installation feedback." );
 }
 
 Calamares::JobResult
@@ -122,8 +121,9 @@ TrackingInstallJob::exec()
     if ( result.status == RequestStatus::Timeout )
     {
         cWarning() << "install-tracking request timed out.";
-        return Calamares::JobResult::error( tr( "Internal error in install-tracking." ),
-                                            tr( "HTTP request timed out." ) );
+        return Calamares::JobResult::error(
+            QCoreApplication::translate( "TrackingInstallJob", "Internal error in install-tracking." ),
+            QCoreApplication::translate( "TrackingInstallJob", "HTTP request timed out." ) );
     }
     return Calamares::JobResult::ok();
 }
@@ -133,13 +133,13 @@ TrackingMachineUpdateManagerJob::~TrackingMachineUpdateManagerJob() {}
 QString
 TrackingMachineUpdateManagerJob::prettyName() const
 {
-    return tr( "Machine feedback" );
+    return QCoreApplication::translate( "TrackingMachineUpdateManagerJob", "Machine feedback" );
 }
 
 QString
 TrackingMachineUpdateManagerJob::prettyStatusMessage() const
 {
-    return tr( "Configuring machine feedback." );
+    return QCoreApplication::translate( "TrackingMachineUpdateManagerJob", "Configuring machine feedback." );
 }
 
 Calamares::JobResult
@@ -162,14 +162,20 @@ TrackingMachineUpdateManagerJob::exec()
     else if ( r > 0 )
     {
         return Calamares::JobResult::error(
-            tr( "Error in machine feedback configuration." ),
-            tr( "Could not configure machine feedback correctly, script error %1." ).arg( r ) );
+            QCoreApplication::translate( "TrackingMachineUpdateManagerJob",
+                                         "Error in machine feedback configuration." ),
+            QCoreApplication::translate( "TrackingMachineUpdateManagerJob",
+                                         "Could not configure machine feedback correctly, script error %1." )
+                .arg( r ) );
     }
     else
     {
         return Calamares::JobResult::error(
-            tr( "Error in machine feedback configuration." ),
-            tr( "Could not configure machine feedback correctly, Calamares error %1." ).arg( r ) );
+            QCoreApplication::translate( "TrackingMachineUpdateManagerJob",
+                                         "Error in machine feedback configuration." ),
+            QCoreApplication::translate( "TrackingMachineUpdateManagerJob",
+                                         "Could not configure machine feedback correctly, Calamares error %1." )
+                .arg( r ) );
     }
 }
 
@@ -184,13 +190,13 @@ TrackingKUserFeedbackJob::~TrackingKUserFeedbackJob() {}
 QString
 TrackingKUserFeedbackJob::prettyName() const
 {
-    return tr( "KDE user feedback" );
+    return QCoreApplication::translate( "TrackingKUserFeedbackJob", "KDE user feedback" );
 }
 
 QString
 TrackingKUserFeedbackJob::prettyStatusMessage() const
 {
-    return tr( "Configuring KDE user feedback." );
+    return QCoreApplication::translate( "TrackingKUserFeedbackJob", "Configuring KDE user feedback." );
 }
 
 Calamares::JobResult
@@ -212,21 +218,25 @@ FeedbackLevel=16
         if ( r > 0 )
         {
             return Calamares::JobResult::error(
-                tr( "Error in KDE user feedback configuration." ),
-                tr( "Could not configure KDE user feedback correctly, script error %1." ).arg( r ) );
+                QCoreApplication::translate( "TrackingKUserFeedbackJob", "Error in KDE user feedback configuration." ),
+                QCoreApplication::translate( "TrackingKUserFeedbackJob",
+                                             "Could not configure KDE user feedback correctly, script error %1." )
+                    .arg( r ) );
         }
         else if ( r < 0 )
         {
             return Calamares::JobResult::error(
-                tr( "Error in KDE user feedback configuration." ),
-                tr( "Could not configure KDE user feedback correctly, Calamares error %1." ).arg( r ) );
+                QCoreApplication::translate( "TrackingKUserFeedbackJob", "Error in KDE user feedback configuration." ),
+                QCoreApplication::translate( "TrackingKUserFeedbackJob",
+                                             "Could not configure KDE user feedback correctly, Calamares error %1." )
+                    .arg( r ) );
         }
     }
 
     return Calamares::JobResult::ok();
 }
 
-} // namespace
+}  // namespace
 
 void
 addJob( Calamares::JobList& list, InstallTrackingConfig* config )
@@ -290,7 +300,3 @@ addJob( Calamares::JobList& list, UserTrackingConfig* config )
         }
     }
 }
-
-#include "utils/moc-warnings.h"
-
-#include "TrackingJobs.moc"
diff --git a/src/modules/umount/CMakeLists.txt b/src/modules/umount/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d728470073150cbcc4923392e37ffa801594fb58
--- /dev/null
+++ b/src/modules/umount/CMakeLists.txt
@@ -0,0 +1,19 @@
+# === This file is part of Calamares - <https://calamares.io> ===
+#
+#   SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
+#   SPDX-License-Identifier: BSD-2-Clause
+#
+calamares_add_plugin( umount
+    TYPE job
+    EXPORT_MACRO PLUGINDLLEXPORT_PRO
+    SOURCES
+        UmountJob.cpp
+    SHARED_LIB
+    EMERGENCY
+)
+
+calamares_add_test(
+    umounttest
+    SOURCES
+        Tests.cpp
+)
diff --git a/src/modules/umount/Tests.cpp b/src/modules/umount/Tests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..dc0198619cfc19e420964fc0ddab29e0a440ddba
--- /dev/null
+++ b/src/modules/umount/Tests.cpp
@@ -0,0 +1,52 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *   SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
+ *   SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ *   Calamares is Free Software: see the License-Identifier above.
+ *
+ */
+
+#include "UmountJob.h"
+
+#include "GlobalStorage.h"
+#include "JobQueue.h"
+#include "utils/CalamaresUtilsSystem.h"
+#include "utils/Logger.h"
+
+#include <QDir>
+#include <QFile>
+#include <QtTest/QtTest>
+
+// Internals of UmountJob.cpp
+
+// Actual tests
+class UmountTests : public QObject
+{
+    Q_OBJECT
+public:
+    UmountTests() {}
+    ~UmountTests() override {}
+
+private Q_SLOTS:
+    void initTestCase();
+    void testTrue();
+};
+
+void
+UmountTests::initTestCase()
+{
+    Logger::setupLogLevel( Logger::LOGDEBUG );
+}
+
+void
+UmountTests::testTrue()
+{
+    QVERIFY( true );
+}
+
+QTEST_GUILESS_MAIN( UmountTests )
+
+#include "utils/moc-warnings.h"
+
+#include "Tests.moc"
diff --git a/src/modules/umount/UmountJob.cpp b/src/modules/umount/UmountJob.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b9d92fa87c345b59db39c5efba57bbe6a7a380e3
--- /dev/null
+++ b/src/modules/umount/UmountJob.cpp
@@ -0,0 +1,158 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ * Tags from the Python version of this module:
+ *   SPDX-FileCopyrightText: 2014 Aurélien Gâteau <agateau@kde.org>
+ *   SPDX-FileCopyrightText: 2016 Anke Boersma <demm@kaosx.us>
+ *   SPDX-FileCopyrightText: 2018 Adriaan de Groot <groot@kde.org>
+ * Tags for the C++ version of this module:
+ *   SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
+ *   SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ *   Calamares is Free Software: see the License-Identifier above.
+ *
+ */
+
+#include "UmountJob.h"
+
+#include "partition/Mount.h"
+#include "utils/CalamaresUtilsSystem.h"
+#include "utils/Logger.h"
+#include "utils/Variant.h"
+
+#include "GlobalStorage.h"
+#include "JobQueue.h"
+
+#include <QCoreApplication>
+#include <QDir>
+#include <QList>
+
+UmountJob::UmountJob( QObject* parent )
+    : Calamares::CppJob( parent )
+{
+}
+
+UmountJob::~UmountJob() {}
+
+QString
+UmountJob::prettyName() const
+{
+    return tr( "Unmount file systems." );
+}
+
+static Calamares::JobResult
+unmountTargetMounts( const QString& rootMountPoint )
+{
+    QDir targetMount( rootMountPoint );
+    if ( !targetMount.exists() )
+    {
+        return Calamares::JobResult::internalError(
+            QCoreApplication::translate( UmountJob::staticMetaObject.className(), "Could not unmount target system." ),
+            QCoreApplication::translate( UmountJob::staticMetaObject.className(),
+                                         "The target system is not mounted at '%1'." )
+                .arg( rootMountPoint ),
+            Calamares::JobResult::GenericError );
+    }
+    QString targetMountPath = targetMount.absolutePath();
+    if ( !targetMountPath.endsWith( '/' ) )
+    {
+        targetMountPath.append( '/' );
+    }
+
+    using MtabInfo = CalamaresUtils::Partition::MtabInfo;
+    auto targetMounts = MtabInfo::fromMtabFilteredByPrefix( targetMountPath );
+    std::sort( targetMounts.begin(), targetMounts.end(), MtabInfo::mountPointOrder );
+
+    for ( const auto& m : qAsConst( targetMounts ) )
+    {
+        if ( CalamaresUtils::Partition::unmount( m.mountPoint, { "-lv" } ) )
+        {
+            // Returns the program's exit code, so 0 is success
+            return Calamares::JobResult::error(
+                QCoreApplication::translate( UmountJob::staticMetaObject.className(),
+                                             "Could not unmount target system." ),
+                QCoreApplication::translate( UmountJob::staticMetaObject.className(),
+                                             "The device '%1' is mounted in the target system. It is mounted at '%2'. "
+                                             "The device could not be unmounted." )
+                    .arg( m.device, m.mountPoint ) );
+        }
+    }
+    return Calamares::JobResult::ok();
+}
+
+static Calamares::JobResult
+exportZFSPools( const QString& rootMountPoint )
+{
+    auto* gs = Calamares::JobQueue::instance()->globalStorage();
+    QStringList poolNames;
+    {
+        // The pools are dictionaries / VariantMaps
+        auto zfs_pool_list = gs->value( "zfsPoolInfo" ).toList();
+        for ( const auto& v : zfs_pool_list )
+        {
+            auto m = v.toMap();
+            QString poolName = m.value( "poolName" ).toString();
+            if ( !poolName.isEmpty() )
+            {
+                poolNames.append( poolName );
+            }
+        }
+        poolNames.sort();
+    }
+
+    for ( const auto& poolName : poolNames )
+    {
+        auto result = CalamaresUtils::System::runCommand( { "zpool", "export", poolName }, std::chrono::seconds( 30 ) );
+        if ( result.getExitCode() )
+        {
+            cWarning() << "Failed to export pool" << result.getOutput();
+        }
+    }
+    // Exporting ZFS pools does not cause the install to fail
+    return Calamares::JobResult::ok();
+}
+
+
+Calamares::JobResult
+UmountJob::exec()
+{
+    const auto* sys = CalamaresUtils::System::instance();
+    if ( !sys )
+    {
+        return Calamares::JobResult::internalError(
+            "UMount", tr( "No target system available." ), Calamares::JobResult::InvalidConfiguration );
+    }
+
+    Calamares::GlobalStorage* gs
+        = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
+    if ( !gs || gs->value( "rootMountPoint" ).toString().isEmpty() )
+    {
+        return Calamares::JobResult::internalError(
+            "UMount", tr( "No rootMountPoint is set." ), Calamares::JobResult::InvalidConfiguration );
+    }
+
+    // Do the unmounting of target-system filesystems
+    {
+        auto r = unmountTargetMounts( gs->value( "rootMountPoint" ).toString() );
+        if ( !r )
+        {
+            return r;
+        }
+    }
+    // For ZFS systems, export the pools
+    {
+        auto r = exportZFSPools( gs->value( "rootMountPoint" ).toString() );
+        if ( !r )
+        {
+            return r;
+        }
+    }
+
+    return Calamares::JobResult::ok();
+}
+
+void
+UmountJob::setConfigurationMap( const QVariantMap& map )
+{
+}
+
+CALAMARES_PLUGIN_FACTORY_DEFINITION( UmountJobFactory, registerPlugin< UmountJob >(); )
diff --git a/src/modules/umount/UmountJob.h b/src/modules/umount/UmountJob.h
new file mode 100644
index 0000000000000000000000000000000000000000..6ca5428bc9a6dce48a1f7dc4424e5859ee23d12c
--- /dev/null
+++ b/src/modules/umount/UmountJob.h
@@ -0,0 +1,41 @@
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ *   SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
+ *   SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ *   Calamares is Free Software: see the License-Identifier above.
+ *
+ */
+
+#ifndef UMOUNTJOB_H
+#define UMOUNTJOB_H
+
+#include "CppJob.h"
+#include "DllMacro.h"
+#include "utils/PluginFactory.h"
+
+#include <QObject>
+#include <QStringList>
+#include <QVariantMap>
+
+/** @brief Write 'random' data: machine id, entropy, UUIDs
+ *
+ */
+class PLUGINDLLEXPORT UmountJob : public Calamares::CppJob
+{
+    Q_OBJECT
+
+public:
+    explicit UmountJob( QObject* parent = nullptr );
+    ~UmountJob() override;
+
+    QString prettyName() const override;
+
+    Calamares::JobResult exec() override;
+
+    void setConfigurationMap( const QVariantMap& configurationMap ) override;
+};
+
+CALAMARES_PLUGIN_FACTORY_DECLARATION( UmountJobFactory )
+
+#endif  // UMOUNTJOB_H
diff --git a/src/modules/umount/main.py b/src/modules/umount/main.py
deleted file mode 100644
index 77ea91e34e2308a85d2a2480b9203eb801bdb792..0000000000000000000000000000000000000000
--- a/src/modules/umount/main.py
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-#
-# === This file is part of Calamares - <https://calamares.io> ===
-#
-#   SPDX-FileCopyrightText: 2014 Aurélien Gâteau <agateau@kde.org>
-#   SPDX-FileCopyrightText: 2016 Anke Boersma <demm@kaosx.us>
-#   SPDX-FileCopyrightText: 2018 Adriaan de Groot <groot@kde.org>
-#   SPDX-License-Identifier: GPL-3.0-or-later
-#
-#   Calamares is Free Software: see the License-Identifier above.
-#
-
-import os
-import subprocess
-import shutil
-
-import libcalamares
-from libcalamares.utils import gettext_path, gettext_languages
-
-import gettext
-_translation = gettext.translation("calamares-python",
-                                   localedir=gettext_path(),
-                                   languages=gettext_languages(),
-                                   fallback=True)
-_ = _translation.gettext
-_n = _translation.ngettext
-
-
-def pretty_name():
-    return _( "Unmount file systems." )
-
-
-def list_mounts(root_mount_point):
-    """ List mount points.
-
-    :param root_mount_point:
-    :return:
-    """
-    lst = []
-
-    root_mount_point = os.path.normpath(root_mount_point)
-    for line in open("/etc/mtab").readlines():
-        device, mount_point, _ = line.split(" ", 2)
-
-        if os.path.commonprefix([root_mount_point, mount_point]) == root_mount_point:
-            lst.append((device, mount_point))
-
-    return lst
-
-
-def export_zpools(root_mount_point):
-    """ Exports the zpools if defined in global storage
-
-    :param root_mount_point: The absolute path to the root of the install
-    :return:
-    """
-    try:
-        zfs_pool_list = libcalamares.globalstorage.value("zfsPoolInfo")
-        zfs_pool_list.sort(reverse=True, key=lambda x: x["poolName"])
-        if zfs_pool_list:
-            for zfs_pool in zfs_pool_list:
-                try:
-                    libcalamares.utils.host_env_process_output(['zpool', 'export', zfs_pool["poolName"]])
-                except subprocess.CalledProcessError:
-                    libcalamares.utils.warning("Failed to export zpool")
-    except Exception as e:
-        # If this fails it shouldn't cause the installation to fail
-        libcalamares.utils.warning("Received exception while exporting zpools: " + format(e))
-        pass
-
-
-def run():
-    """ Unmounts given mountpoints in decreasing order.
-
-    :return:
-    """
-    root_mount_point = libcalamares.globalstorage.value("rootMountPoint")
-
-    if(libcalamares.job.configuration and
-       "srcLog" in libcalamares.job.configuration and
-       "destLog" in libcalamares.job.configuration):
-        log_source = libcalamares.job.configuration["srcLog"]
-        log_destination = libcalamares.job.configuration["destLog"]
-        # Relocate log_destination into target system
-        log_destination = '{!s}/{!s}'.format(root_mount_point, log_destination)
-        # Make sure source is a string
-        log_source = '{!s}'.format(log_source)
-
-        # copy installation log before umount
-        if os.path.exists(log_source):
-            try:
-                shutil.copy2(log_source, log_destination)
-            except Exception as e:
-                libcalamares.utils.warning("Could not preserve file {!s}, "
-                                       "error {!s}".format(log_source, e))
-
-    if not root_mount_point:
-        return ("No mount point for root partition in globalstorage",
-                "globalstorage does not contain a \"rootMountPoint\" key, "
-                "doing nothing")
-
-    if not os.path.exists(root_mount_point):
-        return ("Bad mount point for root partition in globalstorage",
-                "globalstorage[\"rootMountPoint\"] is \"{}\", which does not "
-                "exist, doing nothing".format(root_mount_point))
-
-    lst = list_mounts(root_mount_point)
-    # Sort the list by mount point in decreasing order. This way we can be sure
-    # we unmount deeper dirs first.
-    lst.sort(key=lambda x: x[1], reverse=True)
-
-    for device, mount_point in lst:
-        # On success, no output; if the command fails, its output is
-        # in the exception object.
-        subprocess.check_output(["umount", "-lv", mount_point], stderr=subprocess.STDOUT)
-
-    export_zpools(root_mount_point)
-
-    os.rmdir(root_mount_point)
-
-    return None
diff --git a/src/modules/umount/module.desc b/src/modules/umount/module.desc
deleted file mode 100644
index a1c189a6207bf8c8718815ae63bbaa35215ed16c..0000000000000000000000000000000000000000
--- a/src/modules/umount/module.desc
+++ /dev/null
@@ -1,7 +0,0 @@
-# SPDX-FileCopyrightText: no
-# SPDX-License-Identifier: CC0-1.0
----
-type:       "job"
-name:       "umount"
-interface:  "python"
-script:     "main.py"
diff --git a/src/modules/umount/umount.conf b/src/modules/umount/umount.conf
index b6d86e353c6fccbb14b981de5313babee61f6775..9fb9227406e95c5b0583f8143b1cadecf3d73e49 100644
--- a/src/modules/umount/umount.conf
+++ b/src/modules/umount/umount.conf
@@ -4,22 +4,11 @@
 ### Umount Module
 #
 # This module represents the last part of the installation, the unmounting
-# of partitions used for the install.  It is also the last place where it
-# is possible to copy files to the target system.
-#
-# The "copy log files" functionality is deprecated; use the *preservefiles*
-# module instead, which is more flexible.
-#
-# This module has two configuration keys:
-#   srcLog  location in the live system where the log is
-#   destLog location in the target system to copy the log
+# of partitions used for the install.  After this, there is no regular way
+# to modify the target system anymore.
 #
 
 ---
-# example when using the normal Calamares log:
-srcLog:      "/root/.cache/calamares/session.log"
-destLog:     "/var/log/Calamares.log"
-
-# example when using a log created by `sudo calamares -d`:
-#srcLog:      "/home/live/installation.log"
-#destLog:     "/var/log/installation.log"
+# Setting emergency to true will make it so this module is still run
+# when a prior module fails
+emergency: false
diff --git a/src/modules/umount/umount.schema.yaml b/src/modules/umount/umount.schema.yaml
index 9b81db3d9cd5f6c6099739682af044b9f966e98d..37771e5f622c9b96852965196bae8d37ae01955a 100644
--- a/src/modules/umount/umount.schema.yaml
+++ b/src/modules/umount/umount.schema.yaml
@@ -6,5 +6,4 @@ $id: https://calamares.io/schemas/umount
 additionalProperties: false
 type: object
 properties:
-    srcLog: { type: string }
-    destLog: { type: string }
+    emergency: { type: boolean }
diff --git a/src/modules/unpackfs/main.py b/src/modules/unpackfs/main.py
index 9f1bd822c9de84f17cc8eae359607eca354d28c2..0330738818c995abcdd24e072ed493f43474c428 100644
--- a/src/modules/unpackfs/main.py
+++ b/src/modules/unpackfs/main.py
@@ -428,14 +428,16 @@ def run():
     if not root_mount_point:
         libcalamares.utils.warning("No mount point for root partition")
         return (_("No mount point for root partition"),
-                _("globalstorage does not contain a \"rootMountPoint\" key, "
-                "doing nothing"))
-
+                _("globalstorage does not contain a \"rootMountPoint\" key."))
     if not os.path.exists(root_mount_point):
         libcalamares.utils.warning("Bad root mount point \"{}\"".format(root_mount_point))
         return (_("Bad mount point for root partition"),
-                _("rootMountPoint is \"{}\", which does not "
-                "exist, doing nothing").format(root_mount_point))
+                _("rootMountPoint is \"{}\", which does not exist.".format(root_mount_point)))
+
+    if libcalamares.job.configuration.get("unpack", None) is None:
+        libcalamares.utils.warning("No *unpack* key in job configuration.")
+        return (_("Bad unpackfs configuration"),
+                _("There is no configuration information."))
 
     supported_filesystems = get_supported_filesystems()
 
@@ -450,17 +452,17 @@ def run():
         if sourcefs not in supported_filesystems:
             libcalamares.utils.warning("The filesystem for \"{}\" ({}) is not supported by your current kernel".format(source, sourcefs))
             libcalamares.utils.warning(" ... modprobe {} may solve the problem".format(sourcefs))
-            return (_("Bad unsquash configuration"),
+            return (_("Bad unpackfs configuration"),
                     _("The filesystem for \"{}\" ({}) is not supported by your current kernel").format(source, sourcefs))
         if not os.path.exists(source):
             libcalamares.utils.warning("The source filesystem \"{}\" does not exist".format(source))
-            return (_("Bad unsquash configuration"),
+            return (_("Bad unpackfs configuration"),
                     _("The source filesystem \"{}\" does not exist").format(source))
         if sourcefs == "squashfs":
             if shutil.which("unsquashfs") is None:
                 libcalamares.utils.warning("Failed to find unsquashfs")
 
-                return (_("Bad unsquash configuration"),
+                return (_("Bad unpackfs configuration"),
                         _("Failed to find unsquashfs, make sure you have the squashfs-tools package installed.") +
                         " " + _("Failed to unpack image \"{}\"").format(source))
 
@@ -475,7 +477,7 @@ def run():
         if not os.path.isdir(destination) and sourcefs != "file":
             libcalamares.utils.warning(("The destination \"{}\" in the target system is not a directory").format(destination))
             if is_first:
-                return (_("Bad unsquash configuration"),
+                return (_("Bad unpackfs configuration"),
                         _("The destination \"{}\" in the target system is not a directory").format(destination))
             else:
                 libcalamares.utils.debug(".. assuming that the previous targets will create that directory.")