diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp
index 9fde0218e41044cc0454066cd610cd59ae877b6c..1f527e61534e84b02c93e966a6660bf8682401d3 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp
@@ -37,6 +37,7 @@
 #include <coreplugin/icore.h>
 
 #include <QtCore/QSettings>
+#include <QtGui/QDesktopServices>
 
 #include <algorithm>
 
@@ -52,9 +53,15 @@ namespace {
     const QLatin1String HostKey("Host");
     const QLatin1String PortKey("Port");
     const QLatin1String UserNameKey("Uname");
+    const QLatin1String AuthKey("Authentication");
+    const QLatin1String KeyFileKey("KeyFile");
     const QLatin1String PasswordKey("Password");
     const QLatin1String TimeoutKey("Timeout");
     const QLatin1String InternalIdKey("InternalId");
+
+    const QString DefaultKeyFile =
+        QDesktopServices::storageLocation(QDesktopServices::HomeLocation)
+        + QLatin1String("/.ssh/id_rsa");
 };
 
 class DevConfIdMatcher
@@ -73,6 +80,8 @@ MaemoDeviceConfigurations::DeviceConfig::DeviceConfig(const QString &name)
     : name(name),
       type(Physical),
       port(22),
+      authentication(Key),
+      keyFile(DefaultKeyFile),
       timeout(30),
       internalId(MaemoDeviceConfigurations::instance().m_nextId++)
 {
@@ -84,7 +93,9 @@ MaemoDeviceConfigurations::DeviceConfig::DeviceConfig(const QSettings &settings)
       host(settings.value(HostKey).toString()),
       port(settings.value(PortKey, 22).toInt()),
       uname(settings.value(UserNameKey).toString()),
+      authentication(static_cast<AuthType>(settings.value(AuthKey).toInt())),
       pwd(settings.value(PasswordKey).toString()),
+      keyFile(settings.value(KeyFileKey).toString()),
       timeout(settings.value(TimeoutKey, 30).toInt()),
       internalId(settings.value(InternalIdKey, MaemoDeviceConfigurations::instance().m_nextId).toInt())
 {
@@ -110,7 +121,9 @@ void MaemoDeviceConfigurations::DeviceConfig::save(QSettings &settings) const
     settings.setValue(HostKey, host);
     settings.setValue(PortKey, port);
     settings.setValue(UserNameKey, uname);
+    settings.setValue(AuthKey, authentication);
     settings.setValue(PasswordKey, pwd);
+    settings.setValue(KeyFileKey, keyFile);
     settings.setValue(TimeoutKey, timeout);
     settings.setValue(InternalIdKey, internalId);
 }
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h
index ed7958eeb5390464f8619f6308a470a40ffa31bc..6a224eba41d1e852593b3ad0d100b30287052831 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h
@@ -56,6 +56,7 @@ public:
     {
     public:
         enum DeviceType { Physical, Simulator };
+        enum AuthType { Password, Key };
         DeviceConfig();
         DeviceConfig(const QString &name);
         DeviceConfig(const QSettings &settings);
@@ -66,7 +67,9 @@ public:
         QString host;
         int port;
         QString uname;
+        AuthType authentication;
         QString pwd;
+        QString keyFile;
         int timeout;
         quint64 internalId;
 
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
index 5920d91abeba91e10c7e50f9bf8505a04bf86dc3..6ab6e38e52fa0028305fd85db7ec94b5a190aac9 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
@@ -112,6 +112,7 @@ protected:
     const QString port() const;
     const QString targetCmdLinePrefix() const;
     const QString remoteDir() const;
+    const QStringList options() const;
     virtual void deploymentFinished(bool success)=0;
     virtual bool setProcessEnvironment(QProcess &process);
 private slots:
@@ -752,6 +753,7 @@ MaemoRunConfigurationWidget::MaemoRunConfigurationWidget(
     m_configNameLineEdit = new QLineEdit(m_runConfiguration->name());
     mainLayout->addRow(tr("Run configuration name:"), m_configNameLineEdit);
     m_devConfBox = new QComboBox;
+    m_devConfBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
     mainLayout->addRow(new QLabel(tr("Device Configuration:")), m_devConfBox);
     m_executableLabel = new QLabel(m_runConfiguration->executable());
     mainLayout->addRow(tr("Executable:"), m_executableLabel);
@@ -1031,8 +1033,10 @@ AbstractMaemoRunControl::AbstractMaemoRunControl(RunConfiguration *rc)
 void AbstractMaemoRunControl::startDeployment(bool forDebugging)
 {
     QTC_ASSERT(runConfig, return);
-    if (!devConfig.isValid())
+    if (!devConfig.isValid()) {
         deploymentFinished(false);
+        return;
+    }
     QStringList deployables;
     if (runConfig->currentlyNeedsDeployment()) {
         deployingExecutable = true;
@@ -1050,8 +1054,8 @@ void AbstractMaemoRunControl::startDeployment(bool forDebugging)
         emit addToOutputWindow(this, tr("Files to deploy: %1.")
             .arg(deployables.join(" ")));
         QStringList cmdArgs;
-        cmdArgs << "-P" << port() << deployables << (devConfig.uname
-            + "@" + devConfig.host + ":" + remoteDir());
+        cmdArgs << "-P" << port() << options() << deployables
+            << (devConfig.uname + "@" + devConfig.host + ":" + remoteDir());
         deployProcess.setWorkingDirectory(QFileInfo(executableOnHost()).absolutePath());
         deployProcess.start(runConfig->scpCmd(), cmdArgs);
         if (!deployProcess.waitForStarted()) {
@@ -1114,6 +1118,19 @@ const QString AbstractMaemoRunControl::remoteDir() const
         : QString::fromLocal8Bit("/home/") + devConfig.uname;
 }
 
+const QStringList AbstractMaemoRunControl::options() const
+{
+    const bool usePassword =
+        devConfig.authentication == MaemoDeviceConfigurations::DeviceConfig::Password;
+    const QLatin1String opt("-o");
+    return QStringList() << opt
+        << QString::fromLatin1("PasswordAuthentication=%1").
+            arg(usePassword ? "yes" : "no") << opt
+        << QString::fromLatin1("PubkeyAuthentication=%1").
+            arg(usePassword ? "no" : "yes") << opt
+        << QString::fromLatin1("ConnectTimeout=%1").arg(devConfig.timeout);
+}
+
 const QString AbstractMaemoRunControl::executableOnTarget() const
 {
     return QString::fromLocal8Bit("%1/%2").arg(remoteDir()).
@@ -1202,7 +1219,7 @@ void MaemoRunControl::startExecution()
 
     QStringList cmdArgs;
     cmdArgs << "-n" << "-p" << port() << "-l" << devConfig.uname
-        << devConfig.host << remoteCall;
+        << options() << devConfig.host << remoteCall;
     sshProcess.start(runConfig->sshCmd(), cmdArgs);
 
     sshProcess.start(runConfig->sshCmd(), cmdArgs);
@@ -1237,7 +1254,7 @@ void MaemoRunControl::stop()
         const QString remoteCall = QString::fromLocal8Bit("pkill -x %1; "
             "sleep 1; pkill -x -9 %1").arg(executableFileName());
         cmdArgs << "-n" << "-p" << port() << "-l" << devConfig.uname
-            << devConfig.host << remoteCall;
+            << options() << devConfig.host << remoteCall;
         stopProcess.start(runConfig->sshCmd(), cmdArgs);
     }
 }
@@ -1311,7 +1328,7 @@ void MaemoDebugRunControl::startGdbServer()
         .arg(runConfig->arguments().join(" ")));
     QStringList sshArgs;
     sshArgs << "-t" << "-n" << "-l" << devConfig.uname << "-p"
-        << port() << devConfig.host << remoteCall;
+        << port() << options() << devConfig.host << remoteCall;
     inferiorPid = -1;
     disconnect(&gdbServer, SIGNAL(readyReadStandardError()), 0, 0);
     connect(&gdbServer, SIGNAL(readyReadStandardError()), this,
@@ -1394,7 +1411,7 @@ void MaemoDebugRunControl::debuggingFinished()
             "kill -9 %1; pkill -x -9 gdbserver").arg(inferiorPid);
         QStringList sshArgs;
         sshArgs << "-n" << "-l" << devConfig.uname << "-p" << port()
-            << devConfig.host << remoteCall;
+            << options() << devConfig.host << remoteCall;
         stopProcess.start(runConfig->sshCmd(), sshArgs);
     }
     qDebug("ssh return code is %d", gdbServer.exitCode());
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp
index 222aa6cd65d556e7cdd4b27033d8231fb5a8488b..ae60e3cc6e1d31f51adbc34be63863699c721a32 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp
@@ -127,11 +127,13 @@ private slots:
     void deleteConfig();
     void configNameEditingFinished();
     void deviceTypeChanged();
+    void authenticationTypeChanged();
     void hostNameEditingFinished();
     void portEditingFinished();
     void timeoutEditingFinished();
     void userNameEditingFinished();
     void passwordEditingFinished();
+    void keyFileEditingFinished();
 
 private:
     void initGui();
@@ -151,12 +153,10 @@ private:
 MaemoSettingsPage::MaemoSettingsPage(QObject *parent)
     : Core::IOptionsPage(parent)
 {
-    qDebug("Creating maemo settings page");
 }
 
 MaemoSettingsPage::~MaemoSettingsPage()
 {
-    qDebug("deleting maemo settings page");
 }
 
 QString MaemoSettingsPage::id() const
@@ -193,7 +193,6 @@ void MaemoSettingsPage::apply()
 
 void MaemoSettingsPage::finish()
 {
-    // apply();
 }
 
 MaemoSettingsWidget::MaemoSettingsWidget(QWidget *parent)
@@ -203,13 +202,11 @@ MaemoSettingsWidget::MaemoSettingsWidget(QWidget *parent)
       m_nameValidator(m_devConfs)
 
 {
-    qDebug("creating maemo settings widget");
     initGui();
 }
 
 MaemoSettingsWidget::~MaemoSettingsWidget()
 {
-    qDebug("Deleting maemo settings widget");
 }
 
 void MaemoSettingsWidget::initGui()
@@ -265,11 +262,16 @@ void MaemoSettingsWidget::display(const MaemoDeviceConfigurations::DeviceConfig
         m_ui->deviceButton->setChecked(true);
     else
         m_ui->simulatorButton->setChecked(true);
+    if (devConfig.authentication == MaemoDeviceConfigurations::DeviceConfig::Password)
+        m_ui->passwordButton->setChecked(true);
+    else
+        m_ui->keyButton->setChecked(true);
     m_ui->hostLineEdit->setText(devConfig.host);
     m_ui->portLineEdit->setText(QString::number(devConfig.port));
     m_ui->timeoutLineEdit->setText(QString::number(devConfig.timeout));
     m_ui->userLineEdit->setText(devConfig.uname);
     m_ui->pwdLineEdit->setText(devConfig.pwd);
+    m_ui->keyFileLineEdit->setText(devConfig.keyFile);
     m_ui->detailsWidget->setEnabled(true);
     m_nameValidator.setName(devConfig.name);
     m_portValidator.setValue(devConfig.port);
@@ -284,13 +286,11 @@ void MaemoSettingsWidget::saveSettings()
 
 MaemoDeviceConfigurations::DeviceConfig &MaemoSettingsWidget::currentConfig()
 {
-    qDebug("%d/%d", m_ui->configListWidget->count(), m_devConfs.count());
     Q_ASSERT(m_ui->configListWidget->count() == m_devConfs.count());
     const QList<QListWidgetItem *> &selectedItems =
         m_ui->configListWidget->selectedItems();
     Q_ASSERT(selectedItems.count() == 1);
     const int selectedRow = m_ui->configListWidget->row(selectedItems.first());
-    qDebug("selected row = %d", selectedRow);
     Q_ASSERT(selectedRow < m_devConfs.count());
     return m_devConfs[selectedRow];
 }
@@ -311,6 +311,18 @@ void MaemoSettingsWidget::deviceTypeChanged()
             : MaemoDeviceConfigurations::DeviceConfig::Simulator;
 }
 
+void MaemoSettingsWidget::authenticationTypeChanged()
+{
+    const bool usePassword = m_ui->passwordButton->isChecked();
+    currentConfig().authentication = usePassword
+        ? MaemoDeviceConfigurations::DeviceConfig::Password
+        : MaemoDeviceConfigurations::DeviceConfig::Key;
+    m_ui->pwdLineEdit->setEnabled(usePassword);
+    m_ui->passwordLabel->setEnabled(usePassword);
+    m_ui->keyFileLineEdit->setEnabled(!usePassword);
+    m_ui->keyLabel->setEnabled(!usePassword);
+}
+
 void MaemoSettingsWidget::hostNameEditingFinished()
 {
     currentConfig().host = m_ui->hostLineEdit->text();
@@ -346,6 +358,11 @@ void MaemoSettingsWidget::passwordEditingFinished()
     currentConfig().pwd = m_ui->pwdLineEdit->text();
 }
 
+void MaemoSettingsWidget::keyFileEditingFinished()
+{
+    currentConfig().keyFile = m_ui->keyFileLineEdit->text();
+}
+
 void MaemoSettingsWidget::selectionChanged()
 {
     const QList<QListWidgetItem *> &selectedItems =
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui
index 29c19cc803c7aff905d15c75d589aa3a81d275b4..8b666afd0d346564d4cb02d831144a857f8b925f 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui
@@ -42,13 +42,6 @@
          <item row="0" column="1">
           <widget class="QLineEdit" name="nameLineEdit"/>
          </item>
-         <item row="1" column="0">
-          <widget class="QLabel" name="label_2">
-           <property name="text">
-            <string>Device type:</string>
-           </property>
-          </widget>
-         </item>
          <item row="1" column="1">
           <widget class="QWidget" name="widget_2" native="true">
            <layout class="QHBoxLayout" name="horizontalLayout_2">
@@ -75,60 +68,114 @@
            </layout>
           </widget>
          </item>
-         <item row="2" column="0">
+         <item row="3" column="0">
           <widget class="QLabel" name="label_3">
            <property name="text">
             <string>Host Name:</string>
            </property>
           </widget>
          </item>
-         <item row="2" column="1">
+         <item row="3" column="1">
           <widget class="QLineEdit" name="hostLineEdit"/>
          </item>
-         <item row="3" column="0">
+         <item row="4" column="0">
           <widget class="QLabel" name="label_4">
            <property name="text">
             <string>Port:</string>
            </property>
           </widget>
          </item>
-         <item row="3" column="1">
+         <item row="4" column="1">
           <widget class="QLineEdit" name="portLineEdit"/>
          </item>
-         <item row="4" column="0">
+         <item row="5" column="0">
           <widget class="QLabel" name="label_5">
            <property name="text">
             <string>Connection Timeout:</string>
            </property>
           </widget>
          </item>
-         <item row="4" column="1">
+         <item row="5" column="1">
           <widget class="QLineEdit" name="timeoutLineEdit"/>
          </item>
-         <item row="5" column="0">
+         <item row="6" column="0">
           <widget class="QLabel" name="label_6">
            <property name="text">
             <string>User Name:</string>
            </property>
           </widget>
          </item>
-         <item row="5" column="1">
+         <item row="6" column="1">
           <widget class="QLineEdit" name="userLineEdit"/>
          </item>
-         <item row="6" column="0">
-          <widget class="QLabel" name="label_7">
+         <item row="7" column="0">
+          <widget class="QLabel" name="passwordLabel">
            <property name="text">
             <string>Password:</string>
            </property>
           </widget>
          </item>
-         <item row="6" column="1">
+         <item row="7" column="1">
           <widget class="QLineEdit" name="pwdLineEdit">
            <property name="echoMode">
             <enum>QLineEdit::Password</enum>
            </property>
           </widget>
          </item>
+         <item row="1" column="0">
+          <widget class="QLabel" name="label_2">
+           <property name="text">
+            <string>Device type:</string>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="0">
+          <widget class="QLabel" name="label_8">
+           <property name="text">
+            <string>Authentication type:</string>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="1">
+          <widget class="QWidget" name="widget_3" native="true">
+           <layout class="QHBoxLayout" name="horizontalLayout_3">
+            <property name="topMargin">
+             <number>0</number>
+            </property>
+            <property name="bottomMargin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QRadioButton" name="passwordButton">
+              <property name="text">
+               <string>Password</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="keyButton">
+              <property name="text">
+               <string>Key</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item row="8" column="0">
+          <widget class="QLabel" name="keyLabel">
+           <property name="text">
+            <string>Private key file:</string>
+           </property>
+          </widget>
+         </item>
+         <item row="8" column="1">
+          <widget class="QLineEdit" name="keyFileLineEdit">
+           <property name="echoMode">
+            <enum>QLineEdit::Normal</enum>
+           </property>
+          </widget>
+         </item>
         </layout>
        </widget>
       </item>
@@ -180,8 +227,8 @@
    <slot>configNameEditingFinished()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>221</x>
-     <y>166</y>
+     <x>372</x>
+     <y>146</y>
     </hint>
     <hint type="destinationlabel">
      <x>514</x>
@@ -196,8 +243,8 @@
    <slot>deviceTypeChanged()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>164</x>
-     <y>197</y>
+     <x>269</x>
+     <y>170</y>
     </hint>
     <hint type="destinationlabel">
      <x>511</x>
@@ -212,8 +259,8 @@
    <slot>hostNameEditingFinished()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>289</x>
-     <y>222</y>
+     <x>397</x>
+     <y>219</y>
     </hint>
     <hint type="destinationlabel">
      <x>424</x>
@@ -228,8 +275,8 @@
    <slot>portEditingFinished()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>320</x>
-     <y>248</y>
+     <x>397</x>
+     <y>243</y>
     </hint>
     <hint type="destinationlabel">
      <x>514</x>
@@ -244,8 +291,8 @@
    <slot>timeoutEditingFinished()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>371</x>
-     <y>276</y>
+     <x>397</x>
+     <y>268</y>
     </hint>
     <hint type="destinationlabel">
      <x>425</x>
@@ -260,8 +307,8 @@
    <slot>userNameEditingFinished()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>340</x>
-     <y>302</y>
+     <x>397</x>
+     <y>293</y>
     </hint>
     <hint type="destinationlabel">
      <x>422</x>
@@ -276,8 +323,8 @@
    <slot>passwordEditingFinished()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>243</x>
-     <y>333</y>
+     <x>394</x>
+     <y>317</y>
     </hint>
     <hint type="destinationlabel">
      <x>423</x>
@@ -292,8 +339,8 @@
    <slot>deviceTypeChanged()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>291</x>
-     <y>198</y>
+     <x>388</x>
+     <y>170</y>
     </hint>
     <hint type="destinationlabel">
      <x>426</x>
@@ -349,6 +396,38 @@
     </hint>
    </hints>
   </connection>
+  <connection>
+   <sender>passwordButton</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>maemoSettingsWidget</receiver>
+   <slot>authenticationTypeChanged()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>196</x>
+     <y>187</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>513</x>
+     <y>240</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>keyFileLineEdit</sender>
+   <signal>editingFinished()</signal>
+   <receiver>maemoSettingsWidget</receiver>
+   <slot>keyFileChanged()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>208</x>
+     <y>332</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>424</x>
+     <y>41</y>
+    </hint>
+   </hints>
+  </connection>
  </connections>
  <slots>
   <slot>configNameEditingFinished()</slot>
@@ -361,5 +440,7 @@
   <slot>addConfig()</slot>
   <slot>selectionChanged()</slot>
   <slot>deleteConfig()</slot>
+  <slot>authenticationTypeChanged()</slot>
+  <slot>keyFileChanged()</slot>
  </slots>
 </ui>