diff --git a/tools/clang-cc/ASTConsumers.cpp b/tools/clang-cc/ASTConsumers.cpp
index 288225d..18b4246 100644
--- a/tools/clang-cc/ASTConsumers.cpp
+++ b/tools/clang-cc/ASTConsumers.cpp
@@ -658,8 +658,8 @@
 public:
   DeclContextPrinter() : Out(llvm::errs()) {}
 
-  void HandleTranslationUnit(TranslationUnit& TU) {
-    PrintDeclContext(TU.getContext().getTranslationUnitDecl(), 4);
+  void HandleTranslationUnit(ASTContext &C) {
+    PrintDeclContext(C.getTranslationUnitDecl(), 4);
   }
 
   void PrintDeclContext(const DeclContext* DC, unsigned Indentation);
@@ -935,8 +935,7 @@
 public:
   InheritanceViewer(const std::string& cname) : clsname(cname) {}
   
-  void HandleTranslationUnit(TranslationUnit& TU) {
-    ASTContext& C = TU.getContext();
+  void HandleTranslationUnit(ASTContext &C) {
     for (ASTContext::type_iterator I=C.types_begin(),E=C.types_end(); I!=E; ++I)
       if (RecordType *T = dyn_cast<RecordType>(*I)) {
         if (CXXRecordDecl *D = dyn_cast<CXXRecordDecl>(T->getDecl())) {
@@ -974,7 +973,7 @@
   SingleFileSerializer(const llvm::sys::Path& F, Diagnostic& diags)
     : ASTSerializer(diags), FName(F) {}    
   
-  virtual void HandleTranslationUnit(TranslationUnit& TU) {
+  virtual void HandleTranslationUnit(ASTContext &Ctx) {
     if (Diags.hasErrorOccurred())
       return;
     
@@ -982,7 +981,7 @@
     std::vector<unsigned char> Buffer;
     Buffer.reserve(256*1024);
     
-    EmitASTBitcodeBuffer(TU.getContext(), Buffer);
+    EmitASTBitcodeBuffer(Ctx, Buffer);
     
     // Write the bits to disk. 
     if (FILE* fp = fopen(FName.c_str(),"wb")) {
@@ -998,11 +997,11 @@
   BuildSerializer(const llvm::sys::Path& dir, Diagnostic& diags)
     : ASTSerializer(diags), EmitDir(dir) {}
   
-  virtual void HandleTranslationUnit(TranslationUnit& TU) {
+  virtual void HandleTranslationUnit(ASTContext &Ctx) {
     if (Diags.hasErrorOccurred())
       return;
     
-    SourceManager& SourceMgr = TU.getContext().getSourceManager();
+    SourceManager& SourceMgr = Ctx.getSourceManager();
     FileID ID = SourceMgr.getMainFileID();
     assert(!ID.isInvalid() && "MainFileID not set!");
     const FileEntry* FE = SourceMgr.getFileEntryForID(ID);
@@ -1033,7 +1032,7 @@
     std::vector<unsigned char> Buffer;
     Buffer.reserve(256*1024);
     
-    EmitASTBitcodeBuffer(TU.getContext(), Buffer);
+    EmitASTBitcodeBuffer(Ctx, Buffer);
     
     // Write the bits to disk. 
     if (FILE* fp = fopen(FName.c_str(),"wb")) {
diff --git a/tools/clang-cc/AnalysisConsumer.cpp b/tools/clang-cc/AnalysisConsumer.cpp
index bda3df0..03e7ecc 100644
--- a/tools/clang-cc/AnalysisConsumer.cpp
+++ b/tools/clang-cc/AnalysisConsumer.cpp
@@ -223,7 +223,7 @@
     }
     
     virtual void HandleTopLevelDecl(Decl *D);
-    virtual void HandleTranslationUnit(TranslationUnit &TU);
+    virtual void HandleTranslationUnit(ASTContext &C);
     
     void HandleCode(Decl* D, Stmt* Body, Actions& actions);
   };
@@ -444,7 +444,7 @@
   }
 }
 
-void AnalysisConsumer::HandleTranslationUnit(TranslationUnit& TU) {
+void AnalysisConsumer::HandleTranslationUnit(ASTContext &C) {
 
   if(!TranslationUnitActions.empty()) {
     AnalysisManager mgr(*this, AnalyzerDisplayProgress);
@@ -454,7 +454,7 @@
   }
 
   if (!ObjCImplementationActions.empty()) {
-    TranslationUnitDecl *TUD = TU.getContext().getTranslationUnitDecl();
+    TranslationUnitDecl *TUD = C.getTranslationUnitDecl();
     
     for (DeclContext::decl_iterator I = TUD->decls_begin(),E = TUD->decls_end();
          I != E; ++I)
diff --git a/tools/clang-cc/Backend.cpp b/tools/clang-cc/Backend.cpp
index 39d5c90..ee2d0c5 100644
--- a/tools/clang-cc/Backend.cpp
+++ b/tools/clang-cc/Backend.cpp
@@ -131,13 +131,13 @@
         LLVMIRGeneration.stopTimer();
     }
     
-    virtual void HandleTranslationUnit(TranslationUnit& TU) {
+    virtual void HandleTranslationUnit(ASTContext &C) {
       {
         PrettyStackTraceString CrashInfo("Per-file LLVM IR generation");
         if (CompileOpts.TimePasses)
           LLVMIRGeneration.startTimer();
 
-        Gen->HandleTranslationUnit(TU);
+        Gen->HandleTranslationUnit(C);
 
         if (CompileOpts.TimePasses)
           LLVMIRGeneration.stopTimer();
diff --git a/tools/clang-cc/RewriteObjC.cpp b/tools/clang-cc/RewriteObjC.cpp
index 2a34604..ee2334b 100644
--- a/tools/clang-cc/RewriteObjC.cpp
+++ b/tools/clang-cc/RewriteObjC.cpp
@@ -15,7 +15,6 @@
 #include "clang/Rewrite/Rewriter.h"
 #include "clang/AST/AST.h"
 #include "clang/AST/ASTConsumer.h"
-#include "clang/AST/TranslationUnit.h"
 #include "clang/AST/ParentMap.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/IdentifierTable.h"
@@ -134,7 +133,7 @@
 
     ~RewriteObjC() {}
     
-    virtual void HandleTranslationUnit(TranslationUnit& TU);
+    virtual void HandleTranslationUnit(ASTContext &C);
     
     void ReplaceStmt(Stmt *Old, Stmt *New) {
       Stmt *ReplacingStmt = ReplacedNodes[Old];
@@ -4516,7 +4515,7 @@
   // Nothing yet.
 }
 
-void RewriteObjC::HandleTranslationUnit(TranslationUnit& TU) {
+void RewriteObjC::HandleTranslationUnit(ASTContext &C) {
   // Get the top-level buffer that this corresponds to.
   
   // Rewrite tabs if we care.
diff --git a/tools/clang-cc/SerializationTest.cpp b/tools/clang-cc/SerializationTest.cpp
index 770f9b3..d12a0af 100644
--- a/tools/clang-cc/SerializationTest.cpp
+++ b/tools/clang-cc/SerializationTest.cpp
@@ -42,7 +42,7 @@
   
   ~SerializationTest() {}
   
-  virtual void HandleTranslationUnit(TranslationUnit& TU);
+  virtual void HandleTranslationUnit(ASTContext &C);
   
 private:
   bool Serialize(llvm::sys::Path& Filename, llvm::sys::Path& FNameDeclPrint,
@@ -142,7 +142,7 @@
   };
 }
 
-void SerializationTest::HandleTranslationUnit(TranslationUnit& TU) {
+void SerializationTest::HandleTranslationUnit(ASTContext &Ctx) {
 
   std::string ErrMsg;
   llvm::sys::Path Dir = llvm::sys::Path::GetTemporaryDirectory(&ErrMsg);
@@ -157,7 +157,7 @@
   llvm::sys::Path FNameDeclBefore = Dir;
   FNameDeclBefore.appendComponent("test.decl_before.txt");
 
-  if (FNameDeclBefore.makeUnique(true,&ErrMsg)) {
+  if (FNameDeclBefore.makeUnique(true, &ErrMsg)) {
     llvm::cerr << "Error: " << ErrMsg << "\n";
     return;
   }
@@ -165,7 +165,7 @@
   llvm::sys::Path FNameDeclAfter = Dir;
   FNameDeclAfter.appendComponent("test.decl_after.txt");
   
-  if (FNameDeclAfter.makeUnique(true,&ErrMsg)) {
+  if (FNameDeclAfter.makeUnique(true, &ErrMsg)) {
     llvm::cerr << "Error: " << ErrMsg << "\n";
     return;
   }
@@ -173,13 +173,13 @@
   llvm::sys::Path ASTFilename = Dir;
   ASTFilename.appendComponent("test.ast");
   
-  if (ASTFilename.makeUnique(true,&ErrMsg)) {
+  if (ASTFilename.makeUnique(true, &ErrMsg)) {
     llvm::cerr << "Error: " << ErrMsg << "\n";
     return;
   }
   
   // Serialize and then deserialize the ASTs.
-  bool status = Serialize(ASTFilename, FNameDeclBefore, TU.getContext());
+  bool status = Serialize(ASTFilename, FNameDeclBefore, Ctx);
   assert (status && "Serialization failed.");  
   status = Deserialize(ASTFilename, FNameDeclAfter);
   assert (status && "Deserialization failed.");
