diff --git a/include/clang/Frontend/ChainedDiagnosticClient.h b/include/clang/Frontend/ChainedDiagnosticClient.h
new file mode 100644
index 0000000..9dc3898
--- /dev/null
+++ b/include/clang/Frontend/ChainedDiagnosticClient.h
@@ -0,0 +1,56 @@
+//===--- ChainedDiagnosticClient.h - Chain Diagnostic Clients ---*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_FRONTEND_CHAINEDDIAGNOSTICCLIENT_H
+#define LLVM_CLANG_FRONTEND_CHAINEDDIAGNOSTICCLIENT_H
+
+#include "clang/Basic/Diagnostic.h"
+
+namespace clang {
+class LangOptions;
+
+/// ChainedDiagnosticClient - Chain two diagnostic clients so that diagnostics
+/// go to the first client and then the second. The first diagnostic client
+/// should be the "primary" client, and will be used for computing whether the
+/// diagnostics should be included in counts.
+class ChainedDiagnosticClient : public DiagnosticClient {
+  llvm::OwningPtr<DiagnosticClient> Primary;
+  llvm::OwningPtr<DiagnosticClient> Secondary;
+
+public:
+  ChainedDiagnosticClient(DiagnosticClient *_Primary,
+                          DiagnosticClient *_Secondary) {
+    Primary.reset(_Primary);
+    Secondary.reset(_Secondary);
+  }
+
+  virtual void BeginSourceFile(const LangOptions &LO) {
+    Primary->BeginSourceFile(LO);
+    Secondary->BeginSourceFile(LO);
+  }
+
+  virtual void EndSourceFile() {
+    Secondary->EndSourceFile();
+    Primary->EndSourceFile();
+  }
+
+  virtual bool IncludeInDiagnosticCounts() const {
+    return Primary->IncludeInDiagnosticCounts();
+  }
+
+  virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
+                                const DiagnosticInfo &Info) {
+    Primary->HandleDiagnostic(DiagLevel, Info);
+    Secondary->HandleDiagnostic(DiagLevel, Info);
+  }
+};
+
+} // end namspace clang
+
+#endif
diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp
index df15e5b..ddd8d31 100644
--- a/tools/clang-cc/clang-cc.cpp
+++ b/tools/clang-cc/clang-cc.cpp
@@ -19,6 +19,7 @@
 #include "clang/Frontend/AnalysisConsumer.h"
 #include "clang/Frontend/ASTConsumers.h"
 #include "clang/Frontend/ASTUnit.h"
+#include "clang/Frontend/ChainedDiagnosticClient.h"
 #include "clang/Frontend/CompilerInvocation.h"
 #include "clang/Frontend/DiagnosticOptions.h"
 #include "clang/Frontend/FixItRewriter.h"
@@ -811,48 +812,9 @@
 
 static llvm::raw_ostream *BuildLogFile = 0;
 
-/// LoggingDiagnosticClient - This is a simple diagnostic client that forwards
-/// all diagnostics to both BuildLogFile and a chained DiagnosticClient.
-namespace {
-class LoggingDiagnosticClient : public DiagnosticClient {
-  llvm::OwningPtr<DiagnosticClient> Chain1;
-  llvm::OwningPtr<DiagnosticClient> Chain2;
-public:
-
-  LoggingDiagnosticClient(const DiagnosticOptions &DiagOpts,
-                          DiagnosticClient *Normal) {
-    // Output diags both where requested...
-    Chain1.reset(Normal);
-    // .. and to our log file.
-    Chain2.reset(new TextDiagnosticPrinter(*BuildLogFile, DiagOpts));
-  }
-
-  virtual void BeginSourceFile(const LangOptions &LO) {
-    Chain1->BeginSourceFile(LO);
-    Chain2->BeginSourceFile(LO);
-  }
-
-  virtual void EndSourceFile() {
-    Chain1->EndSourceFile();
-    Chain2->EndSourceFile();
-  }
-
-  virtual bool IncludeInDiagnosticCounts() const {
-    return Chain1->IncludeInDiagnosticCounts();
-  }
-
-  virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
-                                const DiagnosticInfo &Info) {
-    Chain1->HandleDiagnostic(DiagLevel, Info);
-    Chain2->HandleDiagnostic(DiagLevel, Info);
-  }
-};
-} // end anonymous namespace.
-
 static void SetUpBuildDumpLog(const DiagnosticOptions &DiagOpts,
                               unsigned argc, char **argv,
                               llvm::OwningPtr<DiagnosticClient> &DiagClient) {
-
   std::string ErrorInfo;
   BuildLogFile = new llvm::raw_fd_ostream(DumpBuildInformation.c_str(),
                                           ErrorInfo);
@@ -871,9 +833,9 @@
     (*BuildLogFile) << argv[i] << ' ';
   (*BuildLogFile) << '\n';
 
-  // LoggingDiagnosticClient - Insert a new logging diagnostic client in between
-  // the diagnostic producers and the normal receiver.
-  DiagClient.reset(new LoggingDiagnosticClient(DiagOpts, DiagClient.take()));
+  // Chain in a diagnostic client which will log the diagnostics.
+  DiagnosticClient *Logger = new TextDiagnosticPrinter(*BuildLogFile, DiagOpts);
+  DiagClient.reset(new ChainedDiagnosticClient(DiagClient.take(), Logger));
 }
 
 
