diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp
index 01cc55c2fa1277fd4a5a35318b6eeaa5929830cd..76a77ac395460cc095865d7c5a68543e4d6f112b 100644
--- a/src/libs/qmljs/qmljsinterpreter.cpp
+++ b/src/libs/qmljs/qmljsinterpreter.cpp
@@ -1395,13 +1395,6 @@ Context::~Context()
 {
 }
 
-void Context::build(const QList<Node *> &astPath, QmlJS::Document::Ptr doc,
-                    const QmlJS::Snapshot &snapshot, const QStringList &importPaths)
-{
-    Link link(this, doc, snapshot, importPaths);
-    ScopeBuilder(doc, this).push(astPath);
-}
-
 Engine *Context::engine() const
 {
     return _engine;
diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h
index 20af34a81ca6577dfb62e993ad4001ccba99611c..ba2ee534ab78f43c4aeea7a0309240b10779c485 100644
--- a/src/libs/qmljs/qmljsinterpreter.h
+++ b/src/libs/qmljs/qmljsinterpreter.h
@@ -280,9 +280,6 @@ public:
     Context(Engine *engine);
     ~Context();
 
-    void build(const QList<AST::Node *> &astPath, const Document::Ptr doc,
-               const Snapshot &snapshot, const QStringList &importPaths);
-
     Engine *engine() const;
     const ScopeChain &scopeChain() const;
     ScopeChain &scopeChain();
diff --git a/src/libs/qmljs/qmljsscopebuilder.cpp b/src/libs/qmljs/qmljsscopebuilder.cpp
index 80b3fbb7d74bfac2972ef6077dd7f7a01285ea84..2cc24a8cd533d04600da37476e2f85df4dfc0a2b 100644
--- a/src/libs/qmljs/qmljsscopebuilder.cpp
+++ b/src/libs/qmljs/qmljsscopebuilder.cpp
@@ -33,7 +33,8 @@ void ScopeBuilder::push(AST::Node *node)
     // JS scopes
     if (FunctionDeclaration *fun = cast<FunctionDeclaration *>(node)) {
         ObjectValue *functionScope = _doc->bind()->findFunctionScope(fun);
-        _context->scopeChain().jsScopes += functionScope;
+        if (functionScope)
+            _context->scopeChain().jsScopes += functionScope;
     }
 
     _context->scopeChain().update();
diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp
index adbd80e0ca647877066893a3ed6b37ab2ffc4b53..556d0a903c6e301c91a74f879c5890653bb34201 100644
--- a/src/plugins/qmljseditor/qmljscodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp
@@ -38,6 +38,7 @@
 #include <qmljs/qmljsscanner.h>
 #include <qmljs/qmljsevaluate.h>
 #include <qmljs/qmljscompletioncontextfinder.h>
+#include <qmljs/qmljslink.h>
 #include <qmljs/qmljsscopebuilder.h>
 
 #include <texteditor/basetexteditor.h>
@@ -653,10 +654,11 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
 
     Interpreter::Engine interp;
     Interpreter::Context context(&interp);
+    Link link(&context, document, snapshot, m_modelManager->importPaths());
 
     // Set up the current scope chain.
-    QList<AST::Node *> astPath = semanticInfo.astPath(editor->position());
-    context.build(astPath, document, snapshot, m_modelManager->importPaths());
+    ScopeBuilder scopeBuilder(document, &context);
+    scopeBuilder.push(semanticInfo.astPath(editor->position()));
 
     // Search for the operator that triggered the completion.
     QChar completionOperator;
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index 2114e03dc03f5a3487a1413b750f69dadafaf463..b0c000cbcf1054683b2613f806639b2ee786c3f0 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -39,6 +39,8 @@
 #include <qmljs/qmljscheck.h>
 #include <qmljs/qmljsevaluate.h>
 #include <qmljs/qmljsdocument.h>
+#include <qmljs/qmljslink.h>
+#include <qmljs/qmljsscopebuilder.h>
 #include <qmljs/parser/qmljsastvisitor_p.h>
 #include <qmljs/parser/qmljsast_p.h>
 #include <qmljs/parser/qmljsengine_p.h>
@@ -1007,8 +1009,9 @@ TextEditor::BaseTextEditor::Link QmlJSTextEditor::findLinkAt(const QTextCursor &
 
     Interpreter::Engine interp;
     Interpreter::Context context(&interp);
-    context.build(semanticInfo.astPath(cursorPosition), semanticInfo.document,
-                  semanticInfo.snapshot, m_modelManager->importPaths());
+    QmlJS::Link linkedSnapshot(&context, semanticInfo.document, semanticInfo.snapshot, m_modelManager->importPaths());
+    ScopeBuilder scopeBuilder(semanticInfo.document, &context);
+    scopeBuilder.push(semanticInfo.astPath(cursorPosition));
 
     Evaluate check(&context);
     const Interpreter::Value *value = check.reference(node);
@@ -1018,7 +1021,7 @@ TextEditor::BaseTextEditor::Link QmlJSTextEditor::findLinkAt(const QTextCursor &
     if (! (value && value->getSourceLocation(&fileName, &line, &column)))
         return Link();
 
-    Link link;
+    BaseTextEditor::Link link;
     link.fileName = fileName;
     link.line = line;
     link.column = column - 1; // adjust the column
diff --git a/src/plugins/qmljseditor/qmljshoverhandler.cpp b/src/plugins/qmljseditor/qmljshoverhandler.cpp
index 682ec98717e2f3afd0e24f1b87b979d5bfa1229d..38cc47cae562f306d2fc410fcec29b4c01012054 100644
--- a/src/plugins/qmljseditor/qmljshoverhandler.cpp
+++ b/src/plugins/qmljseditor/qmljshoverhandler.cpp
@@ -39,6 +39,8 @@
 #include <qmljs/qmljsbind.h>
 #include <qmljs/qmljsevaluate.h>
 #include <qmljs/qmljsinterpreter.h>
+#include <qmljs/qmljslink.h>
+#include <qmljs/qmljsscopebuilder.h>
 #include <qmljs/parser/qmljsast_p.h>
 #include <texteditor/itexteditor.h>
 #include <texteditor/basetexteditor.h>
@@ -172,7 +174,9 @@ void HoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, int p
 
             Interpreter::Engine interp;
             Interpreter::Context context(&interp);
-            context.build(astPath, qmlDocument, snapshot, m_modelManager->importPaths());
+            Link link(&context, qmlDocument, snapshot, m_modelManager->importPaths());
+            ScopeBuilder scopeBuilder(qmlDocument, &context);
+            scopeBuilder.push(astPath);
 
             Evaluate check(&context);
             const Interpreter::Value *value = check(node);