diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 2cf8ce7..7f5c9b1 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -43,8 +43,7 @@
   GlobalNestedNameSpecifier(0), CFConstantStringTypeDecl(0),
   ObjCFastEnumerationStateTypeDecl(0), FILEDecl(0), jmp_bufDecl(0),
   sigjmp_bufDecl(0), BlockDescriptorType(0), BlockDescriptorExtendedType(0),
-  SourceMgr(SM), LangOpts(LOpts),
-  LoadedExternalComments(false), FreeMemory(FreeMem), Target(t),
+  SourceMgr(SM), LangOpts(LOpts), FreeMemory(FreeMem), Target(t),
   Idents(idents), Selectors(sels),
   BuiltinInfo(builtins), ExternalSource(0), PrintingPolicy(LOpts) {
   ObjCIdRedefinitionType = QualType();
@@ -413,201 +412,6 @@
   };
 }
 
-/// \brief Determine whether the given comment is a Doxygen-style comment.
-///
-/// \param Start the start of the comment text.
-///
-/// \param End the end of the comment text.
-///
-/// \param Member whether we want to check whether this is a member comment
-/// (which requires a < after the Doxygen-comment delimiter). Otherwise,
-/// we only return true when we find a non-member comment.
-static bool
-isDoxygenComment(SourceManager &SourceMgr, SourceRange Comment, 
-                 bool Member = false) {
-  bool Invalid = false;
-  const char *BufferStart
-    = SourceMgr.getBufferData(SourceMgr.getFileID(Comment.getBegin()), 
-                              &Invalid).data();
-  if (Invalid)
-    return false;
-  
-  const char *Start = BufferStart + SourceMgr.getFileOffset(Comment.getBegin());
-  const char* End = BufferStart + SourceMgr.getFileOffset(Comment.getEnd());
-
-  if (End - Start < 4)
-    return false;
-
-  assert(Start[0] == '/' && "Not a comment?");
-  if (Start[1] == '*' && !(Start[2] == '!' || Start[2] == '*'))
-    return false;
-  if (Start[1] == '/' && !(Start[2] == '!' || Start[2] == '/'))
-    return false;
-
-  return (Start[3] == '<') == Member;
-}
-
-/// \brief Retrieve the comment associated with the given declaration, if
-/// it has one.
-const char *ASTContext::getCommentForDecl(const Decl *D) {
-  if (!D)
-    return 0;
-
-  // Check whether we have cached a comment string for this declaration
-  // already.
-  llvm::DenseMap<const Decl *, std::string>::iterator Pos
-    = DeclComments.find(D);
-  if (Pos != DeclComments.end())
-    return Pos->second.c_str();
-
-  // If we have an external AST source and have not yet loaded comments from
-  // that source, do so now.
-  if (ExternalSource && !LoadedExternalComments) {
-    std::vector<SourceRange> LoadedComments;
-    ExternalSource->ReadComments(LoadedComments);
-
-    if (!LoadedComments.empty())
-      Comments.insert(Comments.begin(), LoadedComments.begin(),
-                      LoadedComments.end());
-
-    LoadedExternalComments = true;
-  }
-
-  // If there are no comments anywhere, we won't find anything.
-  if (Comments.empty())
-    return 0;
-
-  // If the declaration doesn't map directly to a location in a file, we
-  // can't find the comment.
-  SourceLocation DeclStartLoc = D->getLocStart();
-  if (DeclStartLoc.isInvalid() || !DeclStartLoc.isFileID())
-    return 0;
-
-  // Find the comment that occurs just before this declaration.
-  std::vector<SourceRange>::iterator LastComment
-    = std::lower_bound(Comments.begin(), Comments.end(),
-                       SourceRange(DeclStartLoc),
-                       BeforeInTranslationUnit(&SourceMgr));
-
-  // Decompose the location for the start of the declaration and find the
-  // beginning of the file buffer.
-  std::pair<FileID, unsigned> DeclStartDecomp
-    = SourceMgr.getDecomposedLoc(DeclStartLoc);
-  bool Invalid = false;
-  const char *FileBufferStart
-    = SourceMgr.getBufferData(DeclStartDecomp.first, &Invalid).data();
-  if (Invalid)
-    return 0;
-  
-  // First check whether we have a comment for a member.
-  if (LastComment != Comments.end() &&
-      !isa<TagDecl>(D) && !isa<NamespaceDecl>(D) &&
-      isDoxygenComment(SourceMgr, *LastComment, true)) {
-    std::pair<FileID, unsigned> LastCommentEndDecomp
-      = SourceMgr.getDecomposedLoc(LastComment->getEnd());
-    if (DeclStartDecomp.first == LastCommentEndDecomp.first &&
-        SourceMgr.getLineNumber(DeclStartDecomp.first, DeclStartDecomp.second)
-          == SourceMgr.getLineNumber(LastCommentEndDecomp.first,
-                                     LastCommentEndDecomp.second)) {
-      // The Doxygen member comment comes after the declaration starts and
-      // is on the same line and in the same file as the declaration. This
-      // is the comment we want.
-      std::string &Result = DeclComments[D];
-      Result.append(FileBufferStart +
-                      SourceMgr.getFileOffset(LastComment->getBegin()),
-                    FileBufferStart + LastCommentEndDecomp.second + 1);
-      return Result.c_str();
-    }
-  }
-
-  if (LastComment == Comments.begin())
-    return 0;
-  --LastComment;
-
-  // Decompose the end of the comment.
-  std::pair<FileID, unsigned> LastCommentEndDecomp
-    = SourceMgr.getDecomposedLoc(LastComment->getEnd());
-
-  // If the comment and the declaration aren't in the same file, then they
-  // aren't related.
-  if (DeclStartDecomp.first != LastCommentEndDecomp.first)
-    return 0;
-
-  // Check that we actually have a Doxygen comment.
-  if (!isDoxygenComment(SourceMgr, *LastComment))
-    return 0;
-
-  // Compute the starting line for the declaration and for the end of the
-  // comment (this is expensive).
-  unsigned DeclStartLine
-    = SourceMgr.getLineNumber(DeclStartDecomp.first, DeclStartDecomp.second);
-  unsigned CommentEndLine
-    = SourceMgr.getLineNumber(LastCommentEndDecomp.first,
-                              LastCommentEndDecomp.second);
-
-  // If the comment does not end on the line prior to the declaration, then
-  // the comment is not associated with the declaration at all.
-  if (CommentEndLine + 1 != DeclStartLine)
-    return 0;
-
-  // We have a comment, but there may be more comments on the previous lines.
-  // Keep looking so long as the comments are still Doxygen comments and are
-  // still adjacent.
-  unsigned ExpectedLine
-    = SourceMgr.getSpellingLineNumber(LastComment->getBegin()) - 1;
-  std::vector<SourceRange>::iterator FirstComment = LastComment;
-  while (FirstComment != Comments.begin()) {
-    // Look at the previous comment
-    --FirstComment;
-    std::pair<FileID, unsigned> Decomp
-      = SourceMgr.getDecomposedLoc(FirstComment->getEnd());
-
-    // If this previous comment is in a different file, we're done.
-    if (Decomp.first != DeclStartDecomp.first) {
-      ++FirstComment;
-      break;
-    }
-
-    // If this comment is not a Doxygen comment, we're done.
-    if (!isDoxygenComment(SourceMgr, *FirstComment)) {
-      ++FirstComment;
-      break;
-    }
-
-    // If the line number is not what we expected, we're done.
-    unsigned Line = SourceMgr.getLineNumber(Decomp.first, Decomp.second);
-    if (Line != ExpectedLine) {
-      ++FirstComment;
-      break;
-    }
-
-    // Set the next expected line number.
-    ExpectedLine
-      = SourceMgr.getSpellingLineNumber(FirstComment->getBegin()) - 1;
-  }
-
-  // The iterator range [FirstComment, LastComment] contains all of the
-  // BCPL comments that, together, are associated with this declaration.
-  // Form a single comment block string for this declaration that concatenates
-  // all of these comments.
-  std::string &Result = DeclComments[D];
-  while (FirstComment != LastComment) {
-    std::pair<FileID, unsigned> DecompStart
-      = SourceMgr.getDecomposedLoc(FirstComment->getBegin());
-    std::pair<FileID, unsigned> DecompEnd
-      = SourceMgr.getDecomposedLoc(FirstComment->getEnd());
-    Result.append(FileBufferStart + DecompStart.second,
-                  FileBufferStart + DecompEnd.second + 1);
-    ++FirstComment;
-  }
-
-  // Append the last comment line.
-  Result.append(FileBufferStart +
-                  SourceMgr.getFileOffset(LastComment->getBegin()),
-                FileBufferStart + LastCommentEndDecomp.second + 1);
-  return Result.c_str();
-}
-
 //===----------------------------------------------------------------------===//
 //                         Type Sizing and Analysis
 //===----------------------------------------------------------------------===//
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index 7d8fee9..e659ff0 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -328,7 +328,7 @@
     MethodPoolLookupTable(0), MethodPoolLookupTableData(0),
     TotalSelectorsInMethodPool(0), SelectorOffsets(0),
     TotalNumSelectors(0), MacroDefinitionOffsets(0), 
-    NumPreallocatedPreprocessingEntities(0), Comments(0), NumComments(0), 
+    NumPreallocatedPreprocessingEntities(0),  
     isysroot(isysroot), NumStatHits(0), NumStatMisses(0),
     NumSLocEntriesRead(0), NumStatementsRead(0),
     NumMacrosRead(0), NumMethodPoolSelectorsRead(0), NumMethodPoolMisses(0),
@@ -346,7 +346,7 @@
     MethodPoolLookupTable(0), MethodPoolLookupTableData(0),
     TotalSelectorsInMethodPool(0), SelectorOffsets(0),
     TotalNumSelectors(0), MacroDefinitionOffsets(0), 
-    NumPreallocatedPreprocessingEntities(0), Comments(0), NumComments(0), 
+    NumPreallocatedPreprocessingEntities(0),  
     isysroot(isysroot), NumStatHits(0), NumStatMisses(0),
     NumSLocEntriesRead(0), NumStatementsRead(0),
     NumMacrosRead(0), NumMethodPoolSelectorsRead(0), NumMethodPoolMisses(0),
@@ -1503,11 +1503,6 @@
       MaybeAddSystemRootToFilename(OriginalFileName);
       break;
 
-    case pch::COMMENT_RANGES:
-      Comments = (SourceRange *)BlobStart;
-      NumComments = BlobLen / sizeof(SourceRange);
-      break;
-
     case pch::VERSION_CONTROL_BRANCH_REVISION: {
       const std::string &CurBranch = getClangFullRepositoryVersion();
       llvm::StringRef PCHBranch(BlobStart, BlobLen);
@@ -1938,12 +1933,6 @@
   ReadDefinedMacros();
 }
 
-void PCHReader::ReadComments(std::vector<SourceRange> &Comments) {
-  Comments.resize(NumComments);
-  std::copy(this->Comments, this->Comments + NumComments,
-            Comments.begin());
-}
-
 /// \brief Read and return the type at the given offset.
 ///
 /// This routine actually reads the record corresponding to the type
diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp
index df41ca1..4752cd3 100644
--- a/lib/Frontend/PCHWriter.cpp
+++ b/lib/Frontend/PCHWriter.cpp
@@ -564,7 +564,6 @@
   RECORD(SOURCE_LOCATION_PRELOADS);
   RECORD(STAT_CACHE);
   RECORD(EXT_VECTOR_DECLS);
-  RECORD(COMMENT_RANGES);
   RECORD(VERSION_CONTROL_BRANCH_REVISION);
   RECORD(UNUSED_STATIC_FUNCS);
   RECORD(MACRO_DEFINITION_OFFSETS);
@@ -1306,24 +1305,6 @@
   }
 }
 
-void PCHWriter::WriteComments(ASTContext &Context) {
-  using namespace llvm;
-
-  if (Context.Comments.empty())
-    return;
-
-  BitCodeAbbrev *CommentAbbrev = new BitCodeAbbrev();
-  CommentAbbrev->Add(BitCodeAbbrevOp(pch::COMMENT_RANGES));
-  CommentAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
-  unsigned CommentCode = Stream.EmitAbbrev(CommentAbbrev);
-
-  RecordData Record;
-  Record.push_back(pch::COMMENT_RANGES);
-  Stream.EmitRecordWithBlob(CommentCode, Record,
-                            (const char*)&Context.Comments[0],
-                            Context.Comments.size() * sizeof(SourceRange));
-}
-
 //===----------------------------------------------------------------------===//
 // Type Serialization
 //===----------------------------------------------------------------------===//
@@ -2088,7 +2069,6 @@
   if (StatCalls && !isysroot)
     WriteStatCache(*StatCalls, isysroot);
   WriteSourceManagerBlock(Context.getSourceManager(), PP, isysroot);
-  WriteComments(Context);
   // Write the record of special types.
   Record.clear();
 
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp
index e7a771e..d45aaed 100644
--- a/lib/Parse/Parser.cpp
+++ b/lib/Parse/Parser.cpp
@@ -21,20 +21,6 @@
 #include "ParsePragma.h"
 using namespace clang;
 
-/// \brief A comment handler that passes comments found by the preprocessor
-/// to the parser action.
-class ActionCommentHandler : public CommentHandler {
-  Action &Actions;
-
-public:
-  explicit ActionCommentHandler(Action &Actions) : Actions(Actions) { }
-
-  virtual bool HandleComment(Preprocessor &PP, SourceRange Comment) {
-    Actions.ActOnComment(Comment);
-    return false;
-  }
-};
-
 Parser::Parser(Preprocessor &pp, Action &actions)
   : CrashInfo(*this), PP(pp), Actions(actions), Diags(PP.getDiagnostics()),
     GreaterThanIsOperator(true), ColonIsSacred(false),
@@ -59,9 +45,6 @@
   WeakHandler.reset(new
           PragmaWeakHandler(&PP.getIdentifierTable().get("weak"), actions));
   PP.AddPragmaHandler(0, WeakHandler.get());
-
-  CommentHandler.reset(new ActionCommentHandler(actions));
-  PP.AddCommentHandler(CommentHandler.get());
 }
 
 /// If a crash happens while the parser is active, print out a line indicating
@@ -317,7 +300,6 @@
   UnusedHandler.reset();
   PP.RemovePragmaHandler(0, WeakHandler.get());
   WeakHandler.reset();
-  PP.RemoveCommentHandler(CommentHandler.get());
 }
 
 /// Initialize - Warm up the parser.
diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp
index 3b4afef..7112687 100644
--- a/lib/Sema/Sema.cpp
+++ b/lib/Sema/Sema.cpp
@@ -399,8 +399,3 @@
   
   return dyn_cast<BlockScopeInfo>(FunctionScopes.back());  
 }
-
-void Sema::ActOnComment(SourceRange Comment) {
-  Context.Comments.push_back(Comment);
-}
-
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index 747fd88..aca4fdc 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -686,8 +686,6 @@
   /// WeakTopLevelDeclDecls - access to #pragma weak-generated Decls
   llvm::SmallVector<Decl*,2> &WeakTopLevelDecls() { return WeakTopLevelDecl; }
 
-  virtual void ActOnComment(SourceRange Comment);
-
   //===--------------------------------------------------------------------===//
   // Type Analysis / Processing: SemaType.cpp.
   //
