diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py
index d762a8b26ca20793684256b851a852df14ac211e..a1b336e966f46f74594cd2d1aafdd70d78e4af48 100644
--- a/share/qtcreator/debugger/lldbbridge.py
+++ b/share/qtcreator/debugger/lldbbridge.py
@@ -219,8 +219,12 @@ class Dumper(DumperBase):
             base = nativeType.GetVirtualBaseClassAtIndex(i)
             virtualNames[base.GetName()] = i
 
-        fieldBits = dict((field.name, (field.GetBitfieldSizeInBits(), field.GetOffsetInBits()))
-                        for field in nativeType.get_fields_array())
+        fieldBits = dict((f.name,
+                         ((f.GetBitfieldSizeInBits()
+                              if f.GetBitfieldSizeInBits() else
+                          (f.GetType().GetByteSize() * 8)),
+                          f.GetOffsetInBits()))
+                        for f in nativeType.get_fields_array())
 
         #warn("BASE NAMES: %s" % baseNames)
         #warn("VIRTUAL NAMES: %s" % virtualNames)
@@ -279,7 +283,7 @@ class Dumper(DumperBase):
                     field.parentType = fieldParentType
                     field.ltype = self.fromNativeType(fieldType)
                     field.name = fieldName
-                    field.lbitsize = 0
+                    field.lbitsize = field.ltype.lbitsize * 8
                     field.lbitpos = 0
                     fields.append(field)
 
diff --git a/src/libs/utils/synchronousprocess.cpp b/src/libs/utils/synchronousprocess.cpp
index fe1b11a34f3d554b85f7cddea44f55d930a94927..4596193a247490c03fcd080c3fd9cd4c47b017a4 100644
--- a/src/libs/utils/synchronousprocess.cpp
+++ b/src/libs/utils/synchronousprocess.cpp
@@ -504,7 +504,9 @@ SynchronousProcessResponse SynchronousProcess::runBlocking(const QString &binary
         }
     }
 
-    QTC_ASSERT(d->m_process.state() == QProcess::NotRunning, return d->m_result);
+    if (d->m_process.state() != QProcess::NotRunning)
+        return d->m_result;
+
     d->m_result.exitCode = d->m_process.exitCode();
     if (d->m_result.result == SynchronousProcessResponse::StartFailed) {
         if (d->m_process.exitStatus() != QProcess::NormalExit)
diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index c3eff659b5d3ef2514e24d52f0126c4f11ea72fc..b2384c5daeb440dcbcc242e2fa5d0b3468d1306f 100644
--- a/src/plugins/debugger/cdb/cdbengine.cpp
+++ b/src/plugins/debugger/cdb/cdbengine.cpp
@@ -254,6 +254,8 @@ CdbEngine::CdbEngine(const DebuggerRunParameters &sp) :
             this, &CdbEngine::readyReadStandardOut);
     connect(&m_process, &QProcess::readyReadStandardError,
             this, &CdbEngine::readyReadStandardOut);
+    connect(action(UseDebuggingHelpers), &SavedAction::valueChanged,
+            this, &CdbEngine::updateLocals);
 }
 
 void CdbEngine::init()
diff --git a/src/plugins/diffeditor/diffeditordocument.h b/src/plugins/diffeditor/diffeditordocument.h
index 81d98bb42d4edec3579d4342cab2722a03837a4e..5b4771b0e71772f48a0b1c52969316c99177aab7 100644
--- a/src/plugins/diffeditor/diffeditordocument.h
+++ b/src/plugins/diffeditor/diffeditordocument.h
@@ -68,7 +68,6 @@ public:
     QString fallbackSaveAsPath() const override;
     QString fallbackSaveAsFileName() const override;
 
-    bool isModified() const override { return false; }
     bool isSaveAsAllowed() const override { return true; }
     bool save(QString *errorString, const QString &fileName, bool autoSave) override;
     void reload();
diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp
index 9f0e42738fc201a3c695021c12eb2a8303eee4ff..db7936f34afede549d27cf2c1101cf7175ab03c2 100644
--- a/src/plugins/diffeditor/diffeditorplugin.cpp
+++ b/src/plugins/diffeditor/diffeditorplugin.cpp
@@ -33,25 +33,189 @@
 
 #include <QAction>
 #include <QFileDialog>
+#include <QMenu>
 #include <QTextCodec>
 #include <QtPlugin>
 
 #include <coreplugin/actionmanager/actioncontainer.h>
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <coreplugin/coreconstants.h>
+#include <coreplugin/editormanager/documentmodel.h>
 #include <coreplugin/editormanager/editormanager.h>
 #include <coreplugin/icore.h>
 
+#include <texteditor/texteditor.h>
+
 #include <utils/qtcassert.h>
 
 namespace DiffEditor {
 namespace Internal {
 
-class FileDiffController : public DiffEditorController
+class DiffFilesController : public DiffEditorController
+{
+    Q_OBJECT
+public:
+    DiffFilesController(Core::IDocument *document);
+
+protected:
+    FileData diffFiles(const QString &leftContents, const QString &rightContents);
+};
+
+DiffFilesController::DiffFilesController(Core::IDocument *document)
+    : DiffEditorController(document)
+{}
+
+FileData DiffFilesController::diffFiles(const QString &leftContents, const QString &rightContents)
+{
+    Differ differ;
+    QList<Diff> diffList = differ.cleanupSemantics(differ.diff(leftContents, rightContents));
+
+    QList<Diff> leftDiffList;
+    QList<Diff> rightDiffList;
+    Differ::splitDiffList(diffList, &leftDiffList, &rightDiffList);
+    QList<Diff> outputLeftDiffList;
+    QList<Diff> outputRightDiffList;
+
+    if (ignoreWhitespace()) {
+        const QList<Diff> leftIntermediate
+                = Differ::moveWhitespaceIntoEqualities(leftDiffList);
+        const QList<Diff> rightIntermediate
+                = Differ::moveWhitespaceIntoEqualities(rightDiffList);
+        Differ::ignoreWhitespaceBetweenEqualities(leftIntermediate, rightIntermediate,
+                                                  &outputLeftDiffList, &outputRightDiffList);
+    } else {
+        outputLeftDiffList = leftDiffList;
+        outputRightDiffList = rightDiffList;
+    }
+
+    const ChunkData chunkData = DiffUtils::calculateOriginalData(
+                outputLeftDiffList, outputRightDiffList);
+    FileData fileData = DiffUtils::calculateContextData(chunkData, contextLineCount(), 0);
+
+    return fileData;
+}
+
+class DiffCurrentFileController : public DiffFilesController
 {
     Q_OBJECT
 public:
-    FileDiffController(Core::IDocument *document, const QString &leftFileName,
+    DiffCurrentFileController(Core::IDocument *document, const QString &fileName);
+
+protected:
+    void reload();
+
+private:
+    QString m_fileName;
+};
+
+DiffCurrentFileController::DiffCurrentFileController(Core::IDocument *document, const QString &fileName) :
+    DiffFilesController(document), m_fileName(fileName)
+{ }
+
+void DiffCurrentFileController::reload()
+{
+    QList<FileData> fileDataList;
+
+    TextEditor::TextDocument *textDocument = qobject_cast<TextEditor::TextDocument *>(
+                Core::DocumentModel::documentForFilePath(m_fileName));
+
+    if (textDocument && textDocument->isModified()) {
+        QString errorString;
+        Utils::TextFileFormat format = textDocument->format();
+
+        QString leftText;
+        bool leftFileExists = true;
+        if (Utils::TextFileFormat::readFile(m_fileName,
+                                            format.codec,
+                                            &leftText, &format, &errorString)
+                != Utils::TextFileFormat::ReadSuccess) {
+            leftFileExists = false;
+        }
+
+        const QString rightText = textDocument->plainText();
+
+        FileData fileData = diffFiles(leftText, rightText);
+        fileData.leftFileInfo.fileName = m_fileName;
+        fileData.rightFileInfo.fileName = m_fileName;
+        fileData.leftFileInfo.typeInfo = tr("Saved");
+        fileData.rightFileInfo.typeInfo = tr("Modified");
+
+        if (!leftFileExists)
+            fileData.fileOperation = FileData::NewFile;
+
+        fileDataList << fileData;
+    }
+
+    setDiffFiles(fileDataList);
+    reloadFinished(true);
+}
+
+/////////////////
+
+class DiffAllModifiedFilesController : public DiffFilesController
+{
+    Q_OBJECT
+public:
+    DiffAllModifiedFilesController(Core::IDocument *document);
+
+protected:
+    void reload();
+};
+
+DiffAllModifiedFilesController::DiffAllModifiedFilesController(Core::IDocument *document) :
+    DiffFilesController(document)
+{ }
+
+void DiffAllModifiedFilesController::reload()
+{
+    QList<Core::IDocument *> openedDocuments =
+            Core::DocumentModel::openedDocuments();
+
+    QList<FileData> fileDataList;
+
+    foreach (Core::IDocument *doc, openedDocuments) {
+        TextEditor::TextDocument *textDocument = qobject_cast<TextEditor::TextDocument *>(doc);
+
+        if (textDocument && textDocument->isModified()) {
+            QString errorString;
+            Utils::TextFileFormat format = textDocument->format();
+
+            QString leftText;
+            bool leftFileExists = true;
+            const QString fileName = textDocument->filePath().toString();
+            if (Utils::TextFileFormat::readFile(fileName,
+                                                format.codec,
+                                                &leftText, &format, &errorString)
+                    != Utils::TextFileFormat::ReadSuccess) {
+                leftFileExists = false;
+            }
+
+            const QString rightText = textDocument->plainText();
+
+            FileData fileData = diffFiles(leftText, rightText);
+            fileData.leftFileInfo.fileName = fileName;
+            fileData.rightFileInfo.fileName = fileName;
+            fileData.leftFileInfo.typeInfo = tr("Saved");
+            fileData.rightFileInfo.typeInfo = tr("Modified");
+
+            if (!leftFileExists)
+                fileData.fileOperation = FileData::NewFile;
+
+            fileDataList << fileData;
+        }
+    }
+
+    setDiffFiles(fileDataList);
+    reloadFinished(true);
+}
+
+/////////////////
+
+class DiffExternalFilesController : public DiffFilesController
+{
+    Q_OBJECT
+public:
+    DiffExternalFilesController(Core::IDocument *document, const QString &leftFileName,
                        const QString &rightFileName);
 
 protected:
@@ -62,12 +226,12 @@ private:
     QString m_rightFileName;
 };
 
-FileDiffController::FileDiffController(Core::IDocument *document, const QString &leftFileName,
+DiffExternalFilesController::DiffExternalFilesController(Core::IDocument *document, const QString &leftFileName,
                                        const QString &rightFileName) :
-    DiffEditorController(document), m_leftFileName(leftFileName), m_rightFileName(rightFileName)
+    DiffFilesController(document), m_leftFileName(leftFileName), m_rightFileName(rightFileName)
 { }
 
-void FileDiffController::reload()
+void DiffExternalFilesController::reload()
 {
     QString errorString;
     Utils::TextFileFormat format;
@@ -91,30 +255,7 @@ void FileDiffController::reload()
         rightFileExists = false;
     }
 
-    Differ differ;
-    QList<Diff> diffList = differ.cleanupSemantics(differ.diff(leftText, rightText));
-
-    QList<Diff> leftDiffList;
-    QList<Diff> rightDiffList;
-    Differ::splitDiffList(diffList, &leftDiffList, &rightDiffList);
-    QList<Diff> outputLeftDiffList;
-    QList<Diff> outputRightDiffList;
-
-    if (ignoreWhitespace()) {
-        const QList<Diff> leftIntermediate
-                = Differ::moveWhitespaceIntoEqualities(leftDiffList);
-        const QList<Diff> rightIntermediate
-                = Differ::moveWhitespaceIntoEqualities(rightDiffList);
-        Differ::ignoreWhitespaceBetweenEqualities(leftIntermediate, rightIntermediate,
-                                                  &outputLeftDiffList, &outputRightDiffList);
-    } else {
-        outputLeftDiffList = leftDiffList;
-        outputRightDiffList = rightDiffList;
-    }
-
-    const ChunkData chunkData = DiffUtils::calculateOriginalData(
-                outputLeftDiffList, outputRightDiffList);
-    FileData fileData = DiffUtils::calculateContextData(chunkData, contextLineCount(), 0);
+    FileData fileData = diffFiles(leftText, rightText);
     fileData.leftFileInfo.fileName = m_leftFileName;
     fileData.rightFileInfo.fileName = m_rightFileName;
     if (!leftFileExists && rightFileExists)
@@ -123,7 +264,8 @@ void FileDiffController::reload()
         fileData.fileOperation = FileData::DeleteFile;
 
     QList<FileData> fileDataList;
-    fileDataList << fileData;
+    if (leftFileExists || rightFileExists)
+        fileDataList << fileData;
 
     setDiffFiles(fileDataList);
     reloadFinished(true);
@@ -140,11 +282,31 @@ bool DiffEditorPlugin::initialize(const QStringList &arguments, QString *errorMe
     Core::ActionContainer *toolsContainer
             = Core::ActionManager::actionContainer(Core::Constants::M_TOOLS);
     toolsContainer->insertGroup(Core::Constants::G_TOOLS_OPTIONS, Constants::G_TOOLS_DIFF);
+    Core::ActionContainer *diffContainer = Core::ActionManager::createMenu("Diff");
+    diffContainer->menu()->setTitle(tr("&Diff"));
+    toolsContainer->addMenu(diffContainer, Constants::G_TOOLS_DIFF);
+
+    m_diffCurrentFileAction = new QAction(tr("Diff Current File"), this);
+    Core::Command *diffCurrentFileCommand = Core::ActionManager::registerAction(m_diffCurrentFileAction, "DiffEditor.DiffCurrentFile");
+    diffCurrentFileCommand->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+H") : tr("Ctrl+H")));
+    connect(m_diffCurrentFileAction, &QAction::triggered, this, &DiffEditorPlugin::diffCurrentFile);
+    diffContainer->addAction(diffCurrentFileCommand);
 
-    QAction *diffAction = new QAction(tr("Diff..."), this);
-    Core::Command *diffCommand = Core::ActionManager::registerAction(diffAction, "DiffEditor.Diff");
-    connect(diffAction, &QAction::triggered, this, &DiffEditorPlugin::diff);
-    toolsContainer->addAction(diffCommand, Constants::G_TOOLS_DIFF);
+    QAction *diffAllModifiedFilesAction = new QAction(tr("Diff All Modified Files"), this);
+    Core::Command *diffAllModifiedFilesCommand = Core::ActionManager::registerAction(diffAllModifiedFilesAction, "DiffEditor.DiffAllModifiedFiles");
+    diffAllModifiedFilesCommand->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+Shift+H") : tr("Ctrl+Shift+H")));
+    connect(diffAllModifiedFilesAction, &QAction::triggered, this, &DiffEditorPlugin::diffAllModifiedFiles);
+    diffContainer->addAction(diffAllModifiedFilesCommand);
+
+    QAction *diffExternalFilesAction = new QAction(tr("Diff External Files..."), this);
+    Core::Command *diffExternalFilesCommand = Core::ActionManager::registerAction(diffExternalFilesAction, "DiffEditor.DiffExternalFiles");
+    connect(diffExternalFilesAction, &QAction::triggered, this, &DiffEditorPlugin::diffExternalFiles);
+    diffContainer->addAction(diffExternalFilesCommand);
+
+    connect(Core::EditorManager::instance(), &Core::EditorManager::currentEditorChanged,
+        this, &DiffEditorPlugin::updateCurrentEditor);
+
+    updateActions();
 
     addAutoReleasedObject(new DiffEditorFactory(this));
 
@@ -154,15 +316,77 @@ bool DiffEditorPlugin::initialize(const QStringList &arguments, QString *errorMe
 void DiffEditorPlugin::extensionsInitialized()
 { }
 
-void DiffEditorPlugin::diff()
+void DiffEditorPlugin::updateCurrentEditor(Core::IEditor *editor)
+{
+    if (m_currentTextDocument)
+        m_currentTextDocument->disconnect(this);
+    m_currentTextDocument = 0;
+
+    if (editor) {
+        TextEditor::TextEditorWidget *editorWidget = qobject_cast<TextEditor::TextEditorWidget *>(editor->widget());
+        if (editorWidget) {
+            m_currentTextDocument = editorWidget->textDocument();
+            connect(m_currentTextDocument.data(), &Core::IDocument::changed,
+                    this, &DiffEditorPlugin::updateActions);
+        }
+    }
+
+    updateActions();
+}
+
+void DiffEditorPlugin::updateActions()
+{
+    const bool diffCurrentFileEnabled = m_currentTextDocument && m_currentTextDocument->isModified();
+    m_diffCurrentFileAction->setEnabled(diffCurrentFileEnabled);
+}
+
+void DiffEditorPlugin::diffCurrentFile()
+{
+    if (!m_currentTextDocument)
+        return;
+
+    const QString fileName = m_currentTextDocument->filePath().toString();
+
+    if (fileName.isEmpty())
+        return;
+
+    const QString documentId = QLatin1String("Diff ") + fileName;
+    const QString title = tr("Diff \"%1\"").arg(fileName);
+    auto const document = qobject_cast<DiffEditorDocument *>(
+                DiffEditorController::findOrCreateDocument(documentId, title));
+    if (!document)
+        return;
+
+    if (!DiffEditorController::controller(document))
+        new DiffCurrentFileController(document, fileName);
+    Core::EditorManager::activateEditorForDocument(document);
+    document->reload();
+}
+
+void DiffEditorPlugin::diffAllModifiedFiles()
+{
+    const QString documentId = QLatin1String("Diff All Modified Files");
+    const QString title = tr("Diff All Modified Files");
+    auto const document = qobject_cast<DiffEditorDocument *>(
+                DiffEditorController::findOrCreateDocument(documentId, title));
+    if (!document)
+        return;
+
+    if (!DiffEditorController::controller(document))
+        new DiffAllModifiedFilesController(document);
+    Core::EditorManager::activateEditorForDocument(document);
+    document->reload();
+}
+
+void DiffEditorPlugin::diffExternalFiles()
 {
-    QString fileName1 = QFileDialog::getOpenFileName(Core::ICore::dialogParent(),
+    const QString fileName1 = QFileDialog::getOpenFileName(Core::ICore::dialogParent(),
                                                      tr("Select First File for Diff"),
                                                      QString());
     if (fileName1.isNull())
         return;
 
-    QString fileName2 = QFileDialog::getOpenFileName(Core::ICore::dialogParent(),
+    const QString fileName2 = QFileDialog::getOpenFileName(Core::ICore::dialogParent(),
                                                      tr("Select Second File for Diff"),
                                                      QString());
     if (fileName2.isNull())
@@ -170,14 +394,14 @@ void DiffEditorPlugin::diff()
 
 
     const QString documentId = QLatin1String("Diff ") + fileName1 + QLatin1String(", ") + fileName2;
-    QString title = tr("Diff \"%1\", \"%2\"").arg(fileName1).arg(fileName2);
+    const QString title = tr("Diff \"%1\", \"%2\"").arg(fileName1, fileName2);
     auto const document = qobject_cast<DiffEditorDocument *>(
                 DiffEditorController::findOrCreateDocument(documentId, title));
     if (!document)
         return;
 
     if (!DiffEditorController::controller(document))
-        new FileDiffController(document, fileName1, fileName2);
+        new DiffExternalFilesController(document, fileName1, fileName2);
     Core::EditorManager::activateEditorForDocument(document);
     document->reload();
 }
diff --git a/src/plugins/diffeditor/diffeditorplugin.h b/src/plugins/diffeditor/diffeditorplugin.h
index 3f384255175a0c9a298ce0baa0b78fbd0a22a1df..ba0cab243374875d80573db60954e9003899d3b5 100644
--- a/src/plugins/diffeditor/diffeditorplugin.h
+++ b/src/plugins/diffeditor/diffeditorplugin.h
@@ -27,8 +27,13 @@
 
 #include "diffeditor_global.h"
 
+#include <texteditor/textdocument.h>
 #include <extensionsystem/iplugin.h>
 
+QT_FORWARD_DECLARE_CLASS(QAction)
+
+namespace Core { class IEditor; }
+
 namespace DiffEditor {
 namespace Internal {
 
@@ -42,7 +47,11 @@ public:
     void extensionsInitialized();
 
 private slots:
-    void diff();
+    void updateCurrentEditor(Core::IEditor *editor);
+    void updateActions();
+    void diffCurrentFile();
+    void diffAllModifiedFiles();
+    void diffExternalFiles();
 
 #ifdef WITH_TESTS
     void testMakePatch_data();
@@ -50,6 +59,9 @@ private slots:
     void testReadPatch_data();
     void testReadPatch();
 #endif // WITH_TESTS
+private:
+    QAction *m_diffCurrentFileAction;
+    QPointer<TextEditor::TextDocument> m_currentTextDocument;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index 445e4302f0603a813d5c07420268c28f59591327..8260547a71e60da4c2e0a20b222b68d77189fad9 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -622,7 +622,12 @@ void QbsProject::cancelParsing()
 void QbsProject::updateAfterBuild()
 {
     QTC_ASSERT(m_qbsProject.isValid(), return);
-    m_projectData = m_qbsProject.projectData();
+    const qbs::ProjectData &projectData = m_qbsProject.projectData();
+    if (projectData == m_projectData)
+        return;
+    qCDebug(qbsPmLog) << "Updating data after build";
+    m_projectData = projectData;
+    rootProjectNode()->update();
     updateBuildTargetData();
     updateCppCompilerCallData();
     if (m_extraCompilersPending) {
@@ -993,8 +998,6 @@ void QbsProject::updateDeploymentInfo()
 {
     DeploymentData deploymentData;
     if (m_qbsProject.isValid()) {
-        qbs::InstallOptions installOptions;
-        installOptions.setInstallRoot(QLatin1String("/"));
         foreach (const qbs::ArtifactData &f, m_projectData.installableArtifacts()) {
             deploymentData.addFile(f.filePath(), f.installData().installDir(),
                     f.isExecutable() ? DeployableFile::TypeExecutable : DeployableFile::TypeNormal);
diff --git a/src/plugins/qmldesigner/designercore/instances/puppetbuildprogressdialog.cpp b/src/plugins/qmldesigner/designercore/instances/puppetbuildprogressdialog.cpp
index 13f3ce8ef58553113e1212f93787f0a0018f62c7..3777fa3633ece6ed03f9548e072fff1de07d5fbd 100644
--- a/src/plugins/qmldesigner/designercore/instances/puppetbuildprogressdialog.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/puppetbuildprogressdialog.cpp
@@ -40,6 +40,7 @@ PuppetBuildProgressDialog::PuppetBuildProgressDialog() :
     m_useFallbackPuppet(false)
 {
     setWindowFlags(Qt::SplashScreen);
+    setWindowModality(Qt::ApplicationModal);
     ui->setupUi(this);
     ui->buildProgressBar->setMaximum(85);
     connect(ui->useFallbackPuppetPushButton, SIGNAL(clicked()), this, SLOT(setUseFallbackPuppet()));
diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp
index 6a371a50b49b639fcf4972381022ef8165a45b63..9e06deab97673b7e0a267c3c27f67eb50e95c2e3 100644
--- a/src/plugins/qmldesigner/designersettings.cpp
+++ b/src/plugins/qmldesigner/designersettings.cpp
@@ -68,6 +68,7 @@ void DesignerSettings::fromSettings(QSettings *settings)
     restoreValue(settings, DesignerSettingsKey::PUPPET_KILL_TIMEOUT, 3000); // this has no ui at the moment
     restoreValue(settings, DesignerSettingsKey::DEBUG_PUPPET, QString());
     restoreValue(settings, DesignerSettingsKey::FORWARD_PUPPET_OUTPUT, QString());
+    restoreValue(settings, DesignerSettingsKey::REFORMAT_UI_QML_FILES, true);
 
     settings->endGroup();
     settings->endGroup();
diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h
index 2159230cbfda78dd7c2422e681e16935237dfb85..bc53d15aca157698d6b426177811d84e4e459e3e 100644
--- a/src/plugins/qmldesigner/designersettings.h
+++ b/src/plugins/qmldesigner/designersettings.h
@@ -57,7 +57,9 @@ const char ENABLE_MODEL_EXCEPTION_OUTPUT[] = "WarnException";
 const char PUPPET_KILL_TIMEOUT[] = "PuppetKillTimeout";
 const char DEBUG_PUPPET[] = "DebugPuppet";
 const char FORWARD_PUPPET_OUTPUT[] = "ForwardPuppetOutput";
-
+const char REFORMAT_UI_QML_FILES[] = "ReformatUiQmlFiles"; /* This Setting is not exposed in ui.
+                                                              The setting can be used to turn off the feature,
+                                                              if there are serious issues */
 }
 
 class DesignerSettings : public QHash<QByteArray, QVariant>
diff --git a/src/plugins/qmldesigner/documentwarningwidget.cpp b/src/plugins/qmldesigner/documentwarningwidget.cpp
index 12baccb7b18e5e563ab1b0a24d6b0a1f5da9d729..50ea460b131a887b91eda2d7e666cb229ec6d32c 100644
--- a/src/plugins/qmldesigner/documentwarningwidget.cpp
+++ b/src/plugins/qmldesigner/documentwarningwidget.cpp
@@ -27,6 +27,10 @@
 
 #include <qmldesignerplugin.h>
 
+
+#include <utils/theme/theme.h>
+#include <utils/stylehelper.h>
+
 #include <QLabel>
 #include <QPushButton>
 #include <QCheckBox>
@@ -170,6 +174,13 @@ bool DocumentWarningWidget::eventFilter(QObject *object, QEvent *event)
 
 void DocumentWarningWidget::showEvent(QShowEvent *event)
 {
+    const QColor backgroundColor = Utils::creatorTheme()->color(Utils::Theme::QmlDesigner_BackgroundColor);
+    QPalette pal = palette();
+    QColor color = pal.color(QPalette::ToolTipBase);
+    const QColor backgroundNoAlpha = Utils::StyleHelper::alphaBlendedColors(color, backgroundColor);
+    color.setAlpha(255);
+    pal.setColor(QPalette::ToolTipBase, backgroundNoAlpha);
+    setPalette(pal);
     m_gotoCodeWasClicked = false;
     moveToParentCenter();
     refreshContent();
diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/stylesheet.css b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/stylesheet.css
index f7b529628ac88164ad198b0f0e75c2cf965988e2..bf3b5d360749b43553ccd473d3d3d3e4c4236d65 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/stylesheet.css
+++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/stylesheet.css
@@ -13,6 +13,12 @@ QTableView {
 
 }
 
+QTabBar QToolButton {
+    background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate;
+    border: 1px solid creatorTheme.QmlDesignerBackgroundColorDarker;
+    border-radius: 0px;
+}
+
 QTableView::item
 {
     border: 0px;
diff --git a/src/plugins/qmldesigner/shortcutmanager.cpp b/src/plugins/qmldesigner/shortcutmanager.cpp
index c17740c67068b13fde904aca0d8e3bcf11372ec1..d06f32c118182879237c2263e5f13d21766f1fdb 100644
--- a/src/plugins/qmldesigner/shortcutmanager.cpp
+++ b/src/plugins/qmldesigner/shortcutmanager.cpp
@@ -25,6 +25,8 @@
 
 #include "shortcutmanager.h"
 
+#include "designersettings.h"
+
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <coreplugin/actionmanager/actioncontainer.h>
 #include <coreplugin/actionmanager/command.h>
@@ -33,7 +35,13 @@
 #include <coreplugin/editormanager/documentmodel.h>
 #include <coreplugin/editormanager/editormanager.h>
 #include <coreplugin/coreconstants.h>
+#include <qmljseditor/qmljseditorconstants.h>
+#include <qmljseditor/qmljseditordocument.h>
+
 #include <utils/hostosinfo.h>
+#include <utils/qtcassert.h>
+
+#include <qmljs/qmljsreformatter.h>
 
 #include "qmldesignerconstants.h"
 #include "qmldesignerplugin.h"
@@ -106,13 +114,29 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
             SLOT(toggleRightSidebar()));
 
     // Revert to saved
-    QObject *em = Core::EditorManager::instance();
+    Core::EditorManager *em = Core::EditorManager::instance();
     Core::ActionManager::registerAction(&m_revertToSavedAction,Core::Constants::REVERTTOSAVED, qmlDesignerMainContext);
     connect(&m_revertToSavedAction, SIGNAL(triggered()), em, SLOT(revertToSaved()));
 
     //Save
     Core::ActionManager::registerAction(&m_saveAction, Core::Constants::SAVE, qmlDesignerMainContext);
-    connect(&m_saveAction, SIGNAL(triggered()), em, SLOT(saveDocument()));
+    connect(&m_saveAction, &QAction::triggered, em, [em] {
+        DesignerSettings settings = QmlDesignerPlugin::instance()->settings();
+        /* Reformat document if we have a .ui.qml file */
+        if (settings.value(DesignerSettingsKey::REFORMAT_UI_QML_FILES).toBool()
+                && em->currentDocument()->filePath().toString().endsWith(".ui.qml"))
+            if (QmlJSEditor::QmlJSEditorDocument *document
+                    = qobject_cast<QmlJSEditor::QmlJSEditorDocument *>(em->currentDocument())) {
+                const QString &newText = QmlJS::reformat(document->semanticInfo().document);
+                QTextCursor tc(document->document());
+                tc.movePosition(QTextCursor::Start);
+                tc.movePosition(QTextCursor::End, QTextCursor::KeepAnchor);
+                tc.insertText(newText);
+            }
+        em->saveDocument();
+    });
+
+
 
     //Save As
     Core::ActionManager::registerAction(&m_saveAsAction, Core::Constants::SAVEAS, qmlDesignerMainContext);
diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp
index 126f878a2cdf274a12aa3c12d2a8604dcd66510f..db9efb356a2e252a3fc8bf13d87a087c11d5ab9d 100644
--- a/src/plugins/texteditor/texteditor.cpp
+++ b/src/plugins/texteditor/texteditor.cpp
@@ -113,8 +113,6 @@
 #include <QTimer>
 #include <QToolBar>
 
-//#define DO_FOO
-
 /*!
     \namespace TextEditor
     \brief The TextEditor namespace contains the base text editor and several classes which
@@ -727,14 +725,6 @@ void TextEditorWidgetPrivate::ctor(const QSharedPointer<TextDocument> &doc)
     QObject::connect(q, &QPlainTextEdit::selectionChanged,
                      this, &TextEditorWidgetPrivate::slotSelectionChanged);
 
-//     (void) new QShortcut(tr("CTRL+L"), this, SLOT(centerCursor()), 0, Qt::WidgetShortcut);
-//     (void) new QShortcut(tr("F9"), this, SLOT(slotToggleMark()), 0, Qt::WidgetShortcut);
-//     (void) new QShortcut(tr("F11"), this, SLOT(slotToggleBlockVisible()));
-
-#ifdef DO_FOO
-    (void) new QShortcut(TextEditorWidget::tr("CTRL+D"), this, SLOT(doFoo()));
-#endif
-
     // parentheses matcher
     m_formatRange = true;
     m_parenthesesMatchingTimer.setSingleShot(true);
@@ -7217,19 +7207,6 @@ void TextEditorWidget::setRefactorMarkers(const RefactorMarkers &markers)
         requestBlockUpdate(marker.cursor.block());
 }
 
-void TextEditorWidget::doFoo()
-{
-#ifdef DO_FOO
-    qDebug() << Q_FUNC_INFO;
-    RefactorMarkers markers = d->m_refactorOverlay->markers();
-    RefactorMarker marker;
-    marker.tooltip = "Hello World";
-    marker.cursor = textCursor();
-    markers += marker;
-    setRefactorMarkers(markers);
-#endif
-}
-
 TextBlockSelection::TextBlockSelection(const TextBlockSelection &other)
 {
     positionBlock = other.positionBlock;
diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h
index 7048ddb923fa6a6fe0ebbdd407926187cdcbc9af..60038d73ed99d4ca9ed61f2abcf97b7b96e09979 100644
--- a/src/plugins/texteditor/texteditor.h
+++ b/src/plugins/texteditor/texteditor.h
@@ -593,8 +593,6 @@ protected slots:
     bool inFindScope(const QTextCursor &cursor);
     bool inFindScope(int selectionStart, int selectionEnd);
 
-    void doFoo();
-
 private:
     Internal::TextEditorWidgetPrivate *d;
     friend class BaseTextEditor;