diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp
index 64ca6f1d78a7cf9623cd02f173a1f7e103984690..402fae1b24f102bf1751d5f81042252ddedd721e 100644
--- a/src/plugins/projectexplorer/buildconfiguration.cpp
+++ b/src/plugins/projectexplorer/buildconfiguration.cpp
@@ -56,9 +56,9 @@ IBuildStepFactory *findRestoreFactory(BuildConfiguration *parent, const QVariant
 }
 
 const char * const BUILD_STEPS_COUNT_KEY("ProjectExplorer.BuildConfiguration.BuildStepsCount");
-const char * const BUILD_STEPS_PREFIX("ProjectExplorer.BuildConfiguration.BuildSteps.");
+const char * const BUILD_STEPS_PREFIX("ProjectExplorer.BuildConfiguration.BuildStep.");
 const char * const CLEAN_STEPS_COUNT_KEY("ProjectExplorer.BuildConfiguration.CleanStepsCount");
-const char * const CLEAN_STEPS_PREFIX("ProjectExplorer.BuildConfiguration.CleanSteps.");
+const char * const CLEAN_STEPS_PREFIX("ProjectExplorer.BuildConfiguration.CleanStep.");
 
 } // namespace
 
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index afc2eba0b1e906e44ef55c9b2a9c5fe9f8df552a..c743173088d58780f57dccb94b71059714692514 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -29,13 +29,13 @@
 
 #include "project.h"
 
-#include "persistentsettings.h"
 #include "buildconfiguration.h"
 #include "environment.h"
 #include "projectnodes.h"
 #include "buildstep.h"
 #include "projectexplorer.h"
 #include "runconfiguration.h"
+#include "userfileaccessor.h"
 #include "editorconfiguration.h"
 
 #include <coreplugin/ifile.h>
@@ -49,8 +49,6 @@ using namespace ProjectExplorer;
 using namespace ProjectExplorer::Internal;
 
 namespace {
-const char * const PROJECT_FILE_POSTFIX(".user");
-
 const char * const ACTIVE_BC_KEY("ProjectExplorer.Project.ActiveBuildConfiguration");
 const char * const BC_KEY_PREFIX("ProjectExplorer.Project.BuildConfiguration.");
 const char * const BC_COUNT_KEY("ProjectExplorer.Project.BuildConfigurationCount");
@@ -148,21 +146,14 @@ bool Project::hasBuildSettings() const
 
 void Project::saveSettings()
 {
-    PersistentSettingsWriter writer;
-    QVariantMap map(toMap());
-    for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i)
-        writer.saveValue(i.key(), i.value());
-
-    writer.save(file()->fileName() + QLatin1String(PROJECT_FILE_POSTFIX), "QtCreatorProject");
+    UserFileAccessor accessor;
+    accessor.saveSettings(this, toMap());
 }
 
 bool Project::restoreSettings()
 {
-    PersistentSettingsReader reader;
-    reader.load(file()->fileName() + QLatin1String(PROJECT_FILE_POSTFIX));
-
-    QVariantMap map(reader.restoreValues());
-
+    UserFileAccessor accessor;
+    QVariantMap map(accessor.restoreSettings(this));
     return fromMap(map);
 }
 
diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro
index 0902b597f5b7c10024212807b703ecf713deb680..febeae644b44b5a66b778a37c3a4eb63e9faffee 100644
--- a/src/plugins/projectexplorer/projectexplorer.pro
+++ b/src/plugins/projectexplorer/projectexplorer.pro
@@ -58,6 +58,7 @@ HEADERS += projectexplorer.h \
     projectmodels.h \
     currentprojectfind.h \
     toolchain.h \
+    userfileaccessor.h \
     cesdkhandler.h \
     gccparser.h \
     msvcparser.h \
@@ -116,6 +117,7 @@ SOURCES += projectexplorer.cpp \
     currentprojectfind.cpp \
     toolchain.cpp \
     cesdkhandler.cpp \
+    userfileaccessor.cpp \
     gccparser.cpp \
     msvcparser.cpp \
     filewatcher.cpp \
diff --git a/src/plugins/projectexplorer/userfileaccessor.cpp b/src/plugins/projectexplorer/userfileaccessor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..37fa6804179d32ad0881e8d04a7026564757fe92
--- /dev/null
+++ b/src/plugins/projectexplorer/userfileaccessor.cpp
@@ -0,0 +1,626 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "userfileaccessor.h"
+
+#include "buildconfiguration.h"
+#include "persistentsettings.h"
+#include "project.h"
+#include "toolchain.h"
+
+#include <coreplugin/ifile.h>
+#include <utils/qtcassert.h>
+
+#include <QtCore/QFile>
+
+using namespace ProjectExplorer;
+
+namespace {
+const char * const USER_FILE_VERSION("ProjectExplorer.Project.Updater.FileVersion");
+const char * const PROJECT_FILE_POSTFIX(".user");
+
+// Version 0 is used in Qt Creator 1.3.x and
+// (in a slighly differnt flavour) 1.4 pre-alpha releases.
+
+class Version0Handler : public UserFileVersionHandler
+{
+public:
+    Version0Handler();
+    ~Version0Handler();
+
+    int userFileVersion() const
+    {
+        return 0;
+    }
+
+    QString displayUserFileVersion() const
+    {
+        return QLatin1String("1.3");
+    }
+
+    QVariantMap update(Project *project, const QVariantMap &map);
+
+private:
+    QVariantMap convertBuildConfigurations(Project *project, const QVariantMap &map);
+    QVariantMap convertRunConfigurations(Project *project, const QVariantMap &map);
+    QVariantMap convertBuildSteps(Project *project, const QVariantMap &map);
+};
+
+} // namespace
+
+// -------------------------------------------------------------------------
+// UserFileVersionHandler
+// -------------------------------------------------------------------------
+
+UserFileVersionHandler::UserFileVersionHandler()
+{
+}
+
+UserFileVersionHandler::~UserFileVersionHandler()
+{
+}
+
+// -------------------------------------------------------------------------
+// UserFileAccessor
+// -------------------------------------------------------------------------
+
+UserFileAccessor::UserFileAccessor() :
+    m_firstVersion(-1),
+    m_lastVersion(-1)
+{
+    addVersionHandler(new Version0Handler);
+}
+
+UserFileAccessor::~UserFileAccessor()
+{
+    qDeleteAll(m_handlers);
+}
+
+QVariantMap UserFileAccessor::restoreSettings(Project *project)
+{
+    if (m_lastVersion < 0 || !project)
+        return QVariantMap();
+
+    PersistentSettingsReader reader;
+    QString fileName = project->file()->fileName() + QLatin1String(PROJECT_FILE_POSTFIX);
+    reader.load(fileName);
+
+    QVariantMap map(reader.restoreValues());
+
+    // Get and verify file version:
+    const int fileVersion(map.value(QLatin1String(USER_FILE_VERSION), 0).toInt());
+    if (fileVersion < m_firstVersion || fileVersion > m_lastVersion + 1) {
+        qWarning() << "File version" << fileVersion << "is not supported.";
+        return QVariantMap();
+    }
+
+    // Copy user file before changing it:
+    if (fileVersion != m_lastVersion + 1)
+        QFile::copy(fileName, fileName + '.' + m_handlers.value(fileVersion)->displayUserFileVersion());
+
+    // Update:
+    for (int i = fileVersion; i <= m_lastVersion; ++i)
+        map = m_handlers.value(i)->update(project, map);
+
+    return map;
+}
+
+bool UserFileAccessor::saveSettings(Project *project, const QVariantMap &map)
+{
+    if (!project || map.isEmpty())
+        return false;
+
+    PersistentSettingsWriter writer;
+
+    for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i)
+        writer.saveValue(i.key(), i.value());
+
+    writer.saveValue(QLatin1String(USER_FILE_VERSION), m_lastVersion + 1);
+
+    return writer.save(project->file()->fileName() + QLatin1String(PROJECT_FILE_POSTFIX), "QtCreatorProject");
+}
+
+void UserFileAccessor::addVersionHandler(UserFileVersionHandler *handler)
+{
+    const int version(handler->userFileVersion());
+    QTC_ASSERT(handler, return);
+    QTC_ASSERT(version >= 0, return);
+    QTC_ASSERT(!m_handlers.contains(version), return);
+    QTC_ASSERT(m_handlers.isEmpty() ||
+               (version == m_lastVersion + 1 || version == m_firstVersion - 1), return);
+
+    if (m_handlers.isEmpty()) {
+        m_firstVersion = version;
+        m_lastVersion = version;
+    } else {
+        if (version < m_firstVersion)
+            m_firstVersion = version;
+        if (version > m_lastVersion)
+            m_lastVersion = version;
+    }
+
+    m_handlers.insert(version, handler);
+
+    // Postconditions:
+    Q_ASSERT(m_lastVersion >= 0);
+    Q_ASSERT(m_firstVersion >= 0);
+    Q_ASSERT(m_lastVersion >= m_firstVersion);
+    Q_ASSERT(m_handlers.count() == m_lastVersion - m_firstVersion + 1);
+    for (int i = m_firstVersion; i < m_lastVersion; ++i)
+        Q_ASSERT(m_handlers.contains(i));
+}
+
+
+// -------------------------------------------------------------------------
+// Version0Handler
+// -------------------------------------------------------------------------
+
+Version0Handler::Version0Handler()
+{
+}
+
+Version0Handler::~Version0Handler()
+{
+}
+
+QVariantMap Version0Handler::convertBuildConfigurations(Project *project, const QVariantMap &map)
+{
+    Q_ASSERT(project);
+    QVariantMap result;
+
+    // Find a valid Id to use:
+    QString id;
+    if (project->id() == QLatin1String("GenericProjectManager.GenericProject"))
+        id = QLatin1String("GenericProjectManager.GenericBuildConfiguration");
+    else if (project->id() == QLatin1String("CMakeProjectManager.CMakeProject"))
+        id = QLatin1String("CMakeProjectManager.CMakeBuildConfiguration");
+    else if (project->id() == QLatin1String("Qt4ProjectManager.Qt4Project"))
+        id = QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration");
+    else
+        return QVariantMap(); // QmlProjects do not(/no longer) have BuildConfigurations,
+                              // or we do not know how to handle this.
+    result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), id);
+
+    for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i) {
+        if (i.key() == QLatin1String("ProjectExplorer.BuildConfiguration.DisplayName")) {
+            result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName"),
+                         i.value());
+            continue;
+        }
+
+        if (id == QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration") ||
+            id.startsWith(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration."))) {
+            // Qt4BuildConfiguration:
+            if (i.key() == QLatin1String("QtVersionId")) {
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId"),
+                              i.value().toInt());
+            } else if (i.key() == QLatin1String("ToolChain")) {
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.ToolChain"),
+                              i.value());
+            } else if (i.key() == QLatin1String("buildConfiguration")) {
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration"),
+                              i.value());
+            } else if (i.key() == QLatin1String("userEnvironmentChanges")) {
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.UserEnvironmentChanges"),
+                              i.value());
+            } else if (i.key() == QLatin1String("useShadowBuild")) {
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild"),
+                              i.value());
+            } else if (i.key() == QLatin1String("clearSystemEnvironment")) {
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.ClearSystemEnvironment"),
+                              i.value());
+            } else if (i.key() == QLatin1String("buildDirectory")) {
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory"),
+                              i.value());
+            } else {
+                qWarning() << "Unknown Qt4BuildConfiguration Key found:" << i.key() << i.value();
+            }
+            continue;
+        } else if (id == QLatin1String("CMakeProjectManager.CMakeBuildConfiguration")) {
+            if (i.key() == QLatin1String("userEnvironmentChanges")) {
+                result.insert(QLatin1String("CMakeProjectManager.CMakeBuildConfiguration.UserEnvironmentChanges"),
+                              i.value());
+            } else if (i.key() == QLatin1String("msvcVersion")) {
+                result.insert(QLatin1String("CMakeProjectManager.CMakeBuildConfiguration.MsvcVersion"),
+                              i.value());
+            } else if (i.key() == QLatin1String("buildDirectory")) {
+                result.insert(QLatin1String("CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory"),
+                              i.value());
+            } else {
+                qWarning() << "Unknown CMakeBuildConfiguration Key found:" << i.key() << i.value();
+            }
+            continue;
+        } else if (id == QLatin1String("GenericProjectManager.GenericBuildConfiguration")) {
+            if (i.key() == QLatin1String("buildDirectory")) {
+                result.insert(QLatin1String("GenericProjectManager.GenericBuildConfiguration.BuildDirectory"),
+                              i.value());
+            } else {
+                qWarning() << "Unknown GenericBuildConfiguration Key found:" << i.key() << i.value();
+            }
+            continue;
+        }
+        qWarning() << "Unknown BuildConfiguration Key found:" << i.key() << i.value();
+        qWarning() << "BuildConfiguration Id is:" << id;
+    }
+
+    return result;
+}
+
+QVariantMap Version0Handler::convertRunConfigurations(Project *project, const QVariantMap &map)
+{
+    Q_UNUSED(project);
+    QVariantMap result;
+    QString id;
+
+    // Convert Id:
+    id = map.value(QLatin1String("Id")).toString();
+    if (id.isEmpty())
+        id = map.value(QLatin1String("type")).toString();
+    if (id.isEmpty())
+        return QVariantMap();
+
+    if (QLatin1String("Qt4ProjectManager.DeviceRunConfiguration") == id)
+        id = QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration");
+    if (QLatin1String("Qt4ProjectManager.EmulatorRunConfiguration") == id)
+        id = QLatin1String("Qt4ProjectManager.S60EmulatorRunConfiguration");
+    // no need to change the CMakeRunConfiguration, CustomExecutableRunConfiguration,
+    //                       MaemoRunConfiguration or Qt4RunConfiguration
+
+    result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), id);
+
+    // Convert everything else:
+    for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i) {
+        if (i.key() == QLatin1String("Id") || i.key() == QLatin1String("type"))
+            continue;
+        if (i.key() == QLatin1String("RunConfiguration.name")) {
+            result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName"),
+                         i.value());
+        } else if (QLatin1String("CMakeProjectManager.CMakeRunConfiguration") == id) {
+            if (i.key() == QLatin1String("CMakeRunConfiguration.Target"))
+                result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.Target"), i.value());
+            else if (i.key() == QLatin1String("CMakeRunConfiguration.WorkingDirectory"))
+                result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.WorkingDirectory"), i.value());
+            else if (i.key() == QLatin1String("CMakeRunConfiguration.UserWorkingDirectory"))
+                result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"), i.value());
+            else if (i.key() == QLatin1String("CMakeRunConfiguration.UseTerminal"))
+                result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.UseTerminal"), i.value());
+            else if (i.key() == QLatin1String("CMakeRunConfiguation.Title"))
+                result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguation.Title"), i.value());
+            else if (i.key() == QLatin1String("CMakeRunConfiguration.Arguments"))
+                result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.Arguments"), i.value());
+            else if (i.key() == QLatin1String("CMakeRunConfiguration.UserEnvironmentChanges"))
+                result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.UserEnvironmentChanges"), i.value());
+            else if (i.key() == QLatin1String("BaseEnvironmentBase"))
+                result.insert(QLatin1String("CMakeProjectManager.BaseEnvironmentBase"), i.value());
+            else
+                qWarning() << "Unknown CMakeRunConfiguration key found:" << i.key() << i.value();
+        } else if (QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration") == id) {
+            if (i.key() == QLatin1String("ProFile"))
+                result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.ProFile"), i.value());
+            else if (i.key() == QLatin1String("SigningMode"))
+                result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.SigningMode"), i.value());
+            else if (i.key() == QLatin1String("CustomSignaturePath"))
+                result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.CustomSignaturePath"), i.value());
+            else if (i.key() == QLatin1String("CustomKeyPath"))
+                result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.CustomKeyPath"), i.value());
+            else if (i.key() == QLatin1String("SerialPortName"))
+                result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.SerialPortName"), i.value());
+            else if (i.key() == QLatin1String("CommunicationType"))
+                result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.CommunicationType"), i.value());
+            else if (i.key() == QLatin1String("CommandLineArguments"))
+                result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.CommandLineArguments"), i.value());
+            else
+                qWarning() << "Unknown S60DeviceRunConfiguration key found:" << i.key() << i.value();
+        } else if (QLatin1String("Qt4ProjectManager.S60EmulatorRunConfiguration") == id) {
+            if (i.key() == QLatin1String("ProFile"))
+                result.insert(QLatin1String("Qt4ProjectManager.S60EmulatorRunConfiguration.ProFile"), i.value());
+            else
+                qWarning() << "Unknown S60EmulatorRunConfiguration key found:" << i.key() << i.value();
+        } else if (QLatin1String("Qt4ProjectManager.Qt4RunConfiguration") == id) {
+            if (i.key() == QLatin1String("ProFile"))
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.ProFile"), i.value());
+            else if (i.key() == QLatin1String("CommandLineArguments"))
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"), i.value());
+            else if (i.key() == QLatin1String("UserSetName"))
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UserSetName"), i.value());
+            else if (i.key() == QLatin1String("UseTerminal"))
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UseTerminal"), i.value());
+            else if (i.key() == QLatin1String("UseDyldImageSuffix"))
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix"), i.value());
+            else if (i.key() == QLatin1String("UserEnvironmentChanges"))
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UserEnvironmentChanges"), i.value());
+            else if (i.key() == QLatin1String("BaseEnvironmentBase"))
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase"), i.value());
+            else if (i.key() == QLatin1String("UserSetWorkingDirectory"))
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UserSetWorkingDirectory"), i.value());
+            else if (i.key() == QLatin1String("UserWorkingDirectory"))
+                result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"), i.value());
+            else
+                qWarning() << "Unknown Qt4RunConfiguration key found:" << i.key() << i.value();
+        } else if (QLatin1String("Qt4ProjectManager.MaemoRunConfiguration") == id) {
+            if (i.key() == QLatin1String("ProFile"))
+                result.insert(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.ProFile"), i.value());
+            else if (i.key() == QLatin1String("Arguments"))
+                result.insert(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.Arguments"), i.value());
+            else if (i.key() == QLatin1String("Simulator"))
+                result.insert(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.Simulator"), i.value());
+            else if (i.key() == QLatin1String("DeviceId"))
+                result.insert(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.DeviceId"), i.value());
+            else if (i.key() == QLatin1String("LastDeployed"))
+                result.insert(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.LastDeployed"), i.value());
+            else if (i.key() == QLatin1String("DebuggingHelpersLastDeployed"))
+                result.insert(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.DebuggingHelpersLastDeployed"), i.value());
+            else
+                qWarning() << "Unknown MaemoRunConfiguration key found:" << i.key() << i.value();
+        } else if (QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration") == id) {
+            if (i.key() == QLatin1String("Executable"))
+                result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.Executable"), i.value());
+            else if (i.key() == QLatin1String("Arguments"))
+                result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.Arguments"), i.value());
+            else if (i.key() == QLatin1String("WorkingDirectory"))
+                result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory"), i.value());
+            else if (i.key() == QLatin1String("UseTerminal"))
+                result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal"), i.value());
+            else if (i.key() == QLatin1String("UserSetName"))
+                result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.UserSetName"), i.value());
+            else if (i.key() == QLatin1String("UserName"))
+                result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.UserName"), i.value());
+            else if (i.key() == QLatin1String("UserEnvironmentChanges"))
+                result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.UserEnvironmentChanges"), i.value());
+            else if (i.key() == QLatin1String("BaseEnvironmentBase"))
+                result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.BaseEnvironmentBase"), i.value());
+            else
+                qWarning() << "Unknown CustomExecutableRunConfiguration key found:" << i.key() << i.value();
+        } else {
+            result.insert(i.key(), i.value());
+        }
+    }
+
+    return result;
+}
+
+QVariantMap Version0Handler::convertBuildSteps(Project *project, const QVariantMap &map)
+{
+    Q_UNUSED(project);
+    QVariantMap result;
+
+    QString id(map.value(QLatin1String("Id")).toString());
+    if (QLatin1String("GenericProjectManager.MakeStep") == id)
+        id = QLatin1String("GenericProjectManager.GenericMakeStep");
+    if (QLatin1String("projectexplorer.processstep") == id)
+        id = QLatin1String("ProjectExplorer.ProcessStep");
+    if (QLatin1String("trolltech.qt4projectmanager.make") == id)
+        id = QLatin1String("Qt4ProjectManager.MakeStep");
+    if (QLatin1String("trolltech.qt4projectmanager.qmake") == id)
+        id = QLatin1String("QtProjectManager.QMakeBuildStep");
+    // No need to change the CMake MakeStep.
+    result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), id);
+
+    for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i) {
+        if (i.key() == QLatin1String("Id"))
+            continue;
+        if (i.key() == QLatin1String("ProjectExplorer.BuildConfiguration.DisplayName")) {
+            // skip this: Not needed.
+            continue;
+        }
+
+        if (QLatin1String("GenericProjectManager.GenericMakeStep") == id) {
+            if (i.key() == QLatin1String("buildTargets"))
+                result.insert(QLatin1String("GenericProjectManager.GenericMakeStep.BuildTargets"), i.value());
+            else if (i.key() == QLatin1String("makeArguments"))
+                result.insert(QLatin1String("GenericProjectManager.GenericMakeStep.MakeArguments"), i.value());
+            else if (i.key() == QLatin1String("makeCommand"))
+                result.insert(QLatin1String("GenericProjectManager.GenericMakeStep.MakeCommand"), i.value());
+            else
+                qWarning() << "Unknown GenericMakeStep value found:" << i.key() << i.value();
+            continue;
+        } else if (QLatin1String("ProjectExplorer.ProcessStep") == id) {
+            if (i.key() == QLatin1String("ProjectExplorer.ProcessStep.DisplayName"))
+                result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName"), i.value());
+            else if (i.key() == QLatin1String("abstractProcess.command"))
+                result.insert(QLatin1String("ProjectExplorer.ProcessStep.Command"), i.value());
+            else if ((i.key() == QLatin1String("abstractProcess.workingDirectory") ||
+                      i.key() == QLatin1String("workingDirectory")) &&
+                     !i.value().toString().isEmpty())
+                    result.insert(QLatin1String("ProjectExplorer.ProcessStep.WorkingDirectory"), i.value());
+            else if (i.key() == QLatin1String("abstractProcess.arguments"))
+                result.insert(QLatin1String("ProjectExplorer.ProcessStep.Arguments"), i.value());
+            else if (i.key() == QLatin1String("abstractProcess.enabled"))
+                result.insert(QLatin1String("ProjectExplorer.ProcessStep.Enabled"), i.value());
+            else
+                qWarning() << "Unknown ProcessStep value found:" << i.key() << i.value();
+        } else if (QLatin1String("Qt4ProjectManager.MakeStep") == id) {
+            if (i.key() == QLatin1String("makeargs"))
+                result.insert(QLatin1String("Qt4ProjectManager.MakeStep.MakeArguments"), i.value());
+            else if (i.key() == QLatin1String("makeCmd"))
+                result.insert(QLatin1String("Qt4ProjectManager.MakeStep.MakeCommand"), i.value());
+            else if (i.key() == QLatin1String("clean"))
+                result.insert(QLatin1String("Qt4ProjectManager.MakeStep.Clean"), i.value());
+            else
+                qWarning() << "Unknown Qt4MakeStep value found:" << i.key() << i.value();
+        } else if (QLatin1String("QtProjectManager.QMakeBuildStep") == id) {
+            if (i.key() == QLatin1String("qmakeArgs"))
+                result.insert(QLatin1String("QtProjectManager.QMakeBuildStep.QMakeArguments"), i.value());
+            else
+                qWarning() << "Unknown Qt4QMakeStep value found:" << i.key() << i.value();
+        } else if (QLatin1String("CMakeProjectManager.MakeStep") == id) {
+            if (i.key() == QLatin1String("buildTargets"))
+                result.insert(QLatin1String("CMakeProjectManager.MakeStep.BuildTargets"), i.value());
+            else if (i.key() == QLatin1String("additionalArguments"))
+                result.insert(QLatin1String("CMakeProjectManager.MakeStep.AdditionalArguments"), i.value());
+            else if (i.key() == QLatin1String("clean"))
+                result.insert(QLatin1String("CMakeProjectManager.MakeStep.Clean"), i.value());
+            else
+                qWarning() << "Unknown CMakeMakeStep value found:" << i.key() << i.value();
+        } else {
+            result.insert(i.key(), i.value());
+        }
+    }
+    return result;
+}
+
+QVariantMap Version0Handler::update(Project *project, const QVariantMap &map)
+{
+    QVariantMap result;
+
+    // "project": section is unused, just ignore it.
+
+    // "buildconfigurations" and "buildConfiguration-":
+    QStringList bcs(map.value(QLatin1String("buildconfigurations")).toStringList());
+    QString active(map.value(QLatin1String("activebuildconfiguration")).toString());
+
+    int count(0);
+    foreach (const QString &bc, bcs) {
+        // convert buildconfiguration:
+        QString oldBcKey(QString::fromLatin1("buildConfiguration-") + bc);
+        if (bc == active)
+            result.insert(QLatin1String("ProjectExplorer.Project.ActiveBuildConfiguration"), count);
+
+        QVariantMap tmp(map.value(oldBcKey).toMap());
+        QVariantMap bcMap(convertBuildConfigurations(project, tmp));
+        if (bcMap.isEmpty())
+            continue;
+
+        // buildsteps
+        QStringList buildSteps(map.value(oldBcKey + QLatin1String("-buildsteps")).toStringList());
+        if (buildSteps.isEmpty())
+            buildSteps = map.value("buildsteps").toStringList();
+
+        int pos(0);
+        foreach (const QString &bs, buildSteps) {
+            // Watch out: Capitalization differs from oldBcKey!
+            const QString localKey(QLatin1String("buildconfiguration-") + bc + QString::fromLatin1("-buildstep") + QString::number(pos));
+            const QString globalKey(QString::fromLatin1("buildstep") + QString::number(pos));
+
+            QVariantMap local(map.value(localKey).toMap());
+            QVariantMap global(map.value(globalKey).toMap());
+
+            for (QVariantMap::const_iterator i = global.constBegin(); i != global.constEnd(); ++i) {
+                if (!local.contains(i.key()))
+                    local.insert(i.key(), i.value());
+                if (i.key() == QLatin1String("ProjectExplorer.BuildConfiguration.DisplayName") &&
+                    local.value(i.key()).toString().isEmpty())
+                    local.insert(i.key(), i.value());
+            }
+            local.insert(QLatin1String("Id"), bs);
+
+            bcMap.insert(QString::fromLatin1("ProjectExplorer.BuildConfiguration.BuildStep.") + QString::number(pos),
+                         convertBuildSteps(project, local));
+            ++pos;
+        }
+        bcMap.insert(QLatin1String("ProjectExplorer.BuildConfiguration.BuildStepsCount"), pos);
+
+        // cleansteps
+        QStringList cleanSteps(map.value(oldBcKey + QLatin1String("-cleansteps")).toStringList());
+        if (cleanSteps.isEmpty())
+            cleanSteps = map.value("cleansteps").toStringList();
+
+        pos = 0;
+        foreach (const QString &bs, cleanSteps) {
+            // Watch out: Capitalization differs from oldBcKey!
+            const QString localKey(QLatin1String("buildconfiguration-") + bc + QString::fromLatin1("-cleanstep") + QString::number(pos));
+            const QString globalKey(QString::fromLatin1("cleanstep") + QString::number(pos));
+
+            QVariantMap local(map.value(localKey).toMap());
+            QVariantMap global(map.value(globalKey).toMap());
+
+            for (QVariantMap::const_iterator i = global.constBegin(); i != global.constEnd(); ++i) {
+                if (!local.contains(i.key()))
+                    local.insert(i.key(), i.value());
+                if (i.key() == QLatin1String("ProjectExplorer.BuildConfiguration.DisplayName") &&
+                    local.value(i.key()).toString().isEmpty())
+                    local.insert(i.key(), i.value());
+            }
+            local.insert(QLatin1String("Id"), bs);
+            bcMap.insert(QString::fromLatin1("ProjectExplorer.BuildConfiguration.CleanStep.") + QString::number(pos),
+                         convertBuildSteps(project, local));
+            ++pos;
+        }
+        bcMap.insert(QLatin1String("ProjectExplorer.BuildConfiguration.CleanStepsCount"), pos);
+
+        // Merge into result set:
+        result.insert(QString::fromLatin1("ProjectExplorer.Project.BuildConfiguration.") + QString::number(count), bcMap);
+        ++count;
+    }
+    result.insert(QLatin1String("ProjectExplorer.Project.BuildConfigurationCount"), count);
+
+    // "RunConfiguration*":
+    active = map.value(QLatin1String("activeRunConfiguration")).toString();
+    count = 0;
+    forever {
+        QString prefix(QLatin1String("RunConfiguration") + QString::number(count) + '-');
+        QVariantMap rcMap;
+        for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i) {
+            if (!i.key().startsWith(prefix))
+                continue;
+            QString newKey(i.key().mid(prefix.size()));
+            rcMap.insert(newKey, i.value());
+        }
+        if (rcMap.isEmpty()) {
+            result.insert(QLatin1String("ProjectExplorer.Project.RunConfigurationCount"), count);
+            break;
+        }
+
+        result.insert(QString::fromLatin1("ProjectExplorer.Project.RunConfiguration.") + QString::number(count),
+                      convertRunConfigurations(project, rcMap));
+        ++count;
+    }
+
+    // "defaultFileEncoding" (EditorSettings):
+    QVariant codecVariant(map.value(QLatin1String("defaultFileEncoding")));
+    if (codecVariant.isValid()) {
+        QByteArray codec(codecVariant.toByteArray());
+        QVariantMap editorSettingsMap;
+        editorSettingsMap.insert(QLatin1String("EditorConfiguration.Codec"), codec);
+        result.insert(QLatin1String("ProjectExplorer.Project.EditorSettings"),
+                      editorSettingsMap);
+    }
+
+    QVariant toolchain(map.value("toolChain"));
+    if (toolchain.isValid()) {
+        bool ok;
+        int type(toolchain.toInt(&ok));
+        if (!ok) {
+            QString toolChainName(toolchain.toString());
+            if (toolChainName == QLatin1String("gcc"))
+                type = ToolChain::GCC;
+            else if (toolChainName == QLatin1String("mingw"))
+                type = ToolChain::MinGW;
+            else if (toolChainName == QLatin1String("msvc"))
+                type = ToolChain::MSVC;
+            else if (toolChainName == QLatin1String("wince"))
+                type = ToolChain::WINCE;
+        }
+        result.insert(QLatin1String("GenericProjectManager.GenericProject.Toolchain"), type);
+    }
+    // File version information:
+    result.insert(QLatin1String(USER_FILE_VERSION), 1);
+
+    return result;
+}
diff --git a/src/plugins/projectexplorer/userfileaccessor.h b/src/plugins/projectexplorer/userfileaccessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..85aa68b6da9e56f29f15b233f0b234e6664c2855
--- /dev/null
+++ b/src/plugins/projectexplorer/userfileaccessor.h
@@ -0,0 +1,75 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef PROJECTMANAGER_USERFILEACCESSOR_H
+#define PROJECTMANAGER_USERFILEACCESSOR_H
+
+#include <QtCore/QVariantMap>
+
+namespace ProjectExplorer {
+
+class Project;
+
+class UserFileVersionHandler
+{
+public:
+    UserFileVersionHandler();
+    virtual ~UserFileVersionHandler();
+
+    // The user file version this handler accepts for input.
+    virtual int userFileVersion() const = 0;
+    virtual QString displayUserFileVersion() const = 0;
+    // Update from userFileVersion() to userFileVersion() + 1
+    virtual QVariantMap update(Project *project, const QVariantMap &map) = 0;
+};
+
+class UserFileAccessor
+{
+public:
+    UserFileAccessor();
+    ~UserFileAccessor();
+    QVariantMap restoreSettings(Project * project);
+    bool saveSettings(Project * project, const QVariantMap &map);
+
+    int latestUserFileVersion() const;
+
+    QString mapIdTo(const QString &id, int version);
+
+private:
+    // Takes ownership of the handler!
+    void addVersionHandler(UserFileVersionHandler *handler);
+
+    QMap<int, UserFileVersionHandler *> m_handlers;
+    int m_firstVersion;
+    int m_lastVersion;
+};
+
+} // namespace ProjectExplorer
+
+#endif // PROJECTMANAGER_USERFILEACCESSOR_H
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
index 2745dda31e4261ca917e5327e6ebf96e7de9ee63..001cdd2b6dd8829499d342ae09a4be0feb86c03a 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
@@ -733,12 +733,10 @@ void MaemoRunConfigurationFactory::removedRunConfiguration(ProjectExplorer::RunC
 void MaemoRunConfigurationFactory::projectAdded(
     ProjectExplorer::Project *project)
 {
-    connect(project, SIGNAL(addedRunConfiguration(ProjectExplorer::Project*,
-                                                  QString)),
-            this, SLOT(addedRunConfiguration(ProjectExplorer::Project*)));
-    connect(project, SIGNAL(removedRunConfiguration(ProjectExplorer::Project*,
-                                                    QString)),
-            this, SLOT(removedRunConfiguration(ProjectExplorer::Project*)));
+    connect(project, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration*)),
+            this, SLOT(addedRunConfiguration(ProjectExplorer::RunConfiguration*)));
+    connect(project, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration*)),
+            this, SLOT(removedRunConfiguration(ProjectExplorer::RunConfiguration*)));
 
     if (hasMaemoRunConfig(project))
         MaemoManager::instance()->addQemuSimulatorStarter(project);
@@ -747,12 +745,10 @@ void MaemoRunConfigurationFactory::projectAdded(
 void MaemoRunConfigurationFactory::projectRemoved(
     ProjectExplorer::Project *project)
 {
-    disconnect(project, SIGNAL(addedRunConfiguration(ProjectExplorer::Project*,
-                                                  QString)),
-               this, SLOT(addedRunConfiguration(ProjectExplorer::Project*)));
-    disconnect(project, SIGNAL(removedRunConfiguration(ProjectExplorer::Project*,
-                                                    QString)),
-               this, SLOT(removedRunConfiguration(ProjectExplorer::Project*)));
+    disconnect(project, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration*)),
+               this, SLOT(addedRunConfiguration(ProjectExplorer::RunConfiguration*)));
+    disconnect(project, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration*)),
+               this, SLOT(removedRunConfiguration(ProjectExplorer::RunConfiguration*)));
 
     if (hasMaemoRunConfig(project))
         MaemoManager::instance()->removeQemuSimulatorStarter(project);