diff --git a/src/libs/cplusplus/BackwardsScanner.cpp b/src/libs/cplusplus/BackwardsScanner.cpp
index 7f1f6cdfe6b9d816a656346e760b6d2ae5ae4c6f..288d643e799ba4651c06077e25e766bfea235d81 100644
--- a/src/libs/cplusplus/BackwardsScanner.cpp
+++ b/src/libs/cplusplus/BackwardsScanner.cpp
@@ -70,13 +70,14 @@ const SimpleToken &BackwardsScanner::fetchToken(int i)
         } else {
             ++_blocksTokenized;
 
-            const QString blockText = _block.text();
+            QString blockText = _block.text();
+            _text.prepend(QLatin1Char('\n'));
             _text.prepend(blockText);
 
             QList<SimpleToken> adaptedTokens;
             for (int i = 0; i < _tokens.size(); ++i) {
                 SimpleToken t = _tokens.at(i);
-                t.setPosition(t.position() + blockText.length());
+                t.setPosition(t.position() + blockText.length() + 1);
                 t.setText(_text.midRef(t.position(), t.length()));
                 adaptedTokens.append(t);
             }
@@ -247,8 +248,9 @@ int BackwardsScanner::startOfBlock(int index) const
     return start;
 }
 
-int BackwardsScanner::indentation(int index) const
+QString BackwardsScanner::indentationString(int index) const
 {
-    SimpleToken newline = operator[](startOfLine(index + 1));
-    return newline.position();
+    const SimpleToken tokenAfterNewline = operator[](startOfLine(index + 1));
+    const int newlinePos = qMax(0, _text.lastIndexOf(QLatin1Char('\n'), tokenAfterNewline.position()));
+    return _text.mid(newlinePos, tokenAfterNewline.position() - newlinePos);
 }
diff --git a/src/libs/cplusplus/BackwardsScanner.h b/src/libs/cplusplus/BackwardsScanner.h
index d991906fc55703f0bb18aee92a7fad3dfbc6af84..c4c65e7bbc6309857e53b3248028aa2146eb8708 100644
--- a/src/libs/cplusplus/BackwardsScanner.h
+++ b/src/libs/cplusplus/BackwardsScanner.h
@@ -61,7 +61,7 @@ public:
     // n-la token is [startToken - n]
     SimpleToken operator[](int index) const; // ### deprecate
 
-    int indentation(int index) const;
+    QString indentationString(int index) const;
 
     int startOfLine(int index) const;
     int startOfMatchingBrace(int index) const;
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 2f21580ba90a4577296c411621c73ef1a91434cb..91a9e40be7d36622f67bbfb4f50e23dc93eb9325 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -1592,37 +1592,44 @@ static void indentCPPBlock(const CPPEditor::TabSettings &ts,
     ts.indentLine(block, indent);
 }
 
+static int indentationColumn(const TextEditor::TabSettings &tabSettings,
+                             const BackwardsScanner &scanner,
+                             int index)
+{
+    return tabSettings.indentationColumn(scanner.indentationString(index));
+}
+
 void CPPEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar)
 {
     QTextCursor tc(block);
     tc.movePosition(QTextCursor::EndOfBlock);
 
+    const TabSettings &ts = tabSettings();
+
     BackwardsScanner tk(tc, QString(), 400);
     const int tokenCount = tk.startToken();
-    const int indentSize = tabSettings().m_indentSize;
 
     if (tokenCount != 0) {
         const SimpleToken firstToken = tk[0];
 
         if (firstToken.is(T_COLON)) {
-            const int indent = tk.indentation(-1) +  // indentation of the previous newline
-                               indentSize;
-            tabSettings().indentLine(block, indent);
+            const int previousLineIndent = indentationColumn(ts, tk, -1);
+            ts.indentLine(block, previousLineIndent + ts.m_indentSize);
             return;
         } else if ((firstToken.is(T_PUBLIC) || firstToken.is(T_PROTECTED) || firstToken.is(T_PRIVATE) ||
                     firstToken.is(T_Q_SIGNALS) || firstToken.is(T_Q_SLOTS)) &&
                     tk.size() > 1 && tk[1].is(T_COLON)) {
             const int startOfBlock = tk.startOfBlock(0);
             if (startOfBlock != 0) {
-                const int indent = tk.indentation(startOfBlock);
-                tabSettings().indentLine(block, indent);
+                const int indent = indentationColumn(ts, tk, startOfBlock);
+                ts.indentLine(block, indent);
                 return;
             }
         } else if (firstToken.is(T_CASE) || firstToken.is(T_DEFAULT)) {
             const int startOfBlock = tk.startOfBlock(0);
             if (startOfBlock != 0) {
-                const int indent = tk.indentation(startOfBlock);
-                tabSettings().indentLine(block, indent);
+                const int indent = indentationColumn(ts, tk, startOfBlock);
+                ts.indentLine(block, indent);
                 return;
             }
             return;
@@ -1641,15 +1648,15 @@ void CPPEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedCha
         const QString spell = tk.text(tokenIndex);
         if (tk[tokenIndex].followsNewline() && (spell.startsWith(QLatin1String("QT_")) ||
                                                 spell.startsWith(QLatin1String("Q_")))) {
-            const int indent = tk.indentation(tokenIndex);
-            tabSettings().indentLine(block, indent);
+            const int indent = indentationColumn(ts, tk, tokenIndex);
+            ts.indentLine(block, indent);
             return;
         }
     }
 
     const TextEditor::TextBlockIterator begin(doc->begin());
     const TextEditor::TextBlockIterator end(block.next());
-    indentCPPBlock(tabSettings(), block, begin, end, typedChar);
+    indentCPPBlock(ts, block, begin, end, typedChar);
 }
 
 bool CPPEditor::event(QEvent *e)
@@ -1682,9 +1689,6 @@ void CPPEditor::contextMenuEvent(QContextMenuEvent *e)
     foreach (QAction *action, contextMenu->actions())
         menu->addAction(action);
 
-    const QList<QTextEdit::ExtraSelection> selections =
-            extraSelections(BaseTextEditor::CodeSemanticsSelection);
-
     appendStandardContextMenuActions(menu);
 
     menu->exec(e->globalPos());