diff --git a/scalepicker.cpp b/scalepicker.cpp
new file mode 100644
--- /dev/null
+++ b/scalepicker.cpp
@@ -0,0 +1,92 @@
+/*
+  Copyright © 2015 Hasan Yavuz Özderya
+
+  This file is part of serialplot.
+
+  serialplot is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  serialplot is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with serialplot.  If not, see .
+*/
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "scalepicker.h"
+
+ScalePicker::ScalePicker(QwtScaleWidget* scaleWidget) :
+    QObject(scaleWidget)
+{
+    scaleWidget->installEventFilter(this);
+    _scaleWidget = scaleWidget;
+    started = false;
+}
+
+bool ScalePicker::eventFilter(QObject* object, QEvent* event)
+{
+    if (event->type() == QEvent::MouseButtonPress ||
+        event->type() == QEvent::MouseButtonRelease ||
+        event->type() == QEvent::MouseMove)
+    {
+        QMouseEvent* mouseEvent = (QMouseEvent*) event;
+        double pos = this->position(mouseEvent);
+
+        if (event->type() == QEvent::MouseButtonPress)
+        {
+            started = true;
+            firstPos = pos;
+            qDebug() << "Pick started:" << firstPos;
+            emit pickStarted(pos);
+        }
+        else if (event->type() == QEvent::MouseMove)
+        {
+            if (started)
+            {
+                qDebug() << "Picking:" << firstPos << pos;
+                emit picking(firstPos, pos);
+            }
+        }
+        else // event->type() == QEvent::MouseButtonRelease
+        {
+            if (started)
+            {
+                started = false;
+                qDebug() << "Picked:" << firstPos << pos;
+                emit picked(firstPos, pos);
+            }
+        }
+        return true;
+    }
+    else
+    {
+        return QObject::eventFilter(object, event);
+    }
+}
+
+double ScalePicker::position(QMouseEvent* mouseEvent)
+{
+    // capture and convert the position of the click to the plot coordinates
+    double pos;
+    if (_scaleWidget->alignment() == QwtScaleDraw::BottomScale ||
+        _scaleWidget->alignment() == QwtScaleDraw::TopScale)
+    {
+        pos = mouseEvent->pos().x();
+    }
+    else // left or right scale
+    {
+        pos = mouseEvent->pos().y();
+    }
+    pos = _scaleWidget->scaleDraw()->scaleMap().invTransform(pos);
+    return pos;
+}