diff --git a/src/libs/cplusplus/ASTParent.cpp b/src/libs/cplusplus/ASTParent.cpp
index e751d504f99d632c65d4f4c8c0b29735b6692cca..5e9d5f98b6f51884c981b5333f6af96ffb32a065 100644
--- a/src/libs/cplusplus/ASTParent.cpp
+++ b/src/libs/cplusplus/ASTParent.cpp
@@ -32,8 +32,8 @@
 
 using namespace CPlusPlus;
 
-ASTParent::ASTParent(Control *control, AST *rootNode)
-    : ASTVisitor(control)
+ASTParent::ASTParent(TranslationUnit *translationUnit, AST *rootNode)
+    : ASTVisitor(translationUnit)
 {
     accept(rootNode);
 }
diff --git a/src/libs/cplusplus/ASTParent.h b/src/libs/cplusplus/ASTParent.h
index ec5ea563d0c24d772c60bc7cae952480b137fcd6..a934f9c80dfdb86819579a4db915fb92f584143e 100644
--- a/src/libs/cplusplus/ASTParent.h
+++ b/src/libs/cplusplus/ASTParent.h
@@ -39,7 +39,7 @@ namespace CPlusPlus {
 class CPLUSPLUS_EXPORT ASTParent: protected ASTVisitor
 {
 public:
-    ASTParent(Control *control, AST *rootNode);
+    ASTParent(TranslationUnit *transaltionUnit, AST *rootNode);
     virtual ~ASTParent();
 
     AST *operator()(AST *ast) const;
diff --git a/src/libs/cplusplus/CheckUndefinedSymbols.cpp b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
index 6010e4283ee39c43a88c4a89d29c7f5a06c489bf..51d02a0dc475f8cc79480051616dc654369435eb 100644
--- a/src/libs/cplusplus/CheckUndefinedSymbols.cpp
+++ b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
@@ -41,7 +41,7 @@ using namespace CPlusPlus;
 
 
 CheckUndefinedSymbols::CheckUndefinedSymbols(Document::Ptr doc)
-    : ASTVisitor(doc->control()), _doc(doc)
+    : ASTVisitor(doc->translationUnit()), _doc(doc)
 { }
 
 CheckUndefinedSymbols::~CheckUndefinedSymbols()
diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index bd86eecaae1611ece967ebffa266447978036975..24614c06e198b5d1f35c1f5bc476e8b5c9594ddc 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -404,7 +404,7 @@ void Document::check(CheckMode mode)
     if (! isParsed())
         parse();
 
-    Semantic semantic(_control);
+    Semantic semantic(_translationUnit);
     if (mode == FastCheck)
         semantic.setSkipFunctionBodies(true);
 
diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp
index 5914322404ead2743030e51a2250f255ff17bdfa..7374e034fb675aa96ec5237ee7f1f77444336b5f 100644
--- a/src/libs/cplusplus/FindUsages.cpp
+++ b/src/libs/cplusplus/FindUsages.cpp
@@ -41,12 +41,12 @@
 using namespace CPlusPlus;
 
 FindUsages::FindUsages(Document::Ptr doc, const Snapshot &snapshot, QFutureInterface<Usage> *future)
-    : ASTVisitor(doc->control()),
+    : ASTVisitor(doc->translationUnit()),
       _future(future),
       _doc(doc),
       _snapshot(snapshot),
       _source(_doc->source()),
-      _sem(doc->control()),
+      _sem(doc->translationUnit()),
       _inSimpleDeclaration(0)
 {
     _snapshot.insert(_doc);
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index ba6952e7bff965264877261bff33ace8ba2ab696..de26ea9c5d36431afc218ce884ba30c78f3971b3 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -72,9 +72,9 @@ static QList<_Tp> removeDuplicates(const QList<_Tp> &results)
 // ResolveExpression
 /////////////////////////////////////////////////////////////////////
 ResolveExpression::ResolveExpression(const LookupContext &context)
-    : ASTVisitor(context.expressionDocument()->control()),
+    : ASTVisitor(context.expressionDocument()->translationUnit()),
       _context(context),
-      sem(_context.control())
+      sem(context.expressionDocument()->translationUnit())
 { }
 
 ResolveExpression::~ResolveExpression()
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index b9af8ad076ba96c1af5850282c52c569d46f6616..59d06a903925af05601e296201b3f7f79f6f4803 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -191,8 +191,8 @@ class FindUses: protected ASTVisitor
     FindScope findScope;
 
 public:
-    FindUses(Control *control)
-        : ASTVisitor(control)
+    FindUses(TranslationUnit *translationUnit)
+        : ASTVisitor(translationUnit)
     { }
 
     // local and external uses.
@@ -382,8 +382,8 @@ class FunctionDefinitionUnderCursor: protected ASTVisitor
     FunctionDefinitionAST *_functionDefinition;
 
 public:
-    FunctionDefinitionUnderCursor(Control *control)
-        : ASTVisitor(control),
+    FunctionDefinitionUnderCursor(TranslationUnit *translationUnit)
+        : ASTVisitor(translationUnit),
           _line(0), _column(0)
     { }
 
@@ -427,8 +427,9 @@ class ProcessDeclarators: protected ASTVisitor
     bool _visitFunctionDeclarator;
 
 public:
-    ProcessDeclarators(Control *control)
-            : ASTVisitor(control), _visitFunctionDeclarator(true)
+    ProcessDeclarators(TranslationUnit *translationUnit)
+        : ASTVisitor(translationUnit),
+          _visitFunctionDeclarator(true)
     { }
 
     QList<DeclaratorIdAST *> operator()(FunctionDefinitionAST *ast)
@@ -2030,14 +2031,13 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source)
         doc->check();
     }
 
-    Control *control = doc->control();
     TranslationUnit *translationUnit = doc->translationUnit();
     AST *ast = translationUnit->ast();
 
-    FunctionDefinitionUnderCursor functionDefinitionUnderCursor(control);
+    FunctionDefinitionUnderCursor functionDefinitionUnderCursor(translationUnit);
     FunctionDefinitionAST *currentFunctionDefinition = functionDefinitionUnderCursor(ast, source.line, source.column);
 
-    FindUses useTable(control);
+    FindUses useTable(translationUnit);
     useTable(currentFunctionDefinition);
 
     SemanticInfo semanticInfo;
diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp
index db3a8142543ee7cc24514820982d618f4a0b6a87..11e9c221aeffb187d9df4af02fadd89190630dcc 100644
--- a/src/plugins/cppeditor/cppquickfix.cpp
+++ b/src/plugins/cppeditor/cppquickfix.cpp
@@ -54,7 +54,9 @@ class ASTPath: public ASTVisitor
 
 public:
     ASTPath(Document::Ptr doc)
-        : ASTVisitor(doc->control()), _doc(doc), _line(0), _column(0) {}
+        : ASTVisitor(doc->translationUnit()),
+          _doc(doc), _line(0), _column(0)
+    {}
 
     QList<AST *> operator()(const QTextCursor &cursor)
     {
diff --git a/src/shared/cplusplus/ASTVisitor.cpp b/src/shared/cplusplus/ASTVisitor.cpp
index 6f331515a08b5f89271275b4e0e65fc4107ba94a..9281efdf2b92b8cf85730df335687962989482f3 100644
--- a/src/shared/cplusplus/ASTVisitor.cpp
+++ b/src/shared/cplusplus/ASTVisitor.cpp
@@ -53,8 +53,8 @@
 
 using namespace CPlusPlus;
 
-ASTVisitor::ASTVisitor(Control *control)
-    : _control(control)
+ASTVisitor::ASTVisitor(TranslationUnit *translationUnit)
+    : _translationUnit(translationUnit)
 { }
 
 ASTVisitor::~ASTVisitor()
@@ -64,10 +64,18 @@ void ASTVisitor::accept(AST *ast)
 { AST::accept(ast, this); }
 
 Control *ASTVisitor::control() const
-{ return _control; }
+{
+    if (_translationUnit)
+        return _translationUnit->control();
+
+    return 0;
+}
 
 TranslationUnit *ASTVisitor::translationUnit() const
-{ return _control->translationUnit(); }
+{ return _translationUnit; }
+
+void ASTVisitor::setTranslationUnit(TranslationUnit *translationUnit)
+{ _translationUnit = translationUnit; }
 
 unsigned ASTVisitor::tokenCount() const
 { return translationUnit()->tokenCount(); }
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index e1429fa2f6e60460f39214c1baf95afec4ec99c7..0a42b6f4d4e62b5989beb6bb176019164f694967 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -61,12 +61,13 @@ class CPLUSPLUS_EXPORT ASTVisitor
     void operator =(const ASTVisitor &other);
 
 public:
-    ASTVisitor(Control *control);
+    ASTVisitor(TranslationUnit *unit);
     virtual ~ASTVisitor();
 
-    Control *control() const;
     TranslationUnit *translationUnit() const;
+    void setTranslationUnit(TranslationUnit *translationUnit);
 
+    Control *control() const;
     unsigned tokenCount() const;
     const Token &tokenAt(unsigned index) const;
     int tokenKind(unsigned index) const;
@@ -352,7 +353,7 @@ public:
     virtual void endVisit(ObjCSynchronizedStatementAST *) { }
 
 private:
-    Control *_control;
+    TranslationUnit *_translationUnit;
 };
 
 } // end of namespace CPlusPlus
diff --git a/src/shared/cplusplus/Semantic.cpp b/src/shared/cplusplus/Semantic.cpp
index 8baf10d4b09218fc92bce568c08ce864c0674035..23e2fa2c95f108d48a17b96fb91ee3dd89d57ee3 100644
--- a/src/shared/cplusplus/Semantic.cpp
+++ b/src/shared/cplusplus/Semantic.cpp
@@ -64,9 +64,10 @@ using namespace CPlusPlus;
 class Semantic::Data
 {
 public:
-    Data(Semantic *semantic, Control *control)
+    Data(Semantic *semantic, TranslationUnit *translationUnit)
         : semantic(semantic),
-          control(control),
+          translationUnit(translationUnit),
+          control(translationUnit->control()),
           skipFunctionBodies(false),
           visibility(Symbol::Public),
           ojbcVisibility(Symbol::Protected),
@@ -90,6 +91,7 @@ public:
     }
 
     Semantic *semantic;
+    TranslationUnit *translationUnit;
     Control *control;
     bool skipFunctionBodies;
     int visibility;
@@ -103,9 +105,9 @@ public:
     CheckName *checkName;
 };
 
-Semantic::Semantic(Control *control)
+Semantic::Semantic(TranslationUnit *translationUnit)
 {
-    d = new Data(this, control);
+    d = new Data(this, translationUnit);
     d->checkSpecifier = new CheckSpecifier(this);
     d->checkDeclaration = new CheckDeclaration(this);
     d->checkDeclarator = new CheckDeclarator(this);
@@ -117,6 +119,9 @@ Semantic::Semantic(Control *control)
 Semantic::~Semantic()
 { delete d; }
 
+TranslationUnit *Semantic::translationUnit() const
+{ return d->translationUnit; }
+
 Control *Semantic::control() const
 { return d->control; }
 
diff --git a/src/shared/cplusplus/Semantic.h b/src/shared/cplusplus/Semantic.h
index 391872d8470577f045c4b70f366282f88b337011..4a2ebfc2fbd0013f36d6a4838aea2c5ea2e9df96 100644
--- a/src/shared/cplusplus/Semantic.h
+++ b/src/shared/cplusplus/Semantic.h
@@ -61,9 +61,10 @@ class CPLUSPLUS_EXPORT Semantic
     void operator =(const Semantic &other);
 
 public:
-    Semantic(Control *control);
+    Semantic(TranslationUnit *translationUnit);
     virtual ~Semantic();
 
+    TranslationUnit *translationUnit() const;    
     Control *control() const;
 
     FullySpecifiedType check(SpecifierListAST *specifier, Scope *scope);
diff --git a/src/shared/cplusplus/SemanticCheck.cpp b/src/shared/cplusplus/SemanticCheck.cpp
index 1feffd93aa5a35a5d97e6bc63617a69663573567..b28c01636b402fb1c3c0312d565b3bfc1496e38b 100644
--- a/src/shared/cplusplus/SemanticCheck.cpp
+++ b/src/shared/cplusplus/SemanticCheck.cpp
@@ -52,7 +52,7 @@
 using namespace CPlusPlus;
 
 SemanticCheck::SemanticCheck(Semantic *semantic)
-    : ASTVisitor(semantic->control()),
+    : ASTVisitor(semantic->translationUnit()),
       _semantic(semantic)
 { }