diff --git a/src/plugins/find/basetextfind.cpp b/src/plugins/find/basetextfind.cpp
index beb714b52d5d6a4418c2c6f3bbffde18d4f5acc9..72dde1ae68f0bf3dc78fad9ba88074f9a472f51d 100644
--- a/src/plugins/find/basetextfind.cpp
+++ b/src/plugins/find/basetextfind.cpp
@@ -205,8 +205,8 @@ int BaseTextFind::replaceAll(const QString &before, const QString &after,
     IFindSupport::FindFlags findFlags)
 {
     QTextCursor editCursor = textCursor();
-    if (!m_findScope.isNull())
-        editCursor.setPosition(m_findScope.selectionStart());
+    if (!m_findScopeStart.isNull())
+        editCursor.setPosition(m_findScopeStart.position());
     else
         editCursor.movePosition(QTextCursor::Start);
     editCursor.beginEditBlock();
@@ -243,14 +243,14 @@ bool BaseTextFind::find(const QString &txt,
     regexp.setCaseSensitivity((findFlags&IFindSupport::FindCaseSensitively) ? Qt::CaseSensitive : Qt::CaseInsensitive);
     QTextCursor found = findOne(regexp, start, IFindSupport::textDocumentFlagsForFindFlags(findFlags));
 
-    if (!m_findScope.isNull()) {
+    if (!m_findScopeStart.isNull()) {
 
         // scoped
         if (found.isNull() || !inScope(found.selectionStart(), found.selectionEnd())) {
             if ((findFlags&IFindSupport::FindBackward) == 0)
-                start.setPosition(m_findScope.selectionStart());
+                start.setPosition(m_findScopeStart.position());
             else
-                start.setPosition(m_findScope.selectionEnd());
+                start.setPosition(m_findScopeEnd.position());
             found = findOne(regexp, start, IFindSupport::textDocumentFlagsForFindFlags(findFlags));
             if (found.isNull() || !inScope(found.selectionStart(), found.selectionEnd()))
                 return false;
@@ -289,8 +289,8 @@ QTextCursor BaseTextFind::findOne(const QRegExp &expr, const QTextCursor &from,
         b.setPosition(candidate.selectionStart());
         QTextCursor e = candidate;
         e.setPosition(candidate.selectionEnd());
-        if (b.positionInBlock() >= m_findScopeFromColumn
-            && e.positionInBlock() <= m_findScopeToColumn)
+        if (b.positionInBlock() >= m_findScopeStart.positionInBlock() + 1
+            && e.positionInBlock() <= m_findScopeStart.positionInBlock() + 1 + m_findScopeVerticalBlockSelection)
             return candidate;
         candidate = document()->find(expr, candidate, options);
     }
@@ -299,17 +299,18 @@ QTextCursor BaseTextFind::findOne(const QRegExp &expr, const QTextCursor &from,
 
 bool BaseTextFind::inScope(int startPosition, int endPosition) const
 {
-    if (m_findScope.isNull())
+    if (m_findScopeStart.isNull())
         return true;
-    return (m_findScope.selectionStart() <= startPosition
-            && m_findScope.selectionEnd() >= endPosition);
+    return (m_findScopeStart.position() <= startPosition
+            && m_findScopeEnd.position() >= endPosition);
 }
 
 void BaseTextFind::defineFindScope()
 {
     QTextCursor cursor = textCursor();
     if (cursor.hasSelection() && cursor.block() != cursor.document()->findBlock(cursor.anchor())) {
-        m_findScope = cursor;
+        m_findScopeStart = QTextCursor(document()->docHandle(), qMax(0, cursor.selectionStart()-1));
+        m_findScopeEnd = QTextCursor(document()->docHandle(), cursor.selectionEnd());
         m_findScopeVerticalBlockSelection = false;
 
         int verticalBlockSelection = 0;
@@ -317,18 +318,16 @@ void BaseTextFind::defineFindScope()
             verticalBlockSelection = m_plaineditor->property("verticalBlockSelection").toInt();
 
         if (verticalBlockSelection) {
-            QTextDocument *doc = document();
-            QTextCursor b(doc->docHandle(), cursor.selectionStart());
-            QTextCursor e(doc->docHandle(), cursor.selectionEnd());
-            m_findScopeFromColumn = qMin(b.positionInBlock(), e.positionInBlock());
-            m_findScopeToColumn = m_findScopeFromColumn + verticalBlockSelection;
-            m_findScope.setPosition(b.block().position() + m_findScopeFromColumn);
-            m_findScope.setPosition(e.block().position() + qMin(e.block().length()-1, m_findScopeToColumn),
-                                    QTextCursor::KeepAnchor);
+            int findScopeFromColumn = qMin(m_findScopeStart.positionInBlock()+1,
+                                         m_findScopeEnd.positionInBlock());
+            int findScopeToColumn = findScopeFromColumn + verticalBlockSelection;
+            m_findScopeStart.setPosition(m_findScopeStart.block().position() + findScopeFromColumn - 1);
+            m_findScopeEnd.setPosition(m_findScopeEnd.block().position()
+                                       + qMin(m_findScopeEnd.block().length()-1, findScopeToColumn));
             m_findScopeVerticalBlockSelection = verticalBlockSelection;
         }
-        emit findScopeChanged(m_findScope, m_findScopeVerticalBlockSelection);
-        cursor.setPosition(m_findScope.selectionStart());
+        emit findScopeChanged(m_findScopeStart, m_findScopeEnd, m_findScopeVerticalBlockSelection);
+        cursor.setPosition(m_findScopeStart.position()+1);
         setTextCursor(cursor);
     } else {
         clearFindScope();
@@ -337,7 +336,8 @@ void BaseTextFind::defineFindScope()
 
 void BaseTextFind::clearFindScope()
 {
-    m_findScope = QTextCursor();
+    m_findScopeStart = QTextCursor();
+    m_findScopeEnd = QTextCursor();
     m_findScopeVerticalBlockSelection = 0;
-    emit findScopeChanged(m_findScope, m_findScopeVerticalBlockSelection);
+    emit findScopeChanged(m_findScopeStart, m_findScopeEnd, m_findScopeVerticalBlockSelection);
 }
diff --git a/src/plugins/find/basetextfind.h b/src/plugins/find/basetextfind.h
index 0c5c777b8eaf3b9bcdfc07b2a78e5f32c904198f..c62f5a7282e3f07405d0d983540414146ff8f1e7 100644
--- a/src/plugins/find/basetextfind.h
+++ b/src/plugins/find/basetextfind.h
@@ -70,7 +70,7 @@ public:
 
 signals:
     void highlightAll(const QString &txt, Find::IFindSupport::FindFlags findFlags);
-    void findScopeChanged(const QTextCursor &, int = 0);
+    void findScopeChanged(const QTextCursor &start, const QTextCursor &end, int verticalBlockSelection);
 
 private:
     bool find(const QString &txt,
@@ -83,10 +83,9 @@ private:
     bool isReadOnly() const;
     QPointer<QTextEdit> m_editor;
     QPointer<QPlainTextEdit> m_plaineditor;
-    QTextCursor m_findScope;
+    QTextCursor m_findScopeStart;
+    QTextCursor m_findScopeEnd;
     int m_findScopeVerticalBlockSelection;
-    int m_findScopeFromColumn;
-    int m_findScopeToColumn;
     bool inScope(int startPosition, int endPosition) const;
     QTextCursor findOne(const QRegExp &expr, const QTextCursor &from, QTextDocument::FindFlags options) const;
     int m_incrementalStartPos;
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index 239df6c1ad0ea5daf3628bcf248aa5adb1463aa1..e4489414797a0e5a4767afdfdaae657a7df4929d 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -2197,10 +2197,8 @@ void BaseTextEditorPrivate::highlightSearchResults(const QTextBlock &block,
     int l = 1;
 
     int m_findScopeFirstColumn = 0;
-    if (!m_findScope.isNull() && m_findScopeVerticalBlockSelection)  {
-        QTextCursor b = cursor;
-        cursor.setPosition(m_findScope.selectionStart());
-        m_findScopeFirstColumn = cursor.positionInBlock();
+    if (!m_findScopeStart.isNull() && m_findScopeVerticalBlockSelection)  {
+        m_findScopeFirstColumn = m_findScopeStart.positionInBlock() + 1;
     }
 
 
@@ -2214,9 +2212,9 @@ void BaseTextEditorPrivate::highlightSearchResults(const QTextBlock &block,
                 || (idx + l < text.length() && text.at(idx + l).isLetterOrNumber())))
             continue;
 
-        if (!m_findScope.isNull()) {
-            if (blockPosition + idx < m_findScope.selectionStart()
-                || blockPosition + idx + l > m_findScope.selectionEnd())
+        if (!m_findScopeStart.isNull()) {
+            if (blockPosition + idx < m_findScopeStart.position()
+                || blockPosition + idx + l > m_findScopeEnd.position())
                 continue;
             if (m_findScopeVerticalBlockSelection) {
                 if (idx < m_findScopeFirstColumn
@@ -2487,12 +2485,18 @@ void BaseTextEditor::paintEvent(QPaintEvent *e)
 
 
 
-    if (!d->m_findScope.isNull()) {
+    if (!d->m_findScopeStart.isNull()) {
 
         TextEditorOverlay *overlay = new TextEditorOverlay(this);
-        overlay->addOverlaySelection(d->m_findScope, d->m_searchScopeFormat.background().color().darker(120),
+        overlay->addOverlaySelection(d->m_findScopeStart.position(),
+                                     d->m_findScopeVerticalBlockSelection ?
+                                     d->m_findScopeEnd.block().position()
+                                     + d->m_findScopeVerticalBlockSelection
+                                     + d->m_findScopeStart.positionInBlock() + 1
+                                         : d->m_findScopeEnd.position(),
+                                     d->m_searchScopeFormat.background().color().darker(120),
                                      d->m_searchScopeFormat.background().color(),
-                                     0,
+                                     TextEditorOverlay::ExpandBegin,
                                      d->m_findScopeVerticalBlockSelection);
         overlay->setAlpha(false);
         overlay->paint(&painter, e->rect());
@@ -3367,14 +3371,14 @@ void BaseTextEditor::slotUpdateBlockNotify(const QTextBlock &block)
            box which now is invalid.*/
             emit requestBlockUpdate(block.previous());
         }
-        if (!d->m_findScope.isNull()) {
-            if (block.position() < d->m_findScope.selectionEnd()
-                && block.position()+block.length() >= d->m_findScope.selectionStart() ) {
-                QTextBlock b = block.document()->findBlock(d->m_findScope.selectionStart());
+        if (!d->m_findScopeStart.isNull()) {
+            if (block.position() < d->m_findScopeEnd.position()
+                && block.position()+block.length() >= d->m_findScopeStart.position()) {
+                QTextBlock b = block.document()->findBlock(d->m_findScopeStart.position());
                 do {
                     emit requestBlockUpdate(b);
                     b = b.next();
-                } while (b.isValid() && b.position() < d->m_findScope.selectionEnd());
+                } while (b.isValid() && b.position() < d->m_findScopeEnd.position());
             }
         }
     }
@@ -4704,10 +4708,11 @@ int BaseTextEditor::verticalBlockSelection() const
     return qAbs(b.positionInBlock() - e.positionInBlock()) + d->m_blockSelectionExtraX;
 }
 
-void BaseTextEditor::setFindScope(const QTextCursor &scope, int verticalBlockSelection)
+void BaseTextEditor::setFindScope(const QTextCursor &start, const QTextCursor &end, int verticalBlockSelection)
 {
-    if (scope.isNull() != d->m_findScope.isNull()) {
-        d->m_findScope = scope;
+    if (start != d->m_findScopeStart || end != d->m_findScopeEnd) {
+        d->m_findScopeStart = start;
+        d->m_findScopeEnd = end;
         d->m_findScopeVerticalBlockSelection = verticalBlockSelection;
         viewport()->update();
     }
@@ -5659,7 +5664,8 @@ BaseTextEditorEditable::BaseTextEditorEditable(BaseTextEditor *editor)
     BaseTextFind *baseTextFind = new BaseTextFind(editor);
     connect(baseTextFind, SIGNAL(highlightAll(QString, Find::IFindSupport::FindFlags)),
             editor, SLOT(highlightSearchResults(QString, Find::IFindSupport::FindFlags)));
-    connect(baseTextFind, SIGNAL(findScopeChanged(QTextCursor, int)), editor, SLOT(setFindScope(QTextCursor, int)));
+    connect(baseTextFind, SIGNAL(findScopeChanged(QTextCursor, QTextCursor, int)),
+            editor, SLOT(setFindScope(QTextCursor, QTextCursor, int)));
     aggregate->add(baseTextFind);
     aggregate->add(editor);
 
diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h
index cb6bea2ba64cdc014f3266a7f6cd5e721f6f91f6..1ad48289ae5876c904ad9f0601c86858687e6338 100644
--- a/src/plugins/texteditor/basetexteditor.h
+++ b/src/plugins/texteditor/basetexteditor.h
@@ -461,7 +461,7 @@ private slots:
     void memorizeCursorPosition();
     void restoreCursorPosition();
     void highlightSearchResults(const QString &txt, Find::IFindSupport::FindFlags findFlags);
-    void setFindScope(const QTextCursor &, int);
+    void setFindScope(const QTextCursor &start, const QTextCursor &end, int);
     void currentEditorChanged(Core::IEditor *editor);
     void maybeEmitContentsChangedBecauseOfUndo();
 
diff --git a/src/plugins/texteditor/basetexteditor_p.h b/src/plugins/texteditor/basetexteditor_p.h
index 2dacf3470155e31fb028deb6d9596456f64d1389..c468f80db470b302f79e89f984862b1f60f57782 100644
--- a/src/plugins/texteditor/basetexteditor_p.h
+++ b/src/plugins/texteditor/basetexteditor_p.h
@@ -249,7 +249,8 @@ public:
     void removeBlockSelection(const QString &text = QString());
     bool m_moveLineUndoHack;
 
-    QTextCursor m_findScope;
+    QTextCursor m_findScopeStart;
+    QTextCursor m_findScopeEnd;
     int m_findScopeVerticalBlockSelection;
     QTextCursor m_selectBlockAnchor;