diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp
index 39da3103b6fea9e42db298fb3e1b15ac39c9dff5..3424b81ebb45318ecfe75db6d961900c33c0215b 100644
--- a/src/plugins/qt4projectmanager/makestep.cpp
+++ b/src/plugins/qt4projectmanager/makestep.cpp
@@ -101,7 +101,7 @@ bool MakeStep::init(const QString &name)
     // FIXME doing this without the user having a way to override this is rather bad
     // so we only do it for unix and if the user didn't override the make command
     // but for now this is the least invasive change
-    ProjectExplorer::ToolChain::ToolChainType t =  qobject_cast<Qt4Project *>(project())->qtVersion(name)->toolchainType();
+    ProjectExplorer::ToolChain::ToolChainType t = qobject_cast<Qt4Project *>(project())->toolChain(name)->type();
     if (t != ProjectExplorer::ToolChain::MSVC && t != ProjectExplorer::ToolChain::WINCE) {
         if (value(name, "makeCmd").toString().isEmpty())
             args << "-w";
@@ -110,7 +110,7 @@ bool MakeStep::init(const QString &name)
     setEnabled(name, !skipMakeClean);
     setArguments(name, args);
 
-    ProjectExplorer::ToolChain::ToolChainType type = qobject_cast<Qt4Project *>(project())->qtVersion(name)->toolchainType();
+    ProjectExplorer::ToolChain::ToolChainType type = qobject_cast<Qt4Project *>(project())->toolChain(name)->type();
     if ( type == ProjectExplorer::ToolChain::MSVC || type == ProjectExplorer::ToolChain::WINCE)
         setBuildParser(ProjectExplorer::Constants::BUILD_PARSER_MSVC);
     else
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt b/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt
index a2e92143aa10320fdfe0c79edec242064e5c57bc..afccc350c589ae290c8f23361f323598a321815a 100644
--- a/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt
+++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt
@@ -6,7 +6,12 @@
     * support the different tool chains
     * gui for overriding the default make target if necessary,
       make arguments --> make options
-    * more general "debug / release" configuration to be used in toolchain
+    * more general "debug / release" configuration to be used in toolchain???
+    * tool chain instance should move to qt4project again, qt version defines
+      the possible tool chains, and possibly the tool chain creation, but not
+      the currently used one; we can probably get rid of the project parameter
+      of ToolChain::defaultMakeTarget then as well
+    * build parser should be defined/created by toolchain, not make step
 
 * WINSCW tool chain:
     * predefined macros
@@ -17,3 +22,4 @@
     * system includes
 
 * Run WINSCW executables
+* Deploy gcce executables
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index cae6dd13e5827fc02890cf4856677bf97a87708b..e583d3ab6374e8ab1d60deb69c75626178b08761 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -375,14 +375,19 @@ void Qt4Project::scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFile
     m_proFilesForCodeModelUpdate.append(pro);
 }
 
+ProjectExplorer::ToolChain *Qt4Project::toolChain(const QString &buildConfiguration) const
+{
+    return qtVersion(buildConfiguration)->toolChain(qtVersion(buildConfiguration)->defaultToolchainType());
+}
+
 QString Qt4Project::makeCommand(const QString &buildConfiguration) const
 {
-    return qtVersion(buildConfiguration)->toolChain()->makeCommand();
+    return toolChain(buildConfiguration)->makeCommand();
 }
 
 QString Qt4Project::defaultMakeTarget(const QString &buildConfiguration) const
 {
-    return qtVersion(buildConfiguration)->toolChain()->defaultMakeTarget(this);
+    return toolChain(buildConfiguration)->defaultMakeTarget(this);
 }
 
 void Qt4Project::updateCodeModel()
@@ -401,7 +406,7 @@ void Qt4Project::updateCodeModel()
     QStringList predefinedFrameworkPaths;
     QByteArray predefinedMacros;
 
-    ToolChain *tc = qtVersion(activeBuildConfiguration())->toolChain();
+    ToolChain *tc = toolChain(activeBuildConfiguration());
     QList<HeaderPath> allHeaderPaths;
     if (tc) {
         predefinedMacros = tc->predefinedMacros();
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index aa933a849bc8e737dcc9463769f1b946bb0e4f1d..2b5765412d83854447e819d667ae7979ea6e26fb 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -162,6 +162,7 @@ public:
     //returns the name of the qt version, might be QString::Null, which means default qt version
     // qtVersion is in general the better method to use
     QString qtVersionName(const QString &buildConfiguration) const;
+    ProjectExplorer::ToolChain *toolChain(const QString &buildConfiguration) const;
 
     ProjectExplorer::BuildStepConfigWidget *createConfigWidget();
     QList<ProjectExplorer::BuildStepConfigWidget*> subConfigWidgets();
diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
index 876929a85f250fb4a5826537b2a1d98901bd0da9..4e3eda3ca883c02bd7178eba9e62400482c14b20 100644
--- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
@@ -638,7 +638,7 @@ Qt4RunConfiguration::BaseEnvironmentBase Qt4RunConfiguration::baseEnvironmentBas
 ProjectExplorer::ToolChain::ToolChainType Qt4RunConfiguration::toolChainType() const
 {
     Qt4Project *pro = qobject_cast<Qt4Project *>(project());
-    return pro->qtVersion(pro->activeBuildConfiguration())->toolchainType();
+    return pro->toolChainType(pro->activeBuildConfiguration());
 }
 
 ///
diff --git a/src/plugins/qt4projectmanager/qtoptionspage.cpp b/src/plugins/qt4projectmanager/qtoptionspage.cpp
index 06c2eb585d33eda41bf7ce6d1ff06814cad7af99..fa43af9d89510fe6a2272ce02ba8f372fcd13099 100644
--- a/src/plugins/qt4projectmanager/qtoptionspage.cpp
+++ b/src/plugins/qt4projectmanager/qtoptionspage.cpp
@@ -301,7 +301,7 @@ void QtOptionsPageWidget::showEnvironmentPage(QTreeWidgetItem *item)
             return;
         }
         m_ui->errorLabel->setText("");
-        ProjectExplorer::ToolChain::ToolChainType t = m_versions.at(index)->toolchainType();
+        ProjectExplorer::ToolChain::ToolChainType t = m_versions.at(index)->defaultToolchainType();
         if (t == ProjectExplorer::ToolChain::MinGW) {
             makeMSVCVisible(false);
             makeMingwVisible(true);
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 98bcd663821b09625dc85fbba581869cb9e826be..dd2b687f421c9d0810e2db857c43fad7a6f5d7ac 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -885,33 +885,33 @@ void QtVersion::updateQMakeCXX() const
     m_qmakeCXXUpToDate = true;
 }
 
-ProjectExplorer::ToolChain *QtVersion::toolChain() const
+ProjectExplorer::ToolChain *QtVersion::toolChain(ProjectExplorer::ToolChain::ToolChainType type) const
 {
-    updateToolChain();
+    updateToolChain(type);
     return m_toolChain.data();
 }
 
-void QtVersion::updateToolChain() const
+void QtVersion::updateToolChain(ProjectExplorer::ToolChain::ToolChainType type) const
 {
-    if (m_toolChainUpToDate)
+    if (m_toolChainUpToDate && m_toolChain
+            && m_toolChain.data() && m_toolChain->type() == type)
         return;
-    ProjectExplorer::ToolChain *m_test= 0;
-    ProjectExplorer::ToolChain::ToolChainType t = toolchainType();
-    if (t == ProjectExplorer::ToolChain::MinGW) {
+    ProjectExplorer::ToolChain *tempToolchain= 0;
+    if (type == ProjectExplorer::ToolChain::MinGW) {
         QString qmake_cxx = qmakeCXX();
         ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
         //addToEnvironment(env);
         env.prependOrSetPath(mingwDirectory()+"/bin");
         qmake_cxx = env.searchInPath(qmake_cxx);
-        m_test = ProjectExplorer::ToolChain::createMinGWToolChain(qmake_cxx, mingwDirectory());
+        tempToolchain = ProjectExplorer::ToolChain::createMinGWToolChain(qmake_cxx, mingwDirectory());
         //qDebug()<<"Mingw ToolChain";
-    } else if(t == ProjectExplorer::ToolChain::MSVC) {
-        m_test = ProjectExplorer::ToolChain::createMSVCToolChain(msvcVersion(), isMSVC64Bit());
+    } else if(type == ProjectExplorer::ToolChain::MSVC) {
+        tempToolchain = ProjectExplorer::ToolChain::createMSVCToolChain(msvcVersion(), isMSVC64Bit());
         //qDebug()<<"MSVC ToolChain ("<<version->msvcVersion()<<")";
-    } else if(t == ProjectExplorer::ToolChain::WINCE) {
-        m_test = ProjectExplorer::ToolChain::createWinCEToolChain(msvcVersion(), wincePlatform());
+    } else if(type == ProjectExplorer::ToolChain::WINCE) {
+        tempToolchain = ProjectExplorer::ToolChain::createWinCEToolChain(msvcVersion(), wincePlatform());
         //qDebug()<<"WinCE ToolChain ("<<version->msvcVersion()<<","<<version->wincePlatform()<<")";
-    } else if(t == ProjectExplorer::ToolChain::GCC || t == ProjectExplorer::ToolChain::LinuxICC) {
+    } else if(type == ProjectExplorer::ToolChain::GCC || type == ProjectExplorer::ToolChain::LinuxICC) {
         QString qmake_cxx = qmakeCXX();
         ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
         //addToEnvironment(env);
@@ -921,21 +921,23 @@ void QtVersion::updateToolChain() const
             // Unfortunately, we need a valid QMAKE_CXX to configure the parser.
             qmake_cxx = QLatin1String("cc");
         }
-        m_test = ProjectExplorer::ToolChain::createGccToolChain(qmake_cxx);
+        tempToolchain = ProjectExplorer::ToolChain::createGccToolChain(qmake_cxx);
         //qDebug()<<"GCC ToolChain ("<<qmake_cxx<<")";
 #ifdef QTCREATOR_WITH_S60
-    } else if (t == ProjectExplorer::ToolChain::WINSCW) {
-        m_test = S60Manager::instance()->createGCCEToolChain(this);
+    } else if (type == ProjectExplorer::ToolChain::WINSCW) {
+        tempToolchain = S60Manager::instance()->createWINSCWToolChain(this);
+    } else if (type == ProjectExplorer::ToolChain::GCCE) {
+        tempToolchain = S60Manager::instance()->createGCCEToolChain(this);
 #endif
     } else {
-        qDebug()<<"Could not detect ToolChain for"<<mkspec();
+        qDebug()<<"Could not create ToolChain for"<<mkspec();
         qDebug()<<"Qt Creator doesn't know about the system includes, nor the systems defines.";
     }
 
-    if (ProjectExplorer::ToolChain::equals(m_test, m_toolChain.data())) {
-        delete m_test;
+    if (ProjectExplorer::ToolChain::equals(tempToolchain, m_toolChain.data())) {
+        delete tempToolchain;
     } else {
-        m_toolChain =  QSharedPointer<ProjectExplorer::ToolChain>(m_test);
+        m_toolChain =  QSharedPointer<ProjectExplorer::ToolChain>(tempToolchain);
     }
 
     m_toolChainUpToDate = true;
@@ -1005,26 +1007,34 @@ QString QtVersion::linguistCommand() const
     return m_linguistCommand;
 }
 
-ProjectExplorer::ToolChain::ToolChainType QtVersion::toolchainType() const
+QList<ProjectExplorer::ToolChain::ToolChainType> QtVersion::possibleToolChainTypes() const
 {
+    QList<ProjectExplorer::ToolChain::ToolChainType> toolChains;
     if (!isValid())
-        return ProjectExplorer::ToolChain::INVALID;
+        return toolChains << ProjectExplorer::ToolChain::INVALID;
     const QString &spec = mkspec();
-//    qDebug()<<"spec="<<spec;
     if (spec.contains("win32-msvc") || spec.contains(QLatin1String("win32-icc")))
-        return ProjectExplorer::ToolChain::MSVC;
+        toolChains << ProjectExplorer::ToolChain::MSVC;
     else if (spec.contains("win32-g++"))
-        return ProjectExplorer::ToolChain::MinGW;
+        toolChains << ProjectExplorer::ToolChain::MinGW;
     else if (spec == QString::null)
-        return ProjectExplorer::ToolChain::INVALID;
+        toolChains << ProjectExplorer::ToolChain::INVALID;
     else if (spec.contains("wince"))
-        return ProjectExplorer::ToolChain::WINCE;
+        toolChains << ProjectExplorer::ToolChain::WINCE;
     else if (spec.contains("linux-icc"))
-        return ProjectExplorer::ToolChain::LinuxICC;
-    else if (spec.contains("abld"))
-        return ProjectExplorer::ToolChain::WINSCW;
+        toolChains << ProjectExplorer::ToolChain::LinuxICC;
+#ifdef QTCREATOR_WITH_S60
+    else if (spec.contains("symbian-abld"))
+        toolChains << ProjectExplorer::ToolChain::GCCE << ProjectExplorer::ToolChain::WINSCW;
+#endif
     else
-        return ProjectExplorer::ToolChain::GCC;
+        toolChains << ProjectExplorer::ToolChain::GCC;
+    return toolChains;
+}
+
+ProjectExplorer::ToolChain::ToolChainType QtVersion::defaultToolchainType() const
+{
+    return possibleToolChainTypes().at(0);
 }
 
 #ifdef QTCREATOR_WITH_S60
@@ -1076,7 +1086,7 @@ void QtVersion::addToEnvironment(ProjectExplorer::Environment &env) const
     // add libdir, includedir and bindir
     // or add Mingw dirs
     // or do nothing on other
-    ProjectExplorer::ToolChain *tc = toolChain();
+    ProjectExplorer::ToolChain *tc = toolChain(defaultToolchainType());
     if (tc)
         tc->addToEnvironment(env);
 }
@@ -1185,7 +1195,7 @@ QString QtVersion::buildDebuggingHelperLibrary()
     ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
     addToEnvironment(env);
 
-    ProjectExplorer::ToolChain *tc = toolChain();
+    ProjectExplorer::ToolChain *tc = toolChain(defaultToolchainType());
     QString directory = DebuggingHelperLibrary::copyDebuggingHelperLibrary(qtInstallData, path());
     QString output = DebuggingHelperLibrary::buildDebuggingHelperLibrary(directory, tc->makeCommand(), qmakeCommand(), mkspec(), env);
     m_hasDebuggingHelper = !debuggingHelperLibrary().isEmpty();
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h
index 217a763e4a970b457b9875936b69b5b1e94c1054..14b3c5028b8385ca500ff201f34f1b13be991681 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.h
+++ b/src/plugins/qt4projectmanager/qtversionmanager.h
@@ -65,14 +65,16 @@ public:
     QString name() const;
     QString path() const;
     QString sourcePath() const;
-    QString mkspec() const;
     QString mkspecPath() const;
     QString qmakeCommand() const;
     QString uicCommand() const;
     QString designerCommand() const;
     QString linguistCommand() const;
-    QString qmakeCXX() const;
-    ProjectExplorer::ToolChain *toolChain() const;
+
+    QList<ProjectExplorer::ToolChain::ToolChainType> possibleToolChainTypes() const;
+    QString mkspec() const;
+    ProjectExplorer::ToolChain::ToolChainType defaultToolchainType() const;
+    ProjectExplorer::ToolChain *toolChain(ProjectExplorer::ToolChain::ToolChainType type) const;
 
     void setName(const QString &name);
     void setPath(const QString &path);
@@ -81,8 +83,6 @@ public:
     // Returns the PREFIX, BINPREFIX, DOCPREFIX and similar information
     QHash<QString,QString> versionInfo() const;
 
-    ProjectExplorer::ToolChain::ToolChainType toolchainType() const;
-
 #ifdef QTCREATOR_WITH_S60
     QString mwcDirectory() const;
     void setMwcDirectory(const QString &directory);
@@ -128,7 +128,8 @@ private:
     void updateMkSpec() const;
     void updateVersionInfo() const;
     void updateQMakeCXX() const;
-    void updateToolChain() const;
+    void updateToolChain(ProjectExplorer::ToolChain::ToolChainType type) const;
+    QString qmakeCXX() const;
     QString findQtBinary(const QStringList &possibleName) const;
     QString m_name;
     QString m_path;