diff --git a/src/declarative/graphicsitems/qdeclarativeevents_p_p.h b/src/declarative/graphicsitems/qdeclarativeevents_p_p.h
index 0e0329e..faf7aa9 100644
--- a/src/declarative/graphicsitems/qdeclarativeevents_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeevents_p_p.h
@@ -133,9 +133,51 @@ private:
     bool _accepted;
 };
 
+class QDeclarativeWheelEvent : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int x READ x)
+    Q_PROPERTY(int y READ y)
+    Q_PROPERTY(int delta READ delta)
+    Q_PROPERTY(int buttons READ buttons)
+    Q_PROPERTY(int modifiers READ modifiers)
+    Q_PROPERTY(Qt::Orientation orientation READ orientation)
+    Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
+
+public:
+    QDeclarativeWheelEvent(int x, int y, int delta, Qt::Orientation orientation,
+                           Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers)
+        : _x(x), _y(y), _delta(delta), _orientation(orientation), _buttons(buttons),
+          _modifiers(modifiers), _accepted(true) {}
+
+    int x() const { return _x; }
+    int y() const { return _y; }
+    int delta() const { return _delta; }
+    int buttons() const { return _buttons; }
+    int modifiers() const { return _modifiers; }
+    Qt::Orientation orientation() const { return _orientation; }
+
+    // only for internal usage
+    void setX(int x) { _x = x; }
+    void setY(int y) { _y = y; }
+
+    bool isAccepted() { return _accepted; }
+    void setAccepted(bool accepted) { _accepted = accepted; }
+
+private:
+    int _x;
+    int _y;
+    int _delta;
+    Qt::Orientation _orientation;
+    Qt::MouseButtons _buttons;
+    Qt::KeyboardModifiers _modifiers;
+    bool _accepted;
+};
+
 QT_END_NAMESPACE
 
 QML_DECLARE_TYPE(QDeclarativeKeyEvent)
 QML_DECLARE_TYPE(QDeclarativeMouseEvent)
+QML_DECLARE_TYPE(QDeclarativeWheelEvent)
 
 #endif // QDECLARATIVEEVENTS_P_H
diff --git a/src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp b/src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp
index 783eff1..68379c5 100644
--- a/src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp
@@ -152,6 +152,7 @@ void QDeclarativeItemModule::defineModule()
     qmlRegisterType<QDeclarativeAnchors>();
     qmlRegisterType<QDeclarativeKeyEvent>();
     qmlRegisterType<QDeclarativeMouseEvent>();
+    qmlRegisterType<QDeclarativeWheelEvent>();
     qmlRegisterType<QGraphicsObject>();
     qmlRegisterType<QGraphicsWidget>("Qt",4,7,"QGraphicsWidget");
     qmlRegisterExtendedType<QGraphicsWidget,QDeclarativeGraphicsWidget>("Qt",4,7,"QGraphicsWidget");
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea.cpp b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
index 4685e65..84cc4f4 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea.cpp
+++ b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
@@ -571,6 +571,20 @@ void QDeclarativeMouseArea::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
         setHovered(false);
 }
 
+void QDeclarativeMouseArea::wheelEvent(QGraphicsSceneWheelEvent *event)
+{
+    Q_D(QDeclarativeMouseArea);
+    if (!d->absorb)
+        QDeclarativeItem::wheelEvent(event);
+    else {
+        QDeclarativeWheelEvent we(event->pos().x(), event->pos().y(), event->delta(), event->orientation(), event->buttons(), event->modifiers());
+        we.setAccepted(d->isWheelConnected());
+        emit wheel(&we);
+        if (!we.isAccepted())
+            QDeclarativeItem::wheelEvent(event);
+    }
+}
+
 bool QDeclarativeMouseArea::sceneEvent(QEvent *event)
 {
     bool rv = QDeclarativeItem::sceneEvent(event);
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea_p.h b/src/declarative/graphicsitems/qdeclarativemousearea_p.h
index 0da7515..21b4a5c 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea_p.h
+++ b/src/declarative/graphicsitems/qdeclarativemousearea_p.h
@@ -115,6 +115,7 @@ private:
 };
 
 class QDeclarativeMouseEvent;
+class QDeclarativeWheelEvent;
 class QDeclarativeMouseAreaPrivate;
 class Q_AUTOTEST_EXPORT QDeclarativeMouseArea : public QDeclarativeItem
 {
@@ -167,6 +168,7 @@ Q_SIGNALS:
     void released(QDeclarativeMouseEvent *mouse);
     void clicked(QDeclarativeMouseEvent *mouse);
     void doubleClicked(QDeclarativeMouseEvent *mouse);
+    void wheel(QDeclarativeWheelEvent *mouse);
     void entered();
     void exited();
     void canceled();
@@ -182,6 +184,7 @@ protected:
     void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
     void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
     void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
+    void wheelEvent(QGraphicsSceneWheelEvent *event);
     bool sceneEvent(QEvent *);
     bool sendMouseEvent(QGraphicsSceneMouseEvent *event);
     bool sceneEventFilter(QGraphicsItem *i, QEvent *e);
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h b/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
index 48a56d9..a3d70b1 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
@@ -101,6 +101,12 @@ public:
         return QObjectPrivate::get(q)->isSignalConnected(idx);
     }
 
+    bool isWheelConnected() {
+        Q_Q(QDeclarativeMouseArea);
+        static int idx = QObjectPrivate::get(q)->signalIndex("wheel(QDeclarativeWheelEvent*)");
+        return QObjectPrivate::get(q)->isSignalConnected(idx);
+    }
+
     bool absorb : 1;
     bool hovered : 1;
     bool pressed : 1;
