diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc
index 27178b3894..7468a4b8b8 100644
--- a/atom/browser/api/atom_api_app.cc
+++ b/atom/browser/api/atom_api_app.cc
@@ -13,6 +13,7 @@
 
 #include "atom/browser/api/atom_api_menu.h"
 #include "atom/browser/atom_browser_context.h"
+#include "atom/browser/atom_browser_main_parts.h"
 #include "atom/browser/browser.h"
 #include "atom/common/native_mate_converters/file_path_converter.h"
 #include "atom/common/native_mate_converters/gurl_converter.h"
@@ -97,7 +98,8 @@ class ResolveProxyHelper {
  public:
   ResolveProxyHelper(const GURL& url, App::ResolveProxyCallback callback)
       : callback_(callback) {
-    net::ProxyService* proxy_service = AtomBrowserContext::Get()->
+    auto browser_context = AtomBrowserMainParts::Get()->browser_context();
+    net::ProxyService* proxy_service = browser_context->
         url_request_context_getter()->GetURLRequestContext()->proxy_service();
 
     // Start the request.
diff --git a/atom/browser/api/atom_api_protocol.cc b/atom/browser/api/atom_api_protocol.cc
index 9bc2de4b42..75dd70d2a4 100644
--- a/atom/browser/api/atom_api_protocol.cc
+++ b/atom/browser/api/atom_api_protocol.cc
@@ -5,6 +5,7 @@
 #include "atom/browser/api/atom_api_protocol.h"
 
 #include "atom/browser/atom_browser_context.h"
+#include "atom/browser/atom_browser_main_parts.h"
 #include "atom/browser/net/adapter_request_job.h"
 #include "atom/browser/net/atom_url_request_job_factory.h"
 #include "atom/common/native_mate_converters/file_path_converter.h"
@@ -131,8 +132,8 @@ class CustomProtocolRequestJob : public AdapterRequestJob {
         dict.Get("referrer", &referrer);
 
         BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
-            base::Bind(&AdapterRequestJob::CreateHttpJobAndStart,
-                       GetWeakPtr(), url, method, referrer));
+            base::Bind(&AdapterRequestJob::CreateHttpJobAndStart, GetWeakPtr(),
+                       registry_->browser_context(), url, method, referrer));
         return;
       }
     }
@@ -190,8 +191,9 @@ class CustomProtocolHandler : public ProtocolHandler {
 
 }  // namespace
 
-Protocol::Protocol()
-    : job_factory_(AtomBrowserContext::Get()->job_factory()) {
+Protocol::Protocol(AtomBrowserContext* browser_context)
+    : browser_context_(browser_context),
+      job_factory_(browser_context->job_factory()) {
   CHECK(job_factory_);
 }
 
@@ -343,8 +345,9 @@ void Protocol::EmitEventInUI(const std::string& event,
 }
 
 // static
-mate::Handle<Protocol> Protocol::Create(v8::Isolate* isolate) {
-  return CreateHandle(isolate, new Protocol);
+mate::Handle<Protocol> Protocol::Create(
+    v8::Isolate* isolate, AtomBrowserContext* browser_context) {
+  return CreateHandle(isolate, new Protocol(browser_context));
 }
 
 }  // namespace api
@@ -357,7 +360,9 @@ void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
                 v8::Local<v8::Context> context, void* priv) {
   v8::Isolate* isolate = context->GetIsolate();
   mate::Dictionary dict(isolate, exports);
-  dict.Set("protocol", atom::api::Protocol::Create(isolate));
+  auto browser_context = static_cast<atom::AtomBrowserContext*>(
+      atom::AtomBrowserMainParts::Get()->browser_context());
+  dict.Set("protocol", atom::api::Protocol::Create(isolate, browser_context));
 }
 
 }  // namespace
diff --git a/atom/browser/api/atom_api_protocol.h b/atom/browser/api/atom_api_protocol.h
index 34725cecc9..3e2e18d33f 100644
--- a/atom/browser/api/atom_api_protocol.h
+++ b/atom/browser/api/atom_api_protocol.h
@@ -18,6 +18,7 @@ class URLRequest;
 
 namespace atom {
 
+class AtomBrowserContext;
 class AtomURLRequestJobFactory;
 
 namespace api {
@@ -27,12 +28,15 @@ class Protocol : public mate::EventEmitter {
   typedef base::Callback<v8::Local<v8::Value>(const net::URLRequest*)>
           JsProtocolHandler;
 
-  static mate::Handle<Protocol> Create(v8::Isolate* isolate);
+  static mate::Handle<Protocol> Create(
+      v8::Isolate* isolate, AtomBrowserContext* browser_context);
 
   JsProtocolHandler GetProtocolHandler(const std::string& scheme);
 
+  AtomBrowserContext* browser_context() const { return browser_context_; }
+
  protected:
-  Protocol();
+  explicit Protocol(AtomBrowserContext* browser_context);
 
   // mate::Wrappable implementations:
   virtual mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
@@ -68,6 +72,7 @@ class Protocol : public mate::EventEmitter {
   // Do protocol.emit(event, parameter) under UI thread.
   void EmitEventInUI(const std::string& event, const std::string& parameter);
 
+  AtomBrowserContext* browser_context_;
   AtomURLRequestJobFactory* job_factory_;
   ProtocolHandlersMap protocol_handlers_;
 
diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc
index 192955e6ac..af00112d09 100644
--- a/atom/browser/api/atom_api_web_contents.cc
+++ b/atom/browser/api/atom_api_web_contents.cc
@@ -8,6 +8,7 @@
 
 #include "atom/browser/atom_browser_client.h"
 #include "atom/browser/atom_browser_context.h"
+#include "atom/browser/atom_browser_main_parts.h"
 #include "atom/browser/native_window.h"
 #include "atom/common/api/api_messages.h"
 #include "atom/common/native_mate_converters/gfx_converter.h"
@@ -144,7 +145,7 @@ WebContents::WebContents(const mate::Dictionary& options)
       guest_host_(nullptr),
       auto_size_enabled_(false),
       is_full_page_plugin_(false) {
-  auto browser_context = AtomBrowserContext::Get();
+  auto browser_context = AtomBrowserMainParts::Get()->browser_context();
   content::SiteInstance* site_instance = content::SiteInstance::CreateForURL(
       browser_context, GURL("chrome-guest://fake-host"));
 
diff --git a/atom/browser/atom_access_token_store.cc b/atom/browser/atom_access_token_store.cc
index 5e117869a4..86ce1c2159 100644
--- a/atom/browser/atom_access_token_store.cc
+++ b/atom/browser/atom_access_token_store.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "atom/browser/atom_browser_context.h"
+#include "atom/browser/atom_browser_main_parts.h"
 #include "atom/common/google_api_key.h"
 
 namespace atom {
@@ -39,8 +40,8 @@ void AtomAccessTokenStore::LoadAccessTokens(
   token_pair.first = GURL(kGeolocationProviderUrl);
   access_token_set.insert(token_pair);
 
-  callback.Run(access_token_set,
-               AtomBrowserContext::Get()->url_request_context_getter());
+  auto browser_context = AtomBrowserMainParts::Get()->browser_context();
+  callback.Run(access_token_set, browser_context->url_request_context_getter());
 }
 
 void AtomAccessTokenStore::SaveAccessToken(const GURL& server_url,
diff --git a/atom/browser/atom_browser_context.cc b/atom/browser/atom_browser_context.cc
index e31ebc4147..64b80fb614 100644
--- a/atom/browser/atom_browser_context.cc
+++ b/atom/browser/atom_browser_context.cc
@@ -13,7 +13,6 @@
 #include "base/command_line.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/worker_pool.h"
-#include "chrome/browser/browser_process.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/url_constants.h"
 #include "net/ftp/ftp_network_layer.h"
@@ -40,8 +39,7 @@ class NoCacheBackend : public net::HttpCache::BackendFactory {
 }  // namespace
 
 AtomBrowserContext::AtomBrowserContext()
-    : fake_browser_process_(new BrowserProcess),
-      job_factory_(new AtomURLRequestJobFactory) {
+    : job_factory_(new AtomURLRequestJobFactory) {
 }
 
 AtomBrowserContext::~AtomBrowserContext() {
@@ -106,10 +104,4 @@ content::BrowserPluginGuestManager* AtomBrowserContext::GetGuestManager() {
   return guest_manager_.get();
 }
 
-// static
-AtomBrowserContext* AtomBrowserContext::Get() {
-  return static_cast<AtomBrowserContext*>(
-      AtomBrowserMainParts::Get()->browser_context());
-}
-
 }  // namespace atom
diff --git a/atom/browser/atom_browser_context.h b/atom/browser/atom_browser_context.h
index ab28c3e81a..688a4977fa 100644
--- a/atom/browser/atom_browser_context.h
+++ b/atom/browser/atom_browser_context.h
@@ -7,8 +7,6 @@
 
 #include "brightray/browser/browser_context.h"
 
-class BrowserProcess;
-
 namespace atom {
 
 class AtomURLRequestJobFactory;
@@ -19,9 +17,6 @@ class AtomBrowserContext : public brightray::BrowserContext {
   AtomBrowserContext();
   virtual ~AtomBrowserContext();
 
-  // Returns the browser context singleton.
-  static AtomBrowserContext* Get();
-
   // brightray::URLRequestContextGetter::Delegate:
   net::URLRequestJobFactory* CreateURLRequestJobFactory(
       content::ProtocolHandlerMap* handlers,
@@ -35,8 +30,6 @@ class AtomBrowserContext : public brightray::BrowserContext {
   AtomURLRequestJobFactory* job_factory() const { return job_factory_; }
 
  private:
-  // A fake BrowserProcess object that used to feed the source code from chrome.
-  scoped_ptr<BrowserProcess> fake_browser_process_;
   scoped_ptr<WebViewManager> guest_manager_;
 
   AtomURLRequestJobFactory* job_factory_;  // Weak reference.
diff --git a/atom/browser/atom_browser_main_parts.cc b/atom/browser/atom_browser_main_parts.cc
index aaf68836d0..a63ec9a703 100644
--- a/atom/browser/atom_browser_main_parts.cc
+++ b/atom/browser/atom_browser_main_parts.cc
@@ -11,6 +11,7 @@
 #include "atom/common/api/atom_bindings.h"
 #include "atom/common/node_bindings.h"
 #include "base/command_line.h"
+#include "chrome/browser/browser_process.h"
 #include "v8/include/v8-debug.h"
 
 #if defined(USE_X11)
@@ -25,7 +26,8 @@ namespace atom {
 AtomBrowserMainParts* AtomBrowserMainParts::self_ = NULL;
 
 AtomBrowserMainParts::AtomBrowserMainParts()
-    : browser_(new Browser),
+    : fake_browser_process_(new BrowserProcess),
+      browser_(new Browser),
       node_bindings_(NodeBindings::Create(true)),
       atom_bindings_(new AtomBindings),
       gc_timer_(true, true) {
diff --git a/atom/browser/atom_browser_main_parts.h b/atom/browser/atom_browser_main_parts.h
index 6ca0686655..c7d688f7c3 100644
--- a/atom/browser/atom_browser_main_parts.h
+++ b/atom/browser/atom_browser_main_parts.h
@@ -8,6 +8,8 @@
 #include "base/timer/timer.h"
 #include "brightray/browser/browser_main_parts.h"
 
+class BrowserProcess;
+
 namespace atom {
 
 class AtomBindings;
@@ -41,6 +43,9 @@ class AtomBrowserMainParts : public brightray::BrowserMainParts {
   void SetDPIFromGSettings();
 #endif
 
+  // A fake BrowserProcess object that used to feed the source code from chrome.
+  scoped_ptr<BrowserProcess> fake_browser_process_;
+
   scoped_ptr<Browser> browser_;
   scoped_ptr<JavascriptEnvironment> js_env_;
   scoped_ptr<NodeBindings> node_bindings_;
diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc
index 48ea9e76c3..5404eba597 100644
--- a/atom/browser/native_window.cc
+++ b/atom/browser/native_window.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "atom/browser/atom_browser_context.h"
+#include "atom/browser/atom_browser_main_parts.h"
 #include "atom/browser/browser.h"
 #include "atom/browser/window_list.h"
 #include "atom/common/api/api_messages.h"
@@ -153,7 +154,8 @@ NativeWindow::~NativeWindow() {
 
 // static
 NativeWindow* NativeWindow::Create(const mate::Dictionary& options) {
-  content::WebContents::CreateParams create_params(AtomBrowserContext::Get());
+  auto browser_context = AtomBrowserMainParts::Get()->browser_context();
+  content::WebContents::CreateParams create_params(browser_context);
   return Create(content::WebContents::Create(create_params), options);
 }
 
diff --git a/atom/browser/net/adapter_request_job.cc b/atom/browser/net/adapter_request_job.cc
index 08331829b5..20be9a7089 100644
--- a/atom/browser/net/adapter_request_job.cc
+++ b/atom/browser/net/adapter_request_job.cc
@@ -114,16 +114,18 @@ void AdapterRequestJob::CreateFileJobAndStart(const base::FilePath& path) {
   real_job_->Start();
 }
 
-void AdapterRequestJob::CreateHttpJobAndStart(const GURL& url,
-                                              const std::string& method,
-                                              const std::string& referrer) {
+void AdapterRequestJob::CreateHttpJobAndStart(
+    AtomBrowserContext* browser_context,
+    const GURL& url,
+    const std::string& method,
+    const std::string& referrer) {
   if (!url.is_valid()) {
     CreateErrorJobAndStart(net::ERR_INVALID_URL);
     return;
   }
 
-  real_job_ = new URLRequestFetchJob(request(), network_delegate(), url,
-                                     method, referrer);
+  real_job_ = new URLRequestFetchJob(browser_context, request(),
+                                     network_delegate(), url, method, referrer);
   real_job_->Start();
 }
 
diff --git a/atom/browser/net/adapter_request_job.h b/atom/browser/net/adapter_request_job.h
index d5e814d214..6aff376f30 100644
--- a/atom/browser/net/adapter_request_job.h
+++ b/atom/browser/net/adapter_request_job.h
@@ -20,6 +20,8 @@ class FilePath;
 
 namespace atom {
 
+class AtomBrowserContext;
+
 // Ask JS which type of job it wants, and then delegate corresponding methods.
 class AdapterRequestJob : public net::URLRequestJob {
  public:
@@ -59,7 +61,8 @@ class AdapterRequestJob : public net::URLRequestJob {
                                const std::string& charset,
                                scoped_refptr<base::RefCountedBytes> data);
   void CreateFileJobAndStart(const base::FilePath& path);
-  void CreateHttpJobAndStart(const GURL& url,
+  void CreateHttpJobAndStart(AtomBrowserContext* browser_context,
+                             const GURL& url,
                              const std::string& method,
                              const std::string& referrer);
   void CreateJobFromProtocolHandlerAndStart();
diff --git a/atom/browser/net/url_request_fetch_job.cc b/atom/browser/net/url_request_fetch_job.cc
index f77379aed6..e353ff1708 100644
--- a/atom/browser/net/url_request_fetch_job.cc
+++ b/atom/browser/net/url_request_fetch_job.cc
@@ -74,6 +74,7 @@ class ResponsePiper : public net::URLFetcherResponseWriter {
 }  // namespace
 
 URLRequestFetchJob::URLRequestFetchJob(
+    AtomBrowserContext* browser_context,
     net::URLRequest* request,
     net::NetworkDelegate* network_delegate,
     const GURL& url,
@@ -89,8 +90,7 @@ URLRequestFetchJob::URLRequestFetchJob(
     request_type = GetRequestType(method);
 
   fetcher_.reset(net::URLFetcher::Create(url, request_type, this));
-  auto context = AtomBrowserContext::Get()->url_request_context_getter();
-  fetcher_->SetRequestContext(context);
+  fetcher_->SetRequestContext(browser_context->url_request_context_getter());
   fetcher_->SaveResponseWithWriter(make_scoped_ptr(new ResponsePiper(this)));
 
   // Use |request|'s referrer if |referrer| is not specified.
diff --git a/atom/browser/net/url_request_fetch_job.h b/atom/browser/net/url_request_fetch_job.h
index 7975aa715e..d598e32236 100644
--- a/atom/browser/net/url_request_fetch_job.h
+++ b/atom/browser/net/url_request_fetch_job.h
@@ -12,10 +12,13 @@
 
 namespace atom {
 
+class AtomBrowserContext;
+
 class URLRequestFetchJob : public net::URLRequestJob,
                            public net::URLFetcherDelegate {
  public:
-  URLRequestFetchJob(net::URLRequest* request,
+  URLRequestFetchJob(AtomBrowserContext* browser_context,
+                     net::URLRequest* request,
                      net::NetworkDelegate* network_delegate,
                      const GURL& url,
                      const std::string& method,