diff --git a/src/plugins/qmlprofiler/qml/MainView.qml b/src/plugins/qmlprofiler/qml/MainView.qml
index 172adb8158dd76916db02bf26a9116f483e68385..cdb5cfb6bf3b12fa68637316fa8a0300fa850f0a 100644
--- a/src/plugins/qmlprofiler/qml/MainView.qml
+++ b/src/plugins/qmlprofiler/qml/MainView.qml
@@ -81,9 +81,9 @@ Rectangle {
             var startTime = Plotter.ranges[0].start;
             if (rangeMover.value + startTime> event.start) {
                 rangeMover.x = Math.max(0,
-                    Math.floor((event.start - startTime) / xs - canvas.canvasWindow.x - rangeMover.width/2) );
-            } else if (rangeMover.value + startTime + rangeMover.width * xs < event.start + event.duration) {
-                rangeMover.x = Math.floor((event.start + event.duration - startTime) / xs - canvas.canvasWindow.x - rangeMover.width/2);
+                    Math.floor((event.start - startTime) / xs - canvas.canvasWindow.x - rangeMover.zoomWidth/2) );
+            } else if (rangeMover.value + startTime + rangeMover.zoomWidth * xs < event.start + event.duration) {
+                rangeMover.x = Math.floor((event.start + event.duration - startTime) / xs - canvas.canvasWindow.x - rangeMover.zoomWidth/2);
             }
         }
     }
@@ -104,6 +104,30 @@ Rectangle {
         }
     }
 
+    function zoomIn() {
+        // 10%
+        var newZoom = rangeMover.zoomWidth / 1.1;
+
+        // 0.1 ms minimum zoom
+        if (newZoom * Plotter.xScale(canvas) > 100000) {
+            hideRangeDetails();
+            rangeMover.zoomWidth =  newZoom
+            rangeMover.updateZoomControls();
+        }
+    }
+
+    function zoomOut() {
+        hideRangeDetails();
+        // 10%
+        var newZoom = rangeMover.zoomWidth * 1.1;
+        if (newZoom > canvas.width)
+            newZoom = canvas.width;
+        if (newZoom + rangeMover.x > canvas.width)
+            rangeMover.x = canvas.width - newZoom;
+        rangeMover.zoomWidth = newZoom;
+        rangeMover.updateZoomControls();
+    }
+
     //handle debug data coming from C++
     Connections {
         target: connection
@@ -173,7 +197,7 @@ Rectangle {
         anchors.left: flick.left
         anchors.right: flick.right
         startTime: rangeMover.x * Plotter.xScale(canvas);
-        endTime: (rangeMover.x + rangeMover.width) * Plotter.xScale(canvas);
+        endTime: (rangeMover.x + rangeMover.zoomWidth) * Plotter.xScale(canvas);
     }
 
     function hideRangeDetails() {
@@ -227,13 +251,7 @@ Rectangle {
                     flick.contentX = startX
             }
             startTime: rangeMover.value
-
-            property real prevXStep:  -1
-            property real possibleEndTime: startTime + (rangeMover.width*Plotter.xScale(canvas))
-            onPossibleEndTimeChanged:  {
-                prevXStep = canvas.canvasWindow.x;
-                endTime = possibleEndTime
-            }
+            endTime: startTime + (rangeMover.zoomWidth*Plotter.xScale(canvas))
             onEndTimeChanged: updateTimeline()
 
             delegate: Rectangle {
@@ -413,7 +431,7 @@ Rectangle {
     MouseArea {
         anchors.fill: canvas
         //### ideally we could press to position then immediately drag
-        onPressed: rangeMover.x = mouse.x - rangeMover.width/2
+        onPressed: rangeMover.x = mouse.x - rangeMover.zoomWidth/2
     }
 
     RangeMover {
diff --git a/src/plugins/qmlprofiler/qml/RangeMover.qml b/src/plugins/qmlprofiler/qml/RangeMover.qml
index 68c528074c7e32cf053ac3ca38e90dfd66cd78c3..936ca54c7b0ef0f7efbfe6b94a66d4dc4395902c 100644
--- a/src/plugins/qmlprofiler/qml/RangeMover.qml
+++ b/src/plugins/qmlprofiler/qml/RangeMover.qml
@@ -37,60 +37,80 @@ import Monitor 1.0
 
 Item {
     id: rangeMover
-    width: rect.width; height: 50
-
-    property real prevXStep: -1
-    property real possibleValue: (canvas.canvasWindow.x + x) * Plotter.xScale(canvas)
-    onPossibleValueChanged:  {
-        prevXStep = canvas.canvasWindow.x;
-        if (value != possibleValue)
-            value = possibleValue;
+
+
+    property color lighterColor:"#cc80b2f6"
+    property color darkerColor:"#cc6da1e8"
+    property real value: (canvas.canvasWindow.x + x) * Plotter.xScale(canvas)
+    property real zoomWidth: 20
+
+    function updateZoomControls() {
+        rightRange.x = rangeMover.width;
     }
+    onXChanged: updateZoomControls();
 
-    property real value
+    width: Math.max(rangeMover.zoomWidth, 20); height: 50
 
     MouseArea {
         anchors.fill: parent
         drag.target: rangeMover
         drag.axis: "XAxis"
         drag.minimumX: 0
-        drag.maximumX: canvas.width - rangeMover.width //###
+        drag.maximumX: canvas.width - rangeMover.zoomWidth //###
+    }
+
+    Rectangle {
+        id: frame
+        color:"transparent"
+        border.width: 1
+        border.color: darkerColor
+        anchors.fill: parent
+        anchors.rightMargin: 1
+        anchors.bottomMargin: 1
     }
 
     Rectangle {
         id: rect
 
-        color: "#cc80b2f6"
-        width: 20
+        color: lighterColor
+        width: parent.zoomWidth
         height: parent.height
     }
 
+
+
     Rectangle {
         id: leftRange
 
         property int currentX: rangeMover.x
-        property int currentWidth : rect.width
+        property int currentWidth : rangeMover.zoomWidth
 
+        x: -width
         height: parent.height
-        width: 5
-        color: Qt.darker(rect.color);
-        opacity: 0.3
+        width: 15
+        color: darkerColor
+
+        Text {
+            anchors.centerIn: parent
+            text:"<"
+        }
+
         MouseArea {
             anchors.fill: parent
             drag.target: leftRange
             drag.axis: "XAxis"
             drag.minimumX: -parent.currentX
-            drag.maximumX: parent.currentWidth - 20
+            drag.maximumX: parent.currentWidth - width - 1
             onPressed: {
                 parent.currentX = rangeMover.x;
-                parent.currentWidth = rect.width;
+                parent.currentWidth = rangeMover.zoomWidth;
             }
         }
         onXChanged: {
-            if (x!=0) {
-                rect.width = currentWidth - x;
-                rangeMover.x = currentX + x;
-                x = 0;
+            if (x + width != 0) {
+                rangeMover.zoomWidth = currentWidth - x - width;
+                rangeMover.x = currentX + x + width;
+                x = -width;
             }
         }
     }
@@ -98,23 +118,32 @@ Item {
     Rectangle {
         id: rightRange
         property int currentX: rangeMover.x
+        property int widthSpace: rangeMover.width - rangeMover.zoomWidth
 
         height: parent.height
-        width: 5
-        anchors.right: parent.right
-        color: Qt.darker(rect.color);
-        opacity: 0.3
+        width: 15
+        x: rangeMover.width
+        color: darkerColor;
+
+        Text {
+            anchors.centerIn: parent
+            text:">"
+        }
         MouseArea {
             anchors.fill: parent
             drag.target: rightRange
             drag.axis: "XAxis"
-            drag.minimumX: 15
+            drag.minimumX: 1 + parent.widthSpace
             drag.maximumX: canvas.width - parent.currentX;
-            onPressed: parent.currentX = rangeMover.x;
+            onPressed: {
+                parent.currentX = rangeMover.x;
+                parent.widthSpace = rangeMover.width - rangeMover.zoomWidth;
+            }
+            onReleased: rightRange.x = rangeMover.width;
         }
         onXChanged: {
-            if (x != rect.width - width) {
-                rect.width = x + width;
+            if (x != rangeMover.width) {
+                rangeMover.zoomWidth = x - widthSpace;
             }
         }
     }
diff --git a/src/plugins/qmlprofiler/qml/magnifier-minus.png b/src/plugins/qmlprofiler/qml/magnifier-minus.png
new file mode 100644
index 0000000000000000000000000000000000000000..3bfcea0ff7603225f0a7f9e9b1ff01bb71cbdbb8
Binary files /dev/null and b/src/plugins/qmlprofiler/qml/magnifier-minus.png differ
diff --git a/src/plugins/qmlprofiler/qml/magnifier-plus.png b/src/plugins/qmlprofiler/qml/magnifier-plus.png
new file mode 100644
index 0000000000000000000000000000000000000000..51bed6844d305c253e12c204befa32a11a0fb2f9
Binary files /dev/null and b/src/plugins/qmlprofiler/qml/magnifier-plus.png differ
diff --git a/src/plugins/qmlprofiler/qml/qml.qrc b/src/plugins/qmlprofiler/qml/qml.qrc
index 6f65ff84800abcd50e0f8682e71706a255b0a403..822e2096d029961de8dfa3f1230ae178ee09680a 100644
--- a/src/plugins/qmlprofiler/qml/qml.qrc
+++ b/src/plugins/qmlprofiler/qml/qml.qrc
@@ -14,5 +14,7 @@
         <file>prev.png</file>
         <file>next.png</file>
         <file>toolbarbg.png</file>
+        <file>magnifier-minus.png</file>
+        <file>magnifier-plus.png</file>
     </qresource>
 </RCC>
diff --git a/src/plugins/qmlprofiler/tracewindow.cpp b/src/plugins/qmlprofiler/tracewindow.cpp
index fe41a82daed18b1f1ebccafea804d5785658f048..817f946ad9acd7554c56f3491b64f01ff2ef6de7 100644
--- a/src/plugins/qmlprofiler/tracewindow.cpp
+++ b/src/plugins/qmlprofiler/tracewindow.cpp
@@ -295,8 +295,16 @@ TraceWindow::TraceWindow(QWidget *parent)
     QToolButton *buttonNext= new QToolButton;
     buttonNext->setIcon(QIcon(":/qmlprofiler/next.png"));
     connect(buttonNext, SIGNAL(clicked()), this, SIGNAL(jumpToNext()));
+    QToolButton *buttonZoomIn = new QToolButton;
+    buttonZoomIn->setIcon(QIcon(":/qmlprofiler/magnifier-plus.png"));
+    connect(buttonZoomIn, SIGNAL(clicked()), this, SIGNAL(zoomIn()));
+    QToolButton *buttonZoomOut = new QToolButton;
+    buttonZoomOut->setIcon(QIcon(":/qmlprofiler/magnifier-minus.png"));
+    connect(buttonZoomOut, SIGNAL(clicked()), this, SIGNAL(zoomOut()));
     toolBarLayout->addWidget(buttonPrev);
     toolBarLayout->addWidget(buttonNext);
+    toolBarLayout->addWidget(buttonZoomIn);
+    toolBarLayout->addWidget(buttonZoomOut);
 
     m_view->setResizeMode(QDeclarativeView::SizeRootObjectToView);
     m_view->setFocus();
@@ -330,6 +338,8 @@ void TraceWindow::reset(QDeclarativeDebugConnection *conn)
     connect(m_view->rootObject(), SIGNAL(updateTimer()), this, SLOT(updateTimer()));
     connect(this, SIGNAL(jumpToPrev()), m_view->rootObject(), SLOT(prevEvent()));
     connect(this, SIGNAL(jumpToNext()), m_view->rootObject(), SLOT(nextEvent()));
+    connect(this, SIGNAL(zoomIn()), m_view->rootObject(), SLOT(zoomIn()));
+    connect(this, SIGNAL(zoomOut()), m_view->rootObject(), SLOT(zoomOut()));
 
     connect(this, SIGNAL(internalClearDisplay()), m_view->rootObject(), SLOT(clearAll()));
 }
diff --git a/src/plugins/qmlprofiler/tracewindow.h b/src/plugins/qmlprofiler/tracewindow.h
index aa39372035c85a1b01b3c75801444a24f0d5e77f..07e0f8606e2c2e24652f11e6e875ecf5ba00eab8 100644
--- a/src/plugins/qmlprofiler/tracewindow.h
+++ b/src/plugins/qmlprofiler/tracewindow.h
@@ -78,6 +78,8 @@ signals:
     void internalClearDisplay();
     void jumpToPrev();
     void jumpToNext();
+    void zoomIn();
+    void zoomOut();
 
 private:
     QWeakPointer<TracePlugin> m_plugin;