diff --git a/src/libs/cplusplus/BackwardsScanner.cpp b/src/libs/cplusplus/BackwardsScanner.cpp
index 46fb15efe42464c136824656c940f0fd93ad0fc3..bca041c5d7249634b199c7da1ca04abd740326d6 100644
--- a/src/libs/cplusplus/BackwardsScanner.cpp
+++ b/src/libs/cplusplus/BackwardsScanner.cpp
@@ -71,13 +71,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);
             }
@@ -248,8 +249,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/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index c6aa2f9ae0f55504fb27bca3122b4ac502c41a5c..ca497beab0f0d0e3e0e09cb5d16c5fb0269755f9 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -641,6 +641,7 @@ ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, i
             foreach (Symbol *typedefCandidate, typedefCandidates) {
                 if (typedefCandidate->isTypedef() && typedefCandidate->type()->isNamedType()) {
                     ty = typedefCandidate->type();
+                    lastVisibleSymbol = typedefCandidate;
                     break;
                 }
             }
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 4d442258cd2bce4df4bf91d7c4f5d196edd69565..f0b64fef7c273e452f22b5e03cec3354e7a6b00b 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -1700,37 +1700,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;
@@ -1749,15 +1756,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)