diff --git a/examples/quick/quicknanobrowser/quickwindow.qml b/examples/quick/quicknanobrowser/quickwindow.qml
index bec301e6d11f241bedb706867afa2802c7dd759e..7ec4fc02169e1f25443a3ed8822444fccd731f7b 100644
--- a/examples/quick/quicknanobrowser/quickwindow.qml
+++ b/examples/quick/quicknanobrowser/quickwindow.qml
@@ -82,6 +82,10 @@ ApplicationWindow {
                 iconSource: webEngineView.loading ? "icons/process-stop.png" : "icons/view-refresh.png"
                 onClicked: webEngineView.reload()
             }
+            Image {
+                id: faviconImage
+                width: 16; height: 16
+            }
             TextField {
                 id: addressBar
                 focus: true
@@ -99,5 +103,6 @@ ApplicationWindow {
         url: utils.initialUrl()
 
         onUrlChanged: addressBar.text = url
+        onIconChanged: faviconImage.source = url
     }
 }
diff --git a/lib/quick/qquickwebengineview.cpp b/lib/quick/qquickwebengineview.cpp
index 708a7ecb6c18a5e58b97e8bf83968e36027cc4bc..aa942c017041785ab18175aafcc858f0a59a0aff 100644
--- a/lib/quick/qquickwebengineview.cpp
+++ b/lib/quick/qquickwebengineview.cpp
@@ -74,6 +74,13 @@ void QQuickWebEngineViewPrivate::urlChanged(const QUrl &url)
     Q_EMIT q->urlChanged();
 }
 
+void QQuickWebEngineViewPrivate::iconChanged(const QUrl &url)
+{
+    Q_Q(QQuickWebEngineView);
+    icon = url;
+    Q_EMIT q->iconChanged();
+}
+
 void QQuickWebEngineViewPrivate::loadingStateChanged()
 {
     Q_Q(QQuickWebEngineView);
@@ -127,6 +134,12 @@ void QQuickWebEngineView::setUrl(const QUrl& url)
     d->adapter->load(url);
 }
 
+QUrl QQuickWebEngineView::icon() const
+{
+    Q_D(const QQuickWebEngineView);
+    return d->icon;
+}
+
 void QQuickWebEngineView::goBack()
 {
     Q_D(QQuickWebEngineView);
diff --git a/lib/quick/qquickwebengineview_p.h b/lib/quick/qquickwebengineview_p.h
index faeb234a12295e21ed438b74c3ed3d33614b5073..1c3e27732cec1ddf0ff71aaddb2a915e81911c3c 100644
--- a/lib/quick/qquickwebengineview_p.h
+++ b/lib/quick/qquickwebengineview_p.h
@@ -51,6 +51,7 @@ class QQuickWebEngineViewPrivate;
 class QQuickWebEngineView : public QQuickItem {
     Q_OBJECT
     Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged)
+    Q_PROPERTY(QUrl icon READ icon NOTIFY iconChanged)
     Q_PROPERTY(bool loading READ isLoading NOTIFY loadingStateChanged)
     Q_PROPERTY(QString title READ title NOTIFY titleChanged)
     Q_PROPERTY(bool canGoBack READ canGoBack NOTIFY loadingStateChanged)
@@ -62,6 +63,7 @@ public:
 
     QUrl url() const;
     void setUrl(const QUrl&);
+    QUrl icon() const;
     bool isLoading() const;
     QString title() const;
     bool canGoBack() const;
@@ -76,6 +78,7 @@ public Q_SLOTS:
 Q_SIGNALS:
     void titleChanged();
     void urlChanged();
+    void iconChanged();
     void loadingStateChanged();
 
 protected:
diff --git a/lib/quick/qquickwebengineview_p_p.h b/lib/quick/qquickwebengineview_p_p.h
index 9831fa0f363ca62c2482b5cf9c0b611414bf5a4e..38621b44d85cc35c3a28810a55be6065fda0a11b 100644
--- a/lib/quick/qquickwebengineview_p_p.h
+++ b/lib/quick/qquickwebengineview_p_p.h
@@ -61,6 +61,7 @@ public:
     virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(CompositingMode mode) Q_DECL_OVERRIDE;
     virtual void titleChanged(const QString&) Q_DECL_OVERRIDE;
     virtual void urlChanged(const QUrl&) Q_DECL_OVERRIDE;
+    virtual void iconChanged(const QUrl&) Q_DECL_OVERRIDE;
     virtual void loadingStateChanged() Q_DECL_OVERRIDE;
     virtual QRectF viewportRect() const Q_DECL_OVERRIDE;
     virtual void loadFinished(bool success) Q_DECL_OVERRIDE;
@@ -68,6 +69,7 @@ public:
     virtual void adoptNewWindow(WebContentsAdapter *newWebContents, WindowOpenDisposition disposition) Q_DECL_OVERRIDE;
 
     QExplicitlySharedDataPointer<WebContentsAdapter> adapter;
+    QUrl icon;
 };
 
 QT_END_NAMESPACE
diff --git a/lib/web_contents_adapter_client.h b/lib/web_contents_adapter_client.h
index b0ab502c8ac215af0109f32d7aef4ae6225b8770..ea6e5a666ecaf6f67263bb0cbb8e09b75d4258bd 100644
--- a/lib/web_contents_adapter_client.h
+++ b/lib/web_contents_adapter_client.h
@@ -80,6 +80,7 @@ public:
     virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(CompositingMode mode) = 0;
     virtual void titleChanged(const QString&) = 0;
     virtual void urlChanged(const QUrl&) = 0;
+    virtual void iconChanged(const QUrl&) = 0;
     virtual void loadingStateChanged() = 0;
     virtual QRectF viewportRect() const = 0;
     virtual void loadFinished(bool success) = 0;
diff --git a/lib/web_contents_delegate_qt.cpp b/lib/web_contents_delegate_qt.cpp
index e64649aeacebb5a8f4188dd9ef5e23e5fe509ab9..12a00481c494f49521bfd8d9527d8d6ac27c4527 100644
--- a/lib/web_contents_delegate_qt.cpp
+++ b/lib/web_contents_delegate_qt.cpp
@@ -48,6 +48,7 @@
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/invalidate_type.h"
+#include "content/public/common/favicon_url.h"
 
 WebContentsDelegateQt::WebContentsDelegateQt(content::WebContents *webContents, WebContentsAdapterClient *adapterClient)
     : m_viewClient(adapterClient)
@@ -96,3 +97,14 @@ void WebContentsDelegateQt::DidFinishLoad(int64 frame_id, const GURL &validated_
     if (is_main_frame)
         m_viewClient->loadFinished(true);
 }
+
+void WebContentsDelegateQt::DidUpdateFaviconURL(int32 page_id, const std::vector<content::FaviconURL>& candidates)
+{
+    Q_UNUSED(page_id)
+    Q_FOREACH (content::FaviconURL candidate, candidates) {
+        if (candidate.icon_type == content::FaviconURL::FAVICON && !candidate.icon_url.is_empty()) {
+            m_viewClient->iconChanged(toQt(candidate.icon_url));
+            break;
+        }
+    }
+}
diff --git a/lib/web_contents_delegate_qt.h b/lib/web_contents_delegate_qt.h
index e56800571aa29c21a7588caa0664e9f41c266a0c..629fd5c6c35b690e5df5efb287d0a26b1a1c30ea 100644
--- a/lib/web_contents_delegate_qt.h
+++ b/lib/web_contents_delegate_qt.h
@@ -64,6 +64,7 @@ public:
     virtual void LoadingStateChanged(content::WebContents* source);
     virtual void DidFailLoad(int64 frame_id, const GURL &validated_url, bool is_main_frame, int error_code, const string16 &error_description, content::RenderViewHost *render_view_host);
     virtual void DidFinishLoad(int64 frame_id, const GURL &validated_url, bool is_main_frame, content::RenderViewHost *render_view_host);
+    virtual void DidUpdateFaviconURL(int32 page_id, const std::vector<content::FaviconURL>& candidates);
 
 private:
     WebContentsAdapterClient *m_viewClient;
diff --git a/lib/widgets/Api/qwebenginepage.cpp b/lib/widgets/Api/qwebenginepage.cpp
index ee02383683dd73b78816cfc18639d0a64d50c309..ab3b1e675d382f106d9d19161846142cb94f78ab 100644
--- a/lib/widgets/Api/qwebenginepage.cpp
+++ b/lib/widgets/Api/qwebenginepage.cpp
@@ -69,6 +69,11 @@ void QWebEnginePagePrivate::urlChanged(const QUrl &url)
     Q_EMIT q->urlChanged(url);
 }
 
+void QWebEnginePagePrivate::iconChanged(const QUrl &url)
+{
+    Q_UNUSED(url)
+}
+
 void QWebEnginePagePrivate::loadingStateChanged()
 {
     Q_Q(QWebEnginePage);
diff --git a/lib/widgets/Api/qwebenginepage_p.h b/lib/widgets/Api/qwebenginepage_p.h
index 22066b5bce759645ea30e7aa052ce8019ceb4fbc..ad1de0047edaf57cb25a28a05397489fd02aab4b 100644
--- a/lib/widgets/Api/qwebenginepage_p.h
+++ b/lib/widgets/Api/qwebenginepage_p.h
@@ -67,6 +67,7 @@ public:
     virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(CompositingMode mode) Q_DECL_OVERRIDE;
     virtual void titleChanged(const QString&) Q_DECL_OVERRIDE;
     virtual void urlChanged(const QUrl&) Q_DECL_OVERRIDE;
+    virtual void iconChanged(const QUrl&) Q_DECL_OVERRIDE;
     virtual void loadingStateChanged() Q_DECL_OVERRIDE;
     virtual QRectF viewportRect() const Q_DECL_OVERRIDE;
     virtual void loadFinished(bool success) Q_DECL_OVERRIDE;