diff --git a/include/clang/Sema/ParseAST.h b/include/clang/Sema/ParseAST.h
index 57d7d06..f6cff2a 100644
--- a/include/clang/Sema/ParseAST.h
+++ b/include/clang/Sema/ParseAST.h
@@ -38,10 +38,6 @@
                 bool CompleteTranslationUnit = true,
                 CodeCompleteConsumer *CompletionConsumer = 0);
 
-  /// \brief Parse the main file known to the preprocessor, producing an 
-  /// abstract syntax tree.
-  void ParseAST(Sema &S, bool PrintStats = false);
-  
 }  // end namespace clang
 
 #endif
diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h
index 2436f32..0d7ac70 100644
--- a/include/clang/Sema/Sema.h
+++ b/include/clang/Sema/Sema.h
@@ -640,10 +640,7 @@
   Diagnostic &getDiagnostics() const { return Diags; }
   SourceManager &getSourceManager() const { return SourceMgr; }
   const TargetAttributesSema &getTargetAttributesSema() const;
-  Preprocessor &getPreprocessor() const { return PP; }
-  ASTContext &getASTContext() const { return Context; }
-  ASTConsumer &getASTConsumer() const { return Consumer; }
-  
+
   /// \brief Helper class that creates diagnostics with optional
   /// template instantiation stacks.
   ///
diff --git a/lib/Sema/ParseAST.cpp b/lib/Sema/ParseAST.cpp
index c0208c7..4286b3f 100644
--- a/lib/Sema/ParseAST.cpp
+++ b/lib/Sema/ParseAST.cpp
@@ -56,54 +56,68 @@
                      ASTContext &Ctx, bool PrintStats,
                      bool CompleteTranslationUnit,
                      CodeCompleteConsumer *CompletionConsumer) {
-  Sema S(PP, Ctx, *Consumer, CompleteTranslationUnit, CompletionConsumer);
-  ParseAST(S, PrintStats);
-}
-
-void clang::ParseAST(Sema &S, bool PrintStats) {
   // Collect global stats on Decls/Stmts (until we have a module streamer).
   if (PrintStats) {
     Decl::CollectingStats(true);
     Stmt::CollectingStats(true);
   }
 
-  ASTConsumer *Consumer = &S.getASTConsumer();
+  Sema S(PP, Ctx, *Consumer, CompleteTranslationUnit, CompletionConsumer);
+  Parser P(PP, S);
+  PP.EnterMainSourceFile();
 
-  Parser P(S.getPreprocessor(), S);
-  S.getPreprocessor().EnterMainSourceFile();
-  
-  if (ExternalASTSource *External = S.getASTContext().getExternalSource())
+  // Initialize the parser.
+  P.Initialize();
+
+  Consumer->Initialize(Ctx);
+
+  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer))
+    SC->InitializeSema(S);
+
+  if (ExternalASTSource *External = Ctx.getExternalSource()) {
+    if (ExternalSemaSource *ExternalSema =
+          dyn_cast<ExternalSemaSource>(External))
+      ExternalSema->InitializeSema(S);
+
     External->StartTranslationUnit(Consumer);
-  
+  }
+
   Parser::DeclGroupPtrTy ADecl;
-  
+
   while (!P.ParseTopLevelDecl(ADecl)) {  // Not end of file.
-                                         // If we got a null return and something *was* parsed, ignore it.  This
-                                         // is due to a top-level semicolon, an action override, or a parse error
-                                         // skipping something.
+    // If we got a null return and something *was* parsed, ignore it.  This
+    // is due to a top-level semicolon, an action override, or a parse error
+    // skipping something.
     if (ADecl)
       Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>());
   };
   // Check for any pending objective-c implementation decl.
   while ((ADecl = P.FinishPendingObjCActions()))
     Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>());
-  
+
   // Process any TopLevelDecls generated by #pragma weak.
   for (llvm::SmallVector<Decl*,2>::iterator
-       I = S.WeakTopLevelDecls().begin(),
-       E = S.WeakTopLevelDecls().end(); I != E; ++I)
+        I = S.WeakTopLevelDecls().begin(),
+        E = S.WeakTopLevelDecls().end(); I != E; ++I)
     Consumer->HandleTopLevelDecl(DeclGroupRef(*I));
-  
+
   // Dump record layouts, if requested.
-  if (S.getLangOptions().DumpRecordLayouts)
-    DumpRecordLayouts(S.getASTContext());
-  
-  Consumer->HandleTranslationUnit(S.getASTContext());
-  
+  if (PP.getLangOptions().DumpRecordLayouts)
+    DumpRecordLayouts(Ctx);
+
+  Consumer->HandleTranslationUnit(Ctx);
+
+  if (ExternalSemaSource *ESS =
+        dyn_cast_or_null<ExternalSemaSource>(Ctx.getExternalSource()))
+    ESS->ForgetSema();
+
+  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer))
+    SC->ForgetSema();
+
   if (PrintStats) {
     fprintf(stderr, "\nSTATISTICS:\n");
     P.getActions().PrintStats();
-    S.getASTContext().PrintStats();
+    Ctx.PrintStats();
     Decl::PrintStats();
     Stmt::PrintStats();
     Consumer->PrintStats();
diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp
index 21ad163..e7f5bb4 100644
--- a/lib/Sema/Sema.cpp
+++ b/lib/Sema/Sema.cpp
@@ -18,7 +18,7 @@
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/APFloat.h"
 #include "clang/Sema/ExternalSemaSource.h"
-#include "clang/Sema/SemaConsumer.h"
+#include "clang/AST/ASTConsumer.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/ASTDiagnostic.h"
 #include "clang/AST/DeclObjC.h"
@@ -143,18 +143,6 @@
 
   ExprEvalContexts.push_back(
                   ExpressionEvaluationContextRecord(PotentiallyEvaluated, 0));
-  
-  // Tell the AST consumer about this Sema object.
-  Consumer.Initialize(Context);
-  
-  // FIXME: Isn't this redundant with the initialization above?
-  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
-    SC->InitializeSema(*this);
-  
-  // Tell the external Sema source about this Sema object.
-  if (ExternalSemaSource *ExternalSema
-        = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
-    ExternalSema->InitializeSema(*this);
 }
 
 Sema::~Sema() {
@@ -163,15 +151,6 @@
   delete TheTargetAttributesSema;
   while (!FunctionScopes.empty())
     PopFunctionOrBlockScope();
-  
-  // Tell the SemaConsumer to forget about us; we're going out of scope.
-  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
-    SC->ForgetSema();
-
-  // Detach from the external Sema source.
-  if (ExternalSemaSource *ExternalSema
-      = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
-    ExternalSema->ForgetSema();
 }
 
 /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
