diff --git a/src/plugins/texteditor/syntaxhighlighter.cpp b/src/plugins/texteditor/syntaxhighlighter.cpp
index dea2c859aaba8661f47c1f9129c8a6ec94c76654..35329447f3705918a0a5658c7224424c9c76c167 100644
--- a/src/plugins/texteditor/syntaxhighlighter.cpp
+++ b/src/plugins/texteditor/syntaxhighlighter.cpp
@@ -111,27 +111,11 @@ void SyntaxHighlighterPrivate::applyFormatChanges(int from, int charsRemoved, in
 
     QList<QTextLayout::FormatRange> ranges = layout->additionalFormats();
 
-    const int preeditAreaStart = layout->preeditAreaPosition();
-    const int preeditAreaLength = layout->preeditAreaText().length();
     bool doAdjustRange = currentBlock.contains(from);
 
-    if (preeditAreaLength != 0) {
-        QList<QTextLayout::FormatRange>::Iterator it = ranges.begin();
-        while (it != ranges.end()) {
-            if (it->format.property(QTextFormat::UserProperty).toBool()) {
-                if (doAdjustRange)
-                    formatsChanged = adjustRange(*it, from - currentBlock.position(), charsRemoved, charsAdded)
-                            || formatsChanged;
-                ++it;
-            } else  if (it->start >= preeditAreaStart
-                && it->start + it->length <= preeditAreaStart + preeditAreaLength) {
-                ++it;
-            } else {
-                it = ranges.erase(it);
-                formatsChanged = true;
-            }
-        }
-    } else if (!ranges.isEmpty()) {
+    QList<QTextLayout::FormatRange> old_ranges;
+
+    if (!ranges.isEmpty()) {
         QList<QTextLayout::FormatRange>::Iterator it = ranges.begin();
         while (it != ranges.end()) {
             if (it->format.property(QTextFormat::UserProperty).toBool()) {
@@ -140,8 +124,8 @@ void SyntaxHighlighterPrivate::applyFormatChanges(int from, int charsRemoved, in
                             || formatsChanged;
                 ++it;
             } else {
+                old_ranges.append(*it);
                 it = ranges.erase(it);
-                formatsChanged = true;
             }
         }
     }
@@ -151,6 +135,7 @@ void SyntaxHighlighterPrivate::applyFormatChanges(int from, int charsRemoved, in
     QTextLayout::FormatRange r;
     r.start = -1;
 
+    QList<QTextLayout::FormatRange> new_ranges;
     int i = 0;
     while (i < formatChanges.count()) {
 
@@ -171,33 +156,26 @@ void SyntaxHighlighterPrivate::applyFormatChanges(int from, int charsRemoved, in
 
         r.length = i - r.start;
 
-        if (preeditAreaLength != 0) {
-            if (r.start >= preeditAreaStart)
-                r.start += preeditAreaLength;
-            else if (r.start + r.length >= preeditAreaStart)
-                r.length += preeditAreaLength;
-        }
-
-        ranges << r;
-        formatsChanged = true;
+        new_ranges << r;
         r.start = -1;
     }
 
     if (r.start != -1) {
         r.length = formatChanges.count() - r.start;
 
-        if (preeditAreaLength != 0) {
-            if (r.start >= preeditAreaStart)
-                r.start += preeditAreaLength;
-            else if (r.start + r.length >= preeditAreaStart)
-                r.length += preeditAreaLength;
-        }
+        new_ranges << r;
+    }
+
+    formatsChanged = formatsChanged || (new_ranges.size() != old_ranges.size());
 
-        ranges << r;
-        formatsChanged = true;
+    for (int i = 0; !formatsChanged && i < new_ranges.size(); ++i) {
+        const QTextLayout::FormatRange &o = old_ranges.at(i);
+        const QTextLayout::FormatRange &n = new_ranges.at(i);
+        formatsChanged = (o.start != n.start || o.length != n.length || o.format != n.format);
     }
 
     if (formatsChanged) {
+        ranges.append(new_ranges);
         layout->setAdditionalFormats(ranges);
         doc->markContentsDirty(currentBlock.position(), currentBlock.length());
     }
diff --git a/src/plugins/texteditor/texteditoroverlay.cpp b/src/plugins/texteditor/texteditoroverlay.cpp
index a9bc6d76347add920c16fe36e01abbbcb0f010b1..20fd2698b7585e413b0e70bd23dd73f025072898 100644
--- a/src/plugins/texteditor/texteditoroverlay.cpp
+++ b/src/plugins/texteditor/texteditoroverlay.cpp
@@ -59,7 +59,8 @@ void TextEditorOverlay::setVisible(bool b)
     if (m_visible == b)
         return;
     m_visible = b;
-    m_viewport->update();
+    if (!m_selections.isEmpty())
+        m_viewport->update();
 }
 
 void TextEditorOverlay::clear()