diff --git a/build/qmake/mkspecs/features/gyp_generator.prf b/build/qmake/mkspecs/features/gyp_generator.prf
index 9df87c4ec96411372d74d5837fdce95f878ad573..02de2ecc7bcbe2ac0f1067b61bad379d2b858cfc 100644
--- a/build/qmake/mkspecs/features/gyp_generator.prf
+++ b/build/qmake/mkspecs/features/gyp_generator.prf
@@ -104,6 +104,13 @@ GYP_CONTENTS += "    'sources': ["
 for (sourcefile, SOURCES): GYP_CONTENTS += "      '$$sourcefile',"
 for (headerfile, HEADERS): GYP_CONTENTS += "      '$$headerfile',"
 
+# Add Sources generated by rcc from qrc files.
+for (resourcefile, RESOURCES) {
+  RCC_CPP = $$replace(resourcefile, .qrc, .cpp)
+  RCC_CPP = $$join(RCC_CPP, "qrc_", qrc_)
+  GYP_CONTENTS += "      '$$RCC_DIR/$$RCC_CPP',"
+}
+
 # Add moc output files to compile that aren't included at the end of any other source
 MOC_OUT_PATH = $$absolute_path($$MOC_DIR, $$OUT_PWD)$${QMAKE_DIR_SEP}
 for (mocable_header, MOCABLE_HEADERS) {
diff --git a/build/qtwebengine_extras.gypi b/build/qtwebengine_extras.gypi
index d37c1bd6591f40946036c279a860c4f30a5a044a..95467774421a5ba99d6a3030b3ddf67391272c96 100644
--- a/build/qtwebengine_extras.gypi
+++ b/build/qtwebengine_extras.gypi
@@ -2,6 +2,9 @@
   'target_defaults': {
     # patterns used to exclude chromium files from the build when we have a drop-in replacement
     'sources/': [
+      ['exclude', 'ui/base/resource/resource_bundle_gtk.cc$'],
+      ['exclude', 'ui/base/resource/resource_bundle_mac.mm$'],
+      ['exclude', 'ui/base/resource/resource_bundle_win.cc$'],
       ['exclude', 'browser/web_contents/web_contents_view_gtk\\.(cc|h)$'],
       ['exclude', 'browser/web_contents/web_contents_view_mac\\.(mm|h)$'],
       ['exclude', 'browser/web_contents/web_contents_view_win\\.(cc|h)$'],
diff --git a/lib/content_browser_client_qt.cpp b/lib/content_browser_client_qt.cpp
index 80e855afbc187af1e27bcc2adf8842c1645ffe8d..2ba888e68f499655e17a28865e405da478cfa8f4 100644
--- a/lib/content_browser_client_qt.cpp
+++ b/lib/content_browser_client_qt.cpp
@@ -45,6 +45,11 @@
 #include "base/threading/thread_restrictions.h"
 #include "content/public/browser/browser_main_parts.h"
 #include "content/public/common/main_function_params.h"
+#include "content/public/browser/child_process_security_policy.h"
+#include "content/public/common/url_constants.h"
+#include "grit/net_resources.h"
+#include "net/base/net_module.h"
+#include "ui/base/resource/resource_bundle.h"
 
 #include "browser_context_qt.h"
 #include "web_contents_view_qt.h"
@@ -86,7 +91,6 @@ public:
     {
         // FIXME: This could be needed if we want to run Chromium tests.
         // We could run a QEventLoop here.
-        Q_UNREACHABLE();
     }
 
     virtual void Quit()
@@ -149,6 +153,14 @@ base::MessagePump* messagePumpFactory()
 
 } // namespace
 
+static base::StringPiece PlatformResourceProvider(int key) {
+    if (key == IDR_DIR_HEADER_HTML) {
+        base::StringPiece html_data = ui::ResourceBundle::GetSharedInstance().GetRawDataResource(IDR_DIR_HEADER_HTML);
+        return html_data;
+    }
+    return base::StringPiece();
+}
+
 class BrowserMainPartsQt : public content::BrowserMainParts
 {
 public:
@@ -158,6 +170,8 @@ public:
 
     void PreMainMessageLoopStart() Q_DECL_OVERRIDE
     {
+        net::NetModule::SetResourceProvider(PlatformResourceProvider);
+        ui::ResourceBundle::InitSharedInstanceWithLocale("en-US", NULL);
         base::MessageLoop::InitMessagePumpForUIFactory(::messagePumpFactory);
     }
 
@@ -218,6 +232,12 @@ content::BrowserMainParts *ContentBrowserClientQt::CreateBrowserMainParts(const
     return m_browserMainParts;
 }
 
+void ContentBrowserClientQt::RenderProcessHostCreated(content::RenderProcessHost* host)
+{
+    // FIXME: Add a settings variable to enable/disable the file scheme.
+    content::ChildProcessSecurityPolicy::GetInstance()->GrantScheme(host->GetID(), chrome::kFileScheme);
+}
+
 
 BrowserContextQt* ContentBrowserClientQt::browser_context() {
     Q_ASSERT(m_browserMainParts);
diff --git a/lib/content_browser_client_qt.h b/lib/content_browser_client_qt.h
index 5359d9b3a8e52431c2f5a0d15bc7fcdd95f31a05..a1e897e7579c8cd54f5883911364d4a81d7045f8 100644
--- a/lib/content_browser_client_qt.h
+++ b/lib/content_browser_client_qt.h
@@ -52,6 +52,7 @@ class URLRequestContextGetter;
 namespace content {
 class BrowserContext;
 class BrowserMainParts;
+class RenderProcessHost;
 class RenderViewHostDelegateView;
 class WebContentsViewPort;
 class WebContents;
@@ -69,6 +70,7 @@ public:
     static ContentBrowserClientQt* Get();
     virtual content::WebContentsViewPort* OverrideCreateWebContentsView(content::WebContents* , content::RenderViewHostDelegateView**) Q_DECL_OVERRIDE;
     virtual content::BrowserMainParts* CreateBrowserMainParts(const content::MainFunctionParams&) Q_DECL_OVERRIDE;
+    virtual void RenderProcessHostCreated(content::RenderProcessHost* host) Q_DECL_OVERRIDE;
 
     BrowserContextQt* browser_context();
 
diff --git a/lib/lib.pro b/lib/lib.pro
index ca45e6897157591e96566d87c08a3e95dd7398f6..45d8675fd0a2665ef482748ded42007f0f4129ad 100644
--- a/lib/lib.pro
+++ b/lib/lib.pro
@@ -3,6 +3,7 @@
 # our gyp_generator.prf feature to the CONFIG variable since it is processed backwards
 CONFIG = gyp_generator $$CONFIG
 GYPDEPENDENCIES += ../shared/shared.gyp:qtwebengine_shared
+GYPDEPENDENCIES += ../chromium/net/net.gyp:net_resources
 GYPINCLUDES += ../qtwebengine.gypi
 
 TEMPLATE = lib
@@ -20,6 +21,8 @@ CONFIG(release, debug|release): DEFINES += NDEBUG
 
 QT += widgets quick
 
+RESOURCES += lib_resources.qrc
+
 SOURCES = \
         backing_store_qt.cpp \
         content_browser_client_qt.cpp \
@@ -29,6 +32,7 @@ SOURCES = \
         render_widget_host_view_qt_delegate_quick.cpp \
         render_widget_host_view_qt_delegate_widget.cpp \
         resource_context_qt.cpp \
+        resource_bundle_qt.cpp \
         url_request_context_getter_qt.cpp \
         web_contents_delegate_qt.cpp \
         web_contents_view_qt.cpp \
diff --git a/lib/lib_resources.qrc b/lib/lib_resources.qrc
new file mode 100644
index 0000000000000000000000000000000000000000..4e6fce92aa24cc8178ca2398ce14b23cf418acec
--- /dev/null
+++ b/lib/lib_resources.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="data">
+    <file alias="resources.pak">/Users/zeno/work/qtwebengine/out/Release/gen/net/net_resources.pak</file>
+</qresource>
+</RCC>
\ No newline at end of file
diff --git a/lib/resource_bundle_qt.cpp b/lib/resource_bundle_qt.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4df349edaa595a241e02b6d59dd6c0b63226163d
--- /dev/null
+++ b/lib/resource_bundle_qt.cpp
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/base/resource/data_pack.h"
+
+#include <QFile>
+
+namespace ui {
+
+// ********************* data_pack.cc *********************
+// This is duplicated code originating from data_pack.cc.
+// It should instead be moved to a header file and be included
+// in both places.
+
+static const uint32 kFileFormatVersion = 4;
+static const size_t kHeaderLength = 2 * sizeof(uint32) + sizeof(uint8);
+
+#pragma pack(push,2)
+struct DataPackEntry {
+  uint16 resource_id;
+  uint32 file_offset;
+
+  static int CompareById(const void* void_key, const void* void_entry) {
+    uint16 key = *reinterpret_cast<const uint16*>(void_key);
+    const DataPackEntry* entry =
+        reinterpret_cast<const DataPackEntry*>(void_entry);
+    if (key < entry->resource_id) {
+      return -1;
+    } else if (key > entry->resource_id) {
+      return 1;
+    } else {
+      return 0;
+    }
+  }
+};
+#pragma pack(pop)
+// ******************* data_pack.cc end *******************
+
+class UI_EXPORT DataPackQt : public DataPack {
+    public:
+        DataPackQt(ui::ScaleFactor scale_factor)
+            : DataPack(scale_factor)
+            , m_data(NULL)
+            , m_resourceCount(0) { }
+
+        virtual ~DataPackQt() { }
+
+        bool LoadFromByteArray(const QByteArray& data)
+        {
+            m_data = data;
+
+            if (kHeaderLength > m_data.size())
+                return false;
+
+            const uint32* ptr = reinterpret_cast<const uint32*>(m_data.data());
+            uint32 version = ptr[0];
+            if (version != kFileFormatVersion) {
+                LOG(ERROR) << "Bad data pack version: got " << version << ", expected " << kFileFormatVersion;
+                return false;
+            }
+
+            m_resourceCount = ptr[1];
+            return true;
+        }
+
+        virtual bool HasResource(uint16 resource_id) const OVERRIDE
+        {
+            return !!bsearch(&resource_id, m_data.data() + kHeaderLength, m_resourceCount, sizeof(DataPackEntry), DataPackEntry::CompareById);
+        }
+
+        virtual bool GetStringPiece(uint16 resource_id, base::StringPiece* data) const OVERRIDE
+        {
+            #if defined(__BYTE_ORDER) // Linux check
+                COMPILE_ASSERT(__BYTE_ORDER == __LITTLE_ENDIAN, datapack_assumes_little_endian);
+            #elif defined(__BIG_ENDIAN__) // Mac check
+                #error DataPack assumes little endian
+            #endif
+
+            const DataPackEntry* target = reinterpret_cast<const DataPackEntry*>(bsearch(&resource_id, m_data.data() + kHeaderLength, m_resourceCount, sizeof(DataPackEntry), DataPackEntry::CompareById));
+            if (!target)
+                return false;
+
+            const DataPackEntry* next_entry = target + 1;
+            size_t length = next_entry->file_offset - target->file_offset;
+
+            data->set(m_data.data() + target->file_offset, length);
+            return true;
+        }
+
+    private:
+        QByteArray m_data;
+        size_t m_resourceCount;
+        DISALLOW_COPY_AND_ASSIGN(DataPackQt);
+};
+
+
+void ResourceBundle::LoadCommonResources()
+{
+    QFile pak_file(":/data/resources.pak");
+    if (!pak_file.open(QIODevice::ReadOnly))
+        return;
+
+    scoped_ptr<DataPackQt> data_pack(new DataPackQt(SCALE_FACTOR_100P));
+    if (data_pack->LoadFromByteArray(pak_file.readAll()))
+        AddDataPack(data_pack.release());
+}
+
+base::FilePath ResourceBundle::GetLocaleFilePath(const std::string& /*app_locale*/, bool /*test_file_exists*/)
+{
+    return base::FilePath();
+}
+
+gfx::Image& ResourceBundle::GetNativeImageNamed(int resource_id, ImageRTL rtl)
+{
+    LOG(WARNING) << "Unable to load image with id " << resource_id;
+    NOTREACHED();  // Want to assert in debug mode.
+    return GetEmptyImage();
+}
+
+}  // namespace ui
diff --git a/lib/url_request_context_getter_qt.cpp b/lib/url_request_context_getter_qt.cpp
index 2f2d89e307bcde1c7c3c1be348b46dfd1bc1ab00..18a8b008255583f15a7637d6a7195dd1d0c552f3 100644
--- a/lib/url_request_context_getter_qt.cpp
+++ b/lib/url_request_context_getter_qt.cpp
@@ -59,6 +59,8 @@
 #include "net/ssl/ssl_config_service_defaults.h"
 #include "net/url_request/static_http_user_agent_settings.h"
 #include "net/url_request/url_request_context.h"
+#include "net/url_request/data_protocol_handler.h"
+#include "net/url_request/file_protocol_handler.h"
 
 #include "network_delegate_qt.h"
 
@@ -148,6 +150,11 @@ net::URLRequestContext *URLRequestContextGetterQt::GetURLRequestContext()
         m_storage->set_http_transaction_factory(main_cache);
 
         // FIXME: add protocol handling
+
+        m_jobFactory.reset(new net::URLRequestJobFactoryImpl());
+        m_jobFactory->SetProtocolHandler(chrome::kDataScheme, new net::DataProtocolHandler());
+        m_jobFactory->SetProtocolHandler(chrome::kFileScheme, new net::FileProtocolHandler());
+        m_urlRequestContext->set_job_factory(m_jobFactory.get());
     }
 
     return m_urlRequestContext.get();
diff --git a/lib/url_request_context_getter_qt.h b/lib/url_request_context_getter_qt.h
index bd9bae723b639fe705bf3df68915acae7f5e24d2..4ffc57a668e428096c258a493269bfb4c3b15075 100644
--- a/lib/url_request_context_getter_qt.h
+++ b/lib/url_request_context_getter_qt.h
@@ -47,6 +47,8 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/single_thread_task_runner.h"
 #include "net/url_request/url_request_context_storage.h"
+#include "net/url_request/url_request_job_factory_impl.h"
+#include "content/public/common/url_constants.h"
 
 namespace net {
 class HostResolver;
@@ -73,6 +75,7 @@ private:
     scoped_ptr<net::URLRequestContext> m_urlRequestContext;
     scoped_ptr<net::NetworkDelegate> m_networkDelegate;
     scoped_ptr<net::URLRequestContextStorage> m_storage;
+    scoped_ptr<net::URLRequestJobFactoryImpl> m_jobFactory;
 };
 
 #endif // URL_REQUEST_CONTEXT_GETTER_QT_H