diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp
index 4dd60110a31c52df62c9bf4a8b282244d05d5df7..9fde0218e41044cc0454066cd610cd59ae877b6c 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp
@@ -38,11 +38,14 @@
 
 #include <QtCore/QSettings>
 
+#include <algorithm>
+
 namespace Qt4ProjectManager {
 namespace Internal {
 
 namespace {
     const QLatin1String SettingsGroup("MaemoDeviceConfigs");
+    const QLatin1String IdCounterKey("IdCounter");
     const QLatin1String ConfigListKey("ConfigList");
     const QLatin1String NameKey("Name");
     const QLatin1String TypeKey("Type");
@@ -51,10 +54,27 @@ namespace {
     const QLatin1String UserNameKey("Uname");
     const QLatin1String PasswordKey("Password");
     const QLatin1String TimeoutKey("Timeout");
+    const QLatin1String InternalIdKey("InternalId");
+};
+
+class DevConfIdMatcher
+{
+public:
+    DevConfIdMatcher(quint64 id) : m_id(id) {}
+    bool operator()(const MaemoDeviceConfigurations::DeviceConfig &devConfig)
+    {
+        return devConfig.internalId == m_id;
+    }
+private:
+    const quint64 m_id;
 };
 
 MaemoDeviceConfigurations::DeviceConfig::DeviceConfig(const QString &name)
-    : name(name), type(Physical), port(22), timeout(30)
+    : name(name),
+      type(Physical),
+      port(22),
+      timeout(30),
+      internalId(MaemoDeviceConfigurations::instance().m_nextId++)
 {
 }
 
@@ -65,8 +85,22 @@ MaemoDeviceConfigurations::DeviceConfig::DeviceConfig(const QSettings &settings)
       port(settings.value(PortKey, 22).toInt()),
       uname(settings.value(UserNameKey).toString()),
       pwd(settings.value(PasswordKey).toString()),
-      timeout(settings.value(TimeoutKey, 30).toInt())
+      timeout(settings.value(TimeoutKey, 30).toInt()),
+      internalId(settings.value(InternalIdKey, MaemoDeviceConfigurations::instance().m_nextId).toInt())
+{
+    if (internalId == MaemoDeviceConfigurations::instance().m_nextId)
+        ++MaemoDeviceConfigurations::instance().m_nextId;
+    qDebug("%s: name = %s, id = %llu", Q_FUNC_INFO, qPrintable(name), internalId);
+}
+
+MaemoDeviceConfigurations::DeviceConfig::DeviceConfig()
+    : internalId(InvalidId)
+{
+}
+
+bool MaemoDeviceConfigurations::DeviceConfig::isValid() const
 {
+    return internalId != InvalidId;
 }
 
 void MaemoDeviceConfigurations::DeviceConfig::save(QSettings &settings) const
@@ -78,24 +112,28 @@ void MaemoDeviceConfigurations::DeviceConfig::save(QSettings &settings) const
     settings.setValue(UserNameKey, uname);
     settings.setValue(PasswordKey, pwd);
     settings.setValue(TimeoutKey, timeout);
+    settings.setValue(InternalIdKey, internalId);
 }
 
 void MaemoDeviceConfigurations::setDevConfigs(const QList<DeviceConfig> &devConfigs)
 {
     m_devConfigs = devConfigs;
     save();
+    emit updated();
 }
 
-MaemoDeviceConfigurations &MaemoDeviceConfigurations::instance()
+MaemoDeviceConfigurations &MaemoDeviceConfigurations::instance(QObject *parent)
 {
-    static MaemoDeviceConfigurations configs;
-    return configs;
+    if (m_instance == 0)
+        m_instance = new MaemoDeviceConfigurations(parent);
+    return *m_instance;
 }
 
 void MaemoDeviceConfigurations::save()
 {
     QSettings *settings = Core::ICore::instance()->settings();
     settings->beginGroup(SettingsGroup);
+    settings->setValue(IdCounterKey, m_nextId);
     settings->beginWriteArray(ConfigListKey, m_devConfigs.count());
     for (int i = 0; i < m_devConfigs.count(); ++i) {
         settings->setArrayIndex(i);
@@ -105,7 +143,8 @@ void MaemoDeviceConfigurations::save()
     settings->endGroup();
 }
 
-MaemoDeviceConfigurations::MaemoDeviceConfigurations()
+MaemoDeviceConfigurations::MaemoDeviceConfigurations(QObject *parent)
+    : QObject(parent)
 {
     load();
 }
@@ -114,6 +153,7 @@ MaemoDeviceConfigurations::MaemoDeviceConfigurations()
 void MaemoDeviceConfigurations::load()
 {
     QSettings *settings = Core::ICore::instance()->settings();
+    m_nextId = settings->value(IdCounterKey, 1).toULongLong();
     settings->beginGroup(SettingsGroup);
     int count = settings->beginReadArray(ConfigListKey);
     for (int i = 0; i < count; ++i) {
@@ -124,5 +164,27 @@ void MaemoDeviceConfigurations::load()
     settings->endGroup();
 }
 
+MaemoDeviceConfigurations::DeviceConfig MaemoDeviceConfigurations::find(const QString &name) const
+{
+    qDebug("%s: Looking for name %s", Q_FUNC_INFO, qPrintable(name));
+    QList<DeviceConfig>::ConstIterator resultIt =
+        std::find_if(m_devConfigs.constBegin(), m_devConfigs.constEnd(),
+                     DevConfNameMatcher(name));
+    qDebug("Found: %d", resultIt != m_devConfigs.constEnd());
+    return resultIt == m_devConfigs.constEnd() ? DeviceConfig() : *resultIt;
+}
+
+MaemoDeviceConfigurations::DeviceConfig MaemoDeviceConfigurations::find(int id) const
+{
+    qDebug("%s: Looking for id %d", Q_FUNC_INFO, id);
+    QList<DeviceConfig>::ConstIterator resultIt =
+        std::find_if(m_devConfigs.constBegin(), m_devConfigs.constEnd(),
+                     DevConfIdMatcher(id));
+    qDebug("Found: %d", resultIt != m_devConfigs.constEnd());
+    return resultIt == m_devConfigs.constEnd() ? DeviceConfig() : *resultIt;
+}
+
+MaemoDeviceConfigurations *MaemoDeviceConfigurations::m_instance = 0;
+
 } // namespace Internal
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h
index 41227e44daf30abbb8647392ad1505cdc29a80e9..ed7958eeb5390464f8619f6308a470a40ffa31bc 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h
@@ -36,6 +36,7 @@
 #define MAEMODEVICECONFIGURATIONS_H
 
 #include <QtCore/QList>
+#include <QtCore/QObject>
 #include <QtCore/QString>
 #include <QtCore/QtGlobal>
 
@@ -46,16 +47,20 @@ QT_END_NAMESPACE
 namespace Qt4ProjectManager {
 namespace Internal {
 
-class MaemoDeviceConfigurations
+class MaemoDeviceConfigurations : public QObject
 {
+    Q_OBJECT
+    Q_DISABLE_COPY(MaemoDeviceConfigurations)
 public:
     class DeviceConfig
     {
     public:
         enum DeviceType { Physical, Simulator };
+        DeviceConfig();
         DeviceConfig(const QString &name);
         DeviceConfig(const QSettings &settings);
         void save(QSettings &settings) const;
+        bool isValid() const;
         QString name;
         DeviceType type;
         QString host;
@@ -63,12 +68,16 @@ public:
         QString uname;
         QString pwd;
         int timeout;
+        quint64 internalId;
+
+    private:
+        static const quint64 InvalidId = 0;
     };
 
-    class DevConfMatcher
+    class DevConfNameMatcher
     {
     public:
-        DevConfMatcher(const QString &name) : m_name(name) {}
+        DevConfNameMatcher(const QString &name) : m_name(name) {}
         bool operator()(const MaemoDeviceConfigurations::DeviceConfig &devConfig)
         {
             return devConfig.name == m_name;
@@ -77,18 +86,24 @@ public:
         const QString m_name;
     };
 
-    static MaemoDeviceConfigurations &instance();
+    static MaemoDeviceConfigurations &instance(QObject *parent = 0);
     QList<DeviceConfig> devConfigs() const { return m_devConfigs; }
     void setDevConfigs(const QList<DeviceConfig> &devConfigs);
+    DeviceConfig find(const QString &name) const;
+    DeviceConfig find(int id) const;
+
+signals:
+    void updated();
 
 private:
-    MaemoDeviceConfigurations();
-    MaemoDeviceConfigurations(const MaemoDeviceConfigurations &);
-    MaemoDeviceConfigurations& operator=(const MaemoDeviceConfigurations &);
+    MaemoDeviceConfigurations(QObject *parent);
     void load();
     void save();
 
+    static MaemoDeviceConfigurations *m_instance;
     QList<DeviceConfig> m_devConfigs;
+    quint64 m_nextId;
+    friend class MaemoDeviceConfigurations::DeviceConfig;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp
index 72f20ccde866add1ace73db0843f91c85130a92d..6f02c10e33624e22d21b1220cc29134fd54ac3cf 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp
@@ -29,6 +29,7 @@
 
 #include "maemomanager.h"
 
+#include "maemodeviceconfigurations.h"
 #include "maemosettingspage.h"
 #include "maemotoolchain.h"
 #include "maemorunconfiguration.h"
@@ -68,6 +69,7 @@ MaemoManager::MaemoManager()
     ExtensionSystem::PluginManager::instance()->addObject(m_runControlFactory);
     ExtensionSystem::PluginManager::instance()->addObject(m_runConfigurationFactory);
     ExtensionSystem::PluginManager::instance()->addObject(m_settingsPage);
+    MaemoDeviceConfigurations::instance(this);
 }
 
 MaemoManager::~MaemoManager()
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
index eb9bff1b9f9f03429e2a19d9fd0f87975b3442fd..5027ebd331474cc33c78b1617268e6bc2e9e460c 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
@@ -29,6 +29,7 @@
 
 #include "maemorunconfiguration.h"
 
+#include "maemodeviceconfigurations.h"
 #include "maemomanager.h"
 #include "maemotoolchain.h"
 #include "profilereader.h"
@@ -48,6 +49,7 @@
 #include <QtCore/QProcess>
 #include <QtCore/QSharedPointer>
 
+#include <QtGui/QComboBox>
 #include <QtGui/QCheckBox>
 #include <QtGui/QFormLayout>
 #include <QtGui/QFrame>
@@ -66,21 +68,14 @@ class MaemoRunConfigurationWidget : public QWidget
 {
     Q_OBJECT
 public:
-    MaemoRunConfigurationWidget(
-        MaemoRunConfiguration *runConfiguration, QWidget *parent = 0);
+    MaemoRunConfigurationWidget(MaemoRunConfiguration *runConfiguration,
+                                QWidget *parent = 0);
 
 private slots:
     void configNameEdited(const QString &text);
     void argumentsEdited(const QString &args);
-    void hostNameEdited(const QString &name);
-    void userNameEdited(const QString &name);
-    void portEdited(const QString &port);
-    void hostTypeChanged();
-
-#if USE_SSL_PASSWORD
-    void passwordUseChanged();
-    void passwordEdited(const QString &password);
-#endif
+    void deviceConfigurationChanged(const QString &name);
+    void resetDeviceConfigurations();
 
     void updateTargetInformation();
     
@@ -88,22 +83,15 @@ private slots:
     void updateVisibleSimulatorParameter();
 
 private:
+    void setSimInfoVisible(const MaemoDeviceConfigurations::DeviceConfig &devConf);
+
     QLineEdit *m_configNameLineEdit;
     QLineEdit *m_argsLineEdit;
-    QLineEdit *m_hostNameLineEdit;
-    QLineEdit *m_userLineEdit;
-    QLineEdit *m_passwordLineEdit;
-    QLineEdit *m_portLineEdit;
     QLabel *m_executableLabel;
     QLabel *m_debuggerLabel;
-    QLabel *m_simParamsValueLabel;
-    QLabel *m_chooseSimPathLabel;
-    QLabel *m_simParamsNameLabel;
-    QCheckBox *m_passwordCheckBox;
-    QRadioButton *m_hwButton;
-    QRadioButton *m_simButton;
-    QToolButton *m_resetButton;
-    Utils::PathChooser *m_simPathChooser;
+    QComboBox *m_devConfBox;
+    QLabel *m_simPathNameLabel;
+    QLabel *m_simPathValueLabel;
     MaemoRunConfiguration *m_runConfiguration;
 };
 
@@ -124,9 +112,9 @@ protected:
     const QString executableFileName() const;
     const QString port() const;
     const QString targetCmdLinePrefix() const;
+    const QString remoteDir() const;
     virtual void deploymentFinished(bool success)=0;
     virtual bool setProcessEnvironment(QProcess &process);
-
 private slots:
     void readStandardError();
     void readStandardOutput();
@@ -140,6 +128,9 @@ private:
     QProcess deployProcess;
     bool deployingExecutable;
     bool deployingDumperLib;
+
+protected:
+    const MaemoDeviceConfigurations::DeviceConfig devConfig;
 };
 
 class MaemoRunControl : public AbstractMaemoRunControl
@@ -239,39 +230,19 @@ void ErrorDumper::printToStream(QProcess::ProcessError error)
 // #pragma mark -- MaemoRunConfiguration
 
 
-static const QLatin1String RemoteHostIsSimulatorKey("RemoteHostIsSimulator");
-static const QLatin1String ArgumentsKeySim("ArgumentsSim");
-static const QLatin1String RemoteHostNameKeySim("RemoteHostNameSim");
-static const QLatin1String RemoteUserNameKeySim("RemoteUserNameSim");
-static const QLatin1String RemotePortKeySim("RemotePortSim");
-
-static const QLatin1String ArgumentsKeyDevice("ArgumentsDevice");
-static const QLatin1String RemoteHostNameKeyDevice("RemoteHostNameDevice");
-static const QLatin1String RemoteUserNameKeyDevice("RemoteUserNameDevice");
-static const QLatin1String RemotePortKeyDevice("RemotePortDevice");
-
+static const QLatin1String ArgumentsKey("Arguments");
+static const QLatin1String SimulatorPathKey("Simulator");
+static const QLatin1String DeviceIdKey("DeviceId");
 static const QLatin1String LastDeployedKey("LastDeployed");
 static const QLatin1String DebuggingHelpersLastDeployedKey(
     "DebuggingHelpersLastDeployed");
 
-static const QLatin1String SimulatorPath("SimulatorPath");
-static const QLatin1String IsUserSetSimulator("IsUserSetSimulator");
-
-#if USE_SSL_PASSWORD
-static const QLatinString RemoteUserPasswordKey("RemoteUserPassword");
-static const QLatinString RemoteHostRequiresPasswordKey(
-    "RemoteHostRequiresPassword");
-#endif
-
 MaemoRunConfiguration::MaemoRunConfiguration(Project *project,
         const QString &proFilePath)
     : RunConfiguration(project)
     , m_proFilePath(proFilePath)
     , m_cachedTargetInformationValid(false)
     , m_cachedSimulatorInformationValid(false)
-    , m_isUserSetSimulator(false)
-    , m_remotePortSim(22)
-    , m_remotePortDevice(22)
     , qemu(0)
 {
     if (!m_proFilePath.isEmpty()) {
@@ -281,6 +252,9 @@ MaemoRunConfiguration::MaemoRunConfiguration(Project *project,
         setName(tr("MaemoRunConfiguration"));
     }
 
+    connect(&MaemoDeviceConfigurations::instance(), SIGNAL(updated()),
+            this, SLOT(updateDeviceConfigurations()));
+
     connect(project, SIGNAL(targetInformationChanged()), this,
         SLOT(invalidateCachedTargetInformation()));
     connect(project, SIGNAL(activeBuildConfigurationChanged()), this,
@@ -336,28 +310,14 @@ QWidget *MaemoRunConfiguration::configurationWidget()
 
 void MaemoRunConfiguration::save(PersistentSettingsWriter &writer) const
 {
-    writer.saveValue(RemoteHostIsSimulatorKey, m_remoteHostIsSimulator);
-    writer.saveValue(ArgumentsKeySim, m_argumentsSim);
-    writer.saveValue(RemoteHostNameKeySim, m_remoteHostNameSim);
-    writer.saveValue(RemoteUserNameKeySim, m_remoteUserNameSim);
-    writer.saveValue(RemotePortKeySim, m_remotePortSim);
-
-    writer.saveValue(ArgumentsKeyDevice, m_argumentsDevice);
-    writer.saveValue(RemoteHostNameKeyDevice, m_remoteHostNameDevice);
-    writer.saveValue(RemoteUserNameKeyDevice, m_remoteUserNameDevice);
-    writer.saveValue(RemotePortKeyDevice, m_remotePortDevice);
-
-#if USE_SSL_PASSWORD
-    writer.saveValue(RemoteUserPasswordKey, m_remoteUserPassword);
-    writer.saveValue(RemoteHostRequiresPasswordKey, m_remoteHostRequiresPassword);
-#endif
+    writer.saveValue(DeviceIdKey, m_devConfig.internalId);
+    writer.saveValue(ArgumentsKey, m_arguments);
 
     writer.saveValue(LastDeployedKey, m_lastDeployed);
     writer.saveValue(DebuggingHelpersLastDeployedKey,
         m_debuggingHelpersLastDeployed);
 
-    writer.saveValue(SimulatorPath, m_simulatorPath);
-    writer.saveValue(IsUserSetSimulator, m_isUserSetSimulator);
+    writer.saveValue(SimulatorPathKey, m_simulatorPath);
 
     const QDir &dir = QFileInfo(project()->file()->fileName()).absoluteDir();
     writer.saveValue("ProFile", dir.relativeFilePath(m_proFilePath));
@@ -369,32 +329,15 @@ void MaemoRunConfiguration::restore(const PersistentSettingsReader &reader)
 {
     RunConfiguration::restore(reader);
 
-    m_remoteHostIsSimulator = reader.restoreValue(RemoteHostIsSimulatorKey)
-        .toBool();
-    m_argumentsSim = reader.restoreValue(ArgumentsKeySim).toStringList();
-    m_remoteHostNameSim = reader.restoreValue(RemoteHostNameKeySim).toString();
-    m_remoteUserNameSim = reader.restoreValue(RemoteUserNameKeySim).toString();
-    m_remotePortSim = reader.restoreValue(RemotePortKeySim).toInt();
-
-    m_argumentsDevice = reader.restoreValue(ArgumentsKeyDevice).toStringList();
-    m_remoteHostNameDevice = reader.restoreValue(RemoteHostNameKeyDevice)
-        .toString();
-    m_remoteUserNameDevice = reader.restoreValue(RemoteUserNameKeyDevice)
-        .toString();
-    m_remotePortDevice = reader.restoreValue(RemotePortKeyDevice).toInt();
-
-#if USE_SSL_PASSWORD
-    m_remoteUserPassword = reader.restoreValue(RemoteUserPasswordKey).toString();
-    m_remoteHostRequiresPassword =
-        reader.restoreValue(RemoteHostRequiresPasswordKey).toBool();
-#endif
+    setDeviceConfig(MaemoDeviceConfigurations::instance().
+        find(reader.restoreValue(DeviceIdKey).toInt()));
+    m_arguments = reader.restoreValue(ArgumentsKey).toStringList();
 
     m_lastDeployed = reader.restoreValue(LastDeployedKey).toDateTime();
     m_debuggingHelpersLastDeployed =
         reader.restoreValue(DebuggingHelpersLastDeployedKey).toDateTime();
 
-    m_simulatorPath = reader.restoreValue(SimulatorPath).toString();
-    m_isUserSetSimulator = reader.restoreValue(IsUserSetSimulator).toBool();
+    m_simulatorPath = reader.restoreValue(SimulatorPathKey).toString();
 
     const QDir &dir = QFileInfo(project()->file()->fileName()).absoluteDir();
     m_proFilePath = dir.filePath(reader.restoreValue("ProFile").toString());
@@ -435,29 +378,15 @@ bool MaemoRunConfiguration::fileNeedsDeployment(const QString &path,
         || QFileInfo(path).lastModified() > lastDeployed;
 }
 
-const QString MaemoRunConfiguration::remoteHostName() const
+void MaemoRunConfiguration::setDeviceConfig(
+    const MaemoDeviceConfigurations::DeviceConfig &devConf)
 {
-    return m_remoteHostIsSimulator ? m_remoteHostNameSim
-        : m_remoteHostNameDevice;
+    m_devConfig = devConf;
 }
 
-const QString MaemoRunConfiguration::remoteUserName() const
+MaemoDeviceConfigurations::DeviceConfig MaemoRunConfiguration::deviceConfig() const
 {
-    return m_remoteHostIsSimulator ? m_remoteUserNameSim
-        : m_remoteUserNameDevice;
-}
-
-int MaemoRunConfiguration::remotePort() const
-{
-    int port = m_remoteHostIsSimulator ? m_remotePortSim : m_remotePortDevice;
-    return port > 0 ? port : 22;
-}
-
-const QString MaemoRunConfiguration::remoteDir() const
-{
-    return remoteUserName() == QString::fromLocal8Bit("root")
-        ? QString::fromLocal8Bit("/root")
-        : QString::fromLocal8Bit("/home/") + remoteUserName();
+    return m_devConfig;
 }
 
 const QString MaemoRunConfiguration::sshCmd() const
@@ -507,13 +436,13 @@ QString MaemoRunConfiguration::maddeRoot() const
 const QString MaemoRunConfiguration::sysRoot() const
 {
     if (const MaemoToolChain *tc = toolchain())
-        return toolchain()->sysrootRoot();
+        return tc->sysrootRoot();
     return QString();
 }
 
 const QStringList MaemoRunConfiguration::arguments() const
 {
-    return m_remoteHostIsSimulator ? m_argumentsSim : m_argumentsDevice;
+    return m_arguments;
 }
 
 const QString MaemoRunConfiguration::dumperLib() const
@@ -559,62 +488,9 @@ QString MaemoRunConfiguration::simulatorArgs() const
 
 void MaemoRunConfiguration::setArguments(const QStringList &args)
 {
-    if (m_remoteHostIsSimulator)
-        m_argumentsSim = args;
-    else
-        m_argumentsDevice = args;
-}
-
-void MaemoRunConfiguration::setRemoteHostIsSimulator(bool isSimulator)
-{
-    m_remoteHostIsSimulator = isSimulator;
-}
-
-void MaemoRunConfiguration::setRemoteHostName(const QString &hostName)
-{
-    m_lastDeployed = QDateTime();
-    m_debuggingHelpersLastDeployed = QDateTime();
-
-    if (m_remoteHostIsSimulator)
-        m_remoteHostNameSim = hostName;
-    else
-        m_remoteHostNameDevice = hostName;
-}
-
-void MaemoRunConfiguration::setRemoteUserName(const QString &userName)
-{
-    m_lastDeployed = QDateTime();
-    m_debuggingHelpersLastDeployed = QDateTime();
-
-    if (m_remoteHostIsSimulator)
-        m_remoteUserNameSim = userName;
-    else
-        m_remoteUserNameDevice = userName;
-}
-
-void MaemoRunConfiguration::setRemotePort(int port)
-{
-    m_lastDeployed = QDateTime();
-    m_debuggingHelpersLastDeployed = QDateTime();
-
-    if (m_remoteHostIsSimulator)
-        m_remotePortSim = port;
-    else
-        m_remotePortDevice = port;
-}
-
-#if USE_SSL_PASSWORD
-void MaemoRunConfiguration::setRemotePassword(const QString &password)
-{
-    Q_ASSERT(remoteHostRequiresPassword());
-    m_remoteUserPassword = password;
+    m_arguments = args;
 }
 
-void MaemoRunConfiguration::setRemoteHostRequiresPassword(bool requiresPassword)
-{
-    m_remoteHostRequiresPassword = requiresPassword;
-}
-#endif
 
 bool MaemoRunConfiguration::isQemuRunning() const
 {
@@ -860,6 +736,15 @@ void MaemoRunConfiguration::enabledStateChanged()
     MaemoManager::instance()->setQemuSimulatorStarterEnabled(isEnabled());
 }
 
+void MaemoRunConfiguration::updateDeviceConfigurations()
+{
+    qDebug("%s: Current devid = %llu", Q_FUNC_INFO, m_devConfig.internalId);
+    m_devConfig =
+        MaemoDeviceConfigurations::instance().find(m_devConfig.internalId);
+    qDebug("%s: new devid = %llu", Q_FUNC_INFO, m_devConfig.internalId);
+    emit deviceConfigurationsUpdated();
+}
+
 
 // #pragma mark -- MaemoRunConfigurationWidget
 
@@ -874,6 +759,8 @@ MaemoRunConfigurationWidget::MaemoRunConfigurationWidget(
     mainLayout->setFormAlignment(Qt::AlignLeft | Qt::AlignVCenter);
     m_configNameLineEdit = new QLineEdit(m_runConfiguration->name());
     mainLayout->addRow(tr("Run configuration name:"), m_configNameLineEdit);
+    m_devConfBox = new QComboBox;
+    mainLayout->addRow(new QLabel(tr("Device Configuration:")), m_devConfBox);
     m_executableLabel = new QLabel(m_runConfiguration->executable());
     mainLayout->addRow(tr("Executable:"), m_executableLabel);
     m_argsLineEdit = new QLineEdit(m_runConfiguration->arguments().join(" "));
@@ -881,83 +768,24 @@ MaemoRunConfigurationWidget::MaemoRunConfigurationWidget(
     m_debuggerLabel = new QLabel(m_runConfiguration->gdbCmd());
     mainLayout->addRow(tr("Debugger:"), m_debuggerLabel);
     mainLayout->addItem(new QSpacerItem(10, 10));
+    m_simPathNameLabel = new QLabel(tr("Simulator Path:"));
+    m_simPathValueLabel = new QLabel(m_runConfiguration->simulatorPath());
+    mainLayout->addRow(m_simPathNameLabel, m_simPathValueLabel);
+    resetDeviceConfigurations();
 
-    QHBoxLayout *hostTypeLayout = new QHBoxLayout;
-    m_hwButton = new QRadioButton(tr("Physical device"));
-    hostTypeLayout->addWidget(m_hwButton);
-    m_simButton = new QRadioButton(tr("Simulator"));
-    hostTypeLayout->addWidget(m_simButton);
-    hostTypeLayout->addStretch(1);
-    mainLayout->addRow(tr("Remote host type:"), hostTypeLayout);
-
-    m_chooseSimPathLabel = new QLabel(tr("Choose simulator:"));
-    m_simPathChooser = new Utils::PathChooser;
-    m_simPathChooser->setPath(m_runConfiguration->simulatorPath());
-
-    QHBoxLayout *pathLayout = new QHBoxLayout;
-    pathLayout->addWidget(m_simPathChooser);
-
-    m_resetButton = new QToolButton();
-    m_resetButton->setToolTip(tr("Reset to default"));
-    m_resetButton->setIcon(QIcon(":/core/images/reset.png"));
-    pathLayout->addWidget(m_resetButton);
-
-    mainLayout->addRow(m_chooseSimPathLabel, pathLayout);
-    m_simParamsNameLabel = new QLabel(tr("Simulator command line:"));
-    m_simParamsValueLabel= new QLabel(m_runConfiguration->visibleSimulatorParameter());
-    mainLayout->addRow(m_simParamsNameLabel, m_simParamsValueLabel);
-
-    connect(m_simPathChooser, SIGNAL(changed(QString)), m_runConfiguration,
-        SLOT(setUserSimulatorPath(QString)));
     connect(m_runConfiguration, SIGNAL(cachedSimulatorInformationChanged()),
         this, SLOT(updateSimulatorPath()));
-    connect(m_runConfiguration, SIGNAL(cachedSimulatorInformationChanged()),
-        this, SLOT(updateVisibleSimulatorParameter()));
-    connect(m_resetButton, SIGNAL(clicked()), m_runConfiguration,
-        SLOT(resetCachedSimulatorInformation()));
-
-    m_hostNameLineEdit = new QLineEdit(m_runConfiguration->remoteHostName());
-    mainLayout->addRow(tr("Remote host name:"), m_hostNameLineEdit);
-    m_userLineEdit = new QLineEdit(m_runConfiguration->remoteUserName());
-    mainLayout->addRow(tr("Remote user name:"), m_userLineEdit);
-    m_portLineEdit = new QLineEdit(QString::number(m_runConfiguration->remotePort()));
-    mainLayout->addRow(tr("Remote SSH port:"), m_portLineEdit);
-
-    // Unlikely to ever work: ssh uses /dev/tty directly instead of stdin/out
-#if USE_SSL_PASSWORD
-    m_passwordCheckBox = new QCheckBox(tr("Remote password:"));
-    m_passwordCheckBox->setToolTip(tr("Uncheck for passwordless login"));
-    m_passwordCheckBox->setChecked(m_runConfiguration
-        ->remoteHostRequiresPassword());
-    m_passwordLineEdit = new QLineEdit(m_runConfiguration->remoteUserPassword());
-    m_passwordLineEdit->setEchoMode(QLineEdit::Password);
-    m_passwordLineEdit->setEnabled(m_passwordCheckBox->isChecked());
-    mainLayout->addRow(m_passwordCheckBox, m_passwordLineEdit);
-
-    connect(m_passwordCheckBox, SIGNAL(stateChanged(int)), this,
-        SLOT(passwordUseChanged()));
-    connect(m_passwordLineEdit, SIGNAL(textEdited(QString)), this,
-        SLOT(passwordEdited(QString)));
-#endif
+    connect(m_runConfiguration, SIGNAL(deviceConfigurationsUpdated()),
+            this, SLOT(resetDeviceConfigurations()));
 
     connect(m_configNameLineEdit, SIGNAL(textEdited(QString)), this,
         SLOT(configNameEdited(QString)));
     connect(m_argsLineEdit, SIGNAL(textEdited(QString)), this,
         SLOT(argumentsEdited(QString)));
+    connect(m_devConfBox, SIGNAL(activated(QString)), this,
+            SLOT(deviceConfigurationChanged(QString)));
     connect(m_runConfiguration, SIGNAL(targetInformationChanged()), this,
         SLOT(updateTargetInformation()));
-    connect(m_hwButton, SIGNAL(toggled(bool)), this, SLOT(hostTypeChanged()));
-    connect(m_simButton, SIGNAL(toggled(bool)), this, SLOT(hostTypeChanged()));
-    connect(m_hostNameLineEdit, SIGNAL(textEdited(QString)), this,
-        SLOT(hostNameEdited(QString)));
-    connect(m_userLineEdit, SIGNAL(textEdited(QString)), this,
-        SLOT(userNameEdited(QString)));
-    connect(m_portLineEdit, SIGNAL(textEdited(QString)), this,
-        SLOT(portEdited(QString)));
-    if (m_runConfiguration->remoteHostIsSimulator())
-        m_simButton->setChecked(true);
-    else
-        m_hwButton->setChecked(true);
 }
 
 void MaemoRunConfigurationWidget::configNameEdited(const QString &text)
@@ -977,66 +805,40 @@ void MaemoRunConfigurationWidget::updateTargetInformation()
 
 void MaemoRunConfigurationWidget::updateSimulatorPath()
 {
-    m_simPathChooser->setPath(m_runConfiguration->simulatorPath());
+    m_simPathValueLabel->setText(m_runConfiguration->simulatorPath());
 }
 
-void MaemoRunConfigurationWidget::updateVisibleSimulatorParameter()
+void MaemoRunConfigurationWidget::deviceConfigurationChanged(const QString &name)
 {
-    m_simParamsValueLabel->setText(m_runConfiguration->visibleSimulatorParameter());
+    const MaemoDeviceConfigurations::DeviceConfig &devConfig =
+            MaemoDeviceConfigurations::instance().find(name);
+    setSimInfoVisible(devConfig);
+    m_runConfiguration->setDeviceConfig(devConfig);
 }
 
-void MaemoRunConfigurationWidget::hostTypeChanged()
+void MaemoRunConfigurationWidget::setSimInfoVisible(
+    const MaemoDeviceConfigurations::DeviceConfig &devConf)
 {
-    const bool isSimulator = m_simButton->isChecked();
-
-    m_chooseSimPathLabel->setVisible(isSimulator);
-    m_simPathChooser->setVisible(isSimulator);
-    m_simParamsNameLabel->setVisible(isSimulator);
-    m_simParamsValueLabel->setVisible(isSimulator);
-    m_resetButton->setVisible(isSimulator);
-
-    m_runConfiguration->setRemoteHostIsSimulator(isSimulator);
-    m_argsLineEdit->setText(m_runConfiguration->arguments().join(" "));
-    m_hostNameLineEdit->setText(m_runConfiguration->remoteHostName());
-    m_userLineEdit->setText(m_runConfiguration->remoteUserName());
-    m_portLineEdit->setText(QString::number(m_runConfiguration->remotePort()));
+    const bool isSimulator =
+        devConf.type == MaemoDeviceConfigurations::DeviceConfig::Simulator;
+    m_simPathNameLabel->setVisible(isSimulator);
+    m_simPathValueLabel->setVisible(isSimulator);
 }
 
-void MaemoRunConfigurationWidget::hostNameEdited(const QString &hostName)
+void MaemoRunConfigurationWidget::resetDeviceConfigurations()
 {
-    m_runConfiguration->setRemoteHostName(hostName);
+    m_devConfBox->clear();
+    const QList<MaemoDeviceConfigurations::DeviceConfig> &devConfs =
+        MaemoDeviceConfigurations::instance().devConfigs();
+    foreach (const MaemoDeviceConfigurations::DeviceConfig &devConf, devConfs)
+        m_devConfBox->addItem(devConf.name);
+    m_devConfBox->addItem(MaemoDeviceConfigurations::DeviceConfig().name);
+    const MaemoDeviceConfigurations::DeviceConfig &devConf =
+        m_runConfiguration->deviceConfig();
+    m_devConfBox->setCurrentIndex(m_devConfBox->findText(devConf.name));
+    setSimInfoVisible(devConf);
 }
 
-void MaemoRunConfigurationWidget::userNameEdited(const QString &userName)
-{
-    m_runConfiguration->setRemoteUserName(userName);
-}
-
-#if USE_SSL_PASSWORD
-void MaemoRunConfigurationWidget::passwordUseChanged()
-{
-    const bool usePassword = m_passwordCheckBox->checkState() == Qt::Checked;
-    m_passwordLineEdit->setEnabled(usePassword);
-    m_runConfiguration->setRemoteHostRequiresPassword(usePassword);
-}
-
-void MaemoRunConfigurationWidget::passwordEdited(const QString &password)
-{
-    m_runConfiguration->setRemotePassword(password);
-}
-#endif
-
-void MaemoRunConfigurationWidget::portEdited(const QString &portString)
-{
-    bool isValidString;
-    int port = portString.toInt(&isValidString);
-    if (isValidString)
-        m_runConfiguration->setRemotePort(port);
-    else
-        m_portLineEdit->setText(QString::number(m_runConfiguration->remotePort()));
-}
-
-
 // #pragma mark -- MaemoRunConfigurationFactory
 
 
@@ -1219,6 +1021,8 @@ QWidget* MaemoRunControlFactory::configurationWidget(RunConfiguration *config)
 AbstractMaemoRunControl::AbstractMaemoRunControl(RunConfiguration *rc)
     : RunControl(rc)
     , runConfig(qobject_cast<MaemoRunConfiguration *>(rc))
+    , devConfig(runConfig ? runConfig->deviceConfig()
+                          : MaemoDeviceConfigurations::DeviceConfig())
 {
     setProcessEnvironment(deployProcess);
 
@@ -1235,6 +1039,8 @@ AbstractMaemoRunControl::AbstractMaemoRunControl(RunConfiguration *rc)
 void AbstractMaemoRunControl::startDeployment(bool forDebugging)
 {
     QTC_ASSERT(runConfig, return);
+    if (!devConfig.isValid())
+        deploymentFinished(false);
     QStringList deployables;
     if (runConfig->currentlyNeedsDeployment()) {
         deployingExecutable = true;
@@ -1252,8 +1058,8 @@ void AbstractMaemoRunControl::startDeployment(bool forDebugging)
         emit addToOutputWindow(this, tr("Files to deploy: %1.")
             .arg(deployables.join(" ")));
         QStringList cmdArgs;
-        cmdArgs << "-P" << port() << deployables << (runConfig->remoteUserName()
-            + "@" + runConfig->remoteHostName() + ":" + runConfig->remoteDir());
+        cmdArgs << "-P" << port() << deployables << (devConfig.uname
+            + "@" + devConfig.host + ":" + remoteDir());
         deployProcess.setWorkingDirectory(QFileInfo(executableOnHost()).absolutePath());
         deployProcess.start(runConfig->scpCmd(), cmdArgs);
         if (!deployProcess.waitForStarted()) {
@@ -1301,7 +1107,7 @@ const QString AbstractMaemoRunControl::executableOnHost() const
 
 const QString AbstractMaemoRunControl::port() const
 {
-    return QString::number(runConfig->remotePort());
+    return QString::number(devConfig.port);
 }
 
 const QString AbstractMaemoRunControl::executableFileName() const
@@ -1309,9 +1115,16 @@ const QString AbstractMaemoRunControl::executableFileName() const
     return QFileInfo(executableOnHost()).fileName();
 }
 
+const QString AbstractMaemoRunControl::remoteDir() const
+{
+    return devConfig.uname == QString::fromLocal8Bit("root")
+        ? QString::fromLocal8Bit("/root")
+        : QString::fromLocal8Bit("/home/") + devConfig.uname;
+}
+
 const QString AbstractMaemoRunControl::executableOnTarget() const
 {
-    return QString::fromLocal8Bit("%1/%2").arg(runConfig->remoteDir()).
+    return QString::fromLocal8Bit("%1/%2").arg(remoteDir()).
         arg(executableFileName());
 }
 
@@ -1397,8 +1210,8 @@ void MaemoRunControl::startExecution()
         .arg(runConfig->arguments().join(" "));
 
     QStringList cmdArgs;
-    cmdArgs << "-n" << "-p" << port() << "-l" << runConfig->remoteUserName()
-        << runConfig->remoteHostName() << remoteCall;
+    cmdArgs << "-n" << "-p" << port() << "-l" << devConfig.uname
+        << devConfig.host << remoteCall;
     sshProcess.start(runConfig->sshCmd(), cmdArgs);
 
     sshProcess.start(runConfig->sshCmd(), cmdArgs);
@@ -1432,8 +1245,8 @@ void MaemoRunControl::stop()
         QStringList cmdArgs;
         const QString remoteCall = QString::fromLocal8Bit("pkill -x %1; "
             "sleep 1; pkill -x -9 %1").arg(executableFileName());
-        cmdArgs << "-n" << "-p" << port() << "-l" << runConfig->remoteUserName()
-            << runConfig->remoteHostName() << remoteCall;
+        cmdArgs << "-n" << "-p" << port() << "-l" << devConfig.uname
+            << devConfig.host << remoteCall;
         stopProcess.start(runConfig->sshCmd(), cmdArgs);
     }
 }
@@ -1462,16 +1275,14 @@ MaemoDebugRunControl::MaemoDebugRunControl(RunConfiguration *runConfiguration)
     QTC_ASSERT(debuggerManager != 0, return);
     startParams->startMode = Debugger::StartRemote;
     startParams->executable = executableOnHost();
-    startParams->remoteChannel = runConfig->remoteHostName() + ":"
-        + gdbServerPort;
+    startParams->remoteChannel = devConfig.host + ":" + gdbServerPort;
     startParams->remoteArchitecture = "arm";
     startParams->sysRoot = runConfig->sysRoot();
     startParams->toolChainType = ToolChain::GCC_MAEMO;
     startParams->debuggerCommand = runConfig->gdbCmd();
     startParams->dumperLibrary = runConfig->dumperLib();
     startParams->remoteDumperLib = QString::fromLocal8Bit("%1/%2")
-        .arg(runConfig->remoteDir()).arg(QFileInfo(runConfig->dumperLib())
-            .fileName());
+        .arg(remoteDir()).arg(QFileInfo(runConfig->dumperLib()).fileName());
 
     connect(this, SIGNAL(stopRequested()), debuggerManager, SLOT(exitDebugger()));
     connect(debuggerManager, SIGNAL(debuggingFinished()), this,
@@ -1508,8 +1319,8 @@ void MaemoDebugRunControl::startGdbServer()
         arg(targetCmdLinePrefix()).arg(gdbServerPort). arg(executableOnTarget())
         .arg(runConfig->arguments().join(" ")));
     QStringList sshArgs;
-    sshArgs << "-t" << "-n" << "-l" << runConfig->remoteUserName() << "-p"
-        << port() << runConfig->remoteHostName() << remoteCall;
+    sshArgs << "-t" << "-n" << "-l" << devConfig.uname << "-p"
+        << port() << devConfig.host << remoteCall;
     inferiorPid = -1;
     disconnect(&gdbServer, SIGNAL(readyReadStandardError()), 0, 0);
     connect(&gdbServer, SIGNAL(readyReadStandardError()), this,
@@ -1591,8 +1402,8 @@ void MaemoDebugRunControl::debuggingFinished()
         const QString remoteCall = QString::fromLocal8Bit("kill %1; sleep 1; "
             "kill -9 %1; pkill -x -9 gdbserver").arg(inferiorPid);
         QStringList sshArgs;
-        sshArgs << "-n" << "-l" << runConfig->remoteUserName() << "-p" << port()
-            << runConfig->remoteHostName() << remoteCall;
+        sshArgs << "-n" << "-l" << devConfig.uname << "-p" << port()
+            << devConfig.host << remoteCall;
         stopProcess.start(runConfig->sshCmd(), sshArgs);
     }
     qDebug("ssh return code is %d", gdbServer.exitCode());
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
index fff60d6643fda087f5f231a43b653b57731abc3d..5286b5bf500ba5f91c64f8745cc79bd86da4359d 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
@@ -30,6 +30,8 @@
 #ifndef MAEMORUNCONFIGURATION_H
 #define MAEMORUNCONFIGURATION_H
 
+#include "maemodeviceconfigurations.h"
+
 #include <QtCore/QDateTime>
 #include <QtGui/QWidget>
 
@@ -87,28 +89,19 @@ public:
     const QString sysRoot() const;
     const QStringList arguments() const;
     void setArguments(const QStringList &args);
+    void setDeviceConfig(const MaemoDeviceConfigurations::DeviceConfig &deviceConfig);
+    MaemoDeviceConfigurations::DeviceConfig deviceConfig() const;
 
     QString simulator() const;
     QString simulatorArgs() const;
     QString simulatorPath() const;
     QString visibleSimulatorParameter() const;
 
-    bool remoteHostIsSimulator() const { return m_remoteHostIsSimulator; }
-    const QString remoteHostName() const;
-    const QString remoteUserName() const;
-    int remotePort() const;
-
-    const QString remoteDir() const;
     const QString sshCmd() const;
     const QString scpCmd() const;
     const QString gdbCmd() const;
     const QString dumperLib() const;
 
-    void setRemoteHostIsSimulator(bool isSimulator);
-    void setRemoteHostName(const QString &hostName);
-    void setRemoteUserName(const QString &userName);
-    void setRemotePort(int port);
-
     bool isQemuRunning() const;
 
 #if USE_SSL_PASSWORD
@@ -121,11 +114,13 @@ public:
 #endif
 
 signals:
+    void deviceConfigurationsUpdated();
     void targetInformationChanged();
     void cachedSimulatorInformationChanged();
     void qemuProcessStatus(bool running);
 
 private slots:
+    void updateDeviceConfigurations();
     void invalidateCachedTargetInformation();
 
     void setUserSimulatorPath(const QString &path);
@@ -145,7 +140,6 @@ private:
     bool fileNeedsDeployment(const QString &path, const QDateTime &lastDeployed) const;
 
 private:
-    // Keys for saving/loading attributes.
     QString m_executable;
     QString m_proFilePath;
     bool m_cachedTargetInformationValid;
@@ -161,18 +155,8 @@ private:
 
     QString m_gdbPath;
 
-    // Information about the remote host.
-    bool m_remoteHostIsSimulator;
-
-    QStringList m_argumentsSim;
-    QString m_remoteHostNameSim;
-    QString m_remoteUserNameSim;
-    int m_remotePortSim;
-
-    QStringList m_argumentsDevice;
-    QString m_remoteHostNameDevice;
-    QString m_remoteUserNameDevice;
-    int m_remotePortDevice;
+    MaemoDeviceConfigurations::DeviceConfig m_devConfig;
+    QStringList m_arguments;
 
     QDateTime m_lastDeployed;
     QDateTime m_debuggingHelpersLastDeployed;
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp
index bea7ad0aefdf6b08170cd810eed1238f66cc012c..222aa6cd65d556e7cdd4b27033d8231fb5a8488b 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp
@@ -60,7 +60,7 @@ bool configNameExists(const QList<MaemoDeviceConfigurations::DeviceConfig> &devC
                       const QString &name)
 {
     return std::find_if(devConfs.constBegin(), devConfs.constEnd(),
-        MaemoDeviceConfigurations::DevConfMatcher(name)) != devConfs.constEnd();
+        MaemoDeviceConfigurations::DevConfNameMatcher(name)) != devConfs.constEnd();
 }
 
 class PortAndTimeoutValidator : public QIntValidator
@@ -193,7 +193,7 @@ void MaemoSettingsPage::apply()
 
 void MaemoSettingsPage::finish()
 {
-    apply();
+    // apply();
 }
 
 MaemoSettingsWidget::MaemoSettingsWidget(QWidget *parent)
@@ -262,9 +262,9 @@ void MaemoSettingsWidget::display(const MaemoDeviceConfigurations::DeviceConfig
 {
     m_ui->nameLineEdit->setText(devConfig.name);
     if (devConfig.type == MaemoDeviceConfigurations::DeviceConfig::Physical)
-        m_ui->deviceButton->setEnabled(true);
+        m_ui->deviceButton->setChecked(true);
     else
-        m_ui->simulatorButton->setEnabled(true);
+        m_ui->simulatorButton->setChecked(true);
     m_ui->hostLineEdit->setText(devConfig.host);
     m_ui->portLineEdit->setText(QString::number(devConfig.port));
     m_ui->timeoutLineEdit->setText(QString::number(devConfig.timeout));