diff --git a/src/kcontrol/improfile.cpp b/src/kcontrol/improfile.cpp
index 6b86801..87e0a50 100644
--- a/src/kcontrol/improfile.cpp
+++ b/src/kcontrol/improfile.cpp
@@ -18,6 +18,8 @@
  ***************************************************************************/
 
 #include <KIcon>
+#include <KStandardDirs>
+#include <KProcess>
 
 #include "improfile.h"
 
@@ -33,6 +35,7 @@ IMProfile::IMProfile(KConfigGroup& group)
     m_icon = KIcon(iconName);
     m_command = group.readEntry<QString>("command", "");
     m_argument = group.readEntry<QString>("argument", "");
+    m_preferenceExe = group.readEntry<QString>("preferenceExe", "");
 
     KConfigGroup envvar(&group, "envvar");
     m_envVars = envvar.entryMap();
@@ -63,10 +66,25 @@ const QString& IMProfile::argument()
     return m_argument;
 }
 
+const QString& IMProfile::preferenceExe()
+{
+    return m_preferenceExe;
+}
+
 const QMap< QString, QString >& IMProfile::envVars()
 {
     return m_envVars;
 }
 
+void IMProfile::preferencesIM()
+{
+    const QString imPreferenceExe = KStandardDirs::findExe(m_preferenceExe, NULL);
+    if (!imPreferenceExe.isEmpty()) {
+        KProcess prefProc;
+	prefProc.setProgram(imPreferenceExe);
+	prefProc.execute();
+    }
+}
+
+}
 
-}
\ No newline at end of file
diff --git a/src/kcontrol/improfile.h b/src/kcontrol/improfile.h
index 529e618..af023f0 100644
--- a/src/kcontrol/improfile.h
+++ b/src/kcontrol/improfile.h
@@ -36,16 +36,20 @@ public:
     const QString& name();
     const QString& command();
     const QString& argument();
+    const QString& preferenceExe();
     const QMap<QString, QString>& envVars();
+    void  preferencesIM();
 private:
     QString m_id;
     QString m_name;
     QIcon m_icon;
     QString m_command;
     QString m_argument;
+    QString m_preferenceExe;
     QMap<QString, QString> m_envVars;
 };
 
 }
 
-#endif
\ No newline at end of file
+#endif
+
diff --git a/src/kcontrol/module.cpp b/src/kcontrol/module.cpp
index c2502f8..e49902b 100644
--- a/src/kcontrol/module.cpp
+++ b/src/kcontrol/module.cpp
@@ -59,6 +59,7 @@ Module::Module(QWidget *parent, const QVariantList &args) :
     ui->addEnvVarButton->setIcon(KIcon("list-add"));;
     ui->removeEnvVarButton->setIcon(KIcon("list-remove"));
     ui->imBrowseButton->setIcon(KIcon("document-open"));
+    ui->imPreferences->setIcon(KIcon("configure"));
 
     if (m_profilesConfig->groupList().isEmpty()) {
         ProfileGenerator::generateProfiles();
@@ -76,6 +77,7 @@ Module::Module(QWidget *parent, const QVariantList &args) :
             this, SLOT(currentChanged(QModelIndex, QModelIndex)));
     connect(ui->addEnvVarButton, SIGNAL(clicked(bool)), this, SLOT(addEnvVar()));
     connect(ui->imBrowseButton, SIGNAL(clicked(bool)), this, SLOT(browseIM()));
+    connect(ui->imPreferences, SIGNAL(clicked(bool)), this, SLOT(preferencesIM()));
     connect(ui->removeEnvVarButton, SIGNAL(clicked(bool)), this, SLOT(removeEnvVar()));
     connect(ui->imCommandEdit, SIGNAL(textChanged(QString)), this, SLOT(profileChanged()));
     connect(ui->imArgEdit, SIGNAL(textChanged(QString)), this, SLOT(profileChanged()));
@@ -327,6 +329,7 @@ void Module::loadProfile()
         ui->imArgEdit->setEnabled(false);
         ui->imCommandEdit->setEnabled(false);
         ui->imBrowseButton->setEnabled(false);
+        ui->imPreferences->setEnabled(false);
         ui->envvarTableWidget->setEnabled(false);
         ui->addEnvVarButton->setEnabled(false);
         ui->removeEnvVarButton->setEnabled(false);
@@ -336,6 +339,7 @@ void Module::loadProfile()
         ui->imArgEdit->setEnabled(true);
         ui->imCommandEdit->setEnabled(true);
         ui->imBrowseButton->setEnabled(true);
+        ui->imPreferences->setEnabled(true);
         ui->envvarTableWidget->setEnabled(true);
         ui->addEnvVarButton->setEnabled(true);
         ui->removeEnvVarButton->setEnabled(true);
@@ -473,4 +477,15 @@ void Module::browseIM()
         ui->imCommandEdit->setText(imExecuable);
 }
 
+void Module::preferencesIM()
+{
+    if (!m_listView->currentIndex().isValid()) {
+        return;
+    }
+
+    IMProfile *profile = static_cast<IMProfile*>(m_listView->currentIndex().internalPointer());
+    profile->preferencesIM();
+}
+
 }
+
diff --git a/src/kcontrol/module.h b/src/kcontrol/module.h
index 714dda1..8ad5bb0 100644
--- a/src/kcontrol/module.h
+++ b/src/kcontrol/module.h
@@ -84,6 +84,7 @@ protected slots:
     void addEnvVar();
     void removeEnvVar();
     void browseIM();
+    void preferencesIM();
 
 protected:
     void newProfile(const QString &name, const QString &icon);
diff --git a/src/kcontrol/module.ui b/src/kcontrol/module.ui
index 1ac853e..f7abde6 100644
--- a/src/kcontrol/module.ui
+++ b/src/kcontrol/module.ui
@@ -246,6 +246,16 @@
            </property>
           </widget>
          </item>
+         <item>
+          <widget class="KPushButton" name="imPreferences">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+          </widget>
+         </item>
         </layout>
        </item>
        <item row="1" column="0">
@@ -395,3 +405,4 @@
  <resources/>
  <connections/>
 </ui>
+
diff --git a/src/kcontrol/profilegenerator.cpp b/src/kcontrol/profilegenerator.cpp
index fbb76a7..23020d7 100644
--- a/src/kcontrol/profilegenerator.cpp
+++ b/src/kcontrol/profilegenerator.cpp
@@ -73,6 +73,7 @@ void ProfileGenerator::generateIBusProfile(KSharedConfigPtr& profilesConfig)
     ibus.writeEntry<QString>("icon", "ibus");
     ibus.writeEntry<QString>("command", "ibus-daemon");
     ibus.writeEntry<QString>("argument", "-x");
+    ibus.writeEntry<QString>("preferenceExe", "ibus-setup");
 
     KConfigGroup envvar(&ibus, "envvar");
     envvar.writeEntry("XMODIFIERS", "@im=ibus");
@@ -95,4 +96,5 @@ void ProfileGenerator::generateScimProfile(KSharedConfigPtr& profilesConfig)
     envvar.writeEntry("QT_IM_MODULE", "scim");
 }
 
-}
\ No newline at end of file
+}
+
