diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 8f9656cfee609f7b7ec1b105128a7ead12b7ce1a..5ade6b51904a0da30ed948dcb8813ba422f93d09 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1128,6 +1128,7 @@ void ProjectExplorerPlugin::extensionsInitialized()
     if (dm->find(Core::Id(Constants::DESKTOP_DEVICE_ID)).isNull())
         DeviceManager::instance()->addDevice(IDevice::Ptr(new DesktopDevice));
     dm->load();
+    d->m_toolChainManager->restoreToolChains();
 }
 
 void ProjectExplorerPlugin::loadCustomWizards()
diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp
index f8db099b3dd9d2fa42bc7bb9548fb54409dbad76..e24bef00e8d8183e531c430c2f330b4f8bf2135c 100644
--- a/src/plugins/projectexplorer/toolchainmanager.cpp
+++ b/src/plugins/projectexplorer/toolchainmanager.cpp
@@ -80,13 +80,10 @@ public:
     ToolChainManagerPrivate(ToolChainManager *parent);
     ~ToolChainManagerPrivate();
 
-    QList<ToolChain *> &toolChains();
-
     ToolChainManager *q;
     QMap<QString, Utils::FileName> m_abiToDebugger;
     Utils::PersistentSettingsWriter *m_writer;
 
-private:
     QList<ToolChain *> m_toolChains;
 };
 
@@ -101,13 +98,6 @@ ToolChainManagerPrivate::~ToolChainManagerPrivate()
     delete m_writer;
 }
 
-QList<ToolChain *> &ToolChainManagerPrivate::toolChains()
-{
-    if (!m_writer)
-        q->restoreToolChains();
-    return m_toolChains;
-}
-
 } // namespace Internal
 
 // --------------------------------------------------------------------------
@@ -139,7 +129,6 @@ ToolChainManager::ToolChainManager(QObject *parent) :
 void ToolChainManager::restoreToolChains()
 {
     QTC_ASSERT(!d->m_writer, return);
-    QTC_CHECK(ProjectExplorerPlugin::instance()->pluginSpec()->state() == ExtensionSystem::PluginSpec::Running);
     d->m_writer =
             new Utils::PersistentSettingsWriter(settingsFileName(QLatin1String(TOOLCHAIN_FILENAME)), QLatin1String("QtCreatorToolChains"));
 
@@ -209,6 +198,8 @@ void ToolChainManager::restoreToolChains()
     // Store manual tool chains
     foreach (ToolChain *tc, tcsToRegister)
         registerToolChain(tc);
+
+    emit toolChainsLoaded();
 }
 
 ToolChainManager::~ToolChainManager()
@@ -223,7 +214,7 @@ void ToolChainManager::saveToolChains()
     data.insert(QLatin1String(TOOLCHAIN_FILE_VERSION_KEY), 1);
 
     int count = 0;
-    foreach (ToolChain *tc, d->toolChains()) {
+    foreach (ToolChain *tc, d->m_toolChains) {
         if (tc->isValid()) {
             QVariantMap tmp = tc->toMap();
             if (tmp.isEmpty())
@@ -290,18 +281,19 @@ QList<ToolChain *> ToolChainManager::restoreToolChains(const Utils::FileName &fi
                      qPrintable(ToolChainFactory::idFromMap(tcMap)),
                      qPrintable(fileName.toUserOutput()));
     }
+
     return result;
 }
 
 QList<ToolChain *> ToolChainManager::toolChains() const
 {
-    return d->toolChains();
+    return d->m_toolChains;
 }
 
 QList<ToolChain *> ToolChainManager::findToolChains(const Abi &abi) const
 {
     QList<ToolChain *> result;
-    foreach (ToolChain *tc, toolChains()) {
+    foreach (ToolChain *tc, d->m_toolChains) {
         Abi targetAbi = tc->targetAbi();
         if (targetAbi.isCompatibleWith(abi))
             result.append(tc);
@@ -314,7 +306,7 @@ ToolChain *ToolChainManager::findToolChain(const QString &id) const
     if (id.isEmpty())
         return 0;
 
-    foreach (ToolChain *tc, d->toolChains()) {
+    foreach (ToolChain *tc, d->m_toolChains) {
         if (tc->id() == id)
             return tc;
     }
@@ -326,32 +318,39 @@ Utils::FileName ToolChainManager::defaultDebugger(const Abi &abi) const
     return d->m_abiToDebugger.value(abi.toString());
 }
 
+bool ToolChainManager::isLoaded() const
+{
+    return d->m_writer;
+}
+
 void ToolChainManager::notifyAboutUpdate(ProjectExplorer::ToolChain *tc)
 {
-    if (!tc || !toolChains().contains(tc))
+    if (!tc || !d->m_toolChains.contains(tc))
         return;
     emit toolChainUpdated(tc);
 }
 
 bool ToolChainManager::registerToolChain(ToolChain *tc)
 {
-    if (!tc || d->toolChains().contains(tc))
+    QTC_ASSERT(d->m_writer, return false);
+
+    if (!tc || d->m_toolChains.contains(tc))
         return true;
-    foreach (ToolChain *current, d->toolChains()) {
+    foreach (ToolChain *current, d->m_toolChains) {
         if (*tc == *current && !tc->isAutoDetected())
             return false;
     }
 
-    d->toolChains().append(tc);
+    d->m_toolChains.append(tc);
     emit toolChainAdded(tc);
     return true;
 }
 
 void ToolChainManager::deregisterToolChain(ToolChain *tc)
 {
-    if (!tc || !d->toolChains().contains(tc))
+    if (!tc || !d->m_toolChains.contains(tc))
         return;
-    d->toolChains().removeOne(tc);
+    d->m_toolChains.removeOne(tc);
     emit toolChainRemoved(tc);
     delete tc;
 }
diff --git a/src/plugins/projectexplorer/toolchainmanager.h b/src/plugins/projectexplorer/toolchainmanager.h
index f16df41b746fa1f5d9a6374e268b0d93b7a098b3..58a656c325cfe3e0bd996df0e2293dee0abfde30 100644
--- a/src/plugins/projectexplorer/toolchainmanager.h
+++ b/src/plugins/projectexplorer/toolchainmanager.h
@@ -66,6 +66,8 @@ public:
 
     Utils::FileName defaultDebugger(const Abi &abi) const;
 
+    bool isLoaded() const;
+
 public slots:
     bool registerToolChain(ProjectExplorer::ToolChain *tc);
     void deregisterToolChain(ProjectExplorer::ToolChain *tc);
@@ -81,6 +83,8 @@ signals:
     // Something changed:
     void toolChainsChanged();
 
+    void toolChainsLoaded();
+
 private:
     explicit ToolChainManager(QObject *parent = 0);