diff --git a/src/systeminfo/qsysteminfo_maemo.cpp b/src/systeminfo/qsysteminfo_maemo.cpp
index 66d9756..670a3cc 100644
--- a/src/systeminfo/qsysteminfo_maemo.cpp
+++ b/src/systeminfo/qsysteminfo_maemo.cpp
@@ -1230,60 +1230,64 @@ void QSystemDeviceInfoPrivate::profileChanged(bool changed, bool active, QString
 //////////////
 ///////
 QSystemScreenSaverPrivate::QSystemScreenSaverPrivate(QObject *parent)
-        : QSystemScreenSaverLinuxCommonPrivate(parent), m_screenSaverInhibited(false)
-
+        : QSystemScreenSaverLinuxCommonPrivate(parent)
 {
     ssTimer = new QTimer(this);
+#if !defined(QT_NO_DBUS)
+    mceConnectionInterface = new QDBusInterface("com.nokia.mce",
+                                                "/com/nokia/mce/request",
+                                                "com.nokia.mce.request",
+                                                QDBusConnection::systemBus());
+#endif
 }
 
 QSystemScreenSaverPrivate::~QSystemScreenSaverPrivate()
 {
-     if(ssTimer->isActive())
-         ssTimer->stop();
-
-     m_screenSaverInhibited = false;
-}
-
-bool QSystemScreenSaverPrivate::screenSaverInhibited()
-{
-    return m_screenSaverInhibited;
+    if (ssTimer->isActive()) {
+        ssTimer->stop();
+    }
+#if !defined(QT_NO_DBUS)
+    delete mceConnectionInterface, mceConnectionInterface = 0;
+#endif
 }
 
 bool QSystemScreenSaverPrivate::setScreenSaverInhibit()
 {
-    if (m_screenSaverInhibited)
-        return true;
-
-     m_screenSaverInhibited = true;
-     display_blanking_pause();
-     connect(ssTimer, SIGNAL(timeout()), this, SLOT(display_blanking_pause()));
-     ssTimer->start(3000); //3 seconds interval
-     return true;
+    wakeUpDisplay();
+    if (!ssTimer->isActive()) {
+        connect(ssTimer, SIGNAL(timeout()), this, SLOT(wakeUpDisplay()));
+        // Set a wake up interval of 30 seconds.
+        // The reason for this is to avoid the situation where
+        // a crashed/hung application keeps the display on.
+        ssTimer->start(30000);
+     }
+     return screenSaverInhibited();
 }
 
-void QSystemScreenSaverPrivate::display_blanking_pause()
+void QSystemScreenSaverPrivate::wakeUpDisplay()
 {
 #if !defined(QT_NO_DBUS)
-    QDBusInterface connectionInterface("com.nokia.mce",
-                                       "/com/nokia/mce/request",
-                                       "com.nokia.mce.request",
-                                       QDBusConnection::systemBus());
-    if (!connectionInterface.isValid()) {
-        qWarning() << "interface not valid";
-        return;
+    if (mceConnectionInterface->isValid()) {
+        mceConnectionInterface->call("req_tklock_mode_change", "unlocked");
+        mceConnectionInterface->call("req_display_blanking_pause");
     }
-    connectionInterface.call("req_display_blanking_pause");
 #endif
 }
 
-bool QSystemScreenSaverPrivate::isScreenLockEnabled()
-{
-   return false;
-}
-
-bool QSystemScreenSaverPrivate::isScreenSaverActive()
+bool QSystemScreenSaverPrivate::screenSaverInhibited()
 {
-    return false;
+    bool displayOn = false;
+#if !defined(QT_NO_DBUS)
+    if (mceConnectionInterface->isValid()) {
+        // The most educated guess for the screen saver being inhibited is to determine
+        // whether the display is on. That is because the QSystemScreenSaver cannot
+        // prevent other processes from blanking the screen (like, if
+        // MCE decides to blank the screen for some reason).
+        QDBusReply<QString> reply = mceConnectionInterface->call("get_display_status");
+        displayOn = ("on" == reply.value());
+    }
+#endif
+    return displayOn;
 }
 
 #include "moc_qsysteminfo_maemo_p.cpp"
diff --git a/src/systeminfo/qsysteminfo_maemo_p.h b/src/systeminfo/qsysteminfo_maemo_p.h
index 37ee748..1a0d23f 100644
--- a/src/systeminfo/qsysteminfo_maemo_p.h
+++ b/src/systeminfo/qsysteminfo_maemo_p.h
@@ -273,22 +273,15 @@ public:
 
     bool screenSaverInhibited();
     bool setScreenSaverInhibit();
-    bool isScreenLockEnabled();
-    bool isScreenSaverActive();
 
 private Q_SLOTS:
-    void display_blanking_pause();
+    void wakeUpDisplay();
 
-private:    //data
-    bool m_screenSaverInhibited;
+private:
     QTimer *ssTimer;
-
-protected:
-    QString screenPath;
-    QString settingsPath;
-    bool screenSaverSecure;
-    uint currentPid;
-
+#if !defined(QT_NO_DBUS)
+    QDBusInterface *mceConnectionInterface;
+#endif
 };
 
 QTM_END_NAMESPACE
