diff --git a/CHANGES b/CHANGES
index 8b86bf6367022d54051467475dd2e67713bdc7bb..a1eed622c27dc70a1a665abb38336ec7e3b46b80 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,18 @@ 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.45 (unreleased) #
+
+This release contains contributions from (alphabetically by first name):
+ - Dalto (new contributor, welcome!)
+
+## Core ##
+ - No core changes yet
+
+## Modules ##
+ - No module changes yet
+
+
 # 3.2.44.3 (2021-10-04) #
 
 This is not a hotfix release, but a tiny-tiny incremental improvement
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f75b1caf5e9c7aaf417300c2f0bd9fd7ceaee759..1e5f5ea3739b414cc68e48ecbc38fc3d97f3d3f6 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.44.3
+    VERSION 3.2.45
     LANGUAGES C CXX
 )
 
diff --git a/src/libcalamares/utils/Variant.cpp b/src/libcalamares/utils/Variant.cpp
index a484ac8f71201963e208239fe5e7de42552fc05d..0aba07f335ac316faa2e661b8807255e8c5c859d 100644
--- a/src/libcalamares/utils/Variant.cpp
+++ b/src/libcalamares/utils/Variant.cpp
@@ -65,6 +65,20 @@ getStringList( const QVariantMap& map, const QString& key, const QStringList& d
     return d;
 }
 
+QList< QVariant >
+getList( const QVariantMap& map, const QString& key, const QList< QVariant >& d )
+{
+    if ( map.contains( key ) )
+    {
+        auto v = map.value( key );
+        if ( v.canConvert( QVariant::List ) )
+        {
+            return v.toList();
+        }
+    }
+    return d;
+}
+
 qint64
 getInteger( const QVariantMap& map, const QString& key, qint64 d )
 {
diff --git a/src/libcalamares/utils/Variant.h b/src/libcalamares/utils/Variant.h
index d0d893dc3e923307a79a33a052ddfbd1bfa48a18..6bd7b8def6868327d79292c90c4a2d304b013238 100644
--- a/src/libcalamares/utils/Variant.h
+++ b/src/libcalamares/utils/Variant.h
@@ -15,6 +15,7 @@
 
 #include "DllMacro.h"
 
+#include <QList>
 #include <QString>
 #include <QVariantMap>
 
@@ -39,6 +40,12 @@ DLLEXPORT QString getString( const QVariantMap& map, const QString& key, const Q
  */
 DLLEXPORT QStringList getStringList( const QVariantMap& map, const QString& key, const QStringList& d = QStringList() );
 
+/**
+ * Get a list from a mapping with a given key; returns @p d if no value.
+ */
+DLLEXPORT QList< QVariant >
+getList( const QVariantMap& map, const QString& key, const QList< QVariant >& d = QList< QVariant >() );
+
 /**
  * Get an integer value from a mapping with a given key; returns @p d if no value.
  */
diff --git a/src/modules/keyboard/KeyboardPage.cpp b/src/modules/keyboard/KeyboardPage.cpp
index 902f65f9ef41885f2905ee54b054ff5f181ef6e7..e173de3ce52d7fc3a642322033764a7cbfe74afb 100644
--- a/src/modules/keyboard/KeyboardPage.cpp
+++ b/src/modules/keyboard/KeyboardPage.cpp
@@ -67,7 +67,7 @@ KeyboardPage::KeyboardPage( Config* config, QWidget* parent )
         auto* model = config->keyboardVariants();
         ui->variantSelector->setModel( model );
         ui->variantSelector->setCurrentIndex( model->index( model->currentIndex() ) );
-        cDebug() << "Variants now" << model->rowCount() << model->currentIndex();
+        cDebug() << "Variants now total=" << model->rowCount() << "selected=" << model->currentIndex();
     }
 
     connect(
diff --git a/src/modules/packagechooser/PackageChooserPage.cpp b/src/modules/packagechooser/PackageChooserPage.cpp
index 020365a7facc5c24fb7c2ee3b260fc50d8c9921a..246f59ec99d98934ee29ef0d5dbf94b5ec9c1af0 100644
--- a/src/modules/packagechooser/PackageChooserPage.cpp
+++ b/src/modules/packagechooser/PackageChooserPage.cpp
@@ -74,7 +74,7 @@ smartClip( const QPixmap& pixmap, QSize size )
         return pixmap.copy( x, y, new_width, new_height );
     }
 
-    return pixmap.scaled( size, Qt::KeepAspectRatio );
+    return pixmap.scaled( size, Qt::KeepAspectRatio, Qt::SmoothTransformation );
 }
 
 void
@@ -83,7 +83,7 @@ PackageChooserPage::currentChanged( const QModelIndex& index )
     if ( !index.isValid() || !ui->products->selectionModel()->hasSelection() )
     {
         ui->productName->setText( m_introduction.name.get() );
-        ui->productScreenshot->setPixmap( m_introduction.screenshot );
+        ui->productScreenshot->setPixmap( smartClip( m_introduction.screenshot, ui->productScreenshot->size() ) );
         ui->productDescription->setText( m_introduction.description.get() );
     }
     else
@@ -96,7 +96,7 @@ PackageChooserPage::currentChanged( const QModelIndex& index )
         QPixmap currentScreenshot = model->data( index, PackageListModel::ScreenshotRole ).value< QPixmap >();
         if ( currentScreenshot.isNull() )
         {
-            ui->productScreenshot->setPixmap( m_introduction.screenshot );
+            ui->productScreenshot->setPixmap( smartClip( m_introduction.screenshot, ui->productScreenshot->size() ) );
         }
         else
         {
@@ -136,8 +136,8 @@ PackageChooserPage::setSelection( const QModelIndex& index )
     if ( index.isValid() )
     {
         ui->products->selectionModel()->select( index, QItemSelectionModel::Select );
-        currentChanged( index );
     }
+    currentChanged( index );
 }
 
 bool
diff --git a/src/modules/packagechooser/PackageModel.cpp b/src/modules/packagechooser/PackageModel.cpp
index 239705490c2076ba88c93e598ce8e668dbe81593..8a0b13e515142a425fa5f0a5c35a2e895e8d019a 100644
--- a/src/modules/packagechooser/PackageModel.cpp
+++ b/src/modules/packagechooser/PackageModel.cpp
@@ -9,9 +9,28 @@
 
 #include "PackageModel.h"
 
+#include "Branding.h"
 #include "utils/Logger.h"
 #include "utils/Variant.h"
 
+#include <QFileInfo>
+
+static QPixmap
+loadScreenshot( const QString& path )
+{
+    if ( QFileInfo::exists( path ) )
+    {
+        return QPixmap( path );
+    }
+
+    const auto* branding = Calamares::Branding::instance();
+    if ( !branding )
+    {
+        return QPixmap();
+    }
+    return QPixmap( branding->componentDirectory() + QStringLiteral( "/" ) + path );
+}
+
 PackageItem::PackageItem() {}
 
 PackageItem::PackageItem( const QString& a_id, const QString& a_name, const QString& a_description )
@@ -36,7 +55,7 @@ PackageItem::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( CalamaresUtils::getString( item_map, "screenshot" ) )
+    , screenshot( loadScreenshot( CalamaresUtils::getString( item_map, "screenshot" ) ) )
     , packageNames( CalamaresUtils::getStringList( item_map, "packages" ) )
 {
     if ( name.isEmpty() && id.isEmpty() )
diff --git a/src/modules/packagechooser/packagechooser.conf b/src/modules/packagechooser/packagechooser.conf
index f618e8df28c9218a99b81dc631495a69a2155a6c..6461376bf947907ec2e16544f64b1af318f8ff2f 100644
--- a/src/modules/packagechooser/packagechooser.conf
+++ b/src/modules/packagechooser/packagechooser.conf
@@ -95,7 +95,11 @@ labels:
 #       Human-readable description. These can be translated as well.
 #  - *screenshot*
 #       Path to a single screenshot of the product. May be a filesystem
-#       path or a QRC path, e.g. ":/images/no-selection.png".
+#       path or a QRC path, e.g. ":/images/no-selection.png". If the path
+#       is not found (e.g. is a non-existent absolute path, or is a relative
+#       path that does not exist in the current working directory) then
+#       an additional attempt is made to load the image from the **branding**
+#       directory.
 #
 # The following field is **optional** for an item:
 #