diff --git a/src/libs/qmljs/qmljsbind.cpp b/src/libs/qmljs/qmljsbind.cpp
index 0328a7c9a22d6de56f006e071d6500631c3168c9..a8b7a2a1f3afb11a67cd7e28146a46bd2bba51a5 100644
--- a/src/libs/qmljs/qmljsbind.cpp
+++ b/src/libs/qmljs/qmljsbind.cpp
@@ -181,6 +181,7 @@ bool Bind::visit(AST::Program *)
 bool Bind::visit(UiImport *ast)
 {
     ImportInfo info;
+    info.ast = ast;
 
     if (ast->versionToken.isValid()) {
         const QString versionString = _doc->source().mid(ast->versionToken.offset, ast->versionToken.length);
diff --git a/src/libs/qmljs/qmljsbind.h b/src/libs/qmljs/qmljsbind.h
index e71f171774d95da099838a4768b62d396cd07ce4..a836eac18a5d95865c93214a946b01c506c10493 100644
--- a/src/libs/qmljs/qmljsbind.h
+++ b/src/libs/qmljs/qmljsbind.h
@@ -54,6 +54,7 @@ public:
     struct ImportInfo {
         QString name;
         ComponentVersion version;
+        AST::UiImport *ast;
     };
 
     QList<ImportInfo> fileImports() const;
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index 1ab408485db96ad73c2b28a87db70f43ea21c850..3cf317bd2ad439bc08dcf08c93d8f16101e28933 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -35,6 +35,7 @@
 #include "qmloutlinemodel.h"
 
 #include <qmljs/qmljsindenter.h>
+#include <qmljs/qmljsbind.h>
 #include <qmljs/qmljscheck.h>
 #include <qmljs/qmljsdocument.h>
 #include <qmljs/qmljsicontextpane.h>
@@ -525,6 +526,12 @@ QList<AST::Node *> SemanticInfo::astPath(int cursorPosition) const
     return path;
 }
 
+static bool importContainsCursor(UiImport *importAst, unsigned cursorPosition)
+{
+    return cursorPosition >= importAst->firstSourceLocation().begin()
+           && cursorPosition <= importAst->lastSourceLocation().end();
+}
+
 AST::Node *SemanticInfo::nodeUnderCursor(int pos) const
 {
     if (! document)
@@ -532,6 +539,19 @@ AST::Node *SemanticInfo::nodeUnderCursor(int pos) const
 
     const unsigned cursorPosition = pos;
 
+    foreach (const Bind::ImportInfo &import, document->bind()->fileImports()) {
+        if (importContainsCursor(import.ast, cursorPosition))
+            return import.ast;
+    }
+    foreach (const Bind::ImportInfo &import, document->bind()->directoryImports()) {
+        if (importContainsCursor(import.ast, cursorPosition))
+            return import.ast;
+    }
+    foreach (const Bind::ImportInfo &import, document->bind()->libraryImports()) {
+        if (importContainsCursor(import.ast, cursorPosition))
+            return import.ast;
+    }
+
     CollectASTNodes nodes;
     nodes.accept(document->ast());
 
@@ -1226,6 +1246,19 @@ TextEditor::BaseTextEditor::Link QmlJSTextEditor::findLinkAt(const QTextCursor &
 
     AST::Node *node = semanticInfo.nodeUnderCursor(cursorPosition);
 
+    if (AST::UiImport *importAst = cast<AST::UiImport *>(node)) {
+        // if it's a file import, link to the file
+        foreach (const Bind::ImportInfo &import, semanticInfo.document->bind()->fileImports()) {
+            if (import.ast == importAst) {
+                BaseTextEditor::Link link(import.name);
+                link.begin = importAst->firstSourceLocation().begin();
+                link.end = importAst->lastSourceLocation().end();
+                return link;
+            }
+        }
+        return Link();
+    }
+
     LookupContext::Ptr lookupContext = LookupContext::create(semanticInfo.document, semanticInfo.snapshot, semanticInfo.astPath(cursorPosition));
     const Interpreter::Value *value = lookupContext->evaluate(node);