diff --git a/ksplash/CMakeLists.txt b/ksplash/CMakeLists.txt
index 765a90c..0d0934b 100644
--- a/ksplash/CMakeLists.txt
+++ b/ksplash/CMakeLists.txt
@@ -2,3 +2,4 @@ add_subdirectory( ksplashx )
 add_subdirectory( simple )
 add_subdirectory( none )
 add_subdirectory( kcm )
+add_subdirectory( ksplashqml )
diff --git a/ksplash/kcm/installer.cpp b/ksplash/kcm/installer.cpp
index cada800..db2450b 100644
--- a/ksplash/kcm/installer.cpp
+++ b/ksplash/kcm/installer.cpp
@@ -184,7 +184,7 @@ SplashInstaller::~SplashInstaller()
 
 int SplashInstaller::addTheme(const QString &path, const QString &name)
 {
-  //kDebug() << "SplashInstaller::addTheme: " << path << " " << name;
+  qDebug() << "SplashInstaller::addTheme: " << path << " " << name;
   QString tmp(i18n( name.toUtf8() ));
   int i = mThemesList->count();
   while((i > 0) && (mThemesList->item(i-1)->text() > tmp))
@@ -434,7 +434,11 @@ void SplashInstaller::slotSetTheme(int id)
         infoTxt += "</qt>";
 
         QString pluginName( cnf.readEntry( "Engine", "KSplashX" ).trimmed() );
-        if( pluginName == "Simple" || pluginName == "None" || pluginName == "KSplashX" )
+        if( pluginName == "Simple"
+                || pluginName == "None"
+                || pluginName == "KSplashX"
+                || pluginName == "KSplashQML"
+                )
             enabled = true; // these are not plugins
         else if ((KServiceTypeTrader::self()->query("KSplash/Plugin", QString("[X-KSplash-PluginName] == '%1'").arg(pluginName))).isEmpty())
         {
@@ -536,6 +540,7 @@ void SplashInstaller::slotTest()
     themeName = themeName.mid(r+1);
 
   // special handling for none and simple splashscreens
+  qDebug() << "the engine is " << mEngineOfSelected << "for" << themeName;
   if( mEngineOfSelected == "None" )
     return;
   else if( mEngineOfSelected == "Simple" )
@@ -554,6 +559,14 @@ void SplashInstaller::slotTest()
       KMessageBox::error(this,i18n("Failed to successfully test the splash screen."));
     return;
   }
+  else if( mEngineOfSelected == "KSplashQML" )
+  {
+    KProcess proc;
+    proc << "ksplashqml" << themeName << "--test";
+    if (proc.execute())
+      KMessageBox::error(this,i18n("Failed to successfully test the splash screen."));
+    return;
+  }
   else // KSplashML engines
   {
     KProcess proc;
diff --git a/ksplash/ksplashqml/CMakeLists.txt b/ksplash/ksplashqml/CMakeLists.txt
new file mode 100644
index 0000000..a9a3866
--- /dev/null
+++ b/ksplash/ksplashqml/CMakeLists.txt
@@ -0,0 +1,17 @@
+project(ksplashqml)
+
+set(ksplashqml_SRCS
+    main.cpp
+    SplashApp.cpp
+    SplashWindow.cpp
+   )
+
+add_executable(ksplashqml ${ksplashqml_SRCS})
+
+target_link_libraries(ksplashqml
+   ${X11_LIBRARIES}
+   ${QT_QTDECLARATIVE_LIBRARY}
+   ${QT_QTUI_LIBRARY}
+   )
+
+install(TARGETS ksplashqml ${INSTALL_TARGETS_DEFAULT_ARGS})
diff --git a/ksplash/ksplashqml/SplashApp.cpp b/ksplash/ksplashqml/SplashApp.cpp
new file mode 100644
index 0000000..84a36ab
--- /dev/null
+++ b/ksplash/ksplashqml/SplashApp.cpp
@@ -0,0 +1,116 @@
+/*
+ *   Copyright (C) 2010 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License version 2,
+ *   or (at your option) any later version, as published by the Free
+ *   Software Foundation
+ *
+ *   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; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include "SplashWindow.h"
+#include "SplashApp.h"
+
+#define TEST_STEP_INTERVAL 2000
+
+SplashApp::SplashApp(Display * display, int argc, char ** argv)
+    : QApplication(display, argc, argv),
+      m_display(display), m_stage(0), m_window(0),
+      m_testing(false)
+{
+    m_kde_splash_progress = XInternAtom(m_display, "_KDE_SPLASH_PROGRESS", False);
+    m_testing = arguments().contains("--test");
+    m_window = new SplashWindow(m_testing);
+
+    setStage(1);
+
+    int sw = WidthOfScreen(ScreenOfDisplay(display, DefaultScreen(display)));
+    int sh = HeightOfScreen(ScreenOfDisplay(display, DefaultScreen(display)));
+
+    m_window->setGeometry(0, 0, sw, sh);
+    m_window->show();
+
+    XSelectInput(display, DefaultRootWindow(display), SubstructureNotifyMask);
+
+    if (m_testing) {
+        m_timer.start(TEST_STEP_INTERVAL, this);
+    }
+}
+
+SplashApp::~SplashApp() {
+    delete m_window;
+}
+
+Display * SplashApp::display() const
+{
+    return m_display;
+}
+
+void SplashApp::timerEvent(QTimerEvent * event)
+{
+    if (event->timerId() == m_timer.timerId()) {
+        m_timer.stop();
+
+        setStage(m_stage + 1);
+
+        m_timer.start(TEST_STEP_INTERVAL, this);
+    }
+}
+
+bool SplashApp::x11EventFilter(XEvent * xe)
+{
+    char * message;
+    switch (xe->type) {
+        case ClientMessage:
+            if (xe->xclient.message_type == m_kde_splash_progress) {
+                message = xe->xclient.data.b;
+
+                int stage = -1;
+
+                if (strcmp(message, "initial") == 0 && m_stage < 0)
+                    stage = 0; // not actually used
+                else if (strcmp(message, "kded") == 0 && m_stage < 1)
+                    stage = 1;
+                else if (strcmp(message, "confupdate") == 0 && m_stage < 2)
+                    stage = 2;
+                else if (strcmp(message, "kcminit") == 0 && m_stage < 3)
+                    stage = 3;
+                else if (strcmp(message, "ksmserver") == 0 && m_stage < 4)
+                    stage = 4;
+                else if (strcmp(message, "wm") == 0 && m_stage < 5)
+                    stage = 5;
+                else if (strcmp(message, "desktop") == 0 && m_stage < 6)
+                    stage = 6;
+
+                setStage(stage);
+            }
+    }
+    return false;
+
+}
+
+int SplashApp::x11ProcessEvent(XEvent * xe)
+{
+    Q_UNUSED(xe)
+    return 0;
+}
+
+void SplashApp::setStage(int stage)
+{
+    if (m_stage == 6) {
+        QApplication::exit(EXIT_SUCCESS);
+    }
+
+    m_stage = stage;
+    m_window->setStage(stage);
+}
+
diff --git a/ksplash/ksplashqml/SplashApp.h b/ksplash/ksplashqml/SplashApp.h
new file mode 100644
index 0000000..bc3fbdf
--- /dev/null
+++ b/ksplash/ksplashqml/SplashApp.h
@@ -0,0 +1,55 @@
+/*
+ *   Copyright (C) 2010 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License version 2,
+ *   or (at your option) any later version, as published by the Free
+ *   Software Foundation
+ *
+ *   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; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef SPLASH_APP_H_
+#define SPLASH_APP_H_
+
+#include <QObject>
+#include <QApplication>
+#include <QBasicTimer>
+
+#include <X11/Xlib.h>
+
+class SplashWindow;
+
+class SplashApp: public QApplication {
+
+public:
+    SplashApp(Display * display, int argc, char ** argv);
+    ~SplashApp();
+
+    Display * display() const;
+
+    bool x11EventFilter(XEvent * xe);
+    int x11ProcessEvent(XEvent * xe);
+
+protected:
+    void timerEvent(QTimerEvent * event);
+    void setStage(int stage);
+
+private:
+    Display * m_display;
+    int m_stage;
+    Atom m_kde_splash_progress;
+    SplashWindow * m_window;
+    bool m_testing;
+    QBasicTimer m_timer;
+};
+
+#endif // SPLASH_APP_H_
diff --git a/ksplash/ksplashqml/SplashWindow.cpp b/ksplash/ksplashqml/SplashWindow.cpp
new file mode 100644
index 0000000..94e6ded
--- /dev/null
+++ b/ksplash/ksplashqml/SplashWindow.cpp
@@ -0,0 +1,83 @@
+/*
+ *   Copyright (C) 2010 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License version 2,
+ *   or (at your option) any later version, as published by the Free
+ *   Software Foundation
+ *
+ *   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; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include "SplashWindow.h"
+
+#include <QApplication>
+#include <QDeclarativeContext>
+#include <QGraphicsObject>
+#include <QKeyEvent>
+#include <QMouseEvent>
+#include <QTimer>
+
+#include "SystemInfo.h"
+
+SplashWindow::SplashWindow(bool testing)
+    : QDeclarativeView(),
+      m_stage(0),
+      m_testing(testing)
+{
+    setWindowFlags(
+            Qt::FramelessWindowHint |
+            Qt::WindowStaysOnTopHint
+        );
+
+    if (m_testing) {
+        setWindowState(Qt::WindowFullScreen);
+    } else {
+        setWindowFlags(Qt::X11BypassWindowManagerHint);
+    }
+
+    rootContext()->setContextProperty("screenSize", size());
+    setSource(QUrl(themeDir(QApplication::arguments().at(1)) + "/main.qml"));
+    setStyleSheet("background: #000000; border: none");
+    //be sure it will be eventually closed
+    //FIXME: should never be stuck
+    QTimer::singleShot(120000, this, SLOT(close()));
+}
+
+void SplashWindow::setStage(int stage)
+{
+    m_stage = stage;
+
+    rootObject()->setProperty("stage", stage);
+}
+
+void SplashWindow::resizeEvent(QResizeEvent *event)
+{
+    Q_UNUSED(event)
+    rootContext()->setContextProperty("screenSize", size());
+    centerOn(rootObject());
+}
+
+void SplashWindow::keyPressEvent(QKeyEvent *event)
+{
+    QDeclarativeView::keyPressEvent(event);
+    if (m_testing && !event->isAccepted() && event->key() == Qt::Key_Escape) {
+        close();
+    }
+}
+
+void SplashWindow::mousePressEvent(QMouseEvent *event)
+{
+    QDeclarativeView::mousePressEvent(event);
+    if (m_testing && !event->isAccepted()) {
+        close();
+    }
+}
diff --git a/ksplash/ksplashqml/SplashWindow.h b/ksplash/ksplashqml/SplashWindow.h
new file mode 100644
index 0000000..9680c1e
--- /dev/null
+++ b/ksplash/ksplashqml/SplashWindow.h
@@ -0,0 +1,46 @@
+/*
+ *   Copyright (C) 2010 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License version 2,
+ *   or (at your option) any later version, as published by the Free
+ *   Software Foundation
+ *
+ *   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; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef SPLASH_WINDOW_H_
+#define SPLASH_WINDOW_H_
+
+#include <QDeclarativeView>
+
+class QResizeEvent;
+class QMouseEvent;
+class QKeyEvent;
+
+class SplashWindow: public QDeclarativeView
+{
+public:
+    SplashWindow(bool testing);
+
+    void setStage(int stage);
+
+protected:
+    virtual void resizeEvent (QResizeEvent *event);
+    virtual void keyPressEvent(QKeyEvent *event);
+    virtual void mousePressEvent(QMouseEvent *event);
+
+private:
+    int m_stage;
+    bool m_testing;
+};
+
+#endif // SPLASH_WINDOW_H_
diff --git a/ksplash/ksplashqml/SystemInfo.h b/ksplash/ksplashqml/SystemInfo.h
new file mode 100644
index 0000000..b2d5fda
--- /dev/null
+++ b/ksplash/ksplashqml/SystemInfo.h
@@ -0,0 +1,60 @@
+/*
+ *   Copyright (C) 2010 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License version 2,
+ *   or (at your option) any later version, as published by the Free
+ *   Software Foundation
+ *
+ *   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; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef SYSTEM_INFO_H_
+#define SYSTEM_INFO_H_
+
+#include <stdlib.h>
+#include <config-workspace.h>
+
+#include <QDir>
+#include <QString>
+
+QString homeDir()
+{
+    const char * kdehome = getenv("KDEHOME");
+    const char * home = getenv("HOME");
+    if (kdehome && kdehome[0]) {
+        return QString() + home + "/" + KDE_DEFAULT_HOME;
+    }
+
+    return kdehome;
+}
+
+QString systemDir()
+{
+    return KDE_DATADIR;
+}
+
+QString themeDir(QString theme)
+{
+    QString path;
+
+    path = homeDir() + "/share/apps/ksplash/Themes/" + theme;
+
+    if (!QDir(path).exists()) {
+        path = systemDir() + "/ksplash/Themes/" + theme;
+    }
+
+    return path;
+}
+
+#endif // SYSTEM_INFO_H_
+
+
diff --git a/ksplash/ksplashqml/main.cpp b/ksplash/ksplashqml/main.cpp
new file mode 100644
index 0000000..ed409e2
--- /dev/null
+++ b/ksplash/ksplashqml/main.cpp
@@ -0,0 +1,66 @@
+/*
+ *   Copyright (C) 2011 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License version 2,
+ *   or (at your option) any later version, as published by the Free
+ *   Software Foundation
+ *
+ *   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; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include "SplashApp.h"
+
+#include <iostream>
+#include <X11/Xlib.h>
+
+int main(int argc, char **argv)
+{
+    bool test = false;
+    bool printPid = false;
+
+    for (int i = 1; i < argc; i++) {
+        if (strcmp("--test", argv[i]) == 0)
+            test = true;
+        else if (strcmp("--pid", argv[i]) == 0)
+            printPid = true;
+    }
+
+    // lets fork and all that...
+
+    if (!test) {
+        pid_t pid = fork();
+        if (pid < -1) {
+            return -1;
+        }
+
+        if (pid != 0) {
+            // this is the parent process, returning pid of the fork
+            if (printPid) {
+                std::cout << pid << std::endl;
+            }
+
+            return 0;
+        }
+
+        // close stdin,stdout,stderr, otherwise startkde will block
+        close(0);
+        close(1);
+        close(2);
+    }
+
+    Display * display = XOpenDisplay(NULL);
+
+    SplashApp app(display, argc, argv);
+
+    return app.exec();
+}
+
diff --git a/ksplash/ksplashqml/themes/CMakeLists.txt b/ksplash/ksplashqml/themes/CMakeLists.txt
new file mode 100644
index 0000000..818070c
--- /dev/null
+++ b/ksplash/ksplashqml/themes/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_subdirectory(qmltest)
+add_subdirectory(qmldefault)
diff --git a/ksplash/ksplashqml/themes/qmldefault/CMakeLists.txt b/ksplash/ksplashqml/themes/qmldefault/CMakeLists.txt
new file mode 100644
index 0000000..6f28f3b
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmldefault/CMakeLists.txt
@@ -0,0 +1,7 @@
+install(FILES Preview.png Theme.rc main.qml DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault)
+
+install(FILES images/kdegear.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault/images)
+install(FILES images/kdeletter.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault/images)
+install(FILES images/kdemask.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault/images)
+install(FILES images/kdelogo.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault/images)
+install(FILES images/kdelogo-contrast.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault/images)
diff --git a/ksplash/ksplashqml/themes/qmldefault/Preview.png b/ksplash/ksplashqml/themes/qmldefault/Preview.png
new file mode 100644
index 0000000..532adf7
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/Preview.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/Theme.rc b/ksplash/ksplashqml/themes/qmldefault/Theme.rc
new file mode 100644
index 0000000..4dc90f8
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmldefault/Theme.rc
@@ -0,0 +1,9 @@
+[KSplash Theme: qmldefault]
+Name = Minimalistic splash screen
+Description = Animated KDE logo on a black background
+Version = 1.0
+Author = Ivan Cukic <ivan.cukic at kde.org>
+Homepage = http://www.kde.org
+
+# Theme behaviour settings.
+Engine = KSplashQML
diff --git a/ksplash/ksplashqml/themes/qmldefault/images/kdegear.png b/ksplash/ksplashqml/themes/qmldefault/images/kdegear.png
new file mode 100644
index 0000000..66a50c2
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/images/kdegear.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/images/kdeletter.png b/ksplash/ksplashqml/themes/qmldefault/images/kdeletter.png
new file mode 100644
index 0000000..cabe17c
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/images/kdeletter.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/images/kdelogo-contrast.png b/ksplash/ksplashqml/themes/qmldefault/images/kdelogo-contrast.png
new file mode 100644
index 0000000..fe60715
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/images/kdelogo-contrast.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/images/kdelogo.png b/ksplash/ksplashqml/themes/qmldefault/images/kdelogo.png
new file mode 100644
index 0000000..d637b37
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/images/kdelogo.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/images/kdemask.png b/ksplash/ksplashqml/themes/qmldefault/images/kdemask.png
new file mode 100644
index 0000000..50319fc
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/images/kdemask.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/main.qml b/ksplash/ksplashqml/themes/qmldefault/main.qml
new file mode 100644
index 0000000..90a5494
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmldefault/main.qml
@@ -0,0 +1,189 @@
+/*   vim:set foldenable foldmethod=marker:
+ *
+ *   Copyright (C) 2011 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License version 2,
+ *   or (at your option) any later version, as published by the Free
+ *   Software Foundation
+ *
+ *   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; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+import Qt 4.7
+
+Item {
+    id: main
+
+    width: screenSize.width
+    height: screenSize.height
+    // width: 300
+    // height: 300
+
+    /* property declarations --------------------------{{{ */
+    property int stage
+    property int iconSize: (screenSize.width <= 1024) ? 64 : 128
+    /* }}} */
+
+    /* signal declarations ----------------------------{{{ */
+
+    /* }}} */
+
+    /* JavaScript functions ---------------------------{{{ */
+    onStageChanged: {
+        if (stage == 1) {
+            background.opacity = 1
+            gear.opacity = 0.5
+        }
+        if (stage == 2) {
+            gear.opacity = 1
+            mask.opacity = 1
+            letter.opacity = 1
+        }
+        if (stage == 3) {
+        }
+        if (stage == 4) {
+        }
+        if (stage == 5) {
+            logo.opacity = 1
+        }
+        if (stage == 6) {
+        }
+    }
+    /* }}} */
+
+    /* object properties ------------------------------{{{ */
+
+    /* }}} */
+
+    /* child objects ----------------------------------{{{ */
+
+    Rectangle {
+        color: "black"
+        anchors.fill: parent
+    }
+
+    Rectangle {
+        id: background
+
+        gradient: Gradient {
+            GradientStop { position: 0.0; color: "#55555f" }
+            GradientStop { position: 1.0; color: "#000000" }
+        }
+
+        anchors {
+            top: parent.top
+            left: parent.left
+            right: parent.right
+        }
+
+        height: gear.y - 32
+
+        opacity: 0
+        Behavior on opacity { NumberAnimation { duration: 1000; easing { type: Easing.InOutQuad } } }
+    }
+
+    Image {
+        id: gear
+
+        height: iconSize
+        width: iconSize
+        smooth: true
+
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+
+        source: "images/kdegear.png"
+
+        opacity: 0
+        Behavior on opacity { NumberAnimation { duration: 1000; easing { type: Easing.InOutQuad } } }
+
+        NumberAnimation {
+            id: animateRotation
+            target: gear
+            properties: "rotation"
+            from: 0
+            to: 360
+            duration: 5000
+
+            loops: Animation.Infinite
+            running: true
+        }
+
+    }
+
+    Image {
+        id: mask
+
+        height: iconSize
+        width: iconSize
+        smooth: true
+
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+
+        source: "images/kdemask.png"
+
+        opacity: 0
+        Behavior on opacity { NumberAnimation { duration: 1000; easing { type: Easing.InOutQuad } } }
+    }
+
+    Image {
+        id: letter
+
+        height: iconSize
+        width: iconSize
+        smooth: true
+
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+
+        source: "images/kdeletter.png"
+
+        opacity: 0
+        Behavior on opacity { NumberAnimation { duration: 1000; easing { type: Easing.InOutQuad } } }
+    }
+
+    Image {
+        id: logo
+
+        height: iconSize
+        width: iconSize
+        smooth: true
+
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2 - 1
+
+        source: "images/kdelogo-contrast.png"
+
+        opacity: 0
+        Behavior on opacity { NumberAnimation { duration: 1000; easing { type: Easing.InOutQuad } } }
+
+        Text {
+            text: "KDE Workspaces 4.7 'Friday'"
+            color: "white"
+
+            x: logo.width + 8
+            y: (logo.height - height) / 2
+        }
+    }
+
+    /* }}} */
+
+    /* stages -----------------------------------------{{{ */
+
+    /* }}} */
+
+    /* transitions ------------------------------------{{{ */
+
+    /* }}} */
+}
+
diff --git a/ksplash/ksplashqml/themes/qmltest/CMakeLists.txt b/ksplash/ksplashqml/themes/qmltest/CMakeLists.txt
new file mode 100644
index 0000000..9b2e59d
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmltest/CMakeLists.txt
@@ -0,0 +1,9 @@
+install(FILES Preview.png Theme.rc main.qml DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest)
+
+install(FILES images/background.jpg DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/configuring.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/desktop.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/globe.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/hardware.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/kde.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/plasma.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
diff --git a/ksplash/ksplashqml/themes/qmltest/Preview.png b/ksplash/ksplashqml/themes/qmltest/Preview.png
new file mode 100644
index 0000000..398c037
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/Preview.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/Theme.rc b/ksplash/ksplashqml/themes/qmltest/Theme.rc
new file mode 100644
index 0000000..8088c20
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmltest/Theme.rc
@@ -0,0 +1,9 @@
+[KSplash Theme: QMLtest]
+Name = Default Splash Screen
+Description = Air and Horos Splash Screen
+Version = 1.0
+Author = Nuno Pinheiro <nuno@oxygen-icons.org>, Riccardo Iaconelli <riccardo@kde.org> and Marco Martin <notmart@gmail.com>
+Homepage = http://www.kde.org
+
+# Theme behaviour settings.
+Engine = KSplashQML
diff --git a/ksplash/ksplashqml/themes/qmltest/images/background.jpg b/ksplash/ksplashqml/themes/qmltest/images/background.jpg
new file mode 100644
index 0000000..8d3027c
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/background.jpg differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/configuring.png b/ksplash/ksplashqml/themes/qmltest/images/configuring.png
new file mode 100644
index 0000000..9ea5cec
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/configuring.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/desktop.png b/ksplash/ksplashqml/themes/qmltest/images/desktop.png
new file mode 100644
index 0000000..98153f2
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/desktop.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/globe.png b/ksplash/ksplashqml/themes/qmltest/images/globe.png
new file mode 100644
index 0000000..193c46f
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/globe.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/hardware.png b/ksplash/ksplashqml/themes/qmltest/images/hardware.png
new file mode 100644
index 0000000..68351d1
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/hardware.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/kde.png b/ksplash/ksplashqml/themes/qmltest/images/kde.png
new file mode 100644
index 0000000..3efaaf8
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/kde.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/plasma.png b/ksplash/ksplashqml/themes/qmltest/images/plasma.png
new file mode 100644
index 0000000..facbd77
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/plasma.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/main.qml b/ksplash/ksplashqml/themes/qmltest/main.qml
new file mode 100644
index 0000000..e0b8a1b
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmltest/main.qml
@@ -0,0 +1,164 @@
+/*   vim:set foldenable foldmethod=marker:
+ *
+ *   Copyright (C) 2011 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License version 2,
+ *   or (at your option) any later version, as published by the Free
+ *   Software Foundation
+ *
+ *   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; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+import Qt 4.7 as QML
+
+QML.Item {
+    id: main
+
+    width: screenSize.width
+    height: screenSize.height
+
+    /* property declarations --------------------------{{{ */
+    property int stage
+    /* }}} */
+
+    /* signal declarations ----------------------------{{{ */
+
+    /* }}} */
+
+    /* JavaScript functions ---------------------------{{{ */
+    onStageChanged: {
+        if (stage == 2) {
+            stage1.x = (main.width - stage1.width) / 2
+            stage1.opacity = 1
+        }
+        if (stage == 3) {
+            stage1.x = - stage1.width
+            stage2.x = (main.width - stage2.width) / 2
+            stage1.opacity = 0
+            stage2.opacity = 1
+        }
+        if (stage == 4) {
+            stage2.x = - stage2.width
+            stage3.x = (main.width - stage3.width) / 2
+            stage2.opacity = 0
+            stage3.opacity = 1
+        }
+        if (stage == 5) {
+            stage3.x = - stage3.width
+            stage4.x = (main.width - stage4.width) / 2
+            stage3.opacity = 0
+            stage4.opacity = 1
+        }
+        if (stage == 6) {
+            stage4.x = - stage4.width
+            stage5.x = (main.width - stage5.width) / 2
+            stage4.opacity = 0
+            stage5.opacity = 1
+            stage5.width = 128
+            stage5.height = 128
+        }
+    }
+    /* }}} */
+
+    /* object properties ------------------------------{{{ */
+
+    /* }}} */
+
+    /* child objects ----------------------------------{{{ */
+    QML.Image {
+        anchors.fill: parent
+
+        source: "images/background.jpg"
+    }
+
+    QML.Rectangle {
+        width: parent.width
+        height: 100
+        x: 0
+        y: (parent.height - height) / 2
+        color: "#ffffff"
+        opacity: 0.2
+    }
+
+    QML.Image {
+        id: stage1
+        x: main.width + width
+        y: (main.height - height) / 2
+        source: "images/hardware.png"
+        QML.Behavior on x { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+        opacity: 0
+        QML.Behavior on opacity { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+
+        QML.Image { y: 128; x: parent.x - main.width / 2; height: 128; width: 128; opacity: 0.2 * parent.opacity; source: parent.source }
+    }
+
+    QML.Image {
+        id: stage2
+        x: main.width + width
+        y: (main.height - height) / 2
+        source: "images/configuring.png"
+        QML.Behavior on x { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+        opacity: 0
+        QML.Behavior on opacity { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+
+        QML.Image { y: 128; x: parent.x - main.width / 2; height: 128; width: 128; opacity: 0.2 * parent.opacity; source: parent.source }
+    }
+
+    QML.Image {
+        id: stage3
+        x: main.width + width
+        y: (main.height - height) / 2
+        source: "images/globe.png"
+        QML.Behavior on x { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+        opacity: 0
+        QML.Behavior on opacity { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+
+        QML.Image { y: 128; x: parent.x - main.width / 2; height: 128; width: 128; opacity: 0.2 * parent.opacity; source: parent.source }
+    }
+
+    QML.Image {
+        id: stage4
+        x: main.width + width
+        y: (main.height - height) / 2
+        source: "images/desktop.png"
+        QML.Behavior on x { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+        opacity: 0
+        QML.Behavior on opacity { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+
+        QML.Image { y: 128; x: parent.x - main.width / 2; height: 128; width: 128; opacity: 0.2 * parent.opacity; source: parent.source }
+    }
+
+    QML.Image {
+        id: stage5
+        x: main.width + width
+        y: (main.height - height) / 2
+        source: "images/kde.png"
+        QML.Behavior on x { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+        QML.Behavior on width { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+        QML.Behavior on height { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+        opacity: 0
+        QML.Behavior on opacity { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+
+        // QML.Image { y: 128; x: parent.x - main.width / 2; height: 128; width: 128; opacity: 0.2 * parent.opacity; source: parent.source }
+    }
+
+    /* }}} */
+
+    /* stages -----------------------------------------{{{ */
+
+    /* }}} */
+
+    /* transitions ------------------------------------{{{ */
+
+    /* }}} */
+}
+
diff --git a/kwin/composite.cpp b/kwin/composite.cpp
index a8bb42e..323d589 100644
--- a/kwin/composite.cpp
+++ b/kwin/composite.cpp
@@ -836,7 +836,10 @@ bool Unmanaged::shouldUnredirect() const
 {
     // the pixmap is needed for the login effect, a nicer solution would be the login effect increasing
     // refcount for the window pixmap (which would prevent unredirect), avoiding this hack
-    if (resourceClass() == "ksplashx" || resourceClass() == "ksplashsimple")
+    if (resourceClass() == "ksplashx"
+            || resourceClass() == "ksplashsimple"
+            || resourceClass() == "ksplashqml"
+            )
         return false;
 // it must cover whole display or one xinerama screen, and be the topmost there
     if (geometry() == workspace()->clientArea(FullArea, geometry().center(), workspace()->currentDesktop())
diff --git a/kwin/effects/fade/fade.cpp b/kwin/effects/fade/fade.cpp
index 17f39a8..1a54eb0 100644
--- a/kwin/effects/fade/fade.cpp
+++ b/kwin/effects/fade/fade.cpp
@@ -194,6 +194,7 @@ bool FadeEffect::isFadeWindow(EffectWindow* w)
         e = w->data(WindowAddedGrabRole).value<void*>();
     if (w->windowClass() == "ksplashx ksplashx"
             || w->windowClass() == "ksplashsimple ksplashsimple"
+            || w->windowClass() == "qt-subapplication ksplashqml"
             || (e && e != this)) {
         // see login effect
         return false;
diff --git a/kwin/effects/login/login.cpp b/kwin/effects/login/login.cpp
index 63d8479..a9da287 100644
--- a/kwin/effects/login/login.cpp
+++ b/kwin/effects/login/login.cpp
@@ -111,7 +111,8 @@ bool LoginEffect::isLoginSplash(EffectWindow* w)
     // TODO there should be probably a better way (window type?)
     // see also fade effect and composite.cpp
     if (w->windowClass() == "ksplashx ksplashx"
-            || w->windowClass() == "ksplashsimple ksplashsimple") {
+            || w->windowClass() == "ksplashsimple ksplashsimple"
+            || w->windowClass() == "qt-subapplication ksplashqml") {
         return true;
     }
     return false;
diff --git a/startkde.cmake b/startkde.cmake
index 627dadb..1070785 100644
--- a/startkde.cmake
+++ b/startkde.cmake
@@ -151,6 +151,9 @@ if test -z "$dl"; then
     KSplashX)
       ksplash_pid=`ksplashx "${ksplashrc_ksplash_theme}" --pid`
       ;;
+    KSplashQML)
+      ksplash_pid=`ksplashqml "${ksplashrc_ksplash_theme}" --pid`
+      ;;
     None)
       ;;
     Simple)
@@ -356,11 +359,11 @@ fi
 # if KDEWM is not set, ksmserver will ensure kwin is started.
 # kwrapper4 is used to reduce startup time and memory usage
 # kwrapper4 does not return useful error codes such as the exit code of ksmserver.
-# We only check for 255 which means that the ksmserver process could not be 
-# started, any problems thereafter, e.g. ksmserver failing to initialize, 
+# We only check for 255 which means that the ksmserver process could not be
+# started, any problems thereafter, e.g. ksmserver failing to initialize,
 # will remain undetected.
 test -n "$KDEWM" && KDEWM="--windowmanager $KDEWM"
-kwrapper4 ksmserver $KDEWM 
+kwrapper4 ksmserver $KDEWM
 if test $? -eq 255; then
   # Startup error
   echo 'startkde: Could not start ksmserver. Check your installation.'  1>&2