diff --git a/kde-cli-tools5.changes b/kde-cli-tools5.changes
index 071071c..beed75a 100644
--- a/kde-cli-tools5.changes
+++ b/kde-cli-tools5.changes
@@ -1,3 +1,12 @@
+-------------------------------------------------------------------
+Wed Jun  4 09:50:49 UTC 2014 - hrvoje.senjan@gmail.com
+
+- Add Source URL
+- Added update_to_latest_head.patch, to sync with latest KF5 API
+- Added kiconthemes-devel, ki18n-devel, kwindowsystem-devel and
+  pkgconfig(Qt5DBus) BuildRequires, needed by above patch
+- Bump Qt requires to 5.3.0
+
 -------------------------------------------------------------------
 Mon May 19 13:07:04 UTC 2014 - hrvoje.senjan@gmail.com
 
diff --git a/kde-cli-tools5.spec b/kde-cli-tools5.spec
index 89080f5..847cbe2 100644
--- a/kde-cli-tools5.spec
+++ b/kde-cli-tools5.spec
@@ -23,17 +23,23 @@ Summary:        Additional CLI tools for KDE applications
 License:        GPL-2.0+
 Group:          System/GUI/KDE
 Url:            http://www.kde.org
-Source0:        kde-cli-tools-%{version}.tar.xz
+Source:         http://download.kde.org/unstable/plasma/%{version}/src/kde-cli-tools-%{version}.tar.xz
+# PATCH-FIX-UPSTREAM update_to_latest_head.patch -- rev~b498096
+Patch0:         update_to_latest_head.patch
 BuildRequires:  kcmutils-devel
 BuildRequires:  kconfig-devel
 BuildRequires:  kdelibs4support-devel
 BuildRequires:  kdesu-devel
 BuildRequires:  kf5-filesystem
+BuildRequires:  ki18n-devel
+BuildRequires:  kiconthemes-devel
+BuildRequires:  kwindowsystem-devel
 BuildRequires:  xz
-BuildRequires:  pkgconfig(Qt5Svg) >= 5.2.0
-BuildRequires:  pkgconfig(Qt5Test) >= 5.2.0
-BuildRequires:  pkgconfig(Qt5Widgets) >= 5.2.0
-BuildRequires:  pkgconfig(Qt5X11Extras) >= 5.2.0
+BuildRequires:  pkgconfig(Qt5DBus) >= 5.3.0
+BuildRequires:  pkgconfig(Qt5Svg) >= 5.3.0
+BuildRequires:  pkgconfig(Qt5Test) >= 5.3.0
+BuildRequires:  pkgconfig(Qt5Widgets) >= 5.3.0
+BuildRequires:  pkgconfig(Qt5X11Extras) >= 5.3.0
 BuildRequires:  pkgconfig(x11)
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 
@@ -42,6 +48,7 @@ Additional CLI tools for KDE applications and workspaces.
 
 %prep
 %setup -q -n kde-cli-tools-%{version}
+%patch0 -p1
 sed -i '/^add_subdirectory(doc)/d' CMakeLists.txt
 sed -i '/^ecm_optional_add_subdirectory( po )/d' CMakeLists.txt
 
diff --git a/update_to_latest_head.patch b/update_to_latest_head.patch
new file mode 100644
index 0000000..4b9fda4
--- /dev/null
+++ b/update_to_latest_head.patch
@@ -0,0 +1,1889 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index d62ee8b..7b8e421 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,7 +1,7 @@
+ project(KDE-CLI-Tools)
+ 
+ cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
+-set(QT_MIN_VERSION "5.2.0")
++set(QT_MIN_VERSION "5.3.0")
+ 
+ find_package(ECM 0.0.11 REQUIRED NO_MODULE)
+ set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
+@@ -15,6 +15,7 @@ include(CheckIncludeFiles)
+ find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS
+     Widgets
+     Svg
++    DBus
+ )
+ 
+ find_package(Qt5X11Extras ${QT_MIN_VERSION} CONFIG)
+@@ -31,9 +32,12 @@ endif()
+ 
+ find_package(KF5 REQUIRED COMPONENTS
+     Config
++    IconThemes
++    I18n
+     KCMUtils
+     Su
+     KDE4Support
++    WindowSystem
+ )
+ 
+ feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
+diff --git a/doc/kdesu/CMakeLists.txt b/doc/kdesu/CMakeLists.txt
+index e43e73a..f5f2eb8 100644
+--- a/doc/kdesu/CMakeLists.txt
++++ b/doc/kdesu/CMakeLists.txt
+@@ -2,6 +2,6 @@
+ #
+ 
+ #
+-kdoctools_create_handbook(index.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en)
++kdoctools_create_handbook(index.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en SUBDIR kdesu)
+ 
+ kdoctools_create_manpage(man-kdesu.1.docbook 1 INSTALL_DESTINATION ${MAN_INSTALL_DIR})
+diff --git a/kdesu/kdesu.cpp b/kdesu/kdesu.cpp
+index d5c7f72..5d40ead 100644
+--- a/kdesu/kdesu.cpp
++++ b/kdesu/kdesu.cpp
+@@ -81,9 +81,9 @@ int main(int argc, char *argv[])
+     if (duser.isEmpty())
+         duser = "root";
+ 
+-    KAboutData aboutData("kdesu", 0, i18n("KDE su"),
++    KAboutData aboutData("kdesu", i18n("KDE su"),
+             Version, i18n("Runs a program with elevated privileges."),
+-            KAboutData::License_Artistic,
++            KAboutLicense::Artistic,
+             i18n("Copyright (c) 1998-2000 Geert Jansen, Pietro Iglio"));
+     aboutData.addAuthor(i18n("Geert Jansen"), i18n("Maintainer"),
+             "jansen@kde.org", "http://www.stack.nl/~geertj/");
+diff --git a/keditfiletype/CMakeLists.txt b/keditfiletype/CMakeLists.txt
+index 566e76a..45badef 100644
+--- a/keditfiletype/CMakeLists.txt
++++ b/keditfiletype/CMakeLists.txt
+@@ -10,7 +10,6 @@ set(libfiletypes_SRCS
+  mimetypewriter.cpp
+  newtypedlg.cpp
+  kserviceselectdlg.cpp
+- sharedmimeinfoversion.cpp
+ )
+ 
+ ########### next target ###############
+@@ -19,7 +18,13 @@ set(kcm_filetypes_SRCS filetypesview.cpp ${libfiletypes_SRCS})
+ 
+ add_library(kcm_filetypes MODULE ${kcm_filetypes_SRCS})
+ 
+-target_link_libraries(kcm_filetypes KF5::KDE4Support KF5::KIOWidgets)
++target_link_libraries(kcm_filetypes
++    KF5::ConfigWidgets
++    KF5::IconThemes
++    KF5::I18n
++    KF5::KIOWidgets
++    Qt5::DBus
++)
+ 
+ install(TARGETS kcm_filetypes  DESTINATION ${PLUGIN_INSTALL_DIR} )
+ 
+@@ -29,7 +34,14 @@ set(keditfiletype_SRCS keditfiletype.cpp ${libfiletypes_SRCS})
+ 
+ add_executable(keditfiletype5 ${keditfiletype_SRCS})
+ 
+-target_link_libraries(keditfiletype5 KF5::KDE4Support KF5::KIOWidgets)
++target_link_libraries(keditfiletype5
++    KF5::ConfigCore
++    KF5::IconThemes
++    KF5::KIOWidgets
++    KF5::WindowSystem
++    KF5::I18n
++    Qt5::DBus
++)
+ if (Q_WS_X11)
+   target_link_libraries(keditfiletype5 ${X11_X11_LIB})
+ endif ()
+diff --git a/keditfiletype/filegroupdetails.cpp b/keditfiletype/filegroupdetails.cpp
+index c733ba4..579b74d 100644
+--- a/keditfiletype/filegroupdetails.cpp
++++ b/keditfiletype/filegroupdetails.cpp
+@@ -25,7 +25,7 @@
+ #include <QButtonGroup>
+ #include <QGroupBox>
+ 
+-#include <klocale.h>
++#include <klocalizedstring.h>
+ 
+ FileGroupDetails::FileGroupDetails(QWidget *parent)
+     : QWidget( parent )
+diff --git a/keditfiletype/filetypedetails.cpp b/keditfiletype/filetypedetails.cpp
+index bfcbb07..71acf7e 100644
+--- a/keditfiletype/filetypedetails.cpp
++++ b/keditfiletype/filetypedetails.cpp
+@@ -19,28 +19,27 @@
+ 
+ // Own
+ #include "filetypedetails.h"
+-#include "sharedmimeinfoversion.h"
+ 
+ // Qt
+ #include <QBoxLayout>
+ #include <QButtonGroup>
+ #include <QCheckBox>
++#include <QDebug>
++#include <QInputDialog>
++#include <QLabel>
+ #include <QLayout>
+ #include <QListWidget>
++#include <QPushButton>
+ #include <QRadioButton>
+-#include <QLabel>
+ 
+ // KDE
+ #include <kconfig.h>
+ #include <kconfiggroup.h>
+-#include <kdebug.h>
+ #include <kicondialog.h>
+-#include <kinputdialog.h>
+ #include <klineedit.h>
++#include <klocalizedstring.h>
+ #include <kiconbutton.h>
+-#include <klocale.h>
+-#include <kicon.h>
+-#include <kpushbutton.h>
++#include <ksharedconfig.h>
+ 
+ // Local
+ #include "kservicelistwidget.h"
+@@ -51,6 +50,7 @@ FileTypeDetails::FileTypeDetails( QWidget * parent )
+ {
+ 
+     QVBoxLayout* topLayout = new QVBoxLayout(this);
++    topLayout->setContentsMargins(0, 0, 0, 0);
+ 
+     m_mimeTypeLabel = new QLabel(this);
+     topLayout->addWidget(m_mimeTypeLabel, 0, Qt::AlignCenter);
+@@ -66,23 +66,14 @@ FileTypeDetails::FileTypeDetails( QWidget * parent )
+   QHBoxLayout *hBox = new QHBoxLayout();
+   firstLayout->addLayout(hBox);
+ 
+-    if (SharedMimeInfoVersion::supportsIcon()) {
+-        iconButton = new KIconButton(firstWidget);
+-        iconButton->setIconType(KIconLoader::Desktop, KIconLoader::MimeType);
+-        connect(iconButton, SIGNAL(iconChanged(QString)), SLOT(updateIcon(QString)));
+-        iconButton->setWhatsThis( i18n("This button displays the icon associated"
+-                                       " with the selected file type. Click on it to choose a different icon.") );
+-        iconButton->setFixedSize(70, 70);
+-        iconLabel = 0;
+-        hBox->addWidget(iconButton);
+-    } else {
+-        iconButton = 0;
+-        iconLabel = new QLabel(firstWidget);
+-        iconLabel->setWhatsThis( i18n("This is the icon associated with the selected file type. "
+-                                      "Choosing a different icon requires shared-mime-info to be at least version 0.40.") );
+-        iconLabel->setFixedSize(70, 70);
+-        hBox->addWidget(iconLabel);
+-    }
++  iconButton = new KIconButton(firstWidget);
++  iconButton->setIconType(KIconLoader::Desktop, KIconLoader::MimeType);
++  connect(iconButton, SIGNAL(iconChanged(QString)), SLOT(updateIcon(QString)));
++  iconButton->setWhatsThis( i18n("This button displays the icon associated"
++                                 " with the selected file type. Click on it to choose a different icon.") );
++  iconButton->setFixedSize(70, 70);
++  iconLabel = 0;
++  hBox->addWidget(iconButton);
+ 
+   QGroupBox *gb = new QGroupBox(i18n("Filename Patterns"), firstWidget);
+   hBox->addWidget(gb);
+@@ -104,16 +95,16 @@ FileTypeDetails::FileTypeDetails( QWidget * parent )
+   QVBoxLayout *vbox = new QVBoxLayout();
+   hBox->addLayout(vbox);
+ 
+-  addExtButton = new KPushButton(i18n("Add..."), gb);
+-  addExtButton->setIcon(KIcon("list-add"));
++  addExtButton = new QPushButton(i18n("Add..."), gb);
++  addExtButton->setIcon(QIcon::fromTheme("list-add"));
+   addExtButton->setEnabled(false);
+   connect(addExtButton, SIGNAL(clicked()),
+           this, SLOT(addExtension()));
+   vbox->addWidget(addExtButton);
+   addExtButton->setWhatsThis( i18n("Add a new pattern for the selected file type.") );
+ 
+-  removeExtButton = new KPushButton(i18n("Remove"), gb);
+-  removeExtButton->setIcon(KIcon("list-remove"));
++  removeExtButton = new QPushButton(i18n("Remove"), gb);
++  removeExtButton->setIcon(QIcon::fromTheme("list-remove"));
+   removeExtButton->setEnabled(false);
+   connect(removeExtButton, SIGNAL(clicked()),
+           this, SLOT(removeExtension()));
+@@ -221,8 +212,9 @@ void FileTypeDetails::addExtension()
+     return;
+ 
+   bool ok;
+-  QString ext = KInputDialog::getText( i18n( "Add New Extension" ),
+-    i18n( "Extension:" ), "*.", &ok, this );
++  QString ext = QInputDialog::getText(this,
++    i18n( "Add New Extension" ), i18n( "Extension:" ),
++    QLineEdit::Normal, "*.", &ok);
+   if (ok) {
+     extensionLB->addItem(ext);
+     QStringList patt = m_mimeTypeData->patterns();
+@@ -263,6 +255,7 @@ void FileTypeDetails::updateAskSave()
+ {
+     if ( !m_mimeTypeData )
+         return;
++    QMimeDatabase db;
+ 
+     MimeTypeData::AutoEmbed autoEmbed = m_mimeTypeData->autoEmbed();
+     if (m_mimeTypeData->isMeta() && autoEmbed == MimeTypeData::UseGroupSetting) {
+@@ -287,11 +280,11 @@ void FileTypeDetails::updateAskSave()
+     bool neverAsk = false;
+ 
+     if (autoEmbed == MimeTypeData::Yes) {
+-        const KMimeType::Ptr mime = KMimeType::mimeType( mimeType );
+-        if (mime) {
++        const QMimeType mime = db.mimeTypeForName( mimeType );
++        if (mime.isValid()) {
+             // SYNC SYNC SYNC SYNC SYNC SYNC SYNC SYNC SYNC SYNC SYNC SYNC SYNC SYNC
+             // NOTE: Keep this function in sync with
+-            // kdelibs/kparts/browseropenorsavequestion.cpp BrowserOpenOrSaveQuestionPrivate::autoEmbedMimeType
++            // kparts/src/browseropenorsavequestion.cpp BrowserOpenOrSaveQuestionPrivate::autoEmbedMimeType
+ 
+             // Don't ask for:
+             // - html (even new tabs would ask, due to about:blank!)
+@@ -300,12 +293,12 @@ void FileTypeDetails::updateAskSave()
+             // e.g. postscript is different, because takes longer to read, so
+             // it's more likely that the user might want to save it.
+             // - multipart/* ("server push", see kmultipart)
+-            if ( mime->is( "text/html" ) ||
+-                 mime->is( "application/xml" ) ||
+-                 mime->is( "inode/directory" ) ||
+-                 mimeType.startsWith( QLatin1String("image") ) ||
+-                 mime->is( "multipart/x-mixed-replace" ) ||
+-                 mime->is( "multipart/replace" ) )
++            if (mime.inherits(QStringLiteral("text/html")) ||
++                mime.inherits(QStringLiteral("application/xml")) ||
++                mime.inherits(QStringLiteral("inode/directory")) ||
++                mimeType.startsWith(QLatin1String("image")) ||
++                mime.inherits(QStringLiteral("multipart/x-mixed-replace")) ||
++                mime.inherits(QStringLiteral("multipart/replace")))
+             {
+                 neverAsk = true;
+             }
+diff --git a/keditfiletype/filetypedetails.h b/keditfiletype/filetypedetails.h
+index 7c0abb4..a050642 100644
+--- a/keditfiletype/filetypedetails.h
++++ b/keditfiletype/filetypedetails.h
+@@ -32,7 +32,7 @@ class QButtonGroup;
+ class QCheckBox;
+ class QRadioButton;
+ class KLineEdit;
+-class KPushButton;
++class QPushButton;
+ class KServiceListWidget;
+ 
+ /**
+@@ -88,7 +88,7 @@ private:
+     QLabel* iconLabel; // if icon cannot be changed
+ 
+   QListWidget *extensionLB;
+-  KPushButton *addExtButton, *removeExtButton;
++  QPushButton *addExtButton, *removeExtButton;
+   KLineEdit *description;
+   KServiceListWidget *serviceListWidget;
+ 
+diff --git a/keditfiletype/filetypesview.cpp b/keditfiletype/filetypesview.cpp
+index 886892f..51f2096 100644
+--- a/keditfiletype/filetypesview.cpp
++++ b/keditfiletype/filetypesview.cpp
+@@ -28,19 +28,18 @@
+ #include <QLayout>
+ #include <QtCore/QTimer>
+ #include <QBoxLayout>
++#include <QPushButton>
+ #include <QStandardPaths>
+ #include <qdbusconnection.h>
+ #include <qdbusmessage.h>
++#include <qdebug.h>
+ 
+ // KDE
+ #include <kbuildsycocaprogressdialog.h>
+-#include <kdebug.h>
+ #include <klineedit.h>
+-#include <klocale.h>
+-#include <kpushbutton.h>
++#include <klocalizedstring.h>
+ #include <kservicetypeprofile.h>
+ 
+-#include <kicon.h>
+ #include <ksycoca.h>
+ 
+ // Local
+@@ -118,15 +117,15 @@ FileTypesView::FileTypesView(QWidget *parent, const QVariantList &)
+   QHBoxLayout* btnsLay = new QHBoxLayout();
+   leftLayout->addLayout(btnsLay);
+   btnsLay->addStretch(1);
+-  KPushButton *addTypeB = new KPushButton(i18n("Add..."), this);
+-  addTypeB->setIcon(KIcon("list-add"));
++  QPushButton *addTypeB = new QPushButton(i18n("Add..."), this);
++  addTypeB->setIcon(QIcon::fromTheme("list-add"));
+   connect(addTypeB, SIGNAL(clicked()), SLOT(addType()));
+   btnsLay->addWidget(addTypeB);
+ 
+   addTypeB->setWhatsThis( i18n("Click here to add a new file type.") );
+ 
+-  m_removeTypeB = new KPushButton(i18n("&Remove"), this);
+-  m_removeTypeB->setIcon(KIcon("list-remove"));
++  m_removeTypeB = new QPushButton(i18n("&Remove"), this);
++  m_removeTypeB->setIcon(QIcon::fromTheme("list-remove"));
+   connect(m_removeTypeB, SIGNAL(clicked()), SLOT(removeType()));
+   btnsLay->addWidget(m_removeTypeB);
+   m_removeTypeB->setEnabled(false);
+@@ -172,9 +171,9 @@ void FileTypesView::setDirty(bool state)
+ }
+ 
+ // To order the mimetype list
+-static bool mimeTypeLessThan(const KMimeType::Ptr& m1, const KMimeType::Ptr& m2)
++static bool mimeTypeLessThan(const QMimeType& m1, const QMimeType& m2)
+ {
+-    return m1->name() < m2->name();
++    return m1.name() < m2.name();
+ }
+ 
+ // Note that this method loses any newly-added (and not saved yet) mimetypes.
+@@ -185,11 +184,12 @@ void FileTypesView::readFileTypes()
+     m_majorMap.clear();
+     m_itemList.clear();
+ 
+-    KMimeType::List mimetypes = KMimeType::allMimeTypes();
++    QMimeDatabase db;
++    QList<QMimeType> mimetypes = db.allMimeTypes();
+     qSort(mimetypes.begin(), mimetypes.end(), mimeTypeLessThan);
+-    KMimeType::List::const_iterator it2(mimetypes.constBegin());
++    auto it2(mimetypes.constBegin());
+     for (; it2 != mimetypes.constEnd(); ++it2) {
+-        const QString mimetype = (*it2)->name();
++        const QString mimetype = (*it2).name();
+         const int index = mimetype.indexOf('/');
+         const QString maj = mimetype.left(index);
+         const QString min = mimetype.right(mimetype.length() - index+1);
+@@ -362,16 +362,16 @@ void FileTypesView::updateRemoveButton(TypesListItem* tlitem)
+             } else {
+                 // We can only remove mimetypes that we defined ourselves, not those from freedesktop.org
+                 const QString mimeType = mimeTypeData.name();
+-                kDebug() << mimeType << "hasDefinitionFile:" << MimeTypeWriter::hasDefinitionFile(mimeType);
++                qDebug() << mimeType << "hasDefinitionFile:" << MimeTypeWriter::hasDefinitionFile(mimeType);
+                 if (MimeTypeWriter::hasDefinitionFile(mimeType)) {
+                     canRemove = true;
+ 
+                     // Is there a global definition for it?
+                     const QStringList mimeFiles = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime/") + mimeType + ".xml" );
+-                    kDebug() << mimeFiles;
++                    qDebug() << mimeFiles;
+                     if (mimeFiles.count() >= 2 /*a local and a global*/) {
+                         m_removeButtonSaysRevert = true;
+-                        kDebug() << removedList;
++                        qDebug() << removedList;
+                         if (removedList.contains(mimeType)) {
+                             canRemove = false; // already on the "to be reverted" list, user needs to save now
+                         }
+@@ -415,7 +415,7 @@ void FileTypesView::save()
+   while ( it1 != m_majorMap.end() ) {
+     TypesListItem *tli = *it1;
+     if (tli->mimeTypeData().isDirty()) {
+-      kDebug() << "Entry " << tli->name() << " is dirty. Saving.";
++      qDebug() << "Entry " << tli->name() << " is dirty. Saving.";
+       if (tli->mimeTypeData().sync())
+           needUpdateMimeDb = true;
+       didIt = true;
+@@ -426,7 +426,7 @@ void FileTypesView::save()
+         if (tli->mimeTypeData().isDirty()) {
+             if (tli->mimeTypeData().isServiceListDirty())
+                 needUpdateSycoca = true;
+-            kDebug() << "Entry " << tli->name() << " is dirty. Saving.";
++            qDebug() << "Entry " << tli->name() << " is dirty. Saving.";
+             if (tli->mimeTypeData().sync())
+                 needUpdateMimeDb = true;
+             didIt = true;
+@@ -470,7 +470,7 @@ void FileTypesView::load()
+ 
+ void FileTypesView::slotDatabaseChanged(const QStringList& changedResources)
+ {
+-    kDebug() << changedResources;
++    qDebug() << changedResources;
+     if ( changedResources.contains("xdgdata-mime") // changes in mimetype definitions
+          || changedResources.contains("services") ) { // changes in .desktop files
+ 
+diff --git a/keditfiletype/filetypesview.h b/keditfiletype/filetypesview.h
+index 82fd0ab..693c18a 100644
+--- a/keditfiletype/filetypesview.h
++++ b/keditfiletype/filetypesview.h
+@@ -35,7 +35,7 @@
+ class QLabel;
+ class QTreeWidget;
+ class QTreeWidgetItem;
+-class KPushButton;
++class QPushButton;
+ class KLineEdit;
+ class FileTypeDetails;
+ class FileGroupDetails;
+@@ -69,7 +69,7 @@ private:
+ 
+ private:
+   QTreeWidget *typesLV;
+-  KPushButton *m_removeTypeB;
++  QPushButton *m_removeTypeB;
+ 
+   QStackedWidget * m_widgetStack;
+   FileTypeDetails * m_details;
+diff --git a/keditfiletype/keditfiletype.cpp b/keditfiletype/keditfiletype.cpp
+index aab0830..f061b4a 100644
+--- a/keditfiletype/keditfiletype.cpp
++++ b/keditfiletype/keditfiletype.cpp
+@@ -22,20 +22,25 @@
+ #include "mimetypewriter.h"
+ 
+ // Qt
+-#include <qdbusconnection.h>
+-#include <qdbusmessage.h>
+-#include <QtCore/QFile>
++#include <QApplication>
++#include <QBoxLayout>
++#include <QCommandLineOption>
++#include <QCommandLineParser>
++#include <QDBusConnection>
++#include <QDBusMessage>
++#include <QDebug>
++#include <QDialogButtonBox>
++#include <QFile>
++#include <QPushButton>
+ 
+ // KDE
+-#include <kapplication.h>
+-#include <k4aboutdata.h>
++#include <kaboutdata.h>
+ #include <kbuildsycocaprogressdialog.h>
+-#include <kdebug.h>
+-#include <kcmdlineargs.h>
++#include <klocalizedstring.h>
++
+ #include <ksycoca.h>
+ #include <kservicetypeprofile.h>
+ 
+-#include <klocale.h>
+ #include <kwindowsystem.h>
+ 
+ // Local
+@@ -44,12 +49,10 @@
+ 
+ 
+ FileTypeDialog::FileTypeDialog( MimeTypeData* mime )
+-  : KDialog( 0 ),
++  : QDialog( 0 ),
+     m_mimeTypeData(mime)
+ {
+-  setButtons( Cancel | Apply | Ok );
+-
+-  init();
++    init();
+ }
+ 
+ FileTypeDialog::~FileTypeDialog()
+@@ -61,16 +64,28 @@ void FileTypeDialog::init()
+ {
+     m_details = new FileTypeDetails( this );
+     m_details->setMimeTypeData( m_mimeTypeData );
++    connect(m_details, SIGNAL(changed(bool)), this, SLOT(clientChanged(bool)));
++
++    m_buttonBox = new QDialogButtonBox;
++    m_buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel);
++    connect(m_buttonBox, SIGNAL(accepted()), SLOT(accept()));
++    connect(m_buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), SLOT(save()));
++    connect(m_buttonBox, SIGNAL(rejected()), SLOT(reject()));
+ 
+     // This code is very similar to kcdialog.cpp
+-    setMainWidget( m_details );
+-    connect(m_details, SIGNAL(changed(bool)), this, SLOT(clientChanged(bool)));
++    QVBoxLayout* layout = new QVBoxLayout(this);
++    layout->addWidget(m_details);
++    layout->addWidget(m_buttonBox);
+     // TODO setHelp()
+-    enableButton(Apply, false);
++
++    setApplyButtonEnabled(false);
+ 
+     connect(KSycoca::self(), SIGNAL(databaseChanged(QStringList)), SLOT(slotDatabaseChanged(QStringList)));
+-    connect( this, SIGNAL( okClicked() ), SLOT( slotOk() ) );
+-    connect( this, SIGNAL( applyClicked() ), SLOT( slotApply() ) );
++}
++
++void FileTypeDialog::setApplyButtonEnabled(bool enabled)
++{
++    m_buttonBox->button(QDialogButtonBox::Apply)->setEnabled(enabled);
+ }
+ 
+ void FileTypeDialog::save()
+@@ -88,27 +103,21 @@ void FileTypeDialog::save()
+     }
+ }
+ 
+-void FileTypeDialog::slotOk()
+-{
+-  save();
+-  accept();
+-}
+-
+-void FileTypeDialog::slotApply()
++void FileTypeDialog::accept()
+ {
+   save();
++  QDialog::accept();
+ }
+ 
+ void FileTypeDialog::clientChanged(bool state)
+ {
+-  // enable/disable buttons
+-  enableButton(User1, state);
+-  enableButton(Apply, state);
++    m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(state);
++    m_buttonBox->button(QDialogButtonBox::Apply)->setEnabled(state);
+ }
+ 
+ void FileTypeDialog::slotDatabaseChanged(const QStringList& changedResources)
+ {
+-    kDebug() << changedResources;
++    qDebug() << changedResources;
+     if ( changedResources.contains("xdgdata-mime") // changes in mimetype definitions
+          || changedResources.contains("services") ) { // changes in .desktop files
+         m_details->refresh();
+@@ -119,81 +128,85 @@ void FileTypeDialog::slotDatabaseChanged(const QStringList& changedResources)
+ 
+ int main(int argc, char ** argv)
+ {
+-  K4AboutData aboutData( "keditfiletype", "filetypes", ki18n("KEditFileType"), "1.0",
+-                        ki18n("KDE file type editor - simplified version for editing a single file type"),
+-                        K4AboutData::License_GPL,
+-                        ki18n("(c) 2000, KDE developers") );
+-  aboutData.addAuthor(ki18n("Preston Brown"),KLocalizedString(), "pbrown@kde.org");
+-  aboutData.addAuthor(ki18n("David Faure"),KLocalizedString(), "faure@kde.org");
+-  aboutData.setProgramIconName("preferences-desktop-filetype-association");
+-
+-  KCmdLineArgs::init( argc, argv, &aboutData );
+-
+-  KCmdLineOptions options;
+-  options.add("parent <winid>", ki18n("Makes the dialog transient for the window specified by winid"));
+-  options.add("+mimetype", ki18n("File type to edit (e.g. text/html)"));
+-  KCmdLineArgs::addCmdLineOptions( options ); // Add our own options.
+-  KApplication app;
+-  KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+-
+-  if (args->count() == 0)
+-    KCmdLineArgs::usage();
+-
+-  QString arg = args->arg(0);
+-  MimeTypeData* mimeTypeData = 0;
+-  const bool createType = arg.startsWith('*');
+-  if ( createType ) {
+-      QString mimeString = "application/x-kdeuser%1";
+-      QString mimeTypeName;
+-      int inc = 0;
+-      bool ok = false;
+-      do {
+-          ++inc;
+-          mimeTypeName = mimeString.arg(inc);
+-          ok = !KMimeType::mimeType(mimeTypeName);
+-      } while (!ok);
+-
+-      QStringList patterns;
+-      if ( arg.length() > 2 )
+-          patterns << arg.toLower() << arg.toUpper();
+-      QString comment;
+-      if ( arg.startsWith( QLatin1String("*.") ) && arg.length() >= 3 ) {
+-          const QString type = arg.mid( 3 ).prepend( arg[2].toUpper() );
+-          comment = i18n( "%1 File", type );
+-      }
+-
+-      mimeTypeData = new MimeTypeData(mimeTypeName, true); // new mimetype
+-      mimeTypeData->setComment(comment);
+-      mimeTypeData->setPatterns(patterns);
+-  }
+-  else {
+-      const QString mimeTypeName = arg;
+-      KMimeType::Ptr mime = KMimeType::mimeType(mimeTypeName, KMimeType::ResolveAliases);
+-      if (!mime) {
+-          kError() << "Mimetype" << mimeTypeName << "not found" ;
+-          return 1;
+-      }
+-
+-      mimeTypeData = new MimeTypeData(mime);
+-  }
+-
+-  FileTypeDialog dlg( mimeTypeData );
+-  if( args->isSet( "parent" )) {
+-    bool ok;
+-    long id = QString(args->getOption("parent")).toLong(&ok);
+-    if (ok)
+-      KWindowSystem::setMainWindow( &dlg, (WId)id );
+-  }
+-  args->clear();
+-  if ( !createType )
+-    dlg.setCaption( i18n("Edit File Type %1", mimeTypeData->name()) );
+-  else {
+-    dlg.setCaption( i18n("Create New File Type %1", mimeTypeData->name()) );
+-    dlg.enableButton( KDialog::Apply, true );
+-  }
+-
+-  dlg.show(); // non-modal
+-
+-  return app.exec();
++    QApplication app(argc, argv);
++
++    KAboutData aboutData( "keditfiletype", i18n("KEditFileType"), "1.0",
++       i18n("KDE file type editor - simplified version for editing a single file type"),
++       KAboutLicense::GPL,
++       i18n("(c) 2000, KDE developers") );
++    aboutData.addAuthor(i18n("Preston Brown"), QString(), "pbrown@kde.org");
++    aboutData.addAuthor(i18n("David Faure"), QString(), "faure@kde.org");
++    aboutData.setProgramIconName("preferences-desktop-filetype-association");
++    KAboutData::setApplicationData(aboutData);
++
++    QCommandLineParser parser;
++    aboutData.setupCommandLine(&parser);
++    parser.addHelpOption();
++    parser.addVersionOption();
++    parser.addOption(QCommandLineOption(QStringList() << "parent", i18n("Makes the dialog transient for the window specified by winid"), "winid"));
++    parser.addPositionalArgument("mimetype", i18n("File type to edit (e.g. text/html)"));
++
++    parser.process(app);
++    aboutData.processCommandLine(&parser);
++
++    if (parser.positionalArguments().count() == 0)
++        parser.showHelp();
++
++    QMimeDatabase db;
++    QString arg = parser.positionalArguments().first();
++    MimeTypeData* mimeTypeData = 0;
++    const bool createType = arg.startsWith('*');
++    if ( createType ) {
++        QString mimeString = "application/x-kdeuser%1";
++        QString mimeTypeName;
++        int inc = 0;
++        bool ok = false;
++        do {
++            ++inc;
++            mimeTypeName = mimeString.arg(inc);
++            ok = !db.mimeTypeForName(mimeTypeName).isValid();
++        } while (!ok);
++
++        QStringList patterns;
++        if ( arg.length() > 2 )
++            patterns << arg.toLower() << arg.toUpper();
++        QString comment;
++        if ( arg.startsWith( QLatin1String("*.") ) && arg.length() >= 3 ) {
++            const QString type = arg.mid( 3 ).prepend( arg[2].toUpper() );
++            comment = i18n( "%1 File", type );
++        }
++
++        mimeTypeData = new MimeTypeData(mimeTypeName, true); // new mimetype
++        mimeTypeData->setComment(comment);
++        mimeTypeData->setPatterns(patterns);
++    }
++    else {
++        const QString mimeTypeName = arg;
++        QMimeType mime = db.mimeTypeForName(mimeTypeName);
++        if (!mime.isValid()) {
++            qCritical() << "Mimetype" << mimeTypeName << "not found" ;
++            return 1;
++        }
++
++        mimeTypeData = new MimeTypeData(mime);
++    }
++
++    FileTypeDialog dlg( mimeTypeData );
++    if( parser.isSet( "parent" )) {
++        bool ok;
++        long id = parser.value("parent").toLong(&ok);
++        if (ok)
++            KWindowSystem::setMainWindow( &dlg, (WId)id );
++    }
++    if ( !createType )
++        dlg.setWindowTitle( i18n("Edit File Type %1", mimeTypeData->name()) );
++    else {
++        dlg.setWindowTitle( i18n("Create New File Type %1", mimeTypeData->name()) );
++        dlg.setApplyButtonEnabled(true);
++    }
++
++    dlg.show(); // non-modal
++
++    return app.exec();
+ }
+ 
+diff --git a/keditfiletype/keditfiletype.h b/keditfiletype/keditfiletype.h
+index 0b235ce..9a955b6 100644
+--- a/keditfiletype/keditfiletype.h
++++ b/keditfiletype/keditfiletype.h
+@@ -20,33 +20,40 @@
+ #ifndef __keditfiletype_h
+ #define __keditfiletype_h
+ 
+-#include <kdialog.h>
+-#include <kmimetype.h>
++#include <QDialog>
++#include <QMimeType>
++#include <QMimeDatabase>
++
++class QDialogButtonBox;
+ 
+ class MimeTypeData;
+ class FileTypeDetails;
+ 
+ // A dialog for ONE file type to be edited.
+-class FileTypeDialog : public KDialog
++class FileTypeDialog : public QDialog
+ {
+     Q_OBJECT
+ public:
+     FileTypeDialog(MimeTypeData* mime);
+-    ~FileTypeDialog();
++    virtual ~FileTypeDialog();
++
++    void setApplyButtonEnabled(bool);
++
++public Q_SLOTS:
++    void accept() Q_DECL_OVERRIDE;
+ 
+ protected Q_SLOTS:
+-  virtual void slotOk();
+-  virtual void slotApply();
+-  void clientChanged(bool state);
+-  void slotDatabaseChanged(const QStringList& changedResources);
++    void clientChanged(bool state);
++    void slotDatabaseChanged(const QStringList& changedResources);
+ 
+-protected:
+-  void save();
++private Q_SLOTS:
++    void save();
+ 
+ private:
+-  void init();
+-  FileTypeDetails * m_details;
+-  MimeTypeData* m_mimeTypeData;
++    void init();
++    FileTypeDetails * m_details;
++    MimeTypeData* m_mimeTypeData;
++    QDialogButtonBox* m_buttonBox;
+ };
+ 
+ #endif
+diff --git a/keditfiletype/kservicelistwidget.cpp b/keditfiletype/kservicelistwidget.cpp
+index 88dface..64fc7f1 100644
+--- a/keditfiletype/kservicelistwidget.cpp
++++ b/keditfiletype/kservicelistwidget.cpp
+@@ -25,21 +25,17 @@
+ #include <unistd.h>
+ 
+ // Qt
++#include <QBoxLayout>
++#include <QDebug>
+ #include <QLayout>
+-#include <QHBoxLayout>
++#include <QPushButton>
+ #include <QStandardPaths>
+ 
+ // KDE
+-#include <kapplication.h>
+-#include <kdebug.h>
+-#include <klocale.h>
++#include <klocalizedstring.h>
+ #include <kmessagebox.h>
+-#include <knotification.h>
+ #include <kopenwithdialog.h>
+ #include <kpropertiesdialog.h>
+-#include <kpushbutton.h>
+-#include <kicon.h>
+-#include <kstandarddirs.h>
+ 
+ // Local
+ #include "kserviceselectdlg.h"
+@@ -59,10 +55,6 @@ KServiceListItem::KServiceListItem( const KService::Ptr& pService, int kind )
+       localPath = pService->locateLocal();
+ }
+ 
+-bool KServiceListItem::isImmutable() const
+-{
+-    return !KStandardDirs::checkAccess(localPath, W_OK);
+-}
+ 
+ 
+ 
+@@ -99,8 +91,8 @@ KServiceListWidget::KServiceListWidget(int kind, QWidget *parent)
+   QVBoxLayout *btnsLay= new QVBoxLayout();
+   lay->addLayout(btnsLay);
+ 
+-  servUpButton = new KPushButton(i18n("Move &Up"), this);
+-  servUpButton->setIcon(KIcon("arrow-up"));
++  servUpButton = new QPushButton(i18n("Move &Up"), this);
++  servUpButton->setIcon(QIcon::fromTheme("arrow-up"));
+   servUpButton->setEnabled(false);
+   connect(servUpButton, SIGNAL(clicked()), SLOT(promoteService()));
+   btnsLay->addWidget(servUpButton);
+@@ -113,8 +105,8 @@ KServiceListWidget::KServiceListWidget(int kind, QWidget *parent)
+                    i18n("Assigns a higher priority to the selected\n"
+                         "service, moving it up in the list."));
+ 
+-  servDownButton = new KPushButton(i18n("Move &Down"), this);
+-  servDownButton->setIcon(KIcon("arrow-down"));
++  servDownButton = new QPushButton(i18n("Move &Down"), this);
++  servDownButton->setIcon(QIcon::fromTheme("arrow-down"));
+   servDownButton->setEnabled(false);
+   connect(servDownButton, SIGNAL(clicked()), SLOT(demoteService()));
+   btnsLay->addWidget(servDownButton);
+@@ -126,24 +118,24 @@ KServiceListWidget::KServiceListWidget(int kind, QWidget *parent)
+                    i18n("Assigns a lower priority to the selected\n"
+                         "service, moving it down in the list."));
+ 
+-  servNewButton = new KPushButton(i18n("Add..."), this);
+-  servNewButton->setIcon(KIcon("list-add"));
++  servNewButton = new QPushButton(i18n("Add..."), this);
++  servNewButton->setIcon(QIcon::fromTheme("list-add"));
+   servNewButton->setEnabled(false);
+   connect(servNewButton, SIGNAL(clicked()), SLOT(addService()));
+   btnsLay->addWidget(servNewButton);
+   servNewButton->setWhatsThis( i18n( "Add a new application for this file type." ) );
+ 
+ 
+-  servEditButton = new KPushButton(i18n("Edit..."), this);
+-  servEditButton->setIcon(KIcon("edit-rename"));
++  servEditButton = new QPushButton(i18n("Edit..."), this);
++  servEditButton->setIcon(QIcon::fromTheme("edit-rename"));
+   servEditButton->setEnabled(false);
+   connect(servEditButton, SIGNAL(clicked()), SLOT(editService()));
+   btnsLay->addWidget(servEditButton);
+   servEditButton->setWhatsThis( i18n( "Edit command line of the selected application." ) );
+ 
+ 
+-  servRemoveButton = new KPushButton(i18n("Remove"), this);
+-  servRemoveButton->setIcon(KIcon("list-remove"));
++  servRemoveButton = new QPushButton(i18n("Remove"), this);
++  servRemoveButton->setIcon(QIcon::fromTheme("list-remove"));
+   servRemoveButton->setEnabled(false);
+   connect(servRemoveButton, SIGNAL(clicked()), SLOT(removeService()));
+   btnsLay->addWidget(servRemoveButton);
+@@ -193,13 +185,11 @@ void KServiceListWidget::setMimeTypeData( MimeTypeData * mimeTypeData )
+ void KServiceListWidget::promoteService()
+ {
+   if (!servicesLB->isEnabled()) {
+-    KNotification::beep();
+     return;
+   }
+ 
+   int selIndex = servicesLB->currentRow();
+   if (selIndex == 0) {
+-    KNotification::beep();
+     return;
+   }
+ 
+@@ -216,13 +206,11 @@ void KServiceListWidget::promoteService()
+ void KServiceListWidget::demoteService()
+ {
+   if (!servicesLB->isEnabled()) {
+-    KNotification::beep();
+     return;
+   }
+ 
+   int selIndex = servicesLB->currentRow();
+   if (selIndex == servicesLB->count() - 1) {
+-    KNotification::beep();
+     return;
+   }
+ 
+@@ -365,19 +353,10 @@ void KServiceListWidget::removeService()
+   int selected = servicesLB->currentRow();
+ 
+   if ( selected >= 0 ) {
+-    // Check if service is associated with this mimetype or with one of its parents
+-    KServiceListItem *serviceItem = static_cast<KServiceListItem *>(servicesLB->item(selected));
+-    if (serviceItem->isImmutable())
+-    {
+-       KMessageBox::sorry(this, i18n("You are not authorized to remove this service."));
+-    }
+-    else
+-    {
+-       delete servicesLB->takeItem( selected );
+-       updatePreferredServices();
++    delete servicesLB->takeItem( selected );
++    updatePreferredServices();
+ 
+-       emit changed(true);
+-    }
++    emit changed(true);
+   }
+ 
+     // Update buttons and service list again (e.g. to re-add "None")
+diff --git a/keditfiletype/kservicelistwidget.h b/keditfiletype/kservicelistwidget.h
+index c817d24..fbc488a 100644
+--- a/keditfiletype/kservicelistwidget.h
++++ b/keditfiletype/kservicelistwidget.h
+@@ -25,15 +25,16 @@
+ #include <QGroupBox>
+ #include <QListWidget>
+ #include <kservice.h>
++
++class QPushButton;
++
+ class MimeTypeData;
+-class KPushButton;
+ class KService;
+ 
+ class KServiceListItem : public QListWidgetItem
+ {
+ public:
+     KServiceListItem( const KService::Ptr& pService, int kind );
+-    bool isImmutable() const;
+     QString storageId;
+     QString desktopPath;
+     QString localPath;
+@@ -71,8 +72,8 @@ protected:
+ private:
+   int m_kind;
+   QListWidget *servicesLB;
+-  KPushButton *servUpButton, *servDownButton;
+-  KPushButton *servNewButton, *servEditButton, *servRemoveButton;
++  QPushButton *servUpButton, *servDownButton;
++  QPushButton *servNewButton, *servEditButton, *servRemoveButton;
+   MimeTypeData *m_mimeTypeData;
+ };
+ 
+diff --git a/keditfiletype/kserviceselectdlg.cpp b/keditfiletype/kserviceselectdlg.cpp
+index 09c7c5d..e9fcabc 100644
+--- a/keditfiletype/kserviceselectdlg.cpp
++++ b/keditfiletype/kserviceselectdlg.cpp
+@@ -19,23 +19,25 @@
+ #include "kserviceselectdlg.moc"
+ #include "kservicelistwidget.h"
+ 
+-#include <klocale.h>
+-#include <QVBoxLayout>
++#include <QDialogButtonBox>
+ #include <QLabel>
++#include <QVBoxLayout>
++
++#include <KLocalizedString>
+ 
+ KServiceSelectDlg::KServiceSelectDlg( const QString& /*serviceType*/, const QString& /*value*/, QWidget *parent )
+-    : KDialog( parent )
++    : QDialog( parent )
+ {
+     setObjectName( QLatin1String( "serviceSelectDlg" ) );
+     setModal( true );
+-    setCaption( i18n( "Add Service" ) );
+-    setButtons( Ok | Cancel );
++    setWindowTitle( i18n( "Add Service" ) );
+ 
+-    QWidget *vbox = new QWidget( this );
+-    QVBoxLayout *layout = new QVBoxLayout( vbox );
++    QVBoxLayout *layout = new QVBoxLayout(this);
+ 
+-    layout->addWidget( new QLabel( i18n( "Select service:" ), vbox ) );
+-    m_listbox=new KListWidget( vbox );
++    layout->addWidget( new QLabel( i18n( "Select service:" ) ) );
++    m_listbox=new QListWidget();
++    m_buttonBox = new QDialogButtonBox;
++    m_buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
+ 
+     // Can't make a KTrader query since we don't have a servicetype to give,
+     // we want all services that are not applications.......
+@@ -53,20 +55,16 @@ KServiceSelectDlg::KServiceSelectDlg( const QString& /*serviceType*/, const QStr
+     m_listbox->setMinimumHeight(350);
+     m_listbox->setMinimumWidth(400);
+     layout->addWidget( m_listbox );
+-    connect(m_listbox,SIGNAL(itemDoubleClicked(QListWidgetItem*)),SLOT(slotOk()));
+-    connect( this, SIGNAL(okClicked()), this, SLOT(slotOk()) );
+-    setMainWidget(vbox);
++    layout->addWidget( m_buttonBox );
++    connect(m_listbox,SIGNAL(itemDoubleClicked(QListWidgetItem*)),SLOT(accept()));
++    connect(m_buttonBox, SIGNAL(accepted()), SLOT(accept()));
++    connect(m_buttonBox, SIGNAL(rejected()), SLOT(reject()));
+ }
+ 
+ KServiceSelectDlg::~KServiceSelectDlg()
+ {
+ }
+ 
+-void KServiceSelectDlg::slotOk()
+-{
+-   accept();
+-}
+-
+ KService::Ptr KServiceSelectDlg::service()
+ {
+     int selIndex = m_listbox->currentRow();
+diff --git a/keditfiletype/kserviceselectdlg.h b/keditfiletype/kserviceselectdlg.h
+index 8e6d0d0..3acabfb 100644
+--- a/keditfiletype/kserviceselectdlg.h
++++ b/keditfiletype/kserviceselectdlg.h
+@@ -17,10 +17,15 @@
+ 
+ #ifndef __kserviceselectdlg_h
+ #define __kserviceselectdlg_h
+-#include <kdialog.h>
++
++#include <QDialog>
++#include <QListWidget>
++
+ #include <kservice.h>
+-#include <klistwidget.h>
+-class KServiceSelectDlg : public KDialog
++
++class QDialogButtonBox;
++
++class KServiceSelectDlg : public QDialog
+ {
+     Q_OBJECT
+ public:
+@@ -41,10 +46,10 @@ public:
+      * @return the chosen service
+      */
+     KService::Ptr service();
+-protected slots:
+-    void slotOk();
++
+ private:
+-    KListWidget * m_listbox;
++    QListWidget * m_listbox;
++    QDialogButtonBox* m_buttonBox;
+ };
+ 
+ #endif
+diff --git a/keditfiletype/mimetypedata.cpp b/keditfiletype/mimetypedata.cpp
+index 057113f..65af59c 100644
+--- a/keditfiletype/mimetypedata.cpp
++++ b/keditfiletype/mimetypedata.cpp
+@@ -19,10 +19,9 @@
+ */
+ 
+ #include "mimetypedata.h"
+-#include "sharedmimeinfoversion.h"
+ #include <kprotocolmanager.h>
+ #include "mimetypewriter.h"
+-#include <kdebug.h>
++#include <qdebug.h>
+ #include <kservice.h>
+ #include <ksharedconfig.h>
+ #include <kconfiggroup.h>
+@@ -37,21 +36,23 @@ MimeTypeData::MimeTypeData(const QString& major)
+       m_isGroup(true),
+       m_appServicesModified(false),
+       m_embedServicesModified(false),
++      m_userSpecifiedIconModified(false),
+       m_major(major)
+ {
+     m_autoEmbed = readAutoEmbed();
+ }
+ 
+-MimeTypeData::MimeTypeData(const KMimeType::Ptr mime)
++MimeTypeData::MimeTypeData(const QMimeType& mime)
+     : m_mimetype(mime),
+       m_askSave(AskSaveDefault), // TODO: the code for initializing this is missing. FileTypeDetails initializes the checkbox instead...
+       m_bNewItem(false),
+       m_bFullInit(false),
+       m_isGroup(false),
+       m_appServicesModified(false),
+-      m_embedServicesModified(false)
++      m_embedServicesModified(false),
++      m_userSpecifiedIconModified(false)
+ {
+-    const QString mimeName = m_mimetype->name();
++    const QString mimeName = m_mimetype.name();
+     const int index = mimeName.indexOf('/');
+     if (index != -1) {
+         m_major = mimeName.left(index);
+@@ -59,17 +60,18 @@ MimeTypeData::MimeTypeData(const KMimeType::Ptr mime)
+     } else {
+         m_major = mimeName;
+     }
+-    initFromKMimeType();
++    initFromQMimeType();
+ }
+ 
+ MimeTypeData::MimeTypeData(const QString& mimeName, bool)
+-    : m_mimetype(0),
+-      m_askSave(AskSaveDefault),
++    : m_askSave(AskSaveDefault),
+       m_bNewItem(true),
+       m_bFullInit(false),
+       m_isGroup(false),
+       m_appServicesModified(false),
+-      m_embedServicesModified(false)
++      m_embedServicesModified(false),
++      m_userSpecifiedIconModified(false)
++
+ {
+     const int index = mimeName.indexOf('/');
+     if (index != -1) {
+@@ -82,10 +84,10 @@ MimeTypeData::MimeTypeData(const QString& mimeName, bool)
+     // all the rest is empty by default
+ }
+ 
+-void MimeTypeData::initFromKMimeType()
++void MimeTypeData::initFromQMimeType()
+ {
+-    m_comment = m_mimetype->comment();
+-    setPatterns(m_mimetype->patterns());
++    m_comment = m_mimetype.comment();
++    setPatterns(m_mimetype.globPatterns());
+     m_autoEmbed = readAutoEmbed();
+ 
+     // Parse XML file to find out if the user specified a custom icon name
+@@ -141,7 +143,7 @@ MimeTypeData::AutoEmbed MimeTypeData::readAutoEmbed() const
+     } else {
+         if (group.hasKey(key))
+             return group.readEntry(key, false) ? Yes : No;
+-        // TODO if ( !mimetype->property( "X-KDE-LocalProtocol" ).toString().isEmpty() )
++        // TODO if ( !mimetype.property( "X-KDE-LocalProtocol" ).toString().isEmpty() )
+         // TODO    return MimeTypeData::Yes; // embed by default for zip, tar etc.
+         return MimeTypeData::UseGroupSetting;
+     }
+@@ -192,7 +194,11 @@ bool MimeTypeData::isEssential() const
+ 
+ void MimeTypeData::setUserSpecifiedIcon(const QString& icon)
+ {
++    if (icon == m_userSpecifiedIcon) {
++        return;
++    }
+     m_userSpecifiedIcon = icon;
++    m_userSpecifiedIconModified = true;
+ }
+ 
+ QStringList MimeTypeData::getAppOffers() const
+@@ -247,24 +253,24 @@ bool MimeTypeData::isMimeTypeDirty() const
+     if (m_bNewItem)
+         return true;
+ 
+-    if (!m_mimetype) {
+-        kWarning() << "MimeTypeData for" << name() << "says 'not new' but is without a mimetype? Should not happen.";
++    if (!m_mimetype.isValid()) {
++        qWarning() << "MimeTypeData for" << name() << "says 'not new' but is without a mimetype? Should not happen.";
+         return true;
+     }
+ 
+-    if (m_mimetype->comment() != m_comment) {
+-        kDebug() << "Mimetype Comment Dirty: old=" << m_mimetype->comment() << "m_comment=" << m_comment;
++    if (m_mimetype.comment() != m_comment) {
++        qDebug() << "Mimetype Comment Dirty: old=" << m_mimetype.comment() << "m_comment=" << m_comment;
+         return true;
+     }
+-    if (m_mimetype->userSpecifiedIconName() != m_userSpecifiedIcon) {
+-        kDebug() << "Mimetype Icon Dirty: old=" << m_mimetype->iconName() << "m_userSpecifiedIcon=" << m_userSpecifiedIcon;
++    if (m_userSpecifiedIconModified) {
++        qDebug() << "m_userSpecifiedIcon has changed. Now set to" << m_userSpecifiedIcon;
+         return true;
+     }
+ 
+-    QStringList storedPatterns = m_mimetype->patterns();
++    QStringList storedPatterns = m_mimetype.globPatterns();
+     storedPatterns.sort(); // see ctor
+     if ( storedPatterns != m_patterns) {
+-        kDebug() << "Mimetype Patterns Dirty: old=" << storedPatterns
++        qDebug() << "Mimetype Patterns Dirty: old=" << storedPatterns
+                  << "m_patterns=" << m_patterns;
+         return true;
+     }
+@@ -282,7 +288,7 @@ bool MimeTypeData::isServiceListDirty() const
+ bool MimeTypeData::isDirty() const
+ {
+     if ( m_bNewItem ) {
+-        kDebug() << "New item, need to save it";
++        qDebug() << "New item, need to save it";
+         return true;
+     }
+ 
+@@ -334,17 +340,13 @@ bool MimeTypeData::sync()
+     if (isMimeTypeDirty()) {
+         MimeTypeWriter mimeTypeWriter(name());
+         mimeTypeWriter.setComment(m_comment);
+-        if (SharedMimeInfoVersion::supportsIcon()) {
+-            // Very important: don't write <icon> if shared-mime-info doesn't support it,
+-            // it would abort on it!
+-            if (!m_userSpecifiedIcon.isEmpty()) {
+-                mimeTypeWriter.setIconName(m_userSpecifiedIcon);
+-            }
++        if (!m_userSpecifiedIcon.isEmpty()) {
++            mimeTypeWriter.setIconName(m_userSpecifiedIcon);
+         }
+         mimeTypeWriter.setPatterns(m_patterns);
+         if (!mimeTypeWriter.write())
+             return false;
+-
++        m_userSpecifiedIconModified = false;
+         needUpdateMimeDb = true;
+     }
+ 
+@@ -393,7 +395,7 @@ static QStringList collectStorageIds(const QStringList& services)
+ 
+         KService::Ptr pService = KService::serviceByStorageId(*it);
+         if (!pService) {
+-            kWarning() << "service with storage id" << *it << "not found";
++            qWarning() << "service with storage id" << *it << "not found";
+             continue; // Where did that one go?
+         }
+ 
+@@ -434,17 +436,17 @@ void MimeTypeData::refresh()
+ {
+     if (m_isGroup)
+         return;
+-
+-    m_mimetype = KMimeType::mimeType( name() );
+-    if (m_mimetype) {
++    QMimeDatabase db;
++    m_mimetype = db.mimeTypeForName( name() );
++    if (m_mimetype.isValid()) {
+         if (m_bNewItem) {
+-            kDebug() << "OK, created" << name();
++            qDebug() << "OK, created" << name();
+             m_bNewItem = false; // if this was a new mimetype, we just created it
+         }
+         if (!isMimeTypeDirty()) {
+             // Update from the xml, in case something was changed from out of this kcm
+             // (e.g. using KOpenWithDialog, or keditfiletype + kcmshell filetypes)
+-            initFromKMimeType();
++            initFromQMimeType();
+         }
+         if (!m_appServicesModified && !m_embedServicesModified) {
+             m_bFullInit = false; // refresh services too
+@@ -468,7 +470,7 @@ void MimeTypeData::setAskSave(bool _askSave)
+ bool MimeTypeData::canUseGroupSetting() const
+ {
+     // "Use group settings" isn't available for zip, tar etc.; those have a builtin default...
+-    if (!m_mimetype) // e.g. new mimetype
++    if (!m_mimetype.isValid()) // e.g. new mimetype
+         return true;
+     const bool hasLocalProtocolRedirect = !KProtocolManager::protocolForArchiveMimetype(name()).isEmpty();
+     return !hasLocalProtocolRedirect;
+@@ -478,7 +480,7 @@ void MimeTypeData::setPatterns(const QStringList &p)
+ {
+     m_patterns = p;
+     // Sort them, since update-mime-database doesn't respect order (order of globs file != order of xml),
+-    // and this code says things like if (m_mimetype->patterns() == m_patterns).
++    // and this code says things like if (m_mimetype.patterns() == m_patterns).
+     // We could also sort in KMimeType::setPatterns but this would just slow down the
+     // normal use case (anything else than this KCM) for no good reason.
+     m_patterns.sort();
+@@ -514,7 +516,7 @@ QString MimeTypeData::icon() const
+ {
+     if (!m_userSpecifiedIcon.isEmpty())
+         return m_userSpecifiedIcon;
+-    if (m_mimetype)
+-        return m_mimetype->iconName();
++    if (m_mimetype.isValid())
++        return m_mimetype.iconName();
+     return QString();
+ }
+diff --git a/keditfiletype/mimetypedata.h b/keditfiletype/mimetypedata.h
+index 042b043..5b00c07 100644
+--- a/keditfiletype/mimetypedata.h
++++ b/keditfiletype/mimetypedata.h
+@@ -21,11 +21,14 @@
+ #ifndef MIMETYPEDATA_H
+ #define MIMETYPEDATA_H
+ 
+-#include <kmimetype.h>
++#include <QMimeType>
++#include <QMimeDatabase>
++
++class KConfigGroup;
+ 
+ /**
+  * This is a non-gui (data) class, that represents a mimetype.
+- * It is a KMimeType::Ptr plus the changes we made to it.
++ * It is a QMimeType plus the changes we made to it.
+  */
+ class MimeTypeData
+ {
+@@ -33,7 +36,7 @@ public:
+     // Constructor used for groups
+     MimeTypeData(const QString& major);
+     // Real constructor, used for an existing mimetype.
+-    MimeTypeData(const KMimeType::Ptr mime);
++    MimeTypeData(const QMimeType& mime);
+     // Real constructor, used for a new mimetype.
+     MimeTypeData(const QString& mimeName, bool /*unused, just to distinguish from the other QString ctor*/);
+ 
+@@ -67,7 +70,7 @@ public:
+     AutoEmbed autoEmbed() const { return m_autoEmbed; }
+     void setAutoEmbed( AutoEmbed a ) { m_autoEmbed = a; }
+ 
+-    const KMimeType::Ptr& mimeType() const { return m_mimetype; }
++    const QMimeType& mimeType() const { return m_mimetype; }
+     bool canUseGroupSetting() const;
+ 
+     void getAskSave(bool &);
+@@ -105,7 +108,7 @@ public:
+     bool matchesFilter(const QString& filter) const;
+ 
+ private:
+-    void initFromKMimeType();
++    void initFromQMimeType();
+     AutoEmbed readAutoEmbed() const;
+     void writeAutoEmbed();
+     bool isMimeTypeDirty() const; // whether the mimetype definition file needs saving
+@@ -116,7 +119,7 @@ private:
+     void saveServices(KConfigGroup & config, const QStringList& services);
+     void saveRemovedServices(KConfigGroup & config, const QStringList& services, const QStringList& oldServices);
+ 
+-    KMimeType::Ptr m_mimetype; // 0 if this is data for a mimetype group (m_isGroup==true)
++    QMimeType m_mimetype;
+     enum AskSave { AskSaveYes = 0, AskSaveNo = 1, AskSaveDefault = 2 };
+     AskSave m_askSave:3;
+     AutoEmbed m_autoEmbed:3;
+@@ -125,6 +128,7 @@ private:
+     bool m_isGroup:1;
+     bool m_appServicesModified:1;
+     bool m_embedServicesModified:1;
++    bool m_userSpecifiedIconModified:1;
+     QString m_major, m_minor, m_comment, m_userSpecifiedIcon;
+     QStringList m_patterns;
+     mutable QStringList m_appServices;
+diff --git a/keditfiletype/mimetypewriter.cpp b/keditfiletype/mimetypewriter.cpp
+index be5e5d4..11963d2 100644
+--- a/keditfiletype/mimetypewriter.cpp
++++ b/keditfiletype/mimetypewriter.cpp
+@@ -19,23 +19,15 @@
+ */
+ 
+ #include "mimetypewriter.h"
+-#include <kmimetype.h>
+ 
+-#include <kdebug.h>
+-#include <kdeversion.h>
+-#include <kprocess.h>
+-
+-
+-#include <QXmlStreamWriter>
++#include <QDebug>
+ #include <QFile>
++#include <QMimeDatabase>
++#include <QMimeType>
+ #include <QStandardPaths>
++#include <QXmlStreamWriter>
+ 
+-/// WARNING: this code is duplicated between apps/nsplugins and runtime/filetypes
+-
+-static bool sharedMimeInfoSupportsIcon()
+-{
+-    return KMimeType::sharedMimeInfoVersion() >= KDE_MAKE_VERSION(0, 40, 0);
+-}
++#include <kprocess.h>
+ 
+ class MimeTypeWriterPrivate
+ {
+@@ -84,10 +76,10 @@ void MimeTypeWriter::setMarker(const QString& marker)
+ bool MimeTypeWriter::write()
+ {
+     const QString packageFileName = d->localFilePath();
+-    kDebug() << "writing" << packageFileName;
++    qDebug() << "writing" << packageFileName;
+     QFile packageFile(packageFileName);
+     if (!packageFile.open(QIODevice::WriteOnly)) {
+-        kError() << "Couldn't open" << packageFileName << "for writing";
++        qCritical() << "Couldn't open" << packageFileName << "for writing";
+         return false;
+     }
+     QXmlStreamWriter writer(&packageFile);
+@@ -110,11 +102,9 @@ bool MimeTypeWriter::write()
+ 
+     if (!d->m_iconName.isEmpty()) {
+         // User-specified icon name
+-        if (sharedMimeInfoSupportsIcon()) {
+-            writer.writeStartElement(nsUri, "icon");
+-            writer.writeAttribute("name", d->m_iconName);
+-            writer.writeEndElement(); // icon
+-        }
++        writer.writeStartElement(nsUri, "icon");
++        writer.writeAttribute("name", d->m_iconName);
++        writer.writeEndElement(); // icon
+     }
+ 
+     // Allow this local definition to override the global definition
+@@ -142,7 +132,7 @@ void MimeTypeWriter::runUpdateMimeDatabase()
+     proc << localPackageDir;
+     const int exitCode = proc.execute();
+     if (exitCode) {
+-        kWarning() << proc.program() << "exited with error code" << exitCode;
++        qWarning() << proc.program() << "exited with error code" << exitCode;
+     }
+ }
+ 
+diff --git a/keditfiletype/mimetypewriter.h b/keditfiletype/mimetypewriter.h
+index 5a618a6..3dfca16 100644
+--- a/keditfiletype/mimetypewriter.h
++++ b/keditfiletype/mimetypewriter.h
+@@ -74,7 +74,7 @@ public:
+      *
+      * NOTE: this is not the same as testing whether the
+      * mimetype is defined in general (for instance by freedesktop.org.xml)
+-     * you should use KMimeType::mimeType() for that.
++     * you should use db.mimeTypeForName() for that.
+      * This method is only for mimetypes generated by MimeTypeWriter.
+      */
+     static bool hasDefinitionFile(const QString& mimeType);
+diff --git a/keditfiletype/newtypedlg.cpp b/keditfiletype/newtypedlg.cpp
+index c933a8f..78c2fdd 100644
+--- a/keditfiletype/newtypedlg.cpp
++++ b/keditfiletype/newtypedlg.cpp
+@@ -24,6 +24,7 @@
+ // Qt
+ #include <QBoxLayout>
+ #include <QComboBox>
++#include <QDialogButtonBox>
+ #include <QFrame>
+ #include <QFormLayout>
+ #include <QLabel>
+@@ -31,23 +32,21 @@
+ 
+ // KDE
+ #include <klineedit.h>
+-#include <klocale.h>
++#include <klocalizedstring.h>
+ 
+ 
+ NewTypeDialog::NewTypeDialog(const QStringList &groups, QWidget *parent)
+-  : KDialog( parent )
++  : QDialog( parent )
+ {
+   setModal( true );
+-  setCaption( i18n( "Create New File Type" ) );
+-  setButtons( Ok | Cancel );
++  setWindowTitle( i18n( "Create New File Type" ) );
+ 
+-  QWidget* main = mainWidget();
++  QVBoxLayout *mainLayout = new QVBoxLayout(this);
++  QFormLayout *formLayout = new QFormLayout;
+ 
+-  QFormLayout *formLayout = new QFormLayout(main);
++  QLabel *l = new QLabel(i18n("Group:"));
+ 
+-  QLabel *l = new QLabel(i18n("Group:"), main);
+-
+-  m_groupCombo = new QComboBox(main);
++  m_groupCombo = new QComboBox;
+   m_groupCombo->setEditable(true);
+   m_groupCombo->addItems(groups);
+   m_groupCombo->setCurrentIndex(m_groupCombo->findText("application")); // certainly a better default than "all"
+@@ -58,15 +57,24 @@ NewTypeDialog::NewTypeDialog(const QStringList &groups, QWidget *parent)
+ 
+   // Line 1: mimetype name
+ 
+-  l = new QLabel(i18n("Type name:"), main);
++  l = new QLabel(i18n("Type name:"));
+ 
+-  m_typeEd = new KLineEdit(main);
++  m_typeEd = new KLineEdit;
+   formLayout->addRow(l, m_typeEd);
+ 
+   m_typeEd->setWhatsThis(i18n("Type the name of the file type. For instance, if you selected 'image' as category and you type 'custom' here, the file type 'image/custom' will be created."));
+ 
+   m_typeEd->setFocus();
+ 
++  m_buttonBox = new QDialogButtonBox;
++  m_buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
++
++  mainLayout->addLayout(formLayout);
++  mainLayout->addWidget(m_buttonBox);
++
++  connect(m_buttonBox, SIGNAL(accepted()), SLOT(accept()));
++  connect(m_buttonBox, SIGNAL(rejected()), SLOT(reject()));
++
+   // Set a minimum width so that caption is not half-hidden
+   setMinimumWidth(300);
+ }
+diff --git a/keditfiletype/newtypedlg.h b/keditfiletype/newtypedlg.h
+index fba8385..cc7f9e2 100644
+--- a/keditfiletype/newtypedlg.h
++++ b/keditfiletype/newtypedlg.h
+@@ -20,8 +20,9 @@
+ #ifndef _NEWTYPEDLG_H
+ #define _NEWTYPEDLG_H
+ 
+-#include <kdialog.h>
++#include <QDialog>
+ 
++class QDialogButtonBox;
+ class QStringList;
+ class KLineEdit;
+ class QComboBox;
+@@ -32,7 +33,7 @@ class QComboBox;
+  * - a line-edit for entering the name of the file type
+  * The rest (description, patterns, icon, apps) can be set later in the filetypesview anyway.
+  */
+-class NewTypeDialog : public KDialog
++class NewTypeDialog : public QDialog
+ {
+ public:
+     explicit NewTypeDialog(const QStringList &groups, QWidget *parent);
+@@ -41,6 +42,7 @@ public:
+ private:
+     KLineEdit *m_typeEd;
+     QComboBox *m_groupCombo;
++    QDialogButtonBox* m_buttonBox;
+ };
+ 
+ #endif
+diff --git a/keditfiletype/sharedmimeinfoversion.cpp b/keditfiletype/sharedmimeinfoversion.cpp
+deleted file mode 100644
+index 9dabf0e..0000000
+--- a/keditfiletype/sharedmimeinfoversion.cpp
++++ /dev/null
+@@ -1,28 +0,0 @@
+-/*  This file is part of the KDE project
+-    Copyright (C) 2009 David Faure <faure@kde.org>
+-
+-    This program is free software; you can redistribute it and/or modify
+-    it under the terms of the GNU General Public License as published by
+-    the Free Software Foundation; either version 2 of the License or ( at
+-    your option ) version 3 or, at the discretion of KDE e.V. ( which shall
+-    act as a proxy as in section 14 of the GPLv3 ), any later version.
+-
+-    This program is distributed in the hope that it will be useful,
+-    but WITHOUT ANY WARRANTY; without even the implied warranty of
+-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-    General Public License for more details.
+-
+-    You should have received a copy of the GNU General Public License
+-    along with this program; see the file COPYING.  If not, write to
+-    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+-    Boston, MA 02110-1301, USA.
+-*/
+-
+-#include "sharedmimeinfoversion.h"
+-#include <kmimetype.h>
+-#include <kdeversion.h>
+-
+-bool SharedMimeInfoVersion::supportsIcon()
+-{
+-    return KMimeType::sharedMimeInfoVersion() >= KDE_MAKE_VERSION(0, 40, 0);
+-}
+diff --git a/keditfiletype/sharedmimeinfoversion.h b/keditfiletype/sharedmimeinfoversion.h
+deleted file mode 100644
+index 9824d7b..0000000
+--- a/keditfiletype/sharedmimeinfoversion.h
++++ /dev/null
+@@ -1,30 +0,0 @@
+-/*  This file is part of the KDE project
+-    Copyright (C) 2009 David Faure <faure@kde.org>
+-
+-    This program is free software; you can redistribute it and/or modify
+-    it under the terms of the GNU General Public License as published by
+-    the Free Software Foundation; either version 2 of the License or ( at
+-    your option ) version 3 or, at the discretion of KDE e.V. ( which shall
+-    act as a proxy as in section 14 of the GPLv3 ), any later version.
+-
+-    This program is distributed in the hope that it will be useful,
+-    but WITHOUT ANY WARRANTY; without even the implied warranty of
+-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-    General Public License for more details.
+-
+-    You should have received a copy of the GNU General Public License
+-    along with this program; see the file COPYING.  If not, write to
+-    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+-    Boston, MA 02110-1301, USA.
+-*/
+-
+-#ifndef SHAREDMIMEINFOVERSION_H
+-#define SHAREDMIMEINFOVERSION_H
+-
+-namespace SharedMimeInfoVersion
+-{
+-    bool supportsIcon();
+-}
+-
+-#endif /* SHAREDMIMEINFOVERSION_H */
+-
+diff --git a/keditfiletype/tests/CMakeLists.txt b/keditfiletype/tests/CMakeLists.txt
+index 489bb4d..cee562d 100644
+--- a/keditfiletype/tests/CMakeLists.txt
++++ b/keditfiletype/tests/CMakeLists.txt
+@@ -6,7 +6,6 @@ add_executable(filetypestest
+  filetypestest.cpp
+  ../mimetypedata.cpp
+  ../mimetypewriter.cpp
+- ../sharedmimeinfoversion.cpp
+ )
+ ecm_mark_as_test(filetypestest)
+ add_test(filetypestest filetypestest)
+diff --git a/keditfiletype/tests/filetypestest.cpp b/keditfiletype/tests/filetypestest.cpp
+index 68eef26..05dae41 100644
+--- a/keditfiletype/tests/filetypestest.cpp
++++ b/keditfiletype/tests/filetypestest.cpp
+@@ -19,7 +19,6 @@
+ 
+ #include <kprocess.h>
+ #include <kservice.h>
+-#include <qtest_kde.h>
+ 
+ #include <kconfiggroup.h>
+ #include <kdebug.h>
+@@ -27,9 +26,13 @@
+ #include <kstandarddirs.h>
+ #include <ksycoca.h>
+ 
++// Qt
++#include <QDir>
++#include <QStandardPaths>
++#include <QTest>
++
+ #include <mimetypedata.h>
+ #include <mimetypewriter.h>
+-#include <QStandardPaths>
+ 
+ #define KDE_MAKE_VERSION( a,b,c ) (((a) << 16) | ((b) << 8) | (c))
+ 
+@@ -108,7 +111,8 @@ private Q_SLOTS:
+ 
+     void testMimeTypeAutoEmbed()
+     {
+-        MimeTypeData data(KMimeType::mimeType("text/plain"));
++        QMimeDatabase db;
++        MimeTypeData data(db.mimeTypeForName("text/plain"));
+         QCOMPARE(data.majorType(), QString("text"));
+         QCOMPARE(data.minorType(), QString("plain"));
+         QCOMPARE(data.name(), QString("text/plain"));
+@@ -121,7 +125,7 @@ private Q_SLOTS:
+         QVERIFY(!data.sync()); // save to disk. Should succeed, but return false (no need to run update-mime-database)
+         QVERIFY(!data.isDirty());
+         // Check what's on disk by creating another MimeTypeData instance
+-        MimeTypeData data2(KMimeType::mimeType("text/plain"));
++        MimeTypeData data2(db.mimeTypeForName("text/plain"));
+         QCOMPARE(data2.autoEmbed(), MimeTypeData::Yes);
+         QVERIFY(!data2.isDirty());
+         data2.setAutoEmbed(MimeTypeData::UseGroupSetting); // revert to default, for next time
+@@ -132,7 +136,8 @@ private Q_SLOTS:
+ 
+     void testMimeTypePatterns()
+     {
+-        MimeTypeData data(KMimeType::mimeType("text/plain"));
++        QMimeDatabase db;
++        MimeTypeData data(db.mimeTypeForName("text/plain"));
+         QCOMPARE(data.name(), QString("text/plain"));
+         QCOMPARE(data.majorType(), QString("text"));
+         QCOMPARE(data.minorType(), QString("plain"));
+@@ -141,10 +146,7 @@ private Q_SLOTS:
+         QVERIFY(patterns.contains("*.txt"));
+         QVERIFY(!patterns.contains("*.toto"));
+         const QStringList origPatterns = patterns;
+-        if (KMimeType::sharedMimeInfoVersion() >= KDE_MAKE_VERSION(0, 61, 0)) {
+-            // <glob-deleteall> is only supported by shared-mime-info > 0.60
+-            patterns.removeAll("*.txt");
+-        }
++        patterns.removeAll("*.txt");
+         patterns.append("*.toto"); // yes, a french guy wrote this, as you can see
+         patterns.sort(); // for future comparisons
+         QVERIFY(!data.isDirty());
+@@ -158,7 +160,7 @@ private Q_SLOTS:
+         data.refresh(); // reload from the xml
+         QCOMPARE(data.patterns(), patterns);
+         // Check what's in ksycoca
+-        QStringList newPatterns = KMimeType::mimeType("text/plain")->patterns();
++        QStringList newPatterns = db.mimeTypeForName("text/plain").globPatterns();
+         newPatterns.sort();
+         QCOMPARE(newPatterns, patterns);
+         QVERIFY(!data.isDirty());
+@@ -170,15 +172,16 @@ private Q_SLOTS:
+         MimeTypeWriter::runUpdateMimeDatabase();
+         //runKBuildSycoca();
+         // Check what's in ksycoca
+-        newPatterns = KMimeType::mimeType("text/plain")->patterns();
++        newPatterns = db.mimeTypeForName("text/plain").globPatterns();
+         newPatterns.sort();
+         QCOMPARE(newPatterns, origPatterns);
+     }
+ 
+     void testAddService()
+     {
++        QMimeDatabase db;
+         const char* mimeTypeName = "application/rtf"; // use inherited mimetype to test #321706
+-        MimeTypeData data(KMimeType::mimeType(mimeTypeName));
++        MimeTypeData data(db.mimeTypeForName(mimeTypeName));
+         QStringList appServices = data.appServices();
+         //kDebug() << appServices;
+         QVERIFY(!appServices.isEmpty());
+@@ -222,9 +225,10 @@ private Q_SLOTS:
+ 
+     void testRemoveTwice()
+     {
++        QMimeDatabase db;
+         // Remove fakeApplication from image/png
+         const char* mimeTypeName = "image/png";
+-        MimeTypeData data(KMimeType::mimeType(mimeTypeName));
++        MimeTypeData data(db.mimeTypeForName(mimeTypeName));
+         QStringList appServices = data.appServices();
+         kDebug() << "initial list for" << mimeTypeName << appServices;
+         QVERIFY(appServices.removeAll(fakeApplication) > 0);
+@@ -264,6 +268,7 @@ private Q_SLOTS:
+ 
+     void testCreateMimeType()
+     {
++        QMimeDatabase db;
+         const QString mimeTypeName = "fake/unit-test-fake-mimetype";
+         // Clean up after previous runs if necessary
+         if (MimeTypeWriter::hasDefinitionFile(mimeTypeName))
+@@ -277,19 +282,20 @@ private Q_SLOTS:
+         QVERIFY(data.sync());
+         MimeTypeWriter::runUpdateMimeDatabase();
+         //runKBuildSycoca();
+-        KMimeType::Ptr mime = KMimeType::mimeType(mimeTypeName);
+-        QVERIFY(mime);
+-        QCOMPARE(mime->comment(), QString("Fake MimeType"));
+-        QCOMPARE(mime->patterns(), patterns); // must sort them if more than one
++        QMimeType mime = db.mimeTypeForName(mimeTypeName);
++        QVERIFY(mime.isValid());
++        QCOMPARE(mime.comment(), QString("Fake MimeType"));
++        QCOMPARE(mime.globPatterns(), patterns); // must sort them if more than one
+ 
+         // Testcase for the shaman.xml bug
+-        QCOMPARE(KMimeType::findByPath("/whatever/foo.pkg.tar.gz")->name(), QString("fake/unit-test-fake-mimetype"));
++        QCOMPARE(db.mimeTypeForFile("/whatever/foo.pkg.tar.gz").name(), QString("fake/unit-test-fake-mimetype"));
+ 
+         m_mimeTypeCreatedSuccessfully = true;
+     }
+ 
+     void testDeleteMimeType()
+     {
++        QMimeDatabase db;
+         if (!m_mimeTypeCreatedSuccessfully)
+             QSKIP("This test relies on testCreateMimeType");
+         const QString mimeTypeName = "fake/unit-test-fake-mimetype";
+@@ -297,14 +303,15 @@ private Q_SLOTS:
+         MimeTypeWriter::removeOwnMimeType(mimeTypeName);
+         MimeTypeWriter::runUpdateMimeDatabase();
+         //runKBuildSycoca();
+-        KMimeType::Ptr mime = KMimeType::mimeType(mimeTypeName);
+-        QVERIFY(!mime);
++        QMimeType mime = db.mimeTypeForName(mimeTypeName);
++        QVERIFY(mime.isValid());
+     }
+ 
+     void testModifyMimeTypeComment() // of a system mimetype. And check that it's re-read correctly.
+     {
++        QMimeDatabase db;
+         const char* mimeTypeName = "image/png";
+-        MimeTypeData data(KMimeType::mimeType(mimeTypeName));
++        MimeTypeData data(db.mimeTypeForName(mimeTypeName));
+         QCOMPARE(data.comment(), QString::fromLatin1("PNG image"));
+         const char* fakeComment = "PNG image [testing]";
+         data.setComment(fakeComment);
+@@ -312,9 +319,9 @@ private Q_SLOTS:
+         QVERIFY(data.sync());
+         MimeTypeWriter::runUpdateMimeDatabase();
+         //runKBuildSycoca();
+-        KMimeType::Ptr mime = KMimeType::mimeType(mimeTypeName);
+-        QVERIFY(mime);
+-        QCOMPARE(mime->comment(), QString::fromLatin1(fakeComment));
++        QMimeType mime = db.mimeTypeForName(mimeTypeName);
++        QVERIFY(mime.isValid());
++        QCOMPARE(mime.comment(), QString::fromLatin1(fakeComment));
+ 
+         // Cleanup
+         QVERIFY(MimeTypeWriter::hasDefinitionFile(mimeTypeName));
+@@ -391,7 +398,8 @@ private: // helper methods
+ 
+     void checkMimeTypeServices(const QString& mimeTypeName, const QStringList& expectedServices)
+     {
+-        MimeTypeData data2(KMimeType::mimeType(mimeTypeName));
++        QMimeDatabase db;
++        MimeTypeData data2(db.mimeTypeForName(mimeTypeName));
+         if (data2.appServices() != expectedServices)
+             kDebug() << "got" << data2.appServices() << "expected" << expectedServices;
+         QCOMPARE(data2.appServices(), expectedServices);
+@@ -403,6 +411,6 @@ private: // helper methods
+     bool m_mimeTypeCreatedSuccessfully;
+ };
+ 
+-QTEST_KDEMAIN( FileTypesTest, NoGUI )
++QTEST_MAIN(FileTypesTest)
+ 
+ #include "filetypestest.moc"
+diff --git a/keditfiletype/typeslistitem.cpp b/keditfiletype/typeslistitem.cpp
+index 97cd3c1..44f0ff1 100644
+--- a/keditfiletype/typeslistitem.cpp
++++ b/keditfiletype/typeslistitem.cpp
+@@ -22,9 +22,8 @@
+ // Own
+ #include "typeslistitem.h"
+ 
+-// KDE
+-#include <kdebug.h>
+-#include <kicon.h>
++// Qt
++#include <QDebug>
+ 
+ 
+ TypesListItem::TypesListItem(QTreeWidget *parent, const QString & major)
+@@ -34,7 +33,7 @@ TypesListItem::TypesListItem(QTreeWidget *parent, const QString & major)
+     setText(0, major);
+ }
+ 
+-TypesListItem::TypesListItem(TypesListItem *parent, KMimeType::Ptr mimetype)
++TypesListItem::TypesListItem(TypesListItem *parent, QMimeType mimetype)
+   : QTreeWidgetItem(parent),
+     m_mimetypeData(mimetype)
+ {
+@@ -61,7 +60,7 @@ void TypesListItem::setIcon( const QString& icon )
+ void TypesListItem::loadIcon(bool forceReload)
+ {
+     if ((!m_mimetypeData.icon().isEmpty() && icon(0).isNull()) || forceReload) {
+-        QTreeWidgetItem::setIcon(0, KIcon(m_mimetypeData.icon()));
++        QTreeWidgetItem::setIcon(0, QIcon::fromTheme(m_mimetypeData.icon()));
+     }
+ }
+ 
+diff --git a/keditfiletype/typeslistitem.h b/keditfiletype/typeslistitem.h
+index 05e425a..e86f3a4 100644
+--- a/keditfiletype/typeslistitem.h
++++ b/keditfiletype/typeslistitem.h
+@@ -24,7 +24,8 @@
+ #include "mimetypedata.h"
+ #include <QTreeWidgetItem>
+ 
+-#include <kmimetype.h>
++#include <QMimeType>
++#include <QMimeDatabase>
+ 
+ // TODO different subclasses for mimetypes and groups?
+ class TypesListItem : public QTreeWidgetItem
+@@ -38,7 +39,7 @@ public:
+     /**
+      * Create a filetype item inside a group, for an existing mimetype
+      */
+-    TypesListItem(TypesListItem *parent, KMimeType::Ptr mimetype);
++    TypesListItem(TypesListItem *parent, QMimeType mimetype);
+ 
+     /**
+      * Create a filetype item inside a group, for a new mimetype
+diff --git a/kioclient/kioclient.cpp b/kioclient/kioclient.cpp
+index 5bd7df1..4cacc1f 100644
+--- a/kioclient/kioclient.cpp
++++ b/kioclient/kioclient.cpp
+@@ -39,6 +39,7 @@ bool ClientApp::m_ok = true;
+ static bool s_interactive = true;
+ static KIO::JobFlags s_jobFlags = KIO::DefaultFlags;
+ 
++// Qt5 TODO: use QUrl::fromUserInput(urlArgs, QDir::currentPath());
+ QUrl /*KCmdLineArgs::*/makeURL(const QString &urlArg)
+ {
+     QFileInfo fileInfo(urlArg);
+@@ -133,9 +134,12 @@ int main( int argc, char **argv )
+   QString programName = i18n("KIO Client");
+   QString description = i18n("Command-line tool for network-transparent operations");
+   QString version = "2.0";
+-  KAboutData data(appName, appName, programName, version, description, KAboutData::License_LGPL_V2);
++  KAboutData data(appName, programName, version, description, KAboutLicense::LGPL_V2);
++  KAboutData::setApplicationData(data);
+ 
+   QCommandLineParser parser;
++  parser.addVersionOption();
++  parser.addHelpOption();
+   parser.addOption(QCommandLineOption("noninteractive", i18n("Non-interactive use: no message boxes. If you don't want a "
+                                                              "graphical connection, use --platform offscreen")));
+