diff --git a/app/src/handlers/systemhandler.cpp b/app/src/handlers/systemhandler.cpp
index 461cbce430c7a462b49dc837e9c42ea1c327eef7..f145dff4f9ddf09b2a2d0f4cdc2e72a0fe6d2e4d 100644
--- a/app/src/handlers/systemhandler.cpp
+++ b/app/src/handlers/systemhandler.cpp
@@ -96,7 +96,11 @@ bool SystemHandler::isApplicableType(const QString &installType) const
     QStringList applicableTypes;
 
     if (desktop == "kde") {
-        applicableTypes << "wallpapers";
+        applicableTypes << "wallpapers"
+                        << "icons"
+                        << "cursors"
+                        << "plasma_desktopthemes"
+                        << "aurorae_themes";
     }
     else if (desktop == "gnome") {
         applicableTypes << "wallpapers"
@@ -122,6 +126,18 @@ bool SystemHandler::applyFile(const QString &path, const QString &installType) c
             if (installType == "wallpapers") {
                 return applyKdeWallpaper(path);
             }
+            else if (installType == "icons") {
+                return applyKdeIcon(path);
+            }
+            else if (installType == "cursors") {
+                return applyKdeCursor(path);
+            }
+            else if (installType == "plasma_desktopthemes") {
+                return applyKdePlasmaDesktoptheme(path);
+            }
+            else if (installType == "aurorae_themes") {
+                return applyKdeAuroraeTheme(path);
+            }
         }
         else if (desktop == "gnome") {
             if (installType == "wallpapers") {
@@ -179,6 +195,116 @@ bool SystemHandler::applyKdeWallpaper(const QString &path) const
     return true;
 }
 
+bool SystemHandler::applyKdeIcon(const QString &path) const
+{
+    auto themeName = QFileInfo(path).fileName();
+    auto message = QDBusMessage::createMethodCall("org.kde.plasmashell", "/PlasmaShell", "org.kde.PlasmaShell", "evaluateScript");
+
+    QString script;
+    QTextStream out(&script);
+    out << "var c = ConfigFile('kdeglobals');"
+        << "c.group = 'Icons';"
+        << "c.writeEntry('Theme', '" + themeName + "');";
+
+    QVariantList arguments;
+    arguments << QVariant(script);
+    message.setArguments(arguments);
+
+    auto reply = QDBusConnection::sessionBus().call(message);
+
+    if (reply.type() == QDBusMessage::ErrorMessage) {
+        qWarning() << reply.errorMessage();
+        return false;
+    }
+
+    QProcess::startDetached("kquitapp5 plasmashell");
+    QProcess::startDetached("kstart5 plasmashell");
+
+    return true;
+}
+
+bool SystemHandler::applyKdeCursor(const QString &path) const
+{
+    auto themeName = QFileInfo(path).fileName();
+    auto message = QDBusMessage::createMethodCall("org.kde.plasmashell", "/PlasmaShell", "org.kde.PlasmaShell", "evaluateScript");
+
+    QString script;
+    QTextStream out(&script);
+    out << "var c = ConfigFile('kcminputrc');"
+        << "c.group = 'Mouse';"
+        << "c.writeEntry('cursorTheme', '" + themeName + "');";
+
+    QVariantList arguments;
+    arguments << QVariant(script);
+    message.setArguments(arguments);
+
+    auto reply = QDBusConnection::sessionBus().call(message);
+
+    if (reply.type() == QDBusMessage::ErrorMessage) {
+        qWarning() << reply.errorMessage();
+        return false;
+    }
+
+    return true;
+}
+
+bool SystemHandler::applyKdePlasmaDesktoptheme(const QString &path) const
+{
+    auto themeName = QFileInfo(path).fileName();
+    auto message = QDBusMessage::createMethodCall("org.kde.plasmashell", "/PlasmaShell", "org.kde.PlasmaShell", "evaluateScript");
+
+    QString script;
+    QTextStream out(&script);
+    out << "var c = ConfigFile('plasmarc');"
+        << "c.group = 'Theme';"
+        << "c.writeEntry('name', '" + themeName + "');";
+
+    QVariantList arguments;
+    arguments << QVariant(script);
+    message.setArguments(arguments);
+
+    auto reply = QDBusConnection::sessionBus().call(message);
+
+    if (reply.type() == QDBusMessage::ErrorMessage) {
+        qWarning() << reply.errorMessage();
+        return false;
+    }
+
+    QProcess::startDetached("kquitapp5 plasmashell");
+    QProcess::startDetached("kstart5 plasmashell");
+
+    return true;
+}
+
+bool SystemHandler::applyKdeAuroraeTheme(const QString &path) const
+{
+    auto themeName = QFileInfo(path).fileName();
+    auto message = QDBusMessage::createMethodCall("org.kde.plasmashell", "/PlasmaShell", "org.kde.PlasmaShell", "evaluateScript");
+
+    QString script;
+    QTextStream out(&script);
+    out << "var c = ConfigFile('kwinrc');"
+        << "c.group = 'org.kde.kdecoration2';"
+        << "c.writeEntry('library', 'org.kde.kwin.aurorae');"
+        << "c.writeEntry('theme', '__aurorae__svg__" + themeName + "');";
+
+    QVariantList arguments;
+    arguments << QVariant(script);
+    message.setArguments(arguments);
+
+    auto reply = QDBusConnection::sessionBus().call(message);
+
+    if (reply.type() == QDBusMessage::ErrorMessage) {
+        qWarning() << reply.errorMessage();
+        return false;
+    }
+
+    auto refreshMessage = QDBusMessage::createMethodCall("org.kde.KWin", "/KWin", "org.kde.KWin", "reconfigure");
+    QDBusConnection::sessionBus().call(refreshMessage);
+
+    return true;
+}
+
 bool SystemHandler::applyGnomeWallpaper(const QString &path) const
 {
     QStringList arguments{"set", "org.gnome.desktop.background", "picture-uri", "file://" + path};
diff --git a/app/src/handlers/systemhandler.h b/app/src/handlers/systemhandler.h
index 3ea555e5983718de0a9fae0b17ddc8983d7e39c8..f9bd1ee4082652a9bb0c6b5c6941f026ae2b006d 100644
--- a/app/src/handlers/systemhandler.h
+++ b/app/src/handlers/systemhandler.h
@@ -24,6 +24,10 @@ public slots:
 private:
 #ifdef QTLIB_UNIX
     bool applyKdeWallpaper(const QString &path) const;
+    bool applyKdeIcon(const QString &path) const;
+    bool applyKdeCursor(const QString &path) const;
+    bool applyKdePlasmaDesktoptheme(const QString &path) const;
+    bool applyKdeAuroraeTheme(const QString &path) const;
 
     bool applyGnomeWallpaper(const QString &path) const;
     bool applyGnomeIcon(const QString &path) const;