diff --git a/src/plugins/debugger/debuggerkitconfigwidget.cpp b/src/plugins/debugger/debuggerkitconfigwidget.cpp
index 438f92bc48d86bf1f30d9c068eb5b1bdb2129431..f0c40afa896c0b0945200f5e4672d93f8f5c03bb 100644
--- a/src/plugins/debugger/debuggerkitconfigwidget.cpp
+++ b/src/plugins/debugger/debuggerkitconfigwidget.cpp
@@ -64,13 +64,12 @@ static const char dgbToolsDownloadLink64C[] = "http://www.microsoft.com/whdc/dev
 // DebuggerKitConfigWidget:
 // -----------------------------------------------------------------------
 
-DebuggerKitConfigWidget::DebuggerKitConfigWidget(ProjectExplorer::Kit *k,
+DebuggerKitConfigWidget::DebuggerKitConfigWidget(ProjectExplorer::Kit *workingCopy,
                                                  const DebuggerKitInformation *ki,
                                                  QWidget *parent) :
     ProjectExplorer::KitConfigWidget(parent),
-    m_kit(k),
+    m_kit(workingCopy),
     m_info(ki),
-    m_dirty(false),
     m_label(new QLabel(this)),
     m_button(new QPushButton(tr("Manage..."), this))
 {
@@ -88,7 +87,7 @@ DebuggerKitConfigWidget::DebuggerKitConfigWidget(ProjectExplorer::Kit *k,
     connect(changeAction, SIGNAL(triggered()), this, SLOT(showDialog()));
     m_button->setMenu(buttonMenu);
 
-    discard();
+    refresh();
 }
 
 QWidget *DebuggerKitConfigWidget::buttonWidget() const
@@ -106,45 +105,23 @@ void DebuggerKitConfigWidget::makeReadOnly()
     m_button->setEnabled(false);
 }
 
-void DebuggerKitConfigWidget::apply()
+void DebuggerKitConfigWidget::refresh()
 {
-    DebuggerKitInformation::setDebuggerItem(m_kit, m_item);
-    m_dirty = false;
-}
-
-void DebuggerKitConfigWidget::discard()
-{
-    doSetItem(DebuggerKitInformation::debuggerItem(m_kit));
-    m_dirty = false;
+    m_label->setText(DebuggerKitInformation::userOutput(DebuggerKitInformation::debuggerItem(m_kit)));
 }
 
 void DebuggerKitConfigWidget::autoDetectDebugger()
 {
-    setItem(DebuggerKitInformation::autoDetectItem(m_kit));
-}
-
-void DebuggerKitConfigWidget::doSetItem(const DebuggerKitInformation::DebuggerItem &item)
-{
-    m_item = item;
-    m_label->setText(DebuggerKitInformation::userOutput(m_item));
-}
-
-void DebuggerKitConfigWidget::setItem(const DebuggerKitInformation::DebuggerItem &item)
-{
-    if (m_item != item) {
-        m_dirty = true;
-        doSetItem(item);
-        emit dirty();
-    }
+    DebuggerKitInformation::setDebuggerItem(m_kit, DebuggerKitInformation::autoDetectItem(m_kit));
 }
 
 void DebuggerKitConfigWidget::showDialog()
 {
     DebuggerKitConfigDialog dialog;
     dialog.setWindowTitle(tr("Debugger for \"%1\"").arg(m_kit->displayName()));
-    dialog.setDebuggerItem(m_item);
+    dialog.setDebuggerItem(DebuggerKitInformation::debuggerItem(m_kit));
     if (dialog.exec() == QDialog::Accepted)
-        setItem(dialog.item());
+        DebuggerKitInformation::setDebuggerItem(m_kit, dialog.item());
 }
 
 // -----------------------------------------------------------------------
diff --git a/src/plugins/debugger/debuggerkitconfigwidget.h b/src/plugins/debugger/debuggerkitconfigwidget.h
index 2582afec52007dde8d28a7411fc227ef2f8eb2c8..505feca5585170e3b0e76e601828e1c4e6970ab0 100644
--- a/src/plugins/debugger/debuggerkitconfigwidget.h
+++ b/src/plugins/debugger/debuggerkitconfigwidget.h
@@ -61,7 +61,7 @@ class DebuggerKitConfigWidget : public ProjectExplorer::KitConfigWidget
     Q_OBJECT
 
 public:
-    DebuggerKitConfigWidget(ProjectExplorer::Kit *k,
+    DebuggerKitConfigWidget(ProjectExplorer::Kit *workingCopy,
                             const DebuggerKitInformation *ki,
                             QWidget *parent = 0);
 
@@ -69,9 +69,8 @@ public:
 
     void makeReadOnly();
 
-    void apply();
-    void discard();
-    bool isDirty() const { return m_dirty; }
+    void refresh();
+
     QWidget *buttonWidget() const;
 
 private slots:
@@ -79,13 +78,8 @@ private slots:
     void showDialog();
 
 private:
-    void setItem(const DebuggerKitInformation::DebuggerItem &item);
-    void doSetItem(const DebuggerKitInformation::DebuggerItem &item);
-
     ProjectExplorer::Kit *m_kit;
     const DebuggerKitInformation *m_info;
-    DebuggerKitInformation::DebuggerItem m_item;
-    bool m_dirty;
     QLabel *m_label;
     QPushButton *m_button;
 };
diff --git a/src/plugins/projectexplorer/kitconfigwidget.h b/src/plugins/projectexplorer/kitconfigwidget.h
index f4079ddf5c30eb5c010bcd1e549ba5049a9a93b2..c9239f3312997e4067454815f7461dc22a2979b0 100644
--- a/src/plugins/projectexplorer/kitconfigwidget.h
+++ b/src/plugins/projectexplorer/kitconfigwidget.h
@@ -52,10 +52,7 @@ public:
 
     virtual QString displayName() const = 0;
     virtual void makeReadOnly() = 0;
-
-    virtual void apply() = 0;
-    virtual void discard() = 0;
-    virtual bool isDirty() const = 0;
+    virtual void refresh() = 0;
 
     virtual QWidget *buttonWidget() const { return 0; }
 
diff --git a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp
index cb811d56cd9a6866b8c7eead7227767130713c73..78e3927689d12737383ee2cc4b87741c27506762 100644
--- a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp
+++ b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp
@@ -69,7 +69,7 @@ SysRootInformationConfigWidget::SysRootInformationConfigWidget(Kit *k, QWidget *
 
     m_chooser->setFileName(SysRootKitInformation::sysRoot(k));
 
-    connect(m_chooser, SIGNAL(changed(QString)), this, SIGNAL(dirty()));
+    connect(m_chooser, SIGNAL(changed(QString)), this, SLOT(pathWasChanged()));
 }
 
 QString SysRootInformationConfigWidget::displayName() const
@@ -77,21 +77,11 @@ QString SysRootInformationConfigWidget::displayName() const
     return tr("Sysroot:");
 }
 
-void SysRootInformationConfigWidget::apply()
-{
-    SysRootKitInformation::setSysRoot(m_kit, m_chooser->fileName());
-}
-
-void SysRootInformationConfigWidget::discard()
+void SysRootInformationConfigWidget::refresh()
 {
     m_chooser->setFileName(SysRootKitInformation::sysRoot(m_kit));
 }
 
-bool SysRootInformationConfigWidget::isDirty() const
-{
-    return SysRootKitInformation::sysRoot(m_kit) != m_chooser->fileName();
-}
-
 void SysRootInformationConfigWidget::makeReadOnly()
 {
     m_chooser->setEnabled(false);
@@ -102,6 +92,11 @@ QWidget *SysRootInformationConfigWidget::buttonWidget() const
     return m_chooser->buttonAtIndex(0);
 }
 
+void SysRootInformationConfigWidget::pathWasChanged()
+{
+    SysRootKitInformation::setSysRoot(m_kit, m_chooser->fileName());
+}
+
 // --------------------------------------------------------------------------
 // ToolChainInformationConfigWidget:
 // --------------------------------------------------------------------------
@@ -128,8 +123,8 @@ ToolChainInformationConfigWidget::ToolChainInformationConfigWidget(Kit *k, QWidg
 
     updateComboBox();
 
-    discard();
-    connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SIGNAL(dirty()));
+    refresh();
+    connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(currentToolChainChanged(int)));
 
     m_manageButton->setContentsMargins(0, 0, 0, 0);
     m_manageButton->setText(tr("Manage..."));
@@ -148,25 +143,11 @@ QString ToolChainInformationConfigWidget::displayName() const
     return tr("Compiler:");
 }
 
-void ToolChainInformationConfigWidget::apply()
-{
-    const QString id = m_comboBox->itemData(m_comboBox->currentIndex()).toString();
-    ToolChain *tc = ToolChainManager::instance()->findToolChain(id);
-    ToolChainKitInformation::setToolChain(m_kit, tc);
-}
-
-void ToolChainInformationConfigWidget::discard()
+void ToolChainInformationConfigWidget::refresh()
 {
     m_comboBox->setCurrentIndex(indexOf(ToolChainKitInformation::toolChain(m_kit)));
 }
 
-bool ToolChainInformationConfigWidget::isDirty() const
-{
-    ToolChain *tc = ToolChainKitInformation::toolChain(m_kit);
-    return (m_comboBox->itemData(m_comboBox->currentIndex()).toString())
-            != (tc ? tc->id() : QString());
-}
-
 void ToolChainInformationConfigWidget::makeReadOnly()
 {
     m_comboBox->setEnabled(false);
@@ -205,6 +186,13 @@ void ToolChainInformationConfigWidget::manageToolChains()
                                    QLatin1String(ProjectExplorer::Constants::TOOLCHAIN_SETTINGS_PAGE_ID));
 }
 
+void ToolChainInformationConfigWidget::currentToolChainChanged(int idx)
+{
+    const QString id = m_comboBox->itemData(idx).toString();
+    ToolChain *tc = ToolChainManager::instance()->findToolChain(id);
+    ToolChainKitInformation::setToolChain(m_kit, tc);
+}
+
 void ToolChainInformationConfigWidget::updateComboBox()
 {
     // remove unavailable tool chain:
@@ -234,9 +222,9 @@ int ToolChainInformationConfigWidget::indexOf(const ToolChain *tc)
 // DeviceTypeInformationConfigWidget:
 // --------------------------------------------------------------------------
 
-DeviceTypeInformationConfigWidget::DeviceTypeInformationConfigWidget(Kit *k, QWidget *parent) :
+DeviceTypeInformationConfigWidget::DeviceTypeInformationConfigWidget(Kit *workingCopy, QWidget *parent) :
     KitConfigWidget(parent),
-    m_isReadOnly(false), m_kit(k),
+    m_isReadOnly(false), m_kit(workingCopy),
     m_comboBox(new QComboBox)
 {
     setToolTip(tr("The type of device to run applications on."));
@@ -250,12 +238,12 @@ DeviceTypeInformationConfigWidget::DeviceTypeInformationConfigWidget(Kit *k, QWi
             = ExtensionSystem::PluginManager::instance()->getObjects<IDeviceFactory>();
     foreach (IDeviceFactory *factory, factories) {
         foreach (Core::Id id, factory->availableCreationIds()) {
-            m_comboBox->addItem(factory->displayNameForId(id), QVariant::fromValue(id));
+            m_comboBox->addItem(factory->displayNameForId(id), id.uniqueIdentifier());
         }
     }
 
-    discard();
-    connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SIGNAL(dirty()));
+    refresh();
+    connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(currentTypeChanged(int)));
 }
 
 QString DeviceTypeInformationConfigWidget::displayName() const
@@ -263,47 +251,37 @@ QString DeviceTypeInformationConfigWidget::displayName() const
     return tr("Device type:");
 }
 
-void DeviceTypeInformationConfigWidget::apply()
-{
-    Core::Id devType;
-    if (m_comboBox->currentIndex() >= 0)
-        devType = m_comboBox->itemData(m_comboBox->currentIndex()).value<Core::Id>();
-    DeviceTypeKitInformation::setDeviceTypeId(m_kit, devType);
-}
-
-void DeviceTypeInformationConfigWidget::discard()
+void DeviceTypeInformationConfigWidget::refresh()
 {
     Core::Id devType = DeviceTypeKitInformation::deviceTypeId(m_kit);
     if (!devType.isValid())
         m_comboBox->setCurrentIndex(-1);
     for (int i = 0; i < m_comboBox->count(); ++i) {
-        if (m_comboBox->itemData(i).value<Core::Id>() == devType) {
+        if (m_comboBox->itemData(i).toInt() == devType.uniqueIdentifier()) {
             m_comboBox->setCurrentIndex(i);
             break;
         }
     }
 }
 
-bool DeviceTypeInformationConfigWidget::isDirty() const
+void DeviceTypeInformationConfigWidget::makeReadOnly()
 {
-    Core::Id devType;
-    if (m_comboBox->currentIndex() >= 0)
-        devType = m_comboBox->itemData(m_comboBox->currentIndex()).value<Core::Id>();
-    return DeviceTypeKitInformation::deviceTypeId(m_kit) != devType;
+    m_comboBox->setEnabled(false);
 }
 
-void DeviceTypeInformationConfigWidget::makeReadOnly()
+void DeviceTypeInformationConfigWidget::currentTypeChanged(int idx)
 {
-    m_comboBox->setEnabled(false);
+    Core::Id type = idx < 0 ? Core::Id() : Core::Id::fromUniqueIdentifier(m_comboBox->itemData(idx).toInt());
+    DeviceTypeKitInformation::setDeviceTypeId(m_kit, type);
 }
 
 // --------------------------------------------------------------------------
 // DeviceInformationConfigWidget:
 // --------------------------------------------------------------------------
 
-DeviceInformationConfigWidget::DeviceInformationConfigWidget(Kit *k, QWidget *parent) :
+DeviceInformationConfigWidget::DeviceInformationConfigWidget(Kit *workingCopy, QWidget *parent) :
     KitConfigWidget(parent),
-    m_isReadOnly(false), m_kit(k),
+    m_isReadOnly(false), m_kit(workingCopy),
     m_comboBox(new QComboBox), m_manageButton(new QPushButton(this)),
     m_model(new DeviceManagerModel(DeviceManager::instance()))
 {
@@ -323,8 +301,8 @@ DeviceInformationConfigWidget::DeviceInformationConfigWidget(Kit *k, QWidget *pa
     m_manageButton->setContentsMargins(0, 0, 0, 0);
     m_manageButton->setText(tr("Manage..."));
 
-    discard();
-    connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SIGNAL(dirty()));
+    refresh();
+    connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(currentDeviceChanged()));
 
     connect(m_manageButton, SIGNAL(clicked()), this, SLOT(manageDevices()));
 }
@@ -334,26 +312,12 @@ QString DeviceInformationConfigWidget::displayName() const
     return tr("Device:");
 }
 
-void DeviceInformationConfigWidget::apply()
-{
-    int idx = m_comboBox->currentIndex();
-    if (idx >= 0)
-        DeviceKitInformation::setDeviceId(m_kit, m_model->deviceId(idx));
-    else
-        DeviceKitInformation::setDeviceId(m_kit, IDevice::invalidId());
-}
-
-void DeviceInformationConfigWidget::discard()
+void DeviceInformationConfigWidget::refresh()
 {
+    m_model->setTypeFilter(DeviceTypeKitInformation::deviceTypeId(m_kit));
     m_comboBox->setCurrentIndex(m_model->indexOf(DeviceKitInformation::device(m_kit)));
 }
 
-bool DeviceInformationConfigWidget::isDirty() const
-{
-    Core::Id devId = DeviceKitInformation::deviceId(m_kit);
-    return devId != m_model->deviceId(m_comboBox->currentIndex());
-}
-
 void DeviceInformationConfigWidget::makeReadOnly()
 {
     m_comboBox->setEnabled(false);
@@ -380,5 +344,10 @@ void DeviceInformationConfigWidget::modelReset()
     m_comboBox->setCurrentIndex(m_model->indexForId(m_selectedId));
 }
 
+void DeviceInformationConfigWidget::currentDeviceChanged()
+{
+    DeviceKitInformation::setDeviceId(m_kit, m_model->deviceId(m_comboBox->currentIndex()));
+}
+
 } // namespace Internal
 } // namespace ProjectExplorer
diff --git a/src/plugins/projectexplorer/kitinformationconfigwidget.h b/src/plugins/projectexplorer/kitinformationconfigwidget.h
index 44b79ff5ba10fc9cde91f09090e42d5dda212a25..2f3aaf1dd0f5e0e1e04b5e9af0b7ba6e10f7fd0a 100644
--- a/src/plugins/projectexplorer/kitinformationconfigwidget.h
+++ b/src/plugins/projectexplorer/kitinformationconfigwidget.h
@@ -61,12 +61,13 @@ public:
     explicit SysRootInformationConfigWidget(Kit *k, QWidget *parent = 0);
 
     QString displayName() const;
-    void apply();
-    void discard();
-    bool isDirty() const;
+    void refresh();
     void makeReadOnly();
     QWidget *buttonWidget() const;
 
+private slots:
+    void pathWasChanged();
+
 private:
     Kit *m_kit;
     Utils::PathChooser *m_chooser;
@@ -84,9 +85,7 @@ public:
     explicit ToolChainInformationConfigWidget(Kit *k, QWidget *parent = 0);
 
     QString displayName() const;
-    void apply();
-    void discard();
-    bool isDirty() const;
+    void refresh();
     void makeReadOnly();
     QWidget *buttonWidget() const;
 
@@ -95,6 +94,7 @@ private slots:
     void toolChainRemoved(ProjectExplorer::ToolChain *tc);
     void toolChainUpdated(ProjectExplorer::ToolChain *tc);
     void manageToolChains();
+    void currentToolChainChanged(int idx);
 
 private:
     void updateComboBox();
@@ -115,14 +115,15 @@ class DeviceTypeInformationConfigWidget : public KitConfigWidget
     Q_OBJECT
 
 public:
-    explicit DeviceTypeInformationConfigWidget(Kit *k, QWidget *parent = 0);
+    explicit DeviceTypeInformationConfigWidget(Kit *workingCopy, QWidget *parent = 0);
 
     QString displayName() const;
-    void apply();
-    void discard();
-    bool isDirty() const;
+    void refresh();
     void makeReadOnly();
 
+private slots:
+    void currentTypeChanged(int idx);
+
 private:
     bool m_isReadOnly;
     Kit *m_kit;
@@ -138,12 +139,10 @@ class DeviceInformationConfigWidget : public KitConfigWidget
     Q_OBJECT
 
 public:
-    explicit DeviceInformationConfigWidget(Kit *k, QWidget *parent = 0);
+    explicit DeviceInformationConfigWidget(Kit *workingCopy, QWidget *parent = 0);
 
     QString displayName() const;
-    void apply();
-    void discard();
-    bool isDirty() const;
+    void refresh();
     void makeReadOnly();
     QWidget *buttonWidget() const;
 
@@ -151,6 +150,7 @@ private slots:
     void manageDevices();
     void modelAboutToReset();
     void modelReset();
+    void currentDeviceChanged();
 
 private:
     bool m_isReadOnly;
diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp
index a51770ea43c26cb76ea2a11c425710c11ab71650..8dbf709d0c2c4a66cf6b1ca3f68c245e828e70fa 100644
--- a/src/plugins/projectexplorer/kitmanager.cpp
+++ b/src/plugins/projectexplorer/kitmanager.cpp
@@ -359,11 +359,9 @@ QList<KitInformation *> KitManager::kitInformation() const
 
 Internal::KitManagerConfigWidget *KitManager::createConfigWidget(Kit *k) const
 {
-    if (!k)
-        return 0;
     Internal::KitManagerConfigWidget *result = new Internal::KitManagerConfigWidget(k);
     foreach (KitInformation *ki, d->m_informationList)
-        result->addConfigWidget(ki->createConfigWidget(k));
+        result->addConfigWidget(ki->createConfigWidget(result->workingCopy()));
 
     return result;
 }
diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp
index 857c9121bca970d143798b6f8612a3f01bb24a08..d62dd359cc14938f57952196ce758d81f34269b6 100644
--- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp
+++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp
@@ -30,6 +30,7 @@
 #include "kitmanagerconfigwidget.h"
 
 #include "kit.h"
+#include "kitmanager.h"
 
 #include <utils/detailswidget.h>
 
@@ -43,16 +44,20 @@
 #include <QSizePolicy>
 #include <QStyle>
 
+static const char WORKING_COPY_KIT_ID[] = "modified kit";
+
 namespace ProjectExplorer {
 
 namespace Internal {
 
 KitManagerConfigWidget::KitManagerConfigWidget(Kit *k, QWidget *parent) :
-    KitConfigWidget(parent),
+    QWidget(parent),
     m_layout(new QGridLayout),
     m_iconButton(new QToolButton),
     m_nameEdit(new QLineEdit),
-    m_kit(k)
+    m_kit(k),
+    m_modifiedKit(new Kit(Core::Id(WORKING_COPY_KIT_ID))),
+    m_fixingKit(false)
 {
     QVBoxLayout *top = new QVBoxLayout(this);
     top->setMargin(0);
@@ -81,7 +86,21 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k, QWidget *parent) :
     discard();
 
     connect(m_iconButton, SIGNAL(clicked()), this, SLOT(setIcon()));
-    connect(m_nameEdit, SIGNAL(textChanged(QString)), this, SIGNAL(dirty()));
+    connect(m_nameEdit, SIGNAL(textChanged(QString)), this, SLOT(setDisplayName()));
+
+    KitManager *km = KitManager::instance();
+    connect(km, SIGNAL(unmanagedKitUpdated(ProjectExplorer::Kit*)),
+            this, SLOT(workingCopyWasUpdated(ProjectExplorer::Kit*)));
+    connect(km, SIGNAL(kitUpdated(ProjectExplorer::Kit*)),
+            this, SLOT(kitWasUpdated(ProjectExplorer::Kit*)));
+}
+
+KitManagerConfigWidget::~KitManagerConfigWidget()
+{
+    delete m_modifiedKit;
+    // Make sure our workingCopy did not get registered somehow:
+    foreach (const Kit *k, KitManager::instance()->kits())
+        Q_ASSERT(k->id() != Core::Id(WORKING_COPY_KIT_ID));
 }
 
 QString KitManagerConfigWidget::displayName() const
@@ -91,27 +110,51 @@ QString KitManagerConfigWidget::displayName() const
 
 void KitManagerConfigWidget::apply()
 {
-    foreach (KitConfigWidget *w, m_widgets)
-        w->apply();
-    m_kit->setIconPath(m_iconPath);
-    m_kit->setDisplayName(m_nameEdit->text());
+    KitManager *km = KitManager::instance();
+    bool mustRegister = false;
+    if (!m_kit) {
+        mustRegister = true;
+        m_kit = new Kit;
+    }
+    m_kit->copyFrom(m_modifiedKit);
+    if (mustRegister)
+        km->registerKit(m_kit);
+
+    if (m_isDefaultKit)
+        km->setDefaultKit(m_kit);
+    emit dirty();
 }
 
 void KitManagerConfigWidget::discard()
 {
-    foreach (KitConfigWidget *w, m_widgets)
-        w->discard();
-    m_iconButton->setIcon(m_kit->icon());
-    m_iconPath = m_kit->iconPath();
-    m_nameEdit->setText(m_kit->displayName());
+    if (m_kit) {
+        m_modifiedKit->copyFrom(m_kit);
+        m_isDefaultKit = (m_kit == KitManager::instance()->defaultKit());
+    } else {
+        // This branch will only ever get reached once during setup of widget for a not-yet-existing
+        // kit.
+        m_isDefaultKit = false;
+    }
+    m_iconButton->setIcon(m_modifiedKit->icon());
+    m_nameEdit->setText(m_modifiedKit->displayName());
+    emit dirty();
 }
 
 bool KitManagerConfigWidget::isDirty() const
 {
-    foreach (KitConfigWidget *w, m_widgets)
-        if (w->isDirty())
-            return true;
-    return (m_kit->iconPath() != m_iconPath) || (m_kit->displayName() != m_nameEdit->text());
+    return !m_kit
+            || !m_kit->isEqual(m_modifiedKit)
+            || m_isDefaultKit != (KitManager::instance()->defaultKit() == m_kit);
+}
+
+bool KitManagerConfigWidget::isValid() const
+{
+    return m_modifiedKit->isValid();
+}
+
+QString KitManagerConfigWidget::validityMessage() const
+{
+    return m_modifiedKit->toHtml();
 }
 
 void KitManagerConfigWidget::addConfigWidget(ProjectExplorer::KitConfigWidget *widget)
@@ -119,8 +162,6 @@ void KitManagerConfigWidget::addConfigWidget(ProjectExplorer::KitConfigWidget *w
     Q_ASSERT(widget);
     Q_ASSERT(!m_widgets.contains(widget));
 
-    connect(widget, SIGNAL(dirty()), this, SIGNAL(dirty()));
-
     addToLayout(widget->displayName(), widget->toolTip(), widget, widget->buttonWidget());
     m_widgets.append(widget);
 }
@@ -133,9 +174,39 @@ void KitManagerConfigWidget::makeReadOnly()
     m_nameEdit->setEnabled(false);
 }
 
+Kit *KitManagerConfigWidget::workingCopy() const
+{
+    return m_modifiedKit;
+}
+
+bool KitManagerConfigWidget::configures(Kit *k) const
+{
+    return m_kit == k;
+}
+
+void KitManagerConfigWidget::setIsDefaultKit(bool d)
+{
+    if (m_isDefaultKit != d)
+        return;
+    m_isDefaultKit = d;
+    emit dirty();
+}
+
+bool KitManagerConfigWidget::isDefaultKit() const
+{
+    return m_isDefaultKit;
+}
+
+void KitManagerConfigWidget::removeKit()
+{
+    if (!m_kit)
+        return;
+    KitManager::instance()->deregisterKit(m_kit);
+}
+
 void KitManagerConfigWidget::setIcon()
 {
-    const QString path = QFileDialog::getOpenFileName(this, tr("Select Icon"), m_iconPath, tr("Images (*.png *.xpm *.jpg)"));
+    const QString path = QFileDialog::getOpenFileName(this, tr("Select Icon"), m_modifiedKit->iconPath(), tr("Images (*.png *.xpm *.jpg)"));
     if (path.isEmpty())
         return;
 
@@ -144,10 +215,37 @@ void KitManagerConfigWidget::setIcon()
         return;
 
     m_iconButton->setIcon(icon);
-    m_iconPath = path;
+    m_modifiedKit->setIconPath(path);
     emit dirty();
 }
 
+void KitManagerConfigWidget::setDisplayName()
+{
+    m_modifiedKit->setDisplayName(m_nameEdit->text());
+}
+
+void KitManagerConfigWidget::workingCopyWasUpdated(Kit *k)
+{
+    if (k != m_modifiedKit || m_fixingKit)
+        return;
+
+    m_fixingKit = true;
+    k->fix();
+    m_fixingKit = false;
+
+    foreach (KitConfigWidget *w, m_widgets)
+        w->refresh();
+    m_nameEdit->setText(k->displayName());
+    m_iconButton->setIcon(k->icon());
+    emit dirty();
+}
+
+void KitManagerConfigWidget::kitWasUpdated(Kit *k)
+{
+    if (m_kit == k)
+        discard();
+}
+
 void KitManagerConfigWidget::addToLayout(const QString &name, const QString &toolTip,
                                          QWidget *widget, QWidget *button)
 {
diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.h b/src/plugins/projectexplorer/kitmanagerconfigwidget.h
index df588ce6c70d1de25e8e551feb61018a24e5141b..e10a82ea8bbcdba73eeb3083443b4cf0dce263f7 100644
--- a/src/plugins/projectexplorer/kitmanagerconfigwidget.h
+++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.h
@@ -44,23 +44,40 @@ class Kit;
 
 namespace Internal {
 
-class KitManagerConfigWidget : public ProjectExplorer::KitConfigWidget
+class KitManagerConfigWidget : public QWidget
 {
     Q_OBJECT
 
 public:
     explicit KitManagerConfigWidget(Kit *k, QWidget *parent = 0);
+    ~KitManagerConfigWidget();
 
     QString displayName() const;
 
     void apply();
     void discard();
     bool isDirty() const;
+    bool isValid() const;
+    QString validityMessage() const;
     void addConfigWidget(ProjectExplorer::KitConfigWidget *widget);
     void makeReadOnly();
 
+    Kit *workingCopy() const;
+    bool configures(ProjectExplorer::Kit *k) const;
+    void setIsDefaultKit(bool d);
+    bool isDefaultKit() const;
+    void removeKit();
+
+public slots:
+
+signals:
+    void dirty();
+
 private slots:
     void setIcon();
+    void setDisplayName();
+    void workingCopyWasUpdated(ProjectExplorer::Kit *k);
+    void kitWasUpdated(ProjectExplorer::Kit *k);
 
 private:
     enum LayoutColumns {
@@ -80,7 +97,9 @@ private:
     QLineEdit *m_nameEdit;
     QList<KitConfigWidget *> m_widgets;
     Kit *m_kit;
-    QString m_iconPath;
+    Kit *m_modifiedKit;
+    bool m_isDefaultKit;
+    bool m_fixingKit;
 };
 
 } // namespace Internal
diff --git a/src/plugins/projectexplorer/kitmodel.cpp b/src/plugins/projectexplorer/kitmodel.cpp
index adb9a1e3843c10021a63242c4e9f3cabdd948216..6f2f5bafe9d52a786d307d33d15bdc8d5bc0920f 100644
--- a/src/plugins/projectexplorer/kitmodel.cpp
+++ b/src/plugins/projectexplorer/kitmodel.cpp
@@ -45,11 +45,19 @@ namespace Internal {
 class KitNode
 {
 public:
-    explicit KitNode(KitNode *kn, Kit *k = 0, bool c = false) :
-        parent(kn), kit(k), changed(c)
+    KitNode(KitNode *kn) :
+        parent(kn), widget(0)
     {
         if (kn)
             kn->childNodes.append(this);
+    }
+
+    KitNode(KitNode *kn, Kit *k) :
+        parent(kn)
+    {
+        if (kn)
+            kn->childNodes.append(this);
+
         widget = KitManager::instance()->createConfigWidget(k);
         if (widget) {
             if (k && k->isAutoDetected())
@@ -62,6 +70,7 @@ public:
     {
         if (parent)
             parent->childNodes.removeOne(this);
+        delete widget;
 
         // deleting a child removes it from childNodes
         // so operate on a temporary list
@@ -72,9 +81,7 @@ public:
 
     KitNode *parent;
     QList<KitNode *> childNodes;
-    Kit *kit;
     KitManagerConfigWidget *widget;
-    bool changed;
 };
 
 // --------------------------------------------------------------------------
@@ -92,8 +99,6 @@ KitModel::KitModel(QBoxLayout *parentLayout, QObject *parent) :
             this, SLOT(addKit(ProjectExplorer::Kit*)));
     connect(KitManager::instance(), SIGNAL(kitRemoved(ProjectExplorer::Kit*)),
             this, SLOT(removeKit(ProjectExplorer::Kit*)));
-    connect(KitManager::instance(), SIGNAL(kitUpdated(ProjectExplorer::Kit*)),
-            this, SLOT(updateKit(ProjectExplorer::Kit*)));
     connect(KitManager::instance(), SIGNAL(defaultkitChanged()),
             this, SLOT(changeDefaultKit()));
 
@@ -162,10 +167,10 @@ QVariant KitModel::data(const QModelIndex &index, int role) const
         return tr("Auto-detected");
     if (node == m_manualRoot && role == Qt::DisplayRole)
         return tr("Manual");
-    if (node->kit) {
+    if (node->widget) {
         if (role == Qt::FontRole) {
             QFont f = QApplication::font();
-            if (node->changed)
+            if (node->widget->isDirty())
                 f.setBold(!f.bold());
             if (node == m_defaultNode)
                 f.setItalic(f.style() != QFont::StyleItalic);
@@ -177,9 +182,9 @@ QVariant KitModel::data(const QModelIndex &index, int role) const
                 baseName = tr("%1 (default)").arg(baseName);
             return baseName;
         } else if (role == Qt::DecorationRole) {
-            return node->kit->isValid() ? QIcon() : warningIcon;
+            return node->widget->isValid() ? QIcon() : warningIcon;
         } else if (role == Qt::ToolTipRole) {
-            return node->kit->toHtml();
+            return node->widget->validityMessage();
         }
     }
     return QVariant();
@@ -192,7 +197,7 @@ Qt::ItemFlags KitModel::flags(const QModelIndex &index) const
 
     KitNode *node = static_cast<KitNode *>(index.internalPointer());
     Q_ASSERT(node);
-    if (!node->kit)
+    if (!node->widget)
         return Qt::ItemIsEnabled;
 
     return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
@@ -212,12 +217,12 @@ Kit *KitModel::kit(const QModelIndex &index)
         return 0;
     KitNode *node = static_cast<KitNode *>(index.internalPointer());
     Q_ASSERT(node);
-    return node->kit;
+    return node->widget->workingCopy();
 }
 
 QModelIndex KitModel::indexOf(Kit *k) const
 {
-    KitNode *n = find(k);
+    KitNode *n = findWorkingCopy(k);
     return n ? index(n) : QModelIndex();
 }
 
@@ -227,7 +232,7 @@ void KitModel::setDefaultKit(const QModelIndex &index)
         return;
     KitNode *node = static_cast<KitNode *>(index.internalPointer());
     Q_ASSERT(node);
-    if (node->kit)
+    if (node->widget)
         setDefaultNode(node);
 }
 
@@ -236,7 +241,7 @@ bool KitModel::isDefaultKit(const QModelIndex &index)
     return m_defaultNode == static_cast<KitNode *>(index.internalPointer());
 }
 
-KitConfigWidget *KitModel::widget(const QModelIndex &index)
+KitManagerConfigWidget *KitModel::widget(const QModelIndex &index)
 {
     if (!index.isValid())
         return 0;
@@ -248,7 +253,7 @@ KitConfigWidget *KitModel::widget(const QModelIndex &index)
 bool KitModel::isDirty() const
 {
     foreach (KitNode *n, m_manualRoot->childNodes) {
-        if (n->changed)
+        if (n->widget->isDirty())
             return true;
     }
     return false;
@@ -256,18 +261,18 @@ bool KitModel::isDirty() const
 
 bool KitModel::isDirty(Kit *k) const
 {
-    KitNode *n = find(k);
-    return n ? !n->changed : false;
+    KitNode *n = findWorkingCopy(k);
+    return n ? n->widget->isDirty() : false;
 }
 
 void KitModel::setDirty()
 {
-    KitConfigWidget *w = qobject_cast<KitConfigWidget *>(sender());
-    foreach (KitNode *n, m_manualRoot->childNodes) {
-        if (n->widget == w) {
-            n->changed = n->widget->isDirty();
+    KitManagerConfigWidget *w = qobject_cast<KitManagerConfigWidget *>(sender());
+    QList<KitNode *> nodes = m_manualRoot->childNodes;
+    nodes << m_autoRoot->childNodes;
+    foreach (KitNode *n, nodes) {
+        if (n->widget == w)
             emit dataChanged(index(n, 0), index(n, columnCount(QModelIndex())));
-        }
     }
 }
 
@@ -277,61 +282,24 @@ void KitModel::apply()
     QList<KitNode *> nodes = m_toRemoveList;
     foreach (KitNode *n, nodes) {
         Q_ASSERT(!n->parent);
-        KitManager::instance()->deregisterKit(n->kit);
+        n->widget->removeKit();
     }
     Q_ASSERT(m_toRemoveList.isEmpty());
 
     // Update kits:
     foreach (KitNode *n, m_manualRoot->childNodes) {
         Q_ASSERT(n);
-        Q_ASSERT(n->kit);
-        if (n->changed) {
-            KitManager::instance()->blockSignals(true);
-            if (n->widget)
-                n->widget->apply();
-            n->changed = false;
-
-            KitManager::instance()->blockSignals(false);
-            KitManager::instance()->notifyAboutUpdate(n->kit);
+        Q_ASSERT(n->widget);
+        if (n->widget->isDirty()) {
+            n->widget->apply();
             emit dataChanged(index(n, 0), index(n, columnCount(QModelIndex())));
         }
     }
-
-    // Add new (and already updated) kits
-    QStringList removedSts;
-    nodes = m_toAddList;
-    foreach (KitNode *n, nodes) {
-        if (!KitManager::instance()->registerKit(n->kit))
-            removedSts << n->kit->displayName();
-    }
-
-    foreach (KitNode *n, m_toAddList)
-        markForRemoval(n->kit);
-
-    if (removedSts.count() == 1) {
-        QMessageBox::warning(0,
-                             tr("Duplicate Kit Detected"),
-                             tr("The kit<br>&nbsp;%1<br>"
-                                " was already configured. It was not configured again.")
-                             .arg(removedSts.at(0)));
-
-    } else if (!removedSts.isEmpty()) {
-        QMessageBox::warning(0,
-                             tr("Duplicate Kits Detected"),
-                             tr("The following kits were already configured:<br>"
-                                "&nbsp;%1<br>"
-                                "They were not configured again.")
-                             .arg(removedSts.join(QLatin1String(",<br>&nbsp;"))));
-    }
-
-    // Set default kit:
-    if (m_defaultNode)
-        KitManager::instance()->setDefaultKit(m_defaultNode->kit);
 }
 
 void KitModel::markForRemoval(Kit *k)
 {
-    KitNode *node = find(k);
+    KitNode *node = findWorkingCopy(k);
     if (!node)
         return;
 
@@ -347,29 +315,31 @@ void KitModel::markForRemoval(Kit *k)
     beginRemoveRows(index(m_manualRoot), m_manualRoot->childNodes.indexOf(node), m_manualRoot->childNodes.indexOf(node));
     m_manualRoot->childNodes.removeOne(node);
     node->parent = 0;
-    if (m_toAddList.contains(node)) {
-        delete node->kit;
-        node->kit = 0;
-        m_toAddList.removeOne(node);
+    if (node->widget->configures(0))
         delete node;
-    } else {
+    else
         m_toRemoveList.append(node);
-    }
     endRemoveRows();
 }
 
-void KitModel::markForAddition(Kit *k)
+Kit *KitModel::markForAddition(Kit *baseKit)
 {
     int pos = m_manualRoot->childNodes.size();
     beginInsertRows(index(m_manualRoot), pos, pos);
 
-    KitNode *node = createNode(m_manualRoot, k, true);
-    m_toAddList.append(node);
+    KitNode *node = createNode(m_manualRoot, 0);
+    if (baseKit) {
+        Kit *k = node->widget->workingCopy();
+        k->copyFrom(baseKit);
+        k->setDisplayName(tr("Clone of %1").arg(k->displayName()));
+    }
 
     if (!m_defaultNode)
         setDefaultNode(node);
 
     endInsertRows();
+
+    return node->widget->workingCopy();
 }
 
 QModelIndex KitModel::index(KitNode *node, int column) const
@@ -382,55 +352,47 @@ QModelIndex KitModel::index(KitNode *node, int column) const
         return index(node->parent->childNodes.indexOf(node), column, index(node->parent));
 }
 
-KitNode *KitModel::find(Kit *k) const
+KitNode *KitModel::findWorkingCopy(Kit *k) const
 {
     foreach (KitNode *n, m_autoRoot->childNodes) {
-        if (n->kit == k)
+        if (n->widget->workingCopy() == k)
             return n;
     }
     foreach (KitNode *n, m_manualRoot->childNodes) {
-        if (n->kit == k)
+        if (n->widget->workingCopy() == k)
             return n;
     }
     return 0;
 }
 
-KitNode *KitModel::createNode(KitNode *parent, Kit *k, bool changed)
+KitNode *KitModel::createNode(KitNode *parent, Kit *k)
 {
-    KitNode *node = new KitNode(parent, k, changed);
-    if (node->widget) {
-        node->widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-        m_parentLayout->addWidget(node->widget, 10);
-        connect(node->widget, SIGNAL(dirty()),
-                this, SLOT(setDirty()));
-    }
+    KitNode *node = new KitNode(parent, k);
+    node->widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    m_parentLayout->addWidget(node->widget, 10);
+    connect(node->widget, SIGNAL(dirty()), this, SLOT(setDirty()));
     return node;
 }
 
 void KitModel::setDefaultNode(KitNode *node)
 {
     if (m_defaultNode) {
-        QModelIndex idx = index(m_defaultNode);
-        if (idx.isValid())
-            emit dataChanged(idx, idx);
+        m_defaultNode->widget->setIsDefaultKit(false);
+        emit dataChanged(index(m_defaultNode), index(m_defaultNode));
     }
     m_defaultNode = node;
     if (m_defaultNode) {
-        QModelIndex idx = index(m_defaultNode);
-        if (idx.isValid())
-            emit dataChanged(idx, idx);
+        m_defaultNode->widget->setIsDefaultKit(true);
+        emit dataChanged(index(m_defaultNode), index(m_defaultNode));
     }
 }
 
 void KitModel::addKit(Kit *k)
 {
-    QList<KitNode *> nodes = m_toAddList;
-    foreach (KitNode *n, nodes) {
-        if (n->kit == k) {
-            m_toAddList.removeOne(n);
-            // do not delete n: Still used elsewhere!
+    foreach (KitNode *n, m_manualRoot->childNodes) {
+        // Was added by us
+        if (n->widget->configures(k))
             return;
-        }
     }
 
     KitNode *parent = m_manualRoot;
@@ -439,7 +401,7 @@ void KitModel::addKit(Kit *k)
     int row = parent->childNodes.count();
 
     beginInsertRows(index(parent), row, row);
-    createNode(parent, k, false);
+    createNode(parent, k);
     endInsertRows();
 
     emit kitStateChanged();
@@ -449,8 +411,10 @@ void KitModel::removeKit(Kit *k)
 {
     QList<KitNode *> nodes = m_toRemoveList;
     foreach (KitNode *n, nodes) {
-        if (n->kit == k) {
+        if (n->widget->configures(k)) {
             m_toRemoveList.removeOne(n);
+            if (m_defaultNode == n)
+                m_defaultNode = 0;
             delete n;
             return;
         }
@@ -462,7 +426,7 @@ void KitModel::removeKit(Kit *k)
     int row = 0;
     KitNode *node = 0;
     foreach (KitNode *current, parent->childNodes) {
-        if (current->kit == k) {
+        if (current->widget->configures(k)) {
             node = current;
             break;
         }
@@ -471,27 +435,25 @@ void KitModel::removeKit(Kit *k)
 
     beginRemoveRows(index(parent), row, row);
     parent->childNodes.removeAt(row);
-    delete node;
+    if (m_defaultNode == node)
+        m_defaultNode = 0;
     endRemoveRows();
+    delete node;
 
     emit kitStateChanged();
 }
 
-void KitModel::updateKit(Kit *k)
-{
-    KitNode *n = find(k);
-    // This can happen if Qt Versions and kits are removed simultaneously.
-    if (!n)
-        return;
-    if (n->widget)
-        n->widget->discard();
-    QModelIndex idx = index(n);
-    emit dataChanged(idx, idx);
-}
-
 void KitModel::changeDefaultKit()
 {
-    setDefaultNode(find(KitManager::instance()->defaultKit()));
+    Kit *defaultKit = KitManager::instance()->defaultKit();
+    QList<KitNode *> nodes = m_autoRoot->childNodes;
+    nodes << m_manualRoot->childNodes;
+    foreach (KitNode *n, nodes) {
+        if (n->widget->configures(defaultKit)) {
+            setDefaultNode(n);
+            break;
+        }
+    }
 }
 
 } // namespace Internal
diff --git a/src/plugins/projectexplorer/kitmodel.h b/src/plugins/projectexplorer/kitmodel.h
index 065a20047bbc5bcbedaaab9add2845d02b18c076..d0ebf3bfb15c545dcfa9c40e0a989b57504294b1 100644
--- a/src/plugins/projectexplorer/kitmodel.h
+++ b/src/plugins/projectexplorer/kitmodel.h
@@ -42,11 +42,11 @@ QT_END_NAMESPACE
 namespace ProjectExplorer {
 
 class Kit;
-class KitConfigWidget;
 class KitFactory;
 class KitManager;
 
 namespace Internal {
+class KitManagerConfigWidget;
 
 class KitNode;
 
@@ -77,7 +77,7 @@ public:
     void setDefaultKit(const QModelIndex &index);
     bool isDefaultKit(const QModelIndex &index);
 
-    KitConfigWidget *widget(const QModelIndex &);
+    ProjectExplorer::Internal::KitManagerConfigWidget *widget(const QModelIndex &);
 
     bool isDirty() const;
     bool isDirty(Kit *k) const;
@@ -85,7 +85,7 @@ public:
     void apply();
 
     void markForRemoval(Kit *k);
-    void markForAddition(Kit *k);
+    Kit *markForAddition(Kit *baseKit);
 
 signals:
     void kitStateChanged();
@@ -93,21 +93,19 @@ signals:
 private slots:
     void addKit(ProjectExplorer::Kit *k);
     void removeKit(ProjectExplorer::Kit *k);
-    void updateKit(ProjectExplorer::Kit *k);
     void changeDefaultKit();
     void setDirty();
 
 private:
     QModelIndex index(KitNode *, int column = 0) const;
-    KitNode *find(Kit *k) const;
-    KitNode *createNode(KitNode *parent, Kit *k, bool changed);
+    KitNode *findWorkingCopy(Kit *k) const;
+    KitNode *createNode(KitNode *parent, Kit *k);
     void setDefaultNode(KitNode *node);
 
     KitNode *m_root;
     KitNode *m_autoRoot;
     KitNode *m_manualRoot;
 
-    QList<KitNode *> m_toAddList;
     QList<KitNode *> m_toRemoveList;
 
     QBoxLayout *m_parentLayout;
diff --git a/src/plugins/projectexplorer/kitoptionspage.cpp b/src/plugins/projectexplorer/kitoptionspage.cpp
index 2e3c8b777e42d1b6440c8f6f7c3c1817cd85875f..71a0a4d61971c3b6a5e4f03532f1d3c0dca914db 100644
--- a/src/plugins/projectexplorer/kitoptionspage.cpp
+++ b/src/plugins/projectexplorer/kitoptionspage.cpp
@@ -32,7 +32,7 @@
 #include "kitmodel.h"
 #include "kit.h"
 #include "projectexplorerconstants.h"
-#include "kitconfigwidget.h"
+#include "kitmanagerconfigwidget.h"
 #include "kitmanager.h"
 
 #include <coreplugin/icore.h>
@@ -173,18 +173,18 @@ void KitOptionsPage::kitSelectionChanged()
     QModelIndex current = currentIndex();
     m_currentWidget = current.isValid() ? m_model->widget(current) : 0;
 
-    if (m_currentWidget)
+    if (m_currentWidget) {
         m_currentWidget->setVisible(true);
+        m_kitsView->scrollTo(current);
+    }
     updateState();
 }
 
 void KitOptionsPage::addNewKit()
 {
-    Kit *k = new Kit;
-    m_model->markForAddition(k);
+    Kit *k = m_model->markForAddition(0);
 
     QModelIndex newIdx = m_model->indexOf(k);
-    m_kitsView->scrollTo(newIdx);
     m_selectionModel->select(newIdx,
                              QItemSelectionModel::Clear
                              | QItemSelectionModel::SelectCurrent
@@ -197,10 +197,7 @@ void KitOptionsPage::cloneKit()
     if (!current)
         return;
 
-    Kit *k = current->clone();
-
-    m_model->markForAddition(k);
-
+    Kit *k = m_model->markForAddition(current);
     QModelIndex newIdx = m_model->indexOf(k);
     m_kitsView->scrollTo(newIdx);
     m_selectionModel->select(newIdx,
@@ -234,7 +231,7 @@ void KitOptionsPage::updateState()
     QModelIndex index = currentIndex();
     Kit *k = m_model->kit(index);
     if (k) {
-        canCopy = k->isValid();
+        canCopy = true;
         canDelete = !k->isAutoDetected();
         canMakeDefault = !m_model->isDefaultKit(index);
     }
diff --git a/src/plugins/qt4projectmanager/qmakekitconfigwidget.cpp b/src/plugins/qt4projectmanager/qmakekitconfigwidget.cpp
index eb177cda80a5d24476c2fcfb87f02c78cad776fe..d5546f90b1ac715e2b365fee794a84b73b35c5fb 100644
--- a/src/plugins/qt4projectmanager/qmakekitconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qmakekitconfigwidget.cpp
@@ -54,8 +54,8 @@ QmakeKitConfigWidget::QmakeKitConfigWidget(ProjectExplorer::Kit *k, QWidget *par
     m_lineEdit->setContentsMargins(0, 0, 0, 0);
     layout->addWidget(m_lineEdit);
 
-    discard(); // set up everything according to kit
-    connect(m_lineEdit, SIGNAL(textEdited(QString)), this, SIGNAL(dirty()));
+    refresh(); // set up everything according to kit
+    connect(m_lineEdit, SIGNAL(textEdited(QString)), this, SLOT(mkspecWasChanged(QString)));
 }
 
 QString QmakeKitConfigWidget::displayName() const
@@ -68,19 +68,14 @@ void QmakeKitConfigWidget::makeReadOnly()
     m_lineEdit->setEnabled(false);
 }
 
-void QmakeKitConfigWidget::apply()
-{
-    QmakeKitInformation::setMkspec(m_kit, Utils::FileName::fromString(m_lineEdit->text()));
-}
-
-void QmakeKitConfigWidget::discard()
+void QmakeKitConfigWidget::refresh()
 {
     m_lineEdit->setText(QmakeKitInformation::mkspec(m_kit).toString());
 }
 
-bool QmakeKitConfigWidget::isDirty() const
+void QmakeKitConfigWidget::mkspecWasChanged(const QString &text)
 {
-    return m_lineEdit->text() != QmakeKitInformation::mkspec(m_kit).toString();
+    QmakeKitInformation::setMkspec(m_kit, Utils::FileName::fromString(text));
 }
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qmakekitconfigwidget.h b/src/plugins/qt4projectmanager/qmakekitconfigwidget.h
index 727a3272be10c7c8a4b83b82743cff558564122e..0f2f9227e3897374bbfa0ec521824b0b9211f21d 100644
--- a/src/plugins/qt4projectmanager/qmakekitconfigwidget.h
+++ b/src/plugins/qt4projectmanager/qmakekitconfigwidget.h
@@ -52,9 +52,10 @@ public:
 
     void makeReadOnly();
 
-    void apply();
-    void discard();
-    bool isDirty() const;
+    void refresh();
+
+private slots:
+    void mkspecWasChanged(const QString &text);
 
 private:
     int findQtVersion(const int id) const;
diff --git a/src/plugins/qtsupport/qtkitconfigwidget.cpp b/src/plugins/qtsupport/qtkitconfigwidget.cpp
index 0d72c89813040ae031d8b021dfcb8c290e567b55..64b02115b7295b90d7c38d739e594388b3ef23c0 100644
--- a/src/plugins/qtsupport/qtkitconfigwidget.cpp
+++ b/src/plugins/qtsupport/qtkitconfigwidget.cpp
@@ -73,13 +73,11 @@ QtKitConfigWidget::QtKitConfigWidget(ProjectExplorer::Kit *k, QWidget *parent) :
         versionIds.append(v->uniqueId());
     versionsChanged(versionIds, QList<int>(), QList<int>());
 
-    discard();
-    connect(m_combo, SIGNAL(currentIndexChanged(int)), this, SIGNAL(dirty()));
+    refresh();
+    connect(m_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(currentWasChanged(int)));
 
     connect(mgr, SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
             this, SLOT(versionsChanged(QList<int>,QList<int>,QList<int>)));
-    connect(ProjectExplorer::KitManager::instance(), SIGNAL(kitUpdated(ProjectExplorer::Kit*)),
-            this, SLOT(kitUpdated(ProjectExplorer::Kit*)));
 
     connect(m_manageButton, SIGNAL(clicked()), this, SLOT(manageQtVersions()));
 }
@@ -94,23 +92,11 @@ void QtKitConfigWidget::makeReadOnly()
     m_combo->setEnabled(false);
 }
 
-void QtKitConfigWidget::apply()
-{
-    int id = m_combo->itemData(m_combo->currentIndex()).toInt();
-    QtKitInformation::setQtVersionId(m_kit, id);
-}
-
-void QtKitConfigWidget::discard()
+void QtKitConfigWidget::refresh()
 {
     m_combo->setCurrentIndex(findQtVersion(QtKitInformation::qtVersionId(m_kit)));
 }
 
-bool QtKitConfigWidget::isDirty() const
-{
-    int id = m_combo->itemData(m_combo->currentIndex()).toInt();
-    return id != QtKitInformation::qtVersionId(m_kit);
-}
-
 QWidget *QtKitConfigWidget::buttonWidget() const
 {
     return m_manageButton;
@@ -141,27 +127,17 @@ void QtKitConfigWidget::versionsChanged(const QList<int> &added, const QList<int
     }
 }
 
-void QtKitConfigWidget::kitUpdated(ProjectExplorer::Kit *k)
-{
-    if (k != m_kit)
-        return;
-
-    int id = QtKitInformation::qtVersionId(k);
-
-    for (int i = 0; i < m_combo->count(); ++i) {
-        if (m_combo->itemData(i).toInt() == id) {
-            m_combo->setCurrentIndex(i);
-            break;
-        }
-    }
-}
-
 void QtKitConfigWidget::manageQtVersions()
 {
     Core::ICore::showOptionsDialog(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY),
                                    QLatin1String(QtSupport::Constants::QTVERSION_SETTINGS_PAGE_ID));
 }
 
+void QtKitConfigWidget::currentWasChanged(int idx)
+{
+    QtKitInformation::setQtVersionId(m_kit, m_combo->itemData(idx).toInt());
+}
+
 int QtKitConfigWidget::findQtVersion(const int id) const
 {
     for (int i = 0; i < m_combo->count(); ++i) {
diff --git a/src/plugins/qtsupport/qtkitconfigwidget.h b/src/plugins/qtsupport/qtkitconfigwidget.h
index f0dd54e41cdecc6b756d306756f998a0680952c3..0ee01d683863cb9967cde38509733d9b436ef627 100644
--- a/src/plugins/qtsupport/qtkitconfigwidget.h
+++ b/src/plugins/qtsupport/qtkitconfigwidget.h
@@ -53,15 +53,13 @@ public:
 
     void makeReadOnly();
 
-    void apply();
-    void discard();
-    bool isDirty() const;
+    void refresh();
     QWidget *buttonWidget() const;
 
 private slots:
     void versionsChanged(const QList<int> &added, const QList<int> &removed, const QList<int> &changed);
-    void kitUpdated(ProjectExplorer::Kit *k);
     void manageQtVersions();
+    void currentWasChanged(int idx);
 
 private:
     int findQtVersion(const int id) const;