diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp
index 7a89f982c1b261a1547246a15a129239515cb0bc..ee18165ceab4e812aa83ad485836a65783d1d79a 100644
--- a/src/plugins/cppeditor/cppquickfix.cpp
+++ b/src/plugins/cppeditor/cppquickfix.cpp
@@ -841,7 +841,10 @@ Snapshot QuickFixOperation::snapshot() const
 { return _snapshot; }
 
 void QuickFixOperation::setSnapshot(const CPlusPlus::Snapshot &snapshot)
-{ _snapshot = snapshot; }
+{
+    _snapshot = snapshot;
+    _typeOfExpression.setSnapshot(snapshot);
+}
 
 CPPEditor *QuickFixOperation::editor() const
 { return _editor; }
@@ -1032,7 +1035,7 @@ QString QuickFixOperation::textOf(int firstOffset, int lastOffset) const
     return tc.selectedText();
 }
 
-QString QuickFixOperation::textOf(AST *ast) const
+QString QuickFixOperation::textOf(const AST *ast) const
 {
     return textOf(startOf(ast), endOf(ast));
 }
@@ -1054,6 +1057,22 @@ void QuickFixOperation::apply()
     _textCursor.endEditBlock();
 }
 
+/**
+ * Returns a list of possible fully specified types associated with the
+ * given expression.
+ *
+ * NOTE: The fully specified types only stay valid until the next call to typeOf.
+ */
+const QList<LookupItem> QuickFixOperation::typeOf(const CPlusPlus::ExpressionAST *ast)
+{
+    unsigned line, column;
+    document()->translationUnit()->getTokenStartPosition(ast->firstToken(), &line, &column);
+    Symbol *lastVisibleSymbol = document()->findSymbolAt(line, column);
+
+    return _typeOfExpression(textOf(ast), document(), lastVisibleSymbol,
+                             TypeOfExpression::Preprocess);
+}
+
 CPPQuickFixCollector::CPPQuickFixCollector()
     : _modelManager(CppTools::CppModelManagerInterface::instance()), _editor(0)
 { }
diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h
index d98f606d8466552d6621fb9fc5c9afc589d2697a..5281876053d5e8bf13e7857427cbe9802b036829 100644
--- a/src/plugins/cppeditor/cppquickfix.h
+++ b/src/plugins/cppeditor/cppquickfix.h
@@ -33,6 +33,7 @@
 #include <texteditor/icompletioncollector.h>
 
 #include <cplusplus/CppDocument.h>
+#include <cplusplus/TypeOfExpression.h>
 #include <ASTfwd.h>
 
 #include <utils/changeset.h>
@@ -114,7 +115,7 @@ protected:
     void copy(const CPlusPlus::AST *ast, int to);
 
     QString textOf(int firstOffset, int lastOffset) const;
-    QString textOf(CPlusPlus::AST *ast) const;
+    QString textOf(const CPlusPlus::AST *ast) const;
 
     struct Range {
         Range() {}
@@ -127,6 +128,8 @@ protected:
     Range createRange(CPlusPlus::AST *ast) const; // ### rename me
     void reindent(const Range &range);
 
+    const QList<CPlusPlus::LookupItem> typeOf(const CPlusPlus::ExpressionAST *ast);
+
 private:
     CPlusPlus::Document::Ptr _document;
     CPlusPlus::Snapshot _snapshot;
@@ -134,6 +137,7 @@ private:
     Utils::ChangeSet _changeSet;
     CPPEditor *_editor;
     CPlusPlus::AST *_topLevelNode;
+    CPlusPlus::TypeOfExpression _typeOfExpression;
 };
 
 class CPPQuickFixCollector: public TextEditor::IQuickFixCollector