diff --git a/src/plugins/madde/maddedeviceconfigurationfactory.cpp b/src/plugins/madde/maddedeviceconfigurationfactory.cpp
index 5e9db12ff43bd547fb6271cba66b35c2d546c898..e7e3cdfafcce858745d7d045e896d2b57a5d5599 100644
--- a/src/plugins/madde/maddedeviceconfigurationfactory.cpp
+++ b/src/plugins/madde/maddedeviceconfigurationfactory.cpp
@@ -40,6 +40,7 @@
 #include <remotelinux/remotelinuxprocessesdialog.h>
 #include <remotelinux/remotelinuxprocesslist.h>
 #include <remotelinux/remotelinux_constants.h>
+#include <remotelinux/genericlinuxdeviceconfigurationwidget.h>
 #include <utils/qtcassert.h>
 
 using namespace RemoteLinux;
@@ -66,6 +67,13 @@ ILinuxDeviceConfigurationWizard *MaddeDeviceConfigurationFactory::createWizard(Q
     return new MaemoDeviceConfigWizard(parent);
 }
 
+ILinuxDeviceConfigurationWidget *MaddeDeviceConfigurationFactory::createWidget(
+        const LinuxDeviceConfiguration::Ptr &deviceConfig,
+        QWidget *parent) const
+{
+    return new GenericLinuxDeviceConfigurationWidget(deviceConfig, parent);
+}
+
 bool MaddeDeviceConfigurationFactory::supportsOsType(const QString &osType) const
 {
     return osType == QLatin1String(Maemo5OsType) || osType == QLatin1String(HarmattanOsType)
diff --git a/src/plugins/madde/maddedeviceconfigurationfactory.h b/src/plugins/madde/maddedeviceconfigurationfactory.h
index 0e988680a9683ff4070d19c0a69751c25b57663d..b07bbd74ea0eefd26c05dcd4149ab5ec6ae93914 100644
--- a/src/plugins/madde/maddedeviceconfigurationfactory.h
+++ b/src/plugins/madde/maddedeviceconfigurationfactory.h
@@ -45,6 +45,9 @@ public:
 
     QString displayName() const;
     RemoteLinux::ILinuxDeviceConfigurationWizard *createWizard(QWidget *parent) const;
+    RemoteLinux::ILinuxDeviceConfigurationWidget *createWidget(
+            const RemoteLinux::LinuxDeviceConfiguration::Ptr &deviceConfig,
+            QWidget *parent = 0) const;
     bool supportsOsType(const QString &osType) const;
     QString displayNameForOsType(const QString &osType) const;
     QStringList supportedDeviceActionIds() const;
diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp b/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp
index b39de70be7d284e4346c0a9621ab095b9c8b619d..0c7865199ceb196bb460e7e855dc12f760fd38cf 100644
--- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp
+++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp
@@ -32,6 +32,7 @@
 #include "genericlinuxdeviceconfigurationfactory.h"
 
 #include "genericlinuxdeviceconfigurationwizard.h"
+#include "genericlinuxdeviceconfigurationwidget.h"
 #include "linuxdevicetestdialog.h"
 #include "publickeydeploymentdialog.h"
 #include "remotelinuxprocessesdialog.h"
@@ -57,6 +58,13 @@ ILinuxDeviceConfigurationWizard *GenericLinuxDeviceConfigurationFactory::createW
     return new GenericLinuxDeviceConfigurationWizard(parent);
 }
 
+ILinuxDeviceConfigurationWidget *GenericLinuxDeviceConfigurationFactory::createWidget(
+        const LinuxDeviceConfiguration::Ptr &deviceConfig,
+        QWidget *parent) const
+{
+    return new GenericLinuxDeviceConfigurationWidget(deviceConfig, parent);
+}
+
 bool GenericLinuxDeviceConfigurationFactory::supportsOsType(const QString &osType) const
 {
     return osType == QLatin1String(Constants::GenericLinuxOsType);
diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.h b/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.h
index 0a461891df823730c491a676cfe17501a98d2a95..24b4400b2f121094dc7074c408a772b3c5ef2f12 100644
--- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.h
+++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.h
@@ -47,6 +47,9 @@ public:
 
     QString displayName() const;
     ILinuxDeviceConfigurationWizard *createWizard(QWidget *parent) const;
+    ILinuxDeviceConfigurationWidget *createWidget(
+            const LinuxDeviceConfiguration::Ptr &deviceConfig,
+            QWidget *parent = 0) const;
     bool supportsOsType(const QString &osType) const;
     QString displayNameForOsType(const QString &osType) const;
     QStringList supportedDeviceActionIds() const;
diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.cpp b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bbb32d03eac77b35bab5be0944c7569e1c1822a8
--- /dev/null
+++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.cpp
@@ -0,0 +1,189 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** GNU Lesser General Public License Usage
+**
+** 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.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#include "genericlinuxdeviceconfigurationwidget.h"
+#include "ui_genericlinuxdeviceconfigurationwidget.h"
+
+#include <remotelinux/portlist.h>
+#include <remotelinux/linuxdeviceconfigurations.h>
+
+#include <utils/ssh/sshconnection.h>
+
+#include <QTextStream>
+
+using namespace RemoteLinux;
+
+GenericLinuxDeviceConfigurationWidget::GenericLinuxDeviceConfigurationWidget(
+        const LinuxDeviceConfiguration::Ptr &deviceConfig,
+        QWidget *parent) :
+    ILinuxDeviceConfigurationWidget(deviceConfig, parent),
+    m_ui(new Ui::GenericLinuxDeviceConfigurationWidget)
+{
+    m_ui->setupUi(this);
+    connect(m_ui->hostLineEdit, SIGNAL(editingFinished()), this, SLOT(hostNameEditingFinished()));
+    connect(m_ui->userLineEdit, SIGNAL(editingFinished()), this, SLOT(userNameEditingFinished()));
+    connect(m_ui->pwdLineEdit, SIGNAL(editingFinished()), this, SLOT(passwordEditingFinished()));
+    connect(m_ui->passwordButton, SIGNAL(toggled(bool)), this, SLOT(authenticationTypeChanged()));
+    connect(m_ui->keyFileLineEdit, SIGNAL(editingFinished()), this, SLOT(keyFileEditingFinished()));
+    connect(m_ui->keyFileLineEdit, SIGNAL(browsingFinished()), this, SLOT(keyFileEditingFinished()));
+    connect(m_ui->keyButton, SIGNAL(toggled(bool)), this, SLOT(authenticationTypeChanged()));
+    connect(m_ui->timeoutSpinBox, SIGNAL(editingFinished()), this, SLOT(timeoutEditingFinished()));
+    connect(m_ui->timeoutSpinBox, SIGNAL(valueChanged(int)), this, SLOT(timeoutEditingFinished()));
+    connect(m_ui->sshPortSpinBox, SIGNAL(editingFinished()), this, SLOT(sshPortEditingFinished()));
+    connect(m_ui->sshPortSpinBox, SIGNAL(valueChanged(int)), this, SLOT(sshPortEditingFinished()));
+    connect(m_ui->showPasswordCheckBox, SIGNAL(toggled(bool)), this, SLOT(showPassword(bool)));
+    connect(m_ui->portsLineEdit, SIGNAL(editingFinished()), this, SLOT(handleFreePortsChanged()));
+    connect(m_ui->makeKeyFileDefaultButton, SIGNAL(clicked()), SLOT(setDefaultKeyFilePath()));
+
+    initGui();
+}
+
+GenericLinuxDeviceConfigurationWidget::~GenericLinuxDeviceConfigurationWidget()
+{
+    delete m_ui;
+}
+
+void GenericLinuxDeviceConfigurationWidget::authenticationTypeChanged()
+{
+    Utils::SshConnectionParameters sshParams = deviceConfiguration()->sshParameters();
+    const bool usePassword = m_ui->passwordButton->isChecked();
+    sshParams.authenticationType = usePassword
+        ? Utils::SshConnectionParameters::AuthenticationByPassword
+        : Utils::SshConnectionParameters::AuthenticationByKey;
+    deviceConfiguration()->setSshParameters(sshParams);
+    m_ui->pwdLineEdit->setEnabled(usePassword);
+    m_ui->passwordLabel->setEnabled(usePassword);
+    m_ui->keyFileLineEdit->setEnabled(!usePassword);
+    m_ui->keyLabel->setEnabled(!usePassword);
+    m_ui->makeKeyFileDefaultButton->setEnabled(!usePassword);
+}
+
+void GenericLinuxDeviceConfigurationWidget::hostNameEditingFinished()
+{
+    Utils::SshConnectionParameters sshParams = deviceConfiguration()->sshParameters();
+    sshParams.host = m_ui->hostLineEdit->text();
+    deviceConfiguration()->setSshParameters(sshParams);
+}
+
+void GenericLinuxDeviceConfigurationWidget::sshPortEditingFinished()
+{
+    Utils::SshConnectionParameters sshParams = deviceConfiguration()->sshParameters();
+    sshParams.port = m_ui->sshPortSpinBox->value();
+    deviceConfiguration()->setSshParameters(sshParams);
+}
+
+void GenericLinuxDeviceConfigurationWidget::timeoutEditingFinished()
+{
+    Utils::SshConnectionParameters sshParams = deviceConfiguration()->sshParameters();
+    sshParams.timeout = m_ui->timeoutSpinBox->value();
+    deviceConfiguration()->setSshParameters(sshParams);
+}
+
+void GenericLinuxDeviceConfigurationWidget::userNameEditingFinished()
+{
+    Utils::SshConnectionParameters sshParams = deviceConfiguration()->sshParameters();
+    sshParams.userName = m_ui->userLineEdit->text();
+    deviceConfiguration()->setSshParameters(sshParams);
+}
+
+void GenericLinuxDeviceConfigurationWidget::passwordEditingFinished()
+{
+    Utils::SshConnectionParameters sshParams = deviceConfiguration()->sshParameters();
+    sshParams.password = m_ui->pwdLineEdit->text();
+    deviceConfiguration()->setSshParameters(sshParams);
+}
+
+void GenericLinuxDeviceConfigurationWidget::keyFileEditingFinished()
+{
+    Utils::SshConnectionParameters sshParams = deviceConfiguration()->sshParameters();
+    sshParams.privateKeyFile = m_ui->keyFileLineEdit->path();
+    deviceConfiguration()->setSshParameters(sshParams);
+}
+
+void GenericLinuxDeviceConfigurationWidget::handleFreePortsChanged()
+{
+    deviceConfiguration()->setFreePorts(PortList::fromString(m_ui->portsLineEdit->text()));
+    updatePortsWarningLabel();
+}
+
+void GenericLinuxDeviceConfigurationWidget::showPassword(bool showClearText)
+{
+    m_ui->pwdLineEdit->setEchoMode(showClearText
+        ? QLineEdit::Normal : QLineEdit::Password);
+}
+
+void GenericLinuxDeviceConfigurationWidget::setDefaultKeyFilePath()
+{
+    emit defaultSshKeyFilePathChanged(m_ui->keyFileLineEdit->path());
+}
+
+void GenericLinuxDeviceConfigurationWidget::setPrivateKey(const QString &path)
+{
+    m_ui->keyFileLineEdit->setPath(path);
+    keyFileEditingFinished();
+}
+
+void GenericLinuxDeviceConfigurationWidget::updatePortsWarningLabel()
+{
+    m_ui->portsWarningLabel->setVisible(!deviceConfiguration()->freePorts().hasMore());
+}
+
+void GenericLinuxDeviceConfigurationWidget::initGui()
+{
+    m_ui->portsWarningLabel->setPixmap(QPixmap(":/projectexplorer/images/compile_error.png"));
+    m_ui->portsWarningLabel->setToolTip(QLatin1String("<font color=\"red\">")
+        + tr("You will need at least one port.") + QLatin1String("</font>"));
+    m_ui->keyFileLineEdit->setExpectedKind(Utils::PathChooser::File);
+    m_ui->keyFileLineEdit->lineEdit()->setMinimumWidth(0);
+    QRegExpValidator * const portsValidator
+        = new QRegExpValidator(QRegExp(PortList::regularExpression()), this);
+    m_ui->portsLineEdit->setValidator(portsValidator);
+
+    const Utils::SshConnectionParameters &sshParams = deviceConfiguration()->sshParameters();
+
+    if (sshParams.authenticationType == Utils::SshConnectionParameters::AuthenticationByPassword)
+        m_ui->passwordButton->setChecked(true);
+    else
+        m_ui->keyButton->setChecked(true);
+    m_ui->timeoutSpinBox->setValue(sshParams.timeout);
+    m_ui->hostLineEdit->setEnabled(!deviceConfiguration()->isAutoDetected());
+    m_ui->sshPortSpinBox->setEnabled(!deviceConfiguration()->isAutoDetected());
+
+    m_ui->hostLineEdit->setText(sshParams.host);
+    m_ui->sshPortSpinBox->setValue(sshParams.port);
+    m_ui->portsLineEdit->setText(deviceConfiguration()->freePorts().toString());
+    m_ui->timeoutSpinBox->setValue(sshParams.timeout);
+    m_ui->userLineEdit->setText(sshParams.userName);
+    m_ui->pwdLineEdit->setText(sshParams.password);
+    m_ui->keyFileLineEdit->setPath(sshParams.privateKeyFile);
+    m_ui->showPasswordCheckBox->setChecked(false);
+    updatePortsWarningLabel();
+}
diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.h b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.h
new file mode 100644
index 0000000000000000000000000000000000000000..7e5a3ef30dbdb349d88863a669b749a0141ae88b
--- /dev/null
+++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.h
@@ -0,0 +1,77 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** GNU Lesser General Public License Usage
+**
+** 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.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#ifndef REMOTELINUX_GENERICLINUXDEVICECONFIGURATIONWIDGET_H
+#define REMOTELINUX_GENERICLINUXDEVICECONFIGURATIONWIDGET_H
+
+#include "remotelinux_export.h"
+
+#include "linuxdeviceconfiguration.h"
+
+namespace RemoteLinux {
+
+namespace Ui {
+class GenericLinuxDeviceConfigurationWidget;
+}
+
+class REMOTELINUX_EXPORT GenericLinuxDeviceConfigurationWidget : public ILinuxDeviceConfigurationWidget
+{
+    Q_OBJECT
+
+public:
+    explicit GenericLinuxDeviceConfigurationWidget(
+            const LinuxDeviceConfiguration::Ptr &deviceConfig,
+            QWidget *parent = 0);
+    ~GenericLinuxDeviceConfigurationWidget();
+
+private slots:
+    void authenticationTypeChanged();
+    void hostNameEditingFinished();
+    void sshPortEditingFinished();
+    void timeoutEditingFinished();
+    void userNameEditingFinished();
+    void passwordEditingFinished();
+    void keyFileEditingFinished();
+    void showPassword(bool showClearText);
+    void handleFreePortsChanged();
+    void setDefaultKeyFilePath();
+    void setPrivateKey(const QString &path);
+
+private:
+    void updatePortsWarningLabel();
+    void initGui();
+
+    Ui::GenericLinuxDeviceConfigurationWidget *m_ui;
+};
+
+} // namespace RemoteLinux
+
+#endif // REMOTELINUX_GENERICLINUXDEVICECONFIGURATIONWIDGET_H
diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.ui b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.ui
new file mode 100644
index 0000000000000000000000000000000000000000..6a72bec0548353f1e57c72bf7df9be6917d7cbb7
--- /dev/null
+++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.ui
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>RemoteLinux::GenericLinuxDeviceConfigurationWidget</class>
+ <widget class="QWidget" name="RemoteLinux::GenericLinuxDeviceConfigurationWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>393</width>
+    <height>170</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QFormLayout" name="formLayout">
+   <property name="fieldGrowthPolicy">
+    <enum>QFormLayout::FieldsStayAtSizeHint</enum>
+   </property>
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QLabel" name="authTypeLabel">
+     <property name="text">
+      <string>Authentication type:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="QWidget" name="authTypeButtonsWidget" native="true">
+     <layout class="QHBoxLayout" name="horizontalLayout_3">
+      <property name="margin">
+       <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>&amp;Key</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <spacer name="horizontalSpacer_4">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QLabel" name="hostNameLabel">
+     <property name="text">
+      <string>&amp;Host name:</string>
+     </property>
+     <property name="buddy">
+      <cstring>hostLineEdit</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <layout class="QHBoxLayout" name="horizontalLayout_4">
+     <item>
+      <widget class="QLineEdit" name="hostLineEdit">
+       <property name="placeholderText">
+        <string>IP or host name of the device</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="sshPortLabel">
+       <property name="text">
+        <string>&amp;SSH port:</string>
+       </property>
+       <property name="buddy">
+        <cstring>sshPortSpinBox</cstring>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QSpinBox" name="sshPortSpinBox">
+       <property name="minimum">
+        <number>0</number>
+       </property>
+       <property name="maximum">
+        <number>65535</number>
+       </property>
+       <property name="value">
+        <number>22</number>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="2" column="0">
+    <widget class="QLabel" name="freePortsLabel">
+     <property name="text">
+      <string>Free ports:</string>
+     </property>
+     <property name="buddy">
+      <cstring>portsLineEdit</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="1">
+    <layout class="QHBoxLayout" name="horizontalLayout_7">
+     <item>
+      <widget class="QLineEdit" name="portsLineEdit">
+       <property name="toolTip">
+        <string>You can enter lists and ranges like this: 1024,1026-1028,1030</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="portsWarningLabel">
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="connectionTimeoutLabel">
+       <property name="text">
+        <string>Timeout:</string>
+       </property>
+       <property name="buddy">
+        <cstring>timeoutSpinBox</cstring>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QSpinBox" name="timeoutSpinBox">
+       <property name="suffix">
+        <string>s</string>
+       </property>
+       <property name="maximum">
+        <number>10000</number>
+       </property>
+       <property name="singleStep">
+        <number>10</number>
+       </property>
+       <property name="value">
+        <number>1000</number>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="3" column="0">
+    <widget class="QLabel" name="userNameLabel">
+     <property name="text">
+      <string>&amp;Username:</string>
+     </property>
+     <property name="buddy">
+      <cstring>userLineEdit</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="1">
+    <widget class="QLineEdit" name="userLineEdit"/>
+   </item>
+   <item row="4" column="0">
+    <widget class="QLabel" name="passwordLabel">
+     <property name="text">
+      <string>&amp;Password:</string>
+     </property>
+     <property name="buddy">
+      <cstring>pwdLineEdit</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="4" column="1">
+    <layout class="QHBoxLayout" name="horizontalLayout_6">
+     <item>
+      <widget class="QLineEdit" name="pwdLineEdit">
+       <property name="echoMode">
+        <enum>QLineEdit::Password</enum>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="showPasswordCheckBox">
+       <property name="text">
+        <string>Show password</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="5" column="0">
+    <widget class="QLabel" name="keyLabel">
+     <property name="text">
+      <string>Private key file:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="5" column="1">
+    <layout class="QHBoxLayout" name="horizontalLayout_8">
+     <item>
+      <widget class="Utils::PathChooser" name="keyFileLineEdit" native="true"/>
+     </item>
+     <item>
+      <widget class="QPushButton" name="makeKeyFileDefaultButton">
+       <property name="text">
+        <string>Set as Default</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+  <zorder>passwordLabel</zorder>
+  <zorder>authTypeButtonsWidget</zorder>
+  <zorder>hostNameLabel</zorder>
+  <zorder>userNameLabel</zorder>
+  <zorder>freePortsLabel</zorder>
+  <zorder>userLineEdit</zorder>
+  <zorder>authTypeLabel</zorder>
+  <zorder>keyLabel</zorder>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>Utils::PathChooser</class>
+   <extends>QWidget</extends>
+   <header location="global">utils/pathchooser.h</header>
+   <container>1</container>
+   <slots>
+    <signal>editingFinished()</signal>
+    <signal>browsingFinished()</signal>
+   </slots>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp
index af8866dc52c6705e23234e14265d231eddaab39e..c35ca9b219bbd0a12e08e27f800b403f81850953 100644
--- a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp
+++ b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp
@@ -31,10 +31,12 @@
 **************************************************************************/
 #include "linuxdeviceconfiguration.h"
 
+#include "linuxdeviceconfigurations.h"
 #include "portlist.h"
 #include "remotelinux_constants.h"
 
 #include <utils/ssh/sshconnection.h>
+#include <utils/qtcassert.h>
 
 #include <QSettings>
 #include <QDesktopServices>
@@ -264,4 +266,19 @@ void LinuxDeviceConfiguration::setDefault(bool isDefault) { d->isDefault = isDef
 
 const LinuxDeviceConfiguration::Id LinuxDeviceConfiguration::InvalidId = 0;
 
+
+ILinuxDeviceConfigurationWidget::ILinuxDeviceConfigurationWidget(
+        const LinuxDeviceConfiguration::Ptr &deviceConfig,
+        QWidget *parent)
+    : QWidget(parent),
+      m_deviceConfiguration(deviceConfig)
+{
+    QTC_CHECK(m_deviceConfiguration);
+}
+
+LinuxDeviceConfiguration::Ptr ILinuxDeviceConfigurationWidget::deviceConfiguration() const
+{
+    return m_deviceConfiguration;
+}
+
 } // namespace RemoteLinux
diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.h b/src/plugins/remotelinux/linuxdeviceconfiguration.h
index 9e9b9a56a627667654a167b97cad721ce905049a..d3504c4782c68a245e46d2312361d3cb1ad7e8b0 100644
--- a/src/plugins/remotelinux/linuxdeviceconfiguration.h
+++ b/src/plugins/remotelinux/linuxdeviceconfiguration.h
@@ -82,6 +82,10 @@ public:
     QVariantHash attributes() const;
     QVariant attribute(const QString &name) const;
 
+    void setSshParameters(const Utils::SshConnectionParameters &sshParameters);
+    void setFreePorts(const PortList &freePorts);
+    void setAttribute(const QString &name, const QVariant &value);
+
     static QString defaultPrivateKeyFilePath();
     static QString defaultPublicKeyFilePath();
 
@@ -106,9 +110,6 @@ private:
     void setDisplayName(const QString &name);
     void setInternalId(Id id);
     void setDefault(bool isDefault);
-    void setSshParameters(const Utils::SshConnectionParameters &sshParameters);
-    void setFreePorts(const PortList &freePorts);
-    void setAttribute(const QString &name, const QVariant &value);
     void save(QSettings &settings) const;
 
     Internal::LinuxDeviceConfigurationPrivate *d;
@@ -137,7 +138,35 @@ protected:
 
 
 /*!
-  \class ProjectExplorer::ILinuxDeviceConfiguration factory.
+ \class RemoteLinux::LinuxDeviceConfigurationWidget : public QWidget
+
+ \brief Provides an interface for the widget configuring a LinuxDeviceConfiguration
+
+ A class implementing this interface will display a widget in the configuration
+ options page "Linux Device", in the "Device configuration" tab.
+ It's used to configure a particular device, the default widget is empty.
+*/
+class REMOTELINUX_EXPORT ILinuxDeviceConfigurationWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    ILinuxDeviceConfigurationWidget(const LinuxDeviceConfiguration::Ptr &deviceConfig,
+                                    QWidget *parent = 0);
+
+signals:
+    void defaultSshKeyFilePathChanged(const QString &path);
+
+protected:
+    LinuxDeviceConfiguration::Ptr deviceConfiguration() const;
+
+private:
+    LinuxDeviceConfiguration::Ptr m_deviceConfiguration;
+};
+
+
+/*!
+  \class RemoteLinux::ILinuxDeviceConfiguration factory.
 
   \brief Provides an interface for classes providing services related to certain type of Linux devices.
 
@@ -162,6 +191,12 @@ public:
     */
     virtual ILinuxDeviceConfigurationWizard *createWizard(QWidget *parent = 0) const = 0;
 
+    /*!
+      A widget that can configure the device this factory supports.
+    */
+    virtual ILinuxDeviceConfigurationWidget *createWidget(
+            const LinuxDeviceConfiguration::Ptr &deviceConfig,
+            QWidget *parent = 0) const = 0;
 
     /*!
       Returns true iff this factory supports the given device type.
diff --git a/src/plugins/remotelinux/linuxdeviceconfigurations.cpp b/src/plugins/remotelinux/linuxdeviceconfigurations.cpp
index 58958662f641806726bff885ccc725c775298d2d..d1387ee6cfea8ab8ee0065676510fe56745fed28 100644
--- a/src/plugins/remotelinux/linuxdeviceconfigurations.cpp
+++ b/src/plugins/remotelinux/linuxdeviceconfigurations.cpp
@@ -268,6 +268,12 @@ LinuxDeviceConfigurations::LinuxDeviceConfigurations(QObject *parent)
 {
 }
 
+LinuxDeviceConfiguration::Ptr LinuxDeviceConfigurations::mutableDeviceAt(int idx) const
+{
+    Q_ASSERT(idx >= 0 && idx < rowCount());
+    return d->devConfigs.at(idx);
+}
+
 void LinuxDeviceConfigurations::blockCloning()
 {
     QTC_ASSERT(!cloningBlocked, return);
diff --git a/src/plugins/remotelinux/linuxdeviceconfigurations.h b/src/plugins/remotelinux/linuxdeviceconfigurations.h
index 3e4a1adcb35e986a7ec26c00bc0d0824b7c6b3ad..b79be8a165806545ea46c7c5772e122e8f96f30a 100644
--- a/src/plugins/remotelinux/linuxdeviceconfigurations.h
+++ b/src/plugins/remotelinux/linuxdeviceconfigurations.h
@@ -70,7 +70,6 @@ public:
     int indexForInternalId(LinuxDeviceConfiguration::Id internalId) const;
     LinuxDeviceConfiguration::Id internalId(LinuxDeviceConfiguration::ConstPtr devConf) const;
 
-    void setDefaultSshKeyFilePath(const QString &path);
     QString defaultSshKeyFilePath() const;
 
     void addConfiguration(const LinuxDeviceConfiguration::Ptr &devConfig);
@@ -85,6 +84,9 @@ public:
     virtual QVariant data(const QModelIndex &index,
         int role = Qt::DisplayRole) const;
 
+public slots:
+    void setDefaultSshKeyFilePath(const QString &path);
+
 signals:
     void updated();
     void cloningPossible();
@@ -92,6 +94,8 @@ signals:
 private:
     LinuxDeviceConfigurations(QObject *parent);
 
+    LinuxDeviceConfiguration::Ptr mutableDeviceAt(int index) const;
+
     static void blockCloning();
     static void unblockCloning();
 
diff --git a/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.cpp b/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.cpp
index 8344295e5ab02d7f6fdc121286f980fa9737b3e6..4184dcb14a728caf54816fd60d4945e02bfddc36 100644
--- a/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.cpp
+++ b/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.cpp
@@ -102,7 +102,8 @@ LinuxDeviceConfigurationsSettingsWidget::LinuxDeviceConfigurationsSettingsWidget
       m_devConfigs(LinuxDeviceConfigurations::cloneInstance()),
       m_nameValidator(new NameValidator(m_devConfigs.data(), this)),
       m_saveSettingsRequested(false),
-      m_additionalActionsMapper(new QSignalMapper(this))
+      m_additionalActionsMapper(new QSignalMapper(this)),
+      m_configWidget(0)
 {
     LinuxDeviceConfigurations::blockCloning();
     initGui();
@@ -125,23 +126,11 @@ QString LinuxDeviceConfigurationsSettingsWidget::searchKeywords() const
 {
     QString rc;
     QTextStream(&rc) << m_ui->configurationLabel->text()
-        << ' ' << m_ui->sshPortLabel->text()
-        << ' ' << m_ui->keyButton->text()
-        << ' ' << m_ui->passwordButton->text()
-        << ' ' << m_ui->authTypeLabel->text()
-        << ' ' << m_ui->connectionTimeoutLabel->text()
         << ' ' << m_ui->deviceTypeLabel->text()
         << ' ' << m_ui->deviceTypeValueLabel->text()
         << ' ' << m_ui->deviceNameLabel->text()
-        << ' ' << m_ui->hostNameLabel->text()
-        << ' ' << m_ui->keyLabel->text()
-        << ' ' << m_ui->nameLineEdit->text()
-        << ' ' << m_ui->passwordLabel->text()
-        << ' ' << m_ui->freePortsLabel->text()
-        << ' ' << m_ui->pwdLineEdit->text()
-        << ' ' << m_ui->timeoutSpinBox->value()
-        << ' ' << m_ui->userLineEdit->text()
-        << ' ' << m_ui->userNameLabel->text();
+        << ' ' << m_ui->nameLineEdit->text();
+    if (m_configWidget)
     rc.remove(QLatin1Char('&'));
     return rc;
 }
@@ -149,18 +138,9 @@ QString LinuxDeviceConfigurationsSettingsWidget::searchKeywords() const
 void LinuxDeviceConfigurationsSettingsWidget::initGui()
 {
     m_ui->setupUi(this);
-    m_ui->portsWarningLabel->setPixmap(QPixmap(":/projectexplorer/images/compile_error.png"));
-    m_ui->portsWarningLabel->setToolTip(QLatin1String("<font color=\"red\">")
-        + tr("You will need at least one port.") + QLatin1String("</font>"));
     m_ui->configurationComboBox->setModel(m_devConfigs.data());
     m_ui->nameLineEdit->setValidator(m_nameValidator);
-    m_ui->keyFileLineEdit->setExpectedKind(Utils::PathChooser::File);
-    m_ui->keyFileLineEdit->lineEdit()->setMinimumWidth(0);
-    QRegExpValidator * const portsValidator
-        = new QRegExpValidator(QRegExp(PortList::regularExpression()), this);
-    m_ui->portsLineEdit->setValidator(portsValidator);
-    connect(m_ui->makeKeyFileDefaultButton, SIGNAL(clicked()),
-        SLOT(setDefaultKeyFilePath()));
+
     int lastIndex = Core::ICore::settings()
         ->value(LastDeviceConfigIndexKey, 0).toInt();
     if (lastIndex == -1)
@@ -207,20 +187,13 @@ void LinuxDeviceConfigurationsSettingsWidget::displayCurrent()
     const LinuxDeviceConfiguration::ConstPtr &current = currentConfig();
     m_ui->defaultDeviceButton->setEnabled(!current->isDefault());
     m_ui->osTypeValueLabel->setText(RemoteLinuxUtils::osTypeToString(current->osType()));
-    const SshConnectionParameters &sshParams = current->sshParameters();
+
     if (current->deviceType() == LinuxDeviceConfiguration::Hardware)
         m_ui->deviceTypeValueLabel->setText(tr("Physical Device"));
     else
         m_ui->deviceTypeValueLabel->setText(tr("Emulator"));
-    if (sshParams.authenticationType == Utils::SshConnectionParameters::AuthenticationByPassword)
-        m_ui->passwordButton->setChecked(true);
-    else
-        m_ui->keyButton->setChecked(true);
     m_nameValidator->setDisplayName(current->displayName());
-    m_ui->timeoutSpinBox->setValue(sshParams.timeout);
     m_ui->removeConfigButton->setEnabled(!current->isAutoDetected());
-    m_ui->hostLineEdit->setReadOnly(current->isAutoDetected());
-    m_ui->sshPortSpinBox->setEnabled(!current->isAutoDetected());
     fillInValues();
 }
 
@@ -228,16 +201,6 @@ void LinuxDeviceConfigurationsSettingsWidget::fillInValues()
 {
     const LinuxDeviceConfiguration::ConstPtr &current = currentConfig();
     m_ui->nameLineEdit->setText(current->displayName());
-    const SshConnectionParameters &sshParams = current->sshParameters();
-    m_ui->hostLineEdit->setText(sshParams.host);
-    m_ui->sshPortSpinBox->setValue(sshParams.port);
-    m_ui->portsLineEdit->setText(current->freePorts().toString());
-    m_ui->timeoutSpinBox->setValue(sshParams.timeout);
-    m_ui->userLineEdit->setText(sshParams.userName);
-    m_ui->pwdLineEdit->setText(sshParams.password);
-    m_ui->keyFileLineEdit->setPath(sshParams.privateKeyFile);
-    m_ui->showPasswordCheckBox->setChecked(false);
-    updatePortsWarningLabel();
 }
 
 void LinuxDeviceConfigurationsSettingsWidget::saveSettings()
@@ -267,103 +230,26 @@ void LinuxDeviceConfigurationsSettingsWidget::configNameEditingFinished()
     m_nameValidator->setDisplayName(newName);
 }
 
-void LinuxDeviceConfigurationsSettingsWidget::authenticationTypeChanged()
-{
-    SshConnectionParameters sshParams = currentConfig()->sshParameters();
-    const bool usePassword = m_ui->passwordButton->isChecked();
-    sshParams.authenticationType = usePassword
-        ? SshConnectionParameters::AuthenticationByPassword
-        : SshConnectionParameters::AuthenticationByKey;
-    m_devConfigs->setSshParameters(currentIndex(), sshParams);
-    m_ui->pwdLineEdit->setEnabled(usePassword);
-    m_ui->passwordLabel->setEnabled(usePassword);
-    m_ui->keyFileLineEdit->setEnabled(!usePassword);
-    m_ui->keyLabel->setEnabled(!usePassword);
-    m_ui->makeKeyFileDefaultButton->setEnabled(!usePassword);
-}
-
-void LinuxDeviceConfigurationsSettingsWidget::hostNameEditingFinished()
-{
-    SshConnectionParameters sshParams = currentConfig()->sshParameters();
-    sshParams.host = m_ui->hostLineEdit->text();
-    m_devConfigs->setSshParameters(currentIndex(), sshParams);
-}
-
-void LinuxDeviceConfigurationsSettingsWidget::sshPortEditingFinished()
-{
-    SshConnectionParameters sshParams = currentConfig()->sshParameters();
-    sshParams.port = m_ui->sshPortSpinBox->value();
-    m_devConfigs->setSshParameters(currentIndex(), sshParams);
-}
-
-void LinuxDeviceConfigurationsSettingsWidget::timeoutEditingFinished()
-{
-    SshConnectionParameters sshParams = currentConfig()->sshParameters();
-    sshParams.timeout = m_ui->timeoutSpinBox->value();
-    m_devConfigs->setSshParameters(currentIndex(), sshParams);
-}
-
-void LinuxDeviceConfigurationsSettingsWidget::userNameEditingFinished()
-{
-    SshConnectionParameters sshParams = currentConfig()->sshParameters();
-    sshParams.userName = m_ui->userLineEdit->text();
-    m_devConfigs->setSshParameters(currentIndex(), sshParams);
-}
-
-void LinuxDeviceConfigurationsSettingsWidget::passwordEditingFinished()
-{
-    SshConnectionParameters sshParams = currentConfig()->sshParameters();
-    sshParams.password = m_ui->pwdLineEdit->text();
-    m_devConfigs->setSshParameters(currentIndex(), sshParams);
-}
-
-void LinuxDeviceConfigurationsSettingsWidget::keyFileEditingFinished()
-{
-    SshConnectionParameters sshParams = currentConfig()->sshParameters();
-    sshParams.privateKeyFile = m_ui->keyFileLineEdit->path();
-    m_devConfigs->setSshParameters(currentIndex(), sshParams);
-}
-
-void LinuxDeviceConfigurationsSettingsWidget::handleFreePortsChanged()
-{
-    m_devConfigs->setFreePorts(currentIndex(), PortList::fromString(m_ui->portsLineEdit->text()));
-    updatePortsWarningLabel();
-}
-
-void LinuxDeviceConfigurationsSettingsWidget::showPassword(bool showClearText)
-{
-    m_ui->pwdLineEdit->setEchoMode(showClearText
-        ? QLineEdit::Normal : QLineEdit::Password);
-}
-
-void LinuxDeviceConfigurationsSettingsWidget::showGenerateSshKeyDialog()
-{
-    SshKeyCreationDialog dialog(this);
-    dialog.exec();
-}
-
-void LinuxDeviceConfigurationsSettingsWidget::setDefaultKeyFilePath()
-{
-    m_devConfigs->setDefaultSshKeyFilePath(m_ui->keyFileLineEdit->path());
-}
-
 void LinuxDeviceConfigurationsSettingsWidget::setDefaultDevice()
 {
     m_devConfigs->setDefaultDevice(currentIndex());
     m_ui->defaultDeviceButton->setEnabled(false);
 }
 
-void LinuxDeviceConfigurationsSettingsWidget::setPrivateKey(const QString &path)
+void LinuxDeviceConfigurationsSettingsWidget::showGenerateSshKeyDialog()
 {
-    m_ui->keyFileLineEdit->setPath(path);
-    keyFileEditingFinished();
+    SshKeyCreationDialog dialog(this);
+    dialog.exec();
 }
 
 void LinuxDeviceConfigurationsSettingsWidget::currentConfigChanged(int index)
 {
     qDeleteAll(m_additionalActionButtons);
+    delete m_configWidget;
+    m_configWidget = 0;
     m_additionalActionButtons.clear();
-    m_ui->detailsWidget->setEnabled(false);
+    m_ui->generalGroupBox->setEnabled(false);
+    m_ui->osSpecificGroupBox->setEnabled(false);
     if (index == -1) {
         m_ui->removeConfigButton->setEnabled(false);
         m_ui->generateKeyButton->setEnabled(false);
@@ -376,13 +262,24 @@ void LinuxDeviceConfigurationsSettingsWidget::currentConfigChanged(int index)
         if (factory) {
             const QStringList &actionIds = factory->supportedDeviceActionIds();
             foreach (const QString &actionId, actionIds) {
-                QPushButton * const button = new QPushButton(factory->displayNameForActionId(actionId));
+                QPushButton * const button = new QPushButton(
+                            factory->displayNameForActionId(actionId));
                 m_additionalActionButtons << button;
                 connect(button, SIGNAL(clicked()), m_additionalActionsMapper, SLOT(map()));
                 m_additionalActionsMapper->setMapping(button, actionId);
                 m_ui->buttonsLayout->insertWidget(m_ui->buttonsLayout->count() - 1, button);
             }
-            m_ui->detailsWidget->setEnabled(factory->isUserEditable());
+            if (!m_ui->osSpecificGroupBox->layout())
+                new QVBoxLayout(m_ui->osSpecificGroupBox);
+            m_configWidget = factory->createWidget(m_devConfigs->mutableDeviceAt(currentIndex()),
+                                                   m_ui->osSpecificGroupBox);
+            if (m_configWidget) {
+                connect(m_configWidget, SIGNAL(defaultSshKeyFilePathChanged(QString)),
+                        m_devConfigs.data(), SLOT(setDefaultSshKeyFilePath(QString)));
+                m_ui->osSpecificGroupBox->layout()->addWidget(m_configWidget);
+                m_ui->osSpecificGroupBox->setEnabled(factory->isUserEditable());
+            }
+            m_ui->generalGroupBox->setEnabled(factory->isUserEditable());
         }
         m_ui->configurationComboBox->setCurrentIndex(index);
         displayCurrent();
@@ -394,19 +291,6 @@ void LinuxDeviceConfigurationsSettingsWidget::clearDetails()
     m_ui->nameLineEdit->clear();
     m_ui->osTypeValueLabel->clear();
     m_ui->deviceTypeValueLabel->clear();
-    m_ui->hostLineEdit->clear();
-    m_ui->sshPortSpinBox->clear();
-    m_ui->timeoutSpinBox->clear();
-    m_ui->userLineEdit->clear();
-    m_ui->pwdLineEdit->clear();
-    m_ui->portsLineEdit->clear();
-    m_ui->portsWarningLabel->clear();
-    m_ui->keyFileLineEdit->lineEdit()->clear();
-}
-
-void LinuxDeviceConfigurationsSettingsWidget::updatePortsWarningLabel()
-{
-    m_ui->portsWarningLabel->setVisible(!currentConfig()->freePorts().hasMore());
 }
 
 const ILinuxDeviceConfigurationFactory *LinuxDeviceConfigurationsSettingsWidget::factoryForCurrentConfig() const
diff --git a/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.h b/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.h
index fd441fb19aa39556fddd923c2f17cd1a8b3f43ff..855bacef8035bb6df0efe3a35502acaf46f654c4 100644
--- a/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.h
+++ b/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.h
@@ -47,6 +47,7 @@ namespace RemoteLinux {
 class ILinuxDeviceConfigurationFactory;
 class LinuxDeviceConfiguration;
 class LinuxDeviceConfigurations;
+class ILinuxDeviceConfigurationWidget;
 
 namespace Internal {
 namespace Ui { class LinuxDeviceConfigurationsSettingsWidget; }
@@ -67,20 +68,9 @@ private slots:
     void addConfig();
     void deleteConfig();
     void configNameEditingFinished();
-    void authenticationTypeChanged();
-    void hostNameEditingFinished();
-    void sshPortEditingFinished();
-    void timeoutEditingFinished();
-    void userNameEditingFinished();
-    void passwordEditingFinished();
-    void keyFileEditingFinished();
-    void showPassword(bool showClearText);
-    void handleFreePortsChanged();
-    void setDefaultKeyFilePath();
     void setDefaultDevice();
 
     void showGenerateSshKeyDialog();
-    void setPrivateKey(const QString &path);
 
     void handleAdditionalActionRequest(const QString &actionId);
 
@@ -92,7 +82,6 @@ private:
     void clearDetails();
     QString parseTestOutput();
     void fillInValues();
-    void updatePortsWarningLabel();
     const ILinuxDeviceConfigurationFactory *factoryForCurrentConfig() const;
 
     Ui::LinuxDeviceConfigurationsSettingsWidget *m_ui;
@@ -101,6 +90,7 @@ private:
     bool m_saveSettingsRequested;
     QList<QPushButton *> m_additionalActionButtons;
     QSignalMapper * const m_additionalActionsMapper;
+    ILinuxDeviceConfigurationWidget *m_configWidget;
 };
 
 } // namespace Internal
diff --git a/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.ui b/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.ui
index 651146308fdd273c073157e6acffe208e4f1c8b2..bdee36b870a086ca534bc37458c52232aa42ee6b 100644
--- a/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.ui
+++ b/src/plugins/remotelinux/linuxdeviceconfigurationssettingswidget.ui
@@ -47,282 +47,78 @@
       </layout>
      </item>
      <item>
-      <widget class="QFrame" name="frame">
-       <property name="frameShape">
-        <enum>QFrame::StyledPanel</enum>
+      <widget class="QGroupBox" name="generalGroupBox">
+       <property name="title">
+        <string>General</string>
        </property>
-       <property name="frameShadow">
-        <enum>QFrame::Raised</enum>
-       </property>
-       <layout class="QVBoxLayout" name="verticalLayout_2">
-        <item>
-         <widget class="QWidget" name="detailsWidget" native="true">
-          <property name="enabled">
-           <bool>false</bool>
+       <layout class="QFormLayout" name="formLayout_3">
+        <property name="fieldGrowthPolicy">
+         <enum>QFormLayout::FieldsStayAtSizeHint</enum>
+        </property>
+        <item row="0" column="0">
+         <widget class="QLabel" name="deviceNameLabel">
+          <property name="text">
+           <string>&amp;Name:</string>
+          </property>
+          <property name="buddy">
+           <cstring>nameLineEdit</cstring>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="1">
+         <widget class="QLineEdit" name="nameLineEdit"/>
+        </item>
+        <item row="1" column="0">
+         <widget class="QLabel" name="oSTypeLabel">
+          <property name="text">
+           <string>OS type:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="1">
+         <widget class="QLabel" name="osTypeValueLabel">
+          <property name="text">
+           <string/>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="0">
+         <widget class="QLabel" name="deviceTypeLabel">
+          <property name="text">
+           <string>Device type:</string>
           </property>
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
+         </widget>
+        </item>
+        <item row="2" column="1">
+         <widget class="QLabel" name="deviceTypeValueLabel">
+          <property name="text">
+           <string/>
           </property>
-          <layout class="QFormLayout" name="formLayout_2">
-           <property name="fieldGrowthPolicy">
-            <enum>QFormLayout::FieldsStayAtSizeHint</enum>
-           </property>
-           <property name="margin">
-            <number>0</number>
-           </property>
-           <item row="0" column="0">
-            <widget class="QLabel" name="deviceNameLabel">
-             <property name="text">
-              <string>&amp;Name:</string>
-             </property>
-             <property name="buddy">
-              <cstring>nameLineEdit</cstring>
-             </property>
-            </widget>
-           </item>
-           <item row="0" column="1">
-            <widget class="QLineEdit" name="nameLineEdit"/>
-           </item>
-           <item row="1" column="0">
-            <widget class="QLabel" name="oSTypeLabel">
-             <property name="text">
-              <string>OS type:</string>
-             </property>
-            </widget>
-           </item>
-           <item row="1" column="1">
-            <widget class="QLabel" name="osTypeValueLabel">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-           <item row="2" column="0">
-            <widget class="QLabel" name="deviceTypeLabel">
-             <property name="text">
-              <string>Device type:</string>
-             </property>
-            </widget>
-           </item>
-           <item row="2" column="1">
-            <widget class="QLabel" name="deviceTypeValueLabel">
-             <property name="text">
-              <string/>
-             </property>
-            </widget>
-           </item>
-           <item row="3" column="0">
-            <widget class="QLabel" name="authTypeLabel">
-             <property name="text">
-              <string>Authentication type:</string>
-             </property>
-            </widget>
-           </item>
-           <item row="3" column="1">
-            <widget class="QWidget" name="authTypeButtonsWidget" native="true">
-             <layout class="QHBoxLayout" name="horizontalLayout_3">
-              <property name="margin">
-               <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>&amp;Key</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <spacer name="horizontalSpacer_4">
-                <property name="orientation">
-                 <enum>Qt::Horizontal</enum>
-                </property>
-                <property name="sizeHint" stdset="0">
-                 <size>
-                  <width>40</width>
-                  <height>20</height>
-                 </size>
-                </property>
-               </spacer>
-              </item>
-             </layout>
-            </widget>
-           </item>
-           <item row="4" column="0">
-            <widget class="QLabel" name="hostNameLabel">
-             <property name="text">
-              <string>&amp;Host name:</string>
-             </property>
-             <property name="buddy">
-              <cstring>hostLineEdit</cstring>
-             </property>
-            </widget>
-           </item>
-           <item row="4" column="1">
-            <layout class="QHBoxLayout" name="horizontalLayout_4">
-             <item>
-              <widget class="QLineEdit" name="hostLineEdit">
-               <property name="placeholderText">
-                <string>IP or host name of the device</string>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QLabel" name="sshPortLabel">
-               <property name="text">
-                <string>&amp;SSH port:</string>
-               </property>
-               <property name="buddy">
-                <cstring>sshPortSpinBox</cstring>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QSpinBox" name="sshPortSpinBox">
-               <property name="minimum">
-                <number>0</number>
-               </property>
-               <property name="maximum">
-                <number>65535</number>
-               </property>
-               <property name="value">
-                <number>22</number>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item row="6" column="0">
-            <widget class="QLabel" name="freePortsLabel">
-             <property name="text">
-              <string>Free ports:</string>
-             </property>
-             <property name="buddy">
-              <cstring>portsLineEdit</cstring>
-             </property>
-            </widget>
-           </item>
-           <item row="6" column="1">
-            <layout class="QHBoxLayout" name="horizontalLayout_7">
-             <item>
-              <widget class="QLineEdit" name="portsLineEdit">
-               <property name="toolTip">
-                <string>You can enter lists and ranges like this: 1024,1026-1028,1030</string>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QLabel" name="portsWarningLabel">
-               <property name="text">
-                <string/>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QLabel" name="connectionTimeoutLabel">
-               <property name="text">
-                <string>Timeout:</string>
-               </property>
-               <property name="buddy">
-                <cstring>timeoutSpinBox</cstring>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QSpinBox" name="timeoutSpinBox">
-               <property name="suffix">
-                <string>s</string>
-               </property>
-               <property name="maximum">
-                <number>10000</number>
-               </property>
-               <property name="singleStep">
-                <number>10</number>
-               </property>
-               <property name="value">
-                <number>1000</number>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item row="7" column="0">
-            <widget class="QLabel" name="userNameLabel">
-             <property name="text">
-              <string>&amp;Username:</string>
-             </property>
-             <property name="buddy">
-              <cstring>userLineEdit</cstring>
-             </property>
-            </widget>
-           </item>
-           <item row="7" column="1">
-            <widget class="QLineEdit" name="userLineEdit"/>
-           </item>
-           <item row="8" column="0">
-            <widget class="QLabel" name="passwordLabel">
-             <property name="text">
-              <string>&amp;Password:</string>
-             </property>
-             <property name="buddy">
-              <cstring>pwdLineEdit</cstring>
-             </property>
-            </widget>
-           </item>
-           <item row="8" column="1">
-            <layout class="QHBoxLayout" name="horizontalLayout_6">
-             <item>
-              <widget class="QLineEdit" name="pwdLineEdit">
-               <property name="echoMode">
-                <enum>QLineEdit::Password</enum>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QCheckBox" name="showPasswordCheckBox">
-               <property name="text">
-                <string>Show password</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item row="9" column="0">
-            <widget class="QLabel" name="keyLabel">
-             <property name="text">
-              <string>Private key file:</string>
-             </property>
-            </widget>
-           </item>
-           <item row="9" column="1">
-            <layout class="QHBoxLayout" name="horizontalLayout_8">
-             <item>
-              <widget class="Utils::PathChooser" name="keyFileLineEdit" native="true"/>
-             </item>
-             <item>
-              <widget class="QPushButton" name="makeKeyFileDefaultButton">
-               <property name="text">
-                <string>Set as Default</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-          </layout>
          </widget>
         </item>
        </layout>
       </widget>
      </item>
+     <item>
+      <widget class="QGroupBox" name="osSpecificGroupBox">
+       <property name="title">
+        <string>OS Type Specific</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
     </layout>
    </item>
    <item>
@@ -403,68 +199,8 @@
    </item>
   </layout>
  </widget>
- <customwidgets>
-  <customwidget>
-   <class>Utils::PathChooser</class>
-   <extends>QWidget</extends>
-   <header location="global">utils/pathchooser.h</header>
-   <container>1</container>
-   <slots>
-    <signal>editingFinished()</signal>
-    <signal>browsingFinished()</signal>
-   </slots>
-  </customwidget>
- </customwidgets>
  <resources/>
  <connections>
-  <connection>
-   <sender>hostLineEdit</sender>
-   <signal>editingFinished()</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>hostNameEditingFinished()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>484</x>
-     <y>174</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>424</x>
-     <y>231</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>userLineEdit</sender>
-   <signal>editingFinished()</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>userNameEditingFinished()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>540</x>
-     <y>317</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>422</x>
-     <y>301</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>pwdLineEdit</sender>
-   <signal>editingFinished()</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>passwordEditingFinished()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>424</x>
-     <y>349</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>423</x>
-     <y>336</y>
-    </hint>
-   </hints>
-  </connection>
   <connection>
    <sender>addConfigButton</sender>
    <signal>clicked()</signal>
@@ -481,70 +217,6 @@
     </hint>
    </hints>
   </connection>
-  <connection>
-   <sender>passwordButton</sender>
-   <signal>toggled(bool)</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>authenticationTypeChanged()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>228</x>
-     <y>147</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>513</x>
-     <y>240</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>keyFileLineEdit</sender>
-   <signal>editingFinished()</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>keyFileEditingFinished()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>344</x>
-     <y>383</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>257</x>
-     <y>185</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>keyFileLineEdit</sender>
-   <signal>browsingFinished()</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>keyFileEditingFinished()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>344</x>
-     <y>383</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>257</x>
-     <y>185</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>keyButton</sender>
-   <signal>toggled(bool)</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>authenticationTypeChanged()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>279</x>
-     <y>156</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>525</x>
-     <y>351</y>
-    </hint>
-   </hints>
-  </connection>
   <connection>
    <sender>nameLineEdit</sender>
    <signal>editingFinished()</signal>
@@ -552,8 +224,8 @@
    <slot>configNameEditingFinished()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>520</x>
-     <y>82</y>
+     <x>204</x>
+     <y>90</y>
     </hint>
     <hint type="destinationlabel">
      <x>330</x>
@@ -577,102 +249,6 @@
     </hint>
    </hints>
   </connection>
-  <connection>
-   <sender>timeoutSpinBox</sender>
-   <signal>editingFinished()</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>timeoutEditingFinished()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>222</x>
-     <y>285</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>6</x>
-     <y>333</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>timeoutSpinBox</sender>
-   <signal>valueChanged(int)</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>timeoutEditingFinished()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>222</x>
-     <y>285</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>0</x>
-     <y>299</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>sshPortSpinBox</sender>
-   <signal>editingFinished()</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>sshPortEditingFinished()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>210</x>
-     <y>201</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>4</x>
-     <y>211</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>sshPortSpinBox</sender>
-   <signal>valueChanged(int)</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>sshPortEditingFinished()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>210</x>
-     <y>201</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>3</x>
-     <y>136</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>showPasswordCheckBox</sender>
-   <signal>toggled(bool)</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>showPassword(bool)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>539</x>
-     <y>347</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>3</x>
-     <y>262</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>portsLineEdit</sender>
-   <signal>editingFinished()</signal>
-   <receiver>RemoteLinux::Internal::LinuxDeviceConfigurationsSettingsWidget</receiver>
-   <slot>handleFreePortsChanged()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>310</x>
-     <y>230</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>0</x>
-     <y>393</y>
-    </hint>
-   </hints>
-  </connection>
   <connection>
    <sender>removeConfigButton</sender>
    <signal>clicked()</signal>
diff --git a/src/plugins/remotelinux/remotelinux.pro b/src/plugins/remotelinux/remotelinux.pro
index 8feab7f75df713c5bc1f221807c43304a4830eaf..186f71f1f85723b729e97d98e87e83e9a551b7eb 100644
--- a/src/plugins/remotelinux/remotelinux.pro
+++ b/src/plugins/remotelinux/remotelinux.pro
@@ -62,7 +62,8 @@ HEADERS += \
     startgdbserverdialog.h \
     remotelinuxcustomcommanddeployservice.h \
     remotelinuxcustomcommanddeploymentstep.h \
-    abstractembeddedlinuxtarget.h
+    abstractembeddedlinuxtarget.h \
+    genericlinuxdeviceconfigurationwidget.h
 
 SOURCES += \
     genericembeddedlinuxtarget.cpp \
@@ -118,7 +119,8 @@ SOURCES += \
     startgdbserverdialog.cpp \
     remotelinuxcustomcommanddeployservice.cpp \
     remotelinuxcustomcommanddeploymentstep.cpp \
-    abstractembeddedlinuxtarget.cpp
+    abstractembeddedlinuxtarget.cpp \
+    genericlinuxdeviceconfigurationwidget.cpp
 
 FORMS += \
     linuxdevicefactoryselectiondialog.ui \
@@ -128,7 +130,8 @@ FORMS += \
     linuxdeviceconfigurationssettingswidget.ui \
     sshkeycreationdialog.ui \
     remotelinuxdeployconfigurationwidget.ui \
-    profilesupdatedialog.ui
+    profilesupdatedialog.ui \
+    genericlinuxdeviceconfigurationwidget.ui
 
 RESOURCES += remotelinux.qrc