diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index fbcbc531ceb4c069f6d6d301beccc8b6e0163708..3cbadddf939216232b3ede9b94d89856381436a0 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -495,10 +495,7 @@ void Qt4Project::scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFile
 ProjectExplorer::ToolChain *Qt4Project::toolChain(BuildConfiguration *configuration) const
 {
     ToolChain::ToolChainType tct = toolChainType(configuration);
-    foreach(ToolChain *tc, qtVersion(configuration)->toolChains())
-        if (tc->type() == tct)
-            return tc;
-    return 0;
+    return qtVersion(configuration)->toolChain(tct);
 }
 
 QString Qt4Project::makeCommand(BuildConfiguration *configuration) const
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 51298b69f70c9f43a08dc3578cf0b836a6ef848e..38639719eb07ef0555f2c181ed30215f679ad071 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -484,7 +484,7 @@ QtVersion::QtVersion()
 
 QtVersion::~QtVersion()
 {
-    qDeleteAll(m_toolChains);
+
 }
 
 QString QtVersion::name() const
@@ -1062,16 +1062,24 @@ QString QtVersion::linguistCommand() const
     return m_linguistCommand;
 }
 
-QList<ProjectExplorer::ToolChain *> QtVersion::toolChains() const
+QList<QSharedPointer<ProjectExplorer::ToolChain> > QtVersion::toolChains() const
 {
     updateToolChain();
     return m_toolChains;
 }
 
+ProjectExplorer::ToolChain *QtVersion::toolChain(ProjectExplorer::ToolChain::ToolChainType type) const
+{
+    foreach(QSharedPointer<ProjectExplorer::ToolChain> tcptr, toolChains())
+        if (tcptr->type() == type)
+            return tcptr.data();
+    return 0;
+}
+
 QList<ProjectExplorer::ToolChain::ToolChainType> QtVersion::possibleToolChainTypes() const
 {
     QList<ProjectExplorer::ToolChain::ToolChainType> types;
-    foreach(ProjectExplorer::ToolChain *tc, toolChains())
+    foreach(QSharedPointer<ProjectExplorer::ToolChain> tc, toolChains())
         types << tc->type();
     return types;
 }
@@ -1090,7 +1098,7 @@ void QtVersion::updateToolChain() const
     if (m_toolChainUpToDate)
         return;
 
-    qDeleteAll(m_toolChains);
+    m_toolChains.clear();
 
     QString mkspecPath = versionInfo().value("QMAKE_MKSPECS");
     if (mkspecPath.isEmpty())
@@ -1109,32 +1117,41 @@ void QtVersion::updateToolChain() const
     QString qt_arch = reader->value("QT_ARCH");
     if (!ce_sdk.isEmpty() && !ce_arch.isEmpty()) {
         QString wincePlatformName = ce_sdk + " (" + ce_arch + ")";
-        m_toolChains << ProjectExplorer::ToolChain::createWinCEToolChain(msvcVersion(), wincePlatformName);
+        m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
+                ProjectExplorer::ToolChain::createWinCEToolChain(msvcVersion(), wincePlatformName));
     } else if (makefileGenerator == "SYMBIAN_ABLD") {
 #ifdef QTCREATOR_WITH_S60
-        m_toolChains << S60Manager::instance()->createGCCEToolChain(this);
-        m_toolChains << S60Manager::instance()->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV5);
-        m_toolChains << S60Manager::instance()->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV6);
-        m_toolChains << S60Manager::instance()->createWINSCWToolChain(this);
+        m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
+                S60Manager::instance()->createGCCEToolChain(this));
+        m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
+                S60Manager::instance()->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV5));
+        m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
+                S60Manager::instance()->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV6));
+        m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
+                S60Manager::instance()->createWINSCWToolChain(this));
 #endif
     } else if (qt_arch == "arm") {
 #ifdef QTCREATOR_WITH_MAEMO
-        m_toolChains << MaemoManager::instance()->maemoToolChain(this);
+        m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
+                MaemoManager::instance()->maemoToolChain(this));
 
         ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
         //addToEnvironment(env);
         qmakeCXX = env.searchInPath(qmakeCXX);
-        m_toolChains << ProjectExplorer::ToolChain::createGccToolChain(qmakeCXX);
+        m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
+                ProjectExplorer::ToolChain::createGccToolChain(qmakeCXX));
 #endif
     } else if (qmakeCXX == "cl" || qmakeCXX == "icl") {
         // TODO proper support for intel cl
-        m_toolChains << ProjectExplorer::ToolChain::createMSVCToolChain(msvcVersion(), isQt64Bit());
+        m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
+                ProjectExplorer::ToolChain::createMSVCToolChain(msvcVersion(), isQt64Bit()));
     } else if (qmakeCXX == "g++" && makefileGenerator == "MINGW") {
         ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
         //addToEnvironment(env);
         env.prependOrSetPath(mingwDirectory() + "/bin");
         qmakeCXX = env.searchInPath(qmakeCXX);
-        m_toolChains << ProjectExplorer::ToolChain::createMinGWToolChain(qmakeCXX, mingwDirectory());
+        m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
+                ProjectExplorer::ToolChain::createMinGWToolChain(qmakeCXX, mingwDirectory()));
     } else if (qmakeCXX == "g++" || qmakeCXX == "icc") {
         ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
         //addToEnvironment(env);
@@ -1144,7 +1161,8 @@ void QtVersion::updateToolChain() const
             // Unfortunately, we need a valid QMAKE_CXX to configure the parser.
             qmakeCXX = QLatin1String("cc");
         }
-        m_toolChains << ProjectExplorer::ToolChain::createGccToolChain(qmakeCXX);
+        m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
+                ProjectExplorer::ToolChain::createGccToolChain(qmakeCXX));
     }
 
     if (m_toolChains.isEmpty()) {
@@ -1310,8 +1328,8 @@ QString QtVersion::buildDebuggingHelperLibrary()
     addToEnvironment(env);
 
     // TODO: the debugging helper doesn't comply to actual tool chain yet
-    QList<ProjectExplorer::ToolChain *> alltc = toolChains();
-    ProjectExplorer::ToolChain *tc = alltc.isEmpty() ? 0 : alltc.first();
+    QList<QSharedPointer<ProjectExplorer::ToolChain> > alltc = toolChains();
+    ProjectExplorer::ToolChain *tc = alltc.isEmpty() ? 0 : alltc.first().data();
     tc->addToEnvironment(env);
     QString output;
     QString directory = DebuggingHelperLibrary::copyDebuggingHelperLibrary(qtInstallData, &output);
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h
index 93680f7ddcc8fcd7089caf6e1cd54d0601ab3b76..3b8b81fb04dc46390a7c2c65059664121543f28d 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.h
+++ b/src/plugins/qt4projectmanager/qtversionmanager.h
@@ -76,7 +76,7 @@ public:
 
     QList<ProjectExplorer::ToolChain::ToolChainType> possibleToolChainTypes() const;
     ProjectExplorer::ToolChain::ToolChainType defaultToolchainType() const;
-    QList<ProjectExplorer::ToolChain *> toolChains() const;
+    ProjectExplorer::ToolChain *toolChain(ProjectExplorer::ToolChain::ToolChainType type) const;
 
     /// @returns the name of the mkspec, which is generally not enough
     /// to pass to qmake.
@@ -131,6 +131,7 @@ public:
 
     QmakeBuildConfig defaultBuildConfig() const;
 private:
+    QList<QSharedPointer<ProjectExplorer::ToolChain> > toolChains() const;
     static int getUniqueId();
     // Also used by QtOptionsPageWidget
     void updateSourcePath();
@@ -155,7 +156,7 @@ private:
     mutable QString m_mkspecFullPath;
 
     mutable bool m_toolChainUpToDate;
-    mutable QList<ProjectExplorer::ToolChain *> m_toolChains;
+    mutable QList<QSharedPointer<ProjectExplorer::ToolChain> > m_toolChains;
 
     mutable bool m_versionInfoUpToDate;
     mutable QHash<QString,QString> m_versionInfo; // updated lazily