diff --git a/src/libs/qmleditorwidgets/contextpanewidget.cpp b/src/libs/qmleditorwidgets/contextpanewidget.cpp
index 267d3854e33750300680c0b1224464b43a6c8972..d3b9941aad1b169c8e97b59104c8d19c8d54c7a4 100644
--- a/src/libs/qmleditorwidgets/contextpanewidget.cpp
+++ b/src/libs/qmleditorwidgets/contextpanewidget.cpp
@@ -92,7 +92,7 @@ DragWidget::DragWidget(QWidget *parent) : QFrame(parent)
     setFrameStyle(QFrame::NoFrame);
     setFrameShape(QFrame::StyledPanel);
     setFrameShadow(QFrame::Sunken);
-    m_oldPos = QPoint(-1, -1);
+    m_startPos = QPoint(-1, -1);
     m_pos = QPoint(-1, -1);
 
     m_dropShadowEffect = new QGraphicsDropShadowEffect;
@@ -104,7 +104,7 @@ DragWidget::DragWidget(QWidget *parent) : QFrame(parent)
 void DragWidget::mousePressEvent(QMouseEvent * event)
 {
     if (event->button() ==  Qt::LeftButton) {
-        m_oldPos = event->globalPos();
+        m_startPos = event->globalPos() - parentWidget()->mapToGlobal((pos()));
         m_opacityEffect = new QGraphicsOpacityEffect;
         setGraphicsEffect(m_opacityEffect);
         event->accept();
@@ -115,7 +115,7 @@ void DragWidget::mousePressEvent(QMouseEvent * event)
 void DragWidget::mouseReleaseEvent(QMouseEvent *event)
 {
     if (event->button() ==  Qt::LeftButton) {
-        m_oldPos = QPoint(-1, -1);
+        m_startPos = QPoint(-1, -1);
         m_dropShadowEffect = new QGraphicsDropShadowEffect;
         m_dropShadowEffect->setBlurRadius(6);
         m_dropShadowEffect->setOffset(2, 2);
@@ -124,26 +124,35 @@ void DragWidget::mouseReleaseEvent(QMouseEvent *event)
     QFrame::mouseReleaseEvent(event);
 }
 
+static inline int limit(int a, int min, int max)
+{
+    if (a < min)
+        return min;
+    if (a > max)
+        return max;
+    return a;
+}
+
 void DragWidget::mouseMoveEvent(QMouseEvent * event)
 {
     if (event->buttons() &&  Qt::LeftButton) {
-        if (pos().x() < 10  && event->pos().x() < -20)
-            return;
-        if (m_oldPos != QPoint(-1, -1)) {
-            QPoint diff = event->globalPos() - m_oldPos;
-            QPoint newPos = pos() + diff;
-            if (newPos.x() > 0 && newPos.y() > 0 && (newPos.x() + width()) < parentWidget()->width() && (newPos.y() + height()) < parentWidget()->height()) {
-                if (m_secondaryTarget)
-                    m_secondaryTarget->move(m_secondaryTarget->pos() + diff);
-                move(newPos);
-                m_pos = newPos;
+        if (m_startPos != QPoint(-1, -1)) {
+            QPoint newPos = parentWidget()->mapFromGlobal(event->globalPos() - m_startPos);
+
+            newPos.setX(limit(newPos.x(), 20, parentWidget()->width() - 20 - width()));
+            newPos.setY(limit(newPos.y(), 2, parentWidget()->height() - 20 - height()));
+
+            QPoint diff = pos() - newPos;
+            if (m_secondaryTarget)
+                m_secondaryTarget->move(m_secondaryTarget->pos() - diff);
+            move(newPos);
+            if (m_pos != newPos)
                 protectedMoved();
-            }
+            m_pos = newPos;
         } else {
             m_opacityEffect = new QGraphicsOpacityEffect;
             setGraphicsEffect(m_opacityEffect);
         }
-        m_oldPos = event->globalPos();
         event->accept();
     }
 }
diff --git a/src/libs/qmleditorwidgets/contextpanewidget.h b/src/libs/qmleditorwidgets/contextpanewidget.h
index 129d24a1b78bb751661b936e2e2439a5251b12af..d7d4d83b470775c1ce82429d566c473728517a4c 100644
--- a/src/libs/qmleditorwidgets/contextpanewidget.h
+++ b/src/libs/qmleditorwidgets/contextpanewidget.h
@@ -68,7 +68,7 @@ protected:
 private:
     QGraphicsDropShadowEffect *m_dropShadowEffect;
     QGraphicsOpacityEffect *m_opacityEffect;
-    QPoint m_oldPos;
+    QPoint m_startPos;
     QWeakPointer<QWidget> m_secondaryTarget;
 };