diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h
index 37072a765824427fc22937aa9aa0d5a7f3757be7..d8c37ebd70f978b52baf563be95c5cf45c1feb5f 100644
--- a/include/clang-c/Index.h
+++ b/include/clang-c/Index.h
@@ -3464,6 +3464,13 @@ typedef void *CXModule;
  */
 CINDEX_LINKAGE CXModule clang_Cursor_getModule(CXCursor C);
 
+/**
+ * \param Module a module object.
+ *
+ * \returns the module file where the provided module object came from.
+ */
+CINDEX_LINKAGE CXFile clang_Module_getASTFile(CXModule Module);
+
 /**
  * \param Module a module object.
  *
diff --git a/test/Index/annotate-module.m b/test/Index/annotate-module.m
index 33ca3f83249998eb7f76796bc50866b51a89d5e7..55e21d235e7cd85034785ab962d2fab11d25d7b0 100644
--- a/test/Index/annotate-module.m
+++ b/test/Index/annotate-module.m
@@ -40,3 +40,10 @@ int glob;
 // CHECK-MOD-NEXT: Punctuation: "*" [2:5 - 2:6] VarDecl=Module_Sub:2:6
 // CHECK-MOD-NEXT: Identifier: "Module_Sub" [2:6 - 2:16] VarDecl=Module_Sub:2:6
 // CHECK-MOD-NEXT: Punctuation: ";" [2:16 - 2:17]
+
+// RUN: c-index-test -cursor-at=%s:3:11 %s -fmodules-cache-path=%t.cache -fmodules -F %S/../Modules/Inputs \
+// RUN:     | FileCheck %s -check-prefix=CHECK-CURSOR
+
+// CHECK-CURSOR:      3:1 ModuleImport=DependsOnModule:3:1 (Definition) Extent=[3:1 - 3:24] Spelling=DependsOnModule ([3:9 - 3:24]) ModuleName=DependsOnModule ({{.*}}DependsOnModule.pcm) Headers(2):
+// CHECK-CURSOR-NEXT: {{.*}}other.h
+// CHECK-CURSOR-NEXT: {{.*}}DependsOnModule.h
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c
index 3f39a78625dee764fa71decc3b5af0990a6d124a..e5752341679d5715d5d12ac1b946078452d39fb1 100644
--- a/tools/c-index-test/c-index-test.c
+++ b/tools/c-index-test/c-index-test.c
@@ -2105,14 +2105,19 @@ static int inspect_cursor_at(int argc, const char **argv) {
 
         {
           CXModule mod = clang_Cursor_getModule(Cursor);
-          CXString name;
+          CXFile astFile;
+          CXString name, astFilename;
           unsigned i, numHeaders;
           if (mod) {
+            astFile = clang_Module_getASTFile(mod);
+            astFilename = clang_getFileName(astFile);
             name = clang_Module_getFullName(mod);
             numHeaders = clang_Module_getNumTopLevelHeaders(TU, mod);
-            printf(" ModuleName=%s Headers(%d):",
-                   clang_getCString(name), numHeaders);
+            printf(" ModuleName=%s (%s) Headers(%d):",
+                   clang_getCString(name), clang_getCString(astFilename),
+                   numHeaders);
             clang_disposeString(name);
+            clang_disposeString(astFilename);
             for (i = 0; i < numHeaders; ++i) {
               CXFile file = clang_Module_getTopLevelHeader(TU, mod, i);
               CXString filename = clang_getFileName(file);
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 0a8a06899833f34cb2acb1e6d5c595d8f0e6524b..a43c1ab7e45914848b5a52bedcf01af875fbcc41 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -6055,6 +6055,13 @@ CXModule clang_Cursor_getModule(CXCursor C) {
   return 0;
 }
 
+CXFile clang_Module_getASTFile(CXModule CXMod) {
+  if (!CXMod)
+    return 0;
+  Module *Mod = static_cast<Module*>(CXMod);
+  return const_cast<FileEntry *>(Mod->getASTFile());
+}
+
 CXModule clang_Module_getParent(CXModule CXMod) {
   if (!CXMod)
     return 0;
diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports
index c7508bc5449becee2348bd9cb64665cd12b4c578..0c9912e5202ff2ac618ada3db4c642b425a215b6 100644
--- a/tools/libclang/libclang.exports
+++ b/tools/libclang/libclang.exports
@@ -21,6 +21,7 @@ clang_Cursor_isDynamicCall
 clang_Cursor_isNull
 clang_Cursor_isVariadic
 clang_Cursor_getModule
+clang_Module_getASTFile
 clang_Module_getParent
 clang_Module_getName
 clang_Module_getFullName