diff --git a/src/declarative/graphicsitems/qdeclarativepincharea.cpp b/src/declarative/graphicsitems/qdeclarativepincharea.cpp
index eae83f6..b8d9ee3 100644
--- a/src/declarative/graphicsitems/qdeclarativepincharea.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepincharea.cpp
@@ -295,7 +295,7 @@ bool QDeclarativePinchArea::event(QEvent *event)
 void QDeclarativePinchArea::updatePinch()
 {
     Q_D(QDeclarativePinchArea);
-    if (d->touchPoints.count() != 2) {
+    if (d->touchPoints.count() == 0) {
         if (d->inPinch) {
             d->stealMouse = false;
             setKeepMouseGrab(false);
@@ -309,8 +309,8 @@ void QDeclarativePinchArea::updatePinch()
             pe.setPreviousScale(d->pinchLastScale);
             pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
             pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
-            pe.setPoint1(d->lastPoint1);
-            pe.setPoint2(d->lastPoint2);
+            pe.setPoint1(mapFromScene(d->lastPoint1));
+            pe.setPoint2(mapFromScene(d->lastPoint2));
             emit pinchFinished(&pe);
             d->pinchStartDist = 0;
             if (d->pinch && d->pinch->target())
@@ -318,30 +318,43 @@ void QDeclarativePinchArea::updatePinch()
         }
         return;
     }
-    if (d->touchPoints.at(0).state() & Qt::TouchPointPressed
-        || d->touchPoints.at(1).state() & Qt::TouchPointPressed) {
-        d->sceneStartPoint1 = d->touchPoints.at(0).scenePos();
-        d->sceneStartPoint2 = d->touchPoints.at(1).scenePos();
+    QTouchEvent::TouchPoint touchPoint1 = d->touchPoints.at(0);
+    QTouchEvent::TouchPoint touchPoint2 = d->touchPoints.at(d->touchPoints. count() >= 2 ? 1 : 0);
+    if (d->touchPoints.count() == 2
+        && (touchPoint1.state() & Qt::TouchPointPressed || touchPoint2.state() & Qt::TouchPointPressed)) {
+        d->id1 = touchPoint1.id();
+        d->sceneStartPoint1 = touchPoint1.scenePos();
+        d->sceneStartPoint2 = touchPoint2.scenePos();
         d->inPinch = false;
         d->pinchRejected = false;
     } else if (!d->pinchRejected){
         QDeclarativeItem *grabber = scene() ? qobject_cast<QDeclarativeItem*>(scene()->mouseGrabberItem()) : 0;
-        if (grabber == this || !grabber || !grabber->keepMouseGrab()) {
+        if (1) { //XXX remove
             const int dragThreshold = QApplication::startDragDistance();
-            QPointF p1 = d->touchPoints.at(0).scenePos();
-            QPointF p2 = d->touchPoints.at(1).scenePos();
+            QPointF p1 = touchPoint1.scenePos();
+            QPointF p2 = touchPoint2.scenePos();
             qreal dx = p1.x() - p2.x();
             qreal dy = p1.y() - p2.y();
             qreal dist = sqrt(dx*dx + dy*dy);
             QPointF sceneCenter = (p1 + p2)/2;
             qreal angle = QLineF(p1, p2).angle();
+            if (d->touchPoints.count() == 1) {
+                // If we only have one point then just move the center
+                if (d->id1 == touchPoint1.id())
+                    sceneCenter = d->sceneLastCenter + touchPoint1.scenePos() - d->lastPoint1;
+                else
+                    sceneCenter = d->sceneLastCenter + touchPoint2.scenePos() - d->lastPoint2;
+                angle = d->pinchLastAngle;
+            }
+            d->id1 = touchPoint1.id();
             if (angle > 180)
                 angle -= 360;
             if (!d->inPinch) {
-                if (qAbs(p1.x()-d->sceneStartPoint1.x()) > dragThreshold
+                if (d->touchPoints.count() >= 2
+                        && (qAbs(p1.x()-d->sceneStartPoint1.x()) > dragThreshold
                         || qAbs(p1.y()-d->sceneStartPoint1.y()) > dragThreshold
                         || qAbs(p2.x()-d->sceneStartPoint2.x()) > dragThreshold
-                        || qAbs(p2.y()-d->sceneStartPoint2.y()) > dragThreshold) {
+                        || qAbs(p2.y()-d->sceneStartPoint2.y()) > dragThreshold)) {
                     d->sceneStartCenter = sceneCenter;
                     d->sceneLastCenter = sceneCenter;
                     d->pinchStartCenter = mapFromScene(sceneCenter);
@@ -349,8 +362,8 @@ void QDeclarativePinchArea::updatePinch()
                     d->pinchStartAngle = angle;
                     d->pinchLastScale = 1.0;
                     d->pinchLastAngle = angle;
-                    d->lastPoint1 = d->touchPoints.at(0).pos();
-                    d->lastPoint2 = d->touchPoints.at(1).pos();
+                    d->lastPoint1 = p1;
+                    d->lastPoint2 = p2;
                     QDeclarativePinchEvent pe(d->pinchStartCenter, 1.0, angle, 0.0);
                     pe.setStartCenter(d->pinchStartCenter);
                     pe.setPreviousCenter(d->pinchStartCenter);
@@ -358,8 +371,9 @@ void QDeclarativePinchArea::updatePinch()
                     pe.setPreviousScale(d->pinchLastScale);
                     pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
                     pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
-                    pe.setPoint1(d->lastPoint1);
-                    pe.setPoint2(d->lastPoint2);
+                    pe.setPoint1(mapFromScene(d->lastPoint1));
+                    pe.setPoint2(mapFromScene(d->lastPoint2));
+                    pe.setPointCount(d->touchPoints.count());
                     emit pinchStarted(&pe);
                     if (pe.accepted()) {
                         d->inPinch = true;
@@ -379,7 +393,7 @@ void QDeclarativePinchArea::updatePinch()
                     }
                 }
             } else if (d->pinchStartDist > 0) {
-                qreal scale = dist / d->pinchStartDist;
+                qreal scale = dist ? dist / d->pinchStartDist : d->pinchLastScale;
                 qreal rotationAngle = d->pinchStartAngle - angle;
                 if (rotationAngle > 180)
                     rotationAngle -= 360;
@@ -391,13 +405,14 @@ void QDeclarativePinchArea::updatePinch()
                 pe.setPreviousScale(d->pinchLastScale);
                 pe.setStartPoint1(mapFromScene(d->sceneStartPoint1));
                 pe.setStartPoint2(mapFromScene(d->sceneStartPoint2));
-                pe.setPoint1(d->touchPoints.at(0).pos());
-                pe.setPoint2(d->touchPoints.at(1).pos());
+                pe.setPoint1(touchPoint1.pos());
+                pe.setPoint2(touchPoint2.pos());
+                pe.setPointCount(d->touchPoints.count());
                 d->pinchLastScale = scale;
                 d->sceneLastCenter = sceneCenter;
                 d->pinchLastAngle = angle;
-                d->lastPoint1 = d->touchPoints.at(0).pos();
-                d->lastPoint2 = d->touchPoints.at(1).pos();
+                d->lastPoint1 = touchPoint1.scenePos();
+                d->lastPoint2 = touchPoint2.scenePos();
                 emit pinchUpdated(&pe);
                 if (d->pinch && d->pinch->target()) {
                     qreal s = d->pinchStartScale * scale;
diff --git a/src/declarative/graphicsitems/qdeclarativepincharea_p.h b/src/declarative/graphicsitems/qdeclarativepincharea_p.h
index 6d04708..b5afea9 100644
--- a/src/declarative/graphicsitems/qdeclarativepincharea_p.h
+++ b/src/declarative/graphicsitems/qdeclarativepincharea_p.h
@@ -203,11 +203,13 @@ class Q_AUTOTEST_EXPORT QDeclarativePinchEvent : public QObject
     Q_PROPERTY(QPointF startPoint1 READ startPoint1)
     Q_PROPERTY(QPointF point2 READ point2)
     Q_PROPERTY(QPointF startPoint2 READ startPoint2)
+    Q_PROPERTY(int pointCount READ pointCount)
     Q_PROPERTY(bool accepted READ accepted WRITE setAccepted)
 
 public:
     QDeclarativePinchEvent(QPointF c, qreal s, qreal a, qreal r)
-        : QObject(), m_center(c), m_scale(s), m_angle(a), m_rotation(r), m_accepted(true) {}
+        : QObject(), m_center(c), m_scale(s), m_angle(a), m_rotation(r)
+        , m_pointCount(0), m_accepted(true) {}
 
     QPointF center() const { return m_center; }
     QPointF startCenter() const { return m_startCenter; }
@@ -229,6 +231,8 @@ public:
     void setPoint2(QPointF p) { m_point2 = p; }
     QPointF startPoint2() const { return m_startPoint2; }
     void setStartPoint2(QPointF p) { m_startPoint2 = p; }
+    int pointCount() const { return m_pointCount; }
+    void setPointCount(int count) { m_pointCount = count; }
 
     bool accepted() const { return m_accepted; }
     void setAccepted(bool a) { m_accepted = a; }
@@ -246,6 +250,7 @@ private:
     QPointF m_point2;
     QPointF m_startPoint1;
     QPointF m_startPoint2;
+    int m_pointCount;
     bool m_accepted;
 };
 
diff --git a/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h b/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h
index 5641e35..12e4879 100644
--- a/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h
@@ -102,6 +102,7 @@ public:
     QPointF sceneLastCenter;
     QPointF pinchStartPos;
     QList<QTouchEvent::TouchPoint> touchPoints;
+    int id1;
 };
 
 QT_END_NAMESPACE
diff --git a/src/declarative/util/qdeclarativeview.cpp b/src/declarative/util/qdeclarativeview.cpp
index c2e5efe..37e61a6 100644
--- a/src/declarative/util/qdeclarativeview.cpp
+++ b/src/declarative/util/qdeclarativeview.cpp
@@ -293,6 +293,14 @@ void QDeclarativeViewPrivate::init()
     q->setFocusPolicy(Qt::StrongFocus);
 
     q->scene()->setStickyFocus(true);  //### needed for correct focus handling
+
+#ifdef Q_WS_MAEMO_6
+#error fsjk
+    setAttribute(Qt::WA_OpaquePaintEvent);
+    setAttribute(Qt::WA_NoSystemBackground);
+    viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
+    viewport()->setAttribute(Qt::WA_NoSystemBackground);
+#endif
 }
 
 /*!
