diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index ad0142c5dfa03360f95ef37a4be304e7b884514b..a48bfdf3c697f9f17520a295aeca1afa399cc0ae 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -6116,8 +6116,15 @@ QIcon QWidget::windowIcon() const
 
 void QWidgetPrivate::setWindowIcon_helper()
 {
+    Q_Q(QWidget);
     QEvent e(QEvent::WindowIconChange);
-    QApplication::sendEvent(q_func(), &e);
+
+    // Do not send the event if the widget is a top level.
+    // In that case, setWindowIcon_sys does it, and event propagation from
+    // QWidgetWindow to the top level QWidget ensures that the event reaches
+    // the top level anyhow
+    if (!q->windowHandle())
+        QApplication::sendEvent(q, &e);
     for (int i = 0; i < children.size(); ++i) {
         QWidget *w = qobject_cast<QWidget *>(children.at(i));
         if (w && !w->isWindow())
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index 12f5d4b8b065a9d06b95da09dfbbb362636285ef..5f0fb430bc48a7aa743d368e2ad077f3d71a2612 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -161,7 +161,7 @@ bool QWidgetWindow::event(QEvent *event)
     if (m_widget->testAttribute(Qt::WA_DontShowOnScreen)) {
         // \a event is uninteresting for QWidgetWindow, the event was probably
         // generated before WA_DontShowOnScreen was set
-        return m_widget->event(event);
+        return QCoreApplication::sendEvent(m_widget, event);
     }
 
     switch (event->type()) {
@@ -303,7 +303,7 @@ bool QWidgetWindow::event(QEvent *event)
         break;
     }
 
-    if (m_widget->event(event) && event->type() != QEvent::Timer)
+    if (QCoreApplication::sendEvent(m_widget, event) && event->type() != QEvent::Timer)
         return true;
 
     return QWindow::event(event);
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
index 5e00ca9450a6145b6da63938ab32fc2b0b27b512..11d41d9b204410a7bc21c0c28435dba52a4abcb9 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
@@ -6010,10 +6010,13 @@ void tst_QWidget::childEvents()
         expected =
             EventRecorder::EventList()
             << qMakePair(&widget, QEvent::Polish)
+            << qMakePair(&widget, QEvent::PlatformSurface)
             << qMakePair(&widget, QEvent::WinIdChange)
+            << qMakePair(&widget, QEvent::WindowIconChange)
             << qMakePair(&widget, QEvent::Move)
             << qMakePair(&widget, QEvent::Resize)
             << qMakePair(&widget, QEvent::Show)
+            << qMakePair(&widget, QEvent::CursorChange)
             << qMakePair(&widget, QEvent::ShowToParent);
 
         QVERIFY2(spy.eventList() == expected,
@@ -6025,13 +6028,9 @@ void tst_QWidget::childEvents()
             EventRecorder::EventList()
             << qMakePair(&widget, QEvent::PolishRequest)
             << qMakePair(&widget, QEvent::Type(QEvent::User + 1))
-#if defined(Q_OS_OSX) || defined(Q_OS_QNX)
             << qMakePair(&widget, QEvent::UpdateLater)
-#endif
             << qMakePair(&widget, QEvent::UpdateRequest);
 
-        if (m_platform == QStringLiteral("windows") || m_platform == QStringLiteral("xcb"))
-            QEXPECT_FAIL("", EventRecorder::msgExpectFailQtBug26424(expected, spy.eventList()).constData(), Continue);
         QVERIFY2(spy.eventList() == expected,
                  EventRecorder::msgEventListMismatch(expected, spy.eventList()).constData());
     }
@@ -6100,10 +6099,13 @@ void tst_QWidget::childEvents()
             << qMakePair(&widget, QEvent::Polish)
             << qMakePair(&widget, QEvent::ChildPolished)
             << qMakePair(&widget, QEvent::ChildPolished)
+            << qMakePair(&widget, QEvent::PlatformSurface)
             << qMakePair(&widget, QEvent::WinIdChange)
+            << qMakePair(&widget, QEvent::WindowIconChange)
             << qMakePair(&widget, QEvent::Move)
             << qMakePair(&widget, QEvent::Resize)
             << qMakePair(&widget, QEvent::Show)
+            << qMakePair(&widget, QEvent::CursorChange)
             << qMakePair(&widget, QEvent::ShowToParent);
 
         QVERIFY2(spy.eventList() == expected,
@@ -6116,13 +6118,9 @@ void tst_QWidget::childEvents()
             << qMakePair(&widget, QEvent::PolishRequest)
             << qMakePair(&widget, QEvent::Type(QEvent::User + 1))
             << qMakePair(&widget, QEvent::Type(QEvent::User + 2))
-#if defined(Q_OS_OSX) || defined(Q_OS_QNX)
             << qMakePair(&widget, QEvent::UpdateLater)
-#endif
             << qMakePair(&widget, QEvent::UpdateRequest);
 
-        if (m_platform == QStringLiteral("windows") || m_platform == QStringLiteral("xcb"))
-            QEXPECT_FAIL("", EventRecorder::msgExpectFailQtBug26424(expected, spy.eventList()).constData(), Continue);
         QVERIFY2(spy.eventList() == expected,
                  EventRecorder::msgEventListMismatch(expected, spy.eventList()).constData());
     }
@@ -6193,10 +6191,13 @@ void tst_QWidget::childEvents()
             EventRecorder::EventList()
             << qMakePair(&widget, QEvent::Polish)
             << qMakePair(&widget, QEvent::ChildPolished)
+            << qMakePair(&widget, QEvent::PlatformSurface)
             << qMakePair(&widget, QEvent::WinIdChange)
+            << qMakePair(&widget, QEvent::WindowIconChange)
             << qMakePair(&widget, QEvent::Move)
             << qMakePair(&widget, QEvent::Resize)
             << qMakePair(&widget, QEvent::Show)
+            << qMakePair(&widget, QEvent::CursorChange)
             << qMakePair(&widget, QEvent::ShowToParent);
 
         QVERIFY2(spy.eventList() == expected,
@@ -6209,13 +6210,9 @@ void tst_QWidget::childEvents()
             << qMakePair(&widget, QEvent::PolishRequest)
             << qMakePair(&widget, QEvent::Type(QEvent::User + 1))
             << qMakePair(&widget, QEvent::Type(QEvent::User + 2))
-#if defined(Q_OS_OSX) || defined(Q_OS_QNX)
             << qMakePair(&widget, QEvent::UpdateLater)
-#endif
             << qMakePair(&widget, QEvent::UpdateRequest);
 
-        if (m_platform == QStringLiteral("windows") || m_platform == QStringLiteral("xcb"))
-            QEXPECT_FAIL("", EventRecorder::msgExpectFailQtBug26424(expected, spy.eventList()).constData(), Continue);
         QVERIFY2(spy.eventList() == expected,
                  EventRecorder::msgEventListMismatch(expected, spy.eventList()).constData());
     }
diff --git a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
index 148c2352a58fb875ee2b10f1b4d246e3805a14fa..4bdb299213ca990e59026a27db6aae5e6d0b6037 100644
--- a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
+++ b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
@@ -97,6 +97,8 @@ private slots:
 
     void tst_resize_count();
     void tst_move_count();
+
+    void tst_eventfilter_on_toplevel();
 };
 
 void tst_QWidget_window::initTestCase()
@@ -762,5 +764,48 @@ void tst_QWidget_window::tst_move_count()
     QTRY_VERIFY(move.moveCount >= 1);
 }
 
+class EventFilter : public QObject
+{
+public:
+    int eventCount;
+
+    EventFilter()
+        : QObject(),
+          eventCount(0)
+    {
+    }
+
+    static QEvent::Type filterEventType()
+    {
+        static int type = QEvent::registerEventType();
+        return static_cast<QEvent::Type>(type);
+    }
+
+protected:
+    bool eventFilter(QObject *o, QEvent *e) Q_DECL_OVERRIDE
+    {
+        if (e->type() == filterEventType())
+            ++eventCount;
+
+        return QObject::eventFilter(o, e);
+    }
+};
+
+void tst_QWidget_window::tst_eventfilter_on_toplevel()
+{
+    QWidget w;
+    EventFilter filter;
+    w.installEventFilter(&filter);
+    w.show();
+    QVERIFY(QTest::qWaitForWindowActive(&w));
+    QVERIFY(w.isWindow());
+    QCOMPARE(filter.eventCount, 0);
+
+    // send an event not handled in a special way by QWidgetWindow::event,
+    // and check that it's received by the event filter
+    QCoreApplication::postEvent(w.windowHandle(), new QEvent(EventFilter::filterEventType()));
+    QTRY_COMPARE(filter.eventCount, 1);
+}
+
 QTEST_MAIN(tst_QWidget_window)
 #include "tst_qwidget_window.moc"