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 cf02ff29d3a8ad1a8445244c69a0731d45c28cc7..01da2a00e51b28fbe0abc441c6858cfc0d91852e 100644
--- a/CHANGES-3.2
+++ b/CHANGES-3.2
@@ -7,7 +7,7 @@ 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.51 (unreleased) #
+# 3.2.52 (unreleased) #
 
 This release contains contributions from (alphabetically by first name):
  - No external contributors yet
@@ -16,6 +16,35 @@ This release contains contributions from (alphabetically by first name):
  - 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.
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index aec04f315713bf66f841a36833ffeb903a05f61a..dd46148d8a445c16acf11609266ce891f3114756 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -41,7 +41,7 @@
 # TODO:3.3: Require CMake 3.12
 cmake_minimum_required( VERSION 3.3 FATAL_ERROR )
 project( CALAMARES
-    VERSION 3.2.51
+    VERSION 3.2.52
     LANGUAGES C CXX
 )
 
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/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/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/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/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/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/modules/README.md b/src/modules/README.md
index 97a8556a1c1e3f6368446d462ad35b159fcbce49..62d92c2604531e7140b6baff7384655dad7f6dd4 100644
--- a/src/modules/README.md
+++ b/src/modules/README.md
@@ -179,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/main.py b/src/modules/bootloader/main.py
index 81e271a710b4d986ae655dcfcad46600e4132206..c7bc741dea3f24fd0bb792adeecac7832d8cddd6 100644
--- a/src/modules/bootloader/main.py
+++ b/src/modules/bootloader/main.py
@@ -427,7 +427,7 @@ def efi_label(efi_directory):
     used within @p efi_directory.
     """
     if "efiBootloaderId" in libcalamares.job.configuration:
-        efi_bootloader_id = change_efi_suffix( efi_directory, calamares.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"]
@@ -563,6 +563,7 @@ def run_grub_install(fw_type, partitions, efi_directory):
         check_target_env_call(["sh", "-c", "echo ZPOOL_VDEV_NAME_PATH=1 >> /etc/environment"])
 
     if fw_type == "efi":
+        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()
 
@@ -577,6 +578,7 @@ def run_grub_install(fw_type, partitions, efi_directory):
                                    "--bootloader-id=" + efi_bootloader_id,
                                    "--force"])
     else:
+        assert efi_directory is None
         if libcalamares.globalstorage.value("bootLoader") is None:
             return
 
@@ -653,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"])
 
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/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/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/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 18f10d629a511e7fc9aa9ada93c91cbc294185e2..5e8bf2ef06fb9c913e7f45b76095e4368e1d9090 100644
--- a/src/modules/partition/PartitionViewStep.cpp
+++ b/src/modules/partition/PartitionViewStep.cpp
@@ -675,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/DeviceModel.cpp b/src/modules/partition/core/DeviceModel.cpp
index 25bdbff6c7dbb299e01b79f3fa2c78fa08ffd2ff..6959ac9c22c449c47f4803e06a80e53040323a54 100644
--- a/src/modules/partition/core/DeviceModel.cpp
+++ b/src/modules/partition/core/DeviceModel.cpp
@@ -28,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 )
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 3813207efed99bdf57c40c403ca62f5ae11b047b..765d9fffa7888f4e8ec66f9a3bc73280b82a67a7 100644
--- a/src/modules/partition/core/PartitionLayout.cpp
+++ b/src/modules/partition/core/PartitionLayout.cpp
@@ -283,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/SizeUtils.h b/src/modules/partition/core/SizeUtils.h
index d474656c969893eb5a9b365b7af47f7d2d5c9177..155cbd92397b1c74dd57752720e97f512a3c450a 100644
--- a/src/modules/partition/core/SizeUtils.h
+++ b/src/modules/partition/core/SizeUtils.h
@@ -19,7 +19,8 @@
  * 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 )
+static inline QString
+formatByteSize( qint64 sizeValue )
 {
     return Capacity::formatByteSize( static_cast< double >( sizeValue ) );
 }
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/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/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 e73d7f4af3b54af2046096520ca0800f6836fe5b..e3a50c576907c4c26daedb6c1d620b6a8301768e 100644
--- a/src/modules/partition/gui/PartitionLabelsView.cpp
+++ b/src/modules/partition/gui/PartitionLabelsView.cpp
@@ -519,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 2e5675a11b60ba92fa1b1eda65ef81fc23f35aaf..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(); );
 }
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 48b44f68d8a664aede4a5027fae5980eb51d4aef..818a60483f07358ae77e98282c22530e31bfefed 100644
--- a/src/modules/partition/gui/VolumeGroupBaseDialog.cpp
+++ b/src/modules/partition/gui/VolumeGroupBaseDialog.cpp
@@ -45,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()
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 2f5a8bd36197ece4ff957717c9a529ea81939d7e..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
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/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();