diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 2a7e6e9..230631b 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -316,6 +316,7 @@
   bool VisitObjCClassDecl(ObjCClassDecl *D);
   bool VisitLinkageSpecDecl(LinkageSpecDecl *D);
   bool VisitNamespaceDecl(NamespaceDecl *D);
+  bool VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
  
   // Name visitor
   bool VisitDeclarationNameInfo(DeclarationNameInfo Name);
@@ -863,6 +864,13 @@
   return VisitDeclContext(D);
 }
 
+bool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
+  // FIXME: Visit nested-name-specifier
+  
+  return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(), 
+                                      D->getTargetNameLoc(), TU));
+}
+
 bool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) {
   switch (Name.getName().getNameKind()) {
   case clang::DeclarationName::Identifier:
@@ -2053,10 +2061,17 @@
     }
     case CXCursor_TemplateRef: {
       TemplateDecl *Template = getCursorTemplateRef(C).first;
-      assert(Template && "Missing type decl");
+      assert(Template && "Missing template decl");
       
       return createCXString(Template->getNameAsString());
     }
+        
+    case CXCursor_NamespaceRef: {
+      NamedDecl *NS = getCursorNamespaceRef(C).first;
+      assert(NS && "Missing namespace decl");
+      
+      return createCXString(NS->getNameAsString());
+    }
 
     default:
       return createCXString("<not implemented>");
@@ -2138,6 +2153,8 @@
       return createCXString("TypeRef");
   case CXCursor_TemplateRef:
       return createCXString("TemplateRef");
+  case CXCursor_NamespaceRef:
+    return createCXString("NamespaceRef");
   case CXCursor_UnexposedExpr:
       return createCXString("UnexposedExpr");
   case CXCursor_BlockExpr:
@@ -2200,6 +2217,8 @@
     return createCXString("ClassTemplate");
   case CXCursor_ClassTemplatePartialSpecialization:
     return createCXString("ClassTemplatePartialSpecialization");
+  case CXCursor_NamespaceAlias:
+    return createCXString("NamespaceAlias");
   }
 
   llvm_unreachable("Unhandled CXCursorKind");
@@ -2329,6 +2348,11 @@
       return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
     }
 
+    case CXCursor_NamespaceRef: {
+      std::pair<NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C);
+      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
+    }
+
     case CXCursor_CXXBaseSpecifier: {
       // FIXME: Figure out what location to return for a CXXBaseSpecifier.
       return clang_getNullLocation();
@@ -2390,6 +2414,9 @@
     case CXCursor_TemplateRef:
       return getCursorTemplateRef(C).second;
 
+    case CXCursor_NamespaceRef:
+      return getCursorNamespaceRef(C).second;
+        
     case CXCursor_CXXBaseSpecifier:
       // FIXME: Figure out what source range to use for a CXBaseSpecifier.
       return SourceRange();
@@ -2470,6 +2497,9 @@
     case CXCursor_TemplateRef:
       return MakeCXCursor(getCursorTemplateRef(C).first, CXXUnit);
 
+    case CXCursor_NamespaceRef:
+      return MakeCXCursor(getCursorNamespaceRef(C).first, CXXUnit);
+
     case CXCursor_CXXBaseSpecifier: {
       CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C);
       return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(),
