diff --git a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
index 1d6dd6f7e4accab5a96de8897789c6f569ba744e..5dc0609670ab582f9e562538ac1bc0429196fada 100644
--- a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
+++ b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
@@ -119,6 +119,7 @@ class Argument;
 class TypenameArgument;
 class Function;
 class Namespace;
+class NamespaceAlias;
 class BaseClass;
 class Block;
 class Class;
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index 01a10222c98921d814e94b6931ecc04ba43fb684..00f66ae6e01c0b23f12501f4cb64df4bee379d67 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -409,8 +409,27 @@ bool CheckDeclaration::visit(NamespaceAST *ast)
     return false;
 }
 
-bool CheckDeclaration::visit(NamespaceAliasDefinitionAST *)
+bool CheckDeclaration::visit(NamespaceAliasDefinitionAST *ast)
 {
+    const Name *name = 0;
+
+    if (const Identifier *id = identifier(ast->namespace_name_token))
+        name = control()->nameId(id);
+
+    unsigned sourceLocation = ast->firstToken();
+
+    if (ast->namespace_name_token)
+        sourceLocation = ast->namespace_name_token;
+
+    const Name *namespaceName = semantic()->check(ast->name, _scope);
+
+    NamespaceAlias *namespaceAlias = control()->newNamespaceAlias(sourceLocation, name);
+    namespaceAlias->setNamespaceName(namespaceName);
+    namespaceAlias->setStartOffset(tokenAt(ast->firstToken()).offset);
+    namespaceAlias->setEndOffset(tokenAt(ast->lastToken()).offset);
+    //ast->symbol = namespaceAlias;
+    _scope->enterSymbol(namespaceAlias);
+
     return false;
 }
 
diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp
index 20f622a127bd4f3f2d81fe6d839c04dfc7847246..a456bcc20969c6aad6b3932f67917ecca7491ea0 100644
--- a/src/shared/cplusplus/Control.cpp
+++ b/src/shared/cplusplus/Control.cpp
@@ -385,6 +385,14 @@ public:
         return ns;
     }
 
+    NamespaceAlias *newNamespaceAlias(unsigned sourceLocation, const Name *name)
+    {
+        NamespaceAlias *ns = new NamespaceAlias(translationUnit,
+                                                sourceLocation, name);
+        symbols.push_back(ns);
+        return ns;
+    }
+
     UsingNamespaceDirective *newUsingNamespaceDirective(unsigned sourceLocation, const Name *name)
     {
         UsingNamespaceDirective *u = new UsingNamespaceDirective(translationUnit,
@@ -672,6 +680,9 @@ Function *Control::newFunction(unsigned sourceLocation, const Name *name)
 Namespace *Control::newNamespace(unsigned sourceLocation, const Name *name)
 { return d->newNamespace(sourceLocation, name); }
 
+NamespaceAlias *Control::newNamespaceAlias(unsigned sourceLocation, const Name *name)
+{ return d->newNamespaceAlias(sourceLocation, name); }
+
 BaseClass *Control::newBaseClass(unsigned sourceLocation, const Name *name)
 { return d->newBaseClass(sourceLocation, name); }
 
diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h
index 791d24ca3459907d93bf5307dafc6aad6e273bf6..d46c7093aefad32507aba95215fa27a5695ec8dd 100644
--- a/src/shared/cplusplus/Control.h
+++ b/src/shared/cplusplus/Control.h
@@ -131,6 +131,9 @@ public:
     /// Creates a new Namespace symbol.
     Namespace *newNamespace(unsigned sourceLocation, const Name *name = 0);
 
+    /// Creates a new Namespace symbol.
+    NamespaceAlias *newNamespaceAlias(unsigned sourceLocation, const Name *name = 0);
+
     /// Creates a new BaseClass symbol.
     BaseClass *newBaseClass(unsigned sourceLocation, const Name *name = 0);
 
diff --git a/src/shared/cplusplus/Scope.cpp b/src/shared/cplusplus/Scope.cpp
index 792cbb8778265d2511a38569734976de6568a96e..22eddedd415b7e8e3e2395a629c263e1a182617c 100644
--- a/src/shared/cplusplus/Scope.cpp
+++ b/src/shared/cplusplus/Scope.cpp
@@ -179,6 +179,13 @@ bool Scope::isObjCClassScope() const
     return false;
 }
 
+bool Scope::isObjCProtocolScope() const
+{
+    if (_owner)
+        return _owner->isObjCProtocol();
+    return false;
+}
+
 bool Scope::isFunctionScope() const
 {
     Function *f = 0;
diff --git a/src/shared/cplusplus/Scope.h b/src/shared/cplusplus/Scope.h
index 2ffd145af913b4db1838632bd61bb1763923175a..7ad6ecf2324243011478c0a939b64df1a86db6cd 100644
--- a/src/shared/cplusplus/Scope.h
+++ b/src/shared/cplusplus/Scope.h
@@ -114,6 +114,9 @@ public:
     /// Returns true if this scope's owner is an ObjCClass Symbol.
     bool isObjCClassScope() const;
 
+    /// Returns true if this scope's owner is an ObjCProtocol Symbol.
+    bool isObjCProtocolScope() const;
+
     /// Returns true if this scope's owner is an ObjCMethod symbol.
     bool isObjCMethodScope() const;
 
diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp
index 2da2aa9c23767232b212e609735f64df7b42bc1d..29865c9922e62eda05712b148ee8d7b4540e54b3 100644
--- a/src/shared/cplusplus/Symbol.cpp
+++ b/src/shared/cplusplus/Symbol.cpp
@@ -161,7 +161,7 @@ private:
 };
 
 Symbol::Symbol(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
-    : _control(translationUnit->control()),
+    : _translationUnit(translationUnit),
       _sourceLocation(sourceLocation),
       _sourceOffset(0),
       _startOffset(0),
@@ -183,10 +183,15 @@ Symbol::~Symbol()
 { }
 
 Control *Symbol::control() const
-{ return _control; }
+{
+    if (_translationUnit)
+        return _translationUnit->control();
+
+    return 0;
+}
 
 TranslationUnit *Symbol::translationUnit() const
-{ return _control->translationUnit(); }
+{ return _translationUnit; }
 
 void Symbol::visitSymbol(SymbolVisitor *visitor)
 {
diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h
index 46d81ede610892c544744fcebea49bd047a6429e..f45ce88c0c4e93cdccdc935358a23e89862efd8e 100644
--- a/src/shared/cplusplus/Symbol.h
+++ b/src/shared/cplusplus/Symbol.h
@@ -239,6 +239,7 @@ public:
     virtual const Enum *asEnum() const { return 0; }
     virtual const Function *asFunction() const { return 0; }
     virtual const Namespace *asNamespace() const { return 0; }
+    virtual const NamespaceAlias *asNamespaceAlias() const { return 0; }
     virtual const Class *asClass() const { return 0; }
     virtual const Block *asBlock() const { return 0; }
     virtual const UsingNamespaceDirective *asUsingNamespaceDirective() const { return 0; }
@@ -261,6 +262,7 @@ public:
     virtual Enum *asEnum() { return 0; }
     virtual Function *asFunction() { return 0; }
     virtual Namespace *asNamespace() { return 0; }
+    virtual NamespaceAlias *asNamespaceAlias() { return 0; }
     virtual Class *asClass() { return 0; }
     virtual Block *asBlock() { return 0; }
     virtual UsingNamespaceDirective *asUsingNamespaceDirective() { return 0; }
@@ -324,7 +326,7 @@ protected:
     TranslationUnit *translationUnit() const;
 
 private:
-    Control *_control;
+    TranslationUnit *_translationUnit;
     unsigned _sourceLocation;
     unsigned _sourceOffset;
     unsigned _startOffset;
diff --git a/src/shared/cplusplus/SymbolVisitor.h b/src/shared/cplusplus/SymbolVisitor.h
index a249f529263ce48ffa04d7f790e1ad41923d0dd9..9e66b4597051e2b34ad33c6bfb538f296a1e13fb 100644
--- a/src/shared/cplusplus/SymbolVisitor.h
+++ b/src/shared/cplusplus/SymbolVisitor.h
@@ -70,6 +70,7 @@ public:
 
     virtual bool visit(UsingNamespaceDirective *) { return true; }
     virtual bool visit(UsingDeclaration *) { return true; }
+    virtual bool visit(NamespaceAlias *) { return true; }
     virtual bool visit(Declaration *) { return true; }
     virtual bool visit(Argument *) { return true; }
     virtual bool visit(TypenameArgument *) { return true; }
diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp
index c7226bd7153052b2a054bc1c0d49835adb5e1916..e82a60ae199e92cd9bd25bf0d388412b67f61d6c 100644
--- a/src/shared/cplusplus/Symbols.cpp
+++ b/src/shared/cplusplus/Symbols.cpp
@@ -89,6 +89,27 @@ FullySpecifiedType UsingNamespaceDirective::type() const
 void UsingNamespaceDirective::visitSymbol0(SymbolVisitor *visitor)
 { visitor->visit(this); }
 
+NamespaceAlias::NamespaceAlias(TranslationUnit *translationUnit,
+                               unsigned sourceLocation, const Name *name)
+    : Symbol(translationUnit, sourceLocation, name), _namespaceName(0)
+{ }
+
+NamespaceAlias::~NamespaceAlias()
+{ }
+
+const Name *NamespaceAlias::namespaceName() const
+{ return _namespaceName; }
+
+void NamespaceAlias::setNamespaceName(const Name *namespaceName)
+{ _namespaceName = namespaceName; }
+
+FullySpecifiedType NamespaceAlias::type() const
+{ return FullySpecifiedType(); }
+
+void NamespaceAlias::visitSymbol0(SymbolVisitor *visitor)
+{ visitor->visit(this); }
+
+
 UsingDeclaration::UsingDeclaration(TranslationUnit *translationUnit,
                                    unsigned sourceLocation, const Name *name)
     : Symbol(translationUnit, sourceLocation, name)
diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h
index 48356b2a3a32e97d0cd8cd0994fbeaa568734e4e..46be950121c490754e79440a08e743182ef047f5 100644
--- a/src/shared/cplusplus/Symbols.h
+++ b/src/shared/cplusplus/Symbols.h
@@ -110,6 +110,31 @@ protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
 };
 
+class CPLUSPLUS_EXPORT NamespaceAlias: public Symbol
+{
+public:
+    NamespaceAlias(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name);
+    virtual ~NamespaceAlias();
+
+    const Name *namespaceName() const;
+    void setNamespaceName(const Name *namespaceName);
+
+    // Symbol's interface
+    virtual FullySpecifiedType type() const;
+
+    virtual const NamespaceAlias *asNamespaceAlias() const
+    { return this; }
+
+    virtual NamespaceAlias *asNamespaceAlias()
+    { return this; }
+
+protected:
+    virtual void visitSymbol0(SymbolVisitor *visitor);
+
+private:
+    const Name *_namespaceName;
+};
+
 class CPLUSPLUS_EXPORT Declaration: public Symbol
 {
 public: