diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt
index b141655124682916ed0c1c9745aa993f5c6eb1d6..4d68f4b1033f0308ecab0edf7378f76a7fbf98bd 100644
--- a/src/modules/partition/CMakeLists.txt
+++ b/src/modules/partition/CMakeLists.txt
@@ -10,7 +10,7 @@ find_package( KF5 REQUIRED CoreAddons )
 # These are needed because KPMcore links publicly against ConfigCore, I18n, IconThemes, KIOCore and Service
 find_package( KF5 REQUIRED Config I18n IconThemes KIO Service )
 
-find_package( KPMcore 3.0.0 REQUIRED )
+find_package( KPMcore 3.0.2 REQUIRED )
 
 add_subdirectory( tests )
 
diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp
index 11931347fa0230909fb8b7786b79eed1ec15f09e..0f9b4203a5087349de65150d660c4cde3f6db222 100644
--- a/src/modules/partition/core/PartUtils.cpp
+++ b/src/modules/partition/core/PartUtils.cpp
@@ -51,8 +51,9 @@ canBeReplaced( Partition* candidate )
     qint64 requiredStorageB = ( requiredStorageGB + 0.5 ) * 1024 * 1024 * 1024;
     cDebug() << "Required  storage B:" << requiredStorageB
              << QString( "(%1GB)" ).arg( requiredStorageB / 1024 / 1024 / 1024 );
-    cDebug() << "Available storage B:" << availableStorageB
-             << QString( "(%1GB)" ).arg( availableStorageB / 1024 / 1024 / 1024 );
+    cDebug() << "Storage capacity  B:" << availableStorageB
+             << QString( "(%1GB)" ).arg( availableStorageB / 1024 / 1024 / 1024 )
+             << "for" << candidate->partitionPath() << "   length:" << candidate->length();
 
     if ( ok &&
          availableStorageB > requiredStorageB )
@@ -102,7 +103,9 @@ canBeResized( Partition* candidate )
     cDebug() << "Required  storage B:" << requiredStorageB
              << QString( "(%1GB)" ).arg( requiredStorageB / 1024 / 1024 / 1024 );
     cDebug() << "Available storage B:" << availableStorageB
-             << QString( "(%1GB)" ).arg( availableStorageB / 1024 / 1024 / 1024 );
+             << QString( "(%1GB)" ).arg( availableStorageB / 1024 / 1024 / 1024 )
+             << "for" << candidate->partitionPath() << "   length:" << candidate->length()
+             << "   sectorsUsed:" << candidate->sectorsUsed() << "   fsType:" << candidate->fileSystem().name();
 
     if ( ok &&
          availableStorageB > requiredStorageB )
diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp
index 90779b7fa6cc1d60b02216f0e59217724e11d751..b8d81d91372a4493cccd9680ffc3598a02e93483 100644
--- a/src/modules/partition/core/PartitionActions.cpp
+++ b/src/modules/partition/core/PartitionActions.cpp
@@ -1,6 +1,6 @@
 /* === This file is part of Calamares - <http://github.com/calamares> ===
  *
- *   Copyright 2014-2016, Teo Mrnjavac <teo@kde.org>
+ *   Copyright 2014-2017, Teo Mrnjavac <teo@kde.org>
  *
  *   Calamares is free software: you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -148,7 +148,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass
                                                         ->globalStorage()
                                                         ->value( "efiSystemPartition" )
                                                         .toString() );
-        core->createPartition( dev, efiPartition );
+        core->createPartition( dev, efiPartition, PartitionTable::FlagEsp | PartitionTable::FlagBoot );
         firstFreeSector = lastSector + 1;
     }
     else
diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp
index 87393a4248051af42481f903bae4768549451565..7ce67be1699f2e3526c5a3b1697ff7703f3c2360 100644
--- a/src/modules/partition/core/PartitionCoreModule.cpp
+++ b/src/modules/partition/core/PartitionCoreModule.cpp
@@ -441,6 +441,7 @@ PartitionCoreModule::jobs() const
         lst << info->jobs;
         devices << info->device.data();
     }
+    cDebug() << "Creating FillGlobalStorageJob with bootLoader path" << m_bootLoaderInstallPath;
     lst << Calamares::job_ptr( new FillGlobalStorageJob( devices, m_bootLoaderInstallPath ) );
 
 
@@ -596,6 +597,7 @@ PartitionCoreModule::findPartitionByMountPoint( const QString& mountPoint ) cons
 void
 PartitionCoreModule::setBootLoaderInstallPath( const QString& path )
 {
+    cDebug() << "PCM::setBootLoaderInstallPath" << path;
     m_bootLoaderInstallPath = path;
 }
 
diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp
index b700a24aa319034dc273bcc8b3b8b1e8b799e79a..68a75c2df94767a287866b308e66b0a4a65e674e 100644
--- a/src/modules/partition/gui/ChoicePage.cpp
+++ b/src/modules/partition/gui/ChoicePage.cpp
@@ -1,6 +1,6 @@
 /* === This file is part of Calamares - <http://github.com/calamares> ===
  *
- *   Copyright 2014-2016, Teo Mrnjavac <teo@kde.org>
+ *   Copyright 2014-2017, Teo Mrnjavac <teo@kde.org>
  *
  *   Calamares is free software: you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -565,8 +565,20 @@ ChoicePage::onLeave()
     }
     else    // installPath is then passed to the bootloader module for MBR setup
     {
-        if ( m_bootloaderComboBox.isNull() )
-            m_core->setBootLoaderInstallPath( selectedDevice()->deviceNode() );
+        if ( !m_isEfi )
+        {
+            if ( m_bootloaderComboBox.isNull() )
+            {
+                m_core->setBootLoaderInstallPath( selectedDevice()->deviceNode() );
+            }
+            else
+            {
+                QVariant var = m_bootloaderComboBox->currentData( BootLoaderModel::BootLoaderPathRole );
+                if ( !var.isValid() )
+                    return;
+                m_core->setBootLoaderInstallPath( var.toString() );
+            }
+        }
     }
 }
 
diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp
index 90545fe80092d4ee043c8ac4be21edc50b13f1f8..4cd22bf68f183deebb713023442dddc36691826a 100644
--- a/src/modules/partition/gui/CreatePartitionDialog.cpp
+++ b/src/modules/partition/gui/CreatePartitionDialog.cpp
@@ -263,12 +263,15 @@ CreatePartitionDialog::checkMountPointSelection()
 {
     const QString& selection = m_ui->mountPointComboBox->currentText();
 
-    if (m_usedMountPoints.contains(selection)) {
-        m_ui->labelMountPoint->setText("Mountpoint already in use. Please select another one.");
-        m_ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
-    } else {
+    if ( m_usedMountPoints.contains( selection ) )
+    {
+        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);
+        m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( true );
     }
 }
 
diff --git a/src/modules/partition/gui/CreatePartitionDialog.ui b/src/modules/partition/gui/CreatePartitionDialog.ui
index bad15a4cfd743639a1c50c288b4b3494f4e17679..53445e0ec3c8f9c6a85f56bc99262025986356e1 100644
--- a/src/modules/partition/gui/CreatePartitionDialog.ui
+++ b/src/modules/partition/gui/CreatePartitionDialog.ui
@@ -167,11 +167,6 @@
      </item>
      <item row="7" column="1">
       <widget class="QLabel" name="labelMountPoint">
-       <property name="font">
-        <font>
-         <italic>true</italic>
-        </font>
-       </property>
        <property name="text">
         <string/>
        </property>
diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp
index 5aa1e21f6719dae75eff85b2698b5a5f9b034a1f..1909e48e8582b624965ad01f63deec1c017d2c1d 100644
--- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp
+++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp
@@ -67,7 +67,8 @@ EditExistingPartitionDialog::EditExistingPartitionDialog( Device* device, Partit
     m_partitionSizeController->setSpinBox( m_ui->sizeSpinBox );
 
     m_ui->mountPointComboBox->setCurrentText( PartitionInfo::mountPoint( partition ) );
-    connect( m_ui->mountPointComboBox, &QComboBox::currentTextChanged, this, &EditExistingPartitionDialog::checkMountPointSelection );
+    connect( m_ui->mountPointComboBox, &QComboBox::currentTextChanged,
+             this, &EditExistingPartitionDialog::checkMountPointSelection );
 
     replacePartResizerWidget();
 
@@ -300,11 +301,14 @@ EditExistingPartitionDialog::checkMountPointSelection()
 {
     const QString& selection = m_ui->mountPointComboBox->currentText();
 
-    if (m_usedMountPoints.contains(selection)) {
-        m_ui->labelMountPoint->setText("Mountpoint already in use. Please select another one.");
-        m_ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
-    } else {
+    if ( m_usedMountPoints.contains( selection ) )
+    {
+        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);
+        m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( true );
     }
 }
diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.ui b/src/modules/partition/gui/EditExistingPartitionDialog.ui
index 27e930fda26e2abacbbccf3bf5972defbfba5c9e..edee3c7a72998278f418507b7574521fcb9af473 100644
--- a/src/modules/partition/gui/EditExistingPartitionDialog.ui
+++ b/src/modules/partition/gui/EditExistingPartitionDialog.ui
@@ -161,11 +161,6 @@
      </item>
      <item row="7" column="1">
       <widget class="QLabel" name="labelMountPoint">
-       <property name="font">
-        <font>
-         <italic>true</italic>
-        </font>
-       </property>
        <property name="text">
         <string/>
        </property>
diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp
index 5e32390507faa17ff4b128b5b29627c36b6b3455..93d8e8be2df056f78bd4d65580c26b7d470cc383 100644
--- a/src/modules/partition/gui/PartitionPage.cpp
+++ b/src/modules/partition/gui/PartitionPage.cpp
@@ -57,7 +57,10 @@ PartitionPage::PartitionPage( PartitionCoreModule* core, QWidget* parent )
     , m_ui( new Ui_PartitionPage )
     , m_lastSelectedBootLoaderIndex(-1)
     , m_core( core )
+    , m_isEfi( false )
 {
+    m_isEfi = QDir( "/sys/firmware/efi/efivars" ).exists();
+
     m_ui->setupUi( this );
     m_ui->partitionLabelsView->setVisible(
             Calamares::JobQueue::instance()->globalStorage()->
@@ -100,7 +103,7 @@ PartitionPage::PartitionPage( PartitionCoreModule* core, QWidget* parent )
     connect( m_ui->editButton, &QAbstractButton::clicked, this, &PartitionPage::onEditClicked );
     connect( m_ui->deleteButton, &QAbstractButton::clicked, this, &PartitionPage::onDeleteClicked );
 
-    if ( QDir( "/sys/firmware/efi/efivars" ).exists() ) {
+    if ( m_isEfi ) {
         m_ui->bootLoaderComboBox->hide();
         m_ui->label_3->hide();
     }
@@ -177,7 +180,10 @@ PartitionPage::onCreateClicked()
     Partition* partition = model->partitionForIndex( index );
     Q_ASSERT( partition );
 
-    QPointer<CreatePartitionDialog> dlg = new CreatePartitionDialog( model->device(), partition->parent(), getCurrentUsedMountpoints(), this );
+    QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog( model->device(),
+                                                                       partition->parent(),
+                                                                       getCurrentUsedMountpoints(),
+                                                                       this );
     dlg->initFromFreeSpace( partition );
     if ( dlg->exec() == QDialog::Accepted )
     {
@@ -269,7 +275,10 @@ PartitionPage::updatePartitionToCreate( Device* device, Partition* partition )
     QStringList mountPoints = getCurrentUsedMountpoints();
     mountPoints.removeOne( PartitionInfo::mountPoint( partition ) );
 
-    QPointer<CreatePartitionDialog> dlg = new CreatePartitionDialog( device, partition->parent(), mountPoints, this );
+    QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog( device,
+                                                                       partition->parent(),
+                                                                       mountPoints,
+                                                                       this );
     dlg->initFromPartitionToCreate( partition );
     if ( dlg->exec() == QDialog::Accepted )
     {
@@ -295,9 +304,13 @@ PartitionPage::editExistingPartition( Device* device, Partition* partition )
 void
 PartitionPage::updateBootLoaderInstallPath()
 {
+    if ( m_isEfi || !m_ui->bootLoaderComboBox->isVisible() )
+        return;
+
     QVariant var = m_ui->bootLoaderComboBox->currentData( BootLoaderModel::BootLoaderPathRole );
     if ( !var.isValid() )
         return;
+    qDebug() << "PartitionPage::updateBootLoaderInstallPath" << var.toString();
     m_core->setBootLoaderInstallPath( var.toString() );
 }
 
@@ -386,19 +399,19 @@ PartitionPage::updateBootLoaderIndex()
 QStringList
 PartitionPage::getCurrentUsedMountpoints()
 {
-    QModelIndex index = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 );
+    QModelIndex index = m_core->deviceModel()->index(
+                            m_ui->deviceComboBox->currentIndex(), 0 );
     if ( !index.isValid() )
         return QStringList();
 
     Device* device = m_core->deviceModel()->deviceForIndex( index );
     QStringList mountPoints;
 
-    for (Partition* partition : device->partitionTable()->children()) {
+    for ( Partition* partition : device->partitionTable()->children() )
+    {
         const QString& mountPoint = PartitionInfo::mountPoint( partition );
-
-        if (!mountPoint.isEmpty()) {
+        if ( !mountPoint.isEmpty() )
             mountPoints << mountPoint;
-        }
     }
 
     return mountPoints;
diff --git a/src/modules/partition/gui/PartitionPage.h b/src/modules/partition/gui/PartitionPage.h
index 59453ce18f5fa0f39dea6789fc41dbc149ba4c37..f998fe2aeff20fbf369a37dbc30290d7fb9594e1 100644
--- a/src/modules/partition/gui/PartitionPage.h
+++ b/src/modules/partition/gui/PartitionPage.h
@@ -66,6 +66,7 @@ private:
 
     QMutex m_revertMutex;
     int    m_lastSelectedBootLoaderIndex;
+    bool   m_isEfi;
 };
 
 #endif // PARTITIONPAGE_H
diff --git a/src/modules/partition/jobs/FillGlobalStorageJob.cpp b/src/modules/partition/jobs/FillGlobalStorageJob.cpp
index 553b56b52d55b4a0a30ba91a9cc62dec77f0ff8a..db59528a440223ed64bb03e3a88503a3279272ce 100644
--- a/src/modules/partition/jobs/FillGlobalStorageJob.cpp
+++ b/src/modules/partition/jobs/FillGlobalStorageJob.cpp
@@ -198,10 +198,12 @@ FillGlobalStorageJob::exec()
         QVariant var = createBootLoaderMap();
         if ( !var.isValid() )
             cDebug() << "Failed to find path for boot loader";
+        cDebug() << "FillGlobalStorageJob writing bootLoader path:" << var;
         storage->insert( "bootLoader", var );
     }
     else
     {
+        cDebug() << "FillGlobalStorageJob writing empty bootLoader value";
         storage->insert( "bootLoader", QVariant() );
     }
     return Calamares::JobResult::ok();
diff --git a/src/modules/webview/WebViewStep.cpp b/src/modules/webview/WebViewStep.cpp
index b1d50bf7cab6e41ad93eed021cef7e3c0c690e3e..069b52d5a8354ab5a78fa9725ef5d19063aad877 100644
--- a/src/modules/webview/WebViewStep.cpp
+++ b/src/modules/webview/WebViewStep.cpp
@@ -25,6 +25,7 @@
 #include <QWebView>
 #else
 #include <QWebEngineView>
+#include <QtWebEngine>
 #endif
 
 CALAMARES_PLUGIN_FACTORY_DEFINITION( WebViewStepFactory, registerPlugin<WebViewStep>(); )
@@ -33,6 +34,9 @@ WebViewStep::WebViewStep( QObject* parent )
     : Calamares::ViewStep( parent )
 {
     emit nextStatusChanged( true );
+#ifdef WEBVIEW_WITH_WEBENGINE
+    QtWebEngine::initialize();
+#endif
     m_view = new C_QWEBVIEW();
 #ifdef WEBVIEW_WITH_WEBKIT
     m_view->settings()->setFontFamily( QWebSettings::StandardFont,