diff --git a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp
index ae2f397a3d16113edb9b777f40f1ddfe697577e2..295b0bf4ceae9fb9d84b1f89154a16920569f780 100644
--- a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp
@@ -323,7 +323,6 @@ private:
     CMakeToolItemModel *m_model;
     QLineEdit *m_displayNameLineEdit;
     PathChooser *m_binaryChooser;
-    bool m_autodetected;
     Core::Id m_id;
     bool m_loadingItem;
 };
diff --git a/src/plugins/coreplugin/infobar.cpp b/src/plugins/coreplugin/infobar.cpp
index eb982a3a7dbad9a4825bb32bef7cfe24fb590370..1b4fdc9c58b1fd4d49122f16463e4a7b772e5d7a 100644
--- a/src/plugins/coreplugin/infobar.cpp
+++ b/src/plugins/coreplugin/infobar.cpp
@@ -177,8 +177,8 @@ void InfoBarDisplay::setInfoBar(InfoBar *infoBar)
         m_infoBar->disconnect(this);
     m_infoBar = infoBar;
     if (m_infoBar) {
-        connect(infoBar, SIGNAL(changed()), SLOT(update()));
-        connect(infoBar, SIGNAL(destroyed()), SLOT(infoBarDestroyed()));
+        connect(m_infoBar, SIGNAL(changed()), SLOT(update()));
+        connect(m_infoBar, SIGNAL(destroyed()), SLOT(infoBarDestroyed()));
     }
     update();
 }
diff --git a/src/plugins/diffeditor/diffeditor.cpp b/src/plugins/diffeditor/diffeditor.cpp
index f1d3c86640fa26b821aa110b89bd0ca699d6919b..5a08be7445ca06790c1a2b80e99ae886b48b730c 100644
--- a/src/plugins/diffeditor/diffeditor.cpp
+++ b/src/plugins/diffeditor/diffeditor.cpp
@@ -215,8 +215,8 @@ void DescriptionEditorWidget::handleCurrentContents()
 
 ///////////////////////////////// DiffEditor //////////////////////////////////
 
-DiffEditor::DiffEditor(const QSharedPointer<DiffEditorDocument> &doc)
-    : m_document(doc)
+DiffEditor::DiffEditor()
+    : m_document(0)
     , m_descriptionWidget(0)
     , m_stackedWidget(0)
     , m_toolBar(0)
@@ -233,10 +233,10 @@ DiffEditor::DiffEditor(const QSharedPointer<DiffEditorDocument> &doc)
     , m_sync(false)
     , m_showDescription(true)
 {
-    Guard guard(&m_ignoreChanges);
-    QTC_ASSERT(m_document, return);
+    // Editor:
     setDuplicateSupported(true);
 
+    // Widget:
     QSplitter *splitter = new Core::MiniSplitter(Qt::Vertical);
 
     m_descriptionWidget = new DescriptionEditorWidget(splitter);
@@ -251,67 +251,11 @@ DiffEditor::DiffEditor(const QSharedPointer<DiffEditorDocument> &doc)
 
     setWidget(splitter);
 
-    connect(m_descriptionWidget, &DescriptionEditorWidget::requestBranchList,
-            m_document.data(), &DiffEditorDocument::requestMoreInformation);
-    connect(m_document.data(), &DiffEditorDocument::documentChanged,
-            this, &DiffEditor::documentHasChanged);
-    connect(m_document.data(), &DiffEditorDocument::descriptionChanged,
-            this, &DiffEditor::updateDescription);
-    connect(m_document.data(), &DiffEditorDocument::aboutToReload,
-            this, &DiffEditor::prepareForReload);
-    connect(m_document.data(), &DiffEditorDocument::reloadFinished,
-            this, &DiffEditor::reloadHasFinished);
-
-    toolBar();
-
-    loadSettings();
-    documentHasChanged();
-}
-
-DiffEditor::~DiffEditor()
-{
-    delete m_toolBar;
-    delete m_widget;
-}
-
-Core::IEditor *DiffEditor::duplicate()
-{
-    return new DiffEditor(m_document);
-}
-
-bool DiffEditor::open(QString *errorString,
-                      const QString &fileName,
-                      const QString &realFileName)
-{
-    Q_UNUSED(realFileName)
-    return m_document->open(errorString, fileName);
-}
-
-Core::IDocument *DiffEditor::document()
-{
-    return m_document.data();
-}
-
-static QToolBar *createToolBar(IDiffView *someView)
-{
-    // Create
-    QToolBar *toolBar = new QToolBar;
-    toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
-    const int size = someView->widget()->style()->pixelMetric(QStyle::PM_SmallIconSize);
-    toolBar->setIconSize(QSize(size, size));
-
-    return toolBar;
-}
-
-QWidget *DiffEditor::toolBar()
-{
-    QTC_ASSERT(!m_views.isEmpty(), return 0);
-
-    if (m_toolBar)
-        return m_toolBar;
-
-    // Create
-    m_toolBar = createToolBar(m_views.at(0));
+    // Toolbar:
+    m_toolBar = new QToolBar;
+    m_toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
+    const int size = m_views.at(0)->widget()->style()->pixelMetric(QStyle::PM_SmallIconSize);
+    m_toolBar->setIconSize(QSize(size, size));
 
     m_entriesComboBox = new QComboBox;
     m_entriesComboBox->setMinimumContentsLength(20);
@@ -331,14 +275,12 @@ QWidget *DiffEditor::toolBar()
 
     m_contextSpinBox = new QSpinBox(m_toolBar);
     m_contextSpinBox->setRange(1, 100);
-    m_contextSpinBox->setValue(m_document->contextLineCount());
     m_contextSpinBox->setFrame(false);
     m_contextSpinBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); // Mac Qt5
     m_toolBar->addWidget(m_contextSpinBox);
 
     m_whitespaceButtonAction = m_toolBar->addAction(tr("Ignore Whitespace"));
     m_whitespaceButtonAction->setCheckable(true);
-    m_whitespaceButtonAction->setChecked(m_document->ignoreWhitespace());
 
     m_toggleDescriptionAction = m_toolBar->addAction(QIcon(QLatin1String(Constants::ICON_TOP_BAR)),
                                                QString());
@@ -347,14 +289,12 @@ QWidget *DiffEditor::toolBar()
     m_reloadAction = m_toolBar->addAction(QIcon(QLatin1String(Core::Constants::ICON_RELOAD_GRAY)),
                                           tr("Reload Diff"));
     m_reloadAction->setToolTip(tr("Reload Diff"));
-    documentStateChanged();
 
     m_toggleSyncAction = m_toolBar->addAction(QIcon(QLatin1String(Core::Constants::ICON_LINK)),
                                         QString());
     m_toggleSyncAction->setCheckable(true);
 
     m_viewSwitcherAction = m_toolBar->addAction(QIcon(), QString());
-    updateDiffEditorSwitcher();
 
     connect(m_whitespaceButtonAction, &QAction::toggled, this, &DiffEditor::ignoreWhitespaceHasChanged);
     connect(m_contextSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
@@ -362,10 +302,84 @@ QWidget *DiffEditor::toolBar()
     connect(m_toggleSyncAction, &QAction::toggled, this, &DiffEditor::toggleSync);
     connect(m_toggleDescriptionAction, &QAction::toggled, this, &DiffEditor::toggleDescription);
     connect(m_viewSwitcherAction, &QAction::triggered, this, [this]() { showDiffView(nextView()); });
+}
+
+void DiffEditor::setDocument(QSharedPointer<DiffEditorDocument>(doc))
+{
+    QTC_ASSERT(m_document.isNull(), return);
+    QTC_ASSERT(doc, return);
+
+    m_document = QSharedPointer<DiffEditorDocument>(doc);
+
+    connect(m_descriptionWidget, &DescriptionEditorWidget::requestBranchList,
+            m_document.data(), &DiffEditorDocument::requestMoreInformation);
+    connect(m_document.data(), &DiffEditorDocument::documentChanged,
+            this, &DiffEditor::documentHasChanged);
+    connect(m_document.data(), &DiffEditorDocument::descriptionChanged,
+            this, &DiffEditor::updateDescription);
+    connect(m_document.data(), &DiffEditorDocument::aboutToReload,
+            this, &DiffEditor::prepareForReload);
+    connect(m_document.data(), &DiffEditorDocument::reloadFinished,
+            this, &DiffEditor::reloadHasFinished);
+
     connect(m_reloadAction, &QAction::triggered, this, [this]() { m_document->reload(); });
     connect(m_document.data(), &DiffEditorDocument::temporaryStateChanged,
             this, &DiffEditor::documentStateChanged);
 
+    m_contextSpinBox->setValue(m_document->contextLineCount());
+    m_whitespaceButtonAction->setChecked(m_document->ignoreWhitespace());
+
+    documentStateChanged();
+    documentHasChanged();
+}
+
+DiffEditor::DiffEditor(DiffEditorDocument *doc) : DiffEditor()
+{
+    Guard guard(&m_ignoreChanges);
+    setDocument(QSharedPointer<DiffEditorDocument>(doc));
+    setupView(loadSettings());
+}
+
+DiffEditor::~DiffEditor()
+{
+    delete m_toolBar;
+    delete m_widget;
+}
+
+Core::IEditor *DiffEditor::duplicate()
+{
+    DiffEditor *editor = new DiffEditor();
+    Guard guard(&editor->m_ignoreChanges);
+
+    editor->setDocument(m_document);
+    editor->m_sync = m_sync;
+    editor->m_showDescription = m_showDescription;
+
+    Core::Id id = currentView()->id();
+    IDiffView *view = Utils::findOr(editor->m_views, editor->m_views.at(0),
+                                    [id](IDiffView *v) { return v->id() == id; });
+    QTC_ASSERT(view, view = editor->currentView());
+    editor->setupView(view);
+
+    return editor;
+}
+
+bool DiffEditor::open(QString *errorString,
+                      const QString &fileName,
+                      const QString &realFileName)
+{
+    Q_UNUSED(realFileName)
+    return m_document->open(errorString, fileName);
+}
+
+Core::IDocument *DiffEditor::document()
+{
+    return m_document.data();
+}
+
+QWidget *DiffEditor::toolBar()
+{
+    QTC_ASSERT(m_toolBar, return 0);
     return m_toolBar;
 }
 
@@ -573,9 +587,9 @@ void DiffEditor::toggleSync()
     currentView()->setSync(m_sync);
 }
 
-void DiffEditor::loadSettings()
+IDiffView *DiffEditor::loadSettings()
 {
-    QTC_ASSERT(currentView(), return);
+    QTC_ASSERT(currentView(), return 0);
     QSettings *s = Core::ICore::settings();
 
     // TODO: Remove in 3.6: Read legacy settings first:
@@ -602,9 +616,9 @@ void DiffEditor::loadSettings()
     s->endGroup();
 
     IDiffView *view = Utils::findOr(m_views, m_views.at(0), [id](IDiffView *v) { return v->id() == id; });
-    QTC_ASSERT(view, return);
+    QTC_CHECK(view);
 
-    setupView(view);
+    return view;
 }
 
 void DiffEditor::saveSetting(const QString &key, const QVariant &value) const
diff --git a/src/plugins/diffeditor/diffeditor.h b/src/plugins/diffeditor/diffeditor.h
index 3be67972e418c7915e69b7939a72744c2fd7fd27..998757122954bfe6e4f3683d8c3588610a6b3269 100644
--- a/src/plugins/diffeditor/diffeditor.h
+++ b/src/plugins/diffeditor/diffeditor.h
@@ -59,10 +59,9 @@ class DiffEditor : public Core::IEditor
     Q_OBJECT
 
 public:
-    DiffEditor(const QSharedPointer<DiffEditorDocument> &doc);
+    DiffEditor(DiffEditorDocument *doc);
     ~DiffEditor();
 
-public:
     Core::IEditor *duplicate();
 
     bool open(QString *errorString,
@@ -86,7 +85,10 @@ private slots:
     void toggleSync();
 
 private:
-    void loadSettings();
+    DiffEditor();
+    void setDocument(QSharedPointer<DiffEditorDocument> doc);
+
+    IDiffView *loadSettings();
     void saveSetting(const QString &key, const QVariant &value) const;
     void updateEntryToolTip();
     void showDiffView(IDiffView *view);
diff --git a/src/plugins/diffeditor/diffeditorfactory.cpp b/src/plugins/diffeditor/diffeditorfactory.cpp
index e52b0c5e170c2f4bbbe510f275fe2d55c4300f1d..6687cc191bb0ed761ba1930fb40c3d0f77b4bf77 100644
--- a/src/plugins/diffeditor/diffeditorfactory.cpp
+++ b/src/plugins/diffeditor/diffeditorfactory.cpp
@@ -49,7 +49,7 @@ DiffEditorFactory::DiffEditorFactory(QObject *parent)
 
 Core::IEditor *DiffEditorFactory::createEditor()
 {
-    return new DiffEditor(QSharedPointer<DiffEditorDocument>(new DiffEditorDocument));
+    return new DiffEditor(new DiffEditorDocument);
 }
 
 } // namespace Internal