diff --git a/include/clang/Basic/DiagnosticSerializationKinds.td b/include/clang/Basic/DiagnosticSerializationKinds.td
index 81509cc..228eb9b 100644
--- a/include/clang/Basic/DiagnosticSerializationKinds.td
+++ b/include/clang/Basic/DiagnosticSerializationKinds.td
@@ -22,6 +22,7 @@ def err_fe_pch_file_modified : Error<
     DefaultFatal;
 def err_fe_pch_file_overridden : Error<
     "file '%0' from the precompiled header has been overridden">;
+def note_pch_required_by : Note<"'%0' required by '%1'">;
 def note_module_cache_path : Note<
     "after modifying system headers, please delete the module cache at '%0'">;
 
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp
index 400619f..cce95c0 100644
--- a/lib/Serialization/ASTReader.cpp
+++ b/lib/Serialization/ASTReader.cpp
@@ -1730,10 +1730,22 @@ InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
 #endif
          )) {
       if (Complain) {
-        Error(diag::err_fe_pch_file_modified, Filename, F.FileName);
-        if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) {
-          Diag(diag::note_module_cache_path)
-            << PP.getHeaderSearchInfo().getModuleCachePath();
+        // Build a list of the PCH imports that got us here (in reverse).
+        SmallVector<ModuleFile *, 4> ImportStack(1, &F);
+        while (ImportStack.back()->ImportedBy.size() > 0)
+          ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
+
+        // The original PCH is stale.
+        Error(diag::err_fe_pch_file_modified, Filename,
+              ImportStack.back()->FileName);
+
+        // Print the import stack.
+        if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
+          Diag(diag::note_pch_required_by)
+            << Filename << ImportStack[0]->FileName;
+          for (unsigned I = 1; I < ImportStack.size(); ++I)
+            Diag(diag::note_pch_required_by)
+              << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
         }
       }
 
diff --git a/test/PCH/modified-module-dependency.h b/test/PCH/modified-module-dependency.h
new file mode 100644
index 0000000..8b1a393
--- /dev/null
+++ b/test/PCH/modified-module-dependency.h
@@ -0,0 +1 @@
+// empty
diff --git a/test/PCH/modified-module-dependency.m b/test/PCH/modified-module-dependency.m
new file mode 100644
index 0000000..455240f
--- /dev/null
+++ b/test/PCH/modified-module-dependency.m
@@ -0,0 +1,9 @@
+// RUN: mkdir -p %t-dir
+// RUN: echo '#import "modified-module-dependency.h"' > %t-dir/prefix.h
+// RUN: %clang_cc1 -x objective-c -I %S -fmodules -fmodules-cache-path=%t-dir/cache -fmodule-map-file=modified-module-dependency.module.map -emit-pch %t-dir/prefix.h -o %t-dir/prefix.pch
+
+// RUN: touch modified-module-dependency.module.map  
+// RUN: not %clang_cc1 -x objective-c -include-pch %t-dir/prefix.pch -fmodules -fmodules-cache-path=%t-dir/cache -fmodule-map-file=modified-module-dependency.module.map -fsyntax-only %s 2> %t-dir/log
+// RUN: FileCheck %s < %t-dir/log
+
+// CHECK: file '{{.*}}/modified-module-dependency.module.map' has been modified since the precompiled header '{{.*}}prefix.pch' was built
diff --git a/test/PCH/modified-module-dependency.module.map b/test/PCH/modified-module-dependency.module.map
new file mode 100644
index 0000000..a532531
--- /dev/null
+++ b/test/PCH/modified-module-dependency.module.map
@@ -0,0 +1,4 @@
+module test {
+  header "prefix.h"
+  export *
+}
