diff --git a/src/libs/qmljs/images/func.png b/src/libs/qmljs/images/func.png
new file mode 100644
index 0000000000000000000000000000000000000000..e515e76e61f64cd285a4c67aaf1feaca38e84f8b
Binary files /dev/null and b/src/libs/qmljs/images/func.png differ
diff --git a/src/libs/qmljs/qmljs.qrc b/src/libs/qmljs/qmljs.qrc
index 59c7cea4bdb57e98c8ca91a2f9c8ead073ea899b..f7b88c2b24299b0e45191d824a8556ff131dba18 100644
--- a/src/libs/qmljs/qmljs.qrc
+++ b/src/libs/qmljs/qmljs.qrc
@@ -3,5 +3,6 @@
         <file>images/element.png</file>
         <file>images/property.png</file>
 	<file>images/publicmember.png</file>
+	<file>images/func.png</file>
     </qresource>
 </RCC>
diff --git a/src/libs/qmljs/qmljsicons.cpp b/src/libs/qmljs/qmljsicons.cpp
index 964b7c9cc82f2f0a94c4b1f175993cb3870d7ad6..0cc415315f19e6b418f921103e3dd83798dc5b99 100644
--- a/src/libs/qmljs/qmljsicons.cpp
+++ b/src/libs/qmljs/qmljsicons.cpp
@@ -50,6 +50,7 @@ public:
     QIcon elementIcon;
     QIcon propertyIcon;
     QIcon publicMemberIcon;
+    QIcon functionDeclarationIcon;
     QHash<QPair<QString,QString>,QIcon> iconHash;
     QString resourcePath;
 };
@@ -62,6 +63,7 @@ Icons::Icons()
     m_d->elementIcon = QIcon(QLatin1String(":/qmljs/images/element.png"));
     m_d->propertyIcon = QIcon(QLatin1String(":/qmljs/images/property.png"));
     m_d->publicMemberIcon = QIcon(QLatin1String(":/qmljs/images/publicmember.png"));
+    m_d->functionDeclarationIcon = QIcon(QLatin1String(":/qmljs/images/func.png"));
 }
 
 Icons::~Icons()
@@ -141,3 +143,8 @@ QIcon Icons::publicMemberIcon() const
 {
     return m_d->publicMemberIcon;
 }
+
+QIcon Icons::functionDeclarationIcon() const
+{
+    return m_d->functionDeclarationIcon;
+}
diff --git a/src/libs/qmljs/qmljsicons.h b/src/libs/qmljs/qmljsicons.h
index 0382bfe722c88f49bf19db295969eb26fd0b278b..6eef01b620ae375b9f443cd04dec59789ae3f4ba 100644
--- a/src/libs/qmljs/qmljsicons.h
+++ b/src/libs/qmljs/qmljsicons.h
@@ -53,6 +53,7 @@ public:
     QIcon objectDefinitionIcon() const;
     QIcon scriptBindingIcon() const;
     QIcon publicMemberIcon() const;
+    QIcon functionDeclarationIcon() const;
 
 private:
     Icons();
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp
index 220ee4ac32dfa37d5ca741c6eb6b9531417b20a0..595cf7afe7aacd3af05de55133c8f1344a7e393d 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.cpp
+++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp
@@ -223,6 +223,19 @@ private:
         m_model->leavePublicMember();
     }
 
+    bool visit(AST::FunctionDeclaration *functionDeclaration)
+    {
+        QModelIndex index = m_model->enterFunctionDeclaration(functionDeclaration);
+        m_nodeToIndex.insert(functionDeclaration, index);
+
+        return true;
+    }
+
+    void endVisit(AST::FunctionDeclaration * /*functionDeclaration*/)
+    {
+        m_model->leaveFunctionDeclaration();
+    }
+
     QmlOutlineModel *m_model;
 
     QHash<AST::Node*, QModelIndex> m_nodeToIndex;
@@ -474,6 +487,23 @@ void QmlOutlineModel::leavePublicMember()
     leaveNode();
 }
 
+QModelIndex QmlOutlineModel::enterFunctionDeclaration(AST::FunctionDeclaration *functionDeclaration)
+{
+    QMap<int, QVariant> objectData;
+
+    objectData.insert(Qt::DisplayRole, functionDeclaration->name->asString());
+    objectData.insert(ItemTypeRole, ElementBindingType);
+
+    QmlOutlineItem *item = enterNode(objectData, functionDeclaration, 0, m_icons->functionDeclarationIcon());
+
+    return item->index();
+}
+
+void QmlOutlineModel::leaveFunctionDeclaration()
+{
+    leaveNode();
+}
+
 AST::Node *QmlOutlineModel::nodeForIndex(const QModelIndex &index) const
 {
     QTC_ASSERT(index.isValid() && (index.model() == this), return 0);
@@ -491,8 +521,11 @@ AST::SourceLocation QmlOutlineModel::sourceLocation(const QModelIndex &index) co
     QTC_ASSERT(index.isValid() && (index.model() == this), return location);
     AST::Node *node = nodeForIndex(index);
     if (node) {
-        if (AST::UiObjectMember *member = node->uiObjectMemberCast())
+        if (AST::UiObjectMember *member = node->uiObjectMemberCast()) {
             location = getLocation(member);
+        } else if (AST::ExpressionNode *expression = node->expressionCast()) {
+            location = getLocation(expression);
+        }
     }
     return location;
 }
@@ -755,6 +788,15 @@ AST::SourceLocation QmlOutlineModel::getLocation(AST::UiObjectMember *objMember)
     return location;
 }
 
+AST::SourceLocation QmlOutlineModel::getLocation(AST::ExpressionNode *exprNode) {
+    AST::SourceLocation location;
+    location.offset = exprNode->firstSourceLocation().offset;
+    location.length = exprNode->lastSourceLocation().offset
+            - exprNode->firstSourceLocation().offset
+            + exprNode->lastSourceLocation().length;
+    return location;
+}
+
 QIcon QmlOutlineModel::getIcon(AST::UiQualifiedId *qualifiedId) {
     const Interpreter::Value *value = m_context->evaluate(qualifiedId);
 
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.h b/src/plugins/qmljseditor/qmloutlinemodel.h
index 9bd7c1c133330a2cbd5289665544c81ef432da35..8d31ee7c68b53ecae1191b529817da0f3513ab67 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.h
+++ b/src/plugins/qmljseditor/qmloutlinemodel.h
@@ -89,6 +89,9 @@ private:
     QModelIndex enterPublicMember(QmlJS::AST::UiPublicMember *publicMember);
     void leavePublicMember();
 
+    QModelIndex enterFunctionDeclaration(QmlJS::AST::FunctionDeclaration *functionDeclaration);
+    void leaveFunctionDeclaration();
+
 private:
     QmlOutlineItem *enterNode(QMap<int, QVariant> data, QmlJS::AST::Node *node, QmlJS::AST::UiQualifiedId *idNode, const QIcon &icon);
     void leaveNode();
@@ -102,6 +105,7 @@ private:
 
     static QString asString(QmlJS::AST::UiQualifiedId *id);
     static QmlJS::AST::SourceLocation getLocation(QmlJS::AST::UiObjectMember *objMember);
+    static QmlJS::AST::SourceLocation getLocation(QmlJS::AST::ExpressionNode *exprNode);
     QIcon getIcon(QmlJS::AST::UiQualifiedId *objDef);
 
     QString getAnnotation(QmlJS::AST::UiObjectInitializer *objInitializer);