diff --git a/src/libs/qmljs/qmljsbind.cpp b/src/libs/qmljs/qmljsbind.cpp
index a8b7a2a1f3afb11a67cd7e28146a46bd2bba51a5..f6acc38b3e64160a1af93be24f13e13d5f8ed28c 100644
--- a/src/libs/qmljs/qmljsbind.cpp
+++ b/src/libs/qmljs/qmljsbind.cpp
@@ -84,7 +84,7 @@ Interpreter::ObjectValue *Bind::findQmlObject(AST::Node *node) const
 }
 
 bool Bind::usesQmlPrototype(ObjectValue *prototype,
-                            Context *context) const
+                            const Context *context) const
 {
     foreach (ObjectValue *object, _qmlObjects.values()) {
         const ObjectValue *resolvedPrototype = object->prototype(context);
diff --git a/src/libs/qmljs/qmljsbind.h b/src/libs/qmljs/qmljsbind.h
index a836eac18a5d95865c93214a946b01c506c10493..9d5f7e76f185a7d7d0dc50f0a53d59c758cc5444 100644
--- a/src/libs/qmljs/qmljsbind.h
+++ b/src/libs/qmljs/qmljsbind.h
@@ -66,7 +66,7 @@ public:
 
     Interpreter::ObjectValue *findQmlObject(AST::Node *node) const;
     bool usesQmlPrototype(Interpreter::ObjectValue *prototype,
-                          Interpreter::Context *context) const;
+                          const Interpreter::Context *context) const;
 
     Interpreter::ObjectValue *findFunctionScope(AST::FunctionDeclaration *node) const;
     bool isGroupedPropertyBinding(AST::Node *node) const;
diff --git a/src/libs/qmljs/qmljsevaluate.cpp b/src/libs/qmljs/qmljsevaluate.cpp
index 2b6821e755b482d61952ffb9c8e56c9d2051fa9a..21c98a4d4c05144896edf7275db9f462c2e20a76 100644
--- a/src/libs/qmljs/qmljsevaluate.cpp
+++ b/src/libs/qmljs/qmljsevaluate.cpp
@@ -36,7 +36,7 @@
 using namespace QmlJS;
 using namespace QmlJS::Interpreter;
 
-Evaluate::Evaluate(Context *context)
+Evaluate::Evaluate(const Context *context)
     : _engine(context->engine()),
       _context(context),
       _scope(_engine->globalObject()),
diff --git a/src/libs/qmljs/qmljsevaluate.h b/src/libs/qmljs/qmljsevaluate.h
index fb46260ae4c31ab65a8ed721afcbde159e35d5b4..60d689eb72a9496c7db6e5a841c63db6a3cca9bc 100644
--- a/src/libs/qmljs/qmljsevaluate.h
+++ b/src/libs/qmljs/qmljsevaluate.h
@@ -46,7 +46,7 @@ namespace Interpreter {
 class QMLJS_EXPORT Evaluate: protected AST::Visitor
 {
 public:
-    Evaluate(Interpreter::Context *context);
+    Evaluate(const Interpreter::Context *context);
     virtual ~Evaluate();
 
     const Interpreter::Value *operator()(AST::Node *ast);
@@ -156,7 +156,7 @@ protected:
 private:
     QmlJS::Document::Ptr _doc;
     Interpreter::Engine *_engine;
-    Interpreter::Context *_context;
+    const Interpreter::Context *_context;
     const Interpreter::ObjectValue *_scope;
     const Interpreter::Value *_result;
 };
diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp
index f46fde063afb103f719b705ab2207eae7638008d..61770b747936a6e27afa2cab8c8c966c929a8029 100644
--- a/src/libs/qmljs/qmljsinterpreter.cpp
+++ b/src/libs/qmljs/qmljsinterpreter.cpp
@@ -1455,7 +1455,7 @@ void Context::setTypeEnvironment(const QmlJS::Document *doc, const ObjectValue *
     _typeEnvironments[doc->fileName()] = typeEnvironment;
 }
 
-const Value *Context::lookup(const QString &name)
+const Value *Context::lookup(const QString &name) const
 {
     QList<const ObjectValue *> scopes = _scopeChain.all();
     for (int index = scopes.size() - 1; index != -1; --index) {
@@ -1469,7 +1469,7 @@ const Value *Context::lookup(const QString &name)
     return _engine->undefinedValue();
 }
 
-const ObjectValue *Context::lookupType(const QmlJS::Document *doc, UiQualifiedId *qmlTypeName)
+const ObjectValue *Context::lookupType(const QmlJS::Document *doc, UiQualifiedId *qmlTypeName) const
 {
     const ObjectValue *objectValue = typeEnvironment(doc);
     if (!objectValue)
@@ -1489,7 +1489,7 @@ const ObjectValue *Context::lookupType(const QmlJS::Document *doc, UiQualifiedId
     return objectValue;
 }
 
-const ObjectValue *Context::lookupType(const QmlJS::Document *doc, const QStringList &qmlTypeName)
+const ObjectValue *Context::lookupType(const QmlJS::Document *doc, const QStringList &qmlTypeName) const
 {
     const ObjectValue *objectValue = typeEnvironment(doc);
 
@@ -1507,7 +1507,7 @@ const ObjectValue *Context::lookupType(const QmlJS::Document *doc, const QString
     return objectValue;
 }
 
-const Value *Context::lookupReference(const Reference *reference)
+const Value *Context::lookupReference(const Reference *reference) const
 {
     if (_referenceStack.contains(reference))
         return 0;
@@ -1579,7 +1579,7 @@ void Reference::accept(ValueVisitor *visitor) const
     visitor->visit(this);
 }
 
-const Value *Reference::value(Context *) const
+const Value *Reference::value(const Context *) const
 {
     return _engine->undefinedValue();
 }
@@ -1663,7 +1663,7 @@ void ObjectValue::setClassName(const QString &className)
     _className = className;
 }
 
-const ObjectValue *ObjectValue::prototype(Context *context) const
+const ObjectValue *ObjectValue::prototype(const Context *context) const
 {
     const ObjectValue *prototypeObject = value_cast<const ObjectValue *>(_prototype);
     if (! prototypeObject) {
@@ -1700,7 +1700,7 @@ void ObjectValue::accept(ValueVisitor *visitor) const
     visitor->visit(this);
 }
 
-const Value *ObjectValue::property(const QString &name, Context *context) const
+const Value *ObjectValue::property(const QString &name, const Context *context) const
 {
     return lookupMember(name, context);
 }
@@ -1736,7 +1736,7 @@ void ObjectValue::processMembers(MemberProcessor *processor) const
     }
 }
 
-const Value *ObjectValue::lookupMember(const QString &name, Context *context, bool examinePrototypes) const
+const Value *ObjectValue::lookupMember(const QString &name, const Context *context, bool examinePrototypes) const
 {
     if (const Value *m = _members.value(name))
         return m;
@@ -1931,7 +1931,7 @@ const Value *Function::argument(int index) const
     return _arguments.at(index);
 }
 
-const Value *Function::property(const QString &name, Context *context) const
+const Value *Function::property(const QString &name, const Context *context) const
 {
     if (name == "length")
         return engine()->numberValue();
@@ -2955,7 +2955,7 @@ ASTVariableReference::~ASTVariableReference()
 {
 }
 
-const Value *ASTVariableReference::value(Context *context) const
+const Value *ASTVariableReference::value(const Context *context) const
 {
     Evaluate check(context);
     return check(_ast->expression);
@@ -3034,7 +3034,7 @@ UiQualifiedId *QmlPrototypeReference::qmlTypeName() const
     return _qmlTypeName;
 }
 
-const Value *QmlPrototypeReference::value(Context *context) const
+const Value *QmlPrototypeReference::value(const Context *context) const
 {
     return context->lookupType(_doc, _qmlTypeName);
 }
@@ -3061,7 +3061,7 @@ bool ASTPropertyReference::getSourceLocation(QString *fileName, int *line, int *
     return true;
 }
 
-const Value *ASTPropertyReference::value(Context *context) const
+const Value *ASTPropertyReference::value(const Context *context) const
 {
     if (_ast->expression
             && (!_ast->memberType || _ast->memberType->asString() == QLatin1String("variant"))) {
@@ -3096,7 +3096,7 @@ bool ASTSignalReference::getSourceLocation(QString *fileName, int *line, int *co
     return true;
 }
 
-const Value *ASTSignalReference::value(Context *) const
+const Value *ASTSignalReference::value(const Context *) const
 {
     return engine()->undefinedValue();
 }
diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h
index 0ce977bdc3611cede786fd802b42803237abf827..201b89cb009badeca1b70b9553ddd149d2758707 100644
--- a/src/libs/qmljs/qmljsinterpreter.h
+++ b/src/libs/qmljs/qmljsinterpreter.h
@@ -281,10 +281,10 @@ public:
     const ObjectValue *typeEnvironment(const Document *doc) const;
     void setTypeEnvironment(const Document *doc, const ObjectValue *typeEnvironment);
 
-    const Value *lookup(const QString &name);
-    const ObjectValue *lookupType(const Document *doc, AST::UiQualifiedId *qmlTypeName);
-    const ObjectValue *lookupType(const Document *doc, const QStringList &qmlTypeName);
-    const Value *lookupReference(const Reference *reference);
+    const Value *lookup(const QString &name) const;
+    const ObjectValue *lookupType(const Document *doc, AST::UiQualifiedId *qmlTypeName) const;
+    const ObjectValue *lookupType(const Document *doc, const QStringList &qmlTypeName) const;
+    const Value *lookupReference(const Reference *reference) const;
 
     const Value *property(const ObjectValue *object, const QString &name) const;
     void setProperty(const ObjectValue *object, const QString &name, const Value *value);
@@ -304,7 +304,9 @@ private:
     ScopeChain _scopeChain;
     int _qmlScopeObjectIndex;
     bool _qmlScopeObjectSet;
-    QList<const Reference *> _referenceStack;
+
+    // for avoiding reference cycles during lookup
+    mutable QList<const Reference *> _referenceStack;
 };
 
 class QMLJS_EXPORT Reference: public Value
@@ -320,7 +322,7 @@ public:
     virtual void accept(ValueVisitor *) const;
 
 private:
-    virtual const Value *value(Context *context) const;
+    virtual const Value *value(const Context *context) const;
 
     Engine *_engine;
     friend class Context;
@@ -353,16 +355,16 @@ public:
     QString className() const;
     void setClassName(const QString &className);
 
-    const ObjectValue *prototype(Context *context) const;
+    const ObjectValue *prototype(const Context *context) const;
     void setPrototype(const Value *prototype);
 
     virtual void processMembers(MemberProcessor *processor) const;
 
-    virtual const Value *property(const QString &name, Context *context) const;
+    virtual const Value *property(const QString &name, const Context *context) const;
     virtual void setProperty(const QString &name, const Value *value);
     virtual void removeProperty(const QString &name);
 
-    virtual const Value *lookupMember(const QString &name, Context *context, bool examinePrototypes = true) const;
+    virtual const Value *lookupMember(const QString &name, const Context *context, bool examinePrototypes = true) const;
 
     // Value interface
     virtual const ObjectValue *asObjectValue() const;
@@ -487,7 +489,7 @@ public:
     void setReturnValue(const Value *returnValue);
 
     // ObjectValue interface
-    virtual const Value *property(const QString &name, Context *context) const;
+    virtual const Value *property(const QString &name, const Context *context) const;
 
     // FunctionValue interface
     virtual const Value *returnValue() const;
@@ -748,7 +750,7 @@ public:
     AST::UiQualifiedId *qmlTypeName() const;
 
 private:    
-    virtual const Value *value(Context *context) const;
+    virtual const Value *value(const Context *context) const;
 
     AST::UiQualifiedId *_qmlTypeName;
     const Document *_doc;
@@ -763,7 +765,7 @@ public:
     virtual ~ASTVariableReference();
 
 private:
-    virtual const Value *value(Context *context) const;
+    virtual const Value *value(const Context *context) const;
 };
 
 class QMLJS_EXPORT ASTFunctionValue: public FunctionValue
@@ -803,7 +805,7 @@ public:
     virtual bool getSourceLocation(QString *fileName, int *line, int *column) const;
 
 private:
-    virtual const Value *value(Context *context) const;
+    virtual const Value *value(const Context *context) const;
 };
 
 class QMLJS_EXPORT ASTSignalReference: public Reference
@@ -822,7 +824,7 @@ public:
     virtual bool getSourceLocation(QString *fileName, int *line, int *column) const;
 
 private:
-    virtual const Value *value(Context *context) const;
+    virtual const Value *value(const Context *context) const;
 };
 
 class QMLJS_EXPORT ASTObjectValue: public ObjectValue
diff --git a/src/libs/qmljs/qmljslookupcontext.cpp b/src/libs/qmljs/qmljslookupcontext.cpp
index 1b8e333754f6c39f14b042041993bcff36edd331..30fafb7f17ff2e8480901f760ef09d417455be0f 100644
--- a/src/libs/qmljs/qmljslookupcontext.cpp
+++ b/src/libs/qmljs/qmljslookupcontext.cpp
@@ -82,7 +82,7 @@ Interpreter::Engine *LookupContext::engine() const
     return &d->interp;
 }
 
-Interpreter::Context *LookupContext::context() const
+const Interpreter::Context *LookupContext::context() const
 {
     return &d->context;
 }
diff --git a/src/libs/qmljs/qmljslookupcontext.h b/src/libs/qmljs/qmljslookupcontext.h
index 0ab35b99b3ddd051978d39da6f3f397980f1a88d..ca93b43aa9ac35dfc8dbb74697c7881f7df3712f 100644
--- a/src/libs/qmljs/qmljslookupcontext.h
+++ b/src/libs/qmljs/qmljslookupcontext.h
@@ -60,7 +60,7 @@ public:
 
     const Interpreter::Value *evaluate(AST::Node *node) const;
     Interpreter::Engine *engine() const;
-    Interpreter::Context *context() const;
+    const Interpreter::Context *context() const;
 
 private:
     QScopedPointer<LookupContextData> d;
diff --git a/src/libs/qmljs/qmljsscopebuilder.cpp b/src/libs/qmljs/qmljsscopebuilder.cpp
index 77577c5959e5de301894d3262557f581df10b1d2..ceffa41b4b442e82e62ffbc6e7b4afdc7c038097 100644
--- a/src/libs/qmljs/qmljsscopebuilder.cpp
+++ b/src/libs/qmljs/qmljsscopebuilder.cpp
@@ -194,7 +194,7 @@ const Value *ScopeBuilder::scopeObjectLookup(AST::UiQualifiedId *id)
 }
 
 
-const ObjectValue *ScopeBuilder::isPropertyChangesObject(Context *context,
+const ObjectValue *ScopeBuilder::isPropertyChangesObject(const Context *context,
                                                    const ObjectValue *object)
 {
     const ObjectValue *prototype = object;
diff --git a/src/libs/qmljs/qmljsscopebuilder.h b/src/libs/qmljs/qmljsscopebuilder.h
index 954a746fcf71bf52798f2879ff90fbb6b3d10e8c..5c33a27393b06d4e68dbcdf0b5a4afc36bd0dd50 100644
--- a/src/libs/qmljs/qmljsscopebuilder.h
+++ b/src/libs/qmljs/qmljsscopebuilder.h
@@ -56,7 +56,7 @@ public:
     void push(const QList<AST::Node *> &nodes);
     void pop();
 
-    static const Interpreter::ObjectValue *isPropertyChangesObject(Interpreter::Context *context, const Interpreter::ObjectValue *object);
+    static const Interpreter::ObjectValue *isPropertyChangesObject(const Interpreter::Context *context, const Interpreter::ObjectValue *object);
 
 private:
     void setQmlScopeObject(AST::Node *node);
diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp
index 9b84cd2dd81b8c96dc1fb504791fb5e7cee9b727..d2222860a9ee3a451df9745f1f0e20ef53923fe4 100644
--- a/src/plugins/qmljseditor/qmljscodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp
@@ -168,11 +168,11 @@ class EnumerateProperties: private Interpreter::MemberProcessor
     QHash<QString, const Interpreter::Value *> _properties;
     bool _globalCompletion;
     bool _enumerateGeneratedSlots;
-    Interpreter::Context *_context;
+    const Interpreter::Context *_context;
     const Interpreter::ObjectValue *_currentObject;
 
 public:
-    EnumerateProperties(Interpreter::Context *context)
+    EnumerateProperties(const Interpreter::Context *context)
         : _globalCompletion(false),
           _enumerateGeneratedSlots(false),
           _context(context),
@@ -692,7 +692,7 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
 
     const QList<AST::Node *> path = semanticInfo.astPath(editor->position());
     LookupContext::Ptr lookupContext = LookupContext::create(document, snapshot, path);
-    Interpreter::Context *context = lookupContext->context();
+    const Interpreter::Context *context = lookupContext->context();
 
     // Search for the operator that triggered the completion.
     QChar completionOperator;
diff --git a/src/plugins/qmljseditor/qmljshoverhandler.cpp b/src/plugins/qmljseditor/qmljshoverhandler.cpp
index 7004371279a7993195e63dc427bb89a96f57d85e..3d929d93d9ac6d58e143af8a9b7afe436be3352a 100644
--- a/src/plugins/qmljseditor/qmljshoverhandler.cpp
+++ b/src/plugins/qmljseditor/qmljshoverhandler.cpp
@@ -251,7 +251,7 @@ void HoverHandler::operateTooltip(TextEditor::ITextEditor *editor, const QPoint
 }
 
 QString HoverHandler::prettyPrint(const QmlJS::Interpreter::Value *value,
-                                  QmlJS::Interpreter::Context *context)
+                                  const QmlJS::Interpreter::Context *context)
 {
     if (! value)
         return QString();
diff --git a/src/plugins/qmljseditor/qmljshoverhandler.h b/src/plugins/qmljseditor/qmljshoverhandler.h
index 13d0cb2db57f2a509ae53838e33a928a673e381a..e8b3290268c9bf2813a6cecbded75a7b3f48c6ae 100644
--- a/src/plugins/qmljseditor/qmljshoverhandler.h
+++ b/src/plugins/qmljseditor/qmljshoverhandler.h
@@ -75,7 +75,7 @@ private:
                              QmlJS::AST::Node *node);
 
     QString prettyPrint(const QmlJS::Interpreter::Value *value,
-                        QmlJS::Interpreter::Context *context);
+                        const QmlJS::Interpreter::Context *context);
 
     QmlJS::ModelManagerInterface *m_modelManager;
     QColor m_colorTip;
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp
index 5a409af2489048c1f00c628d72b599e8a3230c76..95049322e33b09e717935763d167a9b8cdf37d5c 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.cpp
+++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp
@@ -108,7 +108,7 @@ QmlOutlineItem &QmlOutlineItem::copyValues(const QmlOutlineItem &other)
     return *this;
 }
 
-QString QmlOutlineItem::prettyPrint(const QmlJS::Interpreter::Value *value, QmlJS::Interpreter::Context *context) const
+QString QmlOutlineItem::prettyPrint(const QmlJS::Interpreter::Value *value, const QmlJS::Interpreter::Context *context) const
 {
     if (! value)
         return QString();
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.h b/src/plugins/qmljseditor/qmloutlinemodel.h
index 8459877334190255132340311d4a0466f9697645..34fe23015b9d6b4fc8e83d2645acd51fedc0fdb3 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.h
+++ b/src/plugins/qmljseditor/qmloutlinemodel.h
@@ -46,7 +46,7 @@ public:
     QmlOutlineItem &copyValues(const QmlOutlineItem &other); // so that we can assign all values at onc
 
 private:
-    QString prettyPrint(const QmlJS::Interpreter::Value *value, QmlJS::Interpreter::Context *context) const;
+    QString prettyPrint(const QmlJS::Interpreter::Value *value, const QmlJS::Interpreter::Context *context) const;
 
     QmlOutlineModel *m_outlineModel;
     QmlJS::AST::Node *m_node;