diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 3fe6db8..9f8630f 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -17,12 +17,12 @@
 #include "clang/AST/DeclTemplate.h"
 #include "clang/AST/Expr.h"
 #include "clang/AST/RecordLayout.h"
+#include "clang/Basic/SourceManager.h"
 #include "clang/Basic/TargetInfo.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/Bitcode/Serialize.h"
 #include "llvm/Bitcode/Deserialize.h"
 #include "llvm/Support/MathExtras.h"
-
 using namespace clang;
 
 enum FloatingRank {
@@ -3080,6 +3080,47 @@
 //                         Serialization Support
 //===----------------------------------------------------------------------===//
 
+enum {
+  BasicMetadataBlock = 1,
+  ASTContextBlock = 2,
+  DeclsBlock = 3
+};
+
+void ASTContext::EmitAll(llvm::Serializer &S) const {
+  // ===---------------------------------------------------===/
+  //      Serialize the "Translation Unit" metadata.
+  // ===---------------------------------------------------===/
+  
+  // Emit ASTContext.
+  S.EnterBlock(ASTContextBlock);  
+  S.EmitOwnedPtr(this);  
+  S.ExitBlock();      // exit "ASTContextBlock"
+  
+  S.EnterBlock(BasicMetadataBlock);
+  
+  // Block for SourceManager and Target.  Allows easy skipping
+  // around to the block for the Selectors during deserialization.
+  S.EnterBlock();
+  
+  // Emit the SourceManager.
+  S.Emit(getSourceManager());
+  
+  // Emit the Target.
+  S.EmitPtr(&Target);
+  S.EmitCStr(Target.getTargetTriple());
+  
+  S.ExitBlock(); // exit "SourceManager and Target Block"
+  
+  // Emit the Selectors.
+  S.Emit(Selectors);
+  
+  // Emit the Identifier Table.
+  S.Emit(Idents);
+  
+  S.ExitBlock(); // exit "BasicMetadataBlock"
+}
+
+
 /// Emit - Serialize an ASTContext object to Bitcode.
 void ASTContext::Emit(llvm::Serializer& S) const {
   S.Emit(LangOpts);
@@ -3101,6 +3142,51 @@
   // FIXME: S.EmitOwnedPtr(CFConstantStringTypeDecl);
 }
 
+ASTContext* ASTContext::CreateAll(llvm::Deserializer &Dezr,
+                                  FileManager &FMgr) {
+  // ===---------------------------------------------------===/
+  //      Deserialize the "Translation Unit" metadata.
+  // ===---------------------------------------------------===/
+  
+  // Skip to the BasicMetaDataBlock.  First jump to ASTContextBlock
+  // (which will appear earlier) and record its location.
+  
+  bool FoundBlock = Dezr.SkipToBlock(ASTContextBlock);
+  assert (FoundBlock);
+  
+  llvm::Deserializer::Location ASTContextBlockLoc =
+  Dezr.getCurrentBlockLocation();
+  
+  FoundBlock = Dezr.SkipToBlock(BasicMetadataBlock);
+  assert (FoundBlock);
+  
+  // Read the SourceManager.
+  SourceManager::CreateAndRegister(Dezr, FMgr);
+  
+  { // Read the TargetInfo.
+    llvm::SerializedPtrID PtrID = Dezr.ReadPtrID();
+    char* triple = Dezr.ReadCStr(NULL,0,true);
+    Dezr.RegisterPtr(PtrID, TargetInfo::CreateTargetInfo(std::string(triple)));
+    delete [] triple;
+  }
+  
+  // For Selectors, we must read the identifier table first because the
+  //  SelectorTable depends on the identifiers being already deserialized.
+  llvm::Deserializer::Location SelectorBlkLoc = Dezr.getCurrentBlockLocation();
+  Dezr.SkipBlock();
+  
+  // Read the identifier table.
+  IdentifierTable::CreateAndRegister(Dezr);
+  
+  // Now jump back and read the selectors.
+  Dezr.JumpTo(SelectorBlkLoc);
+  SelectorTable::CreateAndRegister(Dezr);
+  
+  // Now jump back to ASTContextBlock and read the ASTContext.
+  Dezr.JumpTo(ASTContextBlockLoc);
+  return Dezr.ReadOwnedPtr<ASTContext>();
+}
+
 ASTContext* ASTContext::Create(llvm::Deserializer& D) {
   
   // Read the language options.
diff --git a/lib/AST/TranslationUnit.cpp b/lib/AST/TranslationUnit.cpp
index ed84241..8ceada5 100644
--- a/lib/AST/TranslationUnit.cpp
+++ b/lib/AST/TranslationUnit.cpp
@@ -26,9 +26,6 @@
 
 using namespace clang;
 
-enum { BasicMetadataBlock = 1,
-       ASTContextBlock = 2,
-       DeclsBlock = 3 };
 
 TranslationUnit::~TranslationUnit() {
   if (OwnsMetaData && Context) {
@@ -79,7 +76,7 @@
     llvm::Serializer Sezr(Stream);  
     
     // Emit the translation unit.
-    TU.Emit(Sezr);
+    TU.getContext().EmitAll(Sezr);
   }
   
   return true;
@@ -118,40 +115,6 @@
   return false;  
 }
 
-void TranslationUnit::Emit(llvm::Serializer& Sezr) const {
-  // ===---------------------------------------------------===/
-  //      Serialize the "Translation Unit" metadata.
-  // ===---------------------------------------------------===/
-
-  // Emit ASTContext.
-  Sezr.EnterBlock(ASTContextBlock);  
-  Sezr.EmitOwnedPtr(Context);  
-  Sezr.ExitBlock();      // exit "ASTContextBlock"
-  
-  Sezr.EnterBlock(BasicMetadataBlock);
-  
-  // Block for SourceManager and Target.  Allows easy skipping
-  // around to the block for the Selectors during deserialization.
-  Sezr.EnterBlock();
-    
-  // Emit the SourceManager.
-  Sezr.Emit(Context->getSourceManager());
-    
-  // Emit the Target.
-  Sezr.EmitPtr(&Context->Target);
-  Sezr.EmitCStr(Context->Target.getTargetTriple());
-  
-  Sezr.ExitBlock(); // exit "SourceManager and Target Block"
-  
-  // Emit the Selectors.
-  Sezr.Emit(Context->Selectors);
-  
-  // Emit the Identifier Table.
-  Sezr.Emit(Context->Idents);
-  
-  Sezr.ExitBlock(); // exit "BasicMetadataBlock"
-}
-
 TranslationUnit*
 clang::ReadASTBitcodeBuffer(llvm::MemoryBuffer& MBuffer, FileManager& FMgr) {
 
@@ -202,48 +165,7 @@
   // Create the translation unit object.
   TranslationUnit* TU = new TranslationUnit();
   
-  // ===---------------------------------------------------===/
-  //      Deserialize the "Translation Unit" metadata.
-  // ===---------------------------------------------------===/
-  
-  // Skip to the BasicMetaDataBlock.  First jump to ASTContextBlock
-  // (which will appear earlier) and record its location.
-  
-  bool FoundBlock = Dezr.SkipToBlock(ASTContextBlock);
-  assert (FoundBlock);
-  
-  llvm::Deserializer::Location ASTContextBlockLoc =
-  Dezr.getCurrentBlockLocation();
-  
-  FoundBlock = Dezr.SkipToBlock(BasicMetadataBlock);
-  assert (FoundBlock);
-  
-  // Read the SourceManager.
-  SourceManager::CreateAndRegister(Dezr,FMgr);
-    
-  { // Read the TargetInfo.
-    llvm::SerializedPtrID PtrID = Dezr.ReadPtrID();
-    char* triple = Dezr.ReadCStr(NULL,0,true);
-    Dezr.RegisterPtr(PtrID, TargetInfo::CreateTargetInfo(std::string(triple)));
-    delete [] triple;
-  }
-  
-  // For Selectors, we must read the identifier table first because the
-  //  SelectorTable depends on the identifiers being already deserialized.
-  llvm::Deserializer::Location SelectorBlkLoc = Dezr.getCurrentBlockLocation();
-  Dezr.SkipBlock();
-  
-  // Read the identifier table.
-  IdentifierTable::CreateAndRegister(Dezr);
-  
-  // Now jump back and read the selectors.
-  Dezr.JumpTo(SelectorBlkLoc);
-  SelectorTable::CreateAndRegister(Dezr);
-  
-  // Now jump back to ASTContextBlock and read the ASTContext.
-  Dezr.JumpTo(ASTContextBlockLoc);
-  TU->Context = Dezr.ReadOwnedPtr<ASTContext>();
+  TU->Context = ASTContext.CreateAll(Dezr, FmMgr);
   
   return TU;
 }
-
