diff --git a/tools/driver/Makefile b/tools/driver/Makefile
index 0ba65e516b9f09a8138dafd766169bcbaeaa1f26..9ad719fa07fdb919b5445ca5315699ad608e4f0c 100644
--- a/tools/driver/Makefile
+++ b/tools/driver/Makefile
@@ -15,10 +15,7 @@ CXXFLAGS = -fno-rtti
 # FIXME: It is unfortunate we need to pull in the bitcode reader and
 # writer just to get the serializer stuff used by clangBasic.
 LINK_COMPONENTS := system support bitreader bitwriter
-
-# FIXME: We shouldn't need clangLex.a here; we do because the
-# TextDiagnosticPrinter is pulling it in. :(
-USEDLIBS = clangDriver.a clangFrontend.a clangLex.a clangBasic.a
+USEDLIBS = clangDriver.a clangBasic.a
 
 # This tool has no plugins, optimize startup time.
 TOOL_NO_EXPORTS = 1
diff --git a/tools/driver/driver.cpp b/tools/driver/driver.cpp
index 0724fbd08ce1575359a1bbd2f7d33e27e181e2c0..fac44032518bf93ac2be916985c10b3e752764c0 100644
--- a/tools/driver/driver.cpp
+++ b/tools/driver/driver.cpp
@@ -17,8 +17,7 @@
 #include "clang/Driver/Option.h"
 #include "clang/Driver/Options.h"
 
-#include "clang/Frontend/TextDiagnosticPrinter.h"
-
+#include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/OwningPtr.h"
 #include "llvm/Config/config.h"
 #include "llvm/Support/ManagedStatic.h"
@@ -29,20 +28,52 @@
 using namespace clang;
 using namespace clang::driver;
 
+class DriverDiagnosticPrinter : public DiagnosticClient {
+  std::string ProgName;
+  llvm::raw_ostream &OS;
+
+public:
+  DriverDiagnosticPrinter(const std::string _ProgName, 
+                          llvm::raw_ostream &_OS)
+    : ProgName(_ProgName),
+      OS(_OS) {}
+
+  virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
+                                const DiagnosticInfo &Info);
+};
+
+void DriverDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level,
+                                               const DiagnosticInfo &Info) {
+  OS << ProgName << ": ";
+
+  switch (Level) {
+  case Diagnostic::Ignored: assert(0 && "Invalid diagnostic type");
+  case Diagnostic::Note:    OS << "note: "; break;
+  case Diagnostic::Warning: OS << "warning: "; break;
+  case Diagnostic::Error:   OS << "error: "; break;
+  case Diagnostic::Fatal:   OS << "fatal error: "; break;
+  }
+  
+  llvm::SmallString<100> OutStr;
+  Info.FormatDiagnostic(OutStr);
+  OS.write(OutStr.begin(), OutStr.size());
+  OS << '\n';
+}
+
 int main(int argc, const char **argv) {
   llvm::sys::PrintStackTraceOnErrorSignal();
   llvm::PrettyStackTraceProgram X(argc, argv);
 
-  llvm::OwningPtr<DiagnosticClient> 
-    DiagClient(new TextDiagnosticPrinter(llvm::errs()));
-
-  Diagnostic Diags(DiagClient.get());
-
   // FIXME: We should use GetMainExecutable here, probably, but we may
   // want to handle symbolic links slightly differently. The problem
   // is that the path derived from this will influence search paths.
   llvm::sys::Path Path(argv[0]);
 
+  llvm::OwningPtr<DiagnosticClient> 
+    DiagClient(new DriverDiagnosticPrinter(Path.getBasename(), llvm::errs()));
+
+  Diagnostic Diags(DiagClient.get());
+
   // FIXME: Use the triple of the host, not the triple that we were
   // compiled on.
   llvm::OwningPtr<Driver> TheDriver(new Driver(Path.getBasename().c_str(),