diff --git a/src/libraries/qtopia/qthumbstyle_p.cpp b/src/libraries/qtopia/qthumbstyle_p.cpp
index eb18aa4..5e779c9 100644
--- a/src/libraries/qtopia/qthumbstyle_p.cpp
+++ b/src/libraries/qtopia/qthumbstyle_p.cpp
@@ -31,6 +31,7 @@
 #include <QDebug>
 #include <QTextEdit>
 #include <QMessageBox>
+#include <qdatetime.h>
 
 static int spinArrowWidth = 16;             // spinbox arrow width
 
@@ -54,6 +55,9 @@ protected:
 
 private:
     QPoint mousePos;
+    QPoint mouseSpace;
+    QTime mousePosTime;
+    QTime mouseSpaceTime;
     Qt::MouseButtons buttons;
     QAbstractScrollArea *scrollArea;
     QWidget *target;
@@ -100,6 +104,9 @@ bool QThumbStylePrivate::handleMousePress(QAbstractScrollArea *w, QWidget *t, QM
         if (w) {
             scrollArea = w;
             mousePos = e->globalPos();
+            mouseSpace = mousePos;
+            mousePosTime = QTime::currentTime();
+            mouseSpaceTime = mousePosTime;
             buttons = e->buttons();
             filterPress = false;
 //            e->accept();
@@ -122,6 +129,7 @@ bool QThumbStylePrivate::handleMouseMove(QAbstractScrollArea *w, QWidget* /*t*/,
         return false;
     if (scrollArea) {
         QPoint diff = mousePos - e->globalPos();
+        int timediff = mousePosTime.msecsTo(QTime::currentTime());
         if (!filterPress
             && (qAbs(diff.y()) > moveThreshold 
             || qAbs(diff.x()) > moveThreshold)) {
@@ -142,18 +150,24 @@ bool QThumbStylePrivate::handleMouseMove(QAbstractScrollArea *w, QWidget* /*t*/,
         }
         if (filterPress) {
             QScrollBar *sb = scrollArea->verticalScrollBar();
+            int timediff = mousePosTime.msecsTo(QTime::currentTime());
             if (diff.y() && sb->isVisible() && sb->isEnabled() && sb->height()) {
-                int moveY = diff.y() * sb->pageStep() / sb->height();
+                float instantSpeed = ((float) qAbs(diff.y()) / (float) timediff) * 1000.0;
+                int pagestep = sb->pageStep() + (float) (instantSpeed / 5.);
+                int moveY = diff.y() * pagestep / sb->height();
                 sb->setValue(sb->value() + moveY);
             }
 
             sb = scrollArea->horizontalScrollBar();
             if (diff.x() && sb->isVisible() && sb->isEnabled() && sb->width()) {
-                int moveX = diff.x() * sb->pageStep() / sb->width();
+                float instantSpeed = ((float) qAbs(diff.x()) / (float) timediff) * 1000.0;
+                int pagestep = sb->pageStep() + (float) (instantSpeed / 5.);
+                int moveX = diff.x() * pagestep / sb->width();
                 sb->setValue(sb->value() + moveX);
             }
 
             mousePos = e->globalPos();
+            mousePosTime = QTime::currentTime();
             return true;
         }
         if (ptimer.isActive())
@@ -170,13 +184,46 @@ bool QThumbStylePrivate::handleMouseRelease(QAbstractScrollArea * /*w*/, QWidget
     if (e->button() == Qt::LeftButton) {
         pressed = false;
         if (target) {
-            scrollArea = 0;
             if (filterPress) {
                 // Don't send any release
                 target = 0;
                 ptimer.stop();
                 e->accept();
                 filterPress = false;
+                if (scrollArea) {
+                    int mousedragtime = mouseSpaceTime.msecsTo(QTime::currentTime());
+                    QPoint mousedragspace = mouseSpace - e->globalPos();
+
+                    QScrollBar *sb = scrollArea->verticalScrollBar();
+                    if (sb->isVisible() && sb->isEnabled() && sb->height()) {
+                        float mouseSpeed = (float) qAbs(mousedragspace.y()) / (float) mousedragtime * 1000.;
+                        float mouseAccel = mouseSpeed / ((float) mousedragtime / 1000.);
+                        //int pagestep = sb->pageStep() + (float) (mouseSpeed / 5.);
+                        if (qAbs(mousedragspace.y()) > 280 && mouseAccel > 800) {
+                            // Scrolls to the end/begin if there's enough power
+                            // TODO auto-scroll until there's acceleration and no mouse events
+                            if (mousedragspace.y() < 0)
+                                sb->setValue(sb->minimum());
+                            else
+                                sb->setValue(sb->maximum());
+                        }
+                    }
+                    sb = scrollArea->horizontalScrollBar();
+                    if (sb->isVisible() && sb->isEnabled() && sb->width()) {
+                        float mouseSpeed = (float) qAbs(mousedragspace.x()) / (float) mousedragtime * 1000.;
+                        float mouseAccel = mouseSpeed / ((float) mousedragtime / 1000.);
+                        //int pagestep = sb->pageStep() + (float) (mouseSpeed / 5.);
+                        if (qAbs(mousedragspace.x()) > 280 && mouseAccel > 800) {
+                            // Scrolls to the end/begin if there's enough power
+                            // TODO auto-scroll until there's acceleration and no mouse events
+                            if (mousedragspace.x() < 0)
+                                sb->setValue(sb->minimum());
+                            else
+                                sb->setValue(sb->maximum());
+                        }
+                    }
+                }
+                scrollArea = 0;
                 return true;
             } else {
                 QWidget *fw = target;
@@ -223,8 +270,9 @@ bool QThumbStylePrivate::eventFilter(QObject *o, QEvent *e)
                     return true;
                 break;
             case QEvent::MouseMove:
-                if (handleMouseMove(sa, (QWidget*)o, (QMouseEvent*)e))
+                if (handleMouseMove(sa, (QWidget*)o, (QMouseEvent*)e)) {
                     return true;
+                }
                 break;
             case QEvent::MouseButtonRelease:
                 if (handleMouseRelease(sa, (QWidget*)o, (QMouseEvent*)e))

