diff --git a/.DEPS.git b/.DEPS.git
index de7fe08..acce559 100644
--- a/.DEPS.git
+++ b/.DEPS.git
@@ -11,7 +11,7 @@
     'git_url':
          'https://chromium.googlesource.com',
     'webkit_rev':
-         '@224e93089f131d160474b7de59b6d2b2b23e01dd'
+         '@88c9a95505973e4bc340d847a42caaae3e709774'
 }
 
 deps = {
@@ -98,11 +98,11 @@
     'src/third_party/sfntly/cpp/src':
         Var('git_url') + '/external/sfntly/cpp/src.git@cfb2f1743f0169ad8d01035458617bce97107539',
     'src/third_party/skia/gyp':
-        Var('git_url') + '/external/skia/gyp.git@67b4c8c19afc9520f1d3a3decd4f012c50c32d0f',
+        Var('git_url') + '/external/skia/gyp.git@dccf47acbdb65e21ed989fa3f45e638caffa6ce6',
     'src/third_party/skia/include':
-        Var('git_url') + '/external/skia/include.git@35fdbf8a5dd166a876e7fd81d55adc49343f1bf5',
+        Var('git_url') + '/external/skia/include.git@970ef2af6ab2e1d6554207e3f66cce934cd091d5',
     'src/third_party/skia/src':
-        Var('git_url') + '/external/skia/src.git@3e45b0d5d63c5b8623679a2fb937d8f27d271699',
+        Var('git_url') + '/external/skia/src.git@d2da8bcbed4791ae93c3070c50e89865b6398e10',
     'src/third_party/smhasher/src':
         Var('git_url') + '/external/smhasher.git@6f63a4882e6b2cf87e8eec1a3ef8644e0d963283',
     'src/third_party/snappy/src':
@@ -136,7 +136,7 @@
     'src/tools/swarm_client':
         Var('git_url') + '/chromium/tools/swarm_client.git@86681e9a54c88972dba217b4f1007222dd8936a4',
     'src/v8':
-        Var('git_url') + '/external/v8.git@307dd6ea3b729c8058ada645b42a1cf083c92128',
+        Var('git_url') + '/external/v8.git@54d8a9855f2c6a6c3c33b5b66cbfbbac2cbcaa00',
     'src/webkit/renderer/media/crypto/ppapi/cdm':
         Var('git_url') + '/chromium/cdm.git@c2b192a02546916d28233cfd8b7717ffcdcc8347',
 }
@@ -341,7 +341,7 @@
         'src/third_party/swig/win':
             Var('git_url') + '/chromium/deps/swig/win.git@986f013ba518541adf5c839811efb35630a31031',
         'src/third_party/syzygy/binaries':
-            Var('git_url') + '/external/sawbuck/syzygy/binaries.git@bcae0722f0e45aa098e7d2eee350234749efba8f',
+            Var('git_url') + '/external/sawbuck/syzygy/binaries.git@d25845b9eb9b5e2b42e60e8dadcfc711987ebd18',
         'src/third_party/xulrunner-sdk':
             Var('git_url') + '/chromium/deps/xulrunner-sdk.git@e9b241c183fa4e7af838ecd70714069ca0eb150c',
         'src/third_party/yasm/binaries':
diff --git a/DEPS b/DEPS
index f66cd70..7798439 100644
--- a/DEPS
+++ b/DEPS
@@ -8,9 +8,10 @@
   "sourceforge_url": "http://svn.code.sf.net/p/%(repo)s/code",
   "webkit_trunk": "http://src.chromium.org/blink/trunk",
   "nacl_trunk": "http://src.chromium.org/native_client/trunk",
-  "webkit_revision": "155634",
+  "webkit_revision": "155688",
   "chromium_git": "https://chromium.googlesource.com",
   "chromiumos_git": "https://chromium.googlesource.com/chromiumos",
+  "skia_git": "https://skia.googlesource.com",
   "swig_revision": "69281",
   "nacl_revision": "11930",
   # After changing nacl_revision, run 'glient sync' and check native_client/DEPS
@@ -28,11 +29,12 @@
   "ffmpeg_hash": "894e6f715645528e815aee2dad45b59704238dcd",
 
   "sfntly_revision": "134",
-  "skia_revision": "10553",
+  "skia_revision": "10602",
+  "skia_hash": "6d04e64f56b658635eeb46fcdb02188ce54f1567",
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and V8 without interference from each other.
-  "v8_revision": "16065",
+  "v8_revision": "16104",
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling WebRTC
   # and V8 without interference from each other.
@@ -312,7 +314,7 @@
     # Binary level profile guided optimizations. This points to the
     # latest release binaries for the toolchain.
     "src/third_party/syzygy/binaries":
-      (Var("googlecode_url") % "sawbuck") + "/trunk/syzygy/binaries@1689",
+      (Var("googlecode_url") % "sawbuck") + "/trunk/syzygy/binaries@1718",
 
     # Binaries for nacl sdk.
     "src/third_party/nacl_sdk_binaries":
diff --git a/android_webview/android_webview.gyp b/android_webview/android_webview.gyp
index c2f23a3..237712a 100644
--- a/android_webview/android_webview.gyp
+++ b/android_webview/android_webview.gyp
@@ -111,6 +111,8 @@
         'browser/aw_download_manager_delegate.h',
         'browser/aw_form_database_service.cc',
         'browser/aw_form_database_service.h',
+        'browser/aw_gl_surface.cc',
+        'browser/aw_gl_surface.h',
         'browser/aw_http_auth_handler_base.cc',
         'browser/aw_http_auth_handler_base.h',
         'browser/aw_javascript_dialog_manager.cc',
diff --git a/android_webview/android_webview_common.target.darwin-arm.mk b/android_webview/android_webview_common.target.darwin-arm.mk
index 57a845e..5e3624e 100644
--- a/android_webview/android_webview_common.target.darwin-arm.mk
+++ b/android_webview/android_webview_common.target.darwin-arm.mk
@@ -35,6 +35,7 @@
 	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
+	android_webview/browser/aw_gl_surface.cc \
 	android_webview/browser/aw_http_auth_handler_base.cc \
 	android_webview/browser/aw_javascript_dialog_manager.cc \
 	android_webview/browser/aw_login_delegate.cc \
diff --git a/android_webview/android_webview_common.target.darwin-mips.mk b/android_webview/android_webview_common.target.darwin-mips.mk
index 4c6073b..c775bc5 100644
--- a/android_webview/android_webview_common.target.darwin-mips.mk
+++ b/android_webview/android_webview_common.target.darwin-mips.mk
@@ -35,6 +35,7 @@
 	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
+	android_webview/browser/aw_gl_surface.cc \
 	android_webview/browser/aw_http_auth_handler_base.cc \
 	android_webview/browser/aw_javascript_dialog_manager.cc \
 	android_webview/browser/aw_login_delegate.cc \
diff --git a/android_webview/android_webview_common.target.darwin-x86.mk b/android_webview/android_webview_common.target.darwin-x86.mk
index 0d4f41d..0044f93 100644
--- a/android_webview/android_webview_common.target.darwin-x86.mk
+++ b/android_webview/android_webview_common.target.darwin-x86.mk
@@ -35,6 +35,7 @@
 	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
+	android_webview/browser/aw_gl_surface.cc \
 	android_webview/browser/aw_http_auth_handler_base.cc \
 	android_webview/browser/aw_javascript_dialog_manager.cc \
 	android_webview/browser/aw_login_delegate.cc \
diff --git a/android_webview/android_webview_common.target.linux-arm.mk b/android_webview/android_webview_common.target.linux-arm.mk
index 57a845e..5e3624e 100644
--- a/android_webview/android_webview_common.target.linux-arm.mk
+++ b/android_webview/android_webview_common.target.linux-arm.mk
@@ -35,6 +35,7 @@
 	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
+	android_webview/browser/aw_gl_surface.cc \
 	android_webview/browser/aw_http_auth_handler_base.cc \
 	android_webview/browser/aw_javascript_dialog_manager.cc \
 	android_webview/browser/aw_login_delegate.cc \
diff --git a/android_webview/android_webview_common.target.linux-mips.mk b/android_webview/android_webview_common.target.linux-mips.mk
index 4c6073b..c775bc5 100644
--- a/android_webview/android_webview_common.target.linux-mips.mk
+++ b/android_webview/android_webview_common.target.linux-mips.mk
@@ -35,6 +35,7 @@
 	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
+	android_webview/browser/aw_gl_surface.cc \
 	android_webview/browser/aw_http_auth_handler_base.cc \
 	android_webview/browser/aw_javascript_dialog_manager.cc \
 	android_webview/browser/aw_login_delegate.cc \
diff --git a/android_webview/android_webview_common.target.linux-x86.mk b/android_webview/android_webview_common.target.linux-x86.mk
index 0d4f41d..0044f93 100644
--- a/android_webview/android_webview_common.target.linux-x86.mk
+++ b/android_webview/android_webview_common.target.linux-x86.mk
@@ -35,6 +35,7 @@
 	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
+	android_webview/browser/aw_gl_surface.cc \
 	android_webview/browser/aw_http_auth_handler_base.cc \
 	android_webview/browser/aw_javascript_dialog_manager.cc \
 	android_webview/browser/aw_login_delegate.cc \
diff --git a/android_webview/browser/aw_gl_surface.cc b/android_webview/browser/aw_gl_surface.cc
new file mode 100644
index 0000000..5ff9272
--- /dev/null
+++ b/android_webview/browser/aw_gl_surface.cc
@@ -0,0 +1,48 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "android_webview/browser/aw_gl_surface.h"
+
+namespace android_webview {
+
+AwGLSurface::AwGLSurface() : fbo_(0) {}
+
+AwGLSurface::~AwGLSurface() {}
+
+void AwGLSurface::Destroy() {
+}
+
+bool AwGLSurface::IsOffscreen() {
+  return false;
+}
+
+unsigned int AwGLSurface::GetBackingFrameBufferObject() {
+  return fbo_;
+}
+
+bool AwGLSurface::SwapBuffers() {
+  return true;
+}
+
+gfx::Size AwGLSurface::GetSize() {
+  return gfx::Size(1, 1);
+}
+
+void* AwGLSurface::GetHandle() {
+  return NULL;
+}
+
+void* AwGLSurface::GetDisplay() {
+  return NULL;
+}
+
+void AwGLSurface::SetBackingFrameBufferObject(unsigned int fbo) {
+  fbo_ = fbo;
+}
+
+void AwGLSurface::ResetBackingFrameBufferObject() {
+  fbo_ = 0;
+}
+
+}  // namespace android_webview
diff --git a/android_webview/browser/aw_gl_surface.h b/android_webview/browser/aw_gl_surface.h
new file mode 100644
index 0000000..99b8a1d
--- /dev/null
+++ b/android_webview/browser/aw_gl_surface.h
@@ -0,0 +1,42 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ANDROID_WEBVIEW_BROWSER_AW_GL_SURFACE_H_
+#define ANDROID_WEBVIEW_BROWSER_AW_GL_SURFACE_H_
+
+#include "ui/gl/gl_surface.h"
+
+namespace android_webview {
+
+// This surface is used to represent the underlying surface provided by the App
+// inside a hardware draw. Note that offscreen contexts will not be using this
+// GLSurface.
+class GL_EXPORT AwGLSurface : public gfx::GLSurface {
+ public:
+  AwGLSurface();
+
+  // Implement GLSurface.
+  virtual void Destroy() OVERRIDE;
+  virtual bool IsOffscreen() OVERRIDE;
+  virtual unsigned int GetBackingFrameBufferObject() OVERRIDE;
+  virtual bool SwapBuffers() OVERRIDE;
+  virtual gfx::Size GetSize() OVERRIDE;
+  virtual void* GetHandle() OVERRIDE;
+  virtual void* GetDisplay() OVERRIDE;
+
+  void SetBackingFrameBufferObject(unsigned int fbo);
+  void ResetBackingFrameBufferObject();
+
+ protected:
+  virtual ~AwGLSurface();
+
+ private:
+  unsigned int fbo_;
+
+  DISALLOW_COPY_AND_ASSIGN(AwGLSurface);
+};
+
+}  // namespace android_webview
+
+#endif  // ANDROID_WEBVIEW_BROWSER_AW_GL_SURFACE_H_
diff --git a/android_webview/browser/in_process_view_renderer.cc b/android_webview/browser/in_process_view_renderer.cc
index a714956..3e25680 100644
--- a/android_webview/browser/in_process_view_renderer.cc
+++ b/android_webview/browser/in_process_view_renderer.cc
@@ -6,6 +6,7 @@
 
 #include <android/bitmap.h>
 
+#include "android_webview/browser/aw_gl_surface.h"
 #include "android_webview/browser/scoped_app_gl_state_restore.h"
 #include "android_webview/common/aw_switches.h"
 #include "android_webview/public/browser/draw_gl.h"
@@ -289,6 +290,19 @@
   return result;
 }
 
+bool InProcessViewRenderer::InitializeHwDraw() {
+  TRACE_EVENT0("android_webview", "InitializeHwDraw");
+  DCHECK(!gl_surface_);
+  gl_surface_  = new AwGLSurface;
+  hardware_failed_ = !compositor_->InitializeHwDraw(gl_surface_);
+  hardware_initialized_ = true;
+
+  if (hardware_failed_)
+    gl_surface_ = NULL;
+
+  return !hardware_failed_;
+}
+
 void InProcessViewRenderer::DrawGL(AwDrawGLInfo* draw_info) {
   TRACE_EVENT0("android_webview", "InProcessViewRenderer::DrawGL");
   DCHECK(visible_);
@@ -309,13 +323,11 @@
   ScopedAllowGL allow_gl;
 
   if (attached_to_window_ && compositor_ && !hardware_initialized_) {
-    TRACE_EVENT0("android_webview", "InitializeHwDraw");
-    hardware_failed_ = !compositor_->InitializeHwDraw();
-    hardware_initialized_ = true;
-    last_egl_context_ = current_context;
-
-    if (hardware_failed_)
+    if (InitializeHwDraw()) {
+      last_egl_context_ = current_context;
+    } else {
       return;
+    }
   }
 
   if (draw_info->mode == AwDrawGLInfo::kModeProcess)
@@ -330,7 +342,6 @@
     TRACE_EVENT_INSTANT0(
         "android_webview", "EGLContextChanged", TRACE_EVENT_SCOPE_THREAD);
   }
-  last_egl_context_ = current_context;
 
   if (!compositor_) {
     TRACE_EVENT_INSTANT0(
@@ -338,21 +349,26 @@
     return;
   }
 
+  DCHECK(gl_surface_);
+  gl_surface_->SetBackingFrameBufferObject(
+      state_restore.framebuffer_binding_ext());
+
   gfx::Transform transform;
   transform.matrix().setColMajorf(draw_info->transform);
   transform.Translate(scroll_at_start_of_frame_.x(),
                       scroll_at_start_of_frame_.y());
-  // TODO(joth): Check return value.
-  block_invalidates_ = true;
   gfx::Rect clip_rect(draw_info->clip_left,
                       draw_info->clip_top,
                       draw_info->clip_right - draw_info->clip_left,
                       draw_info->clip_bottom - draw_info->clip_top);
+  block_invalidates_ = true;
+  // TODO(joth): Check return value.
   compositor_->DemandDrawHw(gfx::Size(draw_info->width, draw_info->height),
                             transform,
                             clip_rect,
                             state_restore.stencil_enabled());
   block_invalidates_ = false;
+  gl_surface_->ResetBackingFrameBufferObject();
 
   UpdateCachedGlobalVisibleRect();
   bool drew_full_visible_rect = clip_rect.Contains(cached_global_visible_rect_);
@@ -554,6 +570,7 @@
     hardware_initialized_ = false;
   }
 
+  gl_surface_ = NULL;
   attached_to_window_ = false;
 }
 
diff --git a/android_webview/browser/in_process_view_renderer.h b/android_webview/browser/in_process_view_renderer.h
index 6e66a84..8bb2c60 100644
--- a/android_webview/browser/in_process_view_renderer.h
+++ b/android_webview/browser/in_process_view_renderer.h
@@ -23,6 +23,8 @@
 
 namespace android_webview {
 
+class AwGLSurface;
+
 // Provides RenderViewHost wrapper functionality for sending WebView-specific
 // IPC messages to the renderer and from there to WebKit.
 class InProcessViewRenderer : public BrowserViewRenderer,
@@ -93,6 +95,8 @@
 
   void NoLongerExpectsDrawGL();
 
+  bool InitializeHwDraw();
+
   // For debug tracing or logging. Return the string representation of this
   // view renderer's state and the |draw_info| if provided.
   std::string ToString(AwDrawGLInfo* draw_info) const;
@@ -127,6 +131,7 @@
   bool attached_to_window_;
   bool hardware_initialized_;
   bool hardware_failed_;
+  scoped_refptr<AwGLSurface> gl_surface_;
 
   // Used only for detecting Android View System context changes.
   // Not to be used between draw calls.
diff --git a/android_webview/browser/scoped_app_gl_state_restore.cc b/android_webview/browser/scoped_app_gl_state_restore.cc
index cb8d128..e0c8fed 100644
--- a/android_webview/browser/scoped_app_gl_state_restore.cc
+++ b/android_webview/browser/scoped_app_gl_state_restore.cc
@@ -132,6 +132,7 @@
   glGetIntegerv(GL_STENCIL_VALUE_MASK, &stencil_mask_);
   glGetIntegerv(GL_STENCIL_REF, &stencil_ref_);
 
+  glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &framebuffer_binding_ext_);
 
   if (!g_gl_max_texture_units) {
     glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &g_gl_max_texture_units);
@@ -155,6 +156,7 @@
   TRACE_EVENT0("android_webview", "AppGLStateRestore");
   MakeAppContextCurrent();
 
+  glBindFramebufferEXT(GL_FRAMEBUFFER, framebuffer_binding_ext_);
   glBindBuffer(GL_ARRAY_BUFFER, vertex_array_buffer_binding_);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_array_buffer_binding_);
 
diff --git a/android_webview/browser/scoped_app_gl_state_restore.h b/android_webview/browser/scoped_app_gl_state_restore.h
index 7840fbf..93b5ad5 100644
--- a/android_webview/browser/scoped_app_gl_state_restore.h
+++ b/android_webview/browser/scoped_app_gl_state_restore.h
@@ -25,6 +25,7 @@
   ~ScopedAppGLStateRestore();
 
   bool stencil_enabled() const { return stencil_test_; }
+  GLint framebuffer_binding_ext() const { return framebuffer_binding_ext_; }
 
  private:
   const CallMode mode_;
@@ -83,6 +84,8 @@
   GLint stencil_mask_;
   GLint stencil_ref_;
 
+  GLint framebuffer_binding_ext_;
+
   struct TextureBindings {
     GLint texture_2d;
     GLint texture_cube_map;
diff --git a/android_webview/native/aw_autofill_manager_delegate.cc b/android_webview/native/aw_autofill_manager_delegate.cc
index 3791122..37640cb 100644
--- a/android_webview/native/aw_autofill_manager_delegate.cc
+++ b/android_webview/native/aw_autofill_manager_delegate.cc
@@ -187,11 +187,12 @@
   NOTIMPLEMENTED();
 }
 
-void AwAutofillManagerDelegate::ShowAutocheckoutBubble(
+bool AwAutofillManagerDelegate::ShowAutocheckoutBubble(
     const gfx::RectF& bounding_box,
     bool is_google_user,
     const base::Callback<void(autofill::AutocheckoutBubbleState)>& callback) {
   NOTIMPLEMENTED();
+  return false;
 }
 
 void AwAutofillManagerDelegate::HideAutocheckoutBubble() {
diff --git a/android_webview/native/aw_autofill_manager_delegate.h b/android_webview/native/aw_autofill_manager_delegate.h
index 1292ccb..b39eb70 100644
--- a/android_webview/native/aw_autofill_manager_delegate.h
+++ b/android_webview/native/aw_autofill_manager_delegate.h
@@ -73,7 +73,7 @@
       const autofill::AutofillMetrics& metric_logger,
       const autofill::CreditCard& credit_card,
       const base::Closure& save_card_callback) OVERRIDE;
-  virtual void ShowAutocheckoutBubble(
+  virtual bool ShowAutocheckoutBubble(
       const gfx::RectF& bounds,
       bool is_google_user,
       const base::Callback<void(
diff --git a/apps/DEPS b/apps/DEPS
index dbcf7e7..0100480 100644
--- a/apps/DEPS
+++ b/apps/DEPS
@@ -5,6 +5,7 @@
   "+components/user_prefs/pref_registry_syncable.h",
   "+components/web_modal",
   "+extensions",
+  "+net/base",
   "+skia/ext",
   "+third_party/skia/include",
   "+ui",
@@ -14,6 +15,7 @@
   "+chrome/browser/browser_process.h",
   "+chrome/browser/browser_shutdown.h",
   "+chrome/browser/chrome_notification_types.h",
+  "+chrome/browser/chromeos/drive",
   "+chrome/browser/extensions",
   "+chrome/browser/lifetime/application_lifetime.h",
   "+chrome/browser/profiles",
diff --git a/apps/OWNERS b/apps/OWNERS
index 8391787..ba62226 100644
--- a/apps/OWNERS
+++ b/apps/OWNERS
@@ -2,5 +2,6 @@
 asargent@chromium.org
 benwells@chromium.org
 koz@chromium.org
+mek@chromium.org
 miket@chromium.org
 tapted@chromium.org
diff --git a/apps/app_launch_for_metro_restart_win.cc b/apps/app_launch_for_metro_restart_win.cc
index 9d6cb22..2b10274 100644
--- a/apps/app_launch_for_metro_restart_win.cc
+++ b/apps/app_launch_for_metro_restart_win.cc
@@ -4,6 +4,7 @@
 
 #include "apps/app_launch_for_metro_restart_win.h"
 
+#include "apps/launcher.h"
 #include "apps/pref_names.h"
 #include "base/bind.h"
 #include "base/files/file_path.h"
@@ -14,7 +15,6 @@
 #include "chrome/browser/extensions/api/app_runtime/app_runtime_api.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_system.h"
-#include "chrome/browser/extensions/platform_app_launcher.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "win8/util/win8_util.h"
diff --git a/apps/app_load_service.cc b/apps/app_load_service.cc
index 982822e..d2423c0 100644
--- a/apps/app_load_service.cc
+++ b/apps/app_load_service.cc
@@ -5,12 +5,12 @@
 #include "apps/app_load_service.h"
 
 #include "apps/app_load_service_factory.h"
+#include "apps/launcher.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/extension_host.h"
 #include "chrome/browser/extensions/extension_prefs.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_system.h"
-#include "chrome/browser/extensions/platform_app_launcher.h"
 #include "chrome/browser/extensions/shell_window_registry.h"
 #include "chrome/browser/extensions/unpacked_installer.h"
 #include "chrome/browser/profiles/profile.h"
@@ -89,13 +89,13 @@
 
       switch (it->second.action_type) {
         case LAUNCH:
-          extensions::LaunchPlatformApp(profile_, extension);
+          LaunchPlatformApp(profile_, extension);
           break;
         case RESTART:
-          extensions::RestartPlatformApp(profile_, extension);
+          RestartPlatformApp(profile_, extension);
           break;
         case LAUNCH_WITH_COMMAND_LINE:
-          extensions::LaunchPlatformAppWithCommandLine(
+          LaunchPlatformAppWithCommandLine(
               profile_, extension, &it->second.command_line,
               it->second.current_dir);
           break;
diff --git a/apps/app_restore_service.cc b/apps/app_restore_service.cc
index 2ed8c47..e2d5a85 100644
--- a/apps/app_restore_service.cc
+++ b/apps/app_restore_service.cc
@@ -6,6 +6,7 @@
 
 #include "apps/app_lifetime_monitor_factory.h"
 #include "apps/app_restore_service_factory.h"
+#include "apps/launcher.h"
 #include "apps/saved_files_service.h"
 #include "apps/shell_window.h"
 #include "chrome/browser/chrome_notification_types.h"
@@ -14,7 +15,6 @@
 #include "chrome/browser/extensions/extension_prefs.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_system.h"
-#include "chrome/browser/extensions/platform_app_launcher.h"
 #include "chrome/common/extensions/extension.h"
 #include "chrome/common/extensions/extension_set.h"
 
@@ -138,7 +138,7 @@
 }
 
 void AppRestoreService::RestoreApp(const Extension* extension) {
-  extensions::RestartPlatformApp(profile_, extension);
+  RestartPlatformApp(profile_, extension);
 }
 
 void AppRestoreService::StartObservingAppLifetime() {
diff --git a/apps/app_restore_service_browsertest.cc b/apps/app_restore_service_browsertest.cc
index 44a6df5..c3bac8f 100644
--- a/apps/app_restore_service_browsertest.cc
+++ b/apps/app_restore_service_browsertest.cc
@@ -92,7 +92,14 @@
   ASSERT_TRUE(file_entries.empty());
 }
 
-IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, FileAccessIsRestored) {
+// Flaky: crbug.com/269613
+#if defined(OS_LINUX)
+#define MAYBE_FileAccessIsRestored DISABLED_FileAccessIsRestored
+#else
+#define MAYBE_FileAccessIsRestored FileAccessIsRestored
+#endif
+
+IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MAYBE_FileAccessIsRestored) {
   content::WindowedNotificationObserver extension_suspended(
       chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED,
       content::NotificationService::AllSources());
diff --git a/apps/apps.gypi b/apps/apps.gypi
index 2a1bc99..59f4c75 100644
--- a/apps/apps.gypi
+++ b/apps/apps.gypi
@@ -54,6 +54,8 @@
         'app_window_contents.h',
         'field_trial_names.cc',
         'field_trial_names.h',
+        'launcher.cc',
+        'launcher.h',
         'metrics_names.h',
         'native_app_window.h',
         'pref_names.cc',
@@ -72,6 +74,13 @@
         'switches.h',
       ],
       'conditions': [
+        ['chromeos==1',
+          {
+            'dependencies': [
+              'browser_chromeos',
+            ]
+          }
+        ],
         ['enable_extensions==0',
           {
             'sources/': [
diff --git a/chrome/browser/extensions/platform_app_launcher.cc b/apps/launcher.cc
similarity index 91%
rename from chrome/browser/extensions/platform_app_launcher.cc
rename to apps/launcher.cc
index 9a8dd0c..d892da6 100644
--- a/chrome/browser/extensions/platform_app_launcher.cc
+++ b/apps/launcher.cc
@@ -1,8 +1,8 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/extensions/platform_app_launcher.h"
+#include "apps/launcher.h"
 
 #include "base/command_line.h"
 #include "base/file_util.h"
@@ -23,7 +23,6 @@
 #include "chrome/browser/extensions/extension_system.h"
 #include "chrome/browser/extensions/lazy_background_task_queue.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/extensions/app_metro_infobar_delegate_win.h"
 #include "chrome/common/extensions/extension.h"
 #include "chrome/common/extensions/extension_messages.h"
 #include "content/public/browser/browser_thread.h"
@@ -31,7 +30,6 @@
 #include "content/public/browser/web_contents.h"
 #include "net/base/mime_util.h"
 #include "net/base/net_util.h"
-#include "webkit/common/fileapi/file_system_types.h"
 
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/drive/drive_integration_service.h"
@@ -50,8 +48,11 @@
 using extensions::app_file_handler_util::FirstFileHandlerForFile;
 using extensions::app_file_handler_util::CreateFileEntry;
 using extensions::app_file_handler_util::GrantedFileEntry;
+using extensions::Extension;
+using extensions::ExtensionHost;
+using extensions::ExtensionSystem;
 
-namespace extensions {
+namespace apps {
 
 namespace {
 
@@ -202,7 +203,7 @@
 
   void LaunchWithMimeType(const std::string& mime_type) {
     // Find file handler from the platform app for the file being opened.
-    const FileHandlerInfo* handler = NULL;
+    const extensions::FileHandlerInfo* handler = NULL;
     if (!handler_id_.empty())
       handler = FileHandlerForId(*extension_, handler_id_);
     else
@@ -231,7 +232,7 @@
     // available, or it might be in the process of being unloaded, in which case
     // the lazy background task queue is used to load the extension and then
     // call back to us.
-    LazyBackgroundTaskQueue* queue =
+    extensions::LazyBackgroundTaskQueue* queue =
         ExtensionSystem::Get(profile_)->lazy_background_task_queue();
     if (queue->ShouldEnqueueTask(profile_, extension_)) {
       queue->AddPendingTask(profile_, extension_->id(), base::Bind(
@@ -262,7 +263,7 @@
         host->render_process_host()->GetID(),
         file_path_,
         false);
-    AppEventRouter::DispatchOnLaunchedEventWithFileEntry(
+    extensions::AppEventRouter::DispatchOnLaunchedEventWithFileEntry(
         profile_, extension_, handler_id_, mime_type, file_entry);
   }
 
@@ -284,17 +285,6 @@
                                       const Extension* extension,
                                       const CommandLine* command_line,
                                       const base::FilePath& current_directory) {
-#if defined(OS_WIN)
-  // On Windows 8's single window Metro mode we can not launch platform apps.
-  // Offer to switch Chrome to desktop mode.
-  if (win8::IsSingleWindowMetroMode()) {
-    AppMetroInfoBarDelegateWin::Create(
-        profile, AppMetroInfoBarDelegateWin::LAUNCH_PACKAGED_APP,
-        extension->id());
-    return;
-  }
-#endif
-
   base::FilePath path;
   if (!GetAbsolutePathFromCommandLine(command_line, current_directory, &path)) {
     LaunchPlatformAppWithNoData(profile, extension);
@@ -339,22 +329,24 @@
   extensions::EventRouter* event_router =
       ExtensionSystem::Get(profile)->event_router();
   bool listening_to_restart = event_router->
-      ExtensionHasEventListener(extension->id(), event_names::kOnRestarted);
+      ExtensionHasEventListener(extension->id(),
+                                extensions::event_names::kOnRestarted);
 
   if (listening_to_restart) {
     extensions::AppEventRouter::DispatchOnRestartedEvent(profile, extension);
     return;
   }
 
-  ExtensionPrefs* extension_prefs = ExtensionSystem::Get(profile)->
+  extensions::ExtensionPrefs* extension_prefs = ExtensionSystem::Get(profile)->
       extension_service()->extension_prefs();
   bool had_windows = extension_prefs->IsActive(extension->id());
   extension_prefs->SetIsActive(extension->id(), false);
   bool listening_to_launch = event_router->
-      ExtensionHasEventListener(extension->id(), event_names::kOnLaunched);
+      ExtensionHasEventListener(extension->id(),
+                                extensions::event_names::kOnLaunched);
 
   if (listening_to_launch && had_windows)
     LaunchPlatformAppWithNoData(profile, extension);
 }
 
-}  // namespace extensions
+}  // namespace apps
diff --git a/chrome/browser/extensions/platform_app_launcher.h b/apps/launcher.h
similarity index 66%
rename from chrome/browser/extensions/platform_app_launcher.h
rename to apps/launcher.h
index 460c3e8..9412c11 100644
--- a/chrome/browser/extensions/platform_app_launcher.h
+++ b/apps/launcher.h
@@ -1,12 +1,11 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_EXTENSIONS_PLATFORM_APP_LAUNCHER_H_
-#define CHROME_BROWSER_EXTENSIONS_PLATFORM_APP_LAUNCHER_H_
+#ifndef APPS_LAUNCHER_H_
+#define APPS_LAUNCHER_H_
 
 #include <string>
-#include <vector>
 
 class CommandLine;
 class Profile;
@@ -15,41 +14,41 @@
 class FilePath;
 }
 
-namespace content {
-class WebContents;
+namespace extensions {
+class Extension;
 }
 
-namespace extensions {
-
-class Extension;
+namespace apps {
 
 // Launches the platform app |extension|. Creates appropriate launch data for
 // the |command_line| fields present. |extension| and |profile| must not be
 // NULL. A NULL |command_line| means there is no launch data. If non-empty,
 // |current_directory| is used to expand any relative paths on the command line.
 void LaunchPlatformAppWithCommandLine(Profile* profile,
-                                      const Extension* extension,
+                                      const extensions::Extension* extension,
                                       const CommandLine* command_line,
                                       const base::FilePath& current_directory);
 
 // Launches the platform app |extension| with the contents of |file_path|
 // available through the launch data.
 void LaunchPlatformAppWithPath(Profile* profile,
-                               const Extension* extension,
+                               const extensions::Extension* extension,
                                const base::FilePath& file_path);
 
 // Launches the platform app |extension| with no launch data.
-void LaunchPlatformApp(Profile* profile, const Extension* extension);
+void LaunchPlatformApp(Profile* profile,
+                       const extensions::Extension* extension);
 
 // Launches the platform app |extension| with the contents of |file_path|
 // available through the launch data.
 void LaunchPlatformAppWithFileHandler(Profile* profile,
-                                      const Extension* extension,
+                                      const extensions::Extension* extension,
                                       const std::string& handler_id,
                                       const base::FilePath& file_path);
 
-void RestartPlatformApp(Profile* profile, const Extension* extension);
+void RestartPlatformApp(Profile* profile,
+                        const extensions::Extension* extension);
 
-}  // namespace extensions
+}  // namespace apps
 
-#endif  // CHROME_BROWSER_EXTENSIONS_PLATFORM_APP_LAUNCHER_H_
+#endif  // APPS_LAUNCHER_H_
diff --git a/ash/drag_drop/drag_drop_tracker_unittest.cc b/ash/drag_drop/drag_drop_tracker_unittest.cc
index acb87a4..c0a9e91 100644
--- a/ash/drag_drop/drag_drop_tracker_unittest.cc
+++ b/ash/drag_drop/drag_drop_tracker_unittest.cc
@@ -19,7 +19,7 @@
  public:
   virtual void SetUp() OVERRIDE {
     AshTestBase::SetUp();
-    UpdateDisplay("200x200,200x200");
+    UpdateDisplay("200x200,300x300");
   }
 
   aura::Window* CreateTestWindow(const gfx::Rect& bounds) {
diff --git a/ash/launcher/launcher.cc b/ash/launcher/launcher.cc
index 03e7ff8..3dd2a14 100644
--- a/ash/launcher/launcher.cc
+++ b/ash/launcher/launcher.cc
@@ -186,4 +186,8 @@
   return launcher_view_->bounds();
 }
 
+app_list::ApplicationDragAndDropHost* Launcher::GetDragAndDropHostForAppList() {
+  return launcher_view_;
+}
+
 }  // namespace ash
diff --git a/ash/launcher/launcher.h b/ash/launcher/launcher.h
index f9bdcc0..c670801 100644
--- a/ash/launcher/launcher.h
+++ b/ash/launcher/launcher.h
@@ -13,6 +13,10 @@
 #include "ui/gfx/size.h"
 #include "ui/views/widget/widget_observer.h"
 
+namespace app_list {
+class ApplicationDragAndDropHost;
+}
+
 namespace aura {
 class Window;
 }
@@ -103,6 +107,9 @@
   void SetLauncherViewBounds(gfx::Rect bounds);
   gfx::Rect GetLauncherViewBounds() const;
 
+  // Returns ApplicationDragAndDropHost for this Launcher.
+  app_list::ApplicationDragAndDropHost* GetDragAndDropHostForAppList();
+
  private:
   // LauncherView used to display icons.
   internal::LauncherView* launcher_view_;
diff --git a/ash/launcher/launcher_view.cc b/ash/launcher/launcher_view.cc
index ea027f6..3d32892 100644
--- a/ash/launcher/launcher_view.cc
+++ b/ash/launcher/launcher_view.cc
@@ -25,7 +25,6 @@
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell_delegate.h"
 #include "base/auto_reset.h"
-#include "base/command_line.h"
 #include "base/memory/scoped_ptr.h"
 #include "grit/ash_resources.h"
 #include "grit/ash_strings.h"
@@ -1524,11 +1523,6 @@
         Shell::GetInstance()->delegate()->RecordUserMetricsAction(
             UMA_LAUNCHER_CLICK_ON_APPLIST_BUTTON);
         Shell::GetInstance()->ToggleAppList(GetWidget()->GetNativeView());
-        // By setting us as DnD recipient, the app list knows that we can
-        // handle items.
-        if (!CommandLine::ForCurrentProcess()->HasSwitch(
-                 ash::switches::kAshDisableDragAndDropAppListToLauncher))
-          Shell::GetInstance()->SetDragAndDropHostOfCurrentAppList(this);
         break;
     }
   }
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index 33e6873..6d5fb62 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -48,7 +48,9 @@
 #include "ui/aura/client/tooltip_client.h"
 #include "ui/aura/root_window.h"
 #include "ui/aura/window.h"
+#include "ui/aura/window_delegate.h"
 #include "ui/aura/window_observer.h"
+#include "ui/base/hit_test.h"
 #include "ui/base/models/menu_model.h"
 #include "ui/gfx/screen.h"
 #include "ui/keyboard/keyboard_controller.h"
@@ -137,6 +139,64 @@
   container->SetProperty(internal::kStayInSameRootWindowKey, true);
 }
 
+// A window delegate which does nothing. Used to create a window that
+// is a event target, but do nothing.
+class EmptyWindowDelegate : public aura::WindowDelegate {
+ public:
+  EmptyWindowDelegate() {}
+  virtual ~EmptyWindowDelegate() {}
+
+  // aura::WindowDelegate overrides:
+  virtual gfx::Size GetMinimumSize() const OVERRIDE {
+    return gfx::Size();
+  }
+  virtual gfx::Size GetMaximumSize() const OVERRIDE {
+    return gfx::Size();
+  }
+  virtual void OnBoundsChanged(const gfx::Rect& old_bounds,
+                               const gfx::Rect& new_bounds) OVERRIDE {
+  }
+  virtual gfx::NativeCursor GetCursor(const gfx::Point& point) OVERRIDE {
+    return gfx::kNullCursor;
+  }
+  virtual int GetNonClientComponent(
+      const gfx::Point& point) const OVERRIDE {
+    return HTNOWHERE;
+  }
+  virtual bool ShouldDescendIntoChildForEventHandling(
+      aura::Window* child,
+      const gfx::Point& location) OVERRIDE {
+    return false;
+  }
+  virtual bool CanFocus() OVERRIDE {
+    return false;
+  }
+  virtual void OnCaptureLost() OVERRIDE {
+  }
+  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
+  }
+  virtual void OnDeviceScaleFactorChanged(
+      float device_scale_factor) OVERRIDE {
+  }
+  virtual void OnWindowDestroying() OVERRIDE {}
+  virtual void OnWindowDestroyed() OVERRIDE {
+    delete this;
+  }
+  virtual void OnWindowTargetVisibilityChanged(bool visible) OVERRIDE {
+  }
+  virtual bool HasHitTestMask() const OVERRIDE {
+    return false;
+  }
+  virtual void GetHitTestMask(gfx::Path* mask) const OVERRIDE {}
+  virtual scoped_refptr<ui::Texture> CopyTexture() OVERRIDE {
+    NOTREACHED();
+    return scoped_refptr<ui::Texture>();
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(EmptyWindowDelegate);
+};
+
 }  // namespace
 
 namespace internal {
@@ -278,6 +338,8 @@
 
 void RootWindowController::UpdateAfterLoginStatusChange(
     user::LoginStatus status) {
+  if (status != user::LOGGED_IN_NONE)
+    mouse_event_target_.reset();
   if (shelf_->status_area_widget())
     shelf_->status_area_widget()->UpdateAfterLoginStatusChange(status);
 }
@@ -316,6 +378,8 @@
 }
 
 void RootWindowController::CloseChildWindows() {
+  mouse_event_target_.reset();
+
   if (!shelf_.get())
     return;
   // panel_layout_manager_ needs to be shut down before windows are destroyed.
@@ -460,6 +524,19 @@
   shelf_.reset(new ShelfWidget(
       shelf_container, status_container, workspace_controller()));
 
+  if (!Shell::GetInstance()->session_state_delegate()->
+      IsActiveUserSessionStarted()) {
+    // This window exists only to be a event target on login screen.
+    // It does not have to handle events, nor be visible.
+    mouse_event_target_.reset(new aura::Window(new EmptyWindowDelegate));
+    mouse_event_target_->Init(ui::LAYER_NOT_DRAWN);
+
+    aura::Window* lock_background_container =
+        GetContainer(internal::kShellWindowId_LockScreenBackgroundContainer);
+    lock_background_container->AddChild(mouse_event_target_.get());
+    mouse_event_target_->Show();
+  }
+
   // Create Docked windows layout manager
   aura::Window* docked_container = GetContainer(
       internal::kShellWindowId_DockedContainer);
diff --git a/ash/root_window_controller.h b/ash/root_window_controller.h
index 05ab29f..bbf29ce 100644
--- a/ash/root_window_controller.h
+++ b/ash/root_window_controller.h
@@ -241,6 +241,13 @@
   // The shelf for managing the launcher and the status widget.
   scoped_ptr<ShelfWidget> shelf_;
 
+  // An invisible/empty window used as a event target for
+  // |MouseCursorEventFilter| before a user logs in.
+  // (crbug.com/266987)
+  // Its container is |LockScreenBackgroundContainer| and
+  // this must be deleted before the container is deleted.
+  scoped_ptr<aura::Window> mouse_event_target_;
+
   // Manages layout of docked windows. Owned by DockedContainer.
   DockedWindowLayoutManager* docked_layout_manager_;
 
diff --git a/ash/root_window_controller_unittest.cc b/ash/root_window_controller_unittest.cc
index b27cc52..0d40125 100644
--- a/ash/root_window_controller_unittest.cc
+++ b/ash/root_window_controller_unittest.cc
@@ -473,5 +473,24 @@
   }
 }
 
+typedef test::NoSessionAshTestBase NoSessionRootWindowControllerTest;
+
+// Make sure that an event handler exists for entire display area.
+TEST_F(NoSessionRootWindowControllerTest, Event) {
+  aura::RootWindow* root = Shell::GetPrimaryRootWindow();
+  const gfx::Size size = root->bounds().size();
+  aura::Window* event_target = root->GetEventHandlerForPoint(gfx::Point(0, 0));
+  EXPECT_TRUE(event_target);
+  EXPECT_EQ(event_target,
+            root->GetEventHandlerForPoint(gfx::Point(0, size.height() - 1)));
+  EXPECT_EQ(event_target,
+            root->GetEventHandlerForPoint(gfx::Point(size.width() - 1, 0)));
+  EXPECT_EQ(event_target,
+            root->GetEventHandlerForPoint(gfx::Point(0, size.height() - 1)));
+  EXPECT_EQ(event_target,
+            root->GetEventHandlerForPoint(
+                gfx::Point(size.width() - 1, size.height() - 1)));
+}
+
 }  // namespace test
 }  // namespace ash
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index 82f2b20..c0e5f77 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -60,6 +60,18 @@
 // keep the shelf from hiding.
 const int kNotificationBubbleGapHeight = 6;
 
+// The maximum size of the region on the display opposing the shelf managed by
+// this ShelfLayoutManager which can trigger showing the shelf.
+// For instance:
+// - Primary display is left of secondary display.
+// - Shelf is left aligned
+// - This ShelfLayoutManager manages the shelf for the secondary display.
+// |kMaxAutoHideShowShelfRegionSize| refers to the maximum size of the region
+// from the right edge of the primary display which can trigger showing the
+// auto hidden shelf. The region is used to make it easier to trigger showing
+// the auto hidden shelf when the shelf is on the boundary between displays.
+const int kMaxAutoHideShowShelfRegionSize = 10;
+
 ui::Layer* GetLayer(views::Widget* widget) {
   return widget->GetNativeView()->layer();
 }
@@ -187,6 +199,7 @@
       shelf_(shelf),
       workspace_controller_(NULL),
       window_overlaps_shelf_(false),
+      mouse_over_shelf_when_auto_hide_timer_started_(false),
       bezel_event_filter_(new ShelfBezelEventFilter(this)),
       gesture_drag_status_(GESTURE_DRAG_NONE),
       gesture_drag_amount_(0.f),
@@ -332,14 +345,18 @@
       // Hides happen immediately.
       SetState(state_.visibility_state);
     } else {
-      auto_hide_timer_.Stop();
+      if (!auto_hide_timer_.IsRunning()) {
+        mouse_over_shelf_when_auto_hide_timer_started_ =
+            shelf_->GetWindowBoundsInScreen().Contains(
+                Shell::GetScreen()->GetCursorScreenPoint());
+      }
       auto_hide_timer_.Start(
           FROM_HERE,
           base::TimeDelta::FromMilliseconds(kAutoHideDelayMS),
           this, &ShelfLayoutManager::UpdateAutoHideStateNow);
     }
   } else {
-    auto_hide_timer_.Stop();
+    StopAutoHideTimer();
   }
 }
 
@@ -575,7 +592,7 @@
     auto_hide_event_filter_.reset(NULL);
   }
 
-  auto_hide_timer_.Stop();
+  StopAutoHideTimer();
 
   // The transition of background from auto-hide to visible is janky if the
   // transition also cause the shelf's slide animation from the bottom edge.
@@ -889,6 +906,34 @@
 
 void ShelfLayoutManager::UpdateAutoHideStateNow() {
   SetState(state_.visibility_state);
+
+  // If the state did not change, the auto hide timer may still be running.
+  StopAutoHideTimer();
+}
+
+void ShelfLayoutManager::StopAutoHideTimer() {
+  auto_hide_timer_.Stop();
+  mouse_over_shelf_when_auto_hide_timer_started_ = false;
+}
+
+gfx::Rect ShelfLayoutManager::GetAutoHideShowShelfRegionInScreen() const {
+  gfx::Rect shelf_bounds_in_screen = shelf_->GetWindowBoundsInScreen();
+  gfx::Vector2d offset = SelectValueForShelfAlignment(
+      gfx::Vector2d(0, shelf_bounds_in_screen.height()),
+      gfx::Vector2d(-kMaxAutoHideShowShelfRegionSize, 0),
+      gfx::Vector2d(shelf_bounds_in_screen.width(), 0),
+      gfx::Vector2d(0, -kMaxAutoHideShowShelfRegionSize));
+
+  gfx::Rect show_shelf_region_in_screen = shelf_bounds_in_screen;
+  show_shelf_region_in_screen += offset;
+  if (IsHorizontalAlignment())
+    show_shelf_region_in_screen.set_height(kMaxAutoHideShowShelfRegionSize);
+  else
+    show_shelf_region_in_screen.set_width(kMaxAutoHideShowShelfRegionSize);
+
+  // TODO: Figure out if we need any special handling when the keyboard is
+  // visible.
+  return show_shelf_region_in_screen;
 }
 
 ShelfAutoHideState ShelfLayoutManager::CalculateAutoHideState(
@@ -936,9 +981,30 @@
                            -kNotificationBubbleGapHeight : 0);
   }
 
-  if (shelf_region.Contains(Shell::GetScreen()->GetCursorScreenPoint()))
+  gfx::Point cursor_position_in_screen =
+      Shell::GetScreen()->GetCursorScreenPoint();
+  if (shelf_region.Contains(cursor_position_in_screen))
     return SHELF_AUTO_HIDE_SHOWN;
 
+  // When the shelf is auto hidden and the shelf is on the boundary between two
+  // displays, it is hard to trigger showing the shelf. For instance, if a
+  // user's primary display is left of their secondary display, it is hard to
+  // unautohide a left aligned shelf on the secondary display.
+  // It is hard because:
+  // - It is hard to stop the cursor in the shelf "light bar" and not overshoot.
+  // - The cursor is warped to the other display if the cursor gets to the edge
+  //   of the display.
+  // Show the shelf if the cursor started on the shelf and the user overshot the
+  // shelf slightly to make it easier to show the shelf in this situation. We
+  // do not check |auto_hide_timer_|.IsRunning() because it returns false when
+  // the timer's task is running.
+  if ((state_.auto_hide_state == SHELF_AUTO_HIDE_SHOWN ||
+       mouse_over_shelf_when_auto_hide_timer_started_) &&
+      GetAutoHideShowShelfRegionInScreen().Contains(
+          cursor_position_in_screen)) {
+    return SHELF_AUTO_HIDE_SHOWN;
+  }
+
   const std::vector<aura::Window*> windows =
       ash::MruWindowTracker::BuildWindowList(false);
 
diff --git a/ash/shelf/shelf_layout_manager.h b/ash/shelf/shelf_layout_manager.h
index ce69366..467fe1a 100644
--- a/ash/shelf/shelf_layout_manager.h
+++ b/ash/shelf/shelf_layout_manager.h
@@ -277,6 +277,16 @@
   // Updates the auto hide state immediately.
   void UpdateAutoHideStateNow();
 
+  // Stops the auto hide timer and clears
+  // |mouse_over_shelf_when_auto_hide_timer_started_|.
+  void StopAutoHideTimer();
+
+  // Returns the bounds of an additional region which can trigger showing the
+  // shelf. This region exists to make it easier to trigger showing the shelf
+  // when the shelf is auto hidden and the shelf is on the boundary between
+  // two displays.
+  gfx::Rect GetAutoHideShowShelfRegionInScreen() const;
+
   // Returns the AutoHideState. This value is determined from the launcher and
   // tray.
   ShelfAutoHideState CalculateAutoHideState(
@@ -330,6 +340,10 @@
 
   base::OneShotTimer<ShelfLayoutManager> auto_hide_timer_;
 
+  // Whether the mouse was over the shelf when the auto hide timer started.
+  // False when neither the auto hide timer nor the timer task are running.
+  bool mouse_over_shelf_when_auto_hide_timer_started_;
+
   // EventFilter used to detect when user moves the mouse over the launcher to
   // trigger showing the launcher.
   scoped_ptr<AutoHideEventFilter> auto_hide_event_filter_;
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc
index 0a82ceb..2781e6c 100644
--- a/ash/shelf/shelf_layout_manager_unittest.cc
+++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -7,6 +7,7 @@
 #include "ash/accelerators/accelerator_controller.h"
 #include "ash/accelerators/accelerator_table.h"
 #include "ash/ash_switches.h"
+#include "ash/display/display_controller.h"
 #include "ash/display/display_manager.h"
 #include "ash/focus_cycler.h"
 #include "ash/launcher/launcher.h"
@@ -777,6 +778,99 @@
   EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
 }
 
+// Test the behavior of the shelf when it is auto hidden and it is on the
+// boundary between the primary and the secondary display.
+TEST_F(ShelfLayoutManagerTest, AutoHideShelfOnScreenBoundary) {
+  if (!SupportsMultipleDisplays())
+    return;
+
+  UpdateDisplay("800x600,800x600");
+  DisplayLayout display_layout(DisplayLayout::RIGHT, 0);
+  Shell::GetInstance()->display_controller()->SetLayoutForCurrentDisplays(
+      display_layout);
+  // Put the primary monitor's shelf on the display boundary.
+  ShelfLayoutManager* shelf = GetShelfLayoutManager();
+  shelf->SetAlignment(SHELF_ALIGNMENT_RIGHT);
+
+  // Create a window because the shelf is always shown when no windows are
+  // visible.
+  CreateTestWidget();
+
+  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
+  ASSERT_EQ(root_windows[0],
+            GetShelfWidget()->GetNativeWindow()->GetRootWindow());
+
+  shelf->SetAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
+  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
+
+  int right_edge = root_windows[0]->GetBoundsInScreen().right() - 1;
+  int y = root_windows[0]->GetBoundsInScreen().y();
+
+  // Start off the mouse nowhere near the shelf; the shelf should be hidden.
+  aura::test::EventGenerator& generator(GetEventGenerator());
+  generator.MoveMouseTo(right_edge - 50, y);
+  UpdateAutoHideStateNow();
+  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
+
+  // Moving the mouse over the light bar (but not to the edge of the screen)
+  // should show the shelf.
+  generator.MoveMouseTo(right_edge - 1, y);
+  UpdateAutoHideStateNow();
+  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
+  EXPECT_EQ(right_edge - 1, Shell::GetScreen()->GetCursorScreenPoint().x());
+
+  // Moving the mouse off the light bar should hide the shelf.
+  generator.MoveMouseTo(right_edge - 50, y);
+  UpdateAutoHideStateNow();
+  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
+
+  // Moving the mouse to the right edge of the screen crossing the light bar
+  // should show the shelf despite the mouse cursor getting warped to the
+  // secondary display.
+  generator.MoveMouseTo(right_edge - 1, y);
+  generator.MoveMouseTo(right_edge, y);
+  UpdateAutoHideStateNow();
+  EXPECT_NE(right_edge - 1, Shell::GetScreen()->GetCursorScreenPoint().x());
+  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
+
+  // Hide the shelf.
+  generator.MoveMouseTo(right_edge - 50, y);
+  UpdateAutoHideStateNow();
+  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
+
+  // Moving the mouse to the right edge of the screen crossing the light bar and
+  // overshooting by a lot should keep the shelf hidden.
+  generator.MoveMouseTo(right_edge - 1, y);
+  generator.MoveMouseTo(right_edge + 50, y);
+  UpdateAutoHideStateNow();
+  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
+
+  // Moving the mouse to the right edge of the screen crossing the light bar and
+  // overshooting a bit should show the shelf.
+  generator.MoveMouseTo(right_edge - 1, y);
+  generator.MoveMouseTo(right_edge + 2, y);
+  UpdateAutoHideStateNow();
+  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
+
+  // Keeping the mouse close to the left edge of the secondary display after the
+  // shelf is shown should keep the shelf shown.
+  generator.MoveMouseTo(right_edge + 2, y + 1);
+  UpdateAutoHideStateNow();
+  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
+
+  // Moving the mouse far from the left edge of the secondary display should
+  // hide the shelf.
+  generator.MoveMouseTo(right_edge + 50, y);
+  UpdateAutoHideStateNow();
+  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
+
+  // Moving to the left edge of the secondary display without first crossing
+  // the primary display's right aligned shelf first should not show the shelf.
+  generator.MoveMouseTo(right_edge + 2, y);
+  UpdateAutoHideStateNow();
+  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
+}
+
 // Assertions around the lock screen showing.
 TEST_F(ShelfLayoutManagerTest, VisibleWhenLockScreenShowing) {
   // Since ShelfLayoutManager queries for mouse location, move the mouse so
diff --git a/ash/shell.cc b/ash/shell.cc
index c7b4b1f..1bade43 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -675,13 +675,6 @@
   app_list_controller_->SetVisible(!app_list_controller_->IsVisible(), window);
 }
 
-void Shell::SetDragAndDropHostOfCurrentAppList(
-    app_list::ApplicationDragAndDropHost* drag_and_drop_host) {
-  if (app_list_controller_.get())
-    app_list_controller_->SetDragAndDropHostOfCurrentAppList(
-        drag_and_drop_host);
-}
-
 bool Shell::GetAppListTargetVisibility() const {
   return app_list_controller_.get() &&
       app_list_controller_->GetTargetVisibility();
diff --git a/ash/shell.h b/ash/shell.h
index 237a1a8..c3adade 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -27,9 +27,6 @@
 
 class CommandLine;
 
-namespace app_list {
-class ApplicationDragAndDropHost;
-}
 namespace aura {
 class EventFilter;
 class RootWindow;
@@ -224,11 +221,6 @@
   // will be used.
   void ToggleAppList(aura::Window* anchor);
 
-  // If |drag_and_drop_host| is not NULL it will be called upon drag and drop
-  // operations outside the application list.
-  void SetDragAndDropHostOfCurrentAppList(
-      app_list::ApplicationDragAndDropHost* drag_and_drop_host);
-
   // Returns app list target visibility.
   bool GetAppListTargetVisibility() const;
 
diff --git a/ash/shell/shell_delegate_impl.cc b/ash/shell/shell_delegate_impl.cc
index 318873c..20d0a7f 100644
--- a/ash/shell/shell_delegate_impl.cc
+++ b/ash/shell/shell_delegate_impl.cc
@@ -231,16 +231,6 @@
 void ShellDelegateImpl::HandleMediaPrevTrack() {
 }
 
-base::string16 ShellDelegateImpl::GetTimeRemainingString(
-    base::TimeDelta delta) {
-  return base::string16();
-}
-
-base::string16 ShellDelegateImpl::GetTimeDurationLongString(
-    base::TimeDelta delta) {
-  return base::string16();
-}
-
 void ShellDelegateImpl::SaveScreenMagnifierScale(double scale) {
 }
 
diff --git a/ash/shell/shell_delegate_impl.h b/ash/shell/shell_delegate_impl.h
index c01b201..7a4e5d6 100644
--- a/ash/shell/shell_delegate_impl.h
+++ b/ash/shell/shell_delegate_impl.h
@@ -71,9 +71,6 @@
   virtual void HandleMediaNextTrack() OVERRIDE;
   virtual void HandleMediaPlayPause() OVERRIDE;
   virtual void HandleMediaPrevTrack() OVERRIDE;
-  virtual base::string16 GetTimeRemainingString(base::TimeDelta delta) OVERRIDE;
-  virtual base::string16 GetTimeDurationLongString(
-      base::TimeDelta delta) OVERRIDE;
   virtual void SaveScreenMagnifierScale(double scale) OVERRIDE;
   virtual double GetSavedScreenMagnifierScale() OVERRIDE;
   virtual ui::MenuModel* CreateContextMenu(
diff --git a/ash/shell_delegate.h b/ash/shell_delegate.h
index 2bf08c1..38164f2 100644
--- a/ash/shell_delegate.h
+++ b/ash/shell_delegate.h
@@ -12,7 +12,6 @@
 #include "ash/shell.h"
 #include "base/callback.h"
 #include "base/strings/string16.h"
-#include "base/time/time.h"
 
 namespace app_list {
 class AppListViewDelegate;
@@ -235,14 +234,6 @@
   // Handles the Previous Track Media shortcut key.
   virtual void HandleMediaPrevTrack() = 0;
 
-  // Produces l10n-ed text of remaining time, e.g.: "13 minutes left" or
-  // "13 Minuten links".
-  // Used, for example, to display the remaining battery life.
-  virtual base::string16 GetTimeRemainingString(base::TimeDelta delta) = 0;
-
-  // Produces l10n-ed text for time duration, e.g.: "13 minutes" or "2 hours".
-  virtual base::string16 GetTimeDurationLongString(base::TimeDelta delta) = 0;
-
   // Saves the zoom scale of the full screen magnifier.
   virtual void SaveScreenMagnifierScale(double scale) = 0;
 
diff --git a/ash/system/chromeos/audio/tray_audio.cc b/ash/system/chromeos/audio/tray_audio.cc
index 20cc1ef..6ad4362 100644
--- a/ash/system/chromeos/audio/tray_audio.cc
+++ b/ash/system/chromeos/audio/tray_audio.cc
@@ -153,12 +153,12 @@
   BarSeparator() {}
   virtual ~BarSeparator() {}
 
- private:
   // Overriden from views::View.
   virtual gfx::Size GetPreferredSize() OVERRIDE {
     return gfx::Size(kBarSeparatorWidth, kBarSeparatorHeight);
   }
 
+ private:
   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
     canvas->FillRect(gfx::Rect(width() / 2, 0, 1, height()),
                      kButtonStrokeColor);
@@ -189,12 +189,12 @@
     slider_ = new VolumeSlider(this);
     AddChildView(slider_);
 
-    device_type_ = new views::ImageView;
-    AddChildView(device_type_);
-
     bar_ = new BarSeparator;
     AddChildView(bar_);
 
+    device_type_ = new views::ImageView;
+    AddChildView(device_type_);
+
     more_ = new views::ImageView;
     more_->EnableCanvasFlippingForRTLUI(true);
     more_->SetImage(ui::ResourceBundle::GetSharedInstance().GetImageNamed(
@@ -252,15 +252,14 @@
     if (!audio_handler->GetActiveOutputDevice(&device))
       return;
     int device_icon = GetAudioDeviceIconId(device.type);
+    bar_->SetVisible(show_more);
     if (device_icon != kNoAudioDeviceIcon) {
       device_type_->SetVisible(true);
       device_type_->SetImage(
           ui::ResourceBundle::GetSharedInstance().GetImageNamed(
               device_icon).ToImageSkia());
-      bar_->SetVisible(false);
     } else {
       device_type_->SetVisible(false);
-      bar_->SetVisible(show_more);
     }
   }
 
@@ -302,24 +301,33 @@
     bounds.set_y((height() - size.height()) / 2);
     more_->SetBoundsRect(bounds);
 
-    // Layout bar_ or device_type_ at the left of the more_ button.
+    // Layout either bar_ or device_type_ at the left of the more_ button.
     views::View* view_left_to_more;
-    if (bar_->visible())
-      view_left_to_more = bar_;
-    else
+    if (device_type_->visible())
       view_left_to_more = device_type_;
-    gfx::Size bar_size = view_left_to_more->GetPreferredSize();
-    gfx::Rect bar_bounds(bar_size);
-    bar_bounds.set_x(more_->bounds().x() - bar_size.width() -
+    else
+      view_left_to_more = bar_;
+    gfx::Size view_size = view_left_to_more->GetPreferredSize();
+    gfx::Rect view_bounds(view_size);
+    view_bounds.set_x(more_->bounds().x() - view_size.width() -
                      kExtraPaddingBetweenBarAndMore);
-    bar_bounds.set_y((height() - bar_size.height()) / 2);
-    view_left_to_more->SetBoundsRect(bar_bounds);
+    view_bounds.set_y((height() - view_size.height()) / 2);
+    view_left_to_more->SetBoundsRect(view_bounds);
 
+    // Layout vertical bar next to view_left_to_more if device_type_ is visible.
+    if (device_type_->visible()) {
+      gfx::Size bar_size = bar_->GetPreferredSize();
+      gfx::Rect bar_bounds(bar_size);
+      bar_bounds.set_x(view_left_to_more->bounds().x() - bar_size.width());
+      bar_bounds.set_y((height() - bar_size.height()) / 2);
+      bar_->SetBoundsRect(bar_bounds);
+    }
 
     // Layout slider, calculate slider width.
     gfx::Rect slider_bounds = slider_->bounds();
     slider_bounds.set_width(
-        view_left_to_more->bounds().x() - kTrayPopupPaddingBetweenItems
+        bar_->bounds().x()
+        - (device_type_->visible() ? 0 : kTrayPopupPaddingBetweenItems)
         - slider_bounds.x());
     slider_->SetBoundsRect(slider_bounds);
   }
diff --git a/ash/system/chromeos/power/power_status.cc b/ash/system/chromeos/power/power_status.cc
index a9f4dbf..0283a0c 100644
--- a/ash/system/chromeos/power/power_status.cc
+++ b/ash/system/chromeos/power/power_status.cc
@@ -17,6 +17,7 @@
 #include "grit/ash_resources.h"
 #include "grit/ash_strings.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/gfx/image/image.h"
 #include "ui/gfx/image/image_skia_operations.h"
@@ -47,19 +48,15 @@
 base::string16 GetBatteryTimeAccessibilityString(int hour, int min) {
   DCHECK(hour || min);
   if (hour && !min) {
-    return Shell::GetInstance()->delegate()->GetTimeDurationLongString(
-        base::TimeDelta::FromHours(hour));
+    return ui::TimeFormat::TimeDurationLong(base::TimeDelta::FromHours(hour));
   }
   if (min && !hour) {
-    return Shell::GetInstance()->delegate()->GetTimeDurationLongString(
-        base::TimeDelta::FromMinutes(min));
+    return ui::TimeFormat::TimeDurationLong(base::TimeDelta::FromMinutes(min));
   }
   return l10n_util::GetStringFUTF16(
       IDS_ASH_STATUS_TRAY_BATTERY_TIME_ACCESSIBLE,
-      Shell::GetInstance()->delegate()->GetTimeDurationLongString(
-          base::TimeDelta::FromHours(hour)),
-      Shell::GetInstance()->delegate()->GetTimeDurationLongString(
-          base::TimeDelta::FromMinutes(min)));
+      ui::TimeFormat::TimeDurationLong(base::TimeDelta::FromHours(hour)),
+      ui::TimeFormat::TimeDurationLong(base::TimeDelta::FromMinutes(min)));
 }
 
 static PowerStatus* g_power_status = NULL;
diff --git a/ash/system/chromeos/power/power_status_view.cc b/ash/system/chromeos/power/power_status_view.cc
index a38d315..5323f5c 100644
--- a/ash/system/chromeos/power/power_status_view.cc
+++ b/ash/system/chromeos/power/power_status_view.cc
@@ -14,6 +14,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "grit/ash_strings.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/label.h"
@@ -193,13 +194,8 @@
     } else {
       // This is a low battery warning prompting the user in minutes.
       min = hour * 60 + min;
-      ShellDelegate* delegate = Shell::GetInstance()->delegate();
-      if (delegate) {
-        time_label_->SetText(delegate->GetTimeRemainingString(
-            base::TimeDelta::FromMinutes(min)));
-      } else {
-        time_label_->SetText(base::string16());
-      }
+      time_label_->SetText(ui::TimeFormat::TimeRemaining(
+          base::TimeDelta::FromMinutes(min)));
     }
   } else {
     time_label_->SetText(base::string16());
diff --git a/ash/system/chromeos/screen_security/screen_capture_tray_item.cc b/ash/system/chromeos/screen_security/screen_capture_tray_item.cc
index f375bf7..6563e4b 100644
--- a/ash/system/chromeos/screen_security/screen_capture_tray_item.cc
+++ b/ash/system/chromeos/screen_security/screen_capture_tray_item.cc
@@ -8,9 +8,19 @@
 #include "grit/ash_resources.h"
 #include "grit/ash_strings.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/message_center/message_center.h"
+#include "ui/message_center/notification.h"
+
+using message_center::Notification;
 
 namespace ash {
 namespace internal {
+namespace {
+
+const char kScreenCaptureNotificationId[] = "chrome://screen/capture";
+
+}  // namespace
 
 ScreenCaptureTrayItem::ScreenCaptureTrayItem(SystemTray* system_tray)
     : ScreenTrayItem(system_tray) {
@@ -33,7 +43,6 @@
     user::LoginStatus status) {
   set_default_view(new tray::ScreenStatusView(
       this,
-      tray::ScreenStatusView::VIEW_DEFAULT,
       IDR_AURA_UBER_TRAY_DISPLAY,
       screen_capture_status_,
       l10n_util::GetStringUTF16(
@@ -41,15 +50,27 @@
   return default_view();
 }
 
-views::View* ScreenCaptureTrayItem::CreateNotificationView(
-    user::LoginStatus status) {
-  set_notification_view(new tray::ScreenNotificationView(
-      this,
-      IDR_AURA_UBER_TRAY_DISPLAY,
+void ScreenCaptureTrayItem::CreateOrUpdateNotification() {
+  message_center::RichNotificationData data;
+  data.buttons.push_back(message_center::ButtonInfo(
+      l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SCREEN_CAPTURE_STOP)));
+  ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();
+  scoped_ptr<Notification> notification(new Notification(
+      message_center::NOTIFICATION_TYPE_SIMPLE,
+      kScreenCaptureNotificationId,
       screen_capture_status_,
-      l10n_util::GetStringUTF16(
-          IDS_ASH_STATUS_TRAY_SCREEN_CAPTURE_STOP)));
-  return notification_view();
+      base::string16() /* body is blank */,
+      resource_bundle.GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY),
+      base::string16() /* display_source */,
+      std::string() /* extension_id */,
+      data,
+      new tray::ScreenNotificationDelegate(this)));
+  notification->SetSystemPriority();
+  message_center::MessageCenter::Get()->AddNotification(notification.Pass());
+}
+
+std::string ScreenCaptureTrayItem::GetNotificationId() {
+  return kScreenCaptureNotificationId;
 }
 
 void ScreenCaptureTrayItem::OnScreenCaptureStart(
diff --git a/ash/system/chromeos/screen_security/screen_capture_tray_item.h b/ash/system/chromeos/screen_security/screen_capture_tray_item.h
index f1fb4b5..92f6c8a 100644
--- a/ash/system/chromeos/screen_security/screen_capture_tray_item.h
+++ b/ash/system/chromeos/screen_security/screen_capture_tray_item.h
@@ -22,11 +22,13 @@
   virtual ~ScreenCaptureTrayItem();
 
  private:
-  // Overridden from ScreenTrayItem.
+  // Overridden from SystemTrayItem.
   virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE;
   virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE;
-  virtual views::View* CreateNotificationView(
-      user::LoginStatus status) OVERRIDE;
+
+  // Overridden from ScreenTrayItem.
+  virtual void CreateOrUpdateNotification() OVERRIDE;
+  virtual std::string GetNotificationId() OVERRIDE;
 
   // Overridden from ScreenCaptureObserver.
   virtual void OnScreenCaptureStart(
diff --git a/ash/system/chromeos/screen_security/screen_share_tray_item.cc b/ash/system/chromeos/screen_security/screen_share_tray_item.cc
index 3e10763..18dd317 100644
--- a/ash/system/chromeos/screen_security/screen_share_tray_item.cc
+++ b/ash/system/chromeos/screen_security/screen_share_tray_item.cc
@@ -8,9 +8,19 @@
 #include "grit/ash_resources.h"
 #include "grit/ash_strings.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/message_center/message_center.h"
+#include "ui/message_center/notification.h"
+
+using message_center::Notification;
 
 namespace ash {
 namespace internal {
+namespace {
+
+const char kScreenShareNotificationId[] = "chrome://screen/share";
+
+}
 
 ScreenShareTrayItem::ScreenShareTrayItem(SystemTray* system_tray)
     : ScreenTrayItem(system_tray) {
@@ -32,7 +42,6 @@
 views::View* ScreenShareTrayItem::CreateDefaultView(user::LoginStatus status) {
   set_default_view(new tray::ScreenStatusView(
       this,
-      tray::ScreenStatusView::VIEW_DEFAULT,
       IDR_AURA_UBER_TRAY_DISPLAY,
       l10n_util::GetStringUTF16(
           IDS_ASH_STATUS_TRAY_SCREEN_SHARE_BEING_HELPED),
@@ -41,8 +50,7 @@
   return default_view();
 }
 
-views::View* ScreenShareTrayItem::CreateNotificationView(
-    user::LoginStatus status) {
+void ScreenShareTrayItem::CreateOrUpdateNotification() {
   base::string16 help_label_text;
   if (!helper_name_.empty()) {
     help_label_text = l10n_util::GetStringFUTF16(
@@ -53,13 +61,26 @@
         IDS_ASH_STATUS_TRAY_SCREEN_SHARE_BEING_HELPED);
   }
 
-  set_notification_view(new tray::ScreenNotificationView(
-      this,
-      IDR_AURA_UBER_TRAY_DISPLAY,
+  message_center::RichNotificationData data;
+  data.buttons.push_back(message_center::ButtonInfo(
+      l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SCREEN_SHARE_STOP)));
+  ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();
+  scoped_ptr<Notification> notification(new Notification(
+      message_center::NOTIFICATION_TYPE_SIMPLE,
+      kScreenShareNotificationId,
       help_label_text,
-      l10n_util::GetStringUTF16(
-          IDS_ASH_STATUS_TRAY_SCREEN_SHARE_STOP)));
-  return notification_view();
+      base::string16() /* body is blank */,
+      resource_bundle.GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY),
+      base::string16() /* display_source */,
+      std::string() /* extension_id */,
+      data,
+      new tray::ScreenNotificationDelegate(this)));
+  notification->SetSystemPriority();
+  message_center::MessageCenter::Get()->AddNotification(notification.Pass());
+}
+
+std::string ScreenShareTrayItem::GetNotificationId() {
+  return kScreenShareNotificationId;
 }
 
 void ScreenShareTrayItem::OnScreenShareStart(
diff --git a/ash/system/chromeos/screen_security/screen_share_tray_item.h b/ash/system/chromeos/screen_security/screen_share_tray_item.h
index 4624ac2..14f26e5 100644
--- a/ash/system/chromeos/screen_security/screen_share_tray_item.h
+++ b/ash/system/chromeos/screen_security/screen_share_tray_item.h
@@ -25,8 +25,10 @@
   // Overridden from SystemTrayItem.
   virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE;
   virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE;
-  virtual views::View* CreateNotificationView(
-      user::LoginStatus status) OVERRIDE;
+
+  // Overridden from ScreenTrayItem.
+  virtual void CreateOrUpdateNotification() OVERRIDE;
+  virtual std::string GetNotificationId() OVERRIDE;
 
   // Overridden from ScreenShareObserver.
   virtual void OnScreenShareStart(
diff --git a/ash/system/chromeos/screen_security/screen_tray_item.cc b/ash/system/chromeos/screen_security/screen_tray_item.cc
index 8c845e7..4b10a27 100644
--- a/ash/system/chromeos/screen_security/screen_tray_item.cc
+++ b/ash/system/chromeos/screen_security/screen_tray_item.cc
@@ -7,14 +7,12 @@
 #include "ash/system/tray/fixed_sized_image_view.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/message_center/message_center.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
 
 namespace {
-const int kStopButtonRightPaddingDefaultView = 18;
-const int kStopButtonRightPaddingNotificationView = 0;
-const int kStopButtonLeftPaddingNotificationView = 4;
-const int kVerticalPaddingScreenCaptureNotitification = 12;
+const int kStopButtonRightPadding = 18;
 }  // namespace
 
 namespace ash {
@@ -43,7 +41,6 @@
 
 // ScreenStatusView implementations.
 ScreenStatusView::ScreenStatusView(ScreenTrayItem* screen_tray_item,
-                                   ViewType view_type,
                                    int icon_id,
                                    const base::string16& label_text,
                                    const base::string16& stop_button_text)
@@ -51,7 +48,6 @@
       icon_(NULL),
       label_(NULL),
       stop_button_(NULL),
-      view_type_(view_type),
       icon_id_(icon_id),
       label_text_(label_text),
       stop_button_text_(stop_button_text) {
@@ -65,18 +61,10 @@
 void ScreenStatusView::Layout() {
   views::View::Layout();
 
-  int stop_button_right_padding =
-      view_type_ == VIEW_DEFAULT ?
-          kStopButtonRightPaddingDefaultView :
-          kStopButtonRightPaddingNotificationView;
-  int stop_button_left_padding =
-      view_type_ == VIEW_DEFAULT ?
-          kTrayPopupPaddingBetweenItems :
-          kStopButtonLeftPaddingNotificationView;
   // Give the stop button the space it requests.
   gfx::Size stop_size = stop_button_->GetPreferredSize();
   gfx::Rect stop_bounds(stop_size);
-  stop_bounds.set_x(width() - stop_size.width() - stop_button_right_padding);
+  stop_bounds.set_x(width() - stop_size.width() - kStopButtonRightPadding);
   stop_bounds.set_y((height() - stop_size.height()) / 2);
   stop_button_->SetBoundsRect(stop_bounds);
 
@@ -84,7 +72,7 @@
   if (label_->bounds().Intersects(stop_button_->bounds())) {
     gfx::Rect label_bounds = label_->bounds();
     label_bounds.set_width(
-        stop_button_->x() - stop_button_left_padding - label_->x());
+        stop_button_->x() - kTrayPopupPaddingBetweenItems - label_->x());
     label_->SetBoundsRect(label_bounds);
   }
 }
@@ -99,22 +87,13 @@
 void ScreenStatusView::CreateItems() {
   set_background(views::Background::CreateSolidBackground(kBackgroundColor));
   ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
-  if (view_type_ == VIEW_DEFAULT) {
-    SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
-                                          kTrayPopupPaddingHorizontal,
-                                          0,
-                                          kTrayPopupPaddingBetweenItems));
-    icon_ = new FixedSizedImageView(0, kTrayPopupItemHeight);
-    icon_->SetImage(bundle.GetImageNamed(icon_id_).ToImageSkia());
-    AddChildView(icon_);
-  } else {
-    SetLayoutManager(
-        new views::BoxLayout(views::BoxLayout::kHorizontal,
-                             0,
-                             kVerticalPaddingScreenCaptureNotitification,
-                             0));
-  }
-
+  SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
+                                        kTrayPopupPaddingHorizontal,
+                                        0,
+                                        kTrayPopupPaddingBetweenItems));
+  icon_ = new FixedSizedImageView(0, kTrayPopupItemHeight);
+  icon_->SetImage(bundle.GetImageNamed(icon_id_).ToImageSkia());
+  AddChildView(icon_);
   label_ = new views::Label;
   label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   label_->SetMultiLine(true);
@@ -126,40 +105,34 @@
 }
 
 void ScreenStatusView::Update() {
-  if (view_type_ == VIEW_DEFAULT) {
-    // Hide the notification bubble when the ash tray bubble opens.
-    screen_tray_item_->HideNotificationView();
-    SetVisible(screen_tray_item_->is_started());
-  }
+  // Hide the notification bubble when the ash tray bubble opens.
+  screen_tray_item_->HideNotificationView();
+  SetVisible(screen_tray_item_->is_started());
 }
 
-
-// ScreenNotificationView implementations.
-ScreenNotificationView::ScreenNotificationView(
-    ScreenTrayItem* screen_tray_item,
-    int icon_id,
-    const base::string16& label_text,
-    const base::string16& stop_button_text)
-        : TrayNotificationView(screen_tray_item, icon_id),
-          screen_tray_item_(screen_tray_item) {
-  screen_status_view_ = new ScreenStatusView(
-      screen_tray_item,
-      ScreenStatusView::VIEW_NOTIFICATION,
-      icon_id,
-      label_text,
-      stop_button_text);
-  InitView(screen_status_view_);
-  Update();
+ScreenNotificationDelegate::ScreenNotificationDelegate(
+    ScreenTrayItem* screen_tray)
+  : screen_tray_(screen_tray) {
 }
 
-ScreenNotificationView::~ScreenNotificationView() {
+ScreenNotificationDelegate::~ScreenNotificationDelegate() {
 }
 
-void ScreenNotificationView::Update() {
-  if (screen_tray_item_->is_started())
-    screen_status_view_->Update();
-  else
-    screen_tray_item_->HideNotificationView();
+void ScreenNotificationDelegate::Display() {
+}
+
+void ScreenNotificationDelegate::Error() {
+}
+
+void ScreenNotificationDelegate::Close(bool by_user) {
+}
+
+void ScreenNotificationDelegate::Click() {
+}
+
+void ScreenNotificationDelegate::ButtonClick(int button_index) {
+  DCHECK_EQ(0, button_index);
+  screen_tray_->Stop();
 }
 
 }  // namespace tray
@@ -168,7 +141,6 @@
     : SystemTrayItem(system_tray),
       tray_view_(NULL),
       default_view_(NULL),
-      notification_view_(NULL),
       is_started_(false),
       stop_callback_(base::Bind(&base::DoNothing)) {
 }
@@ -180,8 +152,12 @@
     tray_view_->Update();
   if (default_view_)
     default_view_->Update();
-  if (notification_view_)
-    notification_view_->Update();
+  if (is_started_) {
+    CreateOrUpdateNotification();
+  } else {
+    message_center::MessageCenter::Get()->RemoveNotification(
+        GetNotificationId(), false /* by_user */);
+  }
 }
 
 void ScreenTrayItem::Start(const base::Closure& stop_callback) {
@@ -196,7 +172,7 @@
 
   if (!system_tray()->HasSystemBubbleType(
       SystemTrayBubble::BUBBLE_TYPE_DEFAULT)) {
-    ShowNotificationView();
+    CreateOrUpdateNotification();
   }
 }
 
@@ -220,9 +196,5 @@
   default_view_ = NULL;
 }
 
-void ScreenTrayItem::DestroyNotificationView() {
-  notification_view_ = NULL;
-}
-
 }  // namespace internal
 }  // namespace ash
diff --git a/ash/system/chromeos/screen_security/screen_tray_item.h b/ash/system/chromeos/screen_security/screen_tray_item.h
index 03b8435..f078a39 100644
--- a/ash/system/chromeos/screen_security/screen_tray_item.h
+++ b/ash/system/chromeos/screen_security/screen_tray_item.h
@@ -11,6 +11,7 @@
 #include "ash/system/tray/tray_item_view.h"
 #include "ash/system/tray/tray_notification_view.h"
 #include "ash/system/tray/tray_popup_label_button.h"
+#include "ui/message_center/notification_delegate.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/image_view.h"
 
@@ -41,13 +42,7 @@
 class ScreenStatusView : public views::View,
                          public views::ButtonListener {
  public:
-  enum ViewType {
-      VIEW_DEFAULT,
-      VIEW_NOTIFICATION
-  };
-
   ScreenStatusView(ScreenTrayItem* screen_tray_item,
-                   ViewType view_type,
                    int icon_id,
                    const base::string16& label_text,
                    const base::string16& stop_button_text);
@@ -68,7 +63,6 @@
   views::ImageView* icon_;
   views::Label* label_;
   TrayPopupLabelButton* stop_button_;
-  ViewType view_type_;
   int icon_id_;
   base::string16 label_text_;
   base::string16 stop_button_text_;
@@ -76,21 +70,24 @@
   DISALLOW_COPY_AND_ASSIGN(ScreenStatusView);
 };
 
-class ScreenNotificationView : public TrayNotificationView {
+class ScreenNotificationDelegate : public message_center::NotificationDelegate {
  public:
-  ScreenNotificationView(ScreenTrayItem* screen_tray_item,
-                         int icon_id,
-                         const base::string16& label_text,
-                         const base::string16& stop_button_text);
-  virtual ~ScreenNotificationView();
+  explicit ScreenNotificationDelegate(ScreenTrayItem* screen_tray);
 
-  void Update();
+  // message_center::NotificationDelegate overrides:
+  virtual void Display() OVERRIDE;
+  virtual void Error() OVERRIDE;
+  virtual void Close(bool by_user) OVERRIDE;
+  virtual void Click() OVERRIDE;
+  virtual void ButtonClick(int button_index) OVERRIDE;
+
+ protected:
+  virtual ~ScreenNotificationDelegate();
 
  private:
-  ScreenTrayItem* screen_tray_item_;
-  ScreenStatusView* screen_status_view_;
+  ScreenTrayItem* screen_tray_;
 
-  DISALLOW_COPY_AND_ASSIGN(ScreenNotificationView);
+  DISALLOW_COPY_AND_ASSIGN(ScreenNotificationDelegate);
 };
 
 }  // namespace tray
@@ -114,13 +111,6 @@
     default_view_ = default_view;
   }
 
-  tray::ScreenNotificationView* notification_view() {
-    return notification_view_;
-  }
-  void set_notification_view(tray::ScreenNotificationView* notification_view) {
-    notification_view_ = notification_view;
-  }
-
   bool is_started() const { return is_started_; }
   void set_is_started(bool is_started) { is_started_ = is_started; }
 
@@ -128,20 +118,21 @@
   void Start(const base::Closure& stop_callback);
   void Stop();
 
+  // Creates or updates the notification for the tray item.
+  virtual void CreateOrUpdateNotification() = 0;
+
+  // Returns the id of the notification for the tray item.
+  virtual std::string GetNotificationId() = 0;
+
   // Overridden from SystemTrayItem.
   virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE = 0;
   virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE = 0;
-  virtual views::View* CreateNotificationView(
-      user::LoginStatus status) OVERRIDE = 0;
-
   virtual void DestroyTrayView() OVERRIDE;
   virtual void DestroyDefaultView() OVERRIDE;
-  virtual void DestroyNotificationView() OVERRIDE;
 
  private:
   tray::ScreenTrayView* tray_view_;
   tray::ScreenStatusView* default_view_;
-  tray::ScreenNotificationView* notification_view_;
   bool is_started_;
   base::Closure stop_callback_;
 
diff --git a/ash/system/chromeos/screen_security/screen_tray_item_unittest.cc b/ash/system/chromeos/screen_security/screen_tray_item_unittest.cc
index d95bed9..e51a91f 100644
--- a/ash/system/chromeos/screen_security/screen_tray_item_unittest.cc
+++ b/ash/system/chromeos/screen_security/screen_tray_item_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "ui/base/events/event.h"
 #include "ui/gfx/point.h"
+#include "ui/message_center/message_center.h"
 #include "ui/views/view.h"
 
 namespace ash {
@@ -177,12 +178,9 @@
   ScreenTrayItem* tray_item = test->tray_item();
 
   test->StartSession();
-  EXPECT_TRUE(tray_item->notification_view()->visible());
-
-  // Clicking on the notification view should dismiss the view
-  ClickViewCenter(tray_item->notification_view());
-  EXPECT_FALSE(tray_item->notification_view());
-
+  message_center::MessageCenter* message_center =
+      message_center::MessageCenter::Get();
+  EXPECT_TRUE(message_center->HasNotification(tray_item->GetNotificationId()));
   test->StopSession();
 }
 
diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc
index 85ba7ae..2b0b32a 100644
--- a/ash/test/ash_test_base.cc
+++ b/ash/test/ash_test_base.cc
@@ -84,7 +84,8 @@
 
 AshTestBase::AshTestBase()
     : setup_called_(false),
-      teardown_called_(false) {
+      teardown_called_(false),
+      start_session_(true) {
   // Must initialize |ash_test_helper_| here because some tests rely on
   // AshTestBase methods before they call AshTestBase::SetUp().
   ash_test_helper_.reset(new AshTestHelper(base::MessageLoopForUI::current()));
@@ -109,7 +110,7 @@
 #endif
   ui::InitializeInputMethodForTesting();
 
-  ash_test_helper_->SetUp();
+  ash_test_helper_->SetUp(start_session_);
 
   Shell::GetPrimaryRootWindow()->Show();
   Shell::GetPrimaryRootWindow()->ShowRootWindow();
diff --git a/ash/test/ash_test_base.h b/ash/test/ash_test_base.h
index c0567be..5e8fdd2 100644
--- a/ash/test/ash_test_base.h
+++ b/ash/test/ash_test_base.h
@@ -110,6 +110,8 @@
   // or false otherwise (e.g. win8 bot).
   static bool SupportsHostWindowResize();
 
+  void set_start_session(bool start_session) { start_session_ = start_session; }
+
   void RunAllPendingInMessageLoop();
 
   // Utility methods to emulate user logged in or not, session started or not
@@ -127,6 +129,8 @@
  private:
   bool setup_called_;
   bool teardown_called_;
+  // |SetUp()| doesn't activate session if this is set to false.
+  bool start_session_;
   content::TestBrowserThreadBundle thread_bundle_;
   scoped_ptr<AshTestHelper> ash_test_helper_;
   scoped_ptr<aura::test::EventGenerator> event_generator_;
@@ -141,6 +145,17 @@
   DISALLOW_COPY_AND_ASSIGN(AshTestBase);
 };
 
+class NoSessionAshTestBase : public AshTestBase {
+ public:
+  NoSessionAshTestBase() {
+    set_start_session(false);
+  }
+  virtual ~NoSessionAshTestBase() {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(NoSessionAshTestBase);
+};
+
 }  // namespace test
 }  // namespace ash
 
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc
index 1d8c7d1..45a1740 100644
--- a/ash/test/ash_test_helper.cc
+++ b/ash/test/ash_test_helper.cc
@@ -39,7 +39,7 @@
 AshTestHelper::~AshTestHelper() {
 }
 
-void AshTestHelper::SetUp() {
+void AshTestHelper::SetUp(bool start_session) {
   // Disable animations during tests.
   zero_duration_mode_.reset(new ui::ScopedAnimationDurationScaleMode(
       ui::ScopedAnimationDurationScaleMode::ZERO_DURATION));
@@ -60,9 +60,12 @@
 
   ash::Shell::CreateInstance(test_shell_delegate_);
   Shell* shell = Shell::GetInstance();
-  test_shell_delegate_->test_session_state_delegate()->
-      SetActiveUserSessionStarted(true);
-  test_shell_delegate_->test_session_state_delegate()->SetHasActiveUser(true);
+  if (start_session) {
+    test_shell_delegate_->test_session_state_delegate()->
+        SetActiveUserSessionStarted(true);
+    test_shell_delegate_->test_session_state_delegate()->
+        SetHasActiveUser(true);
+  }
 
   test::DisplayManagerTestApi(shell->display_manager()).
       DisableChangeDisplayUponHostResize();
diff --git a/ash/test/ash_test_helper.h b/ash/test/ash_test_helper.h
index 669ec29..f4d7706 100644
--- a/ash/test/ash_test_helper.h
+++ b/ash/test/ash_test_helper.h
@@ -33,7 +33,9 @@
   ~AshTestHelper();
 
   // Creates the ash::Shell and performs associated initialization.
-  void SetUp();
+  // Set |start_session| to true if the user should log in before
+  // the test is run.
+  void SetUp(bool start_session);
 
   // Destroys the ash::Shell and performs associated cleanup.
   void TearDown();
diff --git a/ash/test/ash_test_helper_unittest.cc b/ash/test/ash_test_helper_unittest.cc
index fdb27f9..0de950f 100644
--- a/ash/test/ash_test_helper_unittest.cc
+++ b/ash/test/ash_test_helper_unittest.cc
@@ -18,7 +18,7 @@
   virtual void SetUp() OVERRIDE {
     testing::Test::SetUp();
     ash_test_helper_.reset(new ash::test::AshTestHelper(&message_loop_));
-    ash_test_helper_->SetUp();
+    ash_test_helper_->SetUp(true);
   }
 
   virtual void TearDown() OVERRIDE {
diff --git a/ash/test/test_shell_delegate.cc b/ash/test/test_shell_delegate.cc
index 532876e..9b51e6a 100644
--- a/ash/test/test_shell_delegate.cc
+++ b/ash/test/test_shell_delegate.cc
@@ -191,16 +191,6 @@
 void TestShellDelegate::HandleMediaPrevTrack() {
 }
 
-base::string16 TestShellDelegate::GetTimeRemainingString(
-    base::TimeDelta delta) {
-  return base::string16();
-}
-
-base::string16 TestShellDelegate::GetTimeDurationLongString(
-    base::TimeDelta delta) {
-  return base::string16();
-}
-
 void TestShellDelegate::SaveScreenMagnifierScale(double scale) {
 }
 
diff --git a/ash/test/test_shell_delegate.h b/ash/test/test_shell_delegate.h
index b8a618b..dc8875b 100644
--- a/ash/test/test_shell_delegate.h
+++ b/ash/test/test_shell_delegate.h
@@ -74,9 +74,6 @@
   virtual void HandleMediaNextTrack() OVERRIDE;
   virtual void HandleMediaPlayPause() OVERRIDE;
   virtual void HandleMediaPrevTrack() OVERRIDE;
-  virtual base::string16 GetTimeRemainingString(base::TimeDelta delta) OVERRIDE;
-  virtual base::string16 GetTimeDurationLongString(
-      base::TimeDelta delta) OVERRIDE;
   virtual void SaveScreenMagnifierScale(double scale) OVERRIDE;
   virtual double GetSavedScreenMagnifierScale() OVERRIDE;
   virtual ui::MenuModel* CreateContextMenu(aura::RootWindow* root) OVERRIDE;
diff --git a/ash/wm/app_list_controller.cc b/ash/wm/app_list_controller.cc
index 45a6bcf..ea5e4f4 100644
--- a/ash/wm/app_list_controller.cc
+++ b/ash/wm/app_list_controller.cc
@@ -12,6 +12,7 @@
 #include "ash/shell_delegate.h"
 #include "ash/shell_window_ids.h"
 #include "ash/wm/property_util.h"
+#include "base/command_line.h"
 #include "ui/app_list/app_list_constants.h"
 #include "ui/app_list/pagination_model.h"
 #include "ui/app_list/views/app_list_view.h"
@@ -192,6 +193,13 @@
           true /* border_accepts_events */);
     }
     SetView(view);
+    // By setting us as DnD recipient, the app list knows that we can
+    // handle items.
+    if (!CommandLine::ForCurrentProcess()->HasSwitch(
+            ash::switches::kAshDisableDragAndDropAppListToLauncher)) {
+      SetDragAndDropHostOfCurrentAppList(
+          Launcher::ForWindow(window)->GetDragAndDropHostForAppList());
+    }
   }
 }
 
@@ -203,15 +211,15 @@
   return is_visible_ && view_ ? view_->GetWidget()->GetNativeWindow() : NULL;
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// AppListController, private:
+
 void AppListController::SetDragAndDropHostOfCurrentAppList(
     app_list::ApplicationDragAndDropHost* drag_and_drop_host) {
   if (view_ && is_visible_)
     view_->SetDragAndDropHostOfCurrentAppList(drag_and_drop_host);
 }
 
-////////////////////////////////////////////////////////////////////////////////
-// AppListController, private:
-
 void AppListController::SetView(app_list::AppListView* view) {
   DCHECK(view_ == NULL);
   DCHECK(is_visible_);
diff --git a/ash/wm/app_list_controller.h b/ash/wm/app_list_controller.h
index 8aa7e30..b2c7961 100644
--- a/ash/wm/app_list_controller.h
+++ b/ash/wm/app_list_controller.h
@@ -62,12 +62,12 @@
   // Returns app list window or NULL if it is not visible.
   aura::Window* GetWindow();
 
+ private:
   // If |drag_and_drop_host| is not NULL it will be called upon drag and drop
   // operations outside the application list.
   void SetDragAndDropHostOfCurrentAppList(
       app_list::ApplicationDragAndDropHost* drag_and_drop_host);
 
- private:
   // Sets the app list view and attempts to show it.
   void SetView(app_list::AppListView* view);
 
diff --git a/ash/wm/base_layout_manager.cc b/ash/wm/base_layout_manager.cc
index 10f8311..6842f3e 100644
--- a/ash/wm/base_layout_manager.cc
+++ b/ash/wm/base_layout_manager.cc
@@ -107,7 +107,8 @@
 // BaseLayoutManager, ash::ShellObserver overrides:
 
 void BaseLayoutManager::OnDisplayWorkAreaInsetsChanged() {
-  AdjustWindowSizesForScreenChange(ADJUST_WINDOW_DISPLAY_INSETS_CHANGED);
+  AdjustAllWindowsBoundsForWorkAreaChange(
+      ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED);
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -145,7 +146,7 @@
                                               const gfx::Rect& old_bounds,
                                               const gfx::Rect& new_bounds) {
   if (root_window_ == window)
-    AdjustWindowSizesForScreenChange(ADJUST_WINDOW_SCREEN_SIZE_CHANGED);
+    AdjustAllWindowsBoundsForWorkAreaChange(ADJUST_WINDOW_DISPLAY_SIZE_CHANGED);
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -192,12 +193,12 @@
   }
 }
 
-void BaseLayoutManager::AdjustWindowSizesForScreenChange(
+void BaseLayoutManager::AdjustAllWindowsBoundsForWorkAreaChange(
     AdjustWindowReason reason) {
   // Don't do any adjustments of the insets while we are in screen locked mode.
   // This would happen if the launcher was auto hidden before the login screen
   // was shown and then gets shown when the login screen gets presented.
-  if (reason == ADJUST_WINDOW_DISPLAY_INSETS_CHANGED &&
+  if (reason == ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED &&
       Shell::GetInstance()->session_state_delegate()->IsScreenLocked())
     return;
 
@@ -209,11 +210,11 @@
   for (WindowSet::const_iterator it = windows_.begin();
        it != windows_.end();
        ++it) {
-    AdjustWindowSizeForScreenChange(*it, reason);
+    AdjustWindowBoundsForWorkAreaChange(*it, reason);
   }
 }
 
-void BaseLayoutManager::AdjustWindowSizeForScreenChange(
+void BaseLayoutManager::AdjustWindowBoundsForWorkAreaChange(
     aura::Window* window,
     AdjustWindowReason reason) {
   if (wm::IsWindowMaximized(window)) {
diff --git a/ash/wm/base_layout_manager.h b/ash/wm/base_layout_manager.h
index 7fe25e5..0fc2b36 100644
--- a/ash/wm/base_layout_manager.h
+++ b/ash/wm/base_layout_manager.h
@@ -77,27 +77,29 @@
 
  protected:
   enum AdjustWindowReason {
-    ADJUST_WINDOW_SCREEN_SIZE_CHANGED,
-    ADJUST_WINDOW_DISPLAY_INSETS_CHANGED,
-    ADJUST_WINDOW_WINDOW_ADDED
+    ADJUST_WINDOW_DISPLAY_SIZE_CHANGED,
+    ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED,
   };
 
   // Invoked from OnWindowPropertyChanged() if |kShowStateKey| changes.
   virtual void ShowStateChanged(aura::Window* window,
                                 ui::WindowShowState last_show_state);
 
-  // Adjusts the window sizes when the screen changes its size or its
-  // work area insets. If this is called for a screen size change (i.e. |reason|
-  // is ADJUST_WINDOW_SCREEN_SIZE_CHANGED), the non-maximized/non-fullscreen
+  // Adjusts the window's bounds when the display area changes for given
+  // window. This happens when the display size, work area insets or
+  // the display on which the window exists has changed.
+  // If this is called for a display size change (i.e. |reason|
+  // is ADJUST_WINDOW_DISPLAY_SIZE_CHANGED), the non-maximized/non-fullscreen
   // windows are readjusted to make sure the window is completely within the
   // display region. Otherwise, it makes sure at least some parts of the window
   // is on display.
-  virtual void AdjustWindowSizesForScreenChange(AdjustWindowReason reason);
+  virtual void AdjustAllWindowsBoundsForWorkAreaChange(
+      AdjustWindowReason reason);
 
   // Adjusts the sizes of the specific window in respond to a screen change or
   // display-area size change.
-  virtual void AdjustWindowSizeForScreenChange(aura::Window* window,
-                                               AdjustWindowReason reason);
+  virtual void AdjustWindowBoundsForWorkAreaChange(aura::Window* window,
+                                                   AdjustWindowReason reason);
 
   aura::RootWindow* root_window() { return root_window_; }
 
diff --git a/ash/wm/dock/docked_window_layout_manager.cc b/ash/wm/dock/docked_window_layout_manager.cc
index d9d1c07..d73a0cc 100644
--- a/ash/wm/dock/docked_window_layout_manager.cc
+++ b/ash/wm/dock/docked_window_layout_manager.cc
@@ -15,6 +15,7 @@
 #include "ash/wm/window_properties.h"
 #include "ash/wm/window_util.h"
 #include "base/auto_reset.h"
+#include "third_party/skia/include/core/SkColor.h"
 #include "ui/aura/client/activation_client.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/focus_manager.h"
@@ -33,6 +34,39 @@
 
 namespace {
 
+const SkColor kDockBackgroundColor = SkColorSetARGB(0xff, 0x10, 0x10, 0x10);
+const float kDockBackgroundOpacity = 0.5f;
+
+class DockedBackgroundWidget : public views::Widget {
+ public:
+  explicit DockedBackgroundWidget(aura::Window* container) {
+    InitWidget(container);
+  }
+
+ private:
+  void InitWidget(aura::Window* parent) {
+    views::Widget::InitParams params;
+    params.type = views::Widget::InitParams::TYPE_POPUP;
+    params.opacity = views::Widget::InitParams::OPAQUE_WINDOW;
+    params.can_activate = false;
+    params.keep_on_top = false;
+    params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+    params.parent = parent;
+    params.accept_events = false;
+    set_focus_on_creation(false);
+    Init(params);
+    DCHECK_EQ(GetNativeView()->GetRootWindow(), parent->GetRootWindow());
+    views::View* content_view = new views::View;
+    content_view->set_background(
+        views::Background::CreateSolidBackground(kDockBackgroundColor));
+    SetContentsView(content_view);
+    GetNativeWindow()->layer()->SetOpacity(kDockBackgroundOpacity);
+    Hide();
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(DockedBackgroundWidget);
+};
+
 DockedWindowLayoutManager* GetDockLayoutManager(aura::Window* window,
                                                 const gfx::Point& location) {
   gfx::Rect near_location(location, gfx::Size());
@@ -69,7 +103,8 @@
       shelf_hidden_(false),
       docked_width_(0),
       alignment_(DOCKED_ALIGNMENT_NONE),
-      last_active_window_(NULL) {
+      last_active_window_(NULL),
+      background_widget_(new DockedBackgroundWidget(dock_container_)) {
   DCHECK(dock_container);
   aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())->
       AddObserver(this);
@@ -546,6 +581,17 @@
       DockedWindowLayoutManagerObserver,
       observer_list_,
       OnDockBoundsChanging(bounds));
+
+  // Show or hide background for docked area.
+  gfx::Rect background_bounds(docked_bounds_);
+  const gfx::Rect work_area =
+      Shell::GetScreen()->GetDisplayNearestWindow(dock_container_).work_area();
+  background_bounds.set_height(work_area.height());
+  background_widget_->SetBounds(background_bounds);
+  if (docked_width_ > 0)
+    background_widget_->Show();
+  else
+    background_widget_->Hide();
 }
 
 void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) {
@@ -571,13 +617,15 @@
   for (aura::Window::Windows::const_iterator it =
            dock_container_->children().begin();
        it != dock_container_->children().end(); ++it) {
+    if (!IsUsedByLayout(*it))
+      continue;
     gfx::Rect bounds = (*it)->bounds();
     window_ordering.insert(std::make_pair(bounds.y() + bounds.height() / 2,
                                           *it));
   }
   int active_center_y = active_window->bounds().CenterPoint().y();
 
-  aura::Window* previous_window = NULL;
+  aura::Window* previous_window = background_widget_->GetNativeWindow();
   for (std::map<int, aura::Window*>::const_iterator it =
        window_ordering.begin();
        it != window_ordering.end() && it->first < active_center_y; ++it) {
diff --git a/ash/wm/dock/docked_window_layout_manager.h b/ash/wm/dock/docked_window_layout_manager.h
index 28c81fc..aa02b34 100644
--- a/ash/wm/dock/docked_window_layout_manager.h
+++ b/ash/wm/dock/docked_window_layout_manager.h
@@ -13,6 +13,7 @@
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
+#include "base/memory/scoped_ptr.h"
 #include "base/observer_list.h"
 #include "ui/aura/client/activation_change_observer.h"
 #include "ui/aura/layout_manager.h"
@@ -28,6 +29,10 @@
 class Point;
 }
 
+namespace views {
+class Widget;
+}
+
 namespace ash {
 class Launcher;
 
@@ -182,6 +187,9 @@
   // are currently focused.
   aura::Window* last_active_window_;
 
+  // Widget used to paint a background for the docked area.
+  scoped_ptr<views::Widget> background_widget_;
+
   // Observers of dock bounds changes.
   ObserverList<DockedWindowLayoutManagerObserver> observer_list_;
 
diff --git a/ash/wm/property_util.h b/ash/wm/property_util.h
index adb983d..32ae278 100644
--- a/ash/wm/property_util.h
+++ b/ash/wm/property_util.h
@@ -24,7 +24,7 @@
 // Sets the restore bounds property on |window| in the virtual screen
 // coordinates.  Deletes existing bounds value if exists.
 ASH_EXPORT void SetRestoreBoundsInScreen(aura::Window* window,
-                                       const gfx::Rect& screen_bounds);
+                                         const gfx::Rect& screen_bounds);
 // Same as |SetRestoreBoundsInScreen| except that the bounds is in the
 // parent's coordinates.
 ASH_EXPORT void SetRestoreBoundsInParent(aura::Window* window,
diff --git a/ash/wm/window_util.cc b/ash/wm/window_util.cc
index f11b3bc..67dcd95 100644
--- a/ash/wm/window_util.cc
+++ b/ash/wm/window_util.cc
@@ -173,21 +173,19 @@
                                           gfx::Rect* bounds) {
   bounds->set_width(std::min(bounds->width(), work_area.width()));
   bounds->set_height(std::min(bounds->height(), work_area.height()));
-  if (!work_area.Intersects(*bounds)) {
-    int y_offset = 0;
-    if (work_area.bottom() < bounds->y()) {
-      y_offset = work_area.bottom() - bounds->y() - min_height;
-    } else if (bounds->bottom() < work_area.y()) {
-      y_offset = work_area.y() - bounds->bottom() + min_height;
-    }
 
-    int x_offset = 0;
-    if (work_area.right() < bounds->x()) {
-      x_offset = work_area.right() - bounds->x() - min_width;
-    } else if (bounds->right() < work_area.x()) {
-      x_offset = work_area.x() - bounds->right() + min_width;
-    }
-    bounds->Offset(x_offset, y_offset);
+  min_width = std::min(min_width, work_area.width());
+  min_height = std::min(min_height, work_area.height());
+
+  if (bounds->x() + min_width > work_area.right()) {
+    bounds->set_x(work_area.right() - min_width);
+  } else if (bounds->right() - min_width < 0) {
+    bounds->set_x(min_width - bounds->width());
+  }
+  if (bounds->y() + min_height > work_area.bottom()) {
+    bounds->set_y(work_area.bottom() - min_height);
+  } else if (bounds->bottom() - min_height < 0) {
+    bounds->set_y(min_height - bounds->height());
   }
 }
 
diff --git a/ash/wm/workspace/workspace_event_handler_unittest.cc b/ash/wm/workspace/workspace_event_handler_unittest.cc
index f970385..e592ad5 100644
--- a/ash/wm/workspace/workspace_event_handler_unittest.cc
+++ b/ash/wm/workspace/workspace_event_handler_unittest.cc
@@ -248,20 +248,21 @@
 
 TEST_F(WorkspaceEventHandlerTest, DoubleClickCaptionTogglesMaximize) {
   aura::test::TestWindowDelegate wd;
-  scoped_ptr<aura::Window> window(CreateTestWindow(&wd, gfx::Rect(1, 2, 3, 4)));
+  scoped_ptr<aura::Window> window(
+      CreateTestWindow(&wd, gfx::Rect(1, 2, 30, 40)));
   window->SetProperty(aura::client::kCanMaximizeKey, true);
   wd.set_window_component(HTCAPTION);
   EXPECT_FALSE(wm::IsWindowMaximized(window.get()));
   aura::RootWindow* root = Shell::GetPrimaryRootWindow();
   aura::test::EventGenerator generator(root, window.get());
   generator.DoubleClickLeftButton();
-  EXPECT_NE("1,2 3x4", window->bounds().ToString());
+  EXPECT_NE("1,2 30x40", window->bounds().ToString());
 
   EXPECT_TRUE(wm::IsWindowMaximized(window.get()));
   generator.DoubleClickLeftButton();
 
   EXPECT_FALSE(wm::IsWindowMaximized(window.get()));
-  EXPECT_EQ("1,2 3x4", window->bounds().ToString());
+  EXPECT_EQ("1,2 30x40", window->bounds().ToString());
 
   // Double-clicking the middle button shouldn't toggle the maximized state.
   WindowPropertyObserver observer(window.get());
@@ -275,7 +276,7 @@
   root->AsRootWindowHostDelegate()->OnHostMouseEvent(&release);
 
   EXPECT_FALSE(wm::IsWindowMaximized(window.get()));
-  EXPECT_EQ("1,2 3x4", window->bounds().ToString());
+  EXPECT_EQ("1,2 30x40", window->bounds().ToString());
   EXPECT_FALSE(observer.DidPropertyChange(aura::client::kShowStateKey));
 }
 
diff --git a/ash/wm/workspace/workspace_layout_manager.cc b/ash/wm/workspace/workspace_layout_manager.cc
index 21aa08c..2fd56af 100644
--- a/ash/wm/workspace/workspace_layout_manager.cc
+++ b/ash/wm/workspace/workspace_layout_manager.cc
@@ -32,9 +32,9 @@
 
 namespace {
 
-// This specifies how much percent (2/3=66%) of a window must be visible when
-// the window is added to the workspace.
-const float kMinimumPercentOnScreenArea = 0.66f;
+// This specifies how much percent 30% of a window rect (width / height)
+// must be visible when the window is added to the workspace.
+const float kMinimumPercentOnScreenArea = 0.3f;
 
 bool IsMaximizedState(ui::WindowShowState state) {
   return state == ui::SHOW_STATE_MAXIMIZED ||
@@ -59,8 +59,14 @@
 }
 
 void WorkspaceLayoutManager::OnWindowAddedToLayout(Window* child) {
-  // Adjust window bounds in case that the new child is out of the workspace.
-  AdjustWindowSizeForScreenChange(child, ADJUST_WINDOW_WINDOW_ADDED);
+  // Adjust window bounds in case that the new child is given the bounds that
+  // is out of the workspace. Exclude the case where bounds is empty
+  // (this happens when a views::Widget is created), or the window
+  // is added with the bounds because a user explicitly moved to
+  // this position (drag and drop for example).
+  if (!child->bounds().IsEmpty() &&
+      !wm::HasUserChangedWindowPositionOrSize(child))
+    AdjustWindowBoundsWhenAdded(child);
   BaseLayoutManager::OnWindowAddedToLayout(child);
   UpdateDesktopVisibility();
   RearrangeVisibleWindowOnShow(child);
@@ -110,8 +116,10 @@
 void WorkspaceLayoutManager::OnDisplayWorkAreaInsetsChanged() {
   const gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent(
       window_->parent()));
-  if (work_area != work_area_)
-    AdjustWindowSizesForScreenChange(ADJUST_WINDOW_DISPLAY_INSETS_CHANGED);
+  if (work_area != work_area_) {
+    AdjustAllWindowsBoundsForWorkAreaChange(
+        ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED);
+  }
 }
 
 void WorkspaceLayoutManager::OnWindowPropertyChanged(Window* window,
@@ -170,13 +178,13 @@
   UpdateDesktopVisibility();
 }
 
-void WorkspaceLayoutManager::AdjustWindowSizesForScreenChange(
+void WorkspaceLayoutManager::AdjustAllWindowsBoundsForWorkAreaChange(
     AdjustWindowReason reason) {
   work_area_ = ScreenAsh::GetDisplayWorkAreaBoundsInParent(window_->parent());
-  BaseLayoutManager::AdjustWindowSizesForScreenChange(reason);
+  BaseLayoutManager::AdjustAllWindowsBoundsForWorkAreaChange(reason);
 }
 
-void WorkspaceLayoutManager::AdjustWindowSizeForScreenChange(
+void WorkspaceLayoutManager::AdjustWindowBoundsForWorkAreaChange(
     Window* window,
     AdjustWindowReason reason) {
   if (!GetTrackedByWorkspace(window))
@@ -190,7 +198,7 @@
   // cross fade. I think this is better, but should reconsider if someone
   // raises voice for this.
   if (wm::IsWindowMaximized(window) &&
-      reason == ADJUST_WINDOW_DISPLAY_INSETS_CHANGED) {
+      reason == ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED) {
     CrossFadeToBounds(window, ScreenAsh::GetMaximizedWindowBoundsInParent(
         window->parent()->parent()));
     return;
@@ -200,22 +208,38 @@
     return;
 
   gfx::Rect bounds = window->bounds();
-  if (reason == ADJUST_WINDOW_SCREEN_SIZE_CHANGED) {
-    // The work area may be smaller than the full screen.  Put as much of the
-    // window as possible within the display area.
-    bounds.AdjustToFit(work_area_);
-  } else if (reason == ADJUST_WINDOW_DISPLAY_INSETS_CHANGED) {
-    ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_, &bounds);
-  } else if (reason == ADJUST_WINDOW_WINDOW_ADDED) {
-    int min_width = bounds.width() * kMinimumPercentOnScreenArea;
-    int min_height = bounds.height() * kMinimumPercentOnScreenArea;
-    ash::wm::AdjustBoundsToEnsureWindowVisibility(
-        work_area_, min_width, min_height, &bounds);
+  switch (reason) {
+    case ADJUST_WINDOW_DISPLAY_SIZE_CHANGED:
+      // The work area may be smaller than the full screen.  Put as much of the
+      // window as possible within the display area.
+      bounds.AdjustToFit(work_area_);
+      break;
+    case ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED:
+      ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_, &bounds);
+      break;
   }
   if (window->bounds() != bounds)
     window->SetBounds(bounds);
 }
 
+void WorkspaceLayoutManager::AdjustWindowBoundsWhenAdded(
+    Window* window) {
+  if (!GetTrackedByWorkspace(window))
+    return;
+
+  if (SetMaximizedOrFullscreenBounds(window))
+    return;
+
+  gfx::Rect bounds = window->bounds();
+  int min_width = bounds.width() * kMinimumPercentOnScreenArea;
+  int min_height = bounds.height() * kMinimumPercentOnScreenArea;
+  ash::wm::AdjustBoundsToEnsureWindowVisibility(
+      work_area_, min_width, min_height, &bounds);
+
+  if (window->bounds() != bounds)
+    window->SetBounds(bounds);
+}
+
 void WorkspaceLayoutManager::UpdateDesktopVisibility() {
   if (shelf_)
     shelf_->UpdateVisibilityState();
@@ -229,10 +253,27 @@
     case ui::SHOW_STATE_DEFAULT:
     case ui::SHOW_STATE_NORMAL: {
       const gfx::Rect* restore = GetRestoreBoundsInScreen(window);
+      // Make sure that the part of the window is always visible
+      // when restored.
+      gfx::Rect bounds_in_parent;
       if (restore) {
-        gfx::Rect bounds_in_parent =
+        bounds_in_parent =
             ScreenAsh::ConvertRectFromScreen(window->parent()->parent(),
                                              *restore);
+
+        ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility(
+            work_area_, &bounds_in_parent);
+      } else {
+        // Minimized windows have no restore bounds.
+        // Use the current bounds instead.
+        bounds_in_parent = window->bounds();
+        ash::wm::AdjustBoundsToEnsureMinimumWindowVisibility(
+            work_area_, &bounds_in_parent);
+        // Don't start animation if the bounds didn't change.
+        if (bounds_in_parent == window->bounds())
+          bounds_in_parent.SetRect(0, 0, 0, 0);
+      }
+      if (!bounds_in_parent.IsEmpty()) {
         CrossFadeToBounds(
             window,
             BaseLayoutManager::BoundsWithScreenEdgeVisible(
diff --git a/ash/wm/workspace/workspace_layout_manager.h b/ash/wm/workspace/workspace_layout_manager.h
index a599d87..4476ddc 100644
--- a/ash/wm/workspace/workspace_layout_manager.h
+++ b/ash/wm/workspace/workspace_layout_manager.h
@@ -60,12 +60,14 @@
   // Overridden from BaseLayoutManager:
   virtual void ShowStateChanged(aura::Window* window,
                                 ui::WindowShowState last_show_state) OVERRIDE;
-  virtual void AdjustWindowSizesForScreenChange(
+  virtual void AdjustAllWindowsBoundsForWorkAreaChange(
       AdjustWindowReason reason) OVERRIDE;
-  virtual void AdjustWindowSizeForScreenChange(
+  virtual void AdjustWindowBoundsForWorkAreaChange(
       aura::Window* window,
       AdjustWindowReason reason) OVERRIDE;
 
+  void AdjustWindowBoundsWhenAdded(aura::Window* window);
+
   void UpdateDesktopVisibility();
 
   // Updates the bounds of the window from a show state change.
diff --git a/ash/wm/workspace/workspace_layout_manager_unittest.cc b/ash/wm/workspace/workspace_layout_manager_unittest.cc
index 30cdf6b..3e3a1c7 100644
--- a/ash/wm/workspace/workspace_layout_manager_unittest.cc
+++ b/ash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -62,6 +62,42 @@
       Shell::GetPrimaryRootWindow()->bounds().Intersects(window->bounds()));
 }
 
+TEST_F(WorkspaceLayoutManagerTest, KeepRestoredWindowInDisplay) {
+  if (!SupportsHostWindowResize())
+    return;
+  scoped_ptr<aura::Window> window(
+      CreateTestWindowInShellWithBounds(gfx::Rect(1, 2, 30, 40)));
+  // Maximized -> Normal transition.
+  wm::MaximizeWindow(window.get());
+  SetRestoreBoundsInScreen(window.get(), gfx::Rect(-100, -100, 30, 40));
+  wm::RestoreWindow(window.get());
+  EXPECT_TRUE(
+      Shell::GetPrimaryRootWindow()->bounds().Intersects(window->bounds()));
+  EXPECT_EQ("-20,-30 30x40", window->bounds().ToString());
+
+  // Minimized -> Normal transition.
+  window->SetBounds(gfx::Rect(-100, -100, 30, 40));
+  wm::MinimizeWindow(window.get());
+  EXPECT_FALSE(
+      Shell::GetPrimaryRootWindow()->bounds().Intersects(window->bounds()));
+  EXPECT_EQ("-100,-100 30x40", window->bounds().ToString());
+  window->Show();
+  EXPECT_TRUE(
+      Shell::GetPrimaryRootWindow()->bounds().Intersects(window->bounds()));
+  EXPECT_EQ("-20,-30 30x40", window->bounds().ToString());
+
+  // Fullscreen -> Normal transition.
+  window->SetBounds(gfx::Rect(0, 0, 30, 40));  // reset bounds.
+  ASSERT_EQ("0,0 30x40", window->bounds().ToString());
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
+  EXPECT_EQ(window->bounds(), window->GetRootWindow()->bounds());
+  SetRestoreBoundsInScreen(window.get(), gfx::Rect(-100, -100, 30, 40));
+  wm::RestoreWindow(window.get());
+  EXPECT_TRUE(
+      Shell::GetPrimaryRootWindow()->bounds().Intersects(window->bounds()));
+  EXPECT_EQ("-20,-30 30x40", window->bounds().ToString());
+}
+
 // WindowObserver implementation used by DontClobberRestoreBoundsWindowObserver.
 // This code mirrors what BrowserFrameAura does. In particular when this code
 // sees the window was maximized it changes the bounds of a secondary
@@ -110,7 +146,7 @@
   window->AddObserver(&window_observer);
   SetDefaultParentByPrimaryRootWindow(window.get());
   window->Show();
-  ash::wm::ActivateWindow(window.get());
+  wm::ActivateWindow(window.get());
 
   scoped_ptr<aura::Window> window2(
       CreateTestWindowInShellWithBounds(gfx::Rect(12, 20, 30, 40)));
@@ -128,12 +164,12 @@
   scoped_ptr<aura::Window> window(
       CreateTestWindowInShellWithBounds(gfx::Rect(10, 20, 30, 40)));
   window->Show();
-  ash::wm::ActivateWindow(window.get());
+  wm::ActivateWindow(window.get());
   scoped_ptr<aura::Window> child_window(
       aura::test::CreateTestWindowWithBounds(gfx::Rect(5, 6, 7, 8),
                                              window.get()));
   child_window->Show();
-  ash::wm::MaximizeWindow(window.get());
+  wm::MaximizeWindow(window.get());
   EXPECT_EQ("5,6 7x8", child_window->bounds().ToString());
 }
 
@@ -146,7 +182,7 @@
 
   // If the window is out of the workspace, it would be moved on screen.
   gfx::Rect root_window_bounds =
-      ash::Shell::GetInstance()->GetPrimaryRootWindow()->bounds();
+      Shell::GetInstance()->GetPrimaryRootWindow()->bounds();
   window_bounds.Offset(root_window_bounds.width(), root_window_bounds.height());
   ASSERT_FALSE(window_bounds.Intersects(root_window_bounds));
   scoped_ptr<aura::Window> out_window(
@@ -154,9 +190,45 @@
   EXPECT_EQ(window_bounds.size(), out_window->bounds().size());
   gfx::Rect bounds = out_window->bounds();
   bounds.Intersect(root_window_bounds);
-  // 2/3 of the window must be visible.
-  EXPECT_GT(bounds.width(), out_window->bounds().width() * 0.6);
-  EXPECT_GT(bounds.height(), out_window->bounds().height() * 0.6);
+
+  // 30% of the window edge must be visible.
+  EXPECT_GT(bounds.width(), out_window->bounds().width() * 0.29);
+  EXPECT_GT(bounds.height(), out_window->bounds().height() * 0.29);
+
+  // Make sure we always make more than 1/3 of the window edge visible even
+  // if the initial bounds intersects with display.
+  window_bounds.SetRect(-150, -150, 200, 200);
+  bounds = window_bounds;
+  bounds.Intersect(root_window_bounds);
+
+  // Make sure that the initial bounds' visible area is less than 26%
+  // so that the auto adjustment logic kicks in.
+  ASSERT_LT(bounds.width(), out_window->bounds().width() * 0.26);
+  ASSERT_LT(bounds.height(), out_window->bounds().height() * 0.26);
+  ASSERT_TRUE(window_bounds.Intersects(root_window_bounds));
+
+  scoped_ptr<aura::Window> partially_out_window(
+      CreateTestWindowInShellWithBounds(window_bounds));
+  EXPECT_EQ(window_bounds.size(), partially_out_window->bounds().size());
+  bounds = partially_out_window->bounds();
+  bounds.Intersect(root_window_bounds);
+  EXPECT_GT(bounds.width(), out_window->bounds().width() * 0.29);
+  EXPECT_GT(bounds.height(), out_window->bounds().height() * 0.29);
+
+  // Make sure the window whose 30% width/height is bigger than display
+  // will be placed correctly.
+  window_bounds.SetRect(-1900, -1900, 3000, 3000);
+  scoped_ptr<aura::Window> window_bigger_than_display(
+      CreateTestWindowInShellWithBounds(window_bounds));
+  EXPECT_GE(root_window_bounds.width(),
+            window_bigger_than_display->bounds().width());
+  EXPECT_GE(root_window_bounds.height(),
+            window_bigger_than_display->bounds().height());
+
+  bounds = window_bigger_than_display->bounds();
+  bounds.Intersect(root_window_bounds);
+  EXPECT_GT(bounds.width(), out_window->bounds().width() * 0.29);
+  EXPECT_GT(bounds.height(), out_window->bounds().height() * 0.29);
 }
 
 // Verifies the size of a window is enforced to be smaller than the work area.
diff --git a/base/android/base_jni_registrar.cc b/base/android/base_jni_registrar.cc
index ea4c37b..0645c73 100644
--- a/base/android/base_jni_registrar.cc
+++ b/base/android/base_jni_registrar.cc
@@ -8,6 +8,7 @@
 #include "base/android/build_info.h"
 #include "base/android/cpu_features.h"
 #include "base/android/important_file_writer_android.h"
+#include "base/android/java_handler_thread.h"
 #include "base/android/jni_android.h"
 #include "base/android/jni_registrar.h"
 #include "base/android/memory_pressure_listener_android.h"
@@ -38,6 +39,7 @@
     base::android::RegisterImportantFileWriterAndroid },
   { "MemoryPressureListenerAndroid",
       base::android::MemoryPressureListenerAndroid::Register },
+  { "JavaHandlerThread", base::android::JavaHandlerThread::RegisterBindings },
   { "PathService", base::android::RegisterPathService },
   { "PathUtils", base::android::RegisterPathUtils },
   { "SystemMessageHandler", base::MessagePumpForUI::RegisterBindings },
diff --git a/base/android/java/src/org/chromium/base/JavaHandlerThread.java b/base/android/java/src/org/chromium/base/JavaHandlerThread.java
new file mode 100644
index 0000000..5f9960e
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/JavaHandlerThread.java
@@ -0,0 +1,41 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+
+/**
+ * This class is an internal detail of the native counterpart.
+ * It is instantiated and owned by the native object.
+ */
+@JNINamespace("base::android")
+class JavaHandlerThread {
+    final HandlerThread mThread;
+
+    private JavaHandlerThread(String name) {
+        mThread = new HandlerThread(name);
+    }
+
+    @CalledByNative
+    private static JavaHandlerThread create(String name) {
+        return new JavaHandlerThread(name);
+    }
+
+    @CalledByNative
+    private void start(final int nativeThread, final int nativeEvent) {
+        mThread.start();
+        new Handler(mThread.getLooper()).post(new Runnable() {
+            @Override
+            public void run() {
+                nativeInitializeThread(nativeThread, nativeEvent);
+            }
+        });
+    }
+
+    private native void nativeInitializeThread(int nativeJavaHandlerThread, int nativeEvent);
+}
\ No newline at end of file
diff --git a/base/android/java_handler_thread.cc b/base/android/java_handler_thread.cc
new file mode 100644
index 0000000..0528fe7
--- /dev/null
+++ b/base/android/java_handler_thread.cc
@@ -0,0 +1,62 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/java_handler_thread.h"
+
+#include <jni.h>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/message_loop/message_loop.h"
+#include "base/synchronization/waitable_event.h"
+#include "base/threading/thread_restrictions.h"
+#include "jni/JavaHandlerThread_jni.h"
+
+namespace base {
+
+namespace android {
+
+JavaHandlerThread::JavaHandlerThread(const char* name) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+
+  java_thread_.Reset(Java_JavaHandlerThread_create(
+      env, ConvertUTF8ToJavaString(env, name).Release()));
+}
+
+JavaHandlerThread::~JavaHandlerThread() {
+}
+
+void JavaHandlerThread::Start() {
+  // Check the thread has not already been started.
+  DCHECK(!message_loop_);
+
+  JNIEnv* env = base::android::AttachCurrentThread();
+  base::WaitableEvent initialize_event(false, false);
+  Java_JavaHandlerThread_start(env,
+                               java_thread_.obj(),
+                               reinterpret_cast<jint>(this),
+                               reinterpret_cast<jint>(&initialize_event));
+  // Wait for thread to be initialized so it is ready to be used when Start
+  // returns.
+  base::ThreadRestrictions::ScopedAllowWait wait_allowed;
+  initialize_event.Wait();
+}
+
+void JavaHandlerThread::Stop() {
+}
+
+void JavaHandlerThread::InitializeThread(JNIEnv* env, jobject obj, jint event) {
+  // TYPE_JAVA to get the Android java style message loop.
+  message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_JAVA));
+  static_cast<MessageLoopForUI*>(message_loop_.get())->Start();
+  reinterpret_cast<base::WaitableEvent*>(event)->Signal();
+}
+
+// static
+bool JavaHandlerThread::RegisterBindings(JNIEnv* env) {
+  return RegisterNativesImpl(env);
+}
+
+} // namespace android
+} // namespace base
diff --git a/base/android/java_handler_thread.h b/base/android/java_handler_thread.h
new file mode 100644
index 0000000..9f66d66
--- /dev/null
+++ b/base/android/java_handler_thread.h
@@ -0,0 +1,48 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_THREADING_JAVA_THREAD_H_
+#define BASE_THREADING_JAVA_THREAD_H_
+
+#include <jni.h>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/memory/scoped_ptr.h"
+
+namespace base {
+
+class MessageLoop;
+class WaitableEvent;
+
+namespace android {
+
+// A Java Thread with a native message loop. To run tasks, post them
+// to the message loop and they will be scheduled along with Java tasks
+// on the thread.
+// This is useful for callbacks where the receiver expects a thread
+// with a prepared Looper.
+class BASE_EXPORT JavaHandlerThread {
+ public:
+  JavaHandlerThread(const char* name);
+  virtual ~JavaHandlerThread();
+
+  base::MessageLoop* message_loop() const { return message_loop_.get(); }
+  void Start();
+  void Stop();
+
+  // Called from java on the newly created thread.
+  // Start() will not return before this methods has finished.
+  void InitializeThread(JNIEnv* env, jobject obj, jint event);
+
+  static bool RegisterBindings(JNIEnv* env);
+
+ private:
+  scoped_ptr<base::MessageLoop> message_loop_;
+  ScopedJavaGlobalRef<jobject> java_thread_;
+};
+
+}  // namespace android
+}  // namespace base
+
+#endif  // BASE_THREADING_JAVA_THREAD_H_
diff --git a/base/base.gyp b/base/base.gyp
index 15776f3..4b92a91 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -1160,6 +1160,7 @@
             'android/java/src/org/chromium/base/CpuFeatures.java',
             'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java',
             'android/java/src/org/chromium/base/MemoryPressureListener.java',
+            'android/java/src/org/chromium/base/JavaHandlerThread.java',
             'android/java/src/org/chromium/base/PathService.java',
             'android/java/src/org/chromium/base/PathUtils.java',
             'android/java/src/org/chromium/base/PowerMonitor.java',
diff --git a/base/base.gypi b/base/base.gypi
index fef37a1..bfe5a57 100644
--- a/base/base.gypi
+++ b/base/base.gypi
@@ -58,6 +58,8 @@
           'android/jni_string.h',
           'android/memory_pressure_listener_android.cc',
           'android/memory_pressure_listener_android.h',
+          'android/java_handler_thread.cc',
+          'android/java_handler_thread.h',
           'android/path_service_android.cc',
           'android/path_service_android.h',
           'android/path_utils.cc',
diff --git a/base/base.target.darwin-arm.mk b/base/base.target.darwin-arm.mk
index ce676e3..dfa23a3 100644
--- a/base/base.target.darwin-arm.mk
+++ b/base/base.target.darwin-arm.mk
@@ -53,6 +53,7 @@
 	base/android/jni_registrar.cc \
 	base/android/jni_string.cc \
 	base/android/memory_pressure_listener_android.cc \
+	base/android/java_handler_thread.cc \
 	base/android/path_service_android.cc \
 	base/android/path_utils.cc \
 	base/android/sys_utils.cc \
diff --git a/base/base.target.darwin-mips.mk b/base/base.target.darwin-mips.mk
index 9023fcc..2847ad4 100644
--- a/base/base.target.darwin-mips.mk
+++ b/base/base.target.darwin-mips.mk
@@ -53,6 +53,7 @@
 	base/android/jni_registrar.cc \
 	base/android/jni_string.cc \
 	base/android/memory_pressure_listener_android.cc \
+	base/android/java_handler_thread.cc \
 	base/android/path_service_android.cc \
 	base/android/path_utils.cc \
 	base/android/sys_utils.cc \
diff --git a/base/base.target.darwin-x86.mk b/base/base.target.darwin-x86.mk
index 71cd04d..d3c3e49 100644
--- a/base/base.target.darwin-x86.mk
+++ b/base/base.target.darwin-x86.mk
@@ -53,6 +53,7 @@
 	base/android/jni_registrar.cc \
 	base/android/jni_string.cc \
 	base/android/memory_pressure_listener_android.cc \
+	base/android/java_handler_thread.cc \
 	base/android/path_service_android.cc \
 	base/android/path_utils.cc \
 	base/android/sys_utils.cc \
diff --git a/base/base.target.linux-arm.mk b/base/base.target.linux-arm.mk
index ce676e3..dfa23a3 100644
--- a/base/base.target.linux-arm.mk
+++ b/base/base.target.linux-arm.mk
@@ -53,6 +53,7 @@
 	base/android/jni_registrar.cc \
 	base/android/jni_string.cc \
 	base/android/memory_pressure_listener_android.cc \
+	base/android/java_handler_thread.cc \
 	base/android/path_service_android.cc \
 	base/android/path_utils.cc \
 	base/android/sys_utils.cc \
diff --git a/base/base.target.linux-mips.mk b/base/base.target.linux-mips.mk
index 9023fcc..2847ad4 100644
--- a/base/base.target.linux-mips.mk
+++ b/base/base.target.linux-mips.mk
@@ -53,6 +53,7 @@
 	base/android/jni_registrar.cc \
 	base/android/jni_string.cc \
 	base/android/memory_pressure_listener_android.cc \
+	base/android/java_handler_thread.cc \
 	base/android/path_service_android.cc \
 	base/android/path_utils.cc \
 	base/android/sys_utils.cc \
diff --git a/base/base.target.linux-x86.mk b/base/base.target.linux-x86.mk
index 71cd04d..d3c3e49 100644
--- a/base/base.target.linux-x86.mk
+++ b/base/base.target.linux-x86.mk
@@ -53,6 +53,7 @@
 	base/android/jni_registrar.cc \
 	base/android/jni_string.cc \
 	base/android/memory_pressure_listener_android.cc \
+	base/android/java_handler_thread.cc \
 	base/android/path_service_android.cc \
 	base/android/path_utils.cc \
 	base/android/sys_utils.cc \
diff --git a/base/base_jni_headers.target.darwin-arm.mk b/base/base_jni_headers.target.darwin-arm.mk
index 84ff247..3e81dc6 100644
--- a/base/base_jni_headers.target.darwin-arm.mk
+++ b/base/base_jni_headers.target.darwin-arm.mk
@@ -15,7 +15,7 @@
 
 
 ### Generated for rule "base_base_gyp_base_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/JavaHandlerThread.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -66,6 +66,16 @@
 .PHONY: base_base_jni_headers_gyp_rule_trigger
 base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h
 
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: $(LOCAL_PATH)/base/android/java/src/org/chromium/base/JavaHandlerThread.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/base/jni; cd $(gyp_local_path)/base; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/base/JavaHandlerThread.java --output_dir "$(gyp_shared_intermediate_dir)/base/jni" --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt
+
+.PHONY: base_base_jni_headers_gyp_rule_trigger
+base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h
+
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -134,6 +144,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
@@ -150,6 +161,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
diff --git a/base/base_jni_headers.target.darwin-mips.mk b/base/base_jni_headers.target.darwin-mips.mk
index 47fe61d..e996126 100644
--- a/base/base_jni_headers.target.darwin-mips.mk
+++ b/base/base_jni_headers.target.darwin-mips.mk
@@ -15,7 +15,7 @@
 
 
 ### Generated for rule "base_base_gyp_base_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/JavaHandlerThread.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -66,6 +66,16 @@
 .PHONY: base_base_jni_headers_gyp_rule_trigger
 base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h
 
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: $(LOCAL_PATH)/base/android/java/src/org/chromium/base/JavaHandlerThread.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/base/jni; cd $(gyp_local_path)/base; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/base/JavaHandlerThread.java --output_dir "$(gyp_shared_intermediate_dir)/base/jni" --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt
+
+.PHONY: base_base_jni_headers_gyp_rule_trigger
+base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h
+
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -134,6 +144,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
@@ -150,6 +161,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
diff --git a/base/base_jni_headers.target.darwin-x86.mk b/base/base_jni_headers.target.darwin-x86.mk
index 521691e..c97c9dd 100644
--- a/base/base_jni_headers.target.darwin-x86.mk
+++ b/base/base_jni_headers.target.darwin-x86.mk
@@ -15,7 +15,7 @@
 
 
 ### Generated for rule "base_base_gyp_base_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/JavaHandlerThread.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -66,6 +66,16 @@
 .PHONY: base_base_jni_headers_gyp_rule_trigger
 base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h
 
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: $(LOCAL_PATH)/base/android/java/src/org/chromium/base/JavaHandlerThread.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/base/jni; cd $(gyp_local_path)/base; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/base/JavaHandlerThread.java --output_dir "$(gyp_shared_intermediate_dir)/base/jni" --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt
+
+.PHONY: base_base_jni_headers_gyp_rule_trigger
+base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h
+
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -134,6 +144,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
@@ -150,6 +161,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
diff --git a/base/base_jni_headers.target.linux-arm.mk b/base/base_jni_headers.target.linux-arm.mk
index 84ff247..3e81dc6 100644
--- a/base/base_jni_headers.target.linux-arm.mk
+++ b/base/base_jni_headers.target.linux-arm.mk
@@ -15,7 +15,7 @@
 
 
 ### Generated for rule "base_base_gyp_base_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/JavaHandlerThread.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -66,6 +66,16 @@
 .PHONY: base_base_jni_headers_gyp_rule_trigger
 base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h
 
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: $(LOCAL_PATH)/base/android/java/src/org/chromium/base/JavaHandlerThread.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/base/jni; cd $(gyp_local_path)/base; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/base/JavaHandlerThread.java --output_dir "$(gyp_shared_intermediate_dir)/base/jni" --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt
+
+.PHONY: base_base_jni_headers_gyp_rule_trigger
+base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h
+
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -134,6 +144,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
@@ -150,6 +161,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
diff --git a/base/base_jni_headers.target.linux-mips.mk b/base/base_jni_headers.target.linux-mips.mk
index 47fe61d..e996126 100644
--- a/base/base_jni_headers.target.linux-mips.mk
+++ b/base/base_jni_headers.target.linux-mips.mk
@@ -15,7 +15,7 @@
 
 
 ### Generated for rule "base_base_gyp_base_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/JavaHandlerThread.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -66,6 +66,16 @@
 .PHONY: base_base_jni_headers_gyp_rule_trigger
 base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h
 
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: $(LOCAL_PATH)/base/android/java/src/org/chromium/base/JavaHandlerThread.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/base/jni; cd $(gyp_local_path)/base; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/base/JavaHandlerThread.java --output_dir "$(gyp_shared_intermediate_dir)/base/jni" --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt
+
+.PHONY: base_base_jni_headers_gyp_rule_trigger
+base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h
+
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -134,6 +144,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
@@ -150,6 +161,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
diff --git a/base/base_jni_headers.target.linux-x86.mk b/base/base_jni_headers.target.linux-x86.mk
index 521691e..c97c9dd 100644
--- a/base/base_jni_headers.target.linux-x86.mk
+++ b/base/base_jni_headers.target.linux-x86.mk
@@ -15,7 +15,7 @@
 
 
 ### Generated for rule "base_base_gyp_base_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/base/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/base/ActivityStatus.java', 'android/java/src/org/chromium/base/BuildInfo.java', 'android/java/src/org/chromium/base/CpuFeatures.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/JavaHandlerThread.java', 'android/java/src/org/chromium/base/PathService.java', 'android/java/src/org/chromium/base/PathUtils.java', 'android/java/src/org/chromium/base/PowerMonitor.java', 'android/java/src/org/chromium/base/SystemMessageHandler.java', 'android/java/src/org/chromium/base/SysUtils.java', 'android/java/src/org/chromium/base/ThreadUtils.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/base/jni', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/ActivityStatus_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -66,6 +66,16 @@
 .PHONY: base_base_jni_headers_gyp_rule_trigger
 base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h
 
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h: $(LOCAL_PATH)/base/android/java/src/org/chromium/base/JavaHandlerThread.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/base/jni; cd $(gyp_local_path)/base; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/base/JavaHandlerThread.java --output_dir "$(gyp_shared_intermediate_dir)/base/jni" --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt
+
+.PHONY: base_base_jni_headers_gyp_rule_trigger
+base_base_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h
+
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -134,6 +144,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
@@ -150,6 +161,7 @@
 	$(gyp_shared_intermediate_dir)/base/jni/CpuFeatures_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/ImportantFileWriterAndroid_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/MemoryPressureListener_jni.h \
+	$(gyp_shared_intermediate_dir)/base/jni/JavaHandlerThread_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathService_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PathUtils_jni.h \
 	$(gyp_shared_intermediate_dir)/base/jni/PowerMonitor_jni.h \
diff --git a/base/containers/hash_tables.h b/base/containers/hash_tables.h
index 0615e0d..2a2b52f 100644
--- a/base/containers/hash_tables.h
+++ b/base/containers/hash_tables.h
@@ -118,36 +118,6 @@
 using BASE_HASH_NAMESPACE::hash_multimap;
 using BASE_HASH_NAMESPACE::hash_multiset;
 using BASE_HASH_NAMESPACE::hash_set;
-}
-
-
-// Implement methods for hashing a pair of integers, so they can be used as
-// keys in STL containers.
-
-#if defined(COMPILER_MSVC)
-
-#define DEFINE_PAIR_HASH_FUNCTION_START(type1, type2) \
-    template<> \
-    inline std::size_t hash_value<std::pair<type1, type2> >( \
-        const std::pair<type1, type2>& value)
-
-#define DEFINE_PAIR_HASH_FUNCTION_END()
-
-#elif defined(COMPILER_GCC)
-
-#define DEFINE_PAIR_HASH_FUNCTION_START(type1, type2) \
-    template<> \
-    struct hash<std::pair<type1, type2> > { \
-      std::size_t operator()(std::pair<type1, type2> value) const
-
-#define DEFINE_PAIR_HASH_FUNCTION_END() \
-    };
-
-#else
-#error define DEFINE_PAIR_HASH_FUNCTION_START for your compiler
-#endif  // COMPILER
-
-namespace BASE_HASH_NAMESPACE {
 
 // Implement hashing for pairs of at-most 32 bit integer values.
 // When size_t is 32 bits, we turn the 64-bit hash code into 32 bits by using
@@ -158,24 +128,61 @@
 //   h32(x32, y32) = (h64(x32, y32) * rand_odd64 + rand16 * 2^16) % 2^64 / 2^32
 //
 // Contact danakj@chromium.org for any questions.
-#define DEFINE_32BIT_PAIR_HASH(type1, type2) \
-    DEFINE_PAIR_HASH_FUNCTION_START(type1, type2) { \
-      uint64 first = value.first; \
-      uint32 second = value.second; \
-      uint64 hash64 = (first << 32) | second; \
-      \
-      if (sizeof(std::size_t) >= sizeof(uint64)) \
-        return static_cast<std::size_t>(hash64); \
-      \
-      uint64 odd_random = 481046412LL << 32 | 1025306954LL; \
-      uint32 shift_random = 10121U << 16; \
-      \
-      hash64 = hash64 * odd_random + shift_random; \
-      std::size_t high_bits = static_cast<std::size_t>( \
-          hash64 >> (sizeof(uint64) - sizeof(std::size_t))); \
-      return high_bits; \
-    } \
-  DEFINE_PAIR_HASH_FUNCTION_END();
+inline std::size_t HashInts32(uint32 value1, uint32 value2) {
+  uint64 value1_64 = value1;
+  uint64 hash64 = (value1_64 << 32) | value2;
+
+  if (sizeof(std::size_t) >= sizeof(uint64))
+    return static_cast<std::size_t>(hash64);
+
+  uint64 odd_random = 481046412LL << 32 | 1025306955LL;
+  uint32 shift_random = 10121U << 16;
+
+  hash64 = hash64 * odd_random + shift_random;
+  std::size_t high_bits = static_cast<std::size_t>(
+      hash64 >> (sizeof(uint64) - sizeof(std::size_t)));
+  return high_bits;
+}
+
+// Implement hashing for pairs of up-to 64-bit integer values.
+// We use the compound integer hash method to produce a 64-bit hash code, by
+// breaking the two 64-bit inputs into 4 32-bit values:
+// http://opendatastructures.org/versions/edition-0.1d/ods-java/node33.html#SECTION00832000000000000000
+// Then we reduce our result to 32 bits if required, similar to above.
+inline std::size_t HashInts64(uint64 value1, uint64 value2) {
+  uint32 short_random1 = 842304669U;
+  uint32 short_random2 = 619063811U;
+  uint32 short_random3 = 937041849U;
+  uint32 short_random4 = 3309708029U;
+
+  uint32 value1a = static_cast<uint32>(value1 & 0xffffffff);
+  uint32 value1b = static_cast<uint32>((value1 >> 32) & 0xffffffff);
+  uint32 value2a = static_cast<uint32>(value2 & 0xffffffff);
+  uint32 value2b = static_cast<uint32>((value2 >> 32) & 0xffffffff);
+
+  uint64 product1 = static_cast<uint64>(value1a) * short_random1;
+  uint64 product2 = static_cast<uint64>(value1b) * short_random2;
+  uint64 product3 = static_cast<uint64>(value2a) * short_random3;
+  uint64 product4 = static_cast<uint64>(value2b) * short_random4;
+
+  uint64 hash64 = product1 + product2 + product3 + product4;
+
+  if (sizeof(std::size_t) >= sizeof(uint64))
+    return static_cast<std::size_t>(hash64);
+
+  uint64 odd_random = 1578233944LL << 32 | 194370989LL;
+  uint32 shift_random = 20591U << 16;
+
+  hash64 = hash64 * odd_random + shift_random;
+  std::size_t high_bits = static_cast<std::size_t>(
+      hash64 >> (sizeof(uint64) - sizeof(std::size_t)));
+  return high_bits;
+}
+
+#define DEFINE_32BIT_PAIR_HASH(Type1, Type2) \
+inline std::size_t HashPair(Type1 value1, Type2 value2) { \
+  return HashInts32(value1, value2); \
+}
 
 DEFINE_32BIT_PAIR_HASH(int16, int16);
 DEFINE_32BIT_PAIR_HASH(int16, uint16);
@@ -196,44 +203,10 @@
 
 #undef DEFINE_32BIT_PAIR_HASH
 
-// Implement hashing for pairs of up-to 64-bit integer values.
-// We use the compound integer hash method to produce a 64-bit hash code, by
-// breaking the two 64-bit inputs into 4 32-bit values:
-// http://opendatastructures.org/versions/edition-0.1d/ods-java/node33.html#SECTION00832000000000000000
-// Then we reduce our result to 32 bits if required, similar to above.
-#define DEFINE_64BIT_PAIR_HASH(type1, type2) \
-    DEFINE_PAIR_HASH_FUNCTION_START(type1, type2) { \
-      uint32 short_random1 = 842304669U; \
-      uint32 short_random2 = 619063811U; \
-      uint32 short_random3 = 937041849U; \
-      uint32 short_random4 = 3309708029U; \
-      \
-      uint64 value1 = value.first; \
-      uint64 value2 = value.second; \
-      uint32 value1a = static_cast<uint32>(value1 & 0xffffffff); \
-      uint32 value1b = static_cast<uint32>((value1 >> 32) & 0xffffffff); \
-      uint32 value2a = static_cast<uint32>(value2 & 0xffffffff); \
-      uint32 value2b = static_cast<uint32>((value2 >> 32) & 0xffffffff); \
-      \
-      uint64 product1 = static_cast<uint64>(value1a) * short_random1; \
-      uint64 product2 = static_cast<uint64>(value1b) * short_random2; \
-      uint64 product3 = static_cast<uint64>(value2a) * short_random3; \
-      uint64 product4 = static_cast<uint64>(value2b) * short_random4; \
-      \
-      uint64 hash64 = product1 + product2 + product3 + product4; \
-      \
-      if (sizeof(std::size_t) >= sizeof(uint64)) \
-        return static_cast<std::size_t>(hash64); \
-      \
-      uint64 odd_random = 1578233944LL << 32 | 194370989LL; \
-      uint32 shift_random = 20591U << 16; \
-      \
-      hash64 = hash64 * odd_random + shift_random; \
-      std::size_t high_bits = static_cast<std::size_t>( \
-          hash64 >> (sizeof(uint64) - sizeof(std::size_t))); \
-      return high_bits; \
-    } \
-  DEFINE_PAIR_HASH_FUNCTION_END();
+#define DEFINE_64BIT_PAIR_HASH(Type1, Type2) \
+inline std::size_t HashPair(Type1 value1, Type2 value2) { \
+  return HashInts64(value1, value2); \
+}
 
 DEFINE_64BIT_PAIR_HASH(int16, int64);
 DEFINE_64BIT_PAIR_HASH(int16, uint64);
@@ -257,6 +230,32 @@
 DEFINE_64BIT_PAIR_HASH(uint64, uint64);
 
 #undef DEFINE_64BIT_PAIR_HASH
+}  // namespace base
+
+namespace BASE_HASH_NAMESPACE {
+
+// Implement methods for hashing a pair of integers, so they can be used as
+// keys in STL containers.
+
+#if defined(COMPILER_MSVC)
+
+template<typename Type1, typename Type2>
+inline std::size_t hash_value(const std::pair<Type1, Type2>& value) {
+  return base::HashPair(value.first, value.second);
+}
+
+#elif defined(COMPILER_GCC)
+template<typename Type1, typename Type2>
+struct hash<std::pair<Type1, Type2> > {
+  std::size_t operator()(std::pair<Type1, Type2> value) const {
+    return base::HashPair(value.first, value.second);
+  }
+};
+
+#else
+#error define hash<std::pair<Type1, Type2> > for your compiler
+#endif  // COMPILER
+
 }
 
 #undef DEFINE_PAIR_HASH_FUNCTION_START
diff --git a/base/debug/trace_event_android.cc b/base/debug/trace_event_android.cc
index 7a9ad30..78d9de6 100644
--- a/base/debug/trace_event_android.cc
+++ b/base/debug/trace_event_android.cc
@@ -70,7 +70,7 @@
     if (g_atrace_fd == -1) {
       LOG(WARNING) << "Couldn't open " << kATraceMarkerFile;
     } else {
-      EnableIncludedCategoryGroups();
+      UpdateCategoryGroupEnabledFlags();
     }
   }
 }
@@ -80,7 +80,7 @@
   if (g_atrace_fd != -1) {
     close(g_atrace_fd);
     g_atrace_fd = -1;
-    EnableIncludedCategoryGroups();
+    UpdateCategoryGroupEnabledFlags();
   }
 }
 
diff --git a/base/debug/trace_event_impl.cc b/base/debug/trace_event_impl.cc
index 44d1f71..6e1f08c 100644
--- a/base/debug/trace_event_impl.cc
+++ b/base/debug/trace_event_impl.cc
@@ -867,14 +867,20 @@
   return g_category_groups[category_index];
 }
 
-void TraceLog::EnableIncludedCategoryGroup(int category_index) {
-  bool is_enabled = category_filter_.IsCategoryGroupEnabled(
+void TraceLog::UpdateCategoryGroupEnabledFlag(int category_index) {
+  bool is_enabled = enable_count_ && category_filter_.IsCategoryGroupEnabled(
       g_category_groups[category_index]);
   SetCategoryGroupEnabled(category_index, is_enabled);
 }
 
+void TraceLog::UpdateCategoryGroupEnabledFlags() {
+  for (int i = 0; i < g_category_index; i++)
+    UpdateCategoryGroupEnabledFlag(i);
+}
+
 void TraceLog::SetCategoryGroupEnabled(int category_index, bool is_enabled) {
-  g_category_group_enabled[category_index] = is_enabled ? CATEGORY_ENABLED : 0;
+  g_category_group_enabled[category_index] =
+      is_enabled ? CATEGORY_GROUP_ENABLED : 0;
 
 #if defined(OS_ANDROID)
   ApplyATraceEnabledFlag(&g_category_group_enabled[category_index]);
@@ -885,12 +891,7 @@
     const unsigned char* category_group_enabled) {
   // On Android, ATrace and normal trace can be enabled independently.
   // This function checks if the normal trace is enabled.
-  return *category_group_enabled & CATEGORY_ENABLED;
-}
-
-void TraceLog::EnableIncludedCategoryGroups() {
-  for (int i = 0; i < g_category_index; i++)
-    EnableIncludedCategoryGroup(i);
+  return *category_group_enabled & CATEGORY_GROUP_ENABLED;
 }
 
 const unsigned char* TraceLog::GetCategoryGroupEnabledInternal(
@@ -921,14 +922,10 @@
       ANNOTATE_LEAKING_OBJECT_PTR(new_group);
       g_category_groups[new_index] = new_group;
       DCHECK(!g_category_group_enabled[new_index]);
-      if (enable_count_) {
-        // Note that if both included and excluded patterns in the
-        // CategoryFilter are empty, we exclude nothing,
-        // thereby enabling this category group.
-        EnableIncludedCategoryGroup(new_index);
-      } else {
-        SetCategoryGroupEnabled(new_index, false);
-      }
+      // Note that if both included and excluded patterns in the
+      // CategoryFilter are empty, we exclude nothing,
+      // thereby enabling this category group.
+      UpdateCategoryGroupEnabledFlag(new_index);
       category_group_enabled = &g_category_group_enabled[new_index];
     } else {
       category_group_enabled =
@@ -958,7 +955,7 @@
       }
 
       category_filter_.Merge(category_filter);
-      EnableIncludedCategoryGroups();
+      UpdateCategoryGroupEnabledFlags();
       return;
     }
 
@@ -976,7 +973,7 @@
     num_traces_recorded_++;
 
     category_filter_ = CategoryFilter(category_filter);
-    EnableIncludedCategoryGroups();
+    UpdateCategoryGroupEnabledFlags();
 
     if (options & ENABLE_SAMPLING) {
       sampling_thread_.reset(new TraceSamplingThread);
@@ -1044,8 +1041,7 @@
     category_filter_.Clear();
     watch_category_ = NULL;
     watch_event_name_ = "";
-    for (int i = 0; i < g_category_index; i++)
-      SetCategoryGroupEnabled(i, false);
+    UpdateCategoryGroupEnabledFlags();
     AddMetadataEvents();
 
     dispatching_to_observer_list_ = true;
diff --git a/base/debug/trace_event_impl.h b/base/debug/trace_event_impl.h
index 0f30c1e..c3ceec6 100644
--- a/base/debug/trace_event_impl.h
+++ b/base/debug/trace_event_impl.h
@@ -479,11 +479,13 @@
   // by the Singleton class.
   friend struct DefaultSingletonTraits<TraceLog>;
 
-  // Enable/disable each category group based on the current category_filter_.
-  // If the category group contains a category that matches an included category
+  // Enable/disable each category group based on the current enable_count_
+  // and category_filter_. Disable the category group if enabled_count_ is 0, or
+  // if the category group contains a category that matches an included category
   // pattern, that category group will be enabled.
-  void EnableIncludedCategoryGroups();
-  void EnableIncludedCategoryGroup(int category_index);
+  // On Android, ATRACE_ENABLED flag will be applied if atrace is started.
+  void UpdateCategoryGroupEnabledFlags();
+  void UpdateCategoryGroupEnabledFlag(int category_index);
 
   static void SetCategoryGroupEnabled(int category_index, bool enabled);
   static bool IsCategoryGroupEnabled(
@@ -492,9 +494,9 @@
   // The pointer returned from GetCategoryGroupEnabledInternal() points to a
   // value with zero or more of the following bits. Used in this class only.
   // The TRACE_EVENT macros should only use the value as a bool.
-  enum CategoryEnabledFlags {
-    // Normal enabled flag for categories enabled with Enable().
-    CATEGORY_ENABLED = 1 << 0,
+  enum CategoryGroupEnabledFlags {
+    // Normal enabled flag for category groups enabled with Enable().
+    CATEGORY_GROUP_ENABLED = 1 << 0,
     // On Android if ATrace is enabled, all categories will have this bit.
     // Not used on other platforms.
     ATRACE_ENABLED = 1 << 1
diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc
index d2eafbd..826c757 100644
--- a/base/message_loop/message_loop.cc
+++ b/base/message_loop/message_loop.cc
@@ -92,7 +92,7 @@
 // time for every task that is added to the MessageLoop incoming queue.
 bool AlwaysNotifyPump(MessageLoop::Type type) {
 #if defined(OS_ANDROID)
-  return type == MessageLoop::TYPE_UI;
+  return type == MessageLoop::TYPE_UI || type == MessageLoop::TYPE_JAVA;
 #else
   return false;
 #endif
@@ -184,6 +184,10 @@
       pump_.reset(MESSAGE_PUMP_UI);
   } else if (type_ == TYPE_IO) {
     pump_.reset(MESSAGE_PUMP_IO);
+#if defined(OS_ANDROID)
+  } else if (type_ == TYPE_JAVA) {
+    pump_.reset(MESSAGE_PUMP_UI);
+#endif
   } else {
     DCHECK_EQ(TYPE_DEFAULT, type_);
     pump_.reset(new MessagePumpDefault());
diff --git a/base/message_loop/message_loop.h b/base/message_loop/message_loop.h
index 6f71a85..f22c904 100644
--- a/base/message_loop/message_loop.h
+++ b/base/message_loop/message_loop.h
@@ -109,10 +109,19 @@
   //   This type of ML also supports asynchronous IO.  See also
   //   MessageLoopForIO.
   //
+  // TYPE_JAVA
+  //   This type of ML is backed by a Java message handler which is responsible
+  //   for running the tasks added to the ML. This is only for use on Android.
+  //   TYPE_JAVA behaves in essence like TYPE_UI, except during construction
+  //   where it does not use the main thread specific pump factory.
+  //
   enum Type {
     TYPE_DEFAULT,
     TYPE_UI,
-    TYPE_IO
+    TYPE_IO,
+#if defined(OS_ANDROID)
+    TYPE_JAVA,
+#endif // defined(OS_ANDROID)
   };
 
   // Normally, it is not necessary to instantiate a MessageLoop.  Instead, it
diff --git a/base/threading/thread_restrictions.h b/base/threading/thread_restrictions.h
index 6490b04..595b970 100644
--- a/base/threading/thread_restrictions.h
+++ b/base/threading/thread_restrictions.h
@@ -73,6 +73,10 @@
 
 namespace base {
 
+namespace android {
+class JavaHandlerThread;
+}
+
 class SequencedWorkerPool;
 class SimpleThread;
 class Thread;
@@ -185,6 +189,7 @@
   friend class Thread;
   friend class ThreadTestHelper;
   friend class PlatformThread;
+  friend class android::JavaHandlerThread;
 
   // END ALLOWED USAGE.
   // BEGIN USAGE THAT NEEDS TO BE FIXED.
diff --git a/build/android/bb_run_sharded_steps.py b/build/android/bb_run_sharded_steps.py
index 9b768a9..086a3a1 100755
--- a/build/android/bb_run_sharded_steps.py
+++ b/build/android/bb_run_sharded_steps.py
@@ -54,6 +54,7 @@
 import signal
 import shutil
 import sys
+import time
 
 from pylib import android_commands
 from pylib import cmd_helper
@@ -174,6 +175,18 @@
           os.kill(int(pid), signal.SIGQUIT)
         except Exception as e:
           logging.warning('Failed killing %s %s %s', server, pid, e)
+  # Restart the adb server with full trace, and redirect stderr to stdout
+  # so the extra tracing won't confuse higher up layers.
+  os.environ['ADB_TRACE'] = 'all'
+  cmd_helper.RunCmd(['adb', 'kill-server'])
+  cmd_helper.RunCmd(['adb', 'start-server'])
+  cmd_helper.RunCmd(['adb', 'root'])
+  i = 1
+  while not android_commands.GetAttachedDevices():
+    time.sleep(i)
+    i *= 2
+    if i > 10:
+      break
 
 
 def main(argv):
diff --git a/build/android/buildbot/bb_device_status_check.py b/build/android/buildbot/bb_device_status_check.py
index 1df95a3..ae0bb4a 100755
--- a/build/android/buildbot/bb_device_status_check.py
+++ b/build/android/buildbot/bb_device_status_check.py
@@ -11,6 +11,7 @@
 import smtplib
 import sys
 import re
+import urllib
 
 import bb_annotations
 
@@ -148,9 +149,19 @@
 
     # TODO(navabi): Debug by printing both output from GetCmdOutput and
     # GetAttachedDevices to compare results.
+    crbug_link = ('https://code.google.com/p/chromium/issues/entry?summary='
+                  '%s&comment=%s&labels=Restrict-View-Google,OS-Android,Infra' %
+                  (urllib.quote('Device Offline'),
+                   urllib.quote('Buildbot: %s %s\n'
+                                'Build: %s\n'
+                                '(please don\'t change any labels)' %
+                                (os.environ.get('BUILDBOT_BUILDERNAME'),
+                                 os.environ.get('BUILDBOT_SLAVENAME'),
+                                 os.environ.get('BUILDBOT_BUILDNUMBER')))))
     return ['Current online devices: %s' % adb_online_devs,
             '%s are no longer visible. Were they removed?\n' % missing_devs,
-            'SHERIFF: See go/chrome_device_monitor',
+            'SHERIFF:\n',
+            '@@@STEP_LINK@Click here to file a bug@%s@@@\n' % crbug_link,
             'Cache file: %s\n\n' % last_devices_path,
             'adb devices: %s' % GetCmdOutput(['adb', 'devices']),
             'adb devices(GetAttachedDevices): %s' %
diff --git a/build/android/pylib/android_commands.py b/build/android/pylib/android_commands.py
index 4cf070d..cb72fff 100644
--- a/build/android/pylib/android_commands.py
+++ b/build/android/pylib/android_commands.py
@@ -184,14 +184,15 @@
   return files
 
 
-def _ComputeFileListHash(md5sum_output):
+def _ParseMd5SumOutput(md5sum_output):
   """Returns a list of tuples from the provided md5sum output.
 
   Args:
     md5sum_output: output directly from md5sum binary.
 
   Returns:
-    List of namedtuples (hash, path).
+    List of namedtuples with attributes |hash| and |path|, where |path| is the
+    absolute path to the file with an Md5Sum of |hash|.
   """
   HashAndPath = collections.namedtuple('HashAndPath', ['hash', 'path'])
   split_lines = [line.split('  ') for line in md5sum_output]
@@ -418,7 +419,8 @@
     # Check if package is already installed and up to date.
     if package_name:
       installed_apk_path = self.GetApplicationPath(package_name)
-      if installed_apk_path and self.CheckMd5Sum(apk_path, installed_apk_path):
+      if (installed_apk_path and
+          not self.GetFilesChanged(apk_path, installed_apk_path)):
         logging.info('Skipped install: identical %s APK already installed' %
             package_name)
         return
@@ -738,15 +740,16 @@
     """
     self.RunShellCommand('input keyevent %d' % keycode)
 
-  def CheckMd5Sum(self, local_path, device_path):
-    """Compares the md5sum of a local path against a device path.
+  def _RunMd5Sum(self, host_path, device_path):
+    """Gets the md5sum of a host path and device path.
 
     Args:
-      local_path: Path (file or directory) on the host.
+      host_path: Path (file or directory) on the host.
       device_path: Path on the device.
 
     Returns:
-      True if the md5sums match.
+      A tuple containing lists of the host and device md5sum results as
+      created by _ParseMd5SumOutput().
     """
     if not self._md5sum_build_dir:
       default_build_type = os.environ.get('BUILD_TYPE', 'Debug')
@@ -763,73 +766,112 @@
 
     cmd = (MD5SUM_LD_LIBRARY_PATH + ' ' + self._util_wrapper + ' ' +
            MD5SUM_DEVICE_PATH + ' ' + device_path)
-    device_hash_tuples = _ComputeFileListHash(
+    device_hash_tuples = _ParseMd5SumOutput(
         self.RunShellCommand(cmd, timeout_time=2 * 60))
-    assert os.path.exists(local_path), 'Local path not found %s' % local_path
+    assert os.path.exists(host_path), 'Local path not found %s' % host_path
     md5sum_output = cmd_helper.GetCmdOutput(
-        ['%s/md5sum_bin_host' % self._md5sum_build_dir, local_path])
-    host_hash_tuples = _ComputeFileListHash(md5sum_output.splitlines())
+        ['%s/md5sum_bin_host' % self._md5sum_build_dir, host_path])
+    host_hash_tuples = _ParseMd5SumOutput(md5sum_output.splitlines())
+    return (host_hash_tuples, device_hash_tuples)
+
+  def GetFilesChanged(self, host_path, device_path):
+    """Compares the md5sum of a host path against a device path.
+
+    Note: Ignores extra files on the device.
+
+    Args:
+      host_path: Path (file or directory) on the host.
+      device_path: Path on the device.
+
+    Returns:
+      A list of tuples of the form (host_path, device_path) for files whose
+      md5sums do not match.
+    """
+    host_hash_tuples, device_hash_tuples = self._RunMd5Sum(
+        host_path, device_path)
 
     # Ignore extra files on the device.
     if len(device_hash_tuples) > len(host_hash_tuples):
       host_files = [os.path.relpath(os.path.normpath(p.path),
-                    os.path.normpath(local_path)) for p in host_hash_tuples]
+                    os.path.normpath(host_path)) for p in host_hash_tuples]
 
-      def _host_has(fname):
+      def HostHas(fname):
         return any(path in fname for path in host_files)
 
-      hashes_on_device = [h.hash for h in device_hash_tuples if
-                         _host_has(h.path)]
-    else:
-      hashes_on_device = [h.hash for h in device_hash_tuples]
+      device_hash_tuples = [h for h in device_hash_tuples if HostHas(h.path)]
 
-    # Compare md5sums between host and device files.
-    hashes_on_host = [h.hash for h in host_hash_tuples]
-    hashes_on_device.sort()
-    hashes_on_host.sort()
-    return hashes_on_device == hashes_on_host
+    # Constructs the target device path from a given host path. Don't use when
+    # only a single file is given as the base name given in device_path may
+    # differ from that in host_path.
+    def HostToDevicePath(host_file_path):
+      return os.path.join(os.path.dirname(device_path), os.path.relpath(
+          host_file_path, os.path.dirname(os.path.normpath(host_path))))
 
-  def PushIfNeeded(self, local_path, device_path):
-    """Pushes |local_path| to |device_path|.
+    device_hashes = [h.hash for h in device_hash_tuples]
+    return [(t.path, HostToDevicePath(t.path) if os.path.isdir(host_path) else
+             device_path)
+            for t in host_hash_tuples if t.hash not in device_hashes]
+
+  def PushIfNeeded(self, host_path, device_path):
+    """Pushes |host_path| to |device_path|.
 
     Works for files and directories. This method skips copying any paths in
     |test_data_paths| that already exist on the device with the same hash.
 
     All pushed files can be removed by calling RemovePushedFiles().
     """
-    assert os.path.exists(local_path), 'Local path not found %s' % local_path
-    size = int(cmd_helper.GetCmdOutput(['du', '-sb', local_path]).split()[0])
+    MAX_INDIVIDUAL_PUSHES = 50
+    assert os.path.exists(host_path), 'Local path not found %s' % host_path
+
+    def GetHostSize(path):
+      return int(cmd_helper.GetCmdOutput(['du', '-sb', path]).split()[0])
+
+    size = GetHostSize(host_path)
     self._pushed_files.append(device_path)
     self._potential_push_size += size
 
-    if self.CheckMd5Sum(local_path, device_path):
+    changed_files = self.GetFilesChanged(host_path, device_path)
+    if not changed_files:
       return
 
-    self._actual_push_size += size
-    # They don't match, so remove everything first and then create it.
-    if os.path.isdir(local_path):
-      self.RunShellCommand('rm -r %s' % device_path, timeout_time=2 * 60)
-      self.RunShellCommand('mkdir -p %s' % device_path)
+    def Push(host, device):
+      # NOTE: We can't use adb_interface.Push() because it hardcodes a timeout
+      # of 60 seconds which isn't sufficient for a lot of users of this method.
+      push_command = 'push %s %s' % (host, device)
+      self._LogShell(push_command)
 
-    # NOTE: We can't use adb_interface.Push() because it hardcodes a timeout of
-    # 60 seconds which isn't sufficient for a lot of users of this method.
-    push_command = 'push %s %s' % (local_path, device_path)
-    self._LogShell(push_command)
+      # Retry push with increasing backoff if the device is busy.
+      retry = 0
+      while True:
+        output = self._adb.SendCommand(push_command, timeout_time=30 * 60)
+        if _HasAdbPushSucceeded(output):
+          return
+        if retry < 3:
+          retry += 1
+          wait_time = 5 * retry
+          logging.error('Push failed, retrying in %d seconds: %s' %
+                        (wait_time, output))
+          time.sleep(wait_time)
+        else:
+          raise Exception('Push failed: %s' % output)
 
-    # Retry push with increasing backoff if the device is busy.
-    retry = 0
-    while True:
-      output = self._adb.SendCommand(push_command, timeout_time=30 * 60)
-      if _HasAdbPushSucceeded(output):
-        return
-      if 'resource busy' in output and retry < 3:
-        retry += 1
-        wait_time = 5 * retry
-        logging.error('Push failed, retrying in %d seconds: %s' %
-                      (wait_time, output))
-        time.sleep(wait_time)
-      else:
-        raise Exception('Push failed: %s' % output)
+    diff_size = 0
+    if len(changed_files) <= MAX_INDIVIDUAL_PUSHES:
+      diff_size = sum(GetHostSize(f[0]) for f in changed_files)
+
+    # TODO(craigdh): Replace this educated guess with a heuristic that
+    # approximates the push time for each method.
+    if len(changed_files) > MAX_INDIVIDUAL_PUSHES or diff_size > 0.5 * size:
+      # We're pushing everything, remove everything first and then create it.
+      self._actual_push_size += size
+      if os.path.isdir(host_path):
+        self.RunShellCommand('rm -r %s' % device_path, timeout_time=2 * 60)
+        self.RunShellCommand('mkdir -p %s' % device_path)
+      Push(host_path, device_path)
+    else:
+      for f in changed_files:
+        Push(f[0], f[1])
+      self._actual_push_size += diff_size
 
   def GetPushSizeInfo(self):
     """Get total size of pushes to the device done via PushIfNeeded()
diff --git a/build/android/pylib/instrumentation/test_options.py b/build/android/pylib/instrumentation/test_options.py
index fec3d9c..0c9ac00 100644
--- a/build/android/pylib/instrumentation/test_options.py
+++ b/build/android/pylib/instrumentation/test_options.py
@@ -17,7 +17,6 @@
     'test_data',
     'save_perf_json',
     'screenshot_failures',
-    'disable_assertions',
     'wait_for_debugger',
     'test_apk',
     'test_apk_path',
diff --git a/build/android/pylib/instrumentation/test_runner.py b/build/android/pylib/instrumentation/test_runner.py
index 4464d72..5e2b67e 100644
--- a/build/android/pylib/instrumentation/test_runner.py
+++ b/build/android/pylib/instrumentation/test_runner.py
@@ -126,8 +126,7 @@
       logging.warning('Unable to enable java asserts for %s, non rooted device',
                       self.device)
     else:
-      if self.adb.SetJavaAssertsEnabled(
-          enable=not self.options.disable_assertions):
+      if self.adb.SetJavaAssertsEnabled(True):
         self.adb.Reboot(full_reboot=False)
 
     # We give different default value to launch HTTP server based on shard index
diff --git a/build/android/pylib/monkey/__init__.py b/build/android/pylib/monkey/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build/android/pylib/monkey/__init__.py
diff --git a/build/android/pylib/monkey/setup.py b/build/android/pylib/monkey/setup.py
new file mode 100644
index 0000000..5735d2e
--- /dev/null
+++ b/build/android/pylib/monkey/setup.py
@@ -0,0 +1,27 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Generates test runner factory and tests for monkey tests."""
+
+import test_runner
+
+
+def Setup(test_options):
+  """Create and return the test runner factory and tests.
+
+  Args:
+    test_options: A MonkeyOptions object.
+
+  Returns:
+    A tuple of (TestRunnerFactory, tests).
+  """
+  # Token to replicate across devices as the "test". The TestRunner does all of
+  # the work to run the test.
+  tests = ['MonkeyTest']
+
+  def TestRunnerFactory(device, shard_index):
+    return test_runner.TestRunner(
+        test_options, device, shard_index)
+
+  return (TestRunnerFactory, tests)
diff --git a/build/android/pylib/monkey/test_options.py b/build/android/pylib/monkey/test_options.py
new file mode 100644
index 0000000..6b095f3
--- /dev/null
+++ b/build/android/pylib/monkey/test_options.py
@@ -0,0 +1,18 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Defines the MonkeyOptions named tuple."""
+
+import collections
+
+MonkeyOptions = collections.namedtuple('MonkeyOptions', [
+    'build_type',
+    'verbose_count',
+    'package_name',
+    'activity_name',
+    'event_count',
+    'category',
+    'throttle',
+    'seed',
+    'extra_args'])
diff --git a/build/android/pylib/monkey/test_runner.py b/build/android/pylib/monkey/test_runner.py
new file mode 100644
index 0000000..99bc2e6
--- /dev/null
+++ b/build/android/pylib/monkey/test_runner.py
@@ -0,0 +1,77 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Runs a monkey test on a single device."""
+
+import random
+
+from pylib.base import base_test_result
+from pylib.base import base_test_runner
+
+
+class TestRunner(base_test_runner.BaseTestRunner):
+  """A TestRunner instance runs a monkey test on a single device."""
+
+  def __init__(self, test_options, device, shard_index):
+    super(TestRunner, self).__init__(device, None, test_options.build_type)
+    self.options = test_options
+
+  def _LaunchMonkeyTest(self):
+    """Runs monkey test for a given package.
+
+    Returns:
+      Output from the monkey command on the device.
+    """
+
+    timeout_ms = self.options.event_count * self.options.throttle * 1.5
+
+    cmd = ['monkey',
+           '-p %s' % self.options.package_name,
+           ' '.join(['-c %s' % c for c in self.options.category]),
+           '--throttle %d' % self.options.throttle,
+           '-s %d' % (self.options.seed or random.randint(1, 100)),
+           '-v ' * self.options.verbose_count,
+           '--monitor-native-crashes',
+           '--kill-process-after-error',
+           self.options.extra_args,
+           '%d' % self.options.event_count]
+    return self.adb.RunShellCommand(' '.join(cmd), timeout_time=timeout_ms)
+
+  def RunTest(self, test_name):
+    """Run a Monkey test on the device.
+
+    Args:
+      test_name: String to use for logging the test result.
+
+    Returns:
+      A tuple of (TestRunResults, retry).
+    """
+    self.adb.StartActivity(self.options.package_name,
+                           self.options.activity_name,
+                           wait_for_completion=True,
+                           action='android.intent.action.MAIN',
+                           force_stop=True)
+
+    # Chrome crashes are not always caught by Monkey test runner.
+    # Verify Chrome has the same PID before and after the test.
+    before_pids = self.adb.ExtractPid(self.options.package_name)
+
+    # Run the test.
+    output = ''
+    if before_pids:
+      output = '\n'.join(self._LaunchMonkeyTest())
+      after_pids = self.adb.ExtractPid(self.options.package_name)
+
+    crashed = (not before_pids or not after_pids
+               or after_pids[0] != before_pids[0])
+
+    results = base_test_result.TestRunResults()
+    if 'Monkey finished' in output and not crashed:
+      result = base_test_result.BaseTestResult(
+          test_name, base_test_result.ResultType.PASS, log=output)
+    else:
+      result = base_test_result.BaseTestResult(
+          test_name, base_test_result.ResultType.FAIL, log=output)
+    results.AddResult(result)
+    return results, False
diff --git a/build/android/pylib/uiautomator/test_options.py b/build/android/pylib/uiautomator/test_options.py
index ddc2ae0..2ce5eb0 100644
--- a/build/android/pylib/uiautomator/test_options.py
+++ b/build/android/pylib/uiautomator/test_options.py
@@ -17,7 +17,6 @@
     'test_data',
     'save_perf_json',
     'screenshot_failures',
-    'disable_assertions',
     'uiautomator_jar',
     'uiautomator_info_jar',
     'package_name'])
diff --git a/build/android/pylib/uiautomator/test_runner.py b/build/android/pylib/uiautomator/test_runner.py
index 74e887d..58cdd45 100644
--- a/build/android/pylib/uiautomator/test_runner.py
+++ b/build/android/pylib/uiautomator/test_runner.py
@@ -35,7 +35,6 @@
         test_options.test_data,
         test_options.save_perf_json,
         test_options.screenshot_failures,
-        test_options.disable_assertions,
         wait_for_debugger=False,
         test_apk=None,
         test_apk_path=None,
diff --git a/build/android/run_monkey_test.py b/build/android/run_monkey_test.py
deleted file mode 100755
index 4957ac6..0000000
--- a/build/android/run_monkey_test.py
+++ /dev/null
@@ -1,170 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Runs the Monkey tests on one or more devices."""
-import logging
-import optparse
-import random
-import sys
-
-from pylib.base import base_test_result
-from pylib.base import test_dispatcher
-from pylib.host_driven import test_case
-from pylib.host_driven import test_runner
-from pylib.utils import report_results
-from pylib.utils import test_options_parser
-
-
-class MonkeyTest(test_case.HostDrivenTestCase):
-  def __init__(self, test_name, package_name, activity_name, category, seed,
-               throttle, event_count, verbosity, extra_args):
-    """Create a MonkeyTest object.
-
-    Args:
-      test_name: Name of the method to run for this test object.
-      package_name: Allowed package.
-      activity_name: Name of the activity to start.
-      category: A list of allowed categories.
-      seed: Seed value for pseduo-random generator. Same seed value
-          generates the same sequence of events. Seed is randomized by default.
-      throttle: Delay between events (ms).
-      event_count: Number of events to generate.
-      verbosity: Verbosity level [0-3].
-      extra_args: A string of other args to pass to the command verbatim.
-    """
-    super(MonkeyTest, self).__init__(test_name)
-    self.package_name = package_name
-    self.activity_name = activity_name
-    self.category = category
-    self.seed = seed or random.randint(1, 100)
-    self.throttle = throttle
-    self.event_count = event_count
-    self.verbosity = verbosity
-    self.extra_args = extra_args
-
-  def testMonkey(self):
-    # Launch and wait for Chrome to launch.
-    self.adb.StartActivity(self.package_name,
-                           self.activity_name,
-                           wait_for_completion=True,
-                           action='android.intent.action.MAIN',
-                           force_stop=True)
-
-    # Chrome crashes are not always caught by Monkey test runner.
-    # Verify Chrome has the same PID before and after the test.
-    before_pids = self.adb.ExtractPid(self.package_name)
-
-    # Run the test.
-    output = ''
-    if before_pids:
-      output = '\n'.join(self._LaunchMonkeyTest())
-      after_pids = self.adb.ExtractPid(self.package_name)
-
-    crashed = (not before_pids or not after_pids
-               or after_pids[0] != before_pids[0])
-
-    results = base_test_result.TestRunResults()
-    if 'Monkey finished' in output and not crashed:
-      result = base_test_result.BaseTestResult(
-          self.tagged_name, base_test_result.ResultType.PASS, log=output)
-    else:
-      result = base_test_result.BaseTestResult(
-          self.tagged_name, base_test_result.ResultType.FAIL, log=output)
-    results.AddResult(result)
-    return results
-
-  def _LaunchMonkeyTest(self):
-    """Runs monkey test for a given package.
-
-    Returns:
-      Output from the monkey command on the device.
-    """
-
-    timeout_ms = self.event_count * self.throttle * 1.5
-
-    cmd = ['monkey',
-           '-p %s' % self.package_name,
-           ' '.join(['-c %s' % c for c in self.category]),
-           '--throttle %d' % self.throttle,
-           '-s %d' % self.seed,
-           '-v ' * self.verbosity,
-           '--monitor-native-crashes',
-           '--kill-process-after-error',
-           self.extra_args,
-           '%d' % self.event_count]
-    return self.adb.RunShellCommand(' '.join(cmd), timeout_time=timeout_ms)
-
-
-def RunMonkeyTests(options):
-  """Runs the Monkey tests, replicating it if there multiple devices."""
-  logger = logging.getLogger()
-  logger.setLevel(logging.DEBUG)
-
-  # Actually run the tests.
-  logging.debug('Running monkey tests.')
-  available_tests = [
-      MonkeyTest('testMonkey', options.package_name, options.activity_name,
-                 category=options.category, seed=options.seed,
-                 throttle=options.throttle, event_count=options.event_count,
-                 verbosity=options.verbosity, extra_args=options.extra_args)]
-
-  def TestRunnerFactory(device, shard_index):
-    return test_runner.HostDrivenTestRunner(
-        device, shard_index, '', options.build_type, False, False)
-
-  results, exit_code = test_dispatcher.RunTests(
-      available_tests, TestRunnerFactory, False, None, shard=False,
-      build_type=options.build_type, num_retries=0)
-
-  report_results.LogFull(
-      results=results,
-      test_type='Monkey',
-      test_package='Monkey',
-      build_type=options.build_type)
-
-  return exit_code
-
-
-def main():
-  desc = 'Run the Monkey tests on 1 or more devices.'
-  parser = optparse.OptionParser(description=desc)
-  test_options_parser.AddBuildTypeOption(parser)
-  parser.add_option('--package-name', help='Allowed package.')
-  parser.add_option('--activity-name',
-                    default='com.google.android.apps.chrome.Main',
-                    help='Name of the activity to start [default: %default].')
-  parser.add_option('--category', default='',
-                    help='A list of allowed categories [default: %default].')
-  parser.add_option('--throttle', default=100, type='int',
-                    help='Delay between events (ms) [default: %default]. ')
-  parser.add_option('--seed', type='int',
-                    help=('Seed value for pseudo-random generator. Same seed '
-                          'value generates the same sequence of events. Seed '
-                          'is randomized by default.'))
-  parser.add_option('--event-count', default=10000, type='int',
-                    help='Number of events to generate [default: %default].')
-  parser.add_option('--verbosity', default=1, type='int',
-                    help='Verbosity level [0-3] [default: %default].')
-  parser.add_option('--extra-args', default='',
-                    help=('String of other args to pass to the command verbatim'
-                          ' [default: "%default"].'))
-  (options, args) = parser.parse_args()
-
-  if args:
-    parser.print_help(sys.stderr)
-    parser.error('Unknown arguments: %s' % args)
-
-  if not options.package_name:
-    parser.print_help(sys.stderr)
-    parser.error('Missing package name')
-
-  if options.category:
-    options.category = options.category.split(',')
-
-  RunMonkeyTests(options)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/build/android/test_runner.py b/build/android/test_runner.py
index 4113158..8655720 100755
--- a/build/android/test_runner.py
+++ b/build/android/test_runner.py
@@ -26,6 +26,8 @@
 from pylib.host_driven import setup as host_driven_setup
 from pylib.instrumentation import setup as instrumentation_setup
 from pylib.instrumentation import test_options as instrumentation_test_options
+from pylib.monkey import setup as monkey_setup
+from pylib.monkey import test_options as monkey_test_options
 from pylib.uiautomator import setup as uiautomator_setup
 from pylib.uiautomator import test_options as uiautomator_test_options
 from pylib.utils import report_results
@@ -68,13 +70,6 @@
                            default=0,
                            action='count',
                            help='Verbose level (multiple times for more)')
-  profilers = ['devicestatsmonitor', 'chrometrace', 'dumpheap', 'smaps',
-               'traceview']
-  option_parser.add_option('--profiler', dest='profilers', action='append',
-                           choices=profilers,
-                           help=('Profiling tool to run during test. Pass '
-                                 'multiple times to run multiple profilers. '
-                                 'Available profilers: %s' % profilers))
   option_parser.add_option('--tool',
                            dest='tool',
                            help=('Run the test under a tool '
@@ -172,10 +167,6 @@
                                  'kept. When this is run via a sharder '
                                  'the test server ports should be kept and '
                                  'should not be reset.'))
-  # TODO(gkanwar): This option is deprecated. Remove it in the future.
-  option_parser.add_option('--disable_assertions', action='store_true',
-                           help=('(DEPRECATED) Run with java assertions '
-                                 'disabled.'))
   option_parser.add_option('--test_data', action='append', default=[],
                            help=('Each instance defines a directory of test '
                                  'data that should be copied to the target(s) '
@@ -228,9 +219,6 @@
   option_parser.add_option('-w', '--wait_debugger', dest='wait_for_debugger',
                            action='store_true',
                            help='Wait for debugger.')
-  #TODO(craigdh): Remove option once -I is no longer passed downstream.
-  option_parser.add_option('-I', dest='install_apk', action='store_true',
-                           help='(DEPRECATED) Install the test apk.')
   option_parser.add_option(
       '--test-apk', dest='test_apk',
       help=('The name of the apk containing the tests '
@@ -293,7 +281,6 @@
       options.test_data,
       options.save_perf_json,
       options.screenshot_failures,
-      options.disable_assertions,
       options.wait_for_debugger,
       options.test_apk,
       options.test_apk_path,
@@ -330,7 +317,7 @@
 
   Returns:
     A UIAutomatorOptions named tuple which contains all options relevant to
-    instrumentation tests.
+    uiautomator tests.
   """
 
   ProcessJavaTestOptions(options, error_func)
@@ -363,12 +350,68 @@
       options.test_data,
       options.save_perf_json,
       options.screenshot_failures,
-      options.disable_assertions,
       options.uiautomator_jar,
       options.uiautomator_info_jar,
       options.package_name)
 
 
+def AddMonkeyTestOptions(option_parser):
+  """Adds monkey test options to |option_parser|."""
+  option_parser.add_option('--package-name', help='Allowed package.')
+  option_parser.add_option(
+      '--activity-name', default='com.google.android.apps.chrome.Main',
+      help='Name of the activity to start [default: %default].')
+  option_parser.add_option(
+      '--event-count', default=10000, type='int',
+      help='Number of events to generate [default: %default].')
+  option_parser.add_option(
+      '--category', default='',
+      help='A list of allowed categories [default: %default].')
+  option_parser.add_option(
+      '--throttle', default=100, type='int',
+      help='Delay between events (ms) [default: %default]. ')
+  option_parser.add_option(
+      '--seed', type='int',
+      help=('Seed value for pseudo-random generator. Same seed value generates '
+            'the same sequence of events. Seed is randomized by default.'))
+  option_parser.add_option(
+      '--extra-args', default='',
+      help=('String of other args to pass to the command verbatim '
+            '[default: "%default"].'))
+
+  AddCommonOptions(option_parser)
+
+
+def ProcessMonkeyTestOptions(options, error_func):
+  """Processes all monkey test options.
+
+  Args:
+    options: optparse.Options object.
+    error_func: Function to call with the error message in case of an error.
+
+  Returns:
+    A MonkeyOptions named tuple which contains all options relevant to
+    monkey tests.
+  """
+  if not options.package_name:
+    error_func('Package name is required.')
+
+  category = options.category
+  if category:
+    category = options.category.split(',')
+
+  return monkey_test_options.MonkeyOptions(
+      options.build_type,
+      options.verbose_count,
+      options.package_name,
+      options.activity_name,
+      options.event_count,
+      category,
+      options.throttle,
+      options.seed,
+      options.extra_args)
+
+
 def _RunGTests(options, error_func):
   """Subcommand of RunTestsCommands which runs gtests."""
   ProcessGTestOptions(options)
@@ -466,9 +509,6 @@
   """Subcommand of RunTestsCommands which runs uiautomator tests."""
   uiautomator_options = ProcessUIAutomatorOptions(options, error_func)
 
-  results = base_test_result.TestRunResults()
-  exit_code = 0
-
   runner_factory, tests = uiautomator_setup.Setup(uiautomator_options)
 
   results, exit_code = test_dispatcher.RunTests(
@@ -489,6 +529,25 @@
   return exit_code
 
 
+def _RunMonkeyTests(options, error_func):
+  """Subcommand of RunTestsCommands which runs monkey tests."""
+  monkey_options = ProcessMonkeyTestOptions(options, error_func)
+
+  runner_factory, tests = monkey_setup.Setup(monkey_options)
+
+  results, exit_code = test_dispatcher.RunTests(
+      tests, runner_factory, False, None, shard=False)
+
+  report_results.LogFull(
+      results=results,
+      test_type='Monkey',
+      test_package='Monkey',
+      build_type=options.build_type)
+
+  return exit_code
+
+
+
 def RunTestsCommand(command, options, args, option_parser):
   """Checks test type and dispatches to the appropriate function.
 
@@ -520,6 +579,8 @@
     return _RunInstrumentationTests(options, option_parser.error)
   elif command == 'uiautomator':
     return _RunUIAutomatorTests(options, option_parser.error)
+  elif command == 'monkey':
+    return _RunMonkeyTests(options, option_parser.error)
   else:
     raise Exception('Unknown test type.')
 
@@ -576,6 +637,8 @@
         AddInstrumentationTestOptions, RunTestsCommand),
     'uiautomator': CommandFunctionTuple(
         AddUIAutomatorTestOptions, RunTestsCommand),
+    'monkey': CommandFunctionTuple(
+        AddMonkeyTestOptions, RunTestsCommand),
     'help': CommandFunctionTuple(lambda option_parser: None, HelpCommand)
     }
 
diff --git a/build/common.gypi b/build/common.gypi
index 29f1278..72e9ecb7 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -27,6 +27,9 @@
             # Whether or not we are building the Ash shell.
             'use_ash%': 0,
 
+            # Whether or not we are using CRAS, the ChromeOS Audio Server.
+            'use_cras%': 0,
+
             # Use a raw surface abstraction.
             'use_ozone%': 0,
           },
@@ -34,6 +37,7 @@
           'chromeos%': '<(chromeos)',
           'use_aura%': '<(use_aura)',
           'use_ash%': '<(use_ash)',
+          'use_cras%': '<(use_cras)',
           'use_ozone%': '<(use_ozone)',
 
           # Whether we are using Views Toolkit
@@ -98,6 +102,7 @@
         'chromeos%': '<(chromeos)',
         'use_aura%': '<(use_aura)',
         'use_ash%': '<(use_ash)',
+        'use_cras%': '<(use_cras)',
         'use_ozone%': '<(use_ozone)',
         'use_openssl%': '<(use_openssl)',
         'enable_viewport%': '<(enable_viewport)',
@@ -179,6 +184,7 @@
       'toolkit_uses_gtk%': '<(toolkit_uses_gtk)',
       'use_aura%': '<(use_aura)',
       'use_ash%': '<(use_ash)',
+      'use_cras%': '<(use_cras)',
       'use_ozone%': '<(use_ozone)',
       'use_openssl%': '<(use_openssl)',
       'enable_viewport%': '<(enable_viewport)',
@@ -693,7 +699,16 @@
         }],
         ['OS=="win" or OS=="linux"', {
             'enable_mdns%' : 1,
-        }]
+        }],
+
+        # Turns on compiler optimizations in V8 in Debug build, except
+        # on android_clang, where we're hitting a weird linker error.
+        # TODO(dpranke): http://crbug.com/266155 .
+        ['OS=="android"', {
+          'v8_optimized_debug': 1,
+        }, {
+          'v8_optimized_debug': 2,
+        }],
       ],
 
       # Set this to 1 to enable use of concatenated impulse responses
@@ -755,6 +770,7 @@
     'ui_compositor_image_transport%': '<(ui_compositor_image_transport)',
     'use_aura%': '<(use_aura)',
     'use_ash%': '<(use_ash)',
+    'use_cras%': '<(use_cras)',
     'use_openssl%': '<(use_openssl)',
     'use_nss%': '<(use_nss)',
     'os_bsd%': '<(os_bsd)',
@@ -847,6 +863,7 @@
     'spdy_proxy_auth_property%': '<(spdy_proxy_auth_property)',
     'spdy_proxy_auth_value%': '<(spdy_proxy_auth_value)',
     'enable_mdns%' : '<(enable_mdns)',
+    'v8_optimized_debug': '<(v8_optimized_debug)',
 
     # Use system nspr instead of the bundled one.
     'use_system_nspr%': 0,
@@ -1104,9 +1121,6 @@
     # rlz codes for searches but do not use the library.
     'enable_rlz%': 0,
 
-    # Turns on compiler optimizations in V8 in Debug build.
-    'v8_optimized_debug': 1,
-
     # Turns on the i18n support in V8.
     'v8_enable_i18n_support': 1,
 
@@ -1928,6 +1942,9 @@
       ['use_ash==1', {
         'defines': ['USE_ASH=1'],
       }],
+      ['use_cras==1', {
+        'defines': ['USE_CRAS=1'],
+      }],
       ['use_ozone==1', {
         'defines': ['USE_OZONE=1'],
       }],
diff --git a/build/util/LASTCHANGE b/build/util/LASTCHANGE
index 16f4b00..aae8668 100644
--- a/build/util/LASTCHANGE
+++ b/build/util/LASTCHANGE
@@ -1 +1 @@
-LASTCHANGE=216133
+LASTCHANGE=216370
diff --git a/build/util/LASTCHANGE.blink b/build/util/LASTCHANGE.blink
index 3a4250b..03e4ec2 100644
--- a/build/util/LASTCHANGE.blink
+++ b/build/util/LASTCHANGE.blink
@@ -1 +1 @@
-LASTCHANGE=155634
+LASTCHANGE=155688
diff --git a/build/whitespace_file.txt b/build/whitespace_file.txt
index e894ecf..4d8ced4 100644
--- a/build/whitespace_file.txt
+++ b/build/whitespace_file.txt
@@ -44,7 +44,7 @@
 CHAPTER 3:
 Mr. Usagi felt that something wasn't right. Shortly after the Domo-Kun left he
 began feeling sick. He thought out loud to himself, "No, he wouldn't have done
-that to me." He considered that perhaps he shouldn't have pushed him so far.
+that to me." He considered that perhaps he shouldn't have pushed so hard.
 Perhaps he shouldn't have been so cold and sarcastic, after the unimaginable
 horror that had occurred just the week before.
 
diff --git a/cc/cc.gyp b/cc/cc.gyp
index 315e10a..78060a4 100644
--- a/cc/cc.gyp
+++ b/cc/cc.gyp
@@ -292,6 +292,8 @@
         'resources/prioritized_resource.h',
         'resources/prioritized_resource_manager.cc',
         'resources/prioritized_resource_manager.h',
+        'resources/prioritized_tile_set.cc',
+        'resources/prioritized_tile_set.h',
         'resources/priority_calculator.cc',
         'resources/priority_calculator.h',
         'resources/raster_mode.cc',
diff --git a/cc/cc.target.darwin-arm.mk b/cc/cc.target.darwin-arm.mk
index 1c496a4..7029dcc 100644
--- a/cc/cc.target.darwin-arm.mk
+++ b/cc/cc.target.darwin-arm.mk
@@ -149,6 +149,7 @@
 	cc/resources/pixel_buffer_raster_worker_pool.cc \
 	cc/resources/prioritized_resource.cc \
 	cc/resources/prioritized_resource_manager.cc \
+	cc/resources/prioritized_tile_set.cc \
 	cc/resources/priority_calculator.cc \
 	cc/resources/raster_mode.cc \
 	cc/resources/raster_worker_pool.cc \
diff --git a/cc/cc.target.darwin-mips.mk b/cc/cc.target.darwin-mips.mk
index d9dd101..d0f7ee7 100644
--- a/cc/cc.target.darwin-mips.mk
+++ b/cc/cc.target.darwin-mips.mk
@@ -149,6 +149,7 @@
 	cc/resources/pixel_buffer_raster_worker_pool.cc \
 	cc/resources/prioritized_resource.cc \
 	cc/resources/prioritized_resource_manager.cc \
+	cc/resources/prioritized_tile_set.cc \
 	cc/resources/priority_calculator.cc \
 	cc/resources/raster_mode.cc \
 	cc/resources/raster_worker_pool.cc \
diff --git a/cc/cc.target.darwin-x86.mk b/cc/cc.target.darwin-x86.mk
index 36b45db..3f83839 100644
--- a/cc/cc.target.darwin-x86.mk
+++ b/cc/cc.target.darwin-x86.mk
@@ -149,6 +149,7 @@
 	cc/resources/pixel_buffer_raster_worker_pool.cc \
 	cc/resources/prioritized_resource.cc \
 	cc/resources/prioritized_resource_manager.cc \
+	cc/resources/prioritized_tile_set.cc \
 	cc/resources/priority_calculator.cc \
 	cc/resources/raster_mode.cc \
 	cc/resources/raster_worker_pool.cc \
diff --git a/cc/cc.target.linux-arm.mk b/cc/cc.target.linux-arm.mk
index 1c496a4..7029dcc 100644
--- a/cc/cc.target.linux-arm.mk
+++ b/cc/cc.target.linux-arm.mk
@@ -149,6 +149,7 @@
 	cc/resources/pixel_buffer_raster_worker_pool.cc \
 	cc/resources/prioritized_resource.cc \
 	cc/resources/prioritized_resource_manager.cc \
+	cc/resources/prioritized_tile_set.cc \
 	cc/resources/priority_calculator.cc \
 	cc/resources/raster_mode.cc \
 	cc/resources/raster_worker_pool.cc \
diff --git a/cc/cc.target.linux-mips.mk b/cc/cc.target.linux-mips.mk
index d9dd101..d0f7ee7 100644
--- a/cc/cc.target.linux-mips.mk
+++ b/cc/cc.target.linux-mips.mk
@@ -149,6 +149,7 @@
 	cc/resources/pixel_buffer_raster_worker_pool.cc \
 	cc/resources/prioritized_resource.cc \
 	cc/resources/prioritized_resource_manager.cc \
+	cc/resources/prioritized_tile_set.cc \
 	cc/resources/priority_calculator.cc \
 	cc/resources/raster_mode.cc \
 	cc/resources/raster_worker_pool.cc \
diff --git a/cc/cc.target.linux-x86.mk b/cc/cc.target.linux-x86.mk
index 36b45db..3f83839 100644
--- a/cc/cc.target.linux-x86.mk
+++ b/cc/cc.target.linux-x86.mk
@@ -149,6 +149,7 @@
 	cc/resources/pixel_buffer_raster_worker_pool.cc \
 	cc/resources/prioritized_resource.cc \
 	cc/resources/prioritized_resource_manager.cc \
+	cc/resources/prioritized_tile_set.cc \
 	cc/resources/priority_calculator.cc \
 	cc/resources/raster_mode.cc \
 	cc/resources/raster_worker_pool.cc \
diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp
index f633ce4..7e2ff87 100644
--- a/cc/cc_tests.gyp
+++ b/cc/cc_tests.gyp
@@ -54,6 +54,7 @@
       'resources/picture_pile_unittest.cc',
       'resources/picture_unittest.cc',
       'resources/prioritized_resource_unittest.cc',
+      'resources/prioritized_tile_set_unittest.cc',
       'resources/raster_worker_pool_unittest.cc',
       'resources/resource_provider_unittest.cc',
       'resources/resource_update_controller_unittest.cc',
@@ -171,6 +172,8 @@
       'test/solid_color_content_layer_client.cc',
       'test/skia_common.cc',
       'test/skia_common.h',
+      'test/test_tile_priorities.cc',
+      'test/test_tile_priorities.h',
       'test/test_web_graphics_context_3d.cc',
       'test/test_web_graphics_context_3d.h',
       'test/tiled_layer_test_common.cc',
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc
index 08a5817..889e2fb 100644
--- a/cc/layers/picture_layer.cc
+++ b/cc/layers/picture_layer.cc
@@ -36,14 +36,25 @@
 
 void PictureLayer::PushPropertiesTo(LayerImpl* base_layer) {
   Layer::PushPropertiesTo(base_layer);
+
   PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer);
+  // This should be first so others can use it.
+  layer_impl->UpdateTwinLayer();
 
   layer_impl->SetIsMask(is_mask_);
+  layer_impl->CreateTilingSetIfNeeded();
   // Unlike other properties, invalidation must always be set on layer_impl.
   // See PictureLayerImpl::PushPropertiesTo for more details.
   layer_impl->invalidation_.Clear();
   layer_impl->invalidation_.Swap(&pile_invalidation_);
   layer_impl->pile_ = PicturePileImpl::CreateFromOther(pile_.get());
+  layer_impl->SyncFromActiveLayer();
+
+  // PictureLayer must push properties every frame.
+  // TODO(danakj): If we can avoid requiring to do CreateTilingSetIfNeeded() and
+  // SyncFromActiveLayer() on every commit then this could go away, maybe
+  // conditionally. crbug.com/259402
+  needs_push_properties_ = true;
 }
 
 void PictureLayer::SetLayerTreeHost(LayerTreeHost* host) {
@@ -103,14 +114,11 @@
                            pile_invalidation_,
                            visible_layer_rect,
                            rendering_stats_instrumentation());
-  if (updated) {
-    SetNeedsPushProperties();
-  } else {
+  if (!updated) {
     // If this invalidation did not affect the pile, then it can be cleared as
     // an optimization.
     pile_invalidation_.Clear();
   }
-
   return updated;
 }
 
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index a5c69cc..2f1878b 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -45,8 +45,8 @@
       raster_contents_scale_(0.f),
       low_res_raster_contents_scale_(0.f),
       raster_source_scale_was_animating_(false),
-      is_using_lcd_text_(tree_impl->settings().can_use_lcd_text),
-      needs_post_commit_initialization_(true) {}
+      is_using_lcd_text_(tree_impl->settings().can_use_lcd_text) {
+}
 
 PictureLayerImpl::~PictureLayerImpl() {
 }
@@ -60,11 +60,13 @@
   return PictureLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
 }
 
-void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) {
-  // It's possible this layer was never drawn or updated (e.g. because it was
-  // a descendant of an opacity 0 layer).
-  DoPostCommitInitializationIfNeeded();
+void PictureLayerImpl::CreateTilingSetIfNeeded() {
+  DCHECK(layer_tree_impl()->IsPendingTree());
+  if (!tilings_)
+    tilings_.reset(new PictureLayerTilingSet(this, bounds()));
+}
 
+void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) {
   LayerImpl::PushPropertiesTo(base_layer);
 
   PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer);
@@ -76,9 +78,8 @@
 
   layer_impl->SetIsMask(is_mask_);
   layer_impl->pile_ = pile_;
+  pile_ = NULL;
 
-  // Tilings would be expensive to push, so we swap.  This optimization requires
-  // an extra invalidation in SyncFromActiveLayer.
   layer_impl->tilings_.swap(tilings_);
   layer_impl->tilings_->SetClient(layer_impl);
   if (tilings_)
@@ -91,19 +92,19 @@
   layer_impl->low_res_raster_contents_scale_ = low_res_raster_contents_scale_;
 
   layer_impl->UpdateLCDTextStatus(is_using_lcd_text_);
-  layer_impl->needs_post_commit_initialization_ = false;
 
-  // The invalidation on this soon-to-be-recycled layer must be cleared to
-  // mirror clearing the invalidation in PictureLayer's version of this function
-  // in case push properties is skipped.
+  // As an optimization, don't make a copy of this potentially complex region,
+  // and swap it directly from the pending to the active layer.  In general, any
+  // property pushed to a LayerImpl continues to live on that LayerImpl.
+  // However, invalidation is the difference between two main thread frames, so
+  // it no longer makes sense once the pending tree gets recycled.  It will
+  // always get pushed during PictureLayer::PushPropertiesTo.
   layer_impl->invalidation_.Swap(&invalidation_);
   invalidation_.Clear();
-  needs_post_commit_initialization_ = true;
 }
 
 void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
                                    AppendQuadsData* append_quads_data) {
-  DCHECK(!needs_post_commit_initialization_);
   gfx::Rect rect(visible_content_rect());
   gfx::Rect content_rect(content_bounds());
 
@@ -295,7 +296,6 @@
 }
 
 void PictureLayerImpl::UpdateTilePriorities() {
-  DCHECK(!needs_post_commit_initialization_);
   if (!tilings_->num_tilings())
     return;
 
@@ -380,7 +380,6 @@
     float* contents_scale_x,
     float* contents_scale_y,
     gfx::Size* content_bounds) {
-  DoPostCommitInitializationIfNeeded();
   if (!CanHaveTilings()) {
     ideal_page_scale_ = page_scale_factor;
     ideal_device_scale_ = device_scale_factor;
@@ -526,10 +525,14 @@
   return default_tile_size;
 }
 
-void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) {
-  DCHECK(!other->needs_post_commit_initialization_);
-  DCHECK(other->tilings_);
+void PictureLayerImpl::SyncFromActiveLayer() {
+  DCHECK(layer_tree_impl()->IsPendingTree());
 
+  if (twin_layer_)
+    SyncFromActiveLayer(twin_layer_);
+}
+
+void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) {
   UpdateLCDTextStatus(other->is_using_lcd_text_);
 
   if (!DrawsContent()) {
@@ -594,6 +597,15 @@
     UpdateTilePriorities();
 }
 
+void PictureLayerImpl::UpdateTwinLayer() {
+  DCHECK(layer_tree_impl()->IsPendingTree());
+
+  twin_layer_ = static_cast<PictureLayerImpl*>(
+      layer_tree_impl()->FindActiveTreeLayerById(id()));
+  if (twin_layer_)
+    twin_layer_->twin_layer_ = this;
+}
+
 void PictureLayerImpl::SetIsMask(bool is_mask) {
   if (is_mask_ == is_mask)
     return;
@@ -712,28 +724,6 @@
   }
 }
 
-void PictureLayerImpl::DoPostCommitInitialization() {
-  DCHECK(needs_post_commit_initialization_);
-  DCHECK(layer_tree_impl()->IsPendingTree());
-
-  if (!tilings_)
-    tilings_.reset(new PictureLayerTilingSet(this, bounds()));
-
-  DCHECK(!twin_layer_);
-  twin_layer_ = static_cast<PictureLayerImpl*>(
-      layer_tree_impl()->FindActiveTreeLayerById(id()));
-  if (twin_layer_) {
-    DCHECK(!twin_layer_->twin_layer_);
-    twin_layer_->twin_layer_ = this;
-    // If the twin has never been pushed to, do not sync from it.
-    // This can happen if this function is called during activation.
-    if (!twin_layer_->needs_post_commit_initialization_)
-      SyncFromActiveLayer(twin_layer_);
-  }
-
-  needs_post_commit_initialization_ = false;
-}
-
 PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) {
   DCHECK(CanHaveTilingWithScale(contents_scale)) <<
       "contents_scale: " << contents_scale;
@@ -785,7 +775,6 @@
   DCHECK(ideal_device_scale_);
   DCHECK(ideal_source_scale_);
   DCHECK(CanHaveTilings());
-  DCHECK(!needs_post_commit_initialization_);
 
   bool change_target_tiling =
       raster_page_scale_ == 0.f ||
diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h
index 42efa72..25cc5d0 100644
--- a/cc/layers/picture_layer_impl.h
+++ b/cc/layers/picture_layer_impl.h
@@ -62,7 +62,11 @@
       const PictureLayerTiling* tiling) OVERRIDE;
 
   // PushPropertiesTo active tree => pending tree.
+  void SyncFromActiveLayer();
   void SyncTiling(const PictureLayerTiling* tiling);
+  void UpdateTwinLayer();
+
+  void CreateTilingSetIfNeeded();
 
   // Mask-related functions
   void SetIsMask(bool is_mask);
@@ -88,11 +92,6 @@
   void UpdateLCDTextStatus(bool new_status);
   void ResetRasterScale();
   void MarkVisibleResourcesAsRequired() const;
-  void DoPostCommitInitializationIfNeeded() {
-    if (needs_post_commit_initialization_)
-      DoPostCommitInitialization();
-  }
-  void DoPostCommitInitialization();
 
   bool CanHaveTilings() const;
   bool CanHaveTilingWithScale(float contents_scale) const;
@@ -125,7 +124,6 @@
 
   bool raster_source_scale_was_animating_;
   bool is_using_lcd_text_;
-  bool needs_post_commit_initialization_;
 
   friend class PictureLayer;
   DISALLOW_COPY_AND_ASSIGN(PictureLayerImpl);
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
index 3272712..047a529 100644
--- a/cc/layers/picture_layer_impl_unittest.cc
+++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -69,6 +69,7 @@
         host_impl_.active_tree()->LayerById(id_));
 
     SetupPendingTree(pending_pile);
+    pending_layer_->UpdateTwinLayer();
   }
 
   void AddDefaultTilingsWithInvalidation(const Region& invalidation) {
@@ -78,6 +79,7 @@
     for (size_t i = 0; i < active_layer_->tilings()->num_tilings(); ++i)
       active_layer_->tilings()->tiling_at(i)->CreateAllTilesForTesting();
     pending_layer_->set_invalidation(invalidation);
+    pending_layer_->SyncFromActiveLayer();
     for (size_t i = 0; i < pending_layer_->tilings()->num_tilings(); ++i)
       pending_layer_->tilings()->tiling_at(i)->CreateAllTilesForTesting();
   }
@@ -96,7 +98,6 @@
 
     pending_layer_ = static_cast<FakePictureLayerImpl*>(
         host_impl_.pending_tree()->LayerById(id_));
-    pending_layer_->DoPostCommitInitializationIfNeeded();
   }
 
   static void VerifyAllTilesExistAndHavePile(
@@ -1006,40 +1007,5 @@
   EXPECT_GT(num_offscreen, 0);
 }
 
-TEST_F(PictureLayerImplTest, ActivateUninitializedLayer) {
-  gfx::Size tile_size(100, 100);
-  gfx::Size layer_bounds(400, 400);
-  scoped_refptr<FakePicturePileImpl> pending_pile =
-      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
-
-  host_impl_.CreatePendingTree();
-  LayerTreeImpl* pending_tree = host_impl_.pending_tree();
-
-  scoped_ptr<FakePictureLayerImpl> pending_layer =
-      FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pending_pile);
-  pending_layer->SetDrawsContent(true);
-  pending_tree->SetRootLayer(pending_layer.PassAs<LayerImpl>());
-
-  pending_layer_ = static_cast<FakePictureLayerImpl*>(
-      host_impl_.pending_tree()->LayerById(id_));
-
-  // Set some state on the pending layer, make sure it is not clobbered
-  // by a sync from the active layer.  This could happen because if the
-  // pending layer has not been post-commit initialized it will attempt
-  // to sync from the active layer.
-  bool default_lcd_text_setting = pending_layer_->is_using_lcd_text();
-  pending_layer_->force_set_lcd_text(!default_lcd_text_setting);
-  EXPECT_TRUE(pending_layer_->needs_post_commit_initialization());
-
-  host_impl_.ActivatePendingTree();
-
-  active_layer_ = static_cast<FakePictureLayerImpl*>(
-      host_impl_.active_tree()->LayerById(id_));
-
-  EXPECT_EQ(0u, active_layer_->num_tilings());
-  EXPECT_EQ(!default_lcd_text_setting, active_layer_->is_using_lcd_text());
-  EXPECT_FALSE(active_layer_->needs_post_commit_initialization());
-}
-
 }  // namespace
 }  // namespace cc
diff --git a/cc/quads/render_pass.h b/cc/quads/render_pass.h
index da1bc9a..3d5a37c 100644
--- a/cc/quads/render_pass.h
+++ b/cc/quads/render_pass.h
@@ -117,17 +117,14 @@
 
 namespace BASE_HASH_NAMESPACE {
 #if defined(COMPILER_MSVC)
-template<>
-inline size_t hash_value<cc::RenderPass::Id>(const cc::RenderPass::Id& key) {
-  return hash_value<std::pair<int, int> >(
-      std::pair<int, int>(key.layer_id, key.index));
+inline size_t hash_value(const cc::RenderPass::Id& key) {
+  return base::HashPair(key.layer_id, key.index);
 }
 #elif defined(COMPILER_GCC)
 template<>
 struct hash<cc::RenderPass::Id> {
   size_t operator()(cc::RenderPass::Id key) const {
-    return hash<std::pair<int, int> >()(
-        std::pair<int, int>(key.layer_id, key.index));
+    return base::HashPair(key.layer_id, key.index);
   }
 };
 #else
diff --git a/cc/resources/managed_tile_state.cc b/cc/resources/managed_tile_state.cc
index f5607ea..6f85331 100644
--- a/cc/resources/managed_tile_state.cc
+++ b/cc/resources/managed_tile_state.cc
@@ -12,15 +12,24 @@
 
 scoped_ptr<base::Value> ManagedTileBinAsValue(ManagedTileBin bin) {
   switch (bin) {
+  case NOW_AND_READY_TO_DRAW_BIN:
+      return scoped_ptr<base::Value>(base::Value::CreateStringValue(
+          "NOW_AND_READY_TO_DRAW_BIN"));
   case NOW_BIN:
       return scoped_ptr<base::Value>(base::Value::CreateStringValue(
           "NOW_BIN"));
   case SOON_BIN:
       return scoped_ptr<base::Value>(base::Value::CreateStringValue(
           "SOON_BIN"));
+  case EVENTUALLY_AND_ACTIVE_BIN:
+      return scoped_ptr<base::Value>(base::Value::CreateStringValue(
+          "EVENTUALLY_AND_ACTIVE_BIN"));
   case EVENTUALLY_BIN:
       return scoped_ptr<base::Value>(base::Value::CreateStringValue(
           "EVENTUALLY_BIN"));
+  case NEVER_AND_ACTIVE_BIN:
+      return scoped_ptr<base::Value>(base::Value::CreateStringValue(
+          "NEVER_AND_ACTIVE_BIN"));
   case NEVER_BIN:
       return scoped_ptr<base::Value>(base::Value::CreateStringValue(
           "NEVER_BIN"));
diff --git a/cc/resources/managed_tile_state.h b/cc/resources/managed_tile_state.h
index 2f61b39..c6065f9 100644
--- a/cc/resources/managed_tile_state.h
+++ b/cc/resources/managed_tile_state.h
@@ -17,11 +17,14 @@
 
 // Tile manager classifying tiles into a few basic bins:
 enum ManagedTileBin {
-  NOW_BIN = 0,         // Needed ASAP.
-  SOON_BIN = 1,        // Impl-side version of prepainting.
-  EVENTUALLY_BIN = 2,  // Nice to have, if we've got memory and time.
-  NEVER_BIN = 3,       // Dont bother.
-  NUM_BINS = 4
+  NOW_AND_READY_TO_DRAW_BIN = 0,  // Ready to draw and within viewport.
+  NOW_BIN = 1,                    // Needed ASAP.
+  SOON_BIN = 2,                   // Impl-side version of prepainting.
+  EVENTUALLY_AND_ACTIVE_BIN = 3,  // Nice to have, and has a task or resource.
+  EVENTUALLY_BIN = 4,             // Nice to have, if we've got memory and time.
+  NEVER_AND_ACTIVE_BIN = 5,       // Dont bother, but has a task or resource.
+  NEVER_BIN = 6,                  // Dont bother.
+  NUM_BINS = 7
   // NOTE: Be sure to update ManagedTileBinAsValue and kBinPolicyMap when adding
   // or reordering fields.
 };
@@ -98,6 +101,7 @@
 
     private:
       friend class TileManager;
+      friend class PrioritizedTileSet;
       friend class Tile;
       friend class ManagedTileState;
 
@@ -136,12 +140,10 @@
 
   // Ephemeral state, valid only during TileManager::ManageTiles.
   bool is_in_never_bin_on_both_trees() const {
-    return bin[HIGH_PRIORITY_BIN] == NEVER_BIN &&
-           bin[LOW_PRIORITY_BIN] == NEVER_BIN;
-  }
-  bool is_in_now_bin_on_either_tree() const {
-    return bin[HIGH_PRIORITY_BIN] == NOW_BIN ||
-           bin[LOW_PRIORITY_BIN] == NOW_BIN;
+    return (bin[HIGH_PRIORITY_BIN] == NEVER_BIN ||
+            bin[HIGH_PRIORITY_BIN] == NEVER_AND_ACTIVE_BIN) &&
+           (bin[LOW_PRIORITY_BIN] == NEVER_BIN ||
+            bin[LOW_PRIORITY_BIN] == NEVER_AND_ACTIVE_BIN);
   }
 
   ManagedTileBin bin[NUM_BIN_PRIORITIES];
diff --git a/cc/resources/prioritized_tile_set.cc b/cc/resources/prioritized_tile_set.cc
new file mode 100644
index 0000000..5b40945
--- /dev/null
+++ b/cc/resources/prioritized_tile_set.cc
@@ -0,0 +1,126 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/prioritized_tile_set.h"
+
+#include <algorithm>
+
+#include "cc/resources/managed_tile_state.h"
+#include "cc/resources/tile.h"
+
+namespace cc {
+
+class BinComparator {
+ public:
+  bool operator()(const scoped_refptr<Tile>& a,
+                  const scoped_refptr<Tile>& b) const {
+    const ManagedTileState& ams = a->managed_state();
+    const ManagedTileState& bms = b->managed_state();
+
+    if (ams.bin[LOW_PRIORITY_BIN] != bms.bin[LOW_PRIORITY_BIN])
+      return ams.bin[LOW_PRIORITY_BIN] < bms.bin[LOW_PRIORITY_BIN];
+
+    if (ams.required_for_activation != bms.required_for_activation)
+      return ams.required_for_activation;
+
+    if (ams.resolution != bms.resolution)
+      return ams.resolution < bms.resolution;
+
+    if (ams.time_to_needed_in_seconds !=  bms.time_to_needed_in_seconds)
+      return ams.time_to_needed_in_seconds < bms.time_to_needed_in_seconds;
+
+    if (ams.distance_to_visible_in_pixels !=
+        bms.distance_to_visible_in_pixels) {
+      return ams.distance_to_visible_in_pixels <
+             bms.distance_to_visible_in_pixels;
+    }
+
+    gfx::Rect a_rect = a->content_rect();
+    gfx::Rect b_rect = b->content_rect();
+    if (a_rect.y() != b_rect.y())
+      return a_rect.y() < b_rect.y();
+    return a_rect.x() < b_rect.x();
+  }
+};
+
+namespace {
+
+typedef std::vector<scoped_refptr<Tile> > TileVector;
+
+void SortBinTiles(ManagedTileBin bin, TileVector* tiles) {
+  switch (bin) {
+    case NOW_AND_READY_TO_DRAW_BIN:
+      break;
+    case NOW_BIN:
+    case SOON_BIN:
+    case EVENTUALLY_AND_ACTIVE_BIN:
+    case EVENTUALLY_BIN:
+    case NEVER_AND_ACTIVE_BIN:
+    case NEVER_BIN:
+      std::sort(tiles->begin(), tiles->end(), BinComparator());
+      break;
+    default:
+      NOTREACHED();
+  }
+}
+
+}  // namespace
+
+PrioritizedTileSet::PrioritizedTileSet() {}
+
+PrioritizedTileSet::~PrioritizedTileSet() {}
+
+void PrioritizedTileSet::InsertTile(Tile* tile, ManagedTileBin bin) {
+  tiles_[bin].push_back(make_scoped_refptr(tile));
+}
+
+void PrioritizedTileSet::Clear() {
+  for (int bin = 0; bin < NUM_BINS; ++bin)
+    tiles_[bin].clear();
+}
+
+void PrioritizedTileSet::Sort() {
+  for (int bin = 0; bin < NUM_BINS; ++bin)
+    SortBinTiles(static_cast<ManagedTileBin>(bin), &tiles_[bin]);
+}
+
+PrioritizedTileSet::PriorityIterator::PriorityIterator(
+    PrioritizedTileSet* tile_set)
+    : tile_set_(tile_set),
+      current_bin_(NOW_AND_READY_TO_DRAW_BIN),
+      iterator_(tile_set->tiles_[current_bin_].begin()) {
+  if (iterator_ == tile_set_->tiles_[current_bin_].end())
+    AdvanceList();
+}
+
+PrioritizedTileSet::PriorityIterator::~PriorityIterator() {}
+
+PrioritizedTileSet::PriorityIterator&
+PrioritizedTileSet::PriorityIterator::operator++() {
+  // We can't increment past the end of the tiles.
+  DCHECK(iterator_ != tile_set_->tiles_[current_bin_].end());
+
+  ++iterator_;
+  if (iterator_ == tile_set_->tiles_[current_bin_].end())
+    AdvanceList();
+  return *this;
+}
+
+Tile* PrioritizedTileSet::PriorityIterator::operator*() {
+  DCHECK(iterator_ != tile_set_->tiles_[current_bin_].end());
+  return iterator_->get();
+}
+
+void PrioritizedTileSet::PriorityIterator::AdvanceList() {
+  DCHECK(iterator_ == tile_set_->tiles_[current_bin_].end());
+
+  while (current_bin_ != NEVER_BIN) {
+    current_bin_ = static_cast<ManagedTileBin>(current_bin_ + 1);
+    iterator_ = tile_set_->tiles_[current_bin_].begin();
+    if (iterator_ != tile_set_->tiles_[current_bin_].end())
+      break;
+  }
+}
+
+}  // namespace cc
diff --git a/cc/resources/prioritized_tile_set.h b/cc/resources/prioritized_tile_set.h
new file mode 100644
index 0000000..fe1b2a0
--- /dev/null
+++ b/cc/resources/prioritized_tile_set.h
@@ -0,0 +1,56 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_PRIORITIZED_TILE_SET_H_
+#define CC_RESOURCES_PRIORITIZED_TILE_SET_H_
+
+#include <vector>
+
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "cc/base/cc_export.h"
+#include "cc/resources/managed_tile_state.h"
+
+namespace cc {
+class Tile;
+
+class CC_EXPORT PrioritizedTileSet {
+ public:
+  PrioritizedTileSet();
+  ~PrioritizedTileSet();
+
+  void InsertTile(Tile* tile, ManagedTileBin bin);
+  void Clear();
+  void Sort();
+
+  class CC_EXPORT PriorityIterator {
+   public:
+    explicit PriorityIterator(PrioritizedTileSet* set);
+    ~PriorityIterator();
+
+    PriorityIterator& operator++();
+    Tile* operator->() { return *(*this); }
+    Tile* operator*();
+    operator bool() const {
+      return iterator_ != tile_set_->tiles_[current_bin_].end();
+    }
+
+   private:
+    void AdvanceList();
+
+    PrioritizedTileSet* tile_set_;
+    ManagedTileBin current_bin_;
+    std::vector<scoped_refptr<Tile> >::iterator iterator_;
+  };
+
+ private:
+  friend class PriorityIterator;
+
+  typedef scoped_refptr<Tile> TileRef;
+  std::vector<TileRef> tiles_[NUM_BINS];
+};
+
+}  // namespace cc
+
+#endif  // CC_RESOURCES_PRIORITIZED_TILE_SET_H_
diff --git a/cc/resources/prioritized_tile_set_unittest.cc b/cc/resources/prioritized_tile_set_unittest.cc
new file mode 100644
index 0000000..645fa04
--- /dev/null
+++ b/cc/resources/prioritized_tile_set_unittest.cc
@@ -0,0 +1,470 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <algorithm>
+#include <vector>
+
+#include "cc/resources/managed_tile_state.h"
+#include "cc/resources/prioritized_tile_set.h"
+#include "cc/resources/tile.h"
+#include "cc/test/fake_output_surface.h"
+#include "cc/test/fake_picture_pile_impl.h"
+#include "cc/test/fake_tile_manager.h"
+#include "cc/test/fake_tile_manager_client.h"
+#include "cc/test/test_tile_priorities.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cc {
+
+class BinComparator {
+ public:
+  bool operator()(const scoped_refptr<Tile>& a,
+                  const scoped_refptr<Tile>& b) const {
+    const ManagedTileState& ams = a->managed_state();
+    const ManagedTileState& bms = b->managed_state();
+
+    if (ams.bin[LOW_PRIORITY_BIN] != bms.bin[LOW_PRIORITY_BIN])
+      return ams.bin[LOW_PRIORITY_BIN] < bms.bin[LOW_PRIORITY_BIN];
+
+    if (ams.required_for_activation != bms.required_for_activation)
+      return ams.required_for_activation;
+
+    if (ams.resolution != bms.resolution)
+      return ams.resolution < bms.resolution;
+
+    if (ams.time_to_needed_in_seconds !=  bms.time_to_needed_in_seconds)
+      return ams.time_to_needed_in_seconds < bms.time_to_needed_in_seconds;
+
+    if (ams.distance_to_visible_in_pixels !=
+        bms.distance_to_visible_in_pixels) {
+      return ams.distance_to_visible_in_pixels <
+             bms.distance_to_visible_in_pixels;
+    }
+
+    gfx::Rect a_rect = a->content_rect();
+    gfx::Rect b_rect = b->content_rect();
+    if (a_rect.y() != b_rect.y())
+      return a_rect.y() < b_rect.y();
+    return a_rect.x() < b_rect.x();
+  }
+};
+
+namespace {
+
+class PrioritizedTileSetTest : public testing::Test {
+ public:
+  PrioritizedTileSetTest()
+      : output_surface_(FakeOutputSurface::Create3d()),
+        resource_provider_(ResourceProvider::Create(output_surface_.get(), 0)),
+        tile_manager_(new FakeTileManager(&tile_manager_client_,
+                                          resource_provider_.get())),
+        picture_pile_(FakePicturePileImpl::CreatePile()) {}
+
+  scoped_refptr<Tile> CreateTile() {
+    return make_scoped_refptr(new Tile(tile_manager_.get(),
+                                       picture_pile_.get(),
+                                       settings_.default_tile_size,
+                                       gfx::Rect(),
+                                       gfx::Rect(),
+                                       1.0,
+                                       0,
+                                       0,
+                                       true));
+  }
+
+ private:
+  FakeTileManagerClient tile_manager_client_;
+  LayerTreeSettings settings_;
+  scoped_ptr<FakeOutputSurface> output_surface_;
+  scoped_ptr<ResourceProvider> resource_provider_;
+  scoped_ptr<FakeTileManager> tile_manager_;
+  scoped_refptr<FakePicturePileImpl> picture_pile_;
+};
+
+TEST_F(PrioritizedTileSetTest, EmptyIterator) {
+  PrioritizedTileSet set;
+  set.Sort();
+
+  PrioritizedTileSet::PriorityIterator it(&set);
+  EXPECT_FALSE(it);
+}
+
+TEST_F(PrioritizedTileSetTest, NonEmptyIterator) {
+  PrioritizedTileSet set;
+  scoped_refptr<Tile> tile = CreateTile();
+  set.InsertTile(tile, NOW_BIN);
+  set.Sort();
+
+  PrioritizedTileSet::PriorityIterator it(&set);
+  EXPECT_TRUE(it);
+  EXPECT_TRUE(*it == tile.get());
+  ++it;
+  EXPECT_FALSE(it);
+}
+
+TEST_F(PrioritizedTileSetTest, NowAndReadyToDrawBin) {
+  PrioritizedTileSet set;
+  TilePriority priorities[4] = {
+      TilePriorityForEventualBin(),
+      TilePriorityForNowBin(),
+      TilePriority(),
+      TilePriorityForSoonBin()};
+
+  std::vector<scoped_refptr<Tile> > tiles;
+  for (int priority = 0; priority < 4; ++priority) {
+    for (int i = 0; i < 5; ++i) {
+      scoped_refptr<Tile> tile = CreateTile();
+      tile->SetPriority(ACTIVE_TREE, priorities[priority]);
+      tile->SetPriority(PENDING_TREE, priorities[priority]);
+      tiles.push_back(tile);
+      set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
+    }
+  }
+
+  set.Sort();
+
+  // Tiles should appear in the same order as inserted.
+  int i = 0;
+  for (PrioritizedTileSet::PriorityIterator it(&set);
+       it;
+       ++it) {
+    EXPECT_TRUE(*it == tiles[i].get());
+    ++i;
+  }
+  EXPECT_EQ(20, i);
+}
+
+TEST_F(PrioritizedTileSetTest, NowBin) {
+  PrioritizedTileSet set;
+  TilePriority priorities[4] = {
+      TilePriorityForEventualBin(),
+      TilePriorityForNowBin(),
+      TilePriority(),
+      TilePriorityForSoonBin()};
+
+  std::vector<scoped_refptr<Tile> > tiles;
+  for (int priority = 0; priority < 4; ++priority) {
+    for (int i = 0; i < 5; ++i) {
+      scoped_refptr<Tile> tile = CreateTile();
+      tile->SetPriority(ACTIVE_TREE, priorities[priority]);
+      tile->SetPriority(PENDING_TREE, priorities[priority]);
+      tiles.push_back(tile);
+      set.InsertTile(tile, NOW_BIN);
+    }
+  }
+
+  set.Sort();
+
+  // Tiles should appear in BinComparator order.
+  std::sort(tiles.begin(), tiles.end(), BinComparator());
+
+  int i = 0;
+  for (PrioritizedTileSet::PriorityIterator it(&set);
+       it;
+       ++it) {
+    EXPECT_TRUE(*it == tiles[i].get());
+    ++i;
+  }
+  EXPECT_EQ(20, i);
+}
+
+TEST_F(PrioritizedTileSetTest, SoonBin) {
+  PrioritizedTileSet set;
+  TilePriority priorities[4] = {
+      TilePriorityForEventualBin(),
+      TilePriorityForNowBin(),
+      TilePriority(),
+      TilePriorityForSoonBin()};
+
+  std::vector<scoped_refptr<Tile> > tiles;
+  for (int priority = 0; priority < 4; ++priority) {
+    for (int i = 0; i < 5; ++i) {
+      scoped_refptr<Tile> tile = CreateTile();
+      tile->SetPriority(ACTIVE_TREE, priorities[priority]);
+      tile->SetPriority(PENDING_TREE, priorities[priority]);
+      tiles.push_back(tile);
+      set.InsertTile(tile, SOON_BIN);
+    }
+  }
+
+  set.Sort();
+
+  // Tiles should appear in BinComparator order.
+  std::sort(tiles.begin(), tiles.end(), BinComparator());
+
+  int i = 0;
+  for (PrioritizedTileSet::PriorityIterator it(&set);
+       it;
+       ++it) {
+    EXPECT_TRUE(*it == tiles[i].get());
+    ++i;
+  }
+  EXPECT_EQ(20, i);
+}
+
+TEST_F(PrioritizedTileSetTest, EventuallyAndActiveBin) {
+  PrioritizedTileSet set;
+  TilePriority priorities[4] = {
+      TilePriorityForEventualBin(),
+      TilePriorityForNowBin(),
+      TilePriority(),
+      TilePriorityForSoonBin()};
+
+  std::vector<scoped_refptr<Tile> > tiles;
+  for (int priority = 0; priority < 4; ++priority) {
+    for (int i = 0; i < 5; ++i) {
+      scoped_refptr<Tile> tile = CreateTile();
+      tile->SetPriority(ACTIVE_TREE, priorities[priority]);
+      tile->SetPriority(PENDING_TREE, priorities[priority]);
+      tiles.push_back(tile);
+      set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
+    }
+  }
+
+  set.Sort();
+
+  // Tiles should appear in BinComparator order.
+  std::sort(tiles.begin(), tiles.end(), BinComparator());
+
+  int i = 0;
+  for (PrioritizedTileSet::PriorityIterator it(&set);
+       it;
+       ++it) {
+    EXPECT_TRUE(*it == tiles[i].get());
+    ++i;
+  }
+  EXPECT_EQ(20, i);
+}
+
+TEST_F(PrioritizedTileSetTest, EventuallyBin) {
+  PrioritizedTileSet set;
+  TilePriority priorities[4] = {
+      TilePriorityForEventualBin(),
+      TilePriorityForNowBin(),
+      TilePriority(),
+      TilePriorityForSoonBin()};
+
+  std::vector<scoped_refptr<Tile> > tiles;
+  for (int priority = 0; priority < 4; ++priority) {
+    for (int i = 0; i < 5; ++i) {
+      scoped_refptr<Tile> tile = CreateTile();
+      tile->SetPriority(ACTIVE_TREE, priorities[priority]);
+      tile->SetPriority(PENDING_TREE, priorities[priority]);
+      tiles.push_back(tile);
+      set.InsertTile(tile, EVENTUALLY_BIN);
+    }
+  }
+
+  set.Sort();
+
+  // Tiles should appear in BinComparator order.
+  std::sort(tiles.begin(), tiles.end(), BinComparator());
+
+  int i = 0;
+  for (PrioritizedTileSet::PriorityIterator it(&set);
+       it;
+       ++it) {
+    EXPECT_TRUE(*it == tiles[i].get());
+    ++i;
+  }
+  EXPECT_EQ(20, i);
+}
+
+TEST_F(PrioritizedTileSetTest, NeverAndActiveBin) {
+  PrioritizedTileSet set;
+  TilePriority priorities[4] = {
+      TilePriorityForEventualBin(),
+      TilePriorityForNowBin(),
+      TilePriority(),
+      TilePriorityForSoonBin()};
+
+  std::vector<scoped_refptr<Tile> > tiles;
+  for (int priority = 0; priority < 4; ++priority) {
+    for (int i = 0; i < 5; ++i) {
+      scoped_refptr<Tile> tile = CreateTile();
+      tile->SetPriority(ACTIVE_TREE, priorities[priority]);
+      tile->SetPriority(PENDING_TREE, priorities[priority]);
+      tiles.push_back(tile);
+      set.InsertTile(tile, NEVER_AND_ACTIVE_BIN);
+    }
+  }
+
+  set.Sort();
+
+  // Tiles should appear in BinComparator order.
+  std::sort(tiles.begin(), tiles.end(), BinComparator());
+
+  int i = 0;
+  for (PrioritizedTileSet::PriorityIterator it(&set);
+       it;
+       ++it) {
+    EXPECT_TRUE(*it == tiles[i].get());
+    ++i;
+  }
+  EXPECT_EQ(20, i);
+}
+
+TEST_F(PrioritizedTileSetTest, NeverBin) {
+  PrioritizedTileSet set;
+  TilePriority priorities[4] = {
+      TilePriorityForEventualBin(),
+      TilePriorityForNowBin(),
+      TilePriority(),
+      TilePriorityForSoonBin()};
+
+  std::vector<scoped_refptr<Tile> > tiles;
+  for (int priority = 0; priority < 4; ++priority) {
+    for (int i = 0; i < 5; ++i) {
+      scoped_refptr<Tile> tile = CreateTile();
+      tile->SetPriority(ACTIVE_TREE, priorities[priority]);
+      tile->SetPriority(PENDING_TREE, priorities[priority]);
+      tiles.push_back(tile);
+      set.InsertTile(tile, NEVER_BIN);
+    }
+  }
+
+  set.Sort();
+
+  // Tiles should appear in BinComparator order.
+  std::sort(tiles.begin(), tiles.end(), BinComparator());
+
+  int i = 0;
+  for (PrioritizedTileSet::PriorityIterator it(&set);
+       it;
+       ++it) {
+    EXPECT_TRUE(*it == tiles[i].get());
+    ++i;
+  }
+  EXPECT_EQ(20, i);
+}
+
+TEST_F(PrioritizedTileSetTest, TilesForEachBin) {
+  scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
+  scoped_refptr<Tile> now_bin = CreateTile();
+  scoped_refptr<Tile> soon_bin = CreateTile();
+  scoped_refptr<Tile> eventually_and_active_bin = CreateTile();
+  scoped_refptr<Tile> eventually_bin = CreateTile();
+  scoped_refptr<Tile> never_bin = CreateTile();
+  scoped_refptr<Tile> never_and_active_bin = CreateTile();
+
+  PrioritizedTileSet set;
+  set.InsertTile(soon_bin, SOON_BIN);
+  set.InsertTile(never_and_active_bin, NEVER_AND_ACTIVE_BIN);
+  set.InsertTile(eventually_bin, EVENTUALLY_BIN);
+  set.InsertTile(now_bin, NOW_BIN);
+  set.InsertTile(eventually_and_active_bin, EVENTUALLY_AND_ACTIVE_BIN);
+  set.InsertTile(never_bin, NEVER_BIN);
+  set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
+
+  set.Sort();
+
+  // Tiles should appear in order.
+  PrioritizedTileSet::PriorityIterator it(&set);
+  EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
+  ++it;
+  EXPECT_TRUE(*it == now_bin.get());
+  ++it;
+  EXPECT_TRUE(*it == soon_bin.get());
+  ++it;
+  EXPECT_TRUE(*it == eventually_and_active_bin.get());
+  ++it;
+  EXPECT_TRUE(*it == eventually_bin.get());
+  ++it;
+  EXPECT_TRUE(*it == never_and_active_bin.get());
+  ++it;
+  EXPECT_TRUE(*it == never_bin.get());
+  ++it;
+  EXPECT_FALSE(it);
+}
+
+TEST_F(PrioritizedTileSetTest, TilesForFirstAndLastBins) {
+  scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
+  scoped_refptr<Tile> never_bin = CreateTile();
+
+  PrioritizedTileSet set;
+  set.InsertTile(never_bin, NEVER_BIN);
+  set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
+
+  set.Sort();
+
+  // Only two tiles should appear and they should appear in order.
+  PrioritizedTileSet::PriorityIterator it(&set);
+  EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
+  ++it;
+  EXPECT_TRUE(*it == never_bin.get());
+  ++it;
+  EXPECT_FALSE(it);
+}
+
+TEST_F(PrioritizedTileSetTest, MultipleIterators) {
+  scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
+  scoped_refptr<Tile> now_bin = CreateTile();
+  scoped_refptr<Tile> soon_bin = CreateTile();
+  scoped_refptr<Tile> eventually_bin = CreateTile();
+  scoped_refptr<Tile> never_bin = CreateTile();
+
+  PrioritizedTileSet set;
+  set.InsertTile(soon_bin, SOON_BIN);
+  set.InsertTile(eventually_bin, EVENTUALLY_BIN);
+  set.InsertTile(now_bin, NOW_BIN);
+  set.InsertTile(never_bin, NEVER_BIN);
+  set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
+
+  set.Sort();
+
+  // Tiles should appear in order.
+  PrioritizedTileSet::PriorityIterator it(&set);
+  EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
+  ++it;
+  EXPECT_TRUE(*it == now_bin.get());
+  ++it;
+  EXPECT_TRUE(*it == soon_bin.get());
+  ++it;
+  EXPECT_TRUE(*it == eventually_bin.get());
+  ++it;
+  EXPECT_TRUE(*it == never_bin.get());
+  ++it;
+  EXPECT_FALSE(it);
+
+  // Creating multiple iterators shouldn't affect old iterators.
+  PrioritizedTileSet::PriorityIterator second_it(&set);
+  EXPECT_TRUE(second_it);
+  EXPECT_FALSE(it);
+
+  ++second_it;
+  EXPECT_TRUE(second_it);
+  ++second_it;
+  EXPECT_TRUE(second_it);
+  EXPECT_FALSE(it);
+
+  PrioritizedTileSet::PriorityIterator third_it(&set);
+  EXPECT_TRUE(third_it);
+  ++second_it;
+  ++second_it;
+  EXPECT_TRUE(second_it);
+  EXPECT_TRUE(third_it);
+  EXPECT_FALSE(it);
+
+  ++third_it;
+  ++third_it;
+  EXPECT_TRUE(third_it);
+  EXPECT_TRUE(*third_it == soon_bin.get());
+  EXPECT_TRUE(second_it);
+  EXPECT_TRUE(*second_it == never_bin.get());
+  EXPECT_FALSE(it);
+
+  ++second_it;
+  EXPECT_TRUE(third_it);
+  EXPECT_FALSE(second_it);
+  EXPECT_FALSE(it);
+
+  set.Clear();
+
+  PrioritizedTileSet::PriorityIterator empty_it(&set);
+  EXPECT_FALSE(empty_it);
+}
+
+}  // namespace
+}  // namespace cc
+
diff --git a/cc/resources/tile.h b/cc/resources/tile.h
index 408d4b1..be9b19a 100644
--- a/cc/resources/tile.h
+++ b/cc/resources/tile.h
@@ -120,6 +120,7 @@
  private:
   // Methods called by by tile manager.
   friend class TileManager;
+  friend class PrioritizedTileSet;
   friend class FakeTileManager;
   friend class BinComparator;
   ManagedTileState& managed_state() { return managed_state_; }
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
index 41e2631..aa6c1ad 100644
--- a/cc/resources/tile_manager.cc
+++ b/cc/resources/tile_manager.cc
@@ -27,32 +27,46 @@
 // Memory limit policy works by mapping some bin states to the NEVER bin.
 const ManagedTileBin kBinPolicyMap[NUM_TILE_MEMORY_LIMIT_POLICIES][NUM_BINS] = {
   {  // [ALLOW_NOTHING]
-    NEVER_BIN,      // [NOW_BIN]
-    NEVER_BIN,      // [SOON_BIN]
-    NEVER_BIN,      // [EVENTUALLY_BIN]
-    NEVER_BIN       // [NEVER_BIN]
+    NEVER_BIN,                  // [NOW_AND_READY_TO_DRAW_BIN]
+    NEVER_BIN,                  // [NOW_BIN]
+    NEVER_BIN,                  // [SOON_BIN]
+    NEVER_BIN,                  // [EVENTUALLY_AND_ACTIVE_BIN]
+    NEVER_BIN,                  // [EVENTUALLY_BIN]
+    NEVER_BIN,                  // [NEVER_AND_ACTIVE_BIN]
+    NEVER_BIN                   // [NEVER_BIN]
   }, {  // [ALLOW_ABSOLUTE_MINIMUM]
-    NOW_BIN,        // [NOW_BIN]
-    NEVER_BIN,      // [SOON_BIN]
-    NEVER_BIN,      // [EVENTUALLY_BIN]
-    NEVER_BIN       // [NEVER_BIN]
+    NOW_AND_READY_TO_DRAW_BIN,  // [NOW_AND_READY_TO_DRAW_BIN]
+    NOW_BIN,                    // [NOW_BIN]
+    NEVER_BIN,                  // [SOON_BIN]
+    NEVER_BIN,                  // [EVENTUALLY_AND_ACTIVE_BIN]
+    NEVER_BIN,                  // [EVENTUALLY_BIN]
+    NEVER_BIN,                  // [NEVER_AND_ACTIVE_BIN]
+    NEVER_BIN                   // [NEVER_BIN]
   }, {  // [ALLOW_PREPAINT_ONLY]
-    NOW_BIN,         // [NOW_BIN]
-    SOON_BIN,        // [SOON_BIN]
-    NEVER_BIN,       // [EVENTUALLY_BIN]
-    NEVER_BIN        // [NEVER_BIN]
+    NOW_AND_READY_TO_DRAW_BIN,  // [NOW_AND_READY_TO_DRAW_BIN]
+    NOW_BIN,                    // [NOW_BIN]
+    SOON_BIN,                   // [SOON_BIN]
+    NEVER_BIN,                  // [EVENTUALLY_AND_ACTIVE_BIN]
+    NEVER_BIN,                  // [EVENTUALLY_BIN]
+    NEVER_BIN,                  // [NEVER_AND_ACTIVE_BIN]
+    NEVER_BIN                   // [NEVER_BIN]
   }, {  // [ALLOW_ANYTHING]
-    NOW_BIN,         // [NOW_BIN]
-    SOON_BIN,        // [SOON_BIN]
-    EVENTUALLY_BIN,  // [EVENTUALLY_BIN]
-    NEVER_BIN        // [NEVER_BIN]
+    NOW_AND_READY_TO_DRAW_BIN,  // [NOW_AND_READY_TO_DRAW_BIN]
+    NOW_BIN,                    // [NOW_BIN]
+    SOON_BIN,                   // [SOON_BIN]
+    EVENTUALLY_AND_ACTIVE_BIN,  // [EVENTUALLY_AND_ACTIVE_BIN]
+    EVENTUALLY_BIN,             // [EVENTUALLY_BIN]
+    NEVER_AND_ACTIVE_BIN,       // [NEVER_AND_ACTIVE_BIN]
+    NEVER_BIN                   // [NEVER_BIN]
   }
 };
 
 // Determine bin based on three categories of tiles: things we need now,
 // things we need soon, and eventually.
 inline ManagedTileBin BinFromTilePriority(const TilePriority& prio,
-                                          TreePriority tree_priority) {
+                                          TreePriority tree_priority,
+                                          bool is_ready_to_draw,
+                                          bool is_active) {
   // The amount of time for which we want to have prepainting coverage.
   const float kPrepaintingWindowTimeSeconds = 1.0f;
   const float kBackflingGuardDistancePixels = 314.0f;
@@ -64,19 +78,19 @@
 
   if (prio.distance_to_visible_in_pixels ==
       std::numeric_limits<float>::infinity())
-    return NEVER_BIN;
+    return is_active ? NEVER_AND_ACTIVE_BIN : NEVER_BIN;
 
   if (can_be_in_now_bin && prio.time_to_visible_in_seconds == 0)
-    return NOW_BIN;
+    return is_ready_to_draw ? NOW_AND_READY_TO_DRAW_BIN : NOW_BIN;
 
   if (prio.resolution == NON_IDEAL_RESOLUTION)
-    return EVENTUALLY_BIN;
+    return is_active ? EVENTUALLY_AND_ACTIVE_BIN : EVENTUALLY_BIN;
 
   if (prio.distance_to_visible_in_pixels < kBackflingGuardDistancePixels ||
       prio.time_to_visible_in_seconds < kPrepaintingWindowTimeSeconds)
     return SOON_BIN;
 
-  return EVENTUALLY_BIN;
+  return is_active ? EVENTUALLY_AND_ACTIVE_BIN : EVENTUALLY_BIN;
 }
 
 // Limit to the number of raster tasks that can be scheduled.
@@ -145,8 +159,8 @@
   // our memory usage to drop to zero.
   global_state_ = GlobalStateThatImpactsTilePriority();
 
-  // Clear |sorted_tiles_| so that tiles kept alive by it can be freed.
-  sorted_tiles_.clear();
+  // Clear |prioritized_tiles_| so that tiles kept alive by it can be freed.
+  prioritized_tiles_.Clear();
   DCHECK_EQ(0u, tiles_.size());
 
   TileVector empty;
@@ -196,7 +210,8 @@
   raster_worker_pool_->CheckForCompletedTasks();
 
   TileVector tiles_that_need_to_be_rasterized;
-  AssignGpuMemoryToTiles(sorted_tiles_, &tiles_that_need_to_be_rasterized);
+  AssignGpuMemoryToTiles(&prioritized_tiles_,
+                         &tiles_that_need_to_be_rasterized);
 
   // |tiles_that_need_to_be_rasterized| will be empty when we reach a
   // steady memory state. Keep scheduling tasks until we reach this state.
@@ -233,51 +248,9 @@
   client_->NotifyReadyToActivate();
 }
 
-class BinComparator {
- public:
-  bool operator()(const scoped_refptr<Tile>& a,
-                  const scoped_refptr<Tile>& b) const {
-    const ManagedTileState& ams = a->managed_state();
-    const ManagedTileState& bms = b->managed_state();
-
-    if (ams.visible_and_ready_to_draw != bms.visible_and_ready_to_draw)
-      return ams.visible_and_ready_to_draw;
-
-    if (ams.bin[HIGH_PRIORITY_BIN] != bms.bin[HIGH_PRIORITY_BIN])
-      return ams.bin[HIGH_PRIORITY_BIN] < bms.bin[HIGH_PRIORITY_BIN];
-
-    if (ams.bin[LOW_PRIORITY_BIN] != bms.bin[LOW_PRIORITY_BIN])
-      return ams.bin[LOW_PRIORITY_BIN] < bms.bin[LOW_PRIORITY_BIN];
-
-    if (ams.required_for_activation != bms.required_for_activation)
-      return ams.required_for_activation;
-
-    if (ams.resolution != bms.resolution)
-      return ams.resolution < bms.resolution;
-
-    if (ams.time_to_needed_in_seconds !=  bms.time_to_needed_in_seconds)
-      return ams.time_to_needed_in_seconds < bms.time_to_needed_in_seconds;
-
-    if (ams.distance_to_visible_in_pixels !=
-        bms.distance_to_visible_in_pixels) {
-      return ams.distance_to_visible_in_pixels <
-             bms.distance_to_visible_in_pixels;
-    }
-
-    gfx::Rect a_rect = a->content_rect();
-    gfx::Rect b_rect = b->content_rect();
-    if (a_rect.y() != b_rect.y())
-      return a_rect.y() < b_rect.y();
-    return a_rect.x() < b_rect.x();
-  }
-};
-
-void TileManager::GetTilesWithAssignedBins(TileRefVector* tiles) {
+void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) {
   TRACE_EVENT0("cc", "TileManager::GetTilesWithAssignedBins");
 
-  DCHECK_EQ(0u, tiles->size());
-  tiles->reserve(tiles_.size());
-
   const TileMemoryLimitPolicy memory_policy = global_state_.memory_limit_policy;
   const TreePriority tree_priority = global_state_.tree_priority;
 
@@ -302,6 +275,11 @@
         break;
     }
 
+    bool tile_is_ready_to_draw = tile->IsReadyToDraw();
+    bool tile_is_active =
+        tile_is_ready_to_draw ||
+        !mts.tile_versions[mts.raster_mode].raster_task_.is_null();
+
     mts.resolution = prio[HIGH_PRIORITY_BIN].resolution;
     mts.time_to_needed_in_seconds =
         prio[HIGH_PRIORITY_BIN].time_to_visible_in_seconds;
@@ -309,56 +287,80 @@
         prio[HIGH_PRIORITY_BIN].distance_to_visible_in_pixels;
     mts.required_for_activation =
         prio[HIGH_PRIORITY_BIN].required_for_activation;
-    mts.bin[HIGH_PRIORITY_BIN] =
-        BinFromTilePriority(prio[HIGH_PRIORITY_BIN], tree_priority);
-    mts.bin[LOW_PRIORITY_BIN] =
-        BinFromTilePriority(prio[LOW_PRIORITY_BIN], tree_priority);
-    mts.gpu_memmgr_stats_bin =
-        BinFromTilePriority(tile->combined_priority(), tree_priority);
 
-    mts.tree_bin[ACTIVE_TREE] = kBinPolicyMap[memory_policy][
-        BinFromTilePriority(tile->priority(ACTIVE_TREE), tree_priority)];
-    mts.tree_bin[PENDING_TREE] = kBinPolicyMap[memory_policy][
-        BinFromTilePriority(tile->priority(PENDING_TREE), tree_priority)];
+    mts.bin[HIGH_PRIORITY_BIN] =
+        BinFromTilePriority(prio[HIGH_PRIORITY_BIN],
+                            tree_priority,
+                            tile_is_ready_to_draw,
+                            tile_is_active);
+    mts.bin[LOW_PRIORITY_BIN] =
+        BinFromTilePriority(prio[LOW_PRIORITY_BIN],
+                            tree_priority,
+                            tile_is_ready_to_draw,
+                            tile_is_active);
+    mts.gpu_memmgr_stats_bin =
+        BinFromTilePriority(tile->combined_priority(),
+                            tree_priority,
+                            tile_is_ready_to_draw,
+                            tile_is_active);
+
+    ManagedTileBin active_bin =
+        BinFromTilePriority(tile->priority(ACTIVE_TREE),
+                            tree_priority,
+                            tile_is_ready_to_draw,
+                            tile_is_active);
+    mts.tree_bin[ACTIVE_TREE] = kBinPolicyMap[memory_policy][active_bin];
+
+    ManagedTileBin pending_bin =
+        BinFromTilePriority(tile->priority(PENDING_TREE),
+                            tree_priority,
+                            tile_is_ready_to_draw,
+                            tile_is_active);
+    mts.tree_bin[PENDING_TREE] = kBinPolicyMap[memory_policy][pending_bin];
 
     for (int i = 0; i < NUM_BIN_PRIORITIES; ++i)
       mts.bin[i] = kBinPolicyMap[memory_policy][mts.bin[i]];
 
     mts.visible_and_ready_to_draw =
-        mts.tree_bin[ACTIVE_TREE] == NOW_BIN && tile->IsReadyToDraw();
+        mts.tree_bin[ACTIVE_TREE] == NOW_AND_READY_TO_DRAW_BIN;
 
-    // Skip and free resources for tiles in the NEVER_BIN on both trees.
-    if (mts.is_in_never_bin_on_both_trees())
+    if (mts.is_in_never_bin_on_both_trees()) {
       FreeResourcesForTile(tile);
-    else
-      tiles->push_back(make_scoped_refptr(tile));
+      continue;
+    }
+
+    // Note that if the tile is visible_and_ready_to_draw, then we always want
+    // the priority to be NOW_AND_READY_TO_DRAW_BIN, even if HIGH_PRIORITY_BIN
+    // is something different. The reason for this is that if we're prioritizing
+    // the pending tree, we still want visible tiles to take the highest
+    // priority.
+    ManagedTileBin priority_bin = mts.visible_and_ready_to_draw
+                                  ? NOW_AND_READY_TO_DRAW_BIN
+                                  : mts.bin[HIGH_PRIORITY_BIN];
+
+    // Insert the tile into a priority set.
+    tiles->InsertTile(tile, priority_bin);
   }
 }
 
-void TileManager::SortTiles(TileRefVector* tiles) {
-  TRACE_EVENT0("cc", "TileManager::SortTiles");
-
-  // Sort by bin, resolution and time until needed.
-  std::sort(tiles->begin(), tiles->end(), BinComparator());
-}
-
-void TileManager::GetSortedTilesWithAssignedBins(TileRefVector* tiles) {
-  TRACE_EVENT0("cc", "TileManager::GetSortedTilesWithAssignedBins");
+void TileManager::GetPrioritizedTileSet(PrioritizedTileSet* tiles) {
+  TRACE_EVENT0("cc", "TileManager::GetPrioritizedTileSet");
 
   GetTilesWithAssignedBins(tiles);
-  SortTiles(tiles);
+  tiles->Sort();
 }
 
 void TileManager::ManageTiles() {
   TRACE_EVENT0("cc", "TileManager::ManageTiles");
 
-  // Clear |sorted_tiles_| so that tiles kept alive by it can be freed.
-  sorted_tiles_.clear();
+  // Clear |prioritized_tiles_| so that tiles kept alive by it can be freed.
+  prioritized_tiles_.Clear();
 
-  GetSortedTilesWithAssignedBins(&sorted_tiles_);
+  GetPrioritizedTileSet(&prioritized_tiles_);
 
   TileVector tiles_that_need_to_be_rasterized;
-  AssignGpuMemoryToTiles(sorted_tiles_, &tiles_that_need_to_be_rasterized);
+  AssignGpuMemoryToTiles(&prioritized_tiles_,
+                         &tiles_that_need_to_be_rasterized);
   CleanUpUnusedImageDecodeTasks();
 
   TRACE_EVENT_INSTANT1(
@@ -406,7 +408,8 @@
       continue;
 
     size_t tile_bytes = tile->bytes_consumed_if_allocated();
-    if (mts.gpu_memmgr_stats_bin == NOW_BIN)
+    if ((mts.gpu_memmgr_stats_bin == NOW_BIN) ||
+        (mts.gpu_memmgr_stats_bin == NOW_AND_READY_TO_DRAW_BIN))
       *memory_required_bytes += tile_bytes;
     if (mts.gpu_memmgr_stats_bin != NEVER_BIN)
       *memory_nice_to_have_bytes += tile_bytes;
@@ -468,7 +471,7 @@
 }
 
 void TileManager::AssignGpuMemoryToTiles(
-    const TileRefVector& sorted_tiles,
+    PrioritizedTileSet* tiles,
     TileVector* tiles_that_need_to_be_rasterized) {
   TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles");
 
@@ -476,10 +479,10 @@
   // the needs-to-be-rasterized queue.
   size_t bytes_releasable = 0;
   size_t resources_releasable = 0;
-  for (TileRefVector::const_iterator it = sorted_tiles.begin();
-       it != sorted_tiles.end();
+  for (PrioritizedTileSet::PriorityIterator it(tiles);
+       it;
        ++it) {
-    const Tile* tile = it->get();
+    const Tile* tile = *it;
     const ManagedTileState& mts = tile->managed_state();
     for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
       if (mts.tile_versions[mode].resource_) {
@@ -512,10 +515,10 @@
   bool oomed = false;
 
   unsigned schedule_priority = 1u;
-  for (TileRefVector::const_iterator it = sorted_tiles.begin();
-       it != sorted_tiles.end();
+  for (PrioritizedTileSet::PriorityIterator it(tiles);
+       it;
        ++it) {
-    Tile* tile = it->get();
+    Tile* tile = *it;
     ManagedTileState& mts = tile->managed_state();
 
     mts.scheduled_priority = schedule_priority++;
diff --git a/cc/resources/tile_manager.h b/cc/resources/tile_manager.h
index f6f5785..2e226c9 100644
--- a/cc/resources/tile_manager.h
+++ b/cc/resources/tile_manager.h
@@ -16,6 +16,7 @@
 #include "cc/resources/managed_tile_state.h"
 #include "cc/resources/memory_history.h"
 #include "cc/resources/picture_pile_impl.h"
+#include "cc/resources/prioritized_tile_set.h"
 #include "cc/resources/raster_worker_pool.h"
 #include "cc/resources/resource_pool.h"
 #include "cc/resources/tile.h"
@@ -98,7 +99,6 @@
   virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE;
 
   typedef std::vector<Tile*> TileVector;
-  typedef std::vector<scoped_refptr<Tile> > TileRefVector;
   typedef std::set<Tile*> TileSet;
 
   // Virtual for test
@@ -106,11 +106,10 @@
       const TileVector& tiles_that_need_to_be_rasterized);
 
   void AssignGpuMemoryToTiles(
-      const TileRefVector& sorted_tiles,
+      PrioritizedTileSet* tiles,
       TileVector* tiles_that_need_to_be_rasterized);
-  void GetTilesWithAssignedBins(TileRefVector* tiles);
-  void SortTiles(TileRefVector* tiles);
-  void GetSortedTilesWithAssignedBins(TileRefVector* tiles);
+  void GetTilesWithAssignedBins(PrioritizedTileSet* tiles);
+  void GetPrioritizedTileSet(PrioritizedTileSet* tiles);
 
  private:
   void OnImageDecodeTaskCompleted(
@@ -142,7 +141,7 @@
   typedef base::hash_map<Tile::Id, Tile*> TileMap;
   TileMap tiles_;
 
-  TileRefVector sorted_tiles_;
+  PrioritizedTileSet prioritized_tiles_;
 
   bool all_tiles_that_need_to_be_rasterized_have_memory_;
   bool all_tiles_required_for_activation_have_memory_;
diff --git a/cc/resources/tile_manager_perftest.cc b/cc/resources/tile_manager_perftest.cc
index 677dffc..ca6f997 100644
--- a/cc/resources/tile_manager_perftest.cc
+++ b/cc/resources/tile_manager_perftest.cc
@@ -6,8 +6,10 @@
 #include "cc/resources/tile.h"
 #include "cc/resources/tile_priority.h"
 #include "cc/test/fake_output_surface.h"
+#include "cc/test/fake_picture_pile_impl.h"
 #include "cc/test/fake_tile_manager.h"
 #include "cc/test/fake_tile_manager_client.h"
+#include "cc/test/test_tile_priorities.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -19,53 +21,6 @@
 static const int kWarmupRuns = 5;
 static const int kTimeCheckInterval = 10;
 
-class FakePicturePileImpl : public PicturePileImpl {
- public:
-  FakePicturePileImpl() {
-    gfx::Size size(std::numeric_limits<int>::max(),
-                   std::numeric_limits<int>::max());
-    Resize(size);
-    recorded_region_ = Region(gfx::Rect(size));
-  }
-
- protected:
-  virtual ~FakePicturePileImpl() {}
-};
-
-class TilePriorityForSoonBin : public TilePriority {
- public:
-  TilePriorityForSoonBin() : TilePriority(
-            HIGH_RESOLUTION,
-            0.5,
-            300.0) {}
-};
-
-class TilePriorityForEventualBin : public TilePriority {
- public:
-    TilePriorityForEventualBin() : TilePriority(
-            NON_IDEAL_RESOLUTION,
-            1.0,
-            315.0) {}
-};
-
-class TilePriorityForNowBin : public TilePriority {
- public:
-    TilePriorityForNowBin() : TilePriority(
-            HIGH_RESOLUTION,
-            0,
-            0) {}
-};
-
-class TilePriorityRequiredForActivation : public TilePriority {
- public:
-    TilePriorityRequiredForActivation() : TilePriority(
-            HIGH_RESOLUTION,
-            0,
-            0) {
-      required_for_activation = true;
-    }
-};
-
 class TileManagerPerfTest : public testing::Test {
  public:
   typedef std::vector<scoped_refptr<Tile> > TileVector;
@@ -87,7 +42,7 @@
     state.tree_priority = SMOOTHNESS_TAKES_PRIORITY;
 
     tile_manager_->SetGlobalState(state);
-    picture_pile_ = make_scoped_refptr(new FakePicturePileImpl());
+    picture_pile_ = FakePicturePileImpl::CreatePile();
   }
 
   virtual void TearDown() OVERRIDE {
diff --git a/cc/resources/tile_manager_unittest.cc b/cc/resources/tile_manager_unittest.cc
index f55f1e4..6fb0690 100644
--- a/cc/resources/tile_manager_unittest.cc
+++ b/cc/resources/tile_manager_unittest.cc
@@ -5,60 +5,15 @@
 #include "cc/resources/tile.h"
 #include "cc/resources/tile_priority.h"
 #include "cc/test/fake_output_surface.h"
+#include "cc/test/fake_picture_pile_impl.h"
 #include "cc/test/fake_tile_manager.h"
 #include "cc/test/fake_tile_manager_client.h"
+#include "cc/test/test_tile_priorities.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cc {
 namespace {
 
-class FakePicturePileImpl : public PicturePileImpl {
- public:
-  FakePicturePileImpl() {
-    gfx::Size size(std::numeric_limits<int>::max(),
-                   std::numeric_limits<int>::max());
-    Resize(size);
-    recorded_region_ = Region(gfx::Rect(size));
-  }
-
- protected:
-  virtual ~FakePicturePileImpl() {}
-};
-
-class TilePriorityForSoonBin : public TilePriority {
- public:
-  TilePriorityForSoonBin() : TilePriority(
-            HIGH_RESOLUTION,
-            0.5,
-            300.0) {}
-};
-
-class TilePriorityForEventualBin : public TilePriority {
- public:
-    TilePriorityForEventualBin() : TilePriority(
-            NON_IDEAL_RESOLUTION,
-            1.0,
-            315.0) {}
-};
-
-class TilePriorityForNowBin : public TilePriority {
- public:
-    TilePriorityForNowBin() : TilePriority(
-            HIGH_RESOLUTION,
-            0,
-            0) {}
-};
-
-class TilePriorityRequiredForActivation : public TilePriority {
- public:
-    TilePriorityRequiredForActivation() : TilePriority(
-            HIGH_RESOLUTION,
-            0,
-            0) {
-      required_for_activation = true;
-    }
-};
-
 class TileManagerTest : public testing::TestWithParam<bool> {
  public:
   typedef std::vector<scoped_refptr<Tile> > TileVector;
@@ -90,7 +45,7 @@
     state.tree_priority = tree_priority;
 
     tile_manager_->SetGlobalState(state);
-    picture_pile_ = make_scoped_refptr(new FakePicturePileImpl());
+    picture_pile_ = FakePicturePileImpl::CreatePile();
   }
 
   void SetTreePriority(TreePriority tree_priority) {
diff --git a/cc/test/fake_picture_layer_impl.cc b/cc/test/fake_picture_layer_impl.cc
index bdf40a5..dd383a6 100644
--- a/cc/test/fake_picture_layer_impl.cc
+++ b/cc/test/fake_picture_layer_impl.cc
@@ -14,6 +14,7 @@
       append_quads_count_(0) {
   pile_ = pile;
   SetBounds(pile_->size());
+  CreateTilingSetIfNeeded();
 }
 
 FakePictureLayerImpl::FakePictureLayerImpl(LayerTreeImpl* tree_impl, int id)
diff --git a/cc/test/fake_picture_layer_impl.h b/cc/test/fake_picture_layer_impl.h
index 2eeaeef..a0c7829 100644
--- a/cc/test/fake_picture_layer_impl.h
+++ b/cc/test/fake_picture_layer_impl.h
@@ -32,14 +32,6 @@
   using PictureLayerImpl::CleanUpTilingsOnActiveLayer;
   using PictureLayerImpl::CanHaveTilings;
   using PictureLayerImpl::MarkVisibleResourcesAsRequired;
-  using PictureLayerImpl::DoPostCommitInitializationIfNeeded;
-
-  bool needs_post_commit_initialization() const {
-    return needs_post_commit_initialization_;
-  }
-
-  bool is_using_lcd_text() const { return is_using_lcd_text_; }
-  void force_set_lcd_text(bool enabled) { is_using_lcd_text_ = enabled; }
 
   PictureLayerTiling* HighResTiling() const;
   PictureLayerTiling* LowResTiling() const;
diff --git a/cc/test/fake_picture_pile_impl.cc b/cc/test/fake_picture_pile_impl.cc
index 80df818..c79d0ae 100644
--- a/cc/test/fake_picture_pile_impl.cc
+++ b/cc/test/fake_picture_pile_impl.cc
@@ -4,6 +4,7 @@
 
 #include "cc/test/fake_picture_pile_impl.h"
 
+#include <limits>
 #include <utility>
 
 #include "cc/test/fake_rendering_stats_instrumentation.h"
@@ -42,6 +43,15 @@
   return pile;
 }
 
+scoped_refptr<FakePicturePileImpl> FakePicturePileImpl::CreatePile() {
+  scoped_refptr<FakePicturePileImpl> pile(new FakePicturePileImpl());
+  gfx::Size size(std::numeric_limits<int>::max(),
+                 std::numeric_limits<int>::max());
+  pile->Resize(size);
+  pile->recorded_region_ = Region(gfx::Rect(size));
+  return pile;
+}
+
 void FakePicturePileImpl::AddRecordingAt(int x, int y) {
   EXPECT_GE(x, 0);
   EXPECT_GE(y, 0);
diff --git a/cc/test/fake_picture_pile_impl.h b/cc/test/fake_picture_pile_impl.h
index a606934..1b35ecf 100644
--- a/cc/test/fake_picture_pile_impl.h
+++ b/cc/test/fake_picture_pile_impl.h
@@ -21,6 +21,8 @@
       gfx::Size tile_size,
       gfx::Size layer_bounds);
 
+  static scoped_refptr<FakePicturePileImpl> CreatePile();
+
   TilingData& tiling() { return tiling_; }
 
   void AddRecordingAt(int x, int y);
diff --git a/cc/test/fake_tile_manager.cc b/cc/test/fake_tile_manager.cc
index e302a23..c132254 100644
--- a/cc/test/fake_tile_manager.cc
+++ b/cc/test/fake_tile_manager.cc
@@ -42,10 +42,10 @@
 
 void FakeTileManager::AssignMemoryToTiles() {
   tiles_for_raster.clear();
-  all_tiles.clear();
+  all_tiles.Clear();
 
-  GetSortedTilesWithAssignedBins(&all_tiles);
-  AssignGpuMemoryToTiles(all_tiles, &tiles_for_raster);
+  GetPrioritizedTileSet(&all_tiles);
+  AssignGpuMemoryToTiles(&all_tiles, &tiles_for_raster);
 }
 
 bool FakeTileManager::HasBeenAssignedMemory(Tile* tile) {
diff --git a/cc/test/fake_tile_manager.h b/cc/test/fake_tile_manager.h
index 77dbb78..f49c0ee 100644
--- a/cc/test/fake_tile_manager.h
+++ b/cc/test/fake_tile_manager.h
@@ -24,7 +24,7 @@
   virtual ~FakeTileManager();
 
   std::vector<Tile*> tiles_for_raster;
-  std::vector<scoped_refptr<Tile> > all_tiles;
+  PrioritizedTileSet all_tiles;
 };
 
 }  // namespace cc
diff --git a/cc/test/test_tile_priorities.cc b/cc/test/test_tile_priorities.cc
new file mode 100644
index 0000000..f83f9b9
--- /dev/null
+++ b/cc/test/test_tile_priorities.cc
@@ -0,0 +1,23 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/test/test_tile_priorities.h"
+
+namespace cc {
+
+TilePriorityForSoonBin::TilePriorityForSoonBin()
+    : TilePriority(HIGH_RESOLUTION, 0.5, 300.0) {}
+
+TilePriorityForEventualBin::TilePriorityForEventualBin()
+    : TilePriority(NON_IDEAL_RESOLUTION, 1.0, 315.0) {}
+
+TilePriorityForNowBin::TilePriorityForNowBin()
+    : TilePriority(HIGH_RESOLUTION, 0, 0) {}
+
+TilePriorityRequiredForActivation::TilePriorityRequiredForActivation()
+    : TilePriority(HIGH_RESOLUTION, 0, 0) {
+  required_for_activation = true;
+}
+
+}  // namespace cc
diff --git a/cc/test/test_tile_priorities.h b/cc/test/test_tile_priorities.h
new file mode 100644
index 0000000..cc54105
--- /dev/null
+++ b/cc/test/test_tile_priorities.h
@@ -0,0 +1,34 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_TEST_TEST_TILE_PRIORITIES_H_
+#define CC_TEST_TEST_TILE_PRIORITIES_H_
+
+#include "cc/resources/tile_priority.h"
+
+namespace cc {
+
+class TilePriorityForSoonBin : public TilePriority {
+ public:
+  TilePriorityForSoonBin();
+};
+
+class TilePriorityForEventualBin : public TilePriority {
+ public:
+  TilePriorityForEventualBin();
+};
+
+class TilePriorityForNowBin : public TilePriority {
+ public:
+  TilePriorityForNowBin();
+};
+
+class TilePriorityRequiredForActivation : public TilePriority {
+ public:
+  TilePriorityRequiredForActivation();
+};
+
+}  // namespace cc
+
+#endif  // CC_TEST_TEST_TILE_PRIORITIES_H_
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index 67411aa..b18a88a 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -3313,13 +3313,19 @@
     child_ = PushPropertiesCountingLayer::Create();
     child2_ = PushPropertiesCountingLayer::Create();
     grandchild_ = PushPropertiesCountingLayer::Create();
-    leaf_scrollbar_layer_ =
-        FakeScrollbarLayer::Create(false, false, root_->id());
+
+    if (layer_tree_host()->settings().impl_side_painting)
+      leaf_picture_layer_ = FakePictureLayer::Create(&client_);
+    else
+      leaf_content_layer_ = FakeContentLayer::Create(&client_);
 
     root_->AddChild(child_);
     root_->AddChild(child2_);
     child_->AddChild(grandchild_);
-    child2_->AddChild(leaf_scrollbar_layer_);
+    if (leaf_picture_layer_)
+      child2_->AddChild(leaf_picture_layer_);
+    if (leaf_content_layer_)
+      child2_->AddChild(leaf_content_layer_);
 
     other_root_ = PushPropertiesCountingLayer::Create();
 
@@ -3338,10 +3344,16 @@
               child2_->push_properties_count());
     EXPECT_EQ(expected_push_properties_other_root_,
               other_root_->push_properties_count());
-    EXPECT_EQ(expected_push_properties_leaf_layer_,
-              leaf_scrollbar_layer_->push_properties_count());
+    if (leaf_content_layer_) {
+      EXPECT_EQ(expected_push_properties_leaf_layer_,
+                leaf_content_layer_->push_properties_count());
+    }
+    if (leaf_picture_layer_) {
+      EXPECT_EQ(expected_push_properties_leaf_layer_,
+                leaf_picture_layer_->push_properties_count());
+    }
 
-    // The scrollbar layer always needs to be pushed.
+    // The content/picture layer always needs to be pushed.
     if (root_->layer_tree_host()) {
       EXPECT_TRUE(root_->descendant_needs_push_properties());
       EXPECT_FALSE(root_->needs_push_properties());
@@ -3350,9 +3362,13 @@
       EXPECT_TRUE(child2_->descendant_needs_push_properties());
       EXPECT_FALSE(child2_->needs_push_properties());
     }
-    if (leaf_scrollbar_layer_->layer_tree_host()) {
-      EXPECT_FALSE(leaf_scrollbar_layer_->descendant_needs_push_properties());
-      EXPECT_TRUE(leaf_scrollbar_layer_->needs_push_properties());
+    if (leaf_content_layer_.get() && leaf_content_layer_->layer_tree_host()) {
+      EXPECT_FALSE(leaf_content_layer_->descendant_needs_push_properties());
+      EXPECT_TRUE(leaf_content_layer_->needs_push_properties());
+    }
+    if (leaf_picture_layer_.get() && leaf_picture_layer_->layer_tree_host()) {
+      EXPECT_FALSE(leaf_picture_layer_->descendant_needs_push_properties());
+      EXPECT_TRUE(leaf_picture_layer_->needs_push_properties());
     }
 
     // child_ and grandchild_ don't persist their need to push properties.
@@ -3463,7 +3479,8 @@
 
     // Content/Picture layers require PushProperties every commit that they are
     // in the tree.
-    if (leaf_scrollbar_layer_->layer_tree_host())
+    if ((leaf_content_layer_.get() && leaf_content_layer_->layer_tree_host()) ||
+        (leaf_picture_layer_.get() && leaf_picture_layer_->layer_tree_host()))
       ++expected_push_properties_leaf_layer_;
   }
 
@@ -3476,7 +3493,8 @@
   scoped_refptr<PushPropertiesCountingLayer> child2_;
   scoped_refptr<PushPropertiesCountingLayer> grandchild_;
   scoped_refptr<PushPropertiesCountingLayer> other_root_;
-  scoped_refptr<FakeScrollbarLayer> leaf_scrollbar_layer_;
+  scoped_refptr<FakeContentLayer> leaf_content_layer_;
+  scoped_refptr<FakePictureLayer> leaf_picture_layer_;
   size_t expected_push_properties_root_;
   size_t expected_push_properties_child_;
   size_t expected_push_properties_child2_;
diff --git a/chrome/VERSION b/chrome/VERSION
index 3036542..8bdd7b3 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=30
 MINOR=0
-BUILD=1590
+BUILD=1591
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabBase.java b/chrome/android/java/src/org/chromium/chrome/browser/TabBase.java
index 972af11..278a9cb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/TabBase.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/TabBase.java
@@ -20,6 +20,8 @@
  * parent classes.
  */
 public abstract class TabBase {
+    public static final int INVALID_TAB_ID = -1;
+
     private final WindowAndroid mWindowAndroid;
     private int mNativeTabAndroid;
 
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 485ed5d..ce595e8 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -1000,7 +1000,7 @@
           &amp;Search <ph name="SEARCH_ENGINE">$1<ex>Google</ex></ph> for '<ph name="SEARCH_TERMS">$2<ex>flowers</ex></ph>'
         </message>
         <message name="IDS_CONTENT_CONTEXT_SEARCHWEBFORIMAGE" desc="In Title Case: The name of the Search For Image command in the content area context menu">
-          &amp;Search <ph name="SEARCH_ENGINE">$1<ex>Google</ex></ph> for this image
+          &amp;Search <ph name="SEARCH_ENGINE">$1<ex>Google</ex></ph> for this Image
         </message>
         <message name="IDS_CONTENT_CONTEXT_GOTOURL" desc="In Title Case: The name of the Go to url for 'string' command in the content area context menu">
           &amp;Go to <ph name="URL">$1<ex>http://www.google.com/</ex></ph>
@@ -1611,1070 +1611,6 @@
         <ph name="ENGINE_NAME">$1<ex>Google</ex></ph> (Default)
       </message>
 
-      <message name="IDS_TIME_SECS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> secs
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_SEC_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_SEC_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_SECS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> secs
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_SECS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_SECS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> secs
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_SECS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_SECS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> secs
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_SECS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_SECS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> secs
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_SECS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <message name="IDS_TIME_MINS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> mins
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_MIN_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> min
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_MIN_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_MINS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> mins
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_MINS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_MINS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> mins
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_MINS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_MINS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> mins
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_MINS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_MINS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> mins
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_MINS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-
-      <message name="IDS_TIME_HOURS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> hours
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_HOUR_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_HOUR_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_HOURS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> hours
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_HOURS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_HOURS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> hours
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_HOURS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_HOURS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> hours
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_HOURS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_HOURS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> hours
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_HOURS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-
-      <message name="IDS_TIME_DAYS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> days
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_DAY_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> day
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_DAY_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_DAYS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> days
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_DAYS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_DAYS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> days
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_DAYS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_DAYS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> days
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_DAYS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_DAYS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> days
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_DAYS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-
-      <message name="IDS_TIME_REMAINING_SECS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> secs left
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_REMAINING_SEC_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec left
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_REMAINING_SEC_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_REMAINING_SECS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> secs left
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_REMAINING_SECS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_REMAINING_SECS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> secs left
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_REMAINING_SECS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_REMAINING_SECS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> secs left
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_REMAINING_SECS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_REMAINING_SECS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> secs left
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_REMAINING_SECS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-
-      <message name="IDS_TIME_REMAINING_MINS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> mins left
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_REMAINING_MIN_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> min left
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_REMAINING_MIN_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_REMAINING_MINS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> mins left
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_REMAINING_MINS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_REMAINING_MINS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> mins left
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_REMAINING_MINS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_REMAINING_MINS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> mins left
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_REMAINING_MINS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_REMAINING_MINS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> mins left
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_REMAINING_MINS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <message name="IDS_TIME_REMAINING_LONG_MINS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> minutes left
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_REMAINING_LONG_MIN_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute left
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_REMAINING_LONG_MIN_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_REMAINING_LONG_MINS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> minutes left
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_REMAINING_LONG_MINS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_REMAINING_LONG_MINS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> minutes left
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_REMAINING_LONG_MINS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_REMAINING_LONG_MINS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> minutes left
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_REMAINING_LONG_MINS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_REMAINING_LONG_MINS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> minutes left
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_REMAINING_LONG_MINS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <message name="IDS_TIME_REMAINING_HOURS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> hours left
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_REMAINING_HOUR_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour left
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_REMAINING_HOUR_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_REMAINING_HOURS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> hours left
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_REMAINING_HOURS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_REMAINING_HOURS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> hours left
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_REMAINING_HOURS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_REMAINING_HOURS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> hours left
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_REMAINING_HOURS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_REMAINING_HOURS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> hours left
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_REMAINING_HOURS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-
-      <message name="IDS_TIME_REMAINING_DAYS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> days left
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_REMAINING_DAY_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> day left
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_REMAINING_DAY_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_REMAINING_DAYS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> days left
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_REMAINING_DAYS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_REMAINING_DAYS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> days left
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_REMAINING_DAYS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_REMAINING_DAYS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> days left
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_REMAINING_DAYS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_REMAINING_DAYS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> days left
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_REMAINING_DAYS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <message name="IDS_TIME_DURATION_LONG_SECS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> seconds
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_DURATION_LONG_SEC_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> second
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_DURATION_LONG_SEC_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_DURATION_LONG_SECS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> seconds
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_DURATION_LONG_SECS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_DURATION_LONG_SECS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> seconds
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_DURATION_LONG_SECS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_DURATION_LONG_SECS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> seconds
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_DURATION_LONG_SECS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_DURATION_LONG_SECS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> seconds
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_DURATION_LONG_SECS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <message name="IDS_TIME_DURATION_LONG_MINS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> minutes
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_DURATION_LONG_MIN_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_DURATION_LONG_MIN_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_DURATION_LONG_MINS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> minutes
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_DURATION_LONG_MINS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_DURATION_LONG_MINS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> minutes
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_DURATION_LONG_MINS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_DURATION_LONG_MINS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> minutes
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_DURATION_LONG_MINS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_DURATION_LONG_MINS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> minutes
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_DURATION_LONG_MINS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <message name="IDS_TIME_ELAPSED_SECS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> secs ago
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_ELAPSED_SEC_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec ago
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_SEC_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_ELAPSED_SECS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> secs ago
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_SECS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_ELAPSED_SECS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> secs ago
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_SECS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_ELAPSED_SECS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> secs ago
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_SECS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_ELAPSED_SECS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> secs ago
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_ELAPSED_SECS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-
-      <message name="IDS_TIME_ELAPSED_MINS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> mins ago
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_ELAPSED_MIN_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> min ago
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_MIN_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_ELAPSED_MINS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> mins ago
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_MINS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_ELAPSED_MINS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> mins ago
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_MINS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_ELAPSED_MINS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> mins ago
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_MINS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_ELAPSED_MINS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> mins ago
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_ELAPSED_MINS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-
-      <message name="IDS_TIME_ELAPSED_HOURS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> hours ago
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_ELAPSED_HOUR_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour ago
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_HOUR_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_ELAPSED_HOURS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> hours ago
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_HOURS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_ELAPSED_HOURS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> hours ago
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_HOURS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_ELAPSED_HOURS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> hours ago
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_HOURS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_ELAPSED_HOURS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> hours ago
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_ELAPSED_HOURS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-
-      <message name="IDS_TIME_ELAPSED_DAYS_DEFAULT"
-               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
-        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> days ago
-      </message>
-
-      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message name="IDS_TIME_ELAPSED_DAY_SINGULAR"
-               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
-        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> day ago
-      </message>
-      </if>
-      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_DAY_SINGULAR"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ar', 'ro', 'lv']">
-      <message name="IDS_TIME_ELAPSED_DAYS_ZERO"
-               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
-        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> days ago
-      </message>
-      </if>
-      <if expr="lang not in ['ar', 'ro', 'lv']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_DAYS_ZERO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang in ['ga', 'sl', 'ar']">
-      <message name="IDS_TIME_ELAPSED_DAYS_TWO"
-               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
-        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> days ago
-      </message>
-      </if>
-      <if expr="lang not in ['ga', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_DAYS_TWO"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message name="IDS_TIME_ELAPSED_DAYS_FEW"
-               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
-        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> days ago
-      </message>
-      </if>
-      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
-      <message translateable="false" name="IDS_TIME_ELAPSED_DAYS_FEW"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <if expr="lang == 'ar'">
-      <message name="IDS_TIME_ELAPSED_DAYS_MANY"
-               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
-        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> days ago
-      </message>
-      </if>
-      <if expr="lang != 'ar'">
-      <message translateable="false" name="IDS_TIME_ELAPSED_DAYS_MANY"
-               desc="">
-        NA
-      </message>
-      </if>
-
-      <message name="IDS_PAST_TIME_TODAY" desc="Relative day today">
-        Today
-      </message>
-      <message name="IDS_PAST_TIME_YESTERDAY" desc="Relative day yesterday">
-        Yesterday
-      </message>
       <!-- Download Shelf-->
       <if expr="is_macosx">
         <message name="IDS_SHOW_ALL"
@@ -7495,14 +6431,6 @@
       <message name="IDS_FLAGS_ENABLE_DEVICE_MOTION_DESCRIPTION" desc="Description for the flag to enable device motion.">
         Enables device motion DOM events in JavaScript.
       </message>
-      <if expr="is_android">
-        <message name="IDS_FLAGS_ENABLE_CAST_NAME" desc="Name of the flag to enable Google Cast support.">
-          Enable Google Cast support
-        </message>
-        <message name="IDS_FLAGS_ENABLE_CAST_DESCRIPTION" desc="Description for the flag to enable playing videos remotely on Google Cast receivers.">
-          Enable playing videos remotely on Google Cast receivers.
-        </message>
-      </if>
 
       <!-- Crashes -->
       <message name="IDS_CRASHES_TITLE" desc="Title for the chrome://crashes page.">
@@ -8520,7 +7448,7 @@
 
       <!-- Managed User Avatar Menu -->
       <message name="IDS_MANAGED_USER_INFO" desc="Text which explains that a supervised user is managed by a custodian.">
-        This user is supervised by <ph name="CUSTODIAN_NAME">$1<ex>Jane Doe</ex></ph>. Usage and history from this user may be viewed by the manager.
+        This user is supervised by <ph name="CUSTODIAN_EMAIL">$1<ex>Jane.Doe@gmail.com</ex></ph>. Usage and history from this user can be reviewed by the manager on chrome.com.
       </message>
       <message name="IDS_MANAGED_USER_AVATAR_LABEL" desc="A label for the supervised user which is used in the avatar menu and as a label in the titlebar.">
         Supervised user
diff --git a/chrome/app/policy/policy_templates.json b/chrome/app/policy/policy_templates.json
index 1cc9245..10ad804 100644
--- a/chrome/app/policy/policy_templates.json
+++ b/chrome/app/policy/policy_templates.json
@@ -117,7 +117,7 @@
 #   persistent IDs for all fields (but not for groups!) are needed. These are
 #   specified by the 'id' keys of each policy. NEVER CHANGE EXISTING IDs,
 #   because doing so would break the deployed wire format!
-#   For your editing convenience: highest ID currently used: 235
+#   For your editing convenience: highest ID currently used: 236
 #
 # Placeholders:
 #   The following placeholder strings are automatically substituted:
@@ -4065,6 +4065,20 @@
       The format of the value follows the names of timezones in the "IANA Time Zone Database" (see "http://en.wikipedia.org/wiki/List_of_tz_database_time"). In particular, most timezones can be referred to by "continent/large_city" or "ocean/large_city".''',
     },
     {
+      'name': 'SystemUse24HourClock',
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome_os:30-'],
+      'device_only': True,
+      'features': {
+        'dynamic_refresh': True,
+      },
+      'example_value': True,
+      'id': 236,
+      'caption': '''Use 24 hour clock by default''',
+      'desc': '''Specifies the clock format be used for the device. Users can override clock format for the current session. However, on logout it is set back to the specified value. If an empty string is provided, device owner preference is used.''',
+    },
+    {
       'name': 'ShowLogoutButtonInTray',
       'type': 'main',
       'schema': { 'type': 'boolean' },
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index e23918a..cffd974 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1606,22 +1606,6 @@
     SINGLE_VALUE_TYPE(switches::kDisableAppList)
   },
 #endif
-  {
-    "enable-device-motion",
-    IDS_FLAGS_ENABLE_DEVICE_MOTION_NAME,
-    IDS_FLAGS_ENABLE_DEVICE_MOTION_DESCRIPTION,
-    kOsAndroid,
-    SINGLE_VALUE_TYPE(switches::kEnableDeviceMotion)
-  },
-#if defined(OS_ANDROID)
-  {
-    "enable-cast",
-    IDS_FLAGS_ENABLE_CAST_NAME,
-    IDS_FLAGS_ENABLE_CAST_DESCRIPTION,
-    kOsAndroid,
-    SINGLE_VALUE_TYPE(switches::kEnableCast)
-  },
-#endif
 };
 
 const Experiment* experiments = kExperiments;
diff --git a/chrome/browser/android/provider/chrome_browser_provider.cc b/chrome/browser/android/provider/chrome_browser_provider.cc
index 8944515..563f46a 100644
--- a/chrome/browser/android/provider/chrome_browser_provider.cc
+++ b/chrome/browser/android/provider/chrome_browser_provider.cc
@@ -1040,7 +1040,7 @@
     RemoveSearchTermsFromAPITask(AndroidHistoryProviderService* service,
                                  CancelableRequestConsumer* cancelable_consumer,
                                  Profile* profile)
-        : SearchTermTask(service, cancelable_consumer, profile) {}
+        : SearchTermTask(service, cancelable_consumer, profile), result_() {}
 
   int Run(const std::string& selection,
           const std::vector<string16>& selection_args) {
diff --git a/chrome/browser/autocomplete/zero_suggest_provider.cc b/chrome/browser/autocomplete/zero_suggest_provider.cc
index bd850a6..2369385 100644
--- a/chrome/browser/autocomplete/zero_suggest_provider.cc
+++ b/chrome/browser/autocomplete/zero_suggest_provider.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/autocomplete/history_url_provider.h"
 #include "chrome/browser/autocomplete/search_provider.h"
 #include "chrome/browser/autocomplete/url_prefix.h"
+#include "chrome/browser/google/google_util.h"
 #include "chrome/browser/metrics/variations/variations_http_header_provider.h"
 #include "chrome/browser/omnibox/omnibox_field_trial.h"
 #include "chrome/browser/profiles/profile.h"
@@ -186,12 +187,7 @@
 }
 
 bool ZeroSuggestProvider::ShouldRunZeroSuggest(const GURL& url) const {
-  if (!url.is_valid())
-    return false;
-
-  // Do not query non-http URLs. There will be no useful suggestions for https
-  // or chrome URLs.
-  if (url.scheme() != chrome::kHttpScheme)
+  if (!ShouldSendURL(url))
     return false;
 
   // Don't run if there's no profile or in incognito mode.
@@ -217,6 +213,18 @@
   return true;
 }
 
+bool ZeroSuggestProvider::ShouldSendURL(const GURL& url) const {
+  if (!url.is_valid())
+    return false;
+
+  // Only allow HTTP URLs or Google HTTPS URLs (including Google search
+  // result pages).  For the latter case, Google was already sent the HTTPS
+  // URLs when requesting the page, so the information is just re-sent.
+  return (url.scheme() == chrome::kHttpScheme) ||
+      google_util::IsGoogleDomainUrl(url, google_util::ALLOW_SUBDOMAIN,
+                                     google_util::ALLOW_NON_STANDARD_PORTS);
+}
+
 void ZeroSuggestProvider::FillResults(
     const Value& root_val,
     int* verbatim_relevance,
diff --git a/chrome/browser/autocomplete/zero_suggest_provider.h b/chrome/browser/autocomplete/zero_suggest_provider.h
index c53c9ee..f6fafa5 100644
--- a/chrome/browser/autocomplete/zero_suggest_provider.h
+++ b/chrome/browser/autocomplete/zero_suggest_provider.h
@@ -86,6 +86,10 @@
 
   bool ShouldRunZeroSuggest(const GURL& url) const;
 
+  // Whether the URL can get Zero Suggest.  For example, don't send the URL of
+  // non-Google HTTPS requests because it may contain sensitive information.
+  bool ShouldSendURL(const GURL& url) const;
+
   // The 4 functions below (that take classes defined in SearchProvider as
   // arguments) were copied and trimmed from SearchProvider.
   // TODO(hfung): Refactor them into a new base class common to both
diff --git a/chrome/browser/autofill/form_structure_browsertest.cc b/chrome/browser/autofill/form_structure_browsertest.cc
index aa8f085..c497275 100644
--- a/chrome/browser/autofill/form_structure_browsertest.cc
+++ b/chrome/browser/autofill/form_structure_browsertest.cc
@@ -90,8 +90,7 @@
             (*iter)->begin();
          field_iter != (*iter)->end();
          ++field_iter) {
-      forms_string +=
-          AutofillType::FieldTypeToString((*field_iter)->Type().server_type());
+      forms_string += (*field_iter)->Type().ToString();
       forms_string += " | " + UTF16ToUTF8((*field_iter)->name);
       forms_string += " | " + UTF16ToUTF8((*field_iter)->label);
       forms_string += " | " + UTF16ToUTF8((*field_iter)->value);
diff --git a/chrome/browser/browser_about_handler.cc b/chrome/browser/browser_about_handler.cc
index 4471269..83e9fbe 100644
--- a/chrome/browser/browser_about_handler.cc
+++ b/chrome/browser/browser_about_handler.cc
@@ -86,8 +86,6 @@
 }
 
 bool HandleNonNavigationAboutURL(const GURL& url) {
-  std::string host(url.host());
-
   // chrome://ipc/ is currently buggy, so we disable it for official builds.
 #if !defined(OFFICIAL_BUILD)
 
diff --git a/chrome/browser/browser_keyevents_browsertest.cc b/chrome/browser/browser_keyevents_browsertest.cc
index 51ca592..ee1bbc5 100644
--- a/chrome/browser/browser_keyevents_browsertest.cc
+++ b/chrome/browser/browser_keyevents_browsertest.cc
@@ -405,8 +405,9 @@
 
 #if defined(OS_WIN) || defined(OS_LINUX)
 
-#if defined(OS_LINUX)
-// http://crbug.com/129235
+#if defined(OS_LINUX) || (defined(OS_WIN) && defined(USE_AURA))
+// Linux: http://crbug.com/129235
+// Win Aura: crbug.com/269564
 #define MAYBE_CtrlKeyEvents DISABLED_CtrlKeyEvents
 #else
 #define MAYBE_CtrlKeyEvents CtrlKeyEvents
diff --git a/chrome/browser/browsing_data/browsing_data_local_storage_helper.cc b/chrome/browser/browsing_data/browsing_data_local_storage_helper.cc
index ea9d7f7..b906a79 100644
--- a/chrome/browser/browsing_data/browsing_data_local_storage_helper.cc
+++ b/chrome/browser/browsing_data/browsing_data_local_storage_helper.cc
@@ -9,8 +9,8 @@
 #include "chrome/browser/browsing_data/browsing_data_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/local_storage_usage_info.h"
 #include "content/public/browser/storage_partition.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
 using content::BrowserContext;
 using content::BrowserThread;
@@ -53,12 +53,12 @@
 }
 
 void BrowsingDataLocalStorageHelper::GetUsageInfoCallback(
-    const std::vector<dom_storage::LocalStorageUsageInfo>& infos) {
+    const std::vector<content::LocalStorageUsageInfo>& infos) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
   for (size_t i = 0; i < infos.size(); ++i) {
     // Non-websafe state is not considered browsing data.
-    const dom_storage::LocalStorageUsageInfo& info = infos[i];
+    const content::LocalStorageUsageInfo& info = infos[i];
     if (BrowsingDataHelper::HasWebScheme(info.origin)) {
       local_storage_info_.push_back(
           LocalStorageInfo(info.origin, info.data_size, info.last_modified));
diff --git a/chrome/browser/browsing_data/browsing_data_local_storage_helper.h b/chrome/browser/browsing_data/browsing_data_local_storage_helper.h
index 80c55fd..ba67f59 100644
--- a/chrome/browser/browsing_data/browsing_data_local_storage_helper.h
+++ b/chrome/browser/browsing_data/browsing_data_local_storage_helper.h
@@ -62,7 +62,7 @@
 
  private:
   void GetUsageInfoCallback(
-      const std::vector<dom_storage::LocalStorageUsageInfo>& infos);
+      const std::vector<content::LocalStorageUsageInfo>& infos);
 
   DISALLOW_COPY_AND_ASSIGN(BrowsingDataLocalStorageHelper);
 };
diff --git a/chrome/browser/browsing_data/browsing_data_remover.cc b/chrome/browser/browsing_data/browsing_data_remover.cc
index fb6403c..008d5cf 100644
--- a/chrome/browser/browsing_data/browsing_data_remover.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover.cc
@@ -50,8 +50,10 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/dom_storage_context.h"
 #include "content/public/browser/download_manager.h"
+#include "content/public/browser/local_storage_usage_info.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/plugin_data_remover.h"
+#include "content/public/browser/session_storage_usage_info.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/browser/user_metrics.h"
 #include "net/base/net_errors.h"
@@ -65,7 +67,6 @@
 #include "net/url_request/url_request_context_getter.h"
 #include "webkit/browser/quota/quota_manager.h"
 #include "webkit/browser/quota/special_storage_policy.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 #include "webkit/common/quota/quota_types.h"
 
 using content::BrowserContext;
@@ -896,7 +897,7 @@
 }
 
 void BrowsingDataRemover::OnGotLocalStorageUsageInfo(
-    const std::vector<dom_storage::LocalStorageUsageInfo>& infos) {
+    const std::vector<content::LocalStorageUsageInfo>& infos) {
   DCHECK(waiting_for_clear_local_storage_);
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
@@ -924,7 +925,7 @@
 }
 
 void BrowsingDataRemover::OnGotSessionStorageUsageInfo(
-    const std::vector<dom_storage::SessionStorageUsageInfo>& infos) {
+    const std::vector<content::SessionStorageUsageInfo>& infos) {
   DCHECK(waiting_for_clear_session_storage_);
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
diff --git a/chrome/browser/browsing_data/browsing_data_remover.h b/chrome/browser/browsing_data/browsing_data_remover.h
index 502247f..af1b441 100644
--- a/chrome/browser/browsing_data/browsing_data_remover.h
+++ b/chrome/browser/browsing_data/browsing_data_remover.h
@@ -16,7 +16,6 @@
 #include "base/time/time.h"
 #include "chrome/browser/pepper_flash_settings_manager.h"
 #include "chrome/common/cancelable_task_tracker.h"
-#include "content/public/browser/dom_storage_context.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "url/gurl.h"
@@ -42,7 +41,8 @@
 class QuotaManager;
 }
 
-namespace dom_storage {
+namespace content {
+class DOMStorageContext;
 struct LocalStorageUsageInfo;
 struct SessionStorageUsageInfo;
 }
@@ -295,14 +295,14 @@
 
   // Callback to deal with the list gathered in ClearLocalStorageOnUIThread.
   void OnGotLocalStorageUsageInfo(
-      const std::vector<dom_storage::LocalStorageUsageInfo>& infos);
+      const std::vector<content::LocalStorageUsageInfo>& infos);
 
   // Invoked on the UI thread to delete session storage.
   void ClearSessionStorageOnUIThread();
 
   // Callback to deal with the list gathered in ClearSessionStorageOnUIThread.
   void OnGotSessionStorageUsageInfo(
-      const std::vector<dom_storage::SessionStorageUsageInfo>& infos);
+      const std::vector<content::SessionStorageUsageInfo>& infos);
 
   // Invoked on the IO thread to delete all storage types managed by the quota
   // system: AppCache, Databases, FileSystems.
diff --git a/chrome/browser/browsing_data/browsing_data_remover_unittest.cc b/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
index 174a2b5..3de958d 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
@@ -32,6 +32,7 @@
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/personal_data_manager_observer.h"
 #include "content/public/browser/dom_storage_context.h"
+#include "content/public/browser/local_storage_usage_info.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/test/test_browser_thread.h"
@@ -45,7 +46,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "webkit/browser/quota/mock_quota_manager.h"
 #include "webkit/browser/quota/quota_manager.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 #include "webkit/common/quota/quota_types.h"
 
 using content::BrowserThread;
@@ -284,8 +284,10 @@
                                    base::Time creation_time,
                                    base::Time expiration_time) {
     GetCertStore()->SetServerBoundCert(server_identifier,
-                                       net::CLIENT_CERT_RSA_SIGN, creation_time,
-                                       expiration_time, "a", "b");
+                                       creation_time,
+                                       expiration_time,
+                                       "a",
+                                       "b");
   }
 
   // Add a server bound cert for |server|, with the current time as the
@@ -520,7 +522,7 @@
                    base::Unretained(this)));
   }
   void OnGotLocalStorageUsage(
-      const std::vector<dom_storage::LocalStorageUsageInfo>& infos) {
+      const std::vector<content::LocalStorageUsageInfo>& infos) {
     infos_ = infos;
     await_completion_.Notify();
   }
@@ -529,7 +531,7 @@
   TestingProfile* profile_;
   content::DOMStorageContext* dom_storage_context_;
 
-  std::vector<dom_storage::LocalStorageUsageInfo> infos_;
+  std::vector<content::LocalStorageUsageInfo> infos_;
 
   AwaitCompletionHelper await_completion_;
 
diff --git a/chrome/browser/browsing_data/browsing_data_server_bound_cert_helper_unittest.cc b/chrome/browser/browsing_data/browsing_data_server_bound_cert_helper_unittest.cc
index 4a12c5a..a95405e 100644
--- a/chrome/browser/browsing_data/browsing_data_server_bound_cert_helper_unittest.cc
+++ b/chrome/browser/browsing_data/browsing_data_server_bound_cert_helper_unittest.cc
@@ -39,11 +39,9 @@
     net::ServerBoundCertStore* cert_store =
         context->server_bound_cert_service()->GetCertStore();
     cert_store->SetServerBoundCert("https://www.google.com:443",
-                                   net::CLIENT_CERT_RSA_SIGN,
                                    base::Time(), base::Time(),
                                    "key", "cert");
     cert_store->SetServerBoundCert("https://www.youtube.com:443",
-                                   net::CLIENT_CERT_RSA_SIGN,
                                    base::Time(), base::Time(),
                                    "key", "cert");
   }
@@ -131,34 +129,6 @@
   ASSERT_EQ(0UL, server_bound_cert_list_.size());
 }
 
-TEST_F(BrowsingDataServerBoundCertHelperTest, CannedUnique) {
-  std::string origin = "https://www.google.com:443";
-
-  scoped_refptr<CannedBrowsingDataServerBoundCertHelper> helper(
-      new CannedBrowsingDataServerBoundCertHelper());
-
-  ASSERT_TRUE(helper->empty());
-  helper->AddServerBoundCert(net::ServerBoundCertStore::ServerBoundCert(
-      origin, net::CLIENT_CERT_RSA_SIGN, base::Time(), base::Time(), "key",
-      "cert"));
-  helper->AddServerBoundCert(net::ServerBoundCertStore::ServerBoundCert(
-      origin, net::CLIENT_CERT_ECDSA_SIGN, base::Time(), base::Time(), "key",
-      "cert"));
-
-  helper->StartFetching(
-      base::Bind(&BrowsingDataServerBoundCertHelperTest::FetchCallback,
-                 base::Unretained(this)));
-  base::RunLoop().RunUntilIdle();
-
-  ASSERT_EQ(1UL, server_bound_cert_list_.size());
-  net::ServerBoundCertStore::ServerBoundCert& cert =
-      server_bound_cert_list_.front();
-
-  EXPECT_EQ("https://www.google.com:443", cert.server_identifier());
-  EXPECT_EQ(net::CLIENT_CERT_ECDSA_SIGN, cert.type());
-  EXPECT_EQ(0, ssl_config_changed_count_);
-}
-
 TEST_F(BrowsingDataServerBoundCertHelperTest, CannedEmpty) {
   std::string origin = "https://www.google.com";
 
@@ -167,8 +137,7 @@
 
   ASSERT_TRUE(helper->empty());
   helper->AddServerBoundCert(net::ServerBoundCertStore::ServerBoundCert(
-      origin, net::CLIENT_CERT_RSA_SIGN, base::Time(), base::Time(), "key",
-      "cert"));
+      origin, base::Time(), base::Time(), "key", "cert"));
   ASSERT_FALSE(helper->empty());
   helper->Reset();
   ASSERT_TRUE(helper->empty());
diff --git a/chrome/browser/browsing_data/mock_browsing_data_server_bound_cert_helper.cc b/chrome/browser/browsing_data/mock_browsing_data_server_bound_cert_helper.cc
index 6cb78ed..85a02b9 100644
--- a/chrome/browser/browsing_data/mock_browsing_data_server_bound_cert_helper.cc
+++ b/chrome/browser/browsing_data/mock_browsing_data_server_bound_cert_helper.cc
@@ -28,8 +28,7 @@
   DCHECK(server_bound_certs_.find(server_id) == server_bound_certs_.end());
   server_bound_cert_list_.push_back(
       net::ServerBoundCertStore::ServerBoundCert(
-          server_id, net::CLIENT_CERT_ECDSA_SIGN,
-          base::Time(), base::Time(), "key", "cert"));
+          server_id, base::Time(), base::Time(), "key", "cert"));
   server_bound_certs_[server_id] = true;
 }
 
diff --git a/chrome/browser/chrome_browser_field_trials_mobile.cc b/chrome/browser/chrome_browser_field_trials_mobile.cc
index 8d9140c..df95a80 100644
--- a/chrome/browser/chrome_browser_field_trials_mobile.cc
+++ b/chrome/browser/chrome_browser_field_trials_mobile.cc
@@ -16,16 +16,15 @@
 
 namespace {
 
-// Governs the rollout of the compression proxy for Chrome on mobile platforms.
-// Always enabled in DEV and BETA versions.
-// Stable percentage will be controlled from server.
-void DataCompressionProxyFieldTrial() {
-  const char kDataCompressionProxyFieldTrialName[] =
-      "DataCompressionProxyRollout";
-  const base::FieldTrial::Probability kDataCompressionProxyDivisor = 1000;
-
-  // 10/1000 = 1% for starters.
-  const base::FieldTrial::Probability kDataCompressionProxyStable = 10;
+// Base function used by all data reduction proxy field trials. A trial is
+// only conducted for installs that are in the "Enabled" group. They are always
+// enabled on DEV and BETA channels, and for STABLE, a percentage will be
+// controlled from the server. Until the percentage is learned from the server,
+// a client-side configuration is used.
+void DataCompressionProxyBaseFieldTrial(
+    const char* trial_name,
+    const base::FieldTrial::Probability enabled_group_probability,
+    const base::FieldTrial::Probability total_probability) {
   const char kEnabled[] = "Enabled";
   const char kDisabled[] = "Disabled";
 
@@ -36,20 +35,41 @@
   // Experiment enabled until Jan 1, 2015. By default, disabled.
   scoped_refptr<base::FieldTrial> trial(
       base::FieldTrialList::FactoryGetFieldTrial(
-          kDataCompressionProxyFieldTrialName, kDataCompressionProxyDivisor,
+          trial_name,
+          total_probability,
           kDisabled, 2015, 1, 1, base::FieldTrial::ONE_TIME_RANDOMIZED, NULL));
 
   // Non-stable channels will run with probability 1.
   const int kEnabledGroup = trial->AppendGroup(
       kEnabled,
-      kIsStableChannel ?
-          kDataCompressionProxyStable : kDataCompressionProxyDivisor);
+      kIsStableChannel ? enabled_group_probability : total_probability);
 
   const int v = trial->group();
-  VLOG(1) << "DataCompression proxy enabled group id: " << kEnabledGroup
+  VLOG(1) << trial_name <<  " enabled group id: " << kEnabledGroup
           << ". Selected group id: " << v;
 }
 
+void DataCompressionProxyFieldTrials() {
+  // Governs the rollout of the compression proxy for Chrome on mobile
+  // platforms. Always enabled in DEV and BETA channels. For STABLE, the
+  // percentage will be controlled from the server, and is configured to be
+  // 10% = 100 / 1000 until overridden by the server.
+  DataCompressionProxyBaseFieldTrial(
+      "DataCompressionProxyRollout", 100, 1000);
+
+  if (base::FieldTrialList::FindFullName(
+      "DataCompressionProxyRollout") == "Enabled") {
+
+    // Governs the rollout of the _promo_ for the compression proxy
+    // independently from the rollout of compression proxy. The enabled
+    // percentage is configured to be 100% = 1000 / 1000 until overridden by the
+    // server. When this trial is "Enabled," users get a promo, whereas
+    // otherwise, compression is enabled without a promo.
+    DataCompressionProxyBaseFieldTrial(
+        "DataCompressionProxyPromoVisibility", 1000, 1000);
+  }
+}
+
 void NewTabButtonInToolbarFieldTrial(const CommandLine& parsed_command_line) {
   // Do not enable this field trials for tablet devices.
   if (parsed_command_line.HasSwitch(switches::kTabletUI))
@@ -92,7 +112,7 @@
 void SetupMobileFieldTrials(const CommandLine& parsed_command_line,
                             const base::Time& install_time,
                             PrefService* local_state) {
-  DataCompressionProxyFieldTrial();
+  DataCompressionProxyFieldTrials();
 
 #if defined(OS_ANDROID)
   NewTabButtonInToolbarFieldTrial(parsed_command_line);
diff --git a/chrome/browser/chrome_notification_types.h b/chrome/browser/chrome_notification_types.h
index 326ba22..a4b5adc 100644
--- a/chrome/browser/chrome_notification_types.h
+++ b/chrome/browser/chrome_notification_types.h
@@ -66,12 +66,6 @@
   // (std::pair<std::string, std::string>).
   NOTIFICATION_PAGE_TRANSLATED,
 
-  // Sent after the renderer returns a snapshot of tab contents.
-  // The source (Source<content::WebContents>) is the RenderViewHost for which
-  // the snapshot was generated and the details (Details<const SkBitmap>) is
-  // the actual snapshot.
-  NOTIFICATION_TAB_SNAPSHOT_TAKEN,
-
   // The user has changed the browser theme. The source is a
   // Source<ThemeService>. There are no details.
   NOTIFICATION_BROWSER_THEME_CHANGED,
@@ -510,11 +504,6 @@
   // details about why the install failed.
   NOTIFICATION_EXTENSION_INSTALL_ERROR,
 
-  // Sent when an extension install is not allowed, as indicated by
-  // PendingExtensionInfo::ShouldAllowInstall. The details are an Extension,
-  // and the source is a Profile.
-  NOTIFICATION_EXTENSION_INSTALL_NOT_ALLOWED,
-
   // Sent when an extension has been uninstalled. The details are an Extension,
   // and the source is a Profile.
   NOTIFICATION_EXTENSION_UNINSTALLED,
@@ -564,13 +553,6 @@
   // Sent when a background page is ready so other components can load.
   NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY,
 
-  // Sent when a pop-up extension view is ready, so that notification may
-  // be sent to pending callbacks.  Note that this notification is sent
-  // after all onload callbacks have been invoked in the main frame.
-  // The details is the ExtensionHost* hosted within the popup, and the source
-  // is a Profile*.
-  NOTIFICATION_EXTENSION_POPUP_VIEW_READY,
-
   // Sent when a browser action's state has changed. The source is the
   // ExtensionAction* that changed.  The details are the Profile* that the
   // browser action belongs to.
@@ -798,10 +780,6 @@
   // details.
   NOTIFICATION_SYNC_CONFIGURE_DONE,
 
-  // The sync service has started the datatype configuration process. The source
-  // is the ProfileSyncService object of the Profile. There are no details.
-  NOTIFICATION_SYNC_CONFIGURE_START,
-
   // A service is requesting a sync datatype refresh for the current profile.
   // The details value is a const syncer::ModelTypeSet.
   // If the payload map is empty, it should be treated as an invalidation for
@@ -857,11 +835,6 @@
   // TokenRequestFailedDetails object.
   NOTIFICATION_TOKEN_REQUEST_FAILED,
 
-  // When a service has a new token they got from a frontend that the
-  // TokenService should know about, fire this notification. The source is the
-  // Profile. The details are a TokenAvailableDetails object.
-  NOTIFICATION_TOKEN_UPDATED,
-
   // Fired when the TokenService has had all of its tokens removed (such as due
   // to the user signing out). The source is the TokenService. There are no
   // details.
@@ -1024,12 +997,6 @@
   // Sent when the user list has changed.
   NOTIFICATION_USER_LIST_CHANGED,
 
-  // Sent when a panel state changed.
-  NOTIFICATION_PANEL_STATE_CHANGED,
-
-  // Sent when the window manager's layout mode has changed.
-  NOTIFICATION_LAYOUT_MODE_CHANGED,
-
   // Sent when the screen lock state has changed. The source is
   // ScreenLocker and the details is a bool specifing that the
   // screen is locked. When details is a false, the source object
diff --git a/chrome/browser/chromeos/drive/file_system.h b/chrome/browser/chromeos/drive/file_system.h
index ebead43..5bb1ca8 100644
--- a/chrome/browser/chromeos/drive/file_system.h
+++ b/chrome/browser/chromeos/drive/file_system.h
@@ -20,14 +20,13 @@
 class PrefService;
 
 namespace base {
-struct PlatformFileInfo;
 class SequencedTaskRunner;
-}
+}  // namespace base
 
 namespace google_apis {
 class AboutResource;
 class ResourceEntry;
-}
+}  // namespace google_apis
 
 namespace drive {
 
@@ -166,12 +165,10 @@
   virtual void OnLoadFromServerComplete() OVERRIDE;
   virtual void OnInitialLoadComplete() OVERRIDE;
 
-  // Used in tests to update the file system using the change list loader.
-  internal::ChangeListLoader* change_list_loader() {
+  // Used by tests.
+  internal::ChangeListLoader* change_list_loader_for_testing() {
     return change_list_loader_.get();
   }
-
-  // Used by tests.
   internal::SyncClient* sync_client_for_testing() { return sync_client_.get(); }
 
  private:
diff --git a/chrome/browser/chromeos/drive/file_system/open_file_operation.cc b/chrome/browser/chromeos/drive/file_system/open_file_operation.cc
index 7743c06..25d6348 100644
--- a/chrome/browser/chromeos/drive/file_system/open_file_operation.cc
+++ b/chrome/browser/chromeos/drive/file_system/open_file_operation.cc
@@ -22,19 +22,6 @@
 
 namespace drive {
 namespace file_system {
-namespace {
-
-FileError UpdateFileLocalState(internal::FileCache* cache,
-                               const std::string& resource_id,
-                               base::FilePath* local_file_path) {
-  FileError error = cache->MarkDirty(resource_id);
-  if (error != FILE_ERROR_OK)
-    return error;
-
-  return cache->GetFile(resource_id, local_file_path);
-}
-
-}  // namespace
 
 OpenFileOperation::OpenFileOperation(
     base::SequencedTaskRunner* blocking_task_runner,
@@ -130,27 +117,23 @@
     return;
   }
 
-  // Note: after marking the file dirty, the local file path may be changed.
-  // So, it is necessary to take the path again.
-  base::FilePath* new_local_file_path = new base::FilePath;
   base::PostTaskAndReplyWithResult(
       blocking_task_runner_.get(),
       FROM_HERE,
-      base::Bind(&UpdateFileLocalState,
-                 cache_,
-                 entry->resource_id(),
-                 new_local_file_path),
-      base::Bind(&OpenFileOperation::OpenFileAfterUpdateLocalState,
+      base::Bind(&internal::FileCache::MarkDirty,
+                 base::Unretained(cache_),
+                 entry->resource_id()),
+      base::Bind(&OpenFileOperation::OpenFileAfterMarkDirty,
                  weak_ptr_factory_.GetWeakPtr(),
+                 local_file_path,
                  entry->resource_id(),
-                 callback,
-                 base::Owned(new_local_file_path)));
+                 callback));
 }
 
-void OpenFileOperation::OpenFileAfterUpdateLocalState(
+void OpenFileOperation::OpenFileAfterMarkDirty(
+    const base::FilePath& local_file_path,
     const std::string& resource_id,
     const OpenFileCallback& callback,
-    const base::FilePath* local_file_path,
     FileError error) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
   DCHECK(!callback.is_null());
@@ -161,7 +144,7 @@
   }
 
   ++open_files_[resource_id];
-  callback.Run(error, *local_file_path,
+  callback.Run(error, local_file_path,
                base::Bind(&OpenFileOperation::CloseFile,
                           weak_ptr_factory_.GetWeakPtr(), resource_id));
 }
diff --git a/chrome/browser/chromeos/drive/file_system/open_file_operation.h b/chrome/browser/chromeos/drive/file_system/open_file_operation.h
index f656d2f..7055eea 100644
--- a/chrome/browser/chromeos/drive/file_system/open_file_operation.h
+++ b/chrome/browser/chromeos/drive/file_system/open_file_operation.h
@@ -67,11 +67,11 @@
                                    const base::FilePath& local_file_path,
                                    scoped_ptr<ResourceEntry> entry);
 
-  // Part of OpenFile(). Called after the updating of the local state.
-  void OpenFileAfterUpdateLocalState(const std::string& resource_id,
-                                     const OpenFileCallback& callback,
-                                     const base::FilePath* local_file_path,
-                                     FileError error);
+  // Part of OpenFile(). Called after marking the cache file dirty.
+  void OpenFileAfterMarkDirty(const base::FilePath& local_file_path,
+                              const std::string& resource_id,
+                              const OpenFileCallback& callback,
+                              FileError error);
 
   // Closes the file with |resource_id|.
   void CloseFile(const std::string& resource_id);
diff --git a/chrome/browser/chromeos/drive/file_system_interface.h b/chrome/browser/chromeos/drive/file_system_interface.h
index 5a554c9..1c5865e 100644
--- a/chrome/browser/chromeos/drive/file_system_interface.h
+++ b/chrome/browser/chromeos/drive/file_system_interface.h
@@ -150,7 +150,7 @@
   ContextType type;
 };
 
-// Option enum to control eligible entries for searchMetadata().
+// Option enum to control eligible entries for SearchMetadata().
 // SEARCH_METADATA_ALL is the default to investigate all the entries.
 // SEARCH_METADATA_EXCLUDE_HOSTED_DOCUMENTS excludes the hosted documents.
 // SEARCH_METADATA_EXCLUDE_DIRECTORIES excludes the directories from the result.
diff --git a/chrome/browser/chromeos/drive/file_system_unittest.cc b/chrome/browser/chromeos/drive/file_system_unittest.cc
index 2f3baf3..0f0ca56 100644
--- a/chrome/browser/chromeos/drive/file_system_unittest.cc
+++ b/chrome/browser/chromeos/drive/file_system_unittest.cc
@@ -149,7 +149,7 @@
   // Loads the full resource list via FakeDriveService.
   bool LoadFullResourceList() {
     FileError error = FILE_ERROR_FAILED;
-    file_system_->change_list_loader()->LoadIfNeeded(
+    file_system_->change_list_loader_for_testing()->LoadIfNeeded(
         DirectoryFetchInfo(),
         google_apis::test_util::CreateCopyResultCallback(&error));
     test_util::RunBlockingPoolTask();
diff --git a/chrome/browser/chromeos/drive/job_scheduler.cc b/chrome/browser/chromeos/drive/job_scheduler.cc
index aec04a4..d9c0d61 100644
--- a/chrome/browser/chromeos/drive/job_scheduler.cc
+++ b/chrome/browser/chromeos/drive/job_scheduler.cc
@@ -119,6 +119,7 @@
     DriveServiceInterface* drive_service,
     base::SequencedTaskRunner* blocking_task_runner)
     : throttle_count_(0),
+      wait_until_(base::Time::Now()),
       disable_throttling_(false),
       drive_service_(drive_service),
       uploader_(new DriveUploader(drive_service, blocking_task_runner)),
@@ -718,6 +719,18 @@
     }
   }
 
+  // Wait when throttled.
+  const base::Time now = base::Time::Now();
+  if (now < wait_until_) {
+    base::MessageLoopProxy::current()->PostDelayedTask(
+        FROM_HERE,
+        base::Bind(&JobScheduler::DoJobLoop,
+                   weak_ptr_factory_.GetWeakPtr(),
+                   queue_type),
+        wait_until_ - now);
+    return;
+  }
+
   // Run the job with the highest priority in the queue.
   JobID job_id = -1;
   if (!queue_[queue_type]->PopForRun(accepted_priority, &job_id))
@@ -728,11 +741,13 @@
 
   JobInfo* job_info = &entry->job_info;
   job_info->state = STATE_RUNNING;
-  job_info->start_time = base::Time::Now();
+  job_info->start_time = now;
   NotifyJobUpdated(*job_info);
 
   entry->cancel_callback = entry->task.Run();
 
+  UpdateWait();
+
   util::Log(logging::LOG_INFO,
             "Job started: %s - %s",
             job_info->ToString().c_str(),
@@ -764,42 +779,19 @@
   return BACKGROUND;
 }
 
-void JobScheduler::ThrottleAndContinueJobLoop(QueueType queue_type) {
+void JobScheduler::UpdateWait() {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
-  if (throttle_count_ < kMaxThrottleCount)
-    throttle_count_++;
+  if (disable_throttling_ || throttle_count_ == 0)
+    return;
 
-  base::TimeDelta delay;
-  if (disable_throttling_) {
-    delay = base::TimeDelta::FromSeconds(0);
-  } else {
-    // Exponential backoff: https://developers.google.com/drive/handle-errors.
-    delay =
+  // Exponential backoff: https://developers.google.com/drive/handle-errors.
+  base::TimeDelta delay =
       base::TimeDelta::FromSeconds(1 << (throttle_count_ - 1)) +
       base::TimeDelta::FromMilliseconds(base::RandInt(0, 1000));
-  }
   VLOG(1) << "Throttling for " << delay.InMillisecondsF();
 
-  const bool posted = base::MessageLoopProxy::current()->PostDelayedTask(
-      FROM_HERE,
-      base::Bind(&JobScheduler::DoJobLoop,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 queue_type),
-      delay);
-  DCHECK(posted);
-}
-
-void JobScheduler::ResetThrottleAndContinueJobLoop(QueueType queue_type) {
-  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
-  // Post a task to continue the job loop.  This allows us to finish handling
-  // the current job before starting the next one.
-  throttle_count_ = 0;
-  base::MessageLoopProxy::current()->PostTask(FROM_HERE,
-      base::Bind(&JobScheduler::DoJobLoop,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 queue_type));
+  wait_until_ = std::max(wait_until_, base::Time::Now() + delay);
 }
 
 bool JobScheduler::OnJobDone(JobID job_id, google_apis::GDataErrorCode error) {
@@ -821,9 +813,20 @@
             GetQueueInfo(queue_type).c_str());
 
   // Retry, depending on the error.
-  if ((error == google_apis::HTTP_SERVICE_UNAVAILABLE ||
-      error == google_apis::HTTP_INTERNAL_SERVER_ERROR) &&
-      job_entry->retry_count < kMaxRetryCount) {
+  const bool is_server_error =
+      error == google_apis::HTTP_SERVICE_UNAVAILABLE ||
+      error == google_apis::HTTP_INTERNAL_SERVER_ERROR;
+  if (is_server_error) {
+    if (throttle_count_ < kMaxThrottleCount)
+      ++throttle_count_;
+    UpdateWait();
+  } else {
+    throttle_count_ = 0;
+  }
+
+  const bool should_retry =
+      is_server_error && job_entry->retry_count < kMaxRetryCount;
+  if (should_retry) {
     job_entry->cancel_callback.Reset();
     job_info->state = STATE_RETRY;
     NotifyJobUpdated(*job_info);
@@ -832,18 +835,20 @@
 
     // Requeue the job.
     QueueJob(job_id);
-
-    ThrottleAndContinueJobLoop(queue_type);
-    return false;
   } else {
     NotifyJobDone(*job_info, error);
     // The job has finished, no retry will happen in the scheduler. Now we can
     // remove the job info from the map.
     job_map_.Remove(job_id);
-
-    ResetThrottleAndContinueJobLoop(queue_type);
-    return true;
   }
+
+  // Post a task to continue the job loop.  This allows us to finish handling
+  // the current job before starting the next one.
+  base::MessageLoopProxy::current()->PostTask(FROM_HERE,
+      base::Bind(&JobScheduler::DoJobLoop,
+                 weak_ptr_factory_.GetWeakPtr(),
+                 queue_type));
+  return !should_retry;
 }
 
 void JobScheduler::OnGetResourceListJobDone(
diff --git a/chrome/browser/chromeos/drive/job_scheduler.h b/chrome/browser/chromeos/drive/job_scheduler.h
index 059a5ae..acd51ae 100644
--- a/chrome/browser/chromeos/drive/job_scheduler.h
+++ b/chrome/browser/chromeos/drive/job_scheduler.h
@@ -244,12 +244,8 @@
   // currently allowed to start for the |queue_type|.
   int GetCurrentAcceptedPriority(QueueType queue_type);
 
-  // Increases the throttle delay if it's below the maximum value, and posts a
-  // task to continue the loop after the delay.
-  void ThrottleAndContinueJobLoop(QueueType queue_type);
-
-  // Resets the throttle delay to the initial value, and continues the job loop.
-  void ResetThrottleAndContinueJobLoop(QueueType queue_type);
+  // Updates |wait_until_| to throttle requests.
+  void UpdateWait();
 
   // Retries the job if needed and returns false. Otherwise returns true.
   bool OnJobDone(JobID job_id, google_apis::GDataErrorCode error);
@@ -352,6 +348,9 @@
   // next task.
   int throttle_count_;
 
+  // Jobs should not start running until this time. Used for throttling.
+  base::Time wait_until_;
+
   // Disables throttling for testing.
   bool disable_throttling_;
 
diff --git a/chrome/browser/chromeos/drive/logging.cc b/chrome/browser/chromeos/drive/logging.cc
index 40c205a..b939c46 100644
--- a/chrome/browser/chromeos/drive/logging.cc
+++ b/chrome/browser/chromeos/drive/logging.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/chromeos/drive/logging.h"
 
 #include <stdarg.h>   // va_list
+#include <string>
 
 #include "base/lazy_instance.h"
 #include "base/strings/stringprintf.h"
diff --git a/chrome/browser/chromeos/drive/logging.h b/chrome/browser/chromeos/drive/logging.h
index 1e6964d..473478a 100644
--- a/chrome/browser/chromeos/drive/logging.h
+++ b/chrome/browser/chromeos/drive/logging.h
@@ -5,7 +5,6 @@
 #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_LOGGING_H_
 #define CHROME_BROWSER_CHROMEOS_DRIVE_LOGGING_H_
 
-#include <string>
 #include <vector>
 
 #include "chrome/browser/drive/event_logger.h"
diff --git a/chrome/browser/chromeos/extensions/OWNERS b/chrome/browser/chromeos/extensions/OWNERS
index 6a5847e..6571aa3 100644
--- a/chrome/browser/chromeos/extensions/OWNERS
+++ b/chrome/browser/chromeos/extensions/OWNERS
@@ -5,6 +5,7 @@
 jyasskin@chromium.org
 kalman@chromium.org
 koz@chromium.org
+mek@chromium.org
 miket@chromium.org
 mpcomplete@chromium.org
 yoz@chromium.org
diff --git a/chrome/browser/chromeos/extensions/external_cache.cc b/chrome/browser/chromeos/extensions/external_cache.cc
index cee8544..86c0f19 100644
--- a/chrome/browser/chromeos/extensions/external_cache.cc
+++ b/chrome/browser/chromeos/extensions/external_cache.cc
@@ -61,7 +61,7 @@
   for (base::DictionaryValue::Iterator it(*cached_extensions_.get());
        !it.IsAtEnd(); it.Advance()) {
     const base::DictionaryValue* entry = NULL;
-    if (it.value().GetAsDictionary(&entry)) {
+    if (!it.value().GetAsDictionary(&entry)) {
       NOTREACHED() << "ExternalCache found bad entry with type "
                    << it.value().GetType();
       continue;
diff --git a/chrome/browser/chromeos/extensions/file_manager/event_router.cc b/chrome/browser/chromeos/extensions/file_manager/event_router.cc
index b65bda2..58296be 100644
--- a/chrome/browser/chromeos/extensions/file_manager/event_router.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/event_router.cc
@@ -171,9 +171,12 @@
   result->SetString("transferState", job_status);
   result->SetString("transferType",
                     IsUploadJob(job_info.job_type) ? "upload" : "download");
-  result->SetInteger("processed",
-                     static_cast<int>(job_info.num_completed_bytes));
-  result->SetInteger("total", static_cast<int>(job_info.num_total_bytes));
+  // JavaScript does not have 64-bit integers. Instead we use double, which
+  // is in IEEE 754 formant and accurate up to 52-bits in JS, and in practice
+  // in C++. Larger values are rounded.
+  result->SetDouble("processed",
+                    static_cast<double>(job_info.num_completed_bytes));
+  result->SetDouble("total", static_cast<double>(job_info.num_total_bytes));
   return result.Pass();
 }
 
@@ -220,10 +223,6 @@
       profile_(profile),
       weak_factory_(this) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
-  file_watcher_callback_ =
-      base::Bind(&EventRouter::HandleFileWatchNotification,
-                 weak_factory_.GetWeakPtr());
 }
 
 EventRouter::~EventRouter() {
@@ -321,20 +320,31 @@
   DCHECK(!callback.is_null());
 
   base::FilePath watch_path = local_path;
-  bool is_remote_watch = false;
+  bool is_on_drive = drive::util::IsUnderDriveMountPoint(watch_path);
   // Tweak watch path for remote sources - we need to drop leading /special
   // directory from there in order to be able to pair these events with
   // their change notifications.
-  if (drive::util::IsUnderDriveMountPoint(watch_path)) {
+  if (is_on_drive)
     watch_path = drive::util::ExtractDrivePath(watch_path);
-    is_remote_watch = true;
-  }
 
   WatcherMap::iterator iter = file_watchers_.find(watch_path);
   if (iter == file_watchers_.end()) {
-    scoped_ptr<FileWatcher> watcher(
-        new FileWatcher(virtual_path, extension_id, is_remote_watch));
-    watcher->Watch(watch_path, file_watcher_callback_, callback);
+    scoped_ptr<FileWatcher> watcher(new FileWatcher(virtual_path));
+    watcher->AddExtension(extension_id);
+
+    if (is_on_drive) {
+      // For Drive, file watching is done via OnDirectoryChanged().
+      base::MessageLoopProxy::current()->PostTask(FROM_HERE,
+                                                  base::Bind(callback, true));
+    } else {
+      // For local files, start watching using FileWatcher.
+      watcher->WatchLocalFile(
+          watch_path,
+          base::Bind(&EventRouter::HandleFileWatchNotification,
+                     weak_factory_.GetWeakPtr()),
+          callback);
+    }
+
     file_watchers_[watch_path] = watcher.release();
   } else {
     iter->second->AddExtension(extension_id);
@@ -357,9 +367,9 @@
   WatcherMap::iterator iter = file_watchers_.find(watch_path);
   if (iter == file_watchers_.end())
     return;
-  // Remove the renderer process for this watch.
+  // Remove the watcher if |watch_path| is no longer watched by any extensions.
   iter->second->RemoveExtension(extension_id);
-  if (iter->second->ref_count() == 0) {
+  if (iter->second->GetExtensionIds().empty()) {
     delete iter->second;
     file_watchers_.erase(iter);
   }
@@ -637,22 +647,23 @@
     return;
   }
   DispatchDirectoryChangeEvent(iter->second->virtual_path(), got_error,
-                               iter->second->extensions());
+                               iter->second->GetExtensionIds());
 }
 
 void EventRouter::DispatchDirectoryChangeEvent(
     const base::FilePath& virtual_path,
     bool got_error,
-    const FileWatcher::ExtensionUsageRegistry& extensions) {
+    const std::vector<std::string>& extension_ids) {
   if (!profile_) {
     NOTREACHED();
     return;
   }
 
-  for (FileWatcher::ExtensionUsageRegistry::const_iterator iter =
-           extensions.begin(); iter != extensions.end(); ++iter) {
+  for (size_t i = 0; i < extension_ids.size(); ++i) {
+    const std::string& extension_id = extension_ids[i];
+
     GURL target_origin_url(extensions::Extension::GetBaseURLFromExtensionId(
-        iter->first));
+        extension_id));
     GURL base_url = fileapi::GetFileSystemRootURI(
         target_origin_url,
         fileapi::kFileSystemTypeExternal);
@@ -671,7 +682,7 @@
     scoped_ptr<extensions::Event> event(new extensions::Event(
         extensions::event_names::kOnDirectoryChanged, args.Pass()));
     extensions::ExtensionSystem::Get(profile_)->event_router()->
-        DispatchEventToExtension(iter->first, event.Pass());
+        DispatchEventToExtension(extension_id, event.Pass());
   }
 }
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/event_router.h b/chrome/browser/chromeos/extensions/file_manager/event_router.h
index 24b6ca9..e10e30b 100644
--- a/chrome/browser/chromeos/extensions/file_manager/event_router.h
+++ b/chrome/browser/chromeos/extensions/file_manager/event_router.h
@@ -126,7 +126,7 @@
   void DispatchDirectoryChangeEvent(
       const base::FilePath& path,
       bool error,
-      const FileWatcher::ExtensionUsageRegistry& extensions);
+      const std::vector<std::string>& extension_ids);
 
   void DispatchMountEvent(
       chromeos::disks::DiskMountManager::MountEvent event,
@@ -156,7 +156,6 @@
   std::map<drive::JobID, DriveJobInfoWithStatus> drive_jobs_;
   base::Time last_file_transfer_event_;
 
-  base::FilePathWatcher::Callback file_watcher_callback_;
   WatcherMap file_watchers_;
   scoped_ptr<DesktopNotifications> notifications_;
   scoped_ptr<PrefChangeRegistrar> pref_change_registrar_;
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc
index 1b00fc5..e2b428f 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc
@@ -142,7 +142,7 @@
   // Reacts to the user action reported by the dialog and notifies |function_|
   // about file selection result (by calling |OnFilePathSelected()|).
   // The |this| object is self destruct after the function is notified.
-  // |success| indicates whether user has selectd the file.
+  // |success| indicates whether user has selected the file.
   // |selected_path| is path that was selected. It is empty if the file wasn't
   // selected.
   void SendResponse(bool success, const base::FilePath& selected_path);
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc
index 8608786..7dae077 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc
@@ -188,11 +188,11 @@
   // will be needed.
   static ExtensionFunction* TestSelectFileFunctionFactory() {
     EXPECT_TRUE(test_cases_);
-    EXPECT_TRUE(current_test_case_ < test_cases_->size());
+    EXPECT_TRUE(!test_cases_ || current_test_case_ < test_cases_->size());
 
     // If this happens, test failed. But, we still don't want to crash, so
     // return valid extension function.
-    if (!test_cases_ && current_test_case_ >= test_cases_->size())
+    if (!test_cases_ || current_test_case_ >= test_cases_->size())
       return new FileBrowserHandlerInternalSelectFileFunction();
 
     // Create file creator factory for the current test case.
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_browser_private_api.cc b/chrome/browser/chromeos/extensions/file_manager/file_browser_private_api.cc
index af196ba..6a39f9e 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_browser_private_api.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_browser_private_api.cc
@@ -45,7 +45,7 @@
   registry->RegisterFunction<SelectFileFunction>();
   registry->RegisterFunction<SelectFilesFunction>();
 
-  // Mount points releated functions.
+  // Mount points related functions.
   registry->RegisterFunction<AddMountFunction>();
   registry->RegisterFunction<RemoveMountFunction>();
   registry->RegisterFunction<GetMountPointsFunction>();
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_manager_util.cc b/chrome/browser/chromeos/extensions/file_manager/file_manager_util.cc
index 8db2c2f..e38c55b 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_manager_util.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_manager_util.cc
@@ -270,7 +270,7 @@
   return true;
 }
 
-// Executes handler specifed with |extension_id| and |action_id| for |url|.
+// Executes handler specified with |extension_id| and |action_id| for |url|.
 void ExecuteHandler(Profile* profile,
                     std::string extension_id,
                     std::string action_id,
@@ -314,7 +314,7 @@
     return;
 
   // Some values of |action_id| are not listed in the manifest and are used
-  // to parametrize the behavior when opening the Files app window.
+  // to parameterize the behavior when opening the Files app window.
   ExecuteHandler(profile, kFileBrowserDomain, action_id, url,
                  file_tasks::kTaskFile);
 }
@@ -414,7 +414,7 @@
                      file_tasks::kTaskFile);
       return true;
     }
-    return ExecuteBuiltinHandler(browser, path, action_id);
+    return ExecuteBuiltinHandler(browser, path);
   }
 
   ExecuteHandler(profile, extension_id, action_id, url,
@@ -755,8 +755,7 @@
   OpenFileBrowserImpl(path, "select");
 }
 
-bool ExecuteBuiltinHandler(Browser* browser, const base::FilePath& path,
-    const std::string& internal_task_id) {
+bool ExecuteBuiltinHandler(Browser* browser, const base::FilePath& path) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
   Profile* profile = browser->profile();
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_manager_util.h b/chrome/browser/chromeos/extensions/file_manager/file_manager_util.h
index 579091f..0932ed2 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_manager_util.h
+++ b/chrome/browser/chromeos/extensions/file_manager/file_manager_util.h
@@ -79,12 +79,9 @@
 // Opens file browser on the folder containing the file, with the file selected.
 void ShowFileInFolder(const base::FilePath& path);
 
-// Executes the built-in File Manager handler or tries to open |file| directly
+// Executes the built-in File Manager handler or tries to open |path| directly
 // in the browser. Returns false if neither is possible.
-bool ExecuteBuiltinHandler(
-    Browser* browser,
-    const base::FilePath& path,
-    const std::string& internal_task_id);
+bool ExecuteBuiltinHandler(Browser* browser, const base::FilePath& path);
 
 // Checks whether a pepper plugin for |file_extension| is enabled.
 bool ShouldBeOpenedWithPlugin(Profile* profile, const char* file_extension);
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_tasks.cc b/chrome/browser/chromeos/extensions/file_manager/file_tasks.cc
index 64a1214..609cf4c 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_tasks.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_tasks.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/extensions/file_manager/file_tasks.h"
 
+#include "apps/launcher.h"
 #include "base/bind.h"
 #include "base/file_util.h"
 #include "base/i18n/case_conversion.h"
@@ -20,7 +21,6 @@
 #include "chrome/browser/extensions/extension_system.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/lazy_background_task_queue.h"
-#include "chrome/browser/extensions/platform_app_launcher.h"
 #include "chrome/browser/prefs/scoped_user_pref_update.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -559,7 +559,7 @@
     return true;
   } else if (task_type == kTaskApp) {
     for (size_t i = 0; i != file_urls.size(); ++i) {
-      extensions::LaunchPlatformAppWithFileHandler(
+      apps::LaunchPlatformAppWithFileHandler(
           profile, extension, action_id, file_urls[i].path());
     }
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_watcher.cc b/chrome/browser/chromeos/extensions/file_manager/file_watcher.cc
index 29bfc71..6f72071 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_watcher.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_watcher.cc
@@ -31,17 +31,11 @@
 
 }  // namespace
 
-FileWatcher::FileWatcher(const base::FilePath& virtual_path,
-                         const std::string& extension_id,
-                         bool is_remote_file_system)
+FileWatcher::FileWatcher(const base::FilePath& virtual_path)
     : local_file_watcher_(NULL),
       virtual_path_(virtual_path),
-      ref_count_(0),
-      is_remote_file_system_(is_remote_file_system),
       weak_ptr_factory_(this) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
-  AddExtension(extension_id);
 }
 
 FileWatcher::~FileWatcher() {
@@ -56,28 +50,36 @@
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
   extensions_[extension_id]++;
-  ref_count_++;
 }
 
 void FileWatcher::RemoveExtension(const std::string& extension_id) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
-  ExtensionUsageRegistry::iterator it = extensions_.find(extension_id);
+  ExtensionCountMap::iterator it = extensions_.find(extension_id);
   if (it == extensions_.end()) {
     LOG(ERROR) << " Extension [" << extension_id
-               << "] tries to unsubscribe from folder [" << local_path_.value()
+               << "] tries to unsubscribe from folder ["
+               << virtual_path_.value()
                << "] it isn't subscribed";
     return;
   }
 
   // If entry found - decrease it's count and remove if necessary
-  if (it->second-- == 0)
+  --it->second;
+  if (it->second == 0)
     extensions_.erase(it);
-
-  ref_count_--;
 }
 
-void FileWatcher::Watch(
+std::vector<std::string> FileWatcher::GetExtensionIds() const {
+  std::vector<std::string> extension_ids;
+  for (ExtensionCountMap::const_iterator iter = extensions_.begin();
+       iter != extensions_.end(); ++iter) {
+    extension_ids.push_back(iter->first);
+  }
+  return extension_ids;
+}
+
+void FileWatcher::WatchLocalFile(
     const base::FilePath& local_path,
     const base::FilePathWatcher::Callback& file_watcher_callback,
     const BoolCallback& callback) {
@@ -85,14 +87,6 @@
   DCHECK(!callback.is_null());
   DCHECK(!local_file_watcher_);
 
-  local_path_ = local_path;  // For error message in RemoveExtension().
-
-  if (is_remote_file_system_) {
-    base::MessageLoopProxy::current()->PostTask(FROM_HERE,
-                                                base::Bind(callback, true));
-    return;
-  }
-
   BrowserThread::PostTaskAndReplyWithResult(
       BrowserThread::FILE,
       FROM_HERE,
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_watcher.h b/chrome/browser/chromeos/extensions/file_manager/file_watcher.h
index 1106347..2849fb1 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_watcher.h
+++ b/chrome/browser/chromeos/extensions/file_manager/file_watcher.h
@@ -26,14 +26,10 @@
 // files is handled differently in EventRouter.
 class FileWatcher {
  public:
-  typedef std::map<std::string, int> ExtensionUsageRegistry;
   typedef base::Callback<void(bool success)> BoolCallback;
 
-  // AddExtension() is internally called for |extension_id|.
-  // TODO(satorux): Remove |extension_id| and stop calling AddExtension().
-  FileWatcher(const base::FilePath& virtual_path,
-              const std::string& extension_id,
-              bool is_remote_file_system);
+  // Creates a FileWatcher associated with the virtual path.
+  explicit FileWatcher(const base::FilePath& virtual_path);
 
   ~FileWatcher();
 
@@ -51,31 +47,22 @@
   // comment at AddExtension() for details.
   void RemoveExtension(const std::string& extension_id);
 
-  // Returns IDs of the extensions watching virtual_path.
-  // TODO(satorux): Should just return a list of extension IDs rather than a
-  // map.
-  const ExtensionUsageRegistry& extensions() const { return extensions_; }
+  // Returns IDs of the extensions watching virtual_path. The returned list
+  // is sorted in the alphabetical order and contains no duplicates.
+  std::vector<std::string> GetExtensionIds() const;
 
-  // Returns 0 when no extensions are watching the virtual path.
-  // TODO(satorux): Should be replaced with extensions().empty().
-  int ref_count() const { return ref_count_; }
-
-  // Returns the path being watched.
+  // Returns the virtual path associated with the FileWatcher.
   const base::FilePath& virtual_path() const { return virtual_path_; }
 
-  // Starts watching |local_path|. For a local file, a base::FilePathWatcher
-  // will be created and |file_watcher_callback| will be called when changes
-  // are notified.
-  //
-  // For a remote file, this function actually does nothing but
-  // runs |callback| with true. See also the class comment.
-  // TODO(satorux): This function shouldn't be called for remote files.
+  // Starts watching a local file at |local_path|. |file_watcher_callback|
+  // will be called when changes are notified.
   //
   // |callback| will be called with true, if the file watch is started
   // successfully, or false if failed. |callback| must not be null.
-  void Watch(const base::FilePath& local_path,
-             const base::FilePathWatcher::Callback& file_watcher_callback,
-             const BoolCallback& callback);
+  void WatchLocalFile(
+      const base::FilePath& local_path,
+      const base::FilePathWatcher::Callback& file_watcher_callback,
+      const BoolCallback& callback);
 
  private:
   // Called when a FilePathWatcher is created and started.
@@ -84,11 +71,11 @@
                         base::FilePathWatcher* file_path_watcher);
 
   base::FilePathWatcher* local_file_watcher_;
-  base::FilePath local_path_;
   base::FilePath virtual_path_;
-  ExtensionUsageRegistry extensions_;
-  int ref_count_;
-  bool is_remote_file_system_;
+  // Map of extension-id to counter. See the comment at AddExtension() for
+  // why we need to count.
+  typedef std::map<std::string, int> ExtensionCountMap;
+  ExtensionCountMap extensions_;
 
   // Note: This should remain the last member so it'll be destroyed and
   // invalidate the weak pointers before any other members are destroyed.
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_watcher_unittest.cc b/chrome/browser/chromeos/extensions/file_manager/file_watcher_unittest.cc
new file mode 100644
index 0000000..6e96f66
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/file_manager/file_watcher_unittest.cc
@@ -0,0 +1,157 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/extensions/file_manager/file_watcher.h"
+
+#include "base/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "chrome/browser/google_apis/test_util.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace file_manager {
+namespace {
+
+using google_apis::test_util::CreateQuitCallback;
+using google_apis::test_util::CreateCopyResultCallback;
+
+class FileManagerFileWatcherTest : public testing::Test {
+ public:
+  // Use IO_MAINLOOP so FilePathWatcher works in the fake FILE thread, which
+  // is actually shared with the main thread.
+  FileManagerFileWatcherTest()
+      : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
+  }
+
+ private:
+  content::TestBrowserThreadBundle thread_bundle_;
+};
+
+TEST_F(FileManagerFileWatcherTest, AddAndRemoveOneExtensionId) {
+  const base::FilePath kVirtualPath =
+      base::FilePath::FromUTF8Unsafe("foo/bar.txt");
+  const char kExtensionId[] = "extension-id";
+
+  FileWatcher file_watcher(kVirtualPath);
+  file_watcher.AddExtension(kExtensionId);
+  std::vector<std::string> extension_ids = file_watcher.GetExtensionIds();
+
+  ASSERT_EQ(1U, extension_ids.size());
+  ASSERT_EQ(kExtensionId, extension_ids[0]);
+
+  file_watcher.RemoveExtension(kExtensionId);
+  extension_ids = file_watcher.GetExtensionIds();
+  ASSERT_EQ(0U, extension_ids.size());
+}
+
+TEST_F(FileManagerFileWatcherTest, AddAndRemoveMultipleExtensionIds) {
+  const base::FilePath kVirtualPath =
+      base::FilePath::FromUTF8Unsafe("foo/bar.txt");
+  const char kExtensionFooId[] = "extension-foo-id";
+  const char kExtensionBarId[] = "extension-bar-id";
+
+  FileWatcher file_watcher(kVirtualPath);
+  file_watcher.AddExtension(kExtensionFooId);
+  file_watcher.AddExtension(kExtensionBarId);
+  std::vector<std::string> extension_ids = file_watcher.GetExtensionIds();
+
+  // The list should be sorted.
+  ASSERT_EQ(2U, extension_ids.size());
+  ASSERT_EQ(kExtensionBarId, extension_ids[0]);
+  ASSERT_EQ(kExtensionFooId, extension_ids[1]);
+
+  // Remove Foo. Bar should remain.
+  file_watcher.RemoveExtension(kExtensionFooId);
+  extension_ids = file_watcher.GetExtensionIds();
+  ASSERT_EQ(1U, extension_ids.size());
+  ASSERT_EQ(kExtensionBarId, extension_ids[0]);
+
+  // Remove Bar. Nothing should remain.
+  file_watcher.RemoveExtension(kExtensionBarId);
+  extension_ids = file_watcher.GetExtensionIds();
+  ASSERT_EQ(0U, extension_ids.size());
+}
+
+TEST_F(FileManagerFileWatcherTest, AddSameExtensionMultipleTimes) {
+  const base::FilePath kVirtualPath =
+      base::FilePath::FromUTF8Unsafe("foo/bar.txt");
+  const char kExtensionId[] = "extension-id";
+
+  FileWatcher file_watcher(kVirtualPath);
+  // Add three times.
+  file_watcher.AddExtension(kExtensionId);
+  file_watcher.AddExtension(kExtensionId);
+  file_watcher.AddExtension(kExtensionId);
+
+  std::vector<std::string> extension_ids = file_watcher.GetExtensionIds();
+  ASSERT_EQ(1U, extension_ids.size());
+  ASSERT_EQ(kExtensionId, extension_ids[0]);
+
+  // Remove 1st time.
+  file_watcher.RemoveExtension(kExtensionId);
+  extension_ids = file_watcher.GetExtensionIds();
+  ASSERT_EQ(1U, extension_ids.size());
+
+  // Remove 2nd time.
+  file_watcher.RemoveExtension(kExtensionId);
+  extension_ids = file_watcher.GetExtensionIds();
+  ASSERT_EQ(1U, extension_ids.size());
+
+  // Remove 3rd time. The extension ID should be gone now.
+  file_watcher.RemoveExtension(kExtensionId);
+  extension_ids = file_watcher.GetExtensionIds();
+  ASSERT_EQ(0U, extension_ids.size());
+}
+
+TEST_F(FileManagerFileWatcherTest, WatchLocalFile) {
+  const base::FilePath kVirtualPath =
+      base::FilePath::FromUTF8Unsafe("foo/bar.txt");
+  const char kExtensionId[] = "extension-id";
+
+  // Create a temporary directory.
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  // See the comment at the end of this function for why scoped_ptr is used.
+  scoped_ptr<FileWatcher> file_watcher(
+      new FileWatcher(kVirtualPath));
+  file_watcher->AddExtension(kExtensionId);
+
+  // Start watching changes in the temporary directory.
+  base::FilePath changed_path;
+  bool watcher_created = false;
+  bool on_change_error = false;
+  base::RunLoop run_loop;
+  file_watcher->WatchLocalFile(
+      temp_dir.path(),
+      CreateQuitCallback(
+          &run_loop,
+          CreateCopyResultCallback(&changed_path, &on_change_error)),
+      CreateCopyResultCallback(&watcher_created));
+  // Spin the message loop so the base::FilePathWatcher is created.
+  base::RunLoop().RunUntilIdle();
+  ASSERT_TRUE(watcher_created);
+
+  // Create a temporary file in the temporary directory. The file watcher
+  // should detect the change in the directory.
+  base::FilePath temp_file_path;
+  ASSERT_TRUE(file_util::CreateTemporaryFileInDir(temp_dir.path(),
+                                                  &temp_file_path));
+  // Wait until the directory change is notified.
+  run_loop.Run();
+  ASSERT_FALSE(on_change_error);
+  ASSERT_EQ(temp_dir.path().value(), changed_path.value());
+
+  // This is ugly, but FileWatcher should be deleted explicitly here, and
+  // spin the message loop so the base::FilePathWatcher is deleted.
+  // Otherwise, base::FilePathWatcher may detect a change when the temporary
+  // directory is deleted, which may result in crash.
+  file_watcher.reset();
+  base::RunLoop().RunUntilIdle();
+}
+
+}  // namespace
+}  // namespace file_manager.
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc
index cb5380d..e257dce 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc
@@ -621,9 +621,6 @@
   args_->GetList(0, &path_list);
   DCHECK(path_list);
 
-  std::string internal_task_id;
-  args_->GetString(1, &internal_task_id);
-
   std::vector<base::FilePath> files;
   for (size_t i = 0; i < path_list->GetSize(); ++i) {
     std::string url_as_string;
@@ -641,8 +638,7 @@
 
   if (browser) {
     for (size_t i = 0; i < files.size(); ++i) {
-      bool handled = util::ExecuteBuiltinHandler(
-          browser, files[i], internal_task_id);
+      bool handled = util::ExecuteBuiltinHandler(browser, files[i]);
       if (!handled && files.size() == 1)
         success = false;
     }
diff --git a/chrome/browser/chromeos/input_method/keyboard_browsertest.cc b/chrome/browser/chromeos/input_method/keyboard_browsertest.cc
index 21c41b9..fb3579d 100644
--- a/chrome/browser/chromeos/input_method/keyboard_browsertest.cc
+++ b/chrome/browser/chromeos/input_method/keyboard_browsertest.cc
@@ -13,7 +13,9 @@
 
 typedef TextInputTestBase KeyboardEventEndToEndTest;
 
-IN_PROC_BROWSER_TEST_F(KeyboardEventEndToEndTest, AltGrToCtrlAltKeyDown) {
+// Flaky test: 268049
+IN_PROC_BROWSER_TEST_F(KeyboardEventEndToEndTest,
+                       DISABLED_AltGrToCtrlAltKeyDown) {
   TextInputTestHelper helper;
 
   GURL url = ui_test_utils::GetTestUrl(
diff --git a/chrome/browser/chromeos/login/chrome_restart_request.cc b/chrome/browser/chromeos/login/chrome_restart_request.cc
index d7fef07..94bd1b5 100644
--- a/chrome/browser/chromeos/login/chrome_restart_request.cc
+++ b/chrome/browser/chromeos/login/chrome_restart_request.cc
@@ -95,7 +95,6 @@
       ::switches::kEnableBrowserInputController,
       ::switches::kEnableCompositingForFixedPosition,
       ::switches::kEnableDelegatedRenderer,
-      ::switches::kEnableEncodedScreenCapture,
       ::switches::kEnableEncryptedMedia,
       ::switches::kEnableGestureTapHighlight,
       ::switches::kDisableGestureTapHighlight,
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client.cc b/chrome/browser/chromeos/policy/auto_enrollment_client.cc
index 6e49d1b..197417d 100644
--- a/chrome/browser/chromeos/policy/auto_enrollment_client.cc
+++ b/chrome/browser/chromeos/policy/auto_enrollment_client.cc
@@ -94,11 +94,15 @@
       device_management_service_(service),
       local_state_(local_state) {
   DCHECK_LE(power_initial_, power_limit_);
+  DCHECK(!completion_callback_.is_null());
   if (!serial_number.empty())
     serial_number_hash_ = crypto::SHA256HashString(serial_number);
+  net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
 }
 
-AutoEnrollmentClient::~AutoEnrollmentClient() {}
+AutoEnrollmentClient::~AutoEnrollmentClient() {
+  net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
+}
 
 // static
 void AutoEnrollmentClient::RegisterPrefs(PrefRegistrySimple* registry) {
@@ -165,7 +169,7 @@
   if (GetCachedDecision()) {
     VLOG(1) << "AutoEnrollmentClient: using cached decision: "
             << should_auto_enroll_;
-  } else if (device_management_service_.get()) {
+  } else if (device_management_service_) {
     if (serial_number_hash_.empty()) {
       LOG(ERROR) << "Failed to get the hash of the serial number, "
                  << "will not attempt to auto-enroll.";
@@ -194,6 +198,25 @@
   }
 }
 
+void AutoEnrollmentClient::OnNetworkChanged(
+    net::NetworkChangeNotifier::ConnectionType type) {
+  if (GetCachedDecision()) {
+    // A previous request already obtained a definitive response from the
+    // server, so there is no point in retrying; it will get the same decision.
+    return;
+  }
+
+  if (type != net::NetworkChangeNotifier::CONNECTION_NONE &&
+      !completion_callback_.is_null() &&
+      !request_job_ &&
+      device_management_service_ &&
+      !serial_number_hash_.empty()) {
+    VLOG(1) << "Retrying auto enrollment check after network changed";
+    time_start_ = base::Time::Now();
+    SendRequest(power_initial_);
+  }
+}
+
 bool AutoEnrollmentClient::GetCachedDecision() {
   const PrefService::Preference* should_enroll_pref =
       local_state_->FindPreference(prefs::kShouldAutoEnroll);
@@ -219,7 +242,7 @@
 void AutoEnrollmentClient::SendRequest(int power) {
   if (power < 0 || power > power_limit_ || serial_number_hash_.empty()) {
     NOTREACHED();
-    OnProtocolDone();
+    OnRequestDone();
     return;
   }
 
@@ -255,7 +278,8 @@
     UMA_HISTOGRAM_SPARSE_SLOWLY(kUMARequestStatus, status);
     if (status == DM_STATUS_REQUEST_FAILED)
       UMA_HISTOGRAM_SPARSE_SLOWLY(kUMANetworkErrorCode, -net_error);
-    OnProtocolDone();
+    // The client will retry if a network change is detected.
+    OnRequestDone();
     return;
   }
 
@@ -285,8 +309,10 @@
                      << power << ") that isn't larger than the first used ("
                      << power_initial_ << "). Retrying anyway.";
       }
+      // Remember this value, so that eventual retries start with the correct
+      // modulus.
+      power_initial_ = power;
       SendRequest(power);
-      // Don't invoke the callback yet.
       return;
     }
   } else {
@@ -327,15 +353,10 @@
   if (!time_start_.is_null()) {
     base::TimeDelta delta = now - time_start_;
     UMA_HISTOGRAM_CUSTOM_TIMES(kUMAProtocolTime, delta, kMin, kMax, kBuckets);
-    time_start_ = base::Time();
   }
   base::TimeDelta delta = kZero;
-  if (!time_extra_start_.is_null()) {
-    // CancelAndDeleteSoon() was invoked before.
+  if (!time_extra_start_.is_null())
     delta = now - time_extra_start_;
-    base::MessageLoopProxy::current()->DeleteSoon(FROM_HERE, this);
-    time_extra_start_ = base::Time();
-  }
   // This samples |kZero| when there was no need for extra time, so that we can
   // measure the ratio of users that succeeded without needing a delay to the
   // total users going through OOBE.
@@ -343,6 +364,18 @@
 
   if (!completion_callback_.is_null())
     completion_callback_.Run();
+
+  OnRequestDone();
+}
+
+void AutoEnrollmentClient::OnRequestDone() {
+  request_job_.reset();
+  time_start_ = base::Time();
+
+  if (completion_callback_.is_null()) {
+    // CancelAndDeleteSoon() was invoked before.
+    base::MessageLoopProxy::current()->DeleteSoon(FROM_HERE, this);
+  }
 }
 
 }  // namespace policy
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client.h b/chrome/browser/chromeos/policy/auto_enrollment_client.h
index 95c22ef..921dc0d 100644
--- a/chrome/browser/chromeos/policy/auto_enrollment_client.h
+++ b/chrome/browser/chromeos/policy/auto_enrollment_client.h
@@ -13,6 +13,7 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/time/time.h"
 #include "chrome/browser/policy/cloud/cloud_policy_constants.h"
+#include "net/base/network_change_notifier.h"
 #include "third_party/protobuf/src/google/protobuf/repeated_field.h"
 
 class PrefRegistrySimple;
@@ -30,7 +31,8 @@
 // Interacts with the device management service and determines whether this
 // machine should automatically enter the Enterprise Enrollment screen during
 // OOBE.
-class AutoEnrollmentClient {
+class AutoEnrollmentClient
+    : public net::NetworkChangeNotifier::NetworkChangeObserver {
  public:
   // |completion_callback| will be invoked on completion of the protocol, after
   // Start() is invoked.
@@ -79,6 +81,10 @@
   // It can be reused for subsequent requests to the device management service.
   std::string device_id() const { return device_id_; }
 
+  // Implementation of net::NetworkChangeNotifier::NetworkChangeObserver:
+  virtual void OnNetworkChanged(
+      net::NetworkChangeNotifier::ConnectionType type) OVERRIDE;
+
  private:
   // Tries to load the result of a previous execution of the protocol from
   // local state. Returns true if that decision has been made and is valid.
@@ -103,6 +109,10 @@
   // some UMA metrics.
   void OnProtocolDone();
 
+  // Invoked when a request job completes. Resets the internal state, and
+  // deletes the client if necessary.
+  void OnRequestDone();
+
   // Callback to invoke when the protocol completes.
   base::Closure completion_callback_;
 
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client_unittest.cc b/chrome/browser/chromeos/policy/auto_enrollment_client_unittest.cc
index cfd609e..18554fa 100644
--- a/chrome/browser/chromeos/policy/auto_enrollment_client_unittest.cc
+++ b/chrome/browser/chromeos/policy/auto_enrollment_client_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/message_loop/message_loop.h"
 #include "base/prefs/pref_service.h"
 #include "base/prefs/testing_pref_service.h"
 #include "base/values.h"
@@ -14,6 +15,7 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
+#include "content/public/test/test_browser_thread_bundle.h"
 #include "crypto/sha2.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -99,6 +101,12 @@
         .WillOnce(service_->SucceedJob(response));
   }
 
+  void ServerWillReplyAsync(MockDeviceManagementJob** job) {
+    EXPECT_CALL(*service_,
+                CreateJob(DeviceManagementRequestJob::TYPE_AUTO_ENROLLMENT))
+        .WillOnce(service_->CreateAsyncJob(job));
+  }
+
   bool HasCachedDecision() {
     return local_state_->GetUserPref(prefs::kShouldAutoEnroll);
   }
@@ -118,6 +126,7 @@
     return last_request_.auto_enrollment_request();
   }
 
+  content::TestBrowserThreadBundle browser_threads_;
   ScopedTestingLocalState scoped_testing_local_state_;
   TestingPrefServiceSimple* local_state_;
   MockDeviceManagementService* service_;
@@ -133,7 +142,7 @@
   ServerWillFail(DM_STATUS_TEMPORARY_UNAVAILABLE);
   client_->Start();
   EXPECT_FALSE(client_->should_auto_enroll());
-  EXPECT_EQ(1, completion_callback_count_);
+  EXPECT_EQ(0, completion_callback_count_);
   EXPECT_FALSE(HasCachedDecision());
 }
 
@@ -164,7 +173,7 @@
   ServerWillFail(DM_STATUS_TEMPORARY_UNAVAILABLE);
   client_->Start();
   EXPECT_FALSE(client_->should_auto_enroll());
-  EXPECT_EQ(1, completion_callback_count_);
+  EXPECT_EQ(0, completion_callback_count_);
   EXPECT_FALSE(HasCachedDecision());
 }
 
@@ -236,6 +245,11 @@
   EXPECT_FALSE(client_->should_auto_enroll());
   EXPECT_EQ(1, completion_callback_count_);
   VerifyCachedResult(false, 8);
+
+  // Network changes don't trigger retries after obtaining a response from
+  // the server.
+  client_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  EXPECT_EQ(1, completion_callback_count_);
 }
 
 TEST_F(AutoEnrollmentClientTest, EnterpriseDevice) {
@@ -244,6 +258,11 @@
   EXPECT_TRUE(client_->should_auto_enroll());
   EXPECT_EQ(1, completion_callback_count_);
   VerifyCachedResult(true, 8);
+
+  // Network changes don't trigger retries after obtaining a response from
+  // the server.
+  client_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  EXPECT_EQ(1, completion_callback_count_);
 }
 
 TEST_F(AutoEnrollmentClientTest, NoSerial) {
@@ -323,6 +342,112 @@
   EXPECT_EQ(1, completion_callback_count_);
 }
 
+TEST_F(AutoEnrollmentClientTest, NetworkChangeRetryAfterErrors) {
+  ServerWillFail(DM_STATUS_TEMPORARY_UNAVAILABLE);
+  client_->Start();
+  EXPECT_FALSE(client_->should_auto_enroll());
+  // Don't invoke the callback if there was a network failure.
+  EXPECT_EQ(0, completion_callback_count_);
+  EXPECT_FALSE(HasCachedDecision());
+
+  // The client doesn't retry if no new connection became available.
+  client_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_NONE);
+  EXPECT_FALSE(client_->should_auto_enroll());
+  EXPECT_EQ(0, completion_callback_count_);
+  EXPECT_FALSE(HasCachedDecision());
+
+  // Retry once the network is back.
+  ServerWillReply(-1, true, true);
+  client_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  EXPECT_TRUE(client_->should_auto_enroll());
+  EXPECT_EQ(1, completion_callback_count_);
+  EXPECT_TRUE(HasCachedDecision());
+
+  // Subsequent network changes don't trigger retries.
+  client_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_NONE);
+  client_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  EXPECT_TRUE(client_->should_auto_enroll());
+  EXPECT_EQ(1, completion_callback_count_);
+  EXPECT_TRUE(HasCachedDecision());
+}
+
+TEST_F(AutoEnrollmentClientTest, CancelAndDeleteSoonWithPendingRequest) {
+  MockDeviceManagementJob* job = NULL;
+  ServerWillReplyAsync(&job);
+  EXPECT_FALSE(job);
+  client_->Start();
+  ASSERT_TRUE(job);
+  EXPECT_EQ(0, completion_callback_count_);
+
+  // Cancel while a request is in flight.
+  EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
+  client_.release()->CancelAndDeleteSoon();
+  EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
+
+  // The client cleans itself up once a reply is received.
+  job->SendResponse(DM_STATUS_TEMPORARY_UNAVAILABLE,
+                    em::DeviceManagementResponse());
+  // The DeleteSoon task has been posted:
+  EXPECT_FALSE(base::MessageLoop::current()->IsIdleForTesting());
+  EXPECT_EQ(0, completion_callback_count_);
+}
+
+TEST_F(AutoEnrollmentClientTest, NetworkChangedAfterCancelAndDeleteSoon) {
+  MockDeviceManagementJob* job = NULL;
+  ServerWillReplyAsync(&job);
+  EXPECT_FALSE(job);
+  client_->Start();
+  ASSERT_TRUE(job);
+  EXPECT_EQ(0, completion_callback_count_);
+
+  // Cancel while a request is in flight.
+  EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
+  AutoEnrollmentClient* client = client_.release();
+  client->CancelAndDeleteSoon();
+  EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
+
+  // Network change events are ignored while a request is pending.
+  client->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  EXPECT_EQ(0, completion_callback_count_);
+
+  // The client cleans itself up once a reply is received.
+  job->SendResponse(DM_STATUS_TEMPORARY_UNAVAILABLE,
+                    em::DeviceManagementResponse());
+  // The DeleteSoon task has been posted:
+  EXPECT_FALSE(base::MessageLoop::current()->IsIdleForTesting());
+  EXPECT_EQ(0, completion_callback_count_);
+
+  // Network changes that have been posted before are also ignored:
+  client->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  EXPECT_EQ(0, completion_callback_count_);
+}
+
+TEST_F(AutoEnrollmentClientTest, CancelAndDeleteSoonAfterCompletion) {
+  ServerWillReply(-1, true, true);
+  client_->Start();
+  EXPECT_EQ(1, completion_callback_count_);
+  EXPECT_TRUE(client_->should_auto_enroll());
+
+  // The client will delete itself immediately if there are no pending
+  // requests.
+  EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
+  client_.release()->CancelAndDeleteSoon();
+  EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
+}
+
+TEST_F(AutoEnrollmentClientTest, CancelAndDeleteSoonAfterNetworkFailure) {
+  ServerWillFail(DM_STATUS_TEMPORARY_UNAVAILABLE);
+  client_->Start();
+  EXPECT_EQ(0, completion_callback_count_);
+  EXPECT_FALSE(client_->should_auto_enroll());
+
+  // The client will delete itself immediately if there are no pending
+  // requests.
+  EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
+  client_.release()->CancelAndDeleteSoon();
+  EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
+}
+
 }  // namespace
 
 }  // namespace policy
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
index 237d66a..a0438e0 100644
--- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -569,6 +569,17 @@
     }
   }
 
+  if (policy.has_use_24hour_clock()) {
+    if (policy.use_24hour_clock().has_use_24hour_clock()) {
+      policies->Set(key::kSystemUse24HourClock,
+                    POLICY_LEVEL_MANDATORY,
+                    POLICY_SCOPE_MACHINE,
+                    Value::CreateBooleanValue(
+                        policy.use_24hour_clock().use_24hour_clock()),
+                    NULL);
+    }
+  }
+
   if (policy.has_allow_redeem_offers()) {
     const em::AllowRedeemChromeOsRegistrationOffersProto& container(
         policy.allow_redeem_offers());
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc
index 279a3ea..bc82310 100644
--- a/chrome/browser/chromeos/preferences.cc
+++ b/chrome/browser/chromeos/preferences.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/chromeos/system/input_device_settings.h"
 #include "chrome/browser/chromeos/system/statistics_provider.h"
 #include "chrome/browser/download/download_util.h"
+#include "chrome/browser/feedback/tracing_manager.h"
 #include "chrome/browser/prefs/pref_service_syncable.h"
 #include "chrome/browser/prefs/scoped_user_pref_update.h"
 #include "chrome/common/chrome_switches.h"
@@ -96,6 +97,11 @@
   }
 
   registry->RegisterBooleanPref(
+      prefs::kPerformanceTracingEnabled,
+      false,
+      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+
+  registry->RegisterBooleanPref(
       prefs::kTapToClickEnabled,
       true,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
@@ -356,6 +362,8 @@
   BooleanPrefMember::NamedChangeCallback callback =
       base::Bind(&Preferences::OnPreferenceChanged, base::Unretained(this));
 
+  performance_tracing_enabled_.Init(prefs::kPerformanceTracingEnabled,
+                                    prefs, callback);
   tap_to_click_enabled_.Init(prefs::kTapToClickEnabled, prefs, callback);
   tap_dragging_enabled_.Init(prefs::kTapDraggingEnabled, prefs, callback);
   three_finger_click_enabled_.Init(prefs::kEnableTouchpadThreeFingerClick,
@@ -480,6 +488,13 @@
 }
 
 void Preferences::NotifyPrefChanged(const std::string* pref_name) {
+  if (!pref_name || *pref_name == prefs::kPerformanceTracingEnabled) {
+    const bool enabled = performance_tracing_enabled_.GetValue();
+    if (enabled)
+      tracing_manager_ = TracingManager::Create();
+    else
+      tracing_manager_.reset();
+  }
   if (!pref_name || *pref_name == prefs::kTapToClickEnabled) {
     const bool enabled = tap_to_click_enabled_.GetValue();
     system::touchpad_settings::SetTapToClick(enabled);
diff --git a/chrome/browser/chromeos/preferences.h b/chrome/browser/chromeos/preferences.h
index 9fb6c78..9c98650 100644
--- a/chrome/browser/chromeos/preferences.h
+++ b/chrome/browser/chromeos/preferences.h
@@ -18,6 +18,8 @@
 class PrefService;
 class PrefServiceSyncable;
 
+class TracingManager;
+
 namespace user_prefs {
 class PrefRegistrySyncable;
 }
@@ -114,7 +116,9 @@
   PrefServiceSyncable* prefs_;
 
   input_method::InputMethodManager* input_method_manager_;
+  scoped_ptr<TracingManager> tracing_manager_;
 
+  BooleanPrefMember performance_tracing_enabled_;
   BooleanPrefMember tap_to_click_enabled_;
   BooleanPrefMember tap_dragging_enabled_;
   BooleanPrefMember three_finger_click_enabled_;
diff --git a/chrome/browser/chromeos/settings/cros_settings_names.cc b/chrome/browser/chromeos/settings/cros_settings_names.cc
index cea9665..ac3369d 100644
--- a/chrome/browser/chromeos/settings/cros_settings_names.cc
+++ b/chrome/browser/chromeos/settings/cros_settings_names.cc
@@ -53,6 +53,10 @@
 const char kSystemTimezone[] = "cros.system.timezone";
 const char kSystemTimezonePolicy[] = "cros.system.timezone_policy";
 
+// Value of kUse24HourClock user preference of device' owner.
+// ChromeOS device uses this setting on login screen.
+const char kSystemUse24HourClock[] = "cros.system.use_24hour_clock";
+
 const char kDeviceOwner[] = "cros.device.owner";
 
 const char kStatsReportingPref[] = "cros.metrics.reportingEnabled";
diff --git a/chrome/browser/chromeos/settings/cros_settings_names.h b/chrome/browser/chromeos/settings/cros_settings_names.h
index 226e9301..eff6785 100644
--- a/chrome/browser/chromeos/settings/cros_settings_names.h
+++ b/chrome/browser/chromeos/settings/cros_settings_names.h
@@ -31,6 +31,7 @@
 
 extern const char kSystemTimezonePolicy[];
 extern const char kSystemTimezone[];
+extern const char kSystemUse24HourClock[];
 
 extern const char kDeviceOwner[];
 
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
index f18d144..7816dc7 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -75,6 +75,7 @@
   kStartUpUrls,
   kStatsReportingPref,
   kSystemTimezonePolicy,
+  kSystemUse24HourClock,
   kUpdateDisabled,
   kVariationsRestrictParameter,
 };
@@ -375,6 +376,16 @@
           flags_proto->add_flags(flag);
       }
     }
+  } else if (prop == kSystemUse24HourClock) {
+    em::SystemUse24HourClockProto* use_24hour_clock_proto =
+        device_settings_.mutable_use_24hour_clock();
+    use_24hour_clock_proto->Clear();
+    bool use_24hour_clock_value;
+    if (value->GetAsBoolean(&use_24hour_clock_value)) {
+      use_24hour_clock_proto->set_use_24hour_clock(use_24hour_clock_value);
+    } else {
+      NOTREACHED();
+    }
   } else {
     // The remaining settings don't support Set(), since they are not
     // intended to be customizable by the user:
@@ -704,6 +715,13 @@
     }
   }
 
+  if (policy.has_use_24hour_clock()) {
+    if (policy.use_24hour_clock().has_use_24hour_clock()) {
+      new_values_cache->SetBoolean(
+          kSystemUse24HourClock, policy.use_24hour_clock().use_24hour_clock());
+    }
+  }
+
   if (policy.has_allow_redeem_offers()) {
     new_values_cache->SetBoolean(
         kAllowRedeemChromeOsRegistrationOffers,
diff --git a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
index 1580e0c..764b81e 100644
--- a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
+++ b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
@@ -66,6 +66,7 @@
 #include "chrome/browser/chromeos/options/network_config_view.h"
 #include "chrome/browser/chromeos/options/network_connect.h"
 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
+#include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/browser/chromeos/sim_dialog_delegate.h"
 #include "chrome/browser/chromeos/status/data_promo_notification.h"
 #include "chrome/browser/chromeos/system/timezone_settings.h"
@@ -85,7 +86,6 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/upgrade_detector.h"
 #include "chrome/common/pref_names.h"
-#include "chrome/common/time_format.h"
 #include "chrome/common/url_constants.h"
 #include "chromeos/chromeos_switches.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
@@ -112,6 +112,7 @@
 #include "net/base/escape.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
 
 using drive::DriveIntegrationService;
 using drive::DriveIntegrationServiceFactory;
@@ -884,7 +885,7 @@
 
   virtual string16 FormatTimeDuration(
       const base::TimeDelta& delta) const OVERRIDE {
-    return TimeFormat::TimeDurationLong(delta);
+    return ui::TimeFormat::TimeDurationLong(delta);
   }
 
   virtual void MaybeSpeak(const std::string& utterance) const OVERRIDE {
@@ -970,13 +971,40 @@
       integration_service->job_list()->RemoveObserver(this);
   }
 
+  bool ShouldUse24HourClock() const {
+    // On login screen and in guest mode owner default is used for
+    // kUse24HourClock preference.
+    // All other modes default to the default locale value.
+    const ash::user::LoginStatus status = GetUserLoginStatus();
+    const CrosSettings* const cros_settings = CrosSettings::Get();
+    bool system_use_24_hour_clock = true;
+    const bool system_value_found = cros_settings->GetBoolean(
+        kSystemUse24HourClock, &system_use_24_hour_clock);
+
+    if (status == ash::user::LOGGED_IN_NONE)
+      return (system_value_found ? system_use_24_hour_clock : true);
+
+    const PrefService::Preference* user_pref =
+        user_pref_registrar_->prefs()->FindPreference(prefs::kUse24HourClock);
+    if (status == ash::user::LOGGED_IN_GUEST && user_pref->IsDefaultValue())
+      return (system_value_found ? system_use_24_hour_clock : true);
+
+    bool use_24_hour_clock = true;
+    user_pref->GetValue()->GetAsBoolean(&use_24_hour_clock);
+    return use_24_hour_clock;
+  }
+
   void UpdateClockType() {
     if (!user_pref_registrar_)
       return;
-    clock_type_ =
-        user_pref_registrar_->prefs()->GetBoolean(prefs::kUse24HourClock) ?
-        base::k24HourClock : base::k12HourClock;
+
+    const bool use_24_hour_clock = ShouldUse24HourClock();
+    clock_type_ = use_24_hour_clock ? base::k24HourClock : base::k12HourClock;
     GetSystemTrayNotifier()->NotifyDateFormatChanged();
+    // This also works for enterprise-managed devices because they never have
+    // local owner.
+    if (chromeos::UserManager::Get()->IsCurrentUserOwner())
+      CrosSettings::Get()->SetBoolean(kSystemUse24HourClock, use_24_hour_clock);
   }
 
   void UpdateShowLogoutButtonInTray() {
diff --git a/chrome/browser/component_updater/widevine_cdm_component_installer.cc b/chrome/browser/component_updater/widevine_cdm_component_installer.cc
index cdb9f24..769a38b 100644
--- a/chrome/browser/component_updater/widevine_cdm_component_installer.cc
+++ b/chrome/browser/component_updater/widevine_cdm_component_installer.cc
@@ -43,17 +43,17 @@
 
 #if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT)
 
-// CRX hash. The extension id is: pdkaonnflpjcgibpgaanildgengnihcm.
-const uint8 kSha2Hash[] = { 0xf3, 0xa0, 0xed, 0xd5, 0xbf, 0x92, 0x68, 0x1f,
-                            0x60, 0x0d, 0x8b, 0x36, 0x4d, 0x6d, 0x87, 0x2c,
-                            0x86, 0x61, 0x12, 0x20, 0x21, 0xf8, 0x94, 0xdd,
-                            0xe1, 0xb6, 0xb4, 0x55, 0x34, 0x8c, 0x2e, 0x20 };
+// CRX hash. The extension id is: oimompecagnajdejgnnjijobebaeigek.
+const uint8 kSha2Hash[] = { 0xe8, 0xce, 0xcf, 0x42, 0x06, 0xd0, 0x93, 0x49,
+                            0x6d, 0xd9, 0x89, 0xe1, 0x41, 0x04, 0x86, 0x4a,
+                            0x8f, 0xbd, 0x86, 0x12, 0xb9, 0x58, 0x9b, 0xfb,
+                            0x4f, 0xbb, 0x1b, 0xa9, 0xd3, 0x85, 0x37, 0xef };
 
 // File name of the Widevine CDM component manifest on different platforms.
 const char kWidevineCdmManifestName[] = "WidevineCdm";
 
 // Name of the Widevine CDM OS in the component manifest.
-const char kWidevineCdmOperatingSystem[] =
+const char kWidevineCdmPlatform[] =
 #if defined(OS_MACOSX)
     "mac";
 #elif defined(OS_WIN)
@@ -65,7 +65,7 @@
 // Name of the Widevine CDM architecture in the component manifest.
 const char kWidevineCdmArch[] =
 #if defined(ARCH_CPU_X86)
-    "ia32";
+    "x86";
 #elif defined(ARCH_CPU_X86_64)
     "x64";
 #else  // TODO(viettrungluu): Support an ARM check?
@@ -83,6 +83,16 @@
   return result;
 }
 
+// Widevine CDM is packaged as a multi-CRX. Widevine CDM binaries are located in
+// _platform_specific/<platform_arch> folder in the package. This function
+// returns the platform-specific subdirectory that is part of that multi-CRX.
+base::FilePath GetPlatformDirectory(const base::FilePath& base_path) {
+  std::string platform_arch = kWidevineCdmPlatform;
+  platform_arch += '_';
+  platform_arch += kWidevineCdmArch;
+  return base_path.AppendASCII("_platform_specific").AppendASCII(platform_arch);
+}
+
 // Widevine CDM has the version encoded in the path so we need to enumerate the
 // directories to find the full path.
 // On success, |latest_dir| returns something like:
@@ -172,16 +182,6 @@
   if (!version.IsValid())
     return false;
 
-  std::string os;
-  manifest.GetStringASCII("x-widevine-cdm-os", &os);
-  if (os != kWidevineCdmOperatingSystem)
-    return false;
-
-  std::string arch;
-  manifest.GetStringASCII("x-widevine-cdm-arch", &arch);
-  if (arch != kWidevineCdmArch)
-    return false;
-
   *version_out = version;
   return true;
 }
@@ -221,8 +221,10 @@
   if (current_version_.CompareTo(version) > 0)
     return false;
 
-  if (!base::PathExists(unpack_path.AppendASCII(kWidevineCdmFileName)))
+  if (!base::PathExists(
+      GetPlatformDirectory(unpack_path).AppendASCII(kWidevineCdmFileName))) {
     return false;
+  }
 
   base::FilePath adapter_source_path;
   PathService::Get(chrome::FILE_WIDEVINE_CDM_ADAPTER, &adapter_source_path);
@@ -237,8 +239,8 @@
   if (!base::Move(unpack_path, install_path))
     return false;
 
-  base::FilePath adapter_install_path =
-      install_path.AppendASCII(kWidevineCdmAdapterFileName);
+  base::FilePath adapter_install_path = GetPlatformDirectory(install_path)
+      .AppendASCII(kWidevineCdmAdapterFileName);
   if (!base::CopyFile(adapter_source_path, adapter_install_path))
     return false;
 
@@ -249,18 +251,17 @@
   return true;
 }
 
+// Given |file|, a path like "_platform_specific/win_x86/widevinecdm.dll",
+// returns the assumed install path. The path separator in |file| is '/'
+// for all platforms. Caller is responsible for checking that the
+// |installed_file| actually exists.
 bool WidevineCdmComponentInstaller::GetInstalledFile(
     const std::string& file, base::FilePath* installed_file) {
-  // Only the CDM is component-updated.
-  if (file != kWidevineCdmFileName)
-    return false;
-
   if (current_version_.Equals(base::Version(kNullVersion)))
     return false;  // No CDM has been installed yet.
 
-  *installed_file =
-      GetWidevineCdmBaseDirectory().AppendASCII(current_version_.GetString())
-          .AppendASCII(kWidevineCdmFileName);
+  *installed_file = GetWidevineCdmBaseDirectory().AppendASCII(
+      current_version_.GetString()).AppendASCII(file);
   return true;
 }
 
@@ -292,9 +293,11 @@
   std::vector<base::FilePath> older_dirs;
 
   if (GetWidevineCdmDirectory(&latest_dir, &version, &older_dirs)) {
+    base::FilePath latest_platform_dir = GetPlatformDirectory(latest_dir);
     base::FilePath adapter_path =
-        latest_dir.AppendASCII(kWidevineCdmAdapterFileName);
-    base::FilePath cdm_path = latest_dir.AppendASCII(kWidevineCdmFileName);
+        latest_platform_dir.AppendASCII(kWidevineCdmAdapterFileName);
+    base::FilePath cdm_path =
+        latest_platform_dir.AppendASCII(kWidevineCdmFileName);
 
     if (base::PathExists(adapter_path) &&
         base::PathExists(cdm_path)) {
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc b/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc
index b10a7ce..58791d1 100644
--- a/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc
+++ b/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc
@@ -290,6 +290,9 @@
         return BrowserThread::CurrentlyOn(BrowserThread::UI);
       case base::MessageLoop::TYPE_IO:
         return BrowserThread::CurrentlyOn(BrowserThread::IO);
+#if defined(OS_ANDROID)
+      case base::MessageLoop::TYPE_JAVA: // fall-through
+#endif // defined(OS_ANDROID)
       case base::MessageLoop::TYPE_DEFAULT:
         return !BrowserThread::CurrentlyOn(BrowserThread::UI) &&
                !BrowserThread::CurrentlyOn(BrowserThread::IO);
diff --git a/chrome/browser/devtools/adb_client_socket.cc b/chrome/browser/devtools/adb_client_socket.cc
index f316e77..98e9065 100644
--- a/chrome/browser/devtools/adb_client_socket.cc
+++ b/chrome/browser/devtools/adb_client_socket.cc
@@ -158,6 +158,7 @@
     response_ += std::string(response_buffer->data(), result);
     int expected_length = 0;
     if (bytes_total < 0) {
+      // TODO(kaznacheev): Use net::HttpResponseHeader to parse the header.
       size_t content_pos = response_.find("Content-Length:");
       if (content_pos != std::string::npos) {
         size_t endline_pos = response_.find("\n", content_pos);
@@ -181,7 +182,7 @@
 
     if (bytes_total == static_cast<int>(response_.length())) {
       if (!command_callback_.is_null())
-        command_callback_.Run(body_pos_, response_);
+        command_callback_.Run(net::OK, response_.substr(body_pos_));
       else
         socket_callback_.Run(net::OK, socket_.release());
       delete this;
diff --git a/chrome/browser/devtools/adb_web_socket.cc b/chrome/browser/devtools/adb_web_socket.cc
index 4e207a6..b740497 100644
--- a/chrome/browser/devtools/adb_web_socket.cc
+++ b/chrome/browser/devtools/adb_web_socket.cc
@@ -63,7 +63,7 @@
 AdbWebSocket::~AdbWebSocket() {}
 
 void AdbWebSocket::ConnectOnHandlerThread() {
-  device_->HttpQuery(
+  device_->HttpUpgrade(
       socket_name_,
       base::StringPrintf(kWebSocketUpgradeRequest, url_.c_str()),
       base::Bind(&AdbWebSocket::ConnectedOnHandlerThread, this));
diff --git a/chrome/browser/devtools/devtools_adb_bridge.cc b/chrome/browser/devtools/devtools_adb_bridge.cc
index 3ce82bb..2973fa2 100644
--- a/chrome/browser/devtools/devtools_adb_bridge.cc
+++ b/chrome/browser/devtools/devtools_adb_bridge.cc
@@ -24,6 +24,7 @@
 #include "chrome/browser/devtools/adb/android_rsa.h"
 #include "chrome/browser/devtools/adb_client_socket.h"
 #include "chrome/browser/devtools/adb_web_socket.h"
+#include "chrome/browser/devtools/devtools_protocol.h"
 #include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/devtools/tethering_adb_filter.h"
 #include "chrome/browser/profiles/profile.h"
@@ -51,10 +52,16 @@
 
 static const char kPageListRequest[] = "GET /json HTTP/1.1\r\n\r\n";
 static const char kVersionRequest[] = "GET /json/version HTTP/1.1\r\n\r\n";
+static const char kClosePageRequest[] = "GET /json/close/%s HTTP/1.1\r\n\r\n";
+static const char kNewPageRequest[] = "GET /json/new HTTP/1.1\r\n\r\n";
 const int kAdbPort = 5037;
 const int kBufferSize = 16 * 1024;
 const int kAdbPollingIntervalMs = 1000;
 
+static const char kUrlParam[] = "url";
+static const char kPageReloadCommand[] = "Page.reload";
+static const char kPageNavigateCommand[] = "Page.navigate";
+
 typedef DevToolsAdbBridge::Callback Callback;
 typedef std::vector<scoped_refptr<DevToolsAdbBridge::AndroidDevice> >
     AndroidDevices;
@@ -276,8 +283,7 @@
     }
 
     // Parse version, append to package name if available,
-    std::string body = response.substr(result);
-    scoped_ptr<base::Value> value(base::JSONReader::Read(body));
+    scoped_ptr<base::Value> value(base::JSONReader::Read(response));
     base::DictionaryValue* dict;
     if (value && value->GetAsDictionary(&dict)) {
       std::string browser;
@@ -303,8 +309,7 @@
       return;
     }
 
-    std::string body = response.substr(result);
-    scoped_ptr<base::Value> value(base::JSONReader::Read(body));
+    scoped_ptr<base::Value> value(base::JSONReader::Read(response));
     base::ListValue* list_value;
     if (!value || !value->GetAsList(&list_value)) {
       ProcessSockets();
@@ -384,6 +389,57 @@
   scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_;
 };
 
+// AdbProtocolCommand ---------------------------------------------------------
+
+class AdbProtocolCommand : public AdbWebSocket::Delegate {
+ public:
+  AdbProtocolCommand(
+      scoped_refptr<DevToolsAdbBridge> bridge_,
+      scoped_refptr<DevToolsAdbBridge::AndroidDevice> device,
+      const std::string& socket_name,
+      const std::string& debug_url,
+      const std::string& command);
+
+ private:
+  virtual void OnSocketOpened() OVERRIDE;
+  virtual void OnFrameRead(const std::string& message) OVERRIDE;
+  virtual void OnSocketClosed(bool closed_by_device) OVERRIDE;
+  virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE;
+
+  scoped_refptr<DevToolsAdbBridge> bridge_;
+  const std::string command_;
+  scoped_refptr<AdbWebSocket> web_socket_;
+
+  DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand);
+};
+
+AdbProtocolCommand::AdbProtocolCommand(
+    scoped_refptr<DevToolsAdbBridge> bridge,
+    scoped_refptr<DevToolsAdbBridge::AndroidDevice> device,
+    const std::string& socket_name,
+    const std::string& debug_url,
+    const std::string& command)
+    : bridge_(bridge),
+      command_(command) {
+  web_socket_ = new AdbWebSocket(
+      device, socket_name, debug_url, bridge_->GetAdbMessageLoop(), this);
+}
+
+void AdbProtocolCommand::OnSocketOpened() {
+  web_socket_->SendFrame(command_);
+  web_socket_->Disconnect();
+}
+
+void AdbProtocolCommand::OnFrameRead(const std::string& message) {}
+
+void AdbProtocolCommand::OnSocketClosed(bool closed_by_device) {
+  delete this;
+}
+
+bool AdbProtocolCommand::ProcessIncomingMessage(const std::string& message) {
+  return false;
+}
+
 }  // namespace
 
 const char kDevToolsChannelNameFormat[] = "%s_devtools_remote";
@@ -445,7 +501,7 @@
                                  request, callback));
 }
 
-void DevToolsAdbBridge::AndroidDevice::HttpQuery(
+void DevToolsAdbBridge::AndroidDevice::HttpUpgrade(
     const std::string& la_name,
     const std::string& request,
     const SocketCallback& callback) {
@@ -583,23 +639,48 @@
     frontend_url_ = frontend_url_.substr(0, ws_param);
   if (frontend_url_.find("http:") == 0)
     frontend_url_ = "https:" + frontend_url_.substr(5);
-
-  global_id_ = base::StringPrintf(
-      "%s:%s:%s", device->serial().c_str(), socket_.c_str(), id_.c_str());
 }
 
 void DevToolsAdbBridge::RemotePage::Inspect(Profile* profile) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  std::string agent_id = base::StringPrintf("%s:%s:%s",
+    device_->serial().c_str(), socket_.c_str(), id_.c_str());
   AgentHostDelegates::iterator it =
-      g_host_delegates.Get().find(global_id());
+      g_host_delegates.Get().find(agent_id);
   if (it != g_host_delegates.Get().end())
     it->second->OpenFrontend();
   else if (!debug_url_.empty())
     new AgentHostDelegate(
-        global_id_, device_, socket_, debug_url_,
+        agent_id, device_, socket_, debug_url_,
         frontend_url_, bridge_->GetAdbMessageLoop(), profile);
 }
 
+static void Noop(int, const std::string&) {}
+
+void DevToolsAdbBridge::RemotePage::Close() {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  if (attached())
+    return;
+  std::string request = base::StringPrintf(kClosePageRequest, id_.c_str());
+  bridge_->GetAdbMessageLoop()->PostTask(FROM_HERE,
+      base::Bind(&AndroidDevice::HttpQuery,
+          device_, socket_, request, base::Bind(&Noop)));
+}
+
+void DevToolsAdbBridge::RemotePage::Reload() {
+  SendProtocolCommand(kPageReloadCommand, NULL);
+}
+
+void DevToolsAdbBridge::RemotePage::SendProtocolCommand(
+    const std::string& method,
+    base::DictionaryValue* params) {
+  if (attached())
+    return;
+  DevToolsProtocol::Command command(1, method, params);
+  new AdbProtocolCommand(
+      bridge_, device_, socket_, debug_url_, command.Serialize());
+}
+
 DevToolsAdbBridge::RemotePage::~RemotePage() {
 }
 
@@ -614,6 +695,35 @@
       name_(name) {
 }
 
+void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) {
+  bridge_->GetAdbMessageLoop()->PostTask(FROM_HERE,
+      base::Bind(&AndroidDevice::HttpQuery,
+          device_, socket_, kNewPageRequest,
+          base::Bind(&RemoteBrowser::PageCreatedOnHandlerThread, this, url)));
+}
+
+void DevToolsAdbBridge::RemoteBrowser::PageCreatedOnHandlerThread(
+    const std::string& url, int result, const std::string& response) {
+  if (result < 0)
+    return;
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::Bind(&RemoteBrowser::PageCreatedOnUIThread, this, response, url));
+}
+
+void DevToolsAdbBridge::RemoteBrowser::PageCreatedOnUIThread(
+    const std::string& response, const std::string& url) {
+  scoped_ptr<base::Value> value(base::JSONReader::Read(response));
+  base::DictionaryValue* dict;
+  if (value && value->GetAsDictionary(&dict)) {
+    scoped_refptr<RemotePage> new_page =
+        new RemotePage(bridge_, device_, socket_, *dict);
+    base::DictionaryValue params;
+    params.SetString(kUrlParam, url);
+    new_page->SendProtocolCommand(kPageNavigateCommand, &params);
+  }
+}
+
 DevToolsAdbBridge::RemoteBrowser::~RemoteBrowser() {
 }
 
diff --git a/chrome/browser/devtools/devtools_adb_bridge.h b/chrome/browser/devtools/devtools_adb_bridge.h
index 222edf1..cfd3482 100644
--- a/chrome/browser/devtools/devtools_adb_bridge.h
+++ b/chrome/browser/devtools/devtools_adb_bridge.h
@@ -95,9 +95,14 @@
     std::string title() { return title_; }
     std::string description() { return description_; }
     std::string favicon_url() { return favicon_url_; }
-    std::string global_id() { return global_id_; }
+    bool attached() { return debug_url_.empty(); }
 
     void Inspect(Profile* profile);
+    void Close();
+    void Reload();
+
+    void SendProtocolCommand(const std::string& method,
+                             base::DictionaryValue* params);
 
    private:
     friend class base::RefCounted<RemotePage>;
@@ -113,7 +118,6 @@
     std::string favicon_url_;
     std::string debug_url_;
     std::string frontend_url_;
-    std::string global_id_;
     DISALLOW_COPY_AND_ASSIGN(RemotePage);
   };
 
@@ -133,10 +137,18 @@
     RemotePages& pages() { return pages_; }
     void AddPage(scoped_refptr<RemotePage> page) { pages_.push_back(page); }
 
+    void Open(const std::string& url);
+
    private:
     friend class base::RefCounted<RemoteBrowser>;
     virtual ~RemoteBrowser();
 
+    void PageCreatedOnHandlerThread(
+        const std::string& url, int result, const std::string& response);
+
+    void PageCreatedOnUIThread(
+        const std::string& response, const std::string& url);
+
     scoped_refptr<DevToolsAdbBridge> bridge_;
     scoped_refptr<AndroidDevice> device_;
     const std::string socket_;
@@ -183,12 +195,12 @@
                             const CommandCallback& callback) = 0;
     virtual void OpenSocket(const std::string& socket_name,
                             const SocketCallback& callback) = 0;
-    virtual void HttpQuery(const std::string& la_name,
-                           const std::string& request,
-                           const CommandCallback& callback);
-    virtual void HttpQuery(const std::string& la_name,
-                           const std::string& request,
-                           const SocketCallback& callback);
+    void HttpQuery(const std::string& la_name,
+                   const std::string& request,
+                   const CommandCallback& callback);
+    void HttpUpgrade(const std::string& la_name,
+                     const std::string& request,
+                     const SocketCallback& callback);
 
     std::string serial() { return serial_; }
 
diff --git a/chrome/browser/devtools/devtools_file_system_indexer.cc b/chrome/browser/devtools/devtools_file_system_indexer.cc
index 683b4b3..34d8ba8 100644
--- a/chrome/browser/devtools/devtools_file_system_indexer.cc
+++ b/chrome/browser/devtools/devtools_file_system_indexer.cc
@@ -342,7 +342,7 @@
   FileUtilProxy::CreateOrOpen(
       BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE).get(),
       file_path,
-      base::PLATFORM_FILE_OPEN,
+      base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ,
       Bind(&FileSystemIndexingJob::StartFileIndexing, this));
 }
 
diff --git a/chrome/browser/devtools/devtools_protocol.cc b/chrome/browser/devtools/devtools_protocol.cc
new file mode 100644
index 0000000..eed5940
--- /dev/null
+++ b/chrome/browser/devtools/devtools_protocol.cc
@@ -0,0 +1,72 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/devtools/devtools_protocol.h"
+
+#include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
+
+namespace {
+const char kIdParam[] = "id";
+const char kMethodParam[] = "method";
+const char kParamsParam[] = "params";
+}  // namespace
+
+DevToolsProtocol::Message::~Message() {
+}
+
+DevToolsProtocol::Message::Message(const std::string& method,
+                                   base::DictionaryValue* params)
+    : method_(method),
+      params_(params ? params->DeepCopy() : NULL) {
+}
+
+DevToolsProtocol::Command::Command(int id,
+                                   const std::string& method,
+                                   base::DictionaryValue* params)
+    : Message(method, params),
+      id_(id) {
+}
+
+DevToolsProtocol::Command::~Command() {
+}
+
+std::string DevToolsProtocol::Command::Serialize() {
+  base::DictionaryValue command;
+  command.SetInteger(kIdParam, id_);
+  command.SetString(kMethodParam, method_);
+  if (params_)
+    command.Set(kParamsParam, params_->DeepCopy());
+
+  std::string json_command;
+  base::JSONWriter::Write(&command, &json_command);
+  return json_command;
+}
+
+DevToolsProtocol::Notification::~Notification() {
+}
+
+DevToolsProtocol::Notification::Notification(const std::string& method,
+                                             base::DictionaryValue* params)
+    : Message(method, params) {
+}
+
+// static
+DevToolsProtocol::Notification* DevToolsProtocol::ParseNotification(
+    const std::string& json) {
+  scoped_ptr<base::Value> value(base::JSONReader::Read(json));
+  if (!value || !value->IsType(Value::TYPE_DICTIONARY))
+    return NULL;
+
+  scoped_ptr<base::DictionaryValue> dict(
+      static_cast<base::DictionaryValue*>(value.release()));
+
+  std::string method;
+  if (!dict->GetString(kMethodParam, &method))
+    return NULL;
+
+  base::DictionaryValue* params = NULL;
+  dict->GetDictionary(kParamsParam, &params);
+  return new Notification(method, params);
+}
diff --git a/chrome/browser/devtools/devtools_protocol.h b/chrome/browser/devtools/devtools_protocol.h
new file mode 100644
index 0000000..9a01eee
--- /dev/null
+++ b/chrome/browser/devtools/devtools_protocol.h
@@ -0,0 +1,74 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_PROTOCOL_H_
+#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_PROTOCOL_H_
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "base/values.h"
+
+// Utility class for processing DevTools remote debugging messages.
+// This is a stripped down clone of content::DevTools which is not accessible
+// from chrome component (see content/browser/devtools/devtools_protocol.*).
+class DevToolsProtocol {
+ public:
+  class Message {
+   public:
+    virtual ~Message();
+
+    std::string method() { return method_; }
+    base::DictionaryValue* params() { return params_.get(); }
+
+   protected:
+    // Takes ownership of |params|.
+    Message(const std::string& method, base::DictionaryValue* params);
+
+    std::string method_;
+    scoped_ptr<base::DictionaryValue> params_;
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(Message);
+  };
+
+  class Command : public Message {
+   public:
+    // Takes ownership of |params|.
+    Command(int id, const std::string& method, base::DictionaryValue* params);
+    virtual  ~Command();
+
+    int id() { return id_; }
+    std::string Serialize();
+
+   private:
+    int id_;
+
+    DISALLOW_COPY_AND_ASSIGN(Command);
+  };
+
+  class Notification : public Message {
+   public:
+    virtual ~Notification();
+
+   private:
+    friend class DevToolsProtocol;
+
+    // Takes ownership of |params|.
+    Notification(const std::string& method,
+                 base::DictionaryValue* params);
+
+    DISALLOW_COPY_AND_ASSIGN(Notification);
+  };
+
+  static Notification* ParseNotification(const std::string& json);
+
+ private:
+
+  DevToolsProtocol() {}
+  ~DevToolsProtocol() {}
+};
+
+#endif  // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_PROTOCOL_H_
diff --git a/chrome/browser/devtools/tethering_adb_filter.cc b/chrome/browser/devtools/tethering_adb_filter.cc
index 829e933..887ba94 100644
--- a/chrome/browser/devtools/tethering_adb_filter.cc
+++ b/chrome/browser/devtools/tethering_adb_filter.cc
@@ -8,16 +8,14 @@
 
 #include "base/bind.h"
 #include "base/compiler_specific.h"
-#include "base/json/json_reader.h"
-#include "base/json/json_writer.h"
 #include "base/message_loop/message_loop.h"
 #include "base/prefs/pref_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/values.h"
 #include "chrome/browser/devtools/adb_client_socket.h"
 #include "chrome/browser/devtools/adb_web_socket.h"
+#include "chrome/browser/devtools/devtools_protocol.h"
 #include "chrome/common/pref_names.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/base/address_list.h"
@@ -33,9 +31,6 @@
 const int kAdbPort = 5037;
 const int kBufferSize = 16 * 1024;
 
-static const char kIdAttribute[] = "id";
-static const char kMethodAttribute[] = "method";
-static const char kParamsAttribute[] = "params";
 static const char kPortAttribute[] = "port";
 static const char kConnectionIdAttribute[] = "connectionId";
 static const char kTetheringAccepted[] = "Tethering.accepted";
@@ -277,17 +272,10 @@
 }
 
 void TetheringAdbFilter::SendCommand(const std::string& method, int port) {
-  base::DictionaryValue command;
-  command.SetInteger(kIdAttribute, ++command_id_);
-  command.SetString(kMethodAttribute, method);
-
   base::DictionaryValue params;
   params.SetInteger(kPortAttribute, port);
-  command.Set(kParamsAttribute, params.DeepCopy());
-
-  std::string json_command;
-  base::JSONWriter::Write(&command, &json_command);
-  web_socket_->SendFrameOnHandlerThread(json_command);
+  DevToolsProtocol::Command command(++command_id_, method, &params);
+  web_socket_->SendFrameOnHandlerThread(command.Serialize());
 }
 
 bool TetheringAdbFilter::ProcessIncomingMessage(const std::string& message) {
@@ -298,20 +286,15 @@
       message.find(kTetheringAccepted) == std::string::npos)
     return false;
 
-  scoped_ptr<base::Value> value(base::JSONReader::Read(message));
-
-  DictionaryValue* dvalue;
-  if (!value || !value->GetAsDictionary(&dvalue))
+  scoped_ptr<DevToolsProtocol::Notification> notification(
+      DevToolsProtocol::ParseNotification(message));
+  if (!notification)
     return false;
 
-  std::string method;
-  if (!dvalue->GetString(kMethodAttribute, &method) ||
-      method != kTetheringAccepted) {
+  if (notification->method() != kTetheringAccepted)
     return false;
-  }
 
-  DictionaryValue* params = NULL;
-  dvalue->GetDictionary(kParamsAttribute, &params);
+  DictionaryValue* params = notification->params();
   if (!params)
     return false;
 
diff --git a/chrome/browser/download/download_item_model.cc b/chrome/browser/download/download_item_model.cc
index ac386be..b1c89fc 100644
--- a/chrome/browser/download/download_item_model.cc
+++ b/chrome/browser/download/download_item_model.cc
@@ -13,13 +13,13 @@
 #include "base/time/time.h"
 #include "chrome/browser/download/download_crx_util.h"
 #include "chrome/browser/safe_browsing/download_feedback_service.h"
-#include "chrome/common/time_format.h"
 #include "content/public/browser/download_danger_type.h"
 #include "content/public/browser/download_interrupt_reasons.h"
 #include "content/public/browser/download_item.h"
 #include "grit/chromium_strings.h"
 #include "grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
 #include "ui/base/text/bytes_formatting.h"
 #include "ui/base/text/text_elider.h"
 
@@ -519,14 +519,14 @@
 
     return l10n_util::GetStringFUTF16(
         IDS_DOWNLOAD_STATUS_OPEN_IN,
-        TimeFormat::TimeRemainingShort(time_remaining));
+        ui::TimeFormat::TimeRemainingShort(time_remaining));
   }
 
   // In progress download with known time left: "100/120 MB, 10 secs left"
   if (time_remaining_known) {
     return l10n_util::GetStringFUTF16(
         IDS_DOWNLOAD_STATUS_IN_PROGRESS, size_ratio,
-        TimeFormat::TimeRemaining(time_remaining));
+        ui::TimeFormat::TimeRemaining(time_remaining));
   }
 
   // In progress download with no known time left and non-zero completed bytes:
diff --git a/chrome/browser/download/download_util.cc b/chrome/browser/download/download_util.cc
index d660491..8010f97 100644
--- a/chrome/browser/download/download_util.cc
+++ b/chrome/browser/download/download_util.cc
@@ -27,7 +27,6 @@
 #include "chrome/browser/download/download_item_model.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_paths.h"
-#include "chrome/common/time_format.h"
 #include "content/public/browser/download_item.h"
 #include "content/public/browser/download_manager.h"
 #include "content/public/browser/render_view_host.h"
@@ -40,6 +39,7 @@
 #include "third_party/skia/include/core/SkPath.h"
 #include "third_party/skia/include/core/SkShader.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
 #include "ui/base/text/bytes_formatting.h"
 #include "ui/gfx/image/image.h"
 #include "ui/gfx/rect.h"
@@ -229,7 +229,7 @@
   if (download->IsPaused())
     time_remaining = l10n_util::GetStringUTF16(IDS_DOWNLOAD_PROGRESS_PAUSED);
   else if (download->TimeRemaining(&remaining))
-    time_remaining = TimeFormat::TimeRemaining(remaining);
+    time_remaining = ui::TimeFormat::TimeRemaining(remaining);
 
   if (time_remaining.empty()) {
     base::i18n::AdjustStringForLocaleDirection(&amount);
diff --git a/chrome/browser/extensions/DEPS b/chrome/browser/extensions/DEPS
index 0a10421..290e2e5 100644
--- a/chrome/browser/extensions/DEPS
+++ b/chrome/browser/extensions/DEPS
@@ -5,6 +5,7 @@
   # to depend on apps will be lifted.
   "-apps",
   "+apps/app_window_contents.h",
+  "+apps/launcher.h",
   "+apps/native_app_window.h",
   "+apps/shell_window.h",
 
diff --git a/chrome/browser/extensions/OWNERS b/chrome/browser/extensions/OWNERS
index 2ffbdc3..bc2836c 100644
--- a/chrome/browser/extensions/OWNERS
+++ b/chrome/browser/extensions/OWNERS
@@ -14,6 +14,7 @@
 jyasskin@chromium.org
 kalman@chromium.org
 koz@chromium.org
+mek@chromium.org
 miket@chromium.org
 mpcomplete@chromium.org
 yoz@chromium.org
diff --git a/chrome/browser/extensions/api/downloads/downloads_api.cc b/chrome/browser/extensions/api/downloads/downloads_api.cc
index 2b6c64a..1bfc27b 100644
--- a/chrome/browser/extensions/api/downloads/downloads_api.cc
+++ b/chrome/browser/extensions/api/downloads/downloads_api.cc
@@ -87,7 +87,6 @@
 
 const char kEmptyFile[] = "Filename not yet determined";
 const char kFileAlreadyDeleted[] = "Download file already deleted";
-const char kHostPermission[] = "Access to that hostname must be requested";
 const char kIconNotFound[] = "Icon not found";
 const char kInvalidDangerType[] = "Invalid danger type";
 const char kInvalidFilename[] = "Invalid filename";
@@ -937,12 +936,7 @@
   EXTENSION_FUNCTION_VALIDATE(params.get());
   const extensions::api::downloads::DownloadOptions& options = params->options;
   GURL download_url(options.url);
-  if (Fault(!download_url.is_valid(), errors::kInvalidURL, &error_) ||
-      Fault((!download_url.SchemeIs("data") &&
-             (download_url.GetOrigin() != GetExtension()->url().GetOrigin()) &&
-             !extensions::PermissionsData::HasHostPermission(
-                 GetExtension(), download_url)),
-            errors::kHostPermission, &error_))
+  if (Fault(!download_url.is_valid(), errors::kInvalidURL, &error_))
     return false;
 
   Profile* current_profile = profile();
diff --git a/chrome/browser/extensions/api/downloads/downloads_api.h b/chrome/browser/extensions/api/downloads/downloads_api.h
index 16575f8..a6fda46 100644
--- a/chrome/browser/extensions/api/downloads/downloads_api.h
+++ b/chrome/browser/extensions/api/downloads/downloads_api.h
@@ -40,7 +40,6 @@
 // Errors that can be returned through chrome.runtime.lastError.message.
 extern const char kEmptyFile[];
 extern const char kFileAlreadyDeleted[];
-extern const char kHostPermission[];
 extern const char kIconNotFound[];
 extern const char kInvalidDangerType[];
 extern const char kInvalidFilename[];
diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
index c398541..82a5f6f 100644
--- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
+++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -1662,19 +1662,15 @@
       << kInvalidURLs[index];
   }
 
-  static const char* kDisallowedHost[] = {
-    "javascript:document.write(\\\"hello\\\");",
-    "javascript:return false;",
-    "ftp://example.com/example.txt",
-  };
-
-  for (size_t index = 0; index < arraysize(kDisallowedHost); ++index) {
-    EXPECT_STREQ(errors::kHostPermission,
-                  RunFunctionAndReturnError(new DownloadsDownloadFunction(),
-                                            base::StringPrintf(
-        "[{\"url\": \"%s\"}]", kDisallowedHost[index])).c_str())
-      << kDisallowedHost[index];
-  }
+  EXPECT_STREQ("net::ERR_ACCESS_DENIED", RunFunctionAndReturnError(
+      new DownloadsDownloadFunction(),
+      "[{\"url\": \"javascript:document.write(\\\"hello\\\");\"}]").c_str());
+  EXPECT_STREQ("net::ERR_ACCESS_DENIED", RunFunctionAndReturnError(
+      new DownloadsDownloadFunction(),
+      "[{\"url\": \"javascript:return false;\"}]").c_str());
+  EXPECT_STREQ("net::ERR_NOT_IMPLEMENTED", RunFunctionAndReturnError(
+      new DownloadsDownloadFunction(),
+      "[{\"url\": \"ftp://example.com/example.txt\"}]").c_str());
 }
 
 // TODO(benjhayden): Set up a test ftp server, add ftp://localhost* to
diff --git a/chrome/browser/extensions/api/log_private/filter_handler.cc b/chrome/browser/extensions/api/log_private/filter_handler.cc
new file mode 100644
index 0000000..6965932
--- /dev/null
+++ b/chrome/browser/extensions/api/log_private/filter_handler.cc
@@ -0,0 +1,58 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/log_private/filter_handler.h"
+
+#include <string>
+#include <vector>
+
+#include "chrome/common/extensions/api/log_private.h"
+
+namespace extensions {
+
+namespace {
+
+template <typename T>
+bool IsValidField(const std::vector<T>& filter, const T& field) {
+  return (!filter.size() ||
+          std::find(filter.begin(), filter.end(), field) != filter.end());
+}
+
+}  // namespace
+
+FilterHandler::FilterHandler(const api::log_private::Filter& filter) {
+  scoped_ptr<base::DictionaryValue> filter_value = filter.ToValue();
+  api::log_private::Filter::Populate(*filter_value, &filter_);
+}
+
+FilterHandler::~FilterHandler() {}
+
+bool FilterHandler::IsValidLogEntry(
+    const api::log_private::LogEntry& entry) const {
+  return (IsValidProcess(entry.process) && IsValidLevel(entry.level) &&
+          IsValidTime(entry.timestamp));
+}
+
+bool FilterHandler::IsValidTime(double time) const {
+  const double kInvalidTime = 0;
+  if (filter_.start_timestamp != kInvalidTime &&
+      (filter_.start_timestamp > time || filter_.end_timestamp < time)) {
+    return false;
+  }
+  return true;
+}
+
+bool FilterHandler::IsValidSource(const std::string& source) const {
+  return IsValidField(filter_.sources, source);
+}
+
+bool FilterHandler::IsValidLevel(const std::string& level) const {
+  return IsValidField(filter_.level, level);
+}
+
+bool FilterHandler::IsValidProcess(const std::string& process) const {
+  return IsValidField(filter_.process, process);
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/api/log_private/filter_handler.h b/chrome/browser/extensions/api/log_private/filter_handler.h
new file mode 100644
index 0000000..18e3129
--- /dev/null
+++ b/chrome/browser/extensions/api/log_private/filter_handler.h
@@ -0,0 +1,46 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_FILTER_HANDLER_H_
+#define CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_FILTER_HANDLER_H_
+
+#include <string>
+#include <vector>
+
+#include "chrome/common/extensions/api/log_private.h"
+
+namespace extensions {
+// This class contains multiple filtering methods to filter log entries
+// by multiple fields.
+class FilterHandler {
+ public:
+  explicit FilterHandler(const api::log_private::Filter& filter);
+  ~FilterHandler();
+
+  // This function decides if a log entry should be returned to user.
+  // Returns true if the log entry meets the filtering conditions.
+  bool IsValidLogEntry(const api::log_private::LogEntry& entry) const;
+  // Filters log by timestamp.
+  // Returns true if the timestamp is within the time range of the filter.
+  bool IsValidTime(double time) const;
+  // Filters log by source (syslog, network_event_log, etc).
+  // Returns true if the log is from specified source in the filter.
+  bool IsValidSource(const std::string& source) const;
+  // Filters log by level (DEBUG, ERROR, WARNING).
+  // Returns true if the log level is specified in the filter.
+  bool IsValidLevel(const std::string& level) const;
+  // Filters log by its process name.
+  // Returns true if the process name is specified in the filter.
+  bool IsValidProcess(const std::string& process) const;
+
+  const api::log_private::Filter* GetFilter() const { return &filter_; }
+ private:
+  api::log_private::Filter filter_;
+
+  DISALLOW_COPY_AND_ASSIGN(FilterHandler);
+};
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_FILTER_HANDLER_H_
diff --git a/chrome/browser/extensions/api/log_private/log_parser.cc b/chrome/browser/extensions/api/log_private/log_parser.cc
new file mode 100644
index 0000000..d88c73a
--- /dev/null
+++ b/chrome/browser/extensions/api/log_private/log_parser.cc
@@ -0,0 +1,40 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/log_private/log_parser.h"
+
+#include <string>
+#include <vector>
+
+#include "base/logging.h"
+#include "base/memory/linked_ptr.h"
+#include "base/strings/string_split.h"
+#include "chrome/browser/extensions/api/log_private/log_private_api.h"
+#include "chrome/common/extensions/api/log_private.h"
+
+using std::string;
+using std::vector;
+
+namespace extensions {
+
+LogParser::LogParser() {
+}
+
+LogParser::~LogParser() {
+}
+
+void LogParser::Parse(
+    const string& input,
+    std::vector<linked_ptr<api::log_private::LogEntry> >* output,
+    FilterHandler* filter_handler) const {
+  std::vector<string> entries;
+  // Assume there is no newline in the log entry
+  base::SplitString(input, '\n', &entries);
+
+  for (size_t i = 0; i < entries.size(); i++) {
+    ParseEntry(entries[i], output, filter_handler);
+  }
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/api/log_private/log_parser.h b/chrome/browser/extensions/api/log_private/log_parser.h
new file mode 100644
index 0000000..c73e54f
--- /dev/null
+++ b/chrome/browser/extensions/api/log_private/log_parser.h
@@ -0,0 +1,49 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_LOG_PARSER_H_
+#define CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_LOG_PARSER_H_
+
+#include <string>
+#include <vector>
+
+#include "base/memory/linked_ptr.h"
+#include "chrome/browser/extensions/api/log_private/filter_handler.h"
+#include "chrome/common/extensions/api/log_private.h"
+
+namespace extensions {
+
+// This is a abstract class of parsers for different logs.
+// All the specific parsers inherit from this class.
+class LogParser {
+ public:
+  enum Error {
+    SUCCESS = 0,
+    PARSE_ERROR = -1,
+    SERIALIZE_ERROR = -2,
+    TOKENIZE_ERROR = -3
+  };
+
+  virtual ~LogParser();
+  // Parses log text into multiple LogEntry objects.
+  void Parse(
+      const std::string& input,
+      std::vector<linked_ptr<api::log_private::LogEntry> >* output,
+      FilterHandler* filter_handler) const;
+
+ protected:
+  explicit LogParser();
+  // Parses a single line of log text into one LogEntry object.
+  virtual Error ParseEntry(
+      const std::string& input,
+      std::vector<linked_ptr<api::log_private::LogEntry> >* output,
+      FilterHandler* filter_handler) const = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(LogParser);
+};
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_LOG_PARSER_H_
diff --git a/chrome/browser/extensions/api/log_private/log_private_api.h b/chrome/browser/extensions/api/log_private/log_private_api.h
new file mode 100644
index 0000000..f6f8911
--- /dev/null
+++ b/chrome/browser/extensions/api/log_private/log_private_api.h
@@ -0,0 +1,38 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_LOG_PRIVATE_API_H_
+#define CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_LOG_PRIVATE_API_H_
+
+#include <string>
+
+#include "chrome/browser/chromeos/system_logs/system_logs_fetcher.h"
+#include "chrome/browser/extensions/api/log_private/filter_handler.h"
+#include "chrome/browser/extensions/api/log_private/log_parser.h"
+#include "chrome/browser/extensions/extension_function.h"
+#include "chrome/common/extensions/api/log_private.h"
+
+namespace extensions {
+
+class LogPrivateGetHistoricalFunction : public AsyncExtensionFunction {
+ public:
+  LogPrivateGetHistoricalFunction();
+  DECLARE_EXTENSION_FUNCTION("logPrivate.getHistorical",
+                             LOGPRIVATE_GETHISTORICAL);
+
+ protected:
+  virtual ~LogPrivateGetHistoricalFunction();
+  virtual bool RunImpl() OVERRIDE;
+
+ private:
+  void OnSystemLogsLoaded(scoped_ptr<chromeos::SystemLogsResponse> sys_info);
+
+  scoped_ptr<FilterHandler> filter_handler_;
+
+  DISALLOW_COPY_AND_ASSIGN(LogPrivateGetHistoricalFunction);
+};
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_LOG_PRIVATE_API_H_
diff --git a/chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc b/chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc
new file mode 100644
index 0000000..055c4ac
--- /dev/null
+++ b/chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc
@@ -0,0 +1,86 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/log_private/log_private_api.h"
+
+#include <string>
+#include <vector>
+
+#include "base/json/json_writer.h"
+#include "base/logging.h"
+#include "base/memory/linked_ptr.h"
+#include "base/memory/scoped_ptr.h"
+#include "chrome/browser/chromeos/system_logs/system_logs_fetcher.h"
+#include "chrome/browser/extensions/api/log_private/filter_handler.h"
+#include "chrome/browser/extensions/api/log_private/log_parser.h"
+#include "chrome/browser/extensions/api/log_private/syslog_parser.h"
+#include "chrome/browser/extensions/extension_function.h"
+#include "chrome/common/extensions/api/log_private.h"
+
+namespace extensions {
+namespace {
+
+scoped_ptr<LogParser> CreateLogParser(const std::string& log_type) {
+  if (log_type == "syslog")
+    return scoped_ptr<LogParser>(new SyslogParser());
+  // TODO(shinfan): Add more parser here
+
+  NOTREACHED() << "Invalid log type: " << log_type;
+  return  scoped_ptr<LogParser>();
+}
+
+void CollectLogInfo(
+    FilterHandler* filter_handler,
+    chromeos::SystemLogsResponse* logs,
+    std::vector<linked_ptr<api::log_private::LogEntry> >* output) {
+  for (chromeos::SystemLogsResponse::const_iterator request_it = logs->begin();
+       request_it != logs->end();
+       ++request_it) {
+    if (!filter_handler->IsValidSource(request_it->first)) {
+      continue;
+    }
+    scoped_ptr<LogParser> parser(CreateLogParser(request_it->first));
+    if (parser) {
+      parser->Parse(request_it->second, output, filter_handler);
+    }
+  }
+}
+
+}  // namespace
+
+LogPrivateGetHistoricalFunction::LogPrivateGetHistoricalFunction() {
+}
+
+LogPrivateGetHistoricalFunction::~LogPrivateGetHistoricalFunction() {
+}
+
+bool LogPrivateGetHistoricalFunction::RunImpl() {
+  // Get parameters
+  scoped_ptr<api::log_private::GetHistorical::Params> params(
+      api::log_private::GetHistorical::Params::Create(*args_));
+  EXTENSION_FUNCTION_VALIDATE(params.get());
+  filter_handler_.reset(new FilterHandler(params->filter));
+
+  chromeos::SystemLogsFetcher* fetcher = new chromeos::SystemLogsFetcher();
+  fetcher->Fetch(
+      base::Bind(&LogPrivateGetHistoricalFunction::OnSystemLogsLoaded, this));
+  return true;
+}
+
+void LogPrivateGetHistoricalFunction::OnSystemLogsLoaded(
+    scoped_ptr<chromeos::SystemLogsResponse> sys_info) {
+  std::vector<linked_ptr<api::log_private::LogEntry> > data;
+
+  CollectLogInfo(filter_handler_.get(), sys_info.get(), &data);
+
+  // Prepare result
+  api::log_private::Result result;
+  result.data = data;
+  api::log_private::Filter::Populate(
+      *((filter_handler_->GetFilter())->ToValue()), &result.filter);
+  SetResult(result.ToValue().release());
+  SendResponse(true);
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/api/log_private/log_private_api_nonchromeos.cc b/chrome/browser/extensions/api/log_private/log_private_api_nonchromeos.cc
new file mode 100644
index 0000000..c2ae4ad
--- /dev/null
+++ b/chrome/browser/extensions/api/log_private/log_private_api_nonchromeos.cc
@@ -0,0 +1,31 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/log_private/log_private_api.h"
+
+namespace extensions {
+
+namespace {
+
+const char kErrorNotImplemented[] = "Not implemented";
+
+}  // namespace
+
+LogPrivateGetHistoricalFunction::LogPrivateGetHistoricalFunction() {
+}
+
+LogPrivateGetHistoricalFunction::~LogPrivateGetHistoricalFunction() {
+}
+
+bool LogPrivateGetHistoricalFunction::RunImpl() {
+  SetError(kErrorNotImplemented);
+  SendResponse(error_.empty());
+  return false;
+}
+
+void LogPrivateGetHistoricalFunction::OnSystemLogsLoaded(
+    scoped_ptr<chromeos::SystemLogsResponse> sys_info) {
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/api/log_private/syslog_parser.cc b/chrome/browser/extensions/api/log_private/syslog_parser.cc
new file mode 100644
index 0000000..5479886
--- /dev/null
+++ b/chrome/browser/extensions/api/log_private/syslog_parser.cc
@@ -0,0 +1,144 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/log_private/syslog_parser.h"
+
+#include <string>
+#include <vector>
+
+#include "base/logging.h"
+#include "base/memory/linked_ptr.h"
+#include "base/memory/singleton.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
+#include "base/strings/string_tokenizer.h"
+#include "base/time/time.h"
+#include "chrome/browser/extensions/api/log_private/filter_handler.h"
+#include "chrome/browser/extensions/api/log_private/log_parser.h"
+#include "chrome/browser/extensions/api/log_private/log_private_api.h"
+#include "chrome/common/extensions/api/log_private.h"
+
+namespace extensions {
+
+namespace {
+
+const int kExpectedTimeTokenNum = 7;
+const char kLogEntryDelimiters[] = "-:T";
+const char kProcessInfoDelimiters[] = "[]";
+
+}  // namespace
+
+SyslogParser::SyslogParser() {}
+
+SyslogParser::~SyslogParser() {}
+
+SyslogParser::Error SyslogParser::ParseEntry(
+    const std::string& input,
+    std::vector<linked_ptr<api::log_private::LogEntry> >* output,
+    FilterHandler* filter_handler) const {
+  linked_ptr<api::log_private::LogEntry> entry(new api::log_private::LogEntry);
+
+  base::StringTokenizer tokenizer(input, " ");
+  if (!tokenizer.GetNext()) {
+    LOG(ERROR)
+        << "Error when parsing data. Expect: At least 3 tokens. Actual: 0";
+    return TOKENIZE_ERROR;
+  }
+  std::string time = tokenizer.token();
+  if (ParseTime(time, &(entry->timestamp)) != SyslogParser::SUCCESS) {
+    return SyslogParser::PARSE_ERROR;
+  }
+  // Skips "localhost" field.
+  if (!tokenizer.GetNext()) {
+    LOG(ERROR)
+        << "Error when parsing data. Expect: At least 3 tokens. Actual: 1";
+    return TOKENIZE_ERROR;
+  }
+  if (!tokenizer.GetNext()) {
+    LOG(ERROR)
+        << "Error when parsing data. Expect: At least 3 tokens. Actual: 2";
+    return TOKENIZE_ERROR;
+  }
+  ParseProcess(tokenizer.token(), entry.get());
+  ParseLevel(input, entry.get());
+  entry->full_entry = input;
+
+  if (filter_handler->IsValidLogEntry(*(entry.get()))) {
+    output->push_back(entry);
+  }
+
+  return SyslogParser::SUCCESS;
+}
+
+SyslogParser::Error ParseTimeHelper(base::StringTokenizer* tokenizer,
+                                    std::string* output) {
+  if (!tokenizer->GetNext()) {
+    LOG(ERROR) << "Error when parsing time";
+    return SyslogParser::PARSE_ERROR;
+  }
+  *output = tokenizer->token();
+  return SyslogParser::SUCCESS;
+}
+
+SyslogParser::Error SyslogParser::ParseTime(const std::string& input,
+                                            double* output) const {
+  base::StringTokenizer tokenizer(input, kLogEntryDelimiters);
+  std::string tokens[kExpectedTimeTokenNum];
+  for (int i = 0; i < kExpectedTimeTokenNum; i++) {
+    if (ParseTimeHelper(&tokenizer, &(tokens[i])) != SyslogParser::SUCCESS)
+      return SyslogParser::PARSE_ERROR;
+  }
+
+  std::string buffer = tokens[1] + '-' + tokens[2] + '-' + tokens[0] + ' ' +
+                       tokens[3] + ':' + tokens[4] + ":00";
+
+  base::Time parsed_time;
+  if (!base::Time::FromString(buffer.c_str(), &parsed_time)) {
+    LOG(ERROR) << "Error when parsing time";
+    return SyslogParser::PARSE_ERROR;
+  }
+
+  double seconds;
+  base::StringToDouble(tokens[5], &seconds);
+  *output = parsed_time.ToJsTime() +
+            (seconds * base::Time::kMillisecondsPerSecond);
+
+  return SyslogParser::SUCCESS;
+}
+
+SyslogParser::Error SyslogParser::ParseProcess(
+    const std::string& input,
+    api::log_private::LogEntry* entry) const {
+  base::StringTokenizer tokenizer(input, kProcessInfoDelimiters);
+  if (!tokenizer.GetNext()) {
+    LOG(ERROR)
+        << "Error when parsing data. Expect: At least 1 token. Actual: 0";
+    return SyslogParser::PARSE_ERROR;
+  }
+  entry->process = tokenizer.token();
+  entry->process_id = "unknown";
+  if (tokenizer.GetNext()) {
+    std::string token = tokenizer.token();
+    int tmp;
+    if (base::StringToInt(token, &tmp)) {
+      entry->process_id = token;
+    }
+  }
+  return SyslogParser::SUCCESS;
+}
+
+void SyslogParser::ParseLevel(const std::string& input,
+                              api::log_private::LogEntry* entry) const {
+  if (input.find("ERROR") != std::string::npos) {
+    entry->level = "error";
+  } else if (input.find("WARN") != std::string::npos) {
+    entry->level = "warning";
+  } else if (input.find("INFO") != std::string::npos) {
+    entry->level = "info";
+  } else {
+    entry->level = "unknown";
+  }
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/api/log_private/syslog_parser.h b/chrome/browser/extensions/api/log_private/syslog_parser.h
new file mode 100644
index 0000000..b746334
--- /dev/null
+++ b/chrome/browser/extensions/api/log_private/syslog_parser.h
@@ -0,0 +1,46 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_SYSLOG_PARSER_H_
+#define CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_SYSLOG_PARSER_H_
+
+#include <string>
+#include <vector>
+
+#include "base/memory/linked_ptr.h"
+#include "chrome/browser/extensions/api/log_private/log_parser.h"
+#include "chrome/common/extensions/api/log_private.h"
+
+namespace extensions {
+
+// A parser that parses syslog into LogEntry objects.
+class SyslogParser : public LogParser {
+ public:
+  SyslogParser();
+  virtual ~SyslogParser();
+
+ protected:
+  // Parses one line log text into a LogEntry object.
+  virtual Error ParseEntry(
+      const std::string& input,
+      std::vector<linked_ptr<api::log_private::LogEntry> >* output,
+      FilterHandler* filter_handler) const
+      OVERRIDE;
+
+ private:
+  // Parses time token and get time in milliseconds.
+  Error ParseTime(const std::string& input, double* output) const;
+  // Parses process token and get process name and ID.
+  Error ParseProcess(const std::string& input,
+                     api::log_private::LogEntry* entry) const;
+  // Parses level token and get log level.
+  void ParseLevel(const std::string& input,
+                  api::log_private::LogEntry* entry) const;
+
+  DISALLOW_COPY_AND_ASSIGN(SyslogParser);
+};
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_EXTENSIONS_API_LOG_PRIVATE_SYSLOG_PARSER_H_
diff --git a/chrome/browser/extensions/api/log_private/syslog_parser_unittest.cc b/chrome/browser/extensions/api/log_private/syslog_parser_unittest.cc
new file mode 100644
index 0000000..2c0b8f0
--- /dev/null
+++ b/chrome/browser/extensions/api/log_private/syslog_parser_unittest.cc
@@ -0,0 +1,55 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <stdio.h>
+#include <string>
+#include <vector>
+
+#include "base/json/json_writer.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/values.h"
+#include "chrome/browser/extensions/api/log_private/filter_handler.h"
+#include "chrome/browser/extensions/api/log_private/log_private_api.h"
+#include "chrome/browser/extensions/api/log_private/syslog_parser.h"
+#include "chrome/common/extensions/api/log_private.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace extensions {
+namespace {
+
+const char kShillLogEntry[] =
+    "2013-07-08T11:28:12.440308-07:00 localhost shill:"
+    "[0708/112812:ERROR:manager.cc(480)] Skipping unload of service";
+
+const char kWpaSupplicantLogEntry[] =
+    "2013-07-08T12:39:07.443100-07:00 localhost wpa_supplicant[894]:"
+    "dbus: Failed to construct signal";
+
+}  // namespace
+
+class ExtensionSyslogParserTest : public testing::Test {
+};
+
+TEST_F(ExtensionSyslogParserTest, ParseLog) {
+  std::vector<linked_ptr<api::log_private::LogEntry> > output;
+  api::log_private::Filter filter;
+  FilterHandler filter_handler(filter);
+  SyslogParser p;
+  // Test shill log
+  p.Parse(kShillLogEntry, &output, &filter_handler);
+  EXPECT_STREQ(output[0]->level.c_str(), "error");
+  EXPECT_STREQ(output[0]->process.c_str(), "shill:");
+  EXPECT_STREQ(output[0]->process_id.c_str(), "unknown");
+  EXPECT_STREQ(output[0]->full_entry.c_str(), kShillLogEntry);
+  EXPECT_EQ(output[0]->timestamp, 1373308092440.308);
+  // Test WpaSupplicant log
+  p.Parse(kWpaSupplicantLogEntry, &output, &filter_handler);
+  EXPECT_STREQ(output[1]->level.c_str(), "unknown");
+  EXPECT_STREQ(output[1]->process.c_str(), "wpa_supplicant");
+  EXPECT_STREQ(output[1]->process_id.c_str(), "894");
+  EXPECT_STREQ(output[1]->full_entry.c_str(), kWpaSupplicantLogEntry);
+  EXPECT_EQ(output[1]->timestamp, 1373312347443.1);
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/api/push_messaging/push_messaging_apitest.cc b/chrome/browser/extensions/api/push_messaging/push_messaging_apitest.cc
index c766c21..6e98160 100644
--- a/chrome/browser/extensions/api/push_messaging/push_messaging_apitest.cc
+++ b/chrome/browser/extensions/api/push_messaging/push_messaging_apitest.cc
@@ -4,12 +4,12 @@
 
 #include "chrome/browser/extensions/api/push_messaging/push_messaging_api.h"
 
+#include "apps/launcher.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler.h"
 #include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_mapper.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/extensions/extension_test_message_listener.h"
-#include "chrome/browser/extensions/platform_app_launcher.h"
 #include "chrome/browser/invalidation/fake_invalidation_service.h"
 #include "chrome/browser/invalidation/invalidation_service.h"
 #include "chrome/browser/invalidation/invalidation_service_factory.h"
diff --git a/chrome/browser/extensions/api/system_cpu/cpu_info_provider.cc b/chrome/browser/extensions/api/system_cpu/cpu_info_provider.cc
index 6da7357..bdadfbf 100644
--- a/chrome/browser/extensions/api/system_cpu/cpu_info_provider.cc
+++ b/chrome/browser/extensions/api/system_cpu/cpu_info_provider.cc
@@ -11,9 +11,8 @@
 using api::system_cpu::CpuInfo;
 
 // Static member intialization.
-template<>
-base::LazyInstance<scoped_refptr<SystemInfoProvider<CpuInfo> > >
-  SystemInfoProvider<CpuInfo>::provider_ = LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<scoped_refptr<CpuInfoProvider> >
+    CpuInfoProvider::provider_ = LAZY_INSTANCE_INITIALIZER;
 
 CpuInfoProvider::CpuInfoProvider() {}
 
@@ -23,6 +22,12 @@
   return info_;
 }
 
+void CpuInfoProvider::InitializeForTesting(
+    scoped_refptr<CpuInfoProvider> provider) {
+  DCHECK(provider.get() != NULL);
+  provider_.Get() = provider;
+}
+
 bool CpuInfoProvider::QueryInfo() {
   info_.num_of_processors = base::SysInfo::NumberOfProcessors();
   info_.arch_name = base::SysInfo::OperatingSystemArchitecture();
@@ -32,7 +37,9 @@
 
 // static
 CpuInfoProvider* CpuInfoProvider::Get() {
-  return CpuInfoProvider::GetInstance<CpuInfoProvider>();
+  if (provider_.Get().get() == NULL)
+    provider_.Get() = new CpuInfoProvider();
+  return provider_.Get();
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/system_cpu/cpu_info_provider.h b/chrome/browser/extensions/api/system_cpu/cpu_info_provider.h
index 0381cbd..2dafa31 100644
--- a/chrome/browser/extensions/api/system_cpu/cpu_info_provider.h
+++ b/chrome/browser/extensions/api/system_cpu/cpu_info_provider.h
@@ -1,35 +1,48 @@
 // Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+
 #ifndef CHROME_BROWSER_EXTENSIONS_API_SYSTEM_CPU_CPU_INFO_PROVIDER_H_
 #define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_CPU_CPU_INFO_PROVIDER_H_
 
+#include "base/lazy_instance.h"
 #include "chrome/browser/extensions/api/system_info/system_info_provider.h"
 #include "chrome/common/extensions/api/system_cpu.h"
 
 namespace extensions {
 
-class CpuInfoProvider
-    : public SystemInfoProvider<api::system_cpu::CpuInfo> {
+class CpuInfoProvider : public SystemInfoProvider {
  public:
-  // Overriden from SystemInfoProvider<CpuInfo>.
-  virtual bool QueryInfo() OVERRIDE;
-
   // Return the single shared instance of CpuInfoProvider.
   static CpuInfoProvider* Get();
 
   const api::system_cpu::CpuInfo& cpu_info() const;
 
+  static void InitializeForTesting(scoped_refptr<CpuInfoProvider> provider);
+
  private:
-  friend class SystemInfoProvider<api::system_cpu::CpuInfo>;
   friend class MockCpuInfoProviderImpl;
 
   CpuInfoProvider();
-
   virtual ~CpuInfoProvider();
+
+  // Overriden from SystemInfoProvider.
+  virtual bool QueryInfo() OVERRIDE;
+
+  // The last information filled up by QueryInfo and is accessed on multiple
+  // threads, but the whole class is being guarded by SystemInfoProvider base
+  // class.
+  //
+  // |info_| is accessed on the UI thread while |is_waiting_for_completion_| is
+  // false and on the sequenced worker pool while |is_waiting_for_completion_|
+  // is true.
+  api::system_cpu::CpuInfo info_;
+
+  static base::LazyInstance<scoped_refptr<CpuInfoProvider> > provider_;
+
+  DISALLOW_COPY_AND_ASSIGN(CpuInfoProvider);
 };
 
 }  // namespace extensions
 
 #endif  // CHROME_BROWSER_EXTENSIONS_API_SYSTEM_CPU_CPU_INFO_PROVIDER_H_
-
diff --git a/chrome/browser/extensions/api/system_display/display_info_provider.cc b/chrome/browser/extensions/api/system_display/display_info_provider.cc
index c97435e..e01bb72 100644
--- a/chrome/browser/extensions/api/system_display/display_info_provider.cc
+++ b/chrome/browser/extensions/api/system_display/display_info_provider.cc
@@ -6,19 +6,31 @@
 
 namespace extensions {
 
+DisplayInfoProvider::DisplayInfoProvider() {
+}
+
+DisplayInfoProvider::~DisplayInfoProvider() {
+}
+
 // Static member intialization.
-template<>
-base::LazyInstance<scoped_refptr<SystemInfoProvider<DisplayInfo> > >
-  SystemInfoProvider<DisplayInfo>::provider_ = LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<scoped_refptr<DisplayInfoProvider > >
+    DisplayInfoProvider::provider_ = LAZY_INSTANCE_INITIALIZER;
 
 const DisplayInfo& DisplayInfoProvider::display_info() const {
   return info_;
 }
 
+void DisplayInfoProvider::InitializeForTesting(
+    scoped_refptr<DisplayInfoProvider> provider) {
+  DCHECK(provider.get() != NULL);
+  provider_.Get() = provider;
+}
+
 // static
-DisplayInfoProvider* DisplayInfoProvider::GetProvider() {
-  return DisplayInfoProvider::GetInstance<DisplayInfoProvider>();
+DisplayInfoProvider* DisplayInfoProvider::Get() {
+  if (provider_.Get().get() == NULL)
+    provider_.Get() = new DisplayInfoProvider();
+  return provider_.Get();
 }
 
 }  // namespace extensions
-
diff --git a/chrome/browser/extensions/api/system_display/display_info_provider.h b/chrome/browser/extensions/api/system_display/display_info_provider.h
index 037b5f1..ac9c654 100644
--- a/chrome/browser/extensions/api/system_display/display_info_provider.h
+++ b/chrome/browser/extensions/api/system_display/display_info_provider.h
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "base/lazy_instance.h"
 #include "chrome/browser/extensions/api/system_info/system_info_provider.h"
 #include "chrome/common/extensions/api/system_display.h"
 
@@ -15,7 +16,7 @@
 typedef std::vector<linked_ptr<
     api::system_display::DisplayUnitInfo> > DisplayInfo;
 
-class DisplayInfoProvider : public SystemInfoProvider<DisplayInfo> {
+class DisplayInfoProvider : public SystemInfoProvider {
  public:
   typedef base::Callback<void(bool success)>
       RequestInfoCallback;
@@ -23,7 +24,7 @@
       SetInfoCallback;
 
   // Gets a DisplayInfoProvider instance.
-  static DisplayInfoProvider* GetProvider();
+  static DisplayInfoProvider* Get();
 
   // Starts request for the display info, redirecting the request to a worker
   // thread if needed (using SystemInfoProvider<DisplayInfo>::StartQuery()).
@@ -44,15 +45,27 @@
 
   const DisplayInfo& display_info() const;
 
+  static void InitializeForTesting(scoped_refptr<DisplayInfoProvider> provider);
+
  protected:
-  // Overriden from SystemInfoProvider<DisplayInfo>.
+  DisplayInfoProvider();
+  virtual ~DisplayInfoProvider();
+
+  // The last information filled up by QueryInfo and is accessed on multiple
+  // threads, but the whole class is being guarded by SystemInfoProvider base
+  // class.
+  //
+  // |info_| is accessed on the UI thread while |is_waiting_for_completion_| is
+  // false and on the sequenced worker pool while |is_waiting_for_completion_|
+  // is true.
+  DisplayInfo info_;
+
+ private:
+  // Overriden from SystemInfoProvider.
   // The implementation is platform specific.
   virtual bool QueryInfo() OVERRIDE;
 
-  friend class SystemInfoProvider<DisplayInfo>;
-
-  DisplayInfoProvider() {}
-  virtual ~DisplayInfoProvider() {}
+  static base::LazyInstance<scoped_refptr<DisplayInfoProvider> > provider_;
 
   DISALLOW_COPY_AND_ASSIGN(DisplayInfoProvider);
 };
diff --git a/chrome/browser/extensions/api/system_display/display_info_provider_chromeos_unittest.cc b/chrome/browser/extensions/api/system_display/display_info_provider_chromeos_unittest.cc
index 5960313..e7a68e5 100644
--- a/chrome/browser/extensions/api/system_display/display_info_provider_chromeos_unittest.cc
+++ b/chrome/browser/extensions/api/system_display/display_info_provider_chromeos_unittest.cc
@@ -20,7 +20,7 @@
 
 void BindRequestDisplayInfoResult(DisplayInfo* target, bool success) {
   ASSERT_TRUE(success);
-  *target = DisplayInfoProvider::GetProvider()->display_info();
+  *target = DisplayInfoProvider::Get()->display_info();
 }
 
 void BindSetDisplayUnitInfoResult(bool* success,
@@ -39,7 +39,7 @@
 
  protected:
   void CallRequestDisplayInfo(DisplayInfo* result) {
-    DisplayInfoProvider::GetProvider()->RequestInfo(
+    DisplayInfoProvider::Get()->RequestInfo(
         base::Bind(&BindRequestDisplayInfoResult, result));
     RunAllPendingInMessageLoop();
   }
@@ -49,7 +49,7 @@
       const api::system_display::DisplayProperties& info,
       bool* success,
       std::string* error) {
-    DisplayInfoProvider::GetProvider()->SetInfo(display_id, info,
+    DisplayInfoProvider::Get()->SetInfo(display_id, info,
         base::Bind(&BindSetDisplayUnitInfoResult, success, error));
     RunAllPendingInMessageLoop();
   }
diff --git a/chrome/browser/extensions/api/system_display/system_display_api.cc b/chrome/browser/extensions/api/system_display/system_display_api.cc
index 8819a8c..36dd2f2 100644
--- a/chrome/browser/extensions/api/system_display/system_display_api.cc
+++ b/chrome/browser/extensions/api/system_display/system_display_api.cc
@@ -14,7 +14,7 @@
 namespace SetDisplayProperties = api::system_display::SetDisplayProperties;
 
 bool SystemDisplayGetInfoFunction::RunImpl() {
-  DisplayInfoProvider::GetProvider()->RequestInfo(
+  DisplayInfoProvider::Get()->RequestInfo(
       base::Bind(
           &SystemDisplayGetInfoFunction::OnGetDisplayInfoCompleted,
           this));
@@ -25,7 +25,7 @@
     bool success) {
   if (success) {
     results_ = api::system_display::GetInfo::Results::Create(
-                   DisplayInfoProvider::GetProvider()->display_info());
+                   DisplayInfoProvider::Get()->display_info());
   } else {
     SetError("Error occurred when querying display information.");
   }
@@ -44,7 +44,7 @@
 
   scoped_ptr<SetDisplayProperties::Params> params(
       SetDisplayProperties::Params::Create(*args_));
-  DisplayInfoProvider::GetProvider()->SetInfo(params->id, params->info,
+  DisplayInfoProvider::Get()->SetInfo(params->id, params->info,
       base::Bind(
           &SystemDisplaySetDisplayPropertiesFunction::OnPropertiesSet,
           this));
diff --git a/chrome/browser/extensions/api/system_info/system_info_provider.cc b/chrome/browser/extensions/api/system_info/system_info_provider.cc
new file mode 100644
index 0000000..07f233b
--- /dev/null
+++ b/chrome/browser/extensions/api/system_info/system_info_provider.cc
@@ -0,0 +1,65 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/system_info/system_info_provider.h"
+
+namespace extensions {
+
+SystemInfoProvider::SystemInfoProvider()
+    : is_waiting_for_completion_(false) {
+  base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
+  worker_pool_ = pool->GetSequencedTaskRunnerWithShutdownBehavior(
+      pool->GetSequenceToken(),
+      base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
+}
+
+SystemInfoProvider::~SystemInfoProvider() {}
+
+void SystemInfoProvider::PrepareQueryOnUIThread() {}
+
+void SystemInfoProvider::InitializeProvider(const base::Closure&
+    do_query_info_callback) {
+  do_query_info_callback.Run();
+}
+
+void SystemInfoProvider::StartQueryInfo(
+    const QueryInfoCompletionCallback& callback) {
+  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+  DCHECK(!callback.is_null());
+
+  callbacks_.push(callback);
+
+  if (is_waiting_for_completion_)
+    return;
+
+  is_waiting_for_completion_ = true;
+
+  InitializeProvider(base::Bind(
+      &SystemInfoProvider::StartQueryInfoPostInitialization, this));
+}
+
+void SystemInfoProvider::OnQueryCompleted(bool success) {
+  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+
+  while (!callbacks_.empty()) {
+    QueryInfoCompletionCallback callback = callbacks_.front();
+    callback.Run(success);
+    callbacks_.pop();
+  }
+
+  is_waiting_for_completion_ = false;
+}
+
+void SystemInfoProvider::StartQueryInfoPostInitialization() {
+  PrepareQueryOnUIThread();
+  // Post the custom query info task to blocking pool for information querying
+  // and reply with OnQueryCompleted.
+  base::PostTaskAndReplyWithResult(
+      worker_pool_,
+      FROM_HERE,
+      base::Bind(&SystemInfoProvider::QueryInfo, this),
+      base::Bind(&SystemInfoProvider::OnQueryCompleted, this));
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/api/system_info/system_info_provider.h b/chrome/browser/extensions/api/system_info/system_info_provider.h
index 0215820..84dbb80 100644
--- a/chrome/browser/extensions/api/system_info/system_info_provider.h
+++ b/chrome/browser/extensions/api/system_info/system_info_provider.h
@@ -1,6 +1,7 @@
 // Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+
 #ifndef CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_SYSTEM_INFO_PROVIDER_H_
 #define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_SYSTEM_INFO_PROVIDER_H_
 
@@ -8,16 +9,16 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/lazy_instance.h"
 #include "base/memory/ref_counted.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "content/public/browser/browser_thread.h"
 
 namespace extensions {
 
-// A generic template for all kinds of system information providers. Each kind
-// of SystemInfoProvider is a single shared instance. It is created if needed,
-// and destroyed at exit time. This is done via LazyInstance and scoped_refptr.
+// An abstract base class for all kinds of system information providers. Each
+// kind of SystemInfoProvider is a single shared instance. It is created if
+// needed, and destroyed at exit time. This is done via LazyInstance and
+// scoped_refptr.
 //
 // The SystemInfoProvider is designed to query system information on the worker
 // pool. It also maintains a queue of callbacks on the UI thread which are
@@ -27,18 +28,10 @@
 // of query requests, e.g. calling systemInfo.cpu.get repeatedly in an
 // extension process.
 //
-// Template parameter T is the system information type. It could be the
-// structure type generated by IDL parser.
-//
-// The class member |info_| is accessed on multiple threads, but that the whole
-// class is being guarded by SystemInfoProvider.
-//
-// |info_| is accessed on the UI thread while |is_waiting_for_completion_| is
-// false and on the sequenced worker pool while |is_waiting_for_completion_| is
-// true.
-template<class T>
+// Each kind of SystemInfoProvider should satisfy an API query in a subclass on
+// the blocking pool.
 class SystemInfoProvider
-    : public base::RefCountedThreadSafe<SystemInfoProvider<T> > {
+    : public base::RefCountedThreadSafe<SystemInfoProvider> {
  public:
   // Callback type for completing to get information. The argument indicates
   // whether its contents are valid, for example, no error occurs in querying
@@ -46,38 +39,21 @@
   typedef base::Callback<void(bool)> QueryInfoCompletionCallback;
   typedef std::queue<QueryInfoCompletionCallback> CallbackQueue;
 
-  SystemInfoProvider()
-    : is_waiting_for_completion_(false) {
-    base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
-    worker_pool_ = pool->GetSequencedTaskRunnerWithShutdownBehavior(
-                       pool->GetSequenceToken(),
-                       base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
-  }
-
-  virtual ~SystemInfoProvider() {}
+  SystemInfoProvider();
 
   // Override to do any prepare work on UI thread before |QueryInfo()| gets
   // called.
-  virtual void PrepareQueryOnUIThread() {}
+  virtual void PrepareQueryOnUIThread();
 
-  // The parameter |do_query_info_callback| is query info task which is posts to
-  // SystemInfoProvider sequenced worker pool.
+  // The parameter |do_query_info_callback| is query info task which is posted
+  // to SystemInfoProvider sequenced worker pool.
   //
   // You can do any initial things of *InfoProvider before start to query info.
   // While overriding this method, |do_query_info_callback| *must* be called
   // directly or indirectly.
   //
   // Sample usage please refer to StorageInfoProvider.
-  virtual void InitializeProvider(const base::Closure& do_query_info_callback) {
-    do_query_info_callback.Run();
-  }
-
-  // For testing
-  static void InitializeForTesting(
-      scoped_refptr<SystemInfoProvider<T> > provider) {
-    DCHECK(provider.get() != NULL);
-    provider_.Get() = provider;
-  }
+  virtual void InitializeProvider(const base::Closure& do_query_info_callback);
 
   // Start to query the system information. Should be called on UI thread.
   // The |callback| will get called once the query is completed.
@@ -85,70 +61,24 @@
   // If the parameter |callback| itself calls StartQueryInfo(callback2),
   // callback2 will be called immediately rather than triggering another call to
   // the system.
-  void StartQueryInfo(const QueryInfoCompletionCallback& callback) {
-    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-    DCHECK(!callback.is_null());
-
-    callbacks_.push(callback);
-
-    if (is_waiting_for_completion_)
-      return;
-
-    is_waiting_for_completion_ = true;
-
-    InitializeProvider(base::Bind(
-          &SystemInfoProvider<T>::StartQueryInfoPostInitialization, this));
-  }
+  void StartQueryInfo(const QueryInfoCompletionCallback& callback);
 
  protected:
-  // Query the system information synchronously and put the result into |info_|.
+  virtual ~SystemInfoProvider();
+
+ private:
+  friend class base::RefCountedThreadSafe<SystemInfoProvider>;
+
+  // Interface to query the system information synchronously.
   // Return true if no error occurs.
   // Should be called in the blocking pool.
   virtual bool QueryInfo() = 0;
 
-  // Template function for creating the single shared provider instance.
-  // Template paramter I is the type of SystemInfoProvider implementation.
-  template<class I>
-  static I* GetInstance() {
-    if (!provider_.Get().get())
-      provider_.Get() = new I();
-    return static_cast<I*>(provider_.Get().get());
-  }
-
-  // The latest information filled up by QueryInfo implementation. Here we
-  // assume the T is disallowed to copy constructor, aligns with the structure
-  // type generated by IDL parser.
-  T info_;
-
- private:
   // Called on UI thread. The |success| parameter means whether it succeeds
   // to get the information.
-  void OnQueryCompleted(bool success) {
-    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+  void OnQueryCompleted(bool success);
 
-    while (!callbacks_.empty()) {
-      QueryInfoCompletionCallback callback = callbacks_.front();
-      callback.Run(success);
-      callbacks_.pop();
-    }
-
-    is_waiting_for_completion_ = false;
-  }
-
-  void StartQueryInfoPostInitialization() {
-    PrepareQueryOnUIThread();
-    // Post the custom query info task to blocking pool for information querying
-    // and reply with OnQueryCompleted.
-    base::PostTaskAndReplyWithResult(
-        worker_pool_,
-        FROM_HERE,
-        base::Bind(&SystemInfoProvider<T>::QueryInfo, this),
-        base::Bind(&SystemInfoProvider<T>::OnQueryCompleted, this));
-  }
-
-  // The single shared provider instance. We create it only when needed.
-  static typename base::LazyInstance<
-      scoped_refptr<SystemInfoProvider<T> > > provider_;
+  void StartQueryInfoPostInitialization();
 
   // The queue of callbacks waiting for the info querying completion. It is
   // maintained on the UI thread.
@@ -161,7 +91,7 @@
   // executed in order.
   scoped_refptr<base::SequencedTaskRunner> worker_pool_;
 
-  DISALLOW_COPY_AND_ASSIGN(SystemInfoProvider<T>);
+  DISALLOW_COPY_AND_ASSIGN(SystemInfoProvider);
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/system_memory/memory_info_provider.cc b/chrome/browser/extensions/api/system_memory/memory_info_provider.cc
index 0858183..ae5f7a7 100644
--- a/chrome/browser/extensions/api/system_memory/memory_info_provider.cc
+++ b/chrome/browser/extensions/api/system_memory/memory_info_provider.cc
@@ -11,9 +11,8 @@
 using api::system_memory::MemoryInfo;
 
 // Static member intialization.
-template<>
-base::LazyInstance<scoped_refptr<SystemInfoProvider<MemoryInfo> > >
-  SystemInfoProvider<MemoryInfo>::provider_ = LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<scoped_refptr<MemoryInfoProvider> >
+    MemoryInfoProvider::provider_ = LAZY_INSTANCE_INITIALIZER;
 
 MemoryInfoProvider::MemoryInfoProvider() {}
 
@@ -23,17 +22,24 @@
   return info_;
 }
 
+void MemoryInfoProvider::InitializeForTesting(
+    scoped_refptr<MemoryInfoProvider> provider) {
+  DCHECK(provider.get() != NULL);
+  provider_.Get() = provider;
+}
+
 bool MemoryInfoProvider::QueryInfo() {
   info_.capacity = static_cast<double>(base::SysInfo::AmountOfPhysicalMemory());
   info_.available_capacity =
-     static_cast<double>(base::SysInfo::AmountOfAvailablePhysicalMemory());
+      static_cast<double>(base::SysInfo::AmountOfAvailablePhysicalMemory());
   return true;
 }
 
 // static
 MemoryInfoProvider* MemoryInfoProvider::Get() {
-  return MemoryInfoProvider::GetInstance<MemoryInfoProvider>();
+  if (provider_.Get().get() == NULL)
+    provider_.Get() = new MemoryInfoProvider();
+  return provider_.Get();
 }
 
 }  // namespace extensions
-
diff --git a/chrome/browser/extensions/api/system_memory/memory_info_provider.h b/chrome/browser/extensions/api/system_memory/memory_info_provider.h
index 54d0449..f83dd79 100644
--- a/chrome/browser/extensions/api/system_memory/memory_info_provider.h
+++ b/chrome/browser/extensions/api/system_memory/memory_info_provider.h
@@ -5,32 +5,43 @@
 #ifndef CHROME_BROWSER_EXTENSIONS_API_SYSTEM_MEMORY_MEMORY_INFO_PROVIDER_H_
 #define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_MEMORY_MEMORY_INFO_PROVIDER_H_
 
+#include "base/lazy_instance.h"
 #include "chrome/browser/extensions/api/system_info/system_info_provider.h"
 #include "chrome/common/extensions/api/system_memory.h"
 
 namespace extensions {
 
-class MemoryInfoProvider
-    : public SystemInfoProvider<api::system_memory::MemoryInfo> {
+class MemoryInfoProvider : public SystemInfoProvider {
  public:
   static MemoryInfoProvider* Get();
 
-  // Overriden from SystemInfoProvider<MemoryInfo>.
-  virtual bool QueryInfo() OVERRIDE;
-
   const api::system_memory::MemoryInfo& memory_info() const;
 
+  static void InitializeForTesting(scoped_refptr<MemoryInfoProvider> provider);
+
  private:
-  friend class SystemInfoProvider<api::system_memory::MemoryInfo>;
   friend class MockMemoryInfoProviderImpl;
 
   MemoryInfoProvider();
   virtual ~MemoryInfoProvider();
 
+  // Overriden from SystemInfoProvider.
+  virtual bool QueryInfo() OVERRIDE;
+
+  // The last information filled up by QueryInfo and is accessed on multiple
+  // threads, but the whole class is being guarded by SystemInfoProvider base
+  // class.
+  //
+  // |info_| is accessed on the UI thread while |is_waiting_for_completion_| is
+  // false and on the sequenced worker pool while |is_waiting_for_completion_|
+  // is true.
+  api::system_memory::MemoryInfo info_;
+
+  static base::LazyInstance<scoped_refptr<MemoryInfoProvider> > provider_;
+
   DISALLOW_COPY_AND_ASSIGN(MemoryInfoProvider);
 };
 
 }  // namespace extensions
 
 #endif  // CHROME_BROWSER_EXTENSIONS_API_SYSTEM_MEMORY_MEMORY_INFO_PROVIDER_H_
-
diff --git a/chrome/browser/extensions/api/system_storage/storage_info_provider.cc b/chrome/browser/extensions/api/system_storage/storage_info_provider.cc
index 0138893..2f1b874 100644
--- a/chrome/browser/extensions/api/system_storage/storage_info_provider.cc
+++ b/chrome/browser/extensions/api/system_storage/storage_info_provider.cc
@@ -38,10 +38,8 @@
 const char kWatchingTokenName[] = "_storage_info_watching_token_";
 
 // Static member intialization.
-template<>
-base::LazyInstance<scoped_refptr<SystemInfoProvider<StorageUnitInfoList> > >
-  SystemInfoProvider<StorageUnitInfoList>::provider_
-      = LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<scoped_refptr<StorageInfoProvider> >
+    StorageInfoProvider::provider_ = LAZY_INSTANCE_INITIALIZER;
 
 StorageInfoProvider::StorageInfoProvider()
     : observers_(new ObserverListThreadSafe<StorageFreeSpaceObserver>()),
@@ -60,6 +58,12 @@
   return info_;
 }
 
+void StorageInfoProvider::InitializeForTesting(
+    scoped_refptr<StorageInfoProvider> provider) {
+  DCHECK(provider.get() != NULL);
+  provider_.Get() = provider;
+}
+
 void StorageInfoProvider::PrepareQueryOnUIThread() {
   // Get all available storage devices before invoking |QueryInfo()|.
   GetAllStoragesIntoInfoList();
@@ -150,7 +154,7 @@
        it != storage_list.end(); ++it) {
     if (device_id == it->device_id())
       return base::SysInfo::AmountOfFreeDiskSpace(
-                 base::FilePath(it->location()));
+          base::FilePath(it->location()));
   }
 
   return -1;
@@ -260,7 +264,9 @@
 
 // static
 StorageInfoProvider* StorageInfoProvider::Get() {
-  return StorageInfoProvider::GetInstance<StorageInfoProvider>();
+  if (provider_.Get().get() == NULL)
+    provider_.Get() = new StorageInfoProvider();
+  return provider_.Get();
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/system_storage/storage_info_provider.h b/chrome/browser/extensions/api/system_storage/storage_info_provider.h
index 33c8c67..2dc96f5 100644
--- a/chrome/browser/extensions/api/system_storage/storage_info_provider.h
+++ b/chrome/browser/extensions/api/system_storage/storage_info_provider.h
@@ -7,6 +7,7 @@
 
 #include <set>
 
+#include "base/lazy_instance.h"
 #include "base/memory/ref_counted.h"
 #include "base/observer_list_threadsafe.h"
 #include "base/timer/timer.h"
@@ -33,12 +34,8 @@
     api::system_storage::StorageUnitInfo> >
         StorageUnitInfoList;
 
-class StorageInfoProvider : public SystemInfoProvider<StorageUnitInfoList> {
+class StorageInfoProvider : public SystemInfoProvider {
  public:
-  StorageInfoProvider();
-
-  explicit StorageInfoProvider(size_t watching_interval);
-
   // Get the single shared instance of StorageInfoProvider.
   static StorageInfoProvider* Get();
 
@@ -65,12 +62,26 @@
 
   const StorageUnitInfoList& storage_unit_info_list() const;
 
+  static void InitializeForTesting(scoped_refptr<StorageInfoProvider> provider);
+
  protected:
+  StorageInfoProvider();
+  explicit StorageInfoProvider(size_t watching_interval);
+
   virtual ~StorageInfoProvider();
 
   // Put all available storages' information into |info_|.
   void GetAllStoragesIntoInfoList();
 
+  // The last information filled up by QueryInfo and is accessed on multiple
+  // threads, but the whole class is being guarded by SystemInfoProvider base
+  // class.
+  //
+  // |info_| is accessed on the UI thread while |is_waiting_for_completion_| is
+  // false and on the sequenced worker pool while |is_waiting_for_completion_|
+  // is true.
+  StorageUnitInfoList info_;
+
  private:
   typedef std::map<std::string, double> StorageTransientIdToSizeMap;
 
@@ -114,6 +125,10 @@
   // The time interval for watching the free space change, in milliseconds.
   // Only changed for testing purposes.
   size_t watching_interval_;
+
+  static base::LazyInstance<scoped_refptr<StorageInfoProvider> > provider_;
+
+  DISALLOW_COPY_AND_ASSIGN(StorageInfoProvider);
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
index be4a079..490abfd 100644
--- a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
+++ b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
@@ -146,7 +146,7 @@
 }
 
 // http://crbug.com/177163
-#if defined(OS_WIN) && !defined(NDEBUG)
+#if defined(OS_WIN)
 #define MAYBE_ActiveTabPermission DISABLED_ActiveTabPermission
 #else
 #define MAYBE_ActiveTabPermission ActiveTabPermission
diff --git a/chrome/browser/extensions/api/usb/OWNERS b/chrome/browser/extensions/api/usb/OWNERS
new file mode 100644
index 0000000..2adeca5
--- /dev/null
+++ b/chrome/browser/extensions/api/usb/OWNERS
@@ -0,0 +1,3 @@
+# USB API members. For core API change, check with owners in
+# chrome/browser/extensions/OWNERS
+ikarienator@chromium.org
diff --git a/chrome/browser/extensions/extension_function_histogram_value.h b/chrome/browser/extensions/extension_function_histogram_value.h
index ab5ffc5..3408bd6 100644
--- a/chrome/browser/extensions/extension_function_histogram_value.h
+++ b/chrome/browser/extensions/extension_function_histogram_value.h
@@ -587,6 +587,7 @@
   RECOVERYPRIVATE_CANCELWRITE,
   RECOVERYPRIVATE_DESTROYPARTITIONS,
   FEEDBACKPRIVATE_GETSTRINGS,
+  LOGPRIVATE_GETHISTORICAL,
   ENUM_BOUNDARY // Last entry: Add new entries above.
 };
 
diff --git a/chrome/browser/extensions/extension_install_ui_browsertest.cc b/chrome/browser/extensions/extension_install_ui_browsertest.cc
index 4687be3..f38878b 100644
--- a/chrome/browser/extensions/extension_install_ui_browsertest.cc
+++ b/chrome/browser/extensions/extension_install_ui_browsertest.cc
@@ -50,12 +50,8 @@
   // Install the given theme from the data dir and verify expected name.
   void InstallThemeAndVerify(const char* theme_name,
                              const std::string& expected_name) {
-    // If there is already a theme installed, the current theme should be
-    // disabled and the new one installed + enabled.
-    int expected_change = GetTheme() ? 0 : 1;
     const base::FilePath theme_path = test_data_dir_.AppendASCII(theme_name);
-    ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(theme_path, expected_change,
-        browser()));
+    ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(theme_path, 1, browser()));
     const Extension* theme = GetTheme();
     ASSERT_TRUE(theme);
     ASSERT_EQ(theme->name(), expected_name);
@@ -92,7 +88,7 @@
   ASSERT_EQ(NULL, GetTheme());
 
   // Set the same theme twice and undo to verify we go back to default theme.
-  ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(theme_crx, 0, browser()));
+  ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(theme_crx, 1, browser()));
   theme = GetTheme();
   ASSERT_TRUE(theme);
   ASSERT_EQ(theme_id, theme->id());
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 87d18e9..4deba6c 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -59,13 +59,14 @@
 #include "chrome/browser/extensions/management_policy.h"
 #include "chrome/browser/extensions/pending_extension_manager.h"
 #include "chrome/browser/extensions/permissions_updater.h"
-#include "chrome/browser/extensions/platform_app_launcher.h"
 #include "chrome/browser/extensions/shell_window_registry.h"
 #include "chrome/browser/extensions/unpacked_installer.h"
 #include "chrome/browser/extensions/update_observer.h"
 #include "chrome/browser/extensions/updater/extension_updater.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/themes/theme_service.h"
+#include "chrome/browser/themes/theme_service_factory.h"
 #include "chrome/browser/ui/webui/favicon_source.h"
 #include "chrome/browser/ui/webui/ntp/thumbnail_source.h"
 #include "chrome/browser/ui/webui/theme_source.h"
@@ -1143,6 +1144,16 @@
       content::Source<Profile>(profile_),
       content::Details<UnloadedExtensionInfo>(&details));
 
+#if defined(ENABLE_THEMES)
+  // If the current theme is being unloaded, tell ThemeService to revert back
+  // to the default theme.
+  if (reason != extension_misc::UNLOAD_REASON_UPDATE && extension->is_theme()) {
+    ThemeService* theme_service = ThemeServiceFactory::GetForProfile(profile_);
+    if (extension->id() == theme_service->GetThemeID())
+      theme_service->UseDefaultTheme();
+  }
+#endif
+
   for (content::RenderProcessHost::iterator i(
           content::RenderProcessHost::AllHostsIterator());
        !i.IsAtEnd(); i.Advance()) {
@@ -1972,6 +1983,15 @@
               extension_paths))) {
     NOTREACHED();
   }
+
+#if defined(ENABLE_THEMES)
+  // Also garbage-collect themes.  We check |profile_| to be
+  // defensive; in the future, we may call GarbageCollectExtensions()
+  // from somewhere other than Init() (e.g., in a timer).
+  if (profile_) {
+    ThemeServiceFactory::GetForProfile(profile_)->RemoveUnusedThemes();
+  }
+#endif
 }
 
 void ExtensionService::SyncExtensionChangeIfNeeded(const Extension& extension) {
@@ -2356,11 +2376,6 @@
                    << extensions::ManifestURL::GetUpdateURL(extension).spec()
                    << "; not installing";
 
-      content::NotificationService::current()->Notify(
-          chrome::NOTIFICATION_EXTENSION_INSTALL_NOT_ALLOWED,
-          content::Source<Profile>(profile_),
-          content::Details<const Extension>(extension));
-
       // Delete the extension directory since we're not going to
       // load it.
       if (!GetFileTaskRunner()->PostTask(
@@ -2563,6 +2578,20 @@
 
   AddExtension(extension);
 
+#if defined(ENABLE_THEMES)
+  // We do this here since AddExtension() is always called on browser startup,
+  // and we only really care about the last theme installed.
+  // If that ever changes and we have to move this code somewhere
+  // else, it should be somewhere that's not in the startup path.
+  if (extension->is_theme() && extensions_.GetByID(extension->id())) {
+    DCHECK_EQ(extensions_.GetByID(extension->id()), extension);
+    // Now that the theme extension is visible from outside the
+    // ExtensionService, notify the ThemeService about the
+    // newly-installed theme.
+    ThemeServiceFactory::GetForProfile(profile_)->SetTheme(extension);
+  }
+#endif
+
   // If this is a new external extension that was disabled, alert the user
   // so he can reenable it. We do this last so that it has already been
   // added to our list of extensions.
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 18a5652..bf6c949 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -837,9 +837,7 @@
         EXPECT_EQ(0u, loaded_.size()) << path.value();
       } else {
         EXPECT_EQ(1u, loaded_.size()) << path.value();
-        size_t actual_extension_count = service_->extensions()->size() +
-            service_->disabled_extensions()->size();
-        EXPECT_EQ(expected_extensions_count_, actual_extension_count) <<
+        EXPECT_EQ(expected_extensions_count_, service_->extensions()->size()) <<
             path.value();
         extension = loaded_[0].get();
         EXPECT_TRUE(service_->GetExtensionById(extension->id(), false))
@@ -2359,7 +2357,6 @@
 
 TEST_F(ExtensionServiceTest, InstallTheme) {
   InitializeEmptyExtensionService();
-  service_->Init();
 
   // A theme.
   base::FilePath path = data_dir_.AppendASCII("theme.crx");
@@ -2401,8 +2398,6 @@
 TEST_F(ExtensionServiceTest, LoadLocalizedTheme) {
   // Load.
   InitializeEmptyExtensionService();
-  service_->Init();
-
   base::FilePath extension_path = data_dir_
       .AppendASCII("theme_i18n");
 
@@ -2503,8 +2498,6 @@
 
 TEST_F(ExtensionServiceTest, InstallLocalizedTheme) {
   InitializeEmptyExtensionService();
-  service_->Init();
-
   base::FilePath theme_path = data_dir_
       .AppendASCII("theme_i18n");
 
diff --git a/chrome/browser/extensions/platform_app_browsertest.cc b/chrome/browser/extensions/platform_app_browsertest.cc
index a58a259..1f124a8 100644
--- a/chrome/browser/extensions/platform_app_browsertest.cc
+++ b/chrome/browser/extensions/platform_app_browsertest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "apps/launcher.h"
 #include "apps/native_app_window.h"
 #include "apps/shell_window.h"
 #include "base/bind.h"
@@ -27,7 +28,6 @@
 #include "chrome/browser/extensions/extension_system.h"
 #include "chrome/browser/extensions/extension_test_message_listener.h"
 #include "chrome/browser/extensions/platform_app_browsertest_util.h"
-#include "chrome/browser/extensions/platform_app_launcher.h"
 #include "chrome/browser/extensions/shell_window_registry.h"
 #include "chrome/browser/tab_contents/render_view_context_menu.h"
 #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/extensions/updater/OWNERS b/chrome/browser/extensions/updater/OWNERS
index 7f60b89..f433f3f 100644
--- a/chrome/browser/extensions/updater/OWNERS
+++ b/chrome/browser/extensions/updater/OWNERS
@@ -1,2 +1,3 @@
 asargent@chromium.org
 joaodasilva@chromium.org
+mek@chromium.org
diff --git a/chrome/browser/first_run/first_run.cc b/chrome/browser/first_run/first_run.cc
index 70fe2a6..e7a6fcc 100644
--- a/chrome/browser/first_run/first_run.cc
+++ b/chrome/browser/first_run/first_run.cc
@@ -393,7 +393,7 @@
               SigninTracker::GetSigninState(profile, NULL) !=
                   SigninTracker::SIGNIN_COMPLETE);
       bool is_promo_bubble_visible =
-          profile->GetPrefs()->GetBoolean(prefs::kSyncPromoShowNTPBubble);
+          profile->GetPrefs()->GetBoolean(prefs::kSignInPromoShowNTPBubble);
 
       if (is_promo_bubble_visible || signin_in_progress)
         return;
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 511f083..d096e43 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -816,6 +816,10 @@
 #if defined(OS_ANDROID) || defined(OS_IOS)
   registry->RegisterListPref(prefs::kDailyHttpOriginalContentLength);
   registry->RegisterListPref(prefs::kDailyHttpReceivedContentLength);
+  registry->RegisterListPref(
+      prefs::kDailyHttpReceivedContentLengthViaDataReductionProxy);
+  registry->RegisterListPref(
+      prefs::kDailyHttpReceivedContentLengthWithDataReductionProxyEnabled);
   registry->RegisterInt64Pref(prefs::kDailyHttpContentLengthLastUpdateDate, 0L);
 #endif
   registry->RegisterBooleanPref(prefs::kBuiltInDnsClientEnabled, true);
diff --git a/chrome/browser/managed_mode/managed_user_refresh_token_fetcher.cc b/chrome/browser/managed_mode/managed_user_refresh_token_fetcher.cc
index 5c5a1a6..4cd6258 100644
--- a/chrome/browser/managed_mode/managed_user_refresh_token_fetcher.cc
+++ b/chrome/browser/managed_mode/managed_user_refresh_token_fetcher.cc
@@ -7,9 +7,7 @@
 #include "base/callback.h"
 #include "base/json/json_reader.h"
 #include "base/logging.h"
-#include "base/strings/string16.h"
 #include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "chrome/browser/signin/oauth2_token_service.h"
 #include "google_apis/gaia/gaia_constants.h"
@@ -40,7 +38,6 @@
     "&scope=%s"
     "&response_type=code"
     "&profile_id=%s"
-    "&profile_name=%s"
     "&device_name=%s";
 
 static const char kAuthorizationHeaderFormat[] =
@@ -60,7 +57,6 @@
 
   // ManagedUserRefreshTokenFetcher implementation:
   virtual void Start(const std::string& managed_user_id,
-                     const string16& name,
                      const std::string& device_name,
                      const TokenCallback& callback) OVERRIDE;
 
@@ -97,7 +93,6 @@
 
   std::string device_name_;
   std::string managed_user_id_;
-  string16 name_;
   TokenCallback callback_;
 
   scoped_ptr<OAuth2TokenService::Request> access_token_request_;
@@ -118,12 +113,10 @@
 
 void ManagedUserRefreshTokenFetcherImpl::Start(
     const std::string& managed_user_id,
-    const string16& name,
     const std::string& device_name,
     const TokenCallback& callback) {
   DCHECK(callback_.is_null());
   managed_user_id_ = managed_user_id;
-  name_ = name;
   device_name_ = device_name;
   callback_ = callback;
   StartFetching();
@@ -162,7 +155,6 @@
           GaiaUrls::GetInstance()->oauth2_chrome_client_id(), true).c_str(),
       net::EscapeUrlEncodedData(kChromeSyncManagedOAuth2Scope, true).c_str(),
       net::EscapeUrlEncodedData(managed_user_id_, true).c_str(),
-      net::EscapeUrlEncodedData(UTF16ToUTF8(name_), true).c_str(),
       net::EscapeUrlEncodedData(device_name_, true).c_str());
   url_fetcher_->SetUploadData("application/x-www-form-urlencoded", body);
 
diff --git a/chrome/browser/managed_mode/managed_user_refresh_token_fetcher.h b/chrome/browser/managed_mode/managed_user_refresh_token_fetcher.h
index e29cdbe..c671a72 100644
--- a/chrome/browser/managed_mode/managed_user_refresh_token_fetcher.h
+++ b/chrome/browser/managed_mode/managed_user_refresh_token_fetcher.h
@@ -42,7 +42,6 @@
   virtual ~ManagedUserRefreshTokenFetcher();
 
   virtual void Start(const std::string& managed_user_id,
-                     const string16& name,
                      const std::string& device_name,
                      const TokenCallback& callback) = 0;
 };
diff --git a/chrome/browser/managed_mode/managed_user_refresh_token_fetcher_unittest.cc b/chrome/browser/managed_mode/managed_user_refresh_token_fetcher_unittest.cc
index c547599..75608a6 100644
--- a/chrome/browser/managed_mode/managed_user_refresh_token_fetcher_unittest.cc
+++ b/chrome/browser/managed_mode/managed_user_refresh_token_fetcher_unittest.cc
@@ -5,7 +5,6 @@
 #include "base/bind.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/managed_mode/managed_user_refresh_token_fetcher.h"
 #include "chrome/browser/signin/oauth2_token_service.h"
 #include "chrome/test/base/testing_profile.h"
@@ -24,7 +23,6 @@
 namespace {
 
 const char kManagedUserId[] = "abcdef";
-const char kName[] = "Homestar";
 const char kDeviceName[] = "Compy";
 
 const char kAccessToken[] = "accesstoken";
@@ -213,7 +211,7 @@
       weak_ptr_factory_(this) {}
 
 void ManagedUserRefreshTokenFetcherTest::StartFetching() {
-  token_fetcher_->Start(kManagedUserId, UTF8ToUTF16(kName), kDeviceName,
+  token_fetcher_->Start(kManagedUserId, kDeviceName,
                         base::Bind(
                             &ManagedUserRefreshTokenFetcherTest::OnTokenFetched,
                             weak_ptr_factory_.GetWeakPtr()));
@@ -246,9 +244,6 @@
   std::string managed_user_id;
   EXPECT_TRUE(GetValueForKey(upload_data, "profile_id", &managed_user_id));
   EXPECT_EQ(kManagedUserId, managed_user_id);
-  std::string name;
-  EXPECT_TRUE(GetValueForKey(upload_data, "profile_name", &name));
-  EXPECT_EQ(kName, name);
   std::string device_name;
   EXPECT_TRUE(GetValueForKey(upload_data, "device_name", &device_name));
   EXPECT_EQ(kDeviceName, device_name);
diff --git a/chrome/browser/managed_mode/managed_user_registration_utility.cc b/chrome/browser/managed_mode/managed_user_registration_utility.cc
index d782fce..6a46a33 100644
--- a/chrome/browser/managed_mode/managed_user_registration_utility.cc
+++ b/chrome/browser/managed_mode/managed_user_registration_utility.cc
@@ -94,7 +94,7 @@
 
   browser_sync::DeviceInfo::GetClientName(
       base::Bind(&ManagedUserRegistrationUtility::FetchToken,
-                 weak_ptr_factory_.GetWeakPtr(), info.name));
+                 weak_ptr_factory_.GetWeakPtr()));
 }
 
 void ManagedUserRegistrationUtility::CancelPendingRegistration() {
@@ -118,10 +118,9 @@
 }
 
 void ManagedUserRegistrationUtility::FetchToken(
-    const string16& name,
     const std::string& client_name) {
   token_fetcher_->Start(
-      pending_managed_user_id_, name, client_name,
+      pending_managed_user_id_, client_name,
       base::Bind(&ManagedUserRegistrationUtility::OnReceivedToken,
                  weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/chrome/browser/managed_mode/managed_user_registration_utility.h b/chrome/browser/managed_mode/managed_user_registration_utility.h
index 368cc1e..5e6fe52 100644
--- a/chrome/browser/managed_mode/managed_user_registration_utility.h
+++ b/chrome/browser/managed_mode/managed_user_registration_utility.h
@@ -87,8 +87,7 @@
       scoped_ptr<ManagedUserRefreshTokenFetcher> token_fetcher,
       ManagedUserSyncService* service);
   // Fetches the managed user token when we have the device name.
-  void FetchToken(const string16& name,
-                  const std::string& client_name);
+  void FetchToken(const std::string& client_name);
 
   // Called when we have received a token for the managed user.
   void OnReceivedToken(const GoogleServiceAuthError& error,
diff --git a/chrome/browser/managed_mode/managed_user_registration_utility_unittest.cc b/chrome/browser/managed_mode/managed_user_registration_utility_unittest.cc
index 76962a9..5bb75de 100644
--- a/chrome/browser/managed_mode/managed_user_registration_utility_unittest.cc
+++ b/chrome/browser/managed_mode/managed_user_registration_utility_unittest.cc
@@ -68,7 +68,6 @@
 
   // ManagedUserRefreshTokenFetcher implementation:
   virtual void Start(const std::string& managed_user_id,
-                     const string16& name,
                      const std::string& device_name,
                      const TokenCallback& callback) OVERRIDE {
     GoogleServiceAuthError error(GoogleServiceAuthError::NONE);
diff --git a/chrome/browser/media/media_capture_devices_dispatcher.cc b/chrome/browser/media/media_capture_devices_dispatcher.cc
index bbef40f..03ca4c5 100644
--- a/chrome/browser/media/media_capture_devices_dispatcher.cc
+++ b/chrome/browser/media/media_capture_devices_dispatcher.cc
@@ -35,6 +35,10 @@
 #include "grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
 
+#if defined(USE_CRAS)
+#include "media/audio/cras/audio_manager_cras.h"
+#endif
+
 using content::BrowserThread;
 using content::MediaStreamDevices;
 
@@ -193,22 +197,34 @@
     const content::MediaStreamRequest& request,
     const content::MediaResponseCallback& callback,
     const extensions::Extension* extension) {
-  bool component_extension =
+  const bool component_extension =
     extension && extension->location() == extensions::Manifest::COMPONENT;
 
   content::MediaStreamDevices devices;
 
-  bool screen_capture_enabled =
+  const bool screen_capture_enabled =
       CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kEnableUserMediaScreenCapturing) ||
       IsOriginWhitelistedForScreenCapture(request.security_origin);
 
-  bool origin_is_secure =
+  const bool origin_is_secure =
       request.security_origin.SchemeIsSecure() ||
       request.security_origin.SchemeIs(extensions::kExtensionScheme) ||
       CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kAllowHttpScreenCapture);
 
+  const bool screen_video_capture_requested =
+      request.video_type == content::MEDIA_SCREEN_VIDEO_CAPTURE;
+
+  const bool system_audio_capture_requested =
+      request.audio_type == content::MEDIA_SYSTEM_AUDIO_CAPTURE;
+
+#if defined(USE_CRAS)
+  const bool system_audio_capture_supported = true;
+#else
+  const bool system_audio_capture_supported = false;
+#endif
+
   // Approve request only when the following conditions are met:
   //  1. Screen capturing is enabled via command line switch or white-listed for
   //     the given origin.
@@ -216,9 +232,8 @@
   //  3. Video capture is requested for screen video.
   //  4. Audio capture is either not requested, or requested for system audio.
   if (screen_capture_enabled && origin_is_secure &&
-      request.video_type == content::MEDIA_SCREEN_VIDEO_CAPTURE &&
-      (request.audio_type == content::MEDIA_NO_SERVICE ||
-       request.audio_type == content::MEDIA_SYSTEM_AUDIO_CAPTURE)) {
+      screen_video_capture_requested &&
+      (!system_audio_capture_requested || system_audio_capture_supported)) {
     // For component extensions, bypass message box.
     bool user_approved = false;
     if (!component_extension) {
@@ -240,9 +255,14 @@
     if (user_approved || component_extension) {
       devices.push_back(content::MediaStreamDevice(
           content::MEDIA_SCREEN_VIDEO_CAPTURE, std::string(), "Screen"));
-      if (request.audio_type == content::MEDIA_SYSTEM_AUDIO_CAPTURE) {
+      if (system_audio_capture_requested) {
+#if defined(USE_CRAS)
+        // Use the special loopback device ID for system audio capture.
         devices.push_back(content::MediaStreamDevice(
-            content::MEDIA_SYSTEM_AUDIO_CAPTURE, std::string(), std::string()));
+            content::MEDIA_SYSTEM_AUDIO_CAPTURE,
+            media::AudioManagerCras::kLoopbackDeviceId,
+            "System Audio"));
+#endif
       }
     }
   }
diff --git a/chrome/browser/media_galleries/fileapi/av_scanning_file_validator.cc b/chrome/browser/media_galleries/fileapi/av_scanning_file_validator.cc
new file mode 100644
index 0000000..a6c71e0
--- /dev/null
+++ b/chrome/browser/media_galleries/fileapi/av_scanning_file_validator.cc
@@ -0,0 +1,81 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media_galleries/fileapi/av_scanning_file_validator.h"
+
+#if defined(OS_WIN)
+#include <windows.h>
+#include <shlobj.h>
+#endif
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/location.h"
+#include "base/logging.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/common/chrome_constants.h"
+#include "content/public/browser/browser_thread.h"
+
+#if defined(OS_WIN)
+#include "base/win/scoped_comptr.h"
+#endif
+
+using content::BrowserThread;
+
+namespace chrome {
+
+namespace {
+
+#if defined(OS_WIN)
+base::PlatformFileError ScanFile(
+    const base::FilePath& dest_platform_path) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+
+  base::win::ScopedComPtr<IAttachmentExecute> attachment_services;
+  HRESULT hr = attachment_services.CreateInstance(CLSID_AttachmentServices);
+
+  if (FAILED(hr)) {
+    // The thread must have COM initialized.
+    DCHECK_NE(CO_E_NOTINITIALIZED, hr);
+    return base::PLATFORM_FILE_ERROR_SECURITY;
+  }
+
+  hr = attachment_services->SetLocalPath(dest_platform_path.value().c_str());
+  if (FAILED(hr))
+    return base::PLATFORM_FILE_ERROR_SECURITY;
+
+  // A failure in the Save() call below could result in the downloaded file
+  // being deleted.
+  HRESULT scan_result = attachment_services->Save();
+  if (scan_result == S_OK)
+    return base::PLATFORM_FILE_OK;
+
+  return base::PLATFORM_FILE_ERROR_SECURITY;
+}
+#endif
+
+}  // namespace
+
+AVScanningFileValidator::~AVScanningFileValidator() {}
+
+void AVScanningFileValidator::StartPostWriteValidation(
+    const base::FilePath& dest_platform_path,
+    const ResultCallback& result_callback) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+#if defined(OS_WIN)
+  BrowserThread::PostTaskAndReplyWithResult(
+      BrowserThread::FILE,
+      FROM_HERE,
+      base::Bind(&ScanFile, dest_platform_path),
+      result_callback);
+#else
+  result_callback.Run(base::PLATFORM_FILE_OK);
+#endif
+}
+
+AVScanningFileValidator::AVScanningFileValidator() {
+}
+
+}  // namespace chrome
diff --git a/chrome/browser/media_galleries/fileapi/av_scanning_file_validator.h b/chrome/browser/media_galleries/fileapi/av_scanning_file_validator.h
new file mode 100644
index 0000000..d06c857
--- /dev/null
+++ b/chrome/browser/media_galleries/fileapi/av_scanning_file_validator.h
@@ -0,0 +1,37 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_AV_SCANNING_FILE_VALIDATOR_H_
+#define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_AV_SCANNING_FILE_VALIDATOR_H_
+
+#include "base/basictypes.h"
+#include "webkit/browser/fileapi/copy_or_move_file_validator.h"
+
+namespace base {
+class FilePath;
+}  // namespace base
+
+namespace chrome {
+
+// This class supports AV scanning on post write validation.
+class AVScanningFileValidator : public fileapi::CopyOrMoveFileValidator {
+ public:
+  virtual ~AVScanningFileValidator();
+
+  // Runs AV checks on the resulting file (Windows-only).
+  // Subclasses will not typically override this method.
+  virtual void StartPostWriteValidation(
+      const base::FilePath& dest_platform_path,
+      const ResultCallback& result_callback) OVERRIDE;
+
+ protected:
+  AVScanningFileValidator();
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(AVScanningFileValidator);
+};
+
+}  // namespace chrome
+
+#endif  // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_AV_SCANNING_FILE_VALIDATOR_H_
diff --git a/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc b/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc
index 24f749b..5677b01 100644
--- a/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc
+++ b/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc
@@ -8,7 +8,6 @@
 #include "base/file_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/task_runner_util.h"
-#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
 #include "chrome/browser/media_galleries/fileapi/media_path_filter.h"
 #include "chrome/browser/media_galleries/fileapi/mtp_device_async_delegate.h"
 #include "chrome/browser/media_galleries/fileapi/mtp_device_map_service.h"
@@ -29,12 +28,10 @@
 const char kDeviceMediaAsyncFileUtilTempDir[] = "DeviceMediaFileSystem";
 
 // Called on the IO thread.
-MTPDeviceAsyncDelegate* GetMTPDeviceDelegate(
-    FileSystemOperationContext* context) {
+MTPDeviceAsyncDelegate* GetMTPDeviceDelegate(const FileSystemURL& url) {
   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
   return MTPDeviceMapService::GetInstance()->GetMTPDeviceAsyncDelegate(
-      context->GetUserValue<std::string>(
-          MediaFileSystemBackend::kMTPDeviceDelegateURLKey));
+      url.filesystem_id());
 }
 
 // Called on a blocking pool thread to create a snapshot file to hold the
@@ -109,7 +106,7 @@
     const FileSystemURL& url,
     const GetFileInfoCallback& callback) {
   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
-  MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(context.get());
+  MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url);
   if (!delegate) {
     OnGetFileInfoError(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND);
     return;
@@ -129,7 +126,7 @@
     const FileSystemURL& url,
     const ReadDirectoryCallback& callback) {
   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
-  MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(context.get());
+  MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url);
   if (!delegate) {
     OnReadDirectoryError(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND);
     return;
@@ -226,7 +223,7 @@
     const FileSystemURL& url,
     const CreateSnapshotFileCallback& callback) {
   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
-  MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(context.get());
+  MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url);
   if (!delegate) {
     OnCreateSnapshotFileError(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND);
     return;
@@ -243,7 +240,7 @@
                      weak_ptr_factory_.GetWeakPtr(),
                      base::Passed(&context),
                      callback,
-                     url.path(),
+                     url,
                      base::Owned(snapshot_file_path)));
   DCHECK(success);
 }
@@ -319,20 +316,20 @@
 void DeviceMediaAsyncFileUtil::OnSnapshotFileCreatedRunTask(
     scoped_ptr<FileSystemOperationContext> context,
     const AsyncFileUtil::CreateSnapshotFileCallback& callback,
-    const base::FilePath& device_file_path,
+    const FileSystemURL& url,
     base::FilePath* snapshot_file_path) {
   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
   if (!snapshot_file_path || snapshot_file_path->empty()) {
     OnCreateSnapshotFileError(callback, base::PLATFORM_FILE_ERROR_FAILED);
     return;
   }
-  MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(context.get());
+  MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url);
   if (!delegate) {
     OnCreateSnapshotFileError(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND);
     return;
   }
   delegate->CreateSnapshotFile(
-      device_file_path,
+      url.path(),  // device file path
       *snapshot_file_path,
       base::Bind(&DeviceMediaAsyncFileUtil::OnDidCreateSnapshotFile,
                  weak_ptr_factory_.GetWeakPtr(),
diff --git a/chrome/browser/media_galleries/fileapi/device_media_async_file_util.h b/chrome/browser/media_galleries/fileapi/device_media_async_file_util.h
index cb4c6a8..3cea78a 100644
--- a/chrome/browser/media_galleries/fileapi/device_media_async_file_util.h
+++ b/chrome/browser/media_galleries/fileapi/device_media_async_file_util.h
@@ -165,15 +165,15 @@
       base::PlatformFileError error);
 
   // Called when the snapshot file specified by the |snapshot_file_path| is
-  // created to hold the contents of the |device_file_path|. If the snapshot
+  // created to hold the contents of the url.path(). If the snapshot
   // file is successfully created, |snapshot_file_path| will be an non-empty
   // file path. In case of failure, |snapshot_file_path| will be an empty file
   // path. Forwards the CreateSnapshot request to the delegate to copy the
-  // contents of |device_file_path| to |snapshot_file_path|.
+  // contents of url.path() to |snapshot_file_path|.
   void OnSnapshotFileCreatedRunTask(
       scoped_ptr<fileapi::FileSystemOperationContext> context,
       const AsyncFileUtil::CreateSnapshotFileCallback& callback,
-      const base::FilePath& device_file_path,
+      const fileapi::FileSystemURL& url,
       base::FilePath* snapshot_file_path);
 
   // Profile path.
diff --git a/chrome/browser/media_galleries/fileapi/itunes_file_util.cc b/chrome/browser/media_galleries/fileapi/itunes_file_util.cc
index 88c32a1..641b382 100644
--- a/chrome/browser/media_galleries/fileapi/itunes_file_util.cc
+++ b/chrome/browser/media_galleries/fileapi/itunes_file_util.cc
@@ -12,7 +12,6 @@
 #include "base/file_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/media_galleries/fileapi/itunes_data_provider.h"
-#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
 #include "chrome/browser/media_galleries/fileapi/media_path_filter.h"
 #include "chrome/browser/media_galleries/imported_media_gallery_registry.h"
 #include "content/public/browser/browser_thread.h"
@@ -42,9 +41,10 @@
 
 }  // namespace
 
-ItunesFileUtil::ItunesFileUtil()
-    : weak_factory_(this),
-      imported_registry_(NULL)  {
+ItunesFileUtil::ItunesFileUtil(chrome::MediaPathFilter* media_path_filter)
+    : chrome::NativeMediaFileUtil(media_path_filter),
+      weak_factory_(this),
+      imported_registry_(NULL) {
 }
 
 ItunesFileUtil::~ItunesFileUtil() {
@@ -195,13 +195,10 @@
         GetDataProvider()->GetAlbum(components[1], components[2]);
     if (album.size() == 0)
       return base::PLATFORM_FILE_ERROR_NOT_FOUND;
-    chrome::MediaPathFilter* path_filter =
-        context->GetUserValue<chrome::MediaPathFilter*>(
-            chrome::MediaFileSystemBackend::kMediaPathFilterKey);
     ITunesDataProvider::Album::const_iterator it;
     for (it = album.begin(); it != album.end(); ++it) {
       base::PlatformFileInfo file_info;
-      if (path_filter->Match(it->second) &&
+      if (media_path_filter()->Match(it->second) &&
           file_util::GetFileInfo(it->second, &file_info)) {
         file_list->push_back(DirectoryEntry(it->first, DirectoryEntry::FILE,
                                             file_info.size,
diff --git a/chrome/browser/media_galleries/fileapi/itunes_file_util.h b/chrome/browser/media_galleries/fileapi/itunes_file_util.h
index d87bb51..3aa75f1 100644
--- a/chrome/browser/media_galleries/fileapi/itunes_file_util.h
+++ b/chrome/browser/media_galleries/fileapi/itunes_file_util.h
@@ -19,7 +19,7 @@
 
 class ItunesFileUtil : public chrome::NativeMediaFileUtil {
  public:
-  ItunesFileUtil();
+  explicit ItunesFileUtil(chrome::MediaPathFilter* media_path_filter);
   virtual ~ItunesFileUtil();
 
  protected:
diff --git a/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc b/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
index d1907cc..cf0bc26 100644
--- a/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
+++ b/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
@@ -44,10 +44,6 @@
 
 const char MediaFileSystemBackend::kMediaTaskRunnerName[] =
     "media-task-runner";
-const char MediaFileSystemBackend::kMediaPathFilterKey[] =
-    "MediaPathFilterKey";
-const char MediaFileSystemBackend::kMTPDeviceDelegateURLKey[] =
-    "MTPDeviceDelegateKey";
 
 MediaFileSystemBackend::MediaFileSystemBackend(
     const base::FilePath& profile_path,
@@ -56,13 +52,14 @@
       media_task_runner_(media_task_runner),
       media_path_filter_(new MediaPathFilter),
       media_copy_or_move_file_validator_factory_(new MediaFileValidatorFactory),
-      native_media_file_util_(new NativeMediaFileUtil()),
+      native_media_file_util_(
+          new NativeMediaFileUtil(media_path_filter_.get())),
       device_media_async_file_util_(
           DeviceMediaAsyncFileUtil::Create(profile_path_))
 #if defined(OS_WIN) || defined(OS_MACOSX)
       ,
-      picasa_file_util_(new picasa::PicasaFileUtil()),
-      itunes_file_util_(new itunes::ItunesFileUtil())
+      picasa_file_util_(new picasa::PicasaFileUtil(media_path_filter_.get())),
+      itunes_file_util_(new itunes::ItunesFileUtil(media_path_filter_.get()))
 #endif  // defined(OS_WIN) || defined(OS_MACOSX)
 {
 }
@@ -172,14 +169,6 @@
   scoped_ptr<fileapi::FileSystemOperationContext> operation_context(
       new fileapi::FileSystemOperationContext(
           context, media_task_runner_.get()));
-
-  operation_context->SetUserValue(kMediaPathFilterKey,
-                                  media_path_filter_.get());
-  if (url.type() == fileapi::kFileSystemTypeDeviceMedia) {
-    operation_context->SetUserValue(kMTPDeviceDelegateURLKey,
-                                    url.filesystem_id());
-  }
-
   return new fileapi::FileSystemOperationImpl(url, context,
                                               operation_context.Pass());
 }
diff --git a/chrome/browser/media_galleries/fileapi/media_file_system_backend.h b/chrome/browser/media_galleries/fileapi/media_file_system_backend.h
index e1763a8..c3b989b 100644
--- a/chrome/browser/media_galleries/fileapi/media_file_system_backend.h
+++ b/chrome/browser/media_galleries/fileapi/media_file_system_backend.h
@@ -26,8 +26,6 @@
 class MediaFileSystemBackend : public fileapi::FileSystemBackend {
  public:
   static const char kMediaTaskRunnerName[];
-  static const char kMediaPathFilterKey[];
-  static const char kMTPDeviceDelegateURLKey[];
 
   MediaFileSystemBackend(
       const base::FilePath& profile_path,
diff --git a/chrome/browser/media_galleries/fileapi/native_media_file_util.cc b/chrome/browser/media_galleries/fileapi/native_media_file_util.cc
index a9b922a..3b73e34 100644
--- a/chrome/browser/media_galleries/fileapi/native_media_file_util.cc
+++ b/chrome/browser/media_galleries/fileapi/native_media_file_util.cc
@@ -13,7 +13,6 @@
 #include "base/files/scoped_platform_file_closer.h"
 #include "base/strings/string_util.h"
 #include "base/task_runner_util.h"
-#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
 #include "chrome/browser/media_galleries/fileapi/media_path_filter.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/base/mime_sniffer.h"
@@ -76,15 +75,11 @@
   return context->task_runner()->RunsTasksOnCurrentThread();
 }
 
-MediaPathFilter* GetMediaPathFilter(
-    fileapi::FileSystemOperationContext* context) {
-  return context->GetUserValue<MediaPathFilter*>(
-          MediaFileSystemBackend::kMediaPathFilterKey);
-}
-
 }  // namespace
 
-NativeMediaFileUtil::NativeMediaFileUtil() : weak_factory_(this) {
+NativeMediaFileUtil::NativeMediaFileUtil(MediaPathFilter* media_path_filter)
+    : weak_factory_(this),
+      media_path_filter_(media_path_filter) {
 }
 
 NativeMediaFileUtil::~NativeMediaFileUtil() {
@@ -440,7 +435,7 @@
     return error;
   if (error == base::PLATFORM_FILE_OK && file_info.is_directory)
     return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
-  if (!GetMediaPathFilter(context)->Match(dest_file_path))
+  if (!media_path_filter_->Match(dest_file_path))
     return base::PLATFORM_FILE_ERROR_SECURITY;
 
   return fileapi::NativeFileUtil::CopyOrMoveFile(src_file_path, dest_file_path,
@@ -472,7 +467,6 @@
   DCHECK(context);
   DCHECK(IsOnTaskRunnerThread(context));
   DCHECK(file_info);
-  DCHECK(GetMediaPathFilter(context));
 
   base::FilePath file_path;
   base::PlatformFileError error = GetLocalFilePath(context, url, &file_path);
@@ -487,7 +481,7 @@
   if (platform_path)
     *platform_path = file_path;
   if (file_info->is_directory ||
-      GetMediaPathFilter(context)->Match(file_path)) {
+      media_path_filter_->Match(file_path)) {
     return base::PLATFORM_FILE_OK;
   }
   return base::PLATFORM_FILE_ERROR_NOT_FOUND;
@@ -541,7 +535,7 @@
     // NativeMediaFileUtil skip criteria.
     if (ShouldSkip(enum_path))
       continue;
-    if (!info.IsDirectory() && !GetMediaPathFilter(context)->Match(enum_path))
+    if (!info.IsDirectory() && !media_path_filter_->Match(enum_path))
       continue;
 
     fileapi::DirectoryEntry entry;
@@ -597,7 +591,7 @@
       GetLocalFilePath(context, file_system_url, &file_path);
   if (error != base::PLATFORM_FILE_OK)
     return error;
-  if (!GetMediaPathFilter(context)->Match(file_path))
+  if (!media_path_filter_->Match(file_path))
     return base::PLATFORM_FILE_ERROR_SECURITY;
 
   *local_file_path = file_path;
@@ -624,7 +618,7 @@
     return base::PLATFORM_FILE_ERROR_FAILED;
 
   if (!file_info.is_directory &&
-      !GetMediaPathFilter(context)->Match(file_path)) {
+      !media_path_filter_->Match(file_path)) {
     return failure_error;
   }
 
diff --git a/chrome/browser/media_galleries/fileapi/native_media_file_util.h b/chrome/browser/media_galleries/fileapi/native_media_file_util.h
index 29de6e6..a797e14 100644
--- a/chrome/browser/media_galleries/fileapi/native_media_file_util.h
+++ b/chrome/browser/media_galleries/fileapi/native_media_file_util.h
@@ -11,12 +11,14 @@
 
 namespace chrome {
 
+class MediaPathFilter;
+
 // This class handles native file system operations with media type filtering.
 // To support virtual file systems it implements the AsyncFileUtil interface
 // from scratch and provides synchronous override points.
 class NativeMediaFileUtil : public fileapi::AsyncFileUtil {
  public:
-  NativeMediaFileUtil();
+  explicit NativeMediaFileUtil(MediaPathFilter* media_path_filter);
   virtual ~NativeMediaFileUtil();
 
   // Uses the MIME sniffer code, which actually looks into the file,
@@ -169,6 +171,11 @@
       base::FilePath* platform_path,
       scoped_refptr<webkit_blob::ShareableFileReference>* file_ref);
 
+ protected:
+  chrome::MediaPathFilter* media_path_filter() {
+    return media_path_filter_;
+  }
+
  private:
   // Like GetLocalFilePath(), but always take media_path_filter() into
   // consideration. If the media_path_filter() check fails, return
@@ -193,6 +200,9 @@
 
   base::WeakPtrFactory<NativeMediaFileUtil> weak_factory_;
 
+  // Not owned, owned by the backend which owns this.
+  chrome::MediaPathFilter* media_path_filter_;
+
   DISALLOW_COPY_AND_ASSIGN(NativeMediaFileUtil);
 };
 
diff --git a/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.cc b/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.cc
index d15cb78..fa7bb7a 100644
--- a/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.cc
+++ b/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.cc
@@ -53,8 +53,9 @@
 const char kPicasaDirAlbums[]  = "albums";
 const char kPicasaDirFolders[] = "folders";
 
-PicasaFileUtil::PicasaFileUtil()
-    : weak_factory_(this) {
+PicasaFileUtil::PicasaFileUtil(chrome::MediaPathFilter* media_path_filter)
+    : chrome::NativeMediaFileUtil(media_path_filter),
+      weak_factory_(this) {
 }
 
 PicasaFileUtil::~PicasaFileUtil() {}
diff --git a/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.h b/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.h
index f17cb66..69d7c06 100644
--- a/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.h
+++ b/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.h
@@ -18,7 +18,7 @@
 
 class PicasaFileUtil : public chrome::NativeMediaFileUtil {
  public:
-  PicasaFileUtil();
+  explicit PicasaFileUtil(chrome::MediaPathFilter* media_path_filter);
   virtual ~PicasaFileUtil();
 
  protected:
diff --git a/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util_unittest.cc b/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util_unittest.cc
index 978b0dc..cd19e3b 100644
--- a/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util_unittest.cc
+++ b/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util_unittest.cc
@@ -178,8 +178,10 @@
 
 class TestPicasaFileUtil : public PicasaFileUtil {
  public:
-  explicit TestPicasaFileUtil(PicasaDataProvider* data_provider)
-      : data_provider_(data_provider) {
+  TestPicasaFileUtil(chrome::MediaPathFilter* media_path_filter,
+                     PicasaDataProvider* data_provider)
+      : PicasaFileUtil(media_path_filter),
+        data_provider_(data_provider) {
   }
   virtual ~TestPicasaFileUtil() {}
  private:
@@ -225,12 +227,14 @@
     scoped_refptr<quota::SpecialStoragePolicy> storage_policy =
         new quota::MockSpecialStoragePolicy();
 
+    media_path_filter_.reset(new chrome::MediaPathFilter());
     picasa_data_provider_.reset(new TestPicasaDataProvider());
 
     ScopedVector<fileapi::FileSystemBackend> additional_providers;
     additional_providers.push_back(new TestMediaFileSystemBackend(
         profile_dir_.path(),
-        new TestPicasaFileUtil(picasa_data_provider_.get())));
+        new TestPicasaFileUtil(media_path_filter_.get(),
+                               picasa_data_provider_.get())));
 
     file_system_context_ = new fileapi::FileSystemContext(
         base::MessageLoopProxy::current().get(),
@@ -333,6 +337,7 @@
   base::ScopedTempDir profile_dir_;
 
   scoped_refptr<fileapi::FileSystemContext> file_system_context_;
+  scoped_ptr<chrome::MediaPathFilter> media_path_filter_;
   scoped_ptr<TestPicasaDataProvider> picasa_data_provider_;
 
   DISALLOW_COPY_AND_ASSIGN(PicasaFileUtilTest);
diff --git a/chrome/browser/media_galleries/fileapi/supported_image_type_validator.cc b/chrome/browser/media_galleries/fileapi/supported_image_type_validator.cc
index 9ae7625..24a400b 100644
--- a/chrome/browser/media_galleries/fileapi/supported_image_type_validator.cc
+++ b/chrome/browser/media_galleries/fileapi/supported_image_type_validator.cc
@@ -116,19 +116,6 @@
                  weak_factory_.GetWeakPtr()));
 }
 
-void SupportedImageTypeValidator::StartPostWriteValidation(
-    const base::FilePath& dest_platform_path,
-    const ResultCallback& result_callback) {
-  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-  post_write_callback_ = result_callback;
-
-  // TODO(gbillock): Insert AV call here in the right validator.
-  BrowserThread::PostTask(
-      BrowserThread::IO,
-      FROM_HERE,
-      base::Bind(post_write_callback_, base::PLATFORM_FILE_OK));
-}
-
 SupportedImageTypeValidator::SupportedImageTypeValidator(
     const base::FilePath& path)
     : path_(path),
diff --git a/chrome/browser/media_galleries/fileapi/supported_image_type_validator.h b/chrome/browser/media_galleries/fileapi/supported_image_type_validator.h
index c74d762..11e479f 100644
--- a/chrome/browser/media_galleries/fileapi/supported_image_type_validator.h
+++ b/chrome/browser/media_galleries/fileapi/supported_image_type_validator.h
@@ -9,7 +9,7 @@
 #include "base/files/file_path.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "webkit/browser/fileapi/copy_or_move_file_validator.h"
+#include "chrome/browser/media_galleries/fileapi/av_scanning_file_validator.h"
 
 class ImageDecoder;
 
@@ -19,7 +19,7 @@
 
 // Use ImageDecoder to determine if the file decodes without error. Handles
 // image files supported by Chrome.
-class SupportedImageTypeValidator : public fileapi::CopyOrMoveFileValidator {
+class SupportedImageTypeValidator : public AVScanningFileValidator {
  public:
   virtual ~SupportedImageTypeValidator();
 
@@ -28,10 +28,6 @@
   virtual void StartPreWriteValidation(
       const ResultCallback& result_callback) OVERRIDE;
 
-  virtual void StartPostWriteValidation(
-      const base::FilePath& dest_platform_path,
-      const ResultCallback& result_callback) OVERRIDE;
-
  private:
   friend class MediaFileValidatorFactory;
 
@@ -42,7 +38,6 @@
   base::FilePath path_;
   scoped_refptr<ImageDecoder> decoder_;
   fileapi::CopyOrMoveFileValidator::ResultCallback callback_;
-  fileapi::CopyOrMoveFileValidator::ResultCallback post_write_callback_;
   base::WeakPtrFactory<SupportedImageTypeValidator> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(SupportedImageTypeValidator);
diff --git a/chrome/browser/nacl_host/nacl_host_message_filter.cc b/chrome/browser/nacl_host/nacl_host_message_filter.cc
index 5980d72..c7c7935 100644
--- a/chrome/browser/nacl_host/nacl_host_message_filter.cc
+++ b/chrome/browser/nacl_host/nacl_host_message_filter.cc
@@ -186,9 +186,9 @@
                  pp_instance));
 }
 
-void NaClHostMessageFilter::OnTranslationFinished(int instance) {
+void NaClHostMessageFilter::OnTranslationFinished(int instance, bool success) {
   PnaclHost::GetInstance()->TranslationFinished(
-      render_process_id_, instance);
+      render_process_id_, instance, success);
 }
 
 void NaClHostMessageFilter::OnNaClErrorStatus(int render_view_id,
diff --git a/chrome/browser/nacl_host/nacl_host_message_filter.h b/chrome/browser/nacl_host/nacl_host_message_filter.h
index dccdf08..7d31a90 100644
--- a/chrome/browser/nacl_host/nacl_host_message_filter.h
+++ b/chrome/browser/nacl_host/nacl_host_message_filter.h
@@ -59,7 +59,7 @@
   void OnGetNexeFd(int render_view_id,
                    int pp_instance,
                    const nacl::PnaclCacheInfo& cache_info);
-  void OnTranslationFinished(int instance);
+  void OnTranslationFinished(int instance, bool success);
   void OnNaClErrorStatus(int render_view_id, int error_id);
   void OnOpenNaClExecutable(int render_view_id,
                             const GURL& file_url,
diff --git a/chrome/browser/nacl_host/pnacl_host.cc b/chrome/browser/nacl_host/pnacl_host.cc
index 6eb3ea0..9bb5b72 100644
--- a/chrome/browser/nacl_host/pnacl_host.cc
+++ b/chrome/browser/nacl_host/pnacl_host.cc
@@ -180,7 +180,9 @@
 
 /////////////////// Cleanup
 
-void PnaclHost::TranslationFinished(int render_process_id, int pp_instance) {
+void PnaclHost::TranslationFinished(int render_process_id,
+                                    int pp_instance,
+                                    bool success) {
   DCHECK(thread_checker_.CalledOnValidThread());
   if (cache_state_ != CacheReady)
     return;
diff --git a/chrome/browser/nacl_host/pnacl_host.h b/chrome/browser/nacl_host/pnacl_host.h
index e449ce2..2093b44 100644
--- a/chrome/browser/nacl_host/pnacl_host.h
+++ b/chrome/browser/nacl_host/pnacl_host.h
@@ -63,9 +63,11 @@
                  const NexeFdCallback& cb);
 
   // Called after the translation of a pexe instance identified by
-  // |render_process_id| and |pp_instance| finishes. Store the nexe translated
-  // for the instance in the cache.
-  void TranslationFinished(int render_process_id, int pp_instance);
+  // |render_process_id| and |pp_instance| finishes. If |success| is true,
+  // store the nexe translated for the instance in the cache.
+  void TranslationFinished(int render_process_id,
+                           int pp_instance,
+                           bool success);
 
   // Called when the renderer identified by |render_process_id| is closing.
   // Clean up any outstanding translations for that renderer.
diff --git a/chrome/browser/nacl_host/pnacl_host_unittest.cc b/chrome/browser/nacl_host/pnacl_host_unittest.cc
index 7796aa6..cb5e8ef 100644
--- a/chrome/browser/nacl_host/pnacl_host_unittest.cc
+++ b/chrome/browser/nacl_host/pnacl_host_unittest.cc
@@ -73,7 +73,7 @@
   base::RunLoop().RunUntilIdle();
   EXPECT_PENDING_TRANSLATIONS(1);
   ExpectCallbackCount(1);
-  host_->TranslationFinished(0, 0);
+  host_->TranslationFinished(0, 0, true);
   EXPECT_PENDING_TRANSLATIONS(0);
   host_->RendererClosing(0);
 }
@@ -89,7 +89,7 @@
       base::Bind(&PnaclHostTest::CallbackExpectMiss, base::Unretained(this)));
 
   EXPECT_PENDING_TRANSLATIONS(1);
-  host_->TranslationFinished(0, 1);  // nonexistent translation
+  host_->TranslationFinished(0, 1, true);  // nonexistent translation
   EXPECT_PENDING_TRANSLATIONS(1);
   host_->RendererClosing(1);  // nonexistent renderer
   EXPECT_PENDING_TRANSLATIONS(1);
diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc
index 6697181..76c09db 100644
--- a/chrome/browser/net/chrome_network_delegate.cc
+++ b/chrome/browser/net/chrome_network_delegate.cc
@@ -212,12 +212,12 @@
   }
 }
 
-#if defined(OS_ANDROID)
+#if defined(OS_ANDROID) || defined(OS_IOS)
 // Increments an int64, stored as a string, in a ListPref at the specified
 // index.  The value must already exist and be a string representation of a
 // number.
 void AddInt64ToListPref(size_t index, int64 length,
-                        ListPrefUpdate& list_update) {
+                        base::ListValue* list_update) {
   int64 value = 0;
   std::string old_string_value;
   bool rv = list_update->GetString(index, &old_string_value);
@@ -229,10 +229,67 @@
   value += length;
   list_update->Set(index, Value::CreateStringValue(base::Int64ToString(value)));
 }
-#endif  // defined(OS_ANDROID)
+
+int64 ListPrefInt64Value(const base::ListValue& list_update, size_t index) {
+  std::string string_value;
+  if (!list_update.GetString(index, &string_value))
+    return 0;
+
+  int64 value = 0;
+  bool rv = base::StringToInt64(string_value, &value);
+  DCHECK(rv);
+  return value;
+}
+
+void RecordDailyContentLengthHistograms(
+    int64 original_length,
+    int64 received_length,
+    int64 length_with_data_reduction_enabled,
+    int64 length_via_data_reduction_proxy) {
+  // Record metrics in KB.
+  UMA_HISTOGRAM_COUNTS(
+      "Net.DailyHttpOriginalContentLength", original_length >> 10);
+  UMA_HISTOGRAM_COUNTS(
+      "Net.DailyHttpReceivedContentLength", received_length >> 10);
+  UMA_HISTOGRAM_COUNTS(
+      "Net.DailyHttpContentLengthWithDataReductionProxyEnabled",
+      length_with_data_reduction_enabled >> 10);
+  UMA_HISTOGRAM_COUNTS(
+      "Net.DailyHttpContentLengthViaDataReductionProxy",
+      length_via_data_reduction_proxy >> 10);
+
+  if (original_length > 0 && received_length > 0) {
+    int percent = (100 * (original_length - received_length)) / original_length;
+    // UMA percentage cannot be negative.
+    if (percent < 0)
+      percent = 0;
+    UMA_HISTOGRAM_PERCENTAGE("Net.DailyHttpContentSavings", percent);
+    // If the data reduction proxy is enabled for some responses.
+    if (length_with_data_reduction_enabled > 0) {
+      UMA_HISTOGRAM_PERCENTAGE(
+          "Net.DailyHttpContentSavings_DataReductionProxy", percent);
+    }
+  }
+  if (received_length > 0 && length_with_data_reduction_enabled >= 0) {
+    DCHECK_GE(received_length, length_with_data_reduction_enabled);
+    UMA_HISTOGRAM_PERCENTAGE(
+        "Net.DailyReceivedContentWithDataReductionProxyEnabled",
+        (100 * length_with_data_reduction_enabled) / received_length);
+  }
+  if (received_length > 0 &&
+      length_via_data_reduction_proxy >= 0) {
+    DCHECK_GE(received_length, length_via_data_reduction_proxy);
+    UMA_HISTOGRAM_PERCENTAGE(
+        "Net.DailyReceivedContentViaDataReductionProxy",
+        (100 * length_via_data_reduction_proxy) / received_length);
+  }
+}
+
+#endif  // defined(OS_ANDROID) || defined(OS_IOS)
 
 void UpdateContentLengthPrefs(int received_content_length,
-                              int original_content_length) {
+                              int original_content_length,
+                              bool data_reduction_proxy_was_used) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
   DCHECK_GE(received_content_length, 0);
   DCHECK_GE(original_content_length, 0);
@@ -252,7 +309,7 @@
   prefs->SetInt64(prefs::kHttpReceivedContentLength, total_received);
   prefs->SetInt64(prefs::kHttpOriginalContentLength, total_original);
 
-#if defined(OS_ANDROID)
+#if defined(OS_ANDROID) || defined(OS_IOS)
   base::Time now = base::Time::Now().LocalMidnight();
   const size_t kNumDaysInHistory = 60;
 
@@ -263,6 +320,11 @@
   // |kNumDaysInHistory| days are maintained.
   ListPrefUpdate original_update(prefs, prefs::kDailyHttpOriginalContentLength);
   ListPrefUpdate received_update(prefs, prefs::kDailyHttpReceivedContentLength);
+  ListPrefUpdate data_reduction_enabled_update(
+      prefs,
+      prefs::kDailyHttpReceivedContentLengthWithDataReductionProxyEnabled);
+  ListPrefUpdate via_data_reduction_update(
+      prefs, prefs::kDailyHttpReceivedContentLengthViaDataReductionProxy);
 
   // Determine how many days it has been since the last update.
   int64 then_internal = prefs->GetInt64(
@@ -282,23 +344,47 @@
       // values.
       original_update->Remove(kNumDaysInHistory - 1, NULL);
       received_update->Remove(kNumDaysInHistory - 1, NULL);
+      data_reduction_enabled_update->Remove(kNumDaysInHistory - 1, NULL);
+      via_data_reduction_update->Remove(kNumDaysInHistory - 1, NULL);
       original_update->Insert(0, new StringValue(base::Int64ToString(0)));
       received_update->Insert(0, new StringValue(base::Int64ToString(0)));
+      data_reduction_enabled_update->Insert(
+          0, new StringValue(base::Int64ToString(0)));
+      via_data_reduction_update->Insert(
+          0, new StringValue(base::Int64ToString(0)));
       days_since_last_update = 0;
 
     } else if (days_since_last_update < -1) {
       // Erase all entries if the system went backwards in time by more than
       // a day.
       original_update->Clear();
+      received_update->Clear();
+      data_reduction_enabled_update->Clear();
+      via_data_reduction_update->Clear();
       days_since_last_update = kNumDaysInHistory;
     }
 
+    // A new day. Report the previous day's data if exists. We'll lose usage
+    // data if Chrome isn't run for a day. Here, we prefer collecting less data
+    // but the collected data are associated with an accurate date.
+    if (days_since_last_update == 1) {
+      RecordDailyContentLengthHistograms(
+          ListPrefInt64Value(*original_update, original_update->GetSize() - 1),
+          ListPrefInt64Value(*received_update, received_update->GetSize() - 1),
+          ListPrefInt64Value(*data_reduction_enabled_update,
+                             data_reduction_enabled_update->GetSize() - 1),
+          ListPrefInt64Value(*via_data_reduction_update,
+                             via_data_reduction_update->GetSize() - 1));
+    }
+
     // Add entries for days since last update.
     for (int i = 0;
          i < days_since_last_update && i < static_cast<int>(kNumDaysInHistory);
          ++i) {
       original_update->AppendString(base::Int64ToString(0));
       received_update->AppendString(base::Int64ToString(0));
+      data_reduction_enabled_update->AppendString(base::Int64ToString(0));
+      via_data_reduction_update->AppendString(base::Int64ToString(0));
     }
 
     // Maintain the invariant that there should never be more than
@@ -307,30 +393,51 @@
       original_update->Remove(0, NULL);
     while (received_update->GetSize() > kNumDaysInHistory)
       received_update->Remove(0, NULL);
+    while (data_reduction_enabled_update->GetSize() > kNumDaysInHistory)
+      data_reduction_enabled_update->Remove(0, NULL);
+    while (via_data_reduction_update->GetSize() > kNumDaysInHistory)
+      via_data_reduction_update->Remove(0, NULL);
   }
+
   DCHECK_EQ(kNumDaysInHistory, original_update->GetSize());
   DCHECK_EQ(kNumDaysInHistory, received_update->GetSize());
+  DCHECK_EQ(kNumDaysInHistory, data_reduction_enabled_update->GetSize());
+  DCHECK_EQ(kNumDaysInHistory, via_data_reduction_update->GetSize());
 
   // Update the counts for the current day.
   AddInt64ToListPref(kNumDaysInHistory - 1,
-                     original_content_length, original_update);
+                     original_content_length, original_update.Get());
   AddInt64ToListPref(kNumDaysInHistory - 1,
-                     received_content_length, received_update);
+                     received_content_length, received_update.Get());
+
+  if (g_browser_process->profile_manager()->GetDefaultProfile()->
+          GetPrefs()->GetBoolean(prefs::kSpdyProxyAuthEnabled)) {
+    AddInt64ToListPref(kNumDaysInHistory - 1,
+                       received_content_length,
+                       data_reduction_enabled_update.Get());
+  }
+  if (data_reduction_proxy_was_used) {
+    AddInt64ToListPref(kNumDaysInHistory - 1,
+                       received_content_length,
+                       via_data_reduction_update.Get());
+  }
 #endif
 }
 
 void StoreAccumulatedContentLength(int received_content_length,
-                                   int original_content_length) {
+                                   int original_content_length,
+                                   bool data_reduction_proxy_was_used) {
   BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
       base::Bind(&UpdateContentLengthPrefs,
-                 received_content_length, original_content_length));
+                 received_content_length, original_content_length,
+                 data_reduction_proxy_was_used));
 }
 
 void RecordContentLengthHistograms(
     int64 received_content_length,
     int64 original_content_length,
     const base::TimeDelta& freshness_lifetime) {
-#if defined(OS_ANDROID)
+#if defined(OS_ANDROID) || defined(OS_IOS)
   // Add the current resource to these histograms only when a valid
   // X-Original-Content-Length header is present.
   if (original_content_length >= 0) {
@@ -581,6 +688,10 @@
       int64 original_content_length =
           request->response_info().headers->GetInt64HeaderValue(
               "x-original-content-length");
+      bool data_reduction_proxy_was_used =
+          request->response_info().headers->HasHeaderValue(
+              "via", "1.1 Chrome Compression Proxy");
+
       // Since there was no indication of the original content length, presume
       // it is no different from the number of bytes read.
       int64 adjusted_original_content_length = original_content_length;
@@ -590,7 +701,8 @@
           request->response_info().headers->GetFreshnessLifetime(
               request->response_info().response_time);
       AccumulateContentLength(received_content_length,
-                              adjusted_original_content_length);
+                              adjusted_original_content_length,
+                              data_reduction_proxy_was_used);
       RecordContentLengthHistograms(received_content_length,
                                     original_content_length,
                                     freshness_lifetime);
@@ -798,11 +910,13 @@
 }
 
 void ChromeNetworkDelegate::AccumulateContentLength(
-    int64 received_content_length, int64 original_content_length) {
+    int64 received_content_length, int64 original_content_length,
+    bool data_reduction_proxy_was_used) {
   DCHECK_GE(received_content_length, 0);
   DCHECK_GE(original_content_length, 0);
   StoreAccumulatedContentLength(received_content_length,
-                                original_content_length);
+                                original_content_length,
+                                data_reduction_proxy_was_used);
   received_content_length_ += received_content_length;
   original_content_length_ += original_content_length;
 }
diff --git a/chrome/browser/net/chrome_network_delegate.h b/chrome/browser/net/chrome_network_delegate.h
index 25a79ec..e9bf978 100644
--- a/chrome/browser/net/chrome_network_delegate.h
+++ b/chrome/browser/net/chrome_network_delegate.h
@@ -167,7 +167,8 @@
                                         RequestWaitState state) OVERRIDE;
 
   void AccumulateContentLength(
-      int64 received_payload_byte_count, int64 original_payload_byte_count);
+      int64 received_payload_byte_count, int64 original_payload_byte_count,
+      bool data_reduction_proxy_was_used);
 
   scoped_refptr<extensions::EventRouterForwarder> event_router_;
   void* profile_;
diff --git a/chrome/browser/net/sqlite_server_bound_cert_store.cc b/chrome/browser/net/sqlite_server_bound_cert_store.cc
index 8432267..337fe4e 100644
--- a/chrome/browser/net/sqlite_server_bound_cert_store.cc
+++ b/chrome/browser/net/sqlite_server_bound_cert_store.cc
@@ -247,13 +247,16 @@
   }
 
   while (smt.Step()) {
+    net::SSLClientCertType type =
+        static_cast<net::SSLClientCertType>(smt.ColumnInt(3));
+    if (type != net::CLIENT_CERT_ECDSA_SIGN)
+      continue;
     std::string private_key_from_db, cert_from_db;
     smt.ColumnBlobAsString(1, &private_key_from_db);
     smt.ColumnBlobAsString(2, &cert_from_db);
     scoped_ptr<net::DefaultServerBoundCertStore::ServerBoundCert> cert(
         new net::DefaultServerBoundCertStore::ServerBoundCert(
             smt.ColumnString(0),  // origin
-            static_cast<net::SSLClientCertType>(smt.ColumnInt(3)),
             base::Time::FromInternalValue(smt.ColumnInt64(5)),
             base::Time::FromInternalValue(smt.ColumnInt64(4)),
             private_key_from_db,
@@ -296,8 +299,9 @@
                    << "version 2.";
       return false;
     }
-    // All certs in version 1 database are rsa_sign, which has a value of 1.
-    if (!db_->Execute("UPDATE origin_bound_certs SET cert_type = 1")) {
+    // All certs in version 1 database are rsa_sign, which are unsupported.
+    // Just discard them all.
+    if (!db_->Execute("DELETE from origin_bound_certs")) {
       LOG(WARNING) << "Unable to update server bound cert database to "
                    << "version 2.";
       return false;
@@ -518,7 +522,7 @@
         add_smt.BindBlob(1, private_key.data(), private_key.size());
         const std::string& cert = po->cert().cert();
         add_smt.BindBlob(2, cert.data(), cert.size());
-        add_smt.BindInt(3, po->cert().type());
+        add_smt.BindInt(3, net::CLIENT_CERT_ECDSA_SIGN);
         add_smt.BindInt64(4, po->cert().expiration_time().ToInternalValue());
         add_smt.BindInt64(5, po->cert().creation_time().ToInternalValue());
         if (!add_smt.Run())
diff --git a/chrome/browser/net/sqlite_server_bound_cert_store_unittest.cc b/chrome/browser/net/sqlite_server_bound_cert_store_unittest.cc
index e475e58..686138a 100644
--- a/chrome/browser/net/sqlite_server_bound_cert_store_unittest.cc
+++ b/chrome/browser/net/sqlite_server_bound_cert_store_unittest.cc
@@ -15,6 +15,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "net/base/test_data_directory.h"
+#include "net/ssl/ssl_client_cert_type.h"
 #include "net/test/cert_test_util.h"
 #include "sql/statement.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -89,7 +90,6 @@
     store_->AddServerBoundCert(
         net::DefaultServerBoundCertStore::ServerBoundCert(
             "google.com",
-            net::CLIENT_CERT_RSA_SIGN,
             base::Time::FromInternalValue(1),
             base::Time::FromInternalValue(2),
             "a", "b"));
@@ -106,7 +106,6 @@
   store_->AddServerBoundCert(
       net::DefaultServerBoundCertStore::ServerBoundCert(
           "foo.com",
-          net::CLIENT_CERT_ECDSA_SIGN,
           base::Time::FromInternalValue(3),
           base::Time::FromInternalValue(4),
           "c", "d"));
@@ -124,27 +123,25 @@
   // Reload and test for persistence
   Load(&certs);
   ASSERT_EQ(2U, certs.size());
-  net::DefaultServerBoundCertStore::ServerBoundCert* ec_cert;
-  net::DefaultServerBoundCertStore::ServerBoundCert* rsa_cert;
-  if (net::CLIENT_CERT_RSA_SIGN == certs[0]->type()) {
-    rsa_cert = certs[0];
-    ec_cert = certs[1];
+  net::DefaultServerBoundCertStore::ServerBoundCert* goog_cert;
+  net::DefaultServerBoundCertStore::ServerBoundCert* foo_cert;
+  if (certs[0]->server_identifier() == "google.com") {
+    goog_cert = certs[0];
+    foo_cert = certs[1];
   } else {
-    rsa_cert = certs[1];
-    ec_cert = certs[0];
+    goog_cert = certs[1];
+    foo_cert = certs[0];
   }
-  ASSERT_STREQ("google.com", rsa_cert->server_identifier().c_str());
-  ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, rsa_cert->type());
-  ASSERT_STREQ("a", rsa_cert->private_key().c_str());
-  ASSERT_STREQ("b", rsa_cert->cert().c_str());
-  ASSERT_EQ(1, rsa_cert->creation_time().ToInternalValue());
-  ASSERT_EQ(2, rsa_cert->expiration_time().ToInternalValue());
-  ASSERT_STREQ("foo.com", ec_cert->server_identifier().c_str());
-  ASSERT_EQ(net::CLIENT_CERT_ECDSA_SIGN, ec_cert->type());
-  ASSERT_STREQ("c", ec_cert->private_key().c_str());
-  ASSERT_STREQ("d", ec_cert->cert().c_str());
-  ASSERT_EQ(3, ec_cert->creation_time().ToInternalValue());
-  ASSERT_EQ(4, ec_cert->expiration_time().ToInternalValue());
+  ASSERT_EQ("google.com", goog_cert->server_identifier());
+  ASSERT_STREQ("a", goog_cert->private_key().c_str());
+  ASSERT_STREQ("b", goog_cert->cert().c_str());
+  ASSERT_EQ(1, goog_cert->creation_time().ToInternalValue());
+  ASSERT_EQ(2, goog_cert->expiration_time().ToInternalValue());
+  ASSERT_EQ("foo.com", foo_cert->server_identifier());
+  ASSERT_STREQ("c", foo_cert->private_key().c_str());
+  ASSERT_STREQ("d", foo_cert->cert().c_str());
+  ASSERT_EQ(3, foo_cert->creation_time().ToInternalValue());
+  ASSERT_EQ(4, foo_cert->expiration_time().ToInternalValue());
 
   // Now delete the cert and check persistence again.
   store_->DeleteServerBoundCert(*certs[0]);
@@ -207,23 +204,10 @@
     ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert> certs;
     store_ = new SQLiteServerBoundCertStore(v1_db_path, NULL);
 
-    // Load the database and ensure the certs can be read and are marked as RSA.
+    // Load the database. Because the existing v1 certs are implicitly of type
+    // RSA, which is unsupported, they're discarded.
     Load(&certs);
-    ASSERT_EQ(2U, certs.size());
-
-    ASSERT_STREQ("google.com", certs[0]->server_identifier().c_str());
-    ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, certs[0]->type());
-    ASSERT_EQ(GetTestCertExpirationTime(),
-              certs[0]->expiration_time());
-    ASSERT_EQ(key_data, certs[0]->private_key());
-    ASSERT_EQ(cert_data, certs[0]->cert());
-
-    ASSERT_STREQ("foo.com", certs[1]->server_identifier().c_str());
-    ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, certs[1]->type());
-    // Undecodable cert, expiration time will be uninitialized.
-    ASSERT_EQ(base::Time(), certs[1]->expiration_time());
-    ASSERT_STREQ("\xaa", certs[1]->private_key().c_str());
-    ASSERT_STREQ("\xbb", certs[1]->cert().c_str());
+    ASSERT_EQ(0U, certs.size());
 
     store_ = NULL;
     base::RunLoop().RunUntilIdle();
@@ -273,7 +257,7 @@
     add_smt.BindString(0, "google.com");
     add_smt.BindBlob(1, key_data.data(), key_data.size());
     add_smt.BindBlob(2, cert_data.data(), cert_data.size());
-    add_smt.BindInt64(3, 1);
+    add_smt.BindInt64(3, 64);
     ASSERT_TRUE(add_smt.Run());
 
     ASSERT_TRUE(db.Execute(
@@ -291,19 +275,17 @@
     ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert> certs;
     store_ = new SQLiteServerBoundCertStore(v2_db_path, NULL);
 
-    // Load the database and ensure the certs can be read and are marked as RSA.
+    // Load the database and ensure the certs can be read.
     Load(&certs);
     ASSERT_EQ(2U, certs.size());
 
-    ASSERT_STREQ("google.com", certs[0]->server_identifier().c_str());
-    ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, certs[0]->type());
+    ASSERT_EQ("google.com", certs[0]->server_identifier());
     ASSERT_EQ(GetTestCertExpirationTime(),
               certs[0]->expiration_time());
     ASSERT_EQ(key_data, certs[0]->private_key());
     ASSERT_EQ(cert_data, certs[0]->cert());
 
-    ASSERT_STREQ("foo.com", certs[1]->server_identifier().c_str());
-    ASSERT_EQ(net::CLIENT_CERT_ECDSA_SIGN, certs[1]->type());
+    ASSERT_EQ("foo.com", certs[1]->server_identifier());
     // Undecodable cert, expiration time will be uninitialized.
     ASSERT_EQ(base::Time(), certs[1]->expiration_time());
     ASSERT_STREQ("\xaa", certs[1]->private_key().c_str());
@@ -359,7 +341,7 @@
     add_smt.BindString(0, "google.com");
     add_smt.BindBlob(1, key_data.data(), key_data.size());
     add_smt.BindBlob(2, cert_data.data(), cert_data.size());
-    add_smt.BindInt64(3, 1);
+    add_smt.BindInt64(3, 64);
     add_smt.BindInt64(4, 1000);
     ASSERT_TRUE(add_smt.Run());
 
@@ -378,20 +360,18 @@
     ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert> certs;
     store_ = new SQLiteServerBoundCertStore(v3_db_path, NULL);
 
-    // Load the database and ensure the certs can be read and are marked as RSA.
+    // Load the database and ensure the certs can be read.
     Load(&certs);
     ASSERT_EQ(2U, certs.size());
 
-    ASSERT_STREQ("google.com", certs[0]->server_identifier().c_str());
-    ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, certs[0]->type());
+    ASSERT_EQ("google.com", certs[0]->server_identifier());
     ASSERT_EQ(1000, certs[0]->expiration_time().ToInternalValue());
     ASSERT_EQ(GetTestCertCreationTime(),
               certs[0]->creation_time());
     ASSERT_EQ(key_data, certs[0]->private_key());
     ASSERT_EQ(cert_data, certs[0]->cert());
 
-    ASSERT_STREQ("foo.com", certs[1]->server_identifier().c_str());
-    ASSERT_EQ(net::CLIENT_CERT_ECDSA_SIGN, certs[1]->type());
+    ASSERT_EQ("foo.com", certs[1]->server_identifier());
     ASSERT_EQ(2000, certs[1]->expiration_time().ToInternalValue());
     // Undecodable cert, creation time will be uninitialized.
     ASSERT_EQ(base::Time(), certs[1]->creation_time());
@@ -414,3 +394,76 @@
     }
   }
 }
+
+TEST_F(SQLiteServerBoundCertStoreTest, TestRSADiscarded) {
+  // Reset the store.  We'll be using a different database for this test.
+  store_ = NULL;
+
+  base::FilePath v4_db_path(temp_dir_.path().AppendASCII("v4dbrsa"));
+
+  std::string key_data;
+  std::string cert_data;
+  ReadTestKeyAndCert(&key_data, &cert_data);
+
+  // Create a version 4 database with a mix of RSA and ECDSA certs.
+  {
+    sql::Connection db;
+    ASSERT_TRUE(db.Open(v4_db_path));
+    ASSERT_TRUE(db.Execute(
+        "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,"
+            "value LONGVARCHAR);"
+        "INSERT INTO \"meta\" VALUES('version','4');"
+        "INSERT INTO \"meta\" VALUES('last_compatible_version','1');"
+        "CREATE TABLE origin_bound_certs ("
+            "origin TEXT NOT NULL UNIQUE PRIMARY KEY,"
+            "private_key BLOB NOT NULL,"
+            "cert BLOB NOT NULL,"
+            "cert_type INTEGER,"
+            "expiration_time INTEGER,"
+            "creation_time INTEGER);"
+        ));
+
+    sql::Statement add_smt(db.GetUniqueStatement(
+        "INSERT INTO origin_bound_certs "
+        "(origin, private_key, cert, cert_type, expiration_time, creation_time)"
+        " VALUES (?,?,?,?,?,?)"));
+    add_smt.BindString(0, "google.com");
+    add_smt.BindBlob(1, key_data.data(), key_data.size());
+    add_smt.BindBlob(2, cert_data.data(), cert_data.size());
+    add_smt.BindInt64(3, 64);
+    add_smt.BindInt64(4, GetTestCertExpirationTime().ToInternalValue());
+    add_smt.BindInt64(5, base::Time::Now().ToInternalValue());
+    ASSERT_TRUE(add_smt.Run());
+
+    add_smt.Clear();
+    add_smt.Assign(db.GetUniqueStatement(
+        "INSERT INTO origin_bound_certs "
+        "(origin, private_key, cert, cert_type, expiration_time, creation_time)"
+        " VALUES (?,?,?,?,?,?)"));
+    add_smt.BindString(0, "foo.com");
+    add_smt.BindBlob(1, key_data.data(), key_data.size());
+    add_smt.BindBlob(2, cert_data.data(), cert_data.size());
+    add_smt.BindInt64(3, 1);
+    add_smt.BindInt64(4, GetTestCertExpirationTime().ToInternalValue());
+    add_smt.BindInt64(5, base::Time::Now().ToInternalValue());
+    ASSERT_TRUE(add_smt.Run());
+  }
+
+  ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert> certs;
+  store_ = new SQLiteServerBoundCertStore(v4_db_path, NULL);
+
+  // Load the database and ensure the certs can be read.
+  Load(&certs);
+  // Only the ECDSA cert (for google.com) is read, the RSA one is discarded.
+  ASSERT_EQ(1U, certs.size());
+
+  ASSERT_EQ("google.com", certs[0]->server_identifier());
+  ASSERT_EQ(GetTestCertExpirationTime(),
+            certs[0]->expiration_time());
+  ASSERT_EQ(key_data, certs[0]->private_key());
+  ASSERT_EQ(cert_data, certs[0]->cert());
+
+  store_ = NULL;
+  // Make sure we wait until the destructor has run.
+  base::RunLoop().RunUntilIdle();
+}
diff --git a/chrome/browser/notifications/message_center_notification_manager.cc b/chrome/browser/notifications/message_center_notification_manager.cc
index b249f49..5661734 100644
--- a/chrome/browser/notifications/message_center_notification_manager.cc
+++ b/chrome/browser/notifications/message_center_notification_manager.cc
@@ -36,21 +36,22 @@
 
 MessageCenterNotificationManager::MessageCenterNotificationManager(
     message_center::MessageCenter* message_center,
-    PrefService* local_state)
+    PrefService* local_state,
+    scoped_ptr<message_center::NotifierSettingsProvider> settings_provider)
     : message_center_(message_center),
 #if defined(OS_WIN)
       first_run_idle_timeout_(
           base::TimeDelta::FromSeconds(kFirstRunIdleDelaySeconds)),
       weak_factory_(this),
 #endif
-      settings_controller_(new MessageCenterSettingsController) {
+      settings_provider_(settings_provider.Pass()) {
 #if defined(OS_WIN)
   first_run_pref_.Init(prefs::kMessageCenterShowedFirstRunBalloon, local_state);
 #endif
 
   message_center_->SetDelegate(this);
   message_center_->AddObserver(this);
-  message_center_->SetNotifierSettingsProvider(settings_controller_.get());
+  message_center_->SetNotifierSettingsProvider(settings_provider_.get());
 
 #if defined(OS_WIN) || defined(OS_MACOSX) \
   || (defined(USE_AURA) && !defined(USE_ASH))
diff --git a/chrome/browser/notifications/message_center_notification_manager.h b/chrome/browser/notifications/message_center_notification_manager.h
index 91701d2..be2621e 100644
--- a/chrome/browser/notifications/message_center_notification_manager.h
+++ b/chrome/browser/notifications/message_center_notification_manager.h
@@ -34,9 +34,10 @@
       public message_center::MessageCenter::Delegate,
       public message_center::MessageCenterObserver {
  public:
-  explicit MessageCenterNotificationManager(
+  MessageCenterNotificationManager(
       message_center::MessageCenter* message_center,
-      PrefService* local_state);
+      PrefService* local_state,
+      scoped_ptr<message_center::NotifierSettingsProvider> settings_provider);
   virtual ~MessageCenterNotificationManager();
 
   // NotificationUIManager
@@ -220,7 +221,7 @@
   base::WeakPtrFactory<MessageCenterNotificationManager> weak_factory_;
 #endif
 
-  scoped_ptr<MessageCenterSettingsController> settings_controller_;
+  scoped_ptr<message_center::NotifierSettingsProvider> settings_provider_;
 
   // Registrar for the other kind of notifications (event signaling).
   content::NotificationRegistrar registrar_;
diff --git a/chrome/browser/notifications/message_center_notifications_unittest_win.cc b/chrome/browser/notifications/message_center_notifications_unittest_win.cc
index fd674e6..01c8534 100644
--- a/chrome/browser/notifications/message_center_notifications_unittest_win.cc
+++ b/chrome/browser/notifications/message_center_notifications_unittest_win.cc
@@ -17,9 +17,11 @@
 #include "chrome/test/base/testing_profile.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/message_center/fake_notifier_settings_provider.h"
 #include "ui/message_center/message_center_impl.h"
 #include "ui/message_center/message_center_tray.h"
 #include "ui/message_center/message_center_tray_delegate.h"
+#include "ui/message_center/notifier_settings.h"
 
 namespace message_center {
 class FakeMessageCenterTrayDelegate : public MessageCenterTrayDelegate {
@@ -72,8 +74,10 @@
     // Initialize message center infrastructure with mock tray delegate.
     MessageCenter::Initialize();
     message_center_ = MessageCenter::Get();
-    notification_manager_.reset(
-        new MessageCenterNotificationManager(message_center_, &local_state_));
+    scoped_ptr<NotifierSettingsProvider> settings_provider(
+        new FakeNotifierSettingsProvider(notifiers_));
+    notification_manager_.reset(new MessageCenterNotificationManager(
+        message_center_, &local_state_, settings_provider.Pass()));
     delegate_ = new FakeMessageCenterTrayDelegate(message_center_,
                                                   run_loop_->QuitClosure());
     notification_manager_->SetMessageCenterTrayDelegateForTest(delegate_);
@@ -111,6 +115,7 @@
   scoped_ptr<base::RunLoop> run_loop_;
   TestingPrefServiceSimple local_state_;
   MessageCenter* message_center_;
+  std::vector<Notifier*> notifiers_;
   scoped_ptr<MessageCenterNotificationManager> notification_manager_;
   FakeMessageCenterTrayDelegate* delegate_;
   content::TestBrowserThreadBundle thread_bundle_;
diff --git a/chrome/browser/notifications/message_center_settings_controller.cc b/chrome/browser/notifications/message_center_settings_controller.cc
index 5e9a588..ef91c33 100644
--- a/chrome/browser/notifications/message_center_settings_controller.cc
+++ b/chrome/browser/notifications/message_center_settings_controller.cc
@@ -9,6 +9,7 @@
 #include "base/command_line.h"
 #include "base/i18n/string_compare.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/app_icon_loader_impl.h"
 #include "chrome/browser/extensions/extension_service.h"
@@ -19,6 +20,8 @@
 #include "chrome/browser/notifications/desktop_notification_service_factory.h"
 #include "chrome/browser/notifications/sync_notifier/chrome_notifier_service.h"
 #include "chrome/browser/notifications/sync_notifier/chrome_notifier_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_info_cache.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/cancelable_task_tracker.h"
 #include "chrome/common/extensions/extension_constants.h"
@@ -32,16 +35,39 @@
 #include "ui/gfx/image/image.h"
 #include "ui/message_center/message_center_style.h"
 
-#if defined(USE_ASH)
-#include "ash/shell.h"
-#include "ash/system/web_notification/web_notification_tray.h"
-#endif
-
 using message_center::Notifier;
 using message_center::NotifierId;
 
-namespace {
+namespace message_center {
+class ProfileNotifierGroup : public message_center::NotifierGroup {
+ public:
+  ProfileNotifierGroup(const gfx::Image& icon,
+                       const string16& display_name,
+                       const string16& login_info,
+                       size_t index,
+                       const base::FilePath& profile_path);
+  virtual ~ProfileNotifierGroup() {}
 
+  Profile* profile() const { return profile_; }
+
+ private:
+  Profile* profile_;
+};
+
+ProfileNotifierGroup::ProfileNotifierGroup(const gfx::Image& icon,
+                                           const string16& display_name,
+                                           const string16& login_info,
+                                           size_t index,
+                                           const base::FilePath& profile_path)
+    : message_center::NotifierGroup(icon, display_name, login_info, index),
+      profile_(NULL) {
+  // Try to get the profile
+  profile_ =
+      g_browser_process->profile_manager()->GetProfileByPath(profile_path);
+}
+}  // namespace message_center
+
+namespace {
 class NotifierComparator {
  public:
   explicit NotifierComparator(icu::Collator* collator) : collator_(collator) {}
@@ -61,13 +87,26 @@
 
 }  // namespace
 
-MessageCenterSettingsController::MessageCenterSettingsController()
-  : profile_(NULL) {
-  // We set the profile associated with the settings at the beginning and fail
-  // silently if this profile is destroyed later. This is a temporary fix for
-  // http://crbug.com/263193
-  registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
-                 content::NotificationService::AllSources());
+MessageCenterSettingsController::MessageCenterSettingsController(
+    ProfileInfoCache* profile_info_cache)
+    : current_notifier_group_(0), profile_info_cache_(profile_info_cache) {
+  DCHECK(profile_info_cache_);
+  // The following events all represent changes that may need to be reflected in
+  // the profile selector context menu, so listen for them all.  We'll just
+  // rebuild the list when we get any of them.
+  registrar_.Add(this,
+                 chrome::NOTIFICATION_PROFILE_CREATED,
+                 content::NotificationService::AllBrowserContextsAndSources());
+  registrar_.Add(this,
+                 chrome::NOTIFICATION_PROFILE_ADDED,
+                 content::NotificationService::AllBrowserContextsAndSources());
+  registrar_.Add(this,
+                 chrome::NOTIFICATION_PROFILE_DESTROYED,
+                 content::NotificationService::AllBrowserContextsAndSources());
+  registrar_.Add(this,
+                 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
+                 content::NotificationService::AllBrowserContextsAndSources());
+  RebuildNotifierGroups();
 }
 
 MessageCenterSettingsController::~MessageCenterSettingsController() {
@@ -83,15 +122,47 @@
   observers_.RemoveObserver(observer);
 }
 
+size_t MessageCenterSettingsController::GetNotifierGroupCount() const {
+  return notifier_groups_.size();
+}
+
+const message_center::NotifierGroup&
+MessageCenterSettingsController::GetNotifierGroupAt(size_t index) const {
+  DCHECK_LT(index, notifier_groups_.size());
+  return *(notifier_groups_[index]);
+}
+
+const message_center::NotifierGroup&
+MessageCenterSettingsController::GetActiveNotifierGroup() const {
+  DCHECK_LT(current_notifier_group_, notifier_groups_.size());
+  return *(notifier_groups_[current_notifier_group_]);
+}
+
+void MessageCenterSettingsController::SwitchToNotifierGroup(size_t index) {
+  DCHECK_LT(index, notifier_groups_.size());
+  if (current_notifier_group_ == index)
+    return;
+
+  current_notifier_group_ = index;
+  FOR_EACH_OBSERVER(message_center::NotifierSettingsObserver,
+                    observers_,
+                    NotifierGroupChanged());
+}
+
 void MessageCenterSettingsController::GetNotifierList(
     std::vector<Notifier*>* notifiers) {
   DCHECK(notifiers);
   // TODO(mukai): Fix this for multi-profile.
   // Temporarily use the last used profile to prevent chrome from crashing when
   // the default profile is not loaded.
-  profile_ = ProfileManager::GetLastUsedProfileAllowedByPolicy();
+  message_center::ProfileNotifierGroup* group =
+      notifier_groups_[current_notifier_group_];
+  Profile* profile = group->profile();
+  if (!profile)
+    return;
+
   DesktopNotificationService* notification_service =
-      DesktopNotificationServiceFactory::GetForProfile(profile_);
+      DesktopNotificationServiceFactory::GetForProfile(profile);
 
   UErrorCode error;
   scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(error));
@@ -99,7 +170,7 @@
   if (!U_FAILURE(error))
     comparator.reset(new NotifierComparator(collator.get()));
 
-  ExtensionService* extension_service = profile_->GetExtensionService();
+  ExtensionService* extension_service = profile->GetExtensionService();
   const ExtensionSet* extension_set = extension_service->extensions();
   // The extension icon size has to be 32x32 at least to load bigger icons if
   // the icon doesn't exist for the specified size, and in that case it falls
@@ -107,9 +178,10 @@
   // dialog. See chrome/browser/extensions/extension_icon_image.cc and
   // crbug.com/222931
   app_icon_loader_.reset(new extensions::AppIconLoaderImpl(
-      profile_, extension_misc::EXTENSION_ICON_SMALL, this));
+      profile, extension_misc::EXTENSION_ICON_SMALL, this));
   for (ExtensionSet::const_iterator iter = extension_set->begin();
-       iter != extension_set->end(); ++iter) {
+       iter != extension_set->end();
+       ++iter) {
     const extensions::Extension* extension = iter->get();
     if (!extension->HasAPIPermission(
             extensions::APIPermission::kNotification)) {
@@ -128,7 +200,7 @@
           CommandLine::ForCurrentProcess())) {
     notifier::ChromeNotifierService* sync_notifier_service =
         notifier::ChromeNotifierServiceFactory::GetInstance()->GetForProfile(
-            profile_, Profile::EXPLICIT_ACCESS);
+            profile, Profile::EXPLICIT_ACCESS);
     sync_notifier_service->GetSyncedNotificationServices(notifiers);
 
     if (comparator)
@@ -141,8 +213,8 @@
 
   ContentSettingsForOneType settings;
   notification_service->GetNotificationsSettings(&settings);
-  FaviconService* favicon_service = FaviconServiceFactory::GetForProfile(
-      profile_, Profile::EXPLICIT_ACCESS);
+  FaviconService* favicon_service =
+      FaviconServiceFactory::GetForProfile(profile, Profile::EXPLICIT_ACCESS);
   favicon_tracker_.reset(new CancelableTaskTracker());
   patterns_.clear();
   for (ContentSettingsForOneType::const_iterator iter = settings.begin();
@@ -163,7 +235,9 @@
         notification_service->IsNotifierEnabled(notifier_id)));
     patterns_[name] = iter->primary_pattern;
     FaviconService::FaviconForURLParams favicon_params(
-        profile_, url, chrome::FAVICON | chrome::TOUCH_ICON,
+        profile,
+        url,
+        chrome::FAVICON | chrome::TOUCH_ICON,
         message_center::kSettingsIconSize);
     // Note that favicon service obtains the favicon from history. This means
     // that it will fail to obtain the image if there are no history data for
@@ -201,12 +275,11 @@
 void MessageCenterSettingsController::SetNotifierEnabled(
     const Notifier& notifier,
     bool enabled) {
-  // TODO(mukai): Fix this for multi-profile.
-  // If the profile has been destroyed, fail silently.
-  if (!profile_)
-    return;
+  Profile* profile = notifier_groups_[current_notifier_group_]->profile();
+  DCHECK(profile);
+
   DesktopNotificationService* notification_service =
-      DesktopNotificationServiceFactory::GetForProfile(profile_);
+      DesktopNotificationServiceFactory::GetForProfile(profile);
 
   if (notifier.notifier_id.type == NotifierId::WEB_PAGE) {
     // WEB_PAGE notifier cannot handle in DesktopNotificationService
@@ -243,7 +316,7 @@
     if (notifier.notifier_id.type == NotifierId::SYNCED_NOTIFICATION_SERVICE) {
       notifier::ChromeNotifierService* notifier_service =
           notifier::ChromeNotifierServiceFactory::GetInstance()->GetForProfile(
-              profile_, Profile::EXPLICIT_ACCESS);
+              profile, Profile::EXPLICIT_ACCESS);
       notifier_service->OnSyncedNotificationServiceEnabled(
           notifier.notifier_id.id, enabled);
     }
@@ -256,17 +329,6 @@
   patterns_.clear();
 }
 
-void MessageCenterSettingsController::Observe(
-    int type,
-    const content::NotificationSource& source,
-    const content::NotificationDetails& details) {
-  if (type == chrome::NOTIFICATION_PROFILE_DESTROYED &&
-      content::Source<Profile>(source).ptr() == profile_) {
-    // Our profile just got destroyed, so we delete our pointer to it.
-    profile_ = NULL;
-  }
-}
-
 void MessageCenterSettingsController::OnFaviconLoaded(
     const GURL& url,
     const chrome::FaviconImageResult& favicon_result) {
@@ -283,3 +345,32 @@
                     UpdateIconImage(NotifierId(NotifierId::APPLICATION, id),
                                     gfx::Image(image)));
 }
+
+void MessageCenterSettingsController::Observe(
+    int type,
+    const content::NotificationSource& source,
+    const content::NotificationDetails& details) {
+  RebuildNotifierGroups();
+  FOR_EACH_OBSERVER(message_center::NotifierSettingsObserver,
+                    observers_,
+                    NotifierGroupChanged());
+}
+
+void MessageCenterSettingsController::RebuildNotifierGroups() {
+  notifier_groups_.clear();
+  current_notifier_group_ = 0;
+
+  const size_t count = profile_info_cache_->GetNumberOfProfiles();
+  for (size_t i = 0; i < count; ++i) {
+    message_center::ProfileNotifierGroup* group =
+        new message_center::ProfileNotifierGroup(
+            profile_info_cache_->GetAvatarIconOfProfileAtIndex(i),
+            profile_info_cache_->GetNameOfProfileAtIndex(i),
+            profile_info_cache_->GetUserNameOfProfileAtIndex(i),
+            i,
+            profile_info_cache_->GetPathOfProfileAtIndex(i));
+    if (group->profile() != NULL) {
+      notifier_groups_.push_back(group);
+    }
+  }
+}
diff --git a/chrome/browser/notifications/message_center_settings_controller.h b/chrome/browser/notifications/message_center_settings_controller.h
index 1a66099..4adc136 100644
--- a/chrome/browser/notifications/message_center_settings_controller.h
+++ b/chrome/browser/notifications/message_center_settings_controller.h
@@ -10,28 +10,36 @@
 
 #include "base/basictypes.h"
 #include "base/memory/scoped_ptr.h"
+#include "base/memory/scoped_vector.h"
 #include "base/observer_list.h"
 #include "chrome/browser/extensions/app_icon_loader.h"
-#include "chrome/browser/profiles/profile.h"
 #include "chrome/common/content_settings.h"
+#include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/notification_source.h"
 #include "ui/message_center/notifier_settings.h"
 
 class CancelableTaskTracker;
+class ProfileInfoCache;
 
 namespace chrome {
 struct FaviconImageResult;
 }
 
+namespace message_center {
+class ProfileNotifierGroup;
+}
+
 // The class to bridge between the settings UI of notifiers and the preference
 // storage.
 class MessageCenterSettingsController
     : public message_center::NotifierSettingsProvider,
-      public extensions::AppIconLoader::Delegate,
-      public content::NotificationObserver {
+      public content::NotificationObserver,
+      public extensions::AppIconLoader::Delegate {
  public:
-  MessageCenterSettingsController();
+  explicit MessageCenterSettingsController(
+      ProfileInfoCache* profile_info_cache);
   virtual ~MessageCenterSettingsController();
 
   // Overridden from message_center::NotifierSettingsProvider.
@@ -39,12 +47,16 @@
       message_center::NotifierSettingsObserver* observer) OVERRIDE;
   virtual void RemoveObserver(
       message_center::NotifierSettingsObserver* observer) OVERRIDE;
-  virtual void GetNotifierList(
-      std::vector<message_center::Notifier*>* notifiers)
+  virtual size_t GetNotifierGroupCount() const OVERRIDE;
+  virtual const message_center::NotifierGroup& GetNotifierGroupAt(
+      size_t index) const OVERRIDE;
+  virtual void SwitchToNotifierGroup(size_t index) OVERRIDE;
+  virtual const message_center::NotifierGroup& GetActiveNotifierGroup() const
       OVERRIDE;
-  virtual void SetNotifierEnabled(
-      const message_center::Notifier& notifier,
-      bool enabled) OVERRIDE;
+  virtual void GetNotifierList(
+      std::vector<message_center::Notifier*>* notifiers) OVERRIDE;
+  virtual void SetNotifierEnabled(const message_center::Notifier& notifier,
+                                  bool enabled) OVERRIDE;
   virtual void OnNotifierSettingsClosing() OVERRIDE;
 
   // Overridden from extensions::AppIconLoader::Delegate.
@@ -60,6 +72,8 @@
   void OnFaviconLoaded(const GURL& url,
                        const chrome::FaviconImageResult& favicon_result);
 
+  void RebuildNotifierGroups();
+
   // The views displaying notifier settings.
   ObserverList<message_center::NotifierSettingsObserver> observers_;
 
@@ -70,12 +84,14 @@
 
   std::map<string16, ContentSettingsPattern> patterns_;
 
-  // The Registrar used to register for notifications.
+  // The list of all configurable notifier groups. This is each profile that is
+  // loaded (and in the ProfileInfoCache - so no incognito profiles go here).
+  ScopedVector<message_center::ProfileNotifierGroup> notifier_groups_;
+  size_t current_notifier_group_;
+
   content::NotificationRegistrar registrar_;
 
-  // TODO(sidharthms): Fix this for multi-profile.
-  // The profile associated with message center settings.
-  Profile* profile_;
+  ProfileInfoCache* profile_info_cache_;
 
   DISALLOW_COPY_AND_ASSIGN(MessageCenterSettingsController);
 };
diff --git a/chrome/browser/notifications/message_center_settings_controller_unittest.cc b/chrome/browser/notifications/message_center_settings_controller_unittest.cc
new file mode 100644
index 0000000..e46505c
--- /dev/null
+++ b/chrome/browser/notifications/message_center_settings_controller_unittest.cc
@@ -0,0 +1,71 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/notifications/message_center_settings_controller.h"
+#include "chrome/browser/prefs/pref_service_syncable.h"
+#include "chrome/browser/profiles/profile_info_cache.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile_manager.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/message_center/notifier_settings.h"
+
+class MessageCenterSettingsControllerTest : public testing::Test {
+ protected:
+  MessageCenterSettingsControllerTest()
+      : testing_profile_manager_(TestingBrowserProcess::GetGlobal()) {};
+  virtual ~MessageCenterSettingsControllerTest() {};
+
+  base::FilePath GetProfilePath(const std::string& base_name) {
+    return testing_profile_manager_.profile_manager()->user_data_dir()
+        .AppendASCII(base_name);
+  }
+
+  virtual void SetUp() OVERRIDE {
+    ASSERT_TRUE(testing_profile_manager_.SetUp());
+  }
+
+  ProfileInfoCache* GetCache() {
+    return testing_profile_manager_.profile_info_cache();
+  }
+
+  void CreateProfile(const std::string& name) {
+    testing_profile_manager_.CreateTestingProfile(name);
+  }
+
+  TestingProfileManager testing_profile_manager_;
+};
+
+TEST_F(MessageCenterSettingsControllerTest, NotifierGroups) {
+  CreateProfile("Profile-1");
+  CreateProfile("Profile-2");
+
+  scoped_ptr<MessageCenterSettingsController> controller(
+      new MessageCenterSettingsController(GetCache()));
+
+  EXPECT_EQ(controller->GetNotifierGroupCount(), 2u);
+
+  EXPECT_EQ(controller->GetNotifierGroupAt(0).name, UTF8ToUTF16("Profile-1"));
+  EXPECT_EQ(controller->GetNotifierGroupAt(0).index, 0u);
+
+  EXPECT_EQ(controller->GetNotifierGroupAt(1).name, UTF8ToUTF16("Profile-2"));
+  EXPECT_EQ(controller->GetNotifierGroupAt(1).index, 1u);
+
+  EXPECT_EQ(controller->GetActiveNotifierGroup().name,
+            UTF8ToUTF16("Profile-1"));
+  EXPECT_EQ(controller->GetActiveNotifierGroup().index, 0u);
+
+  controller->SwitchToNotifierGroup(1);
+  EXPECT_EQ(controller->GetActiveNotifierGroup().name,
+            UTF8ToUTF16("Profile-2"));
+  EXPECT_EQ(controller->GetActiveNotifierGroup().index, 1u);
+
+  controller->SwitchToNotifierGroup(0);
+  EXPECT_EQ(controller->GetActiveNotifierGroup().name,
+            UTF8ToUTF16("Profile-1"));
+}
diff --git a/chrome/browser/notifications/notification_ui_manager.cc b/chrome/browser/notifications/notification_ui_manager.cc
index 8bbafe7..19e6c24 100644
--- a/chrome/browser/notifications/notification_ui_manager.cc
+++ b/chrome/browser/notifications/notification_ui_manager.cc
@@ -4,10 +4,14 @@
 
 #include "chrome/browser/notifications/notification_ui_manager.h"
 
+#include "base/memory/scoped_ptr.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/notifications/balloon_notification_ui_manager.h"
 #include "chrome/browser/notifications/message_center_notification_manager.h"
+#include "chrome/browser/notifications/message_center_settings_controller.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_info_cache.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "ui/message_center/message_center_util.h"
 
 // static
@@ -24,9 +28,16 @@
 #if !defined(OS_MACOSX)
 // static
 NotificationUIManager* NotificationUIManager::Create(PrefService* local_state) {
-  if (DelegatesToMessageCenter())
+  if (DelegatesToMessageCenter()) {
+    ProfileInfoCache* profile_info_cache =
+        &g_browser_process->profile_manager()->GetProfileInfoCache();
+    scoped_ptr<message_center::NotifierSettingsProvider> settings_provider(
+        new MessageCenterSettingsController(profile_info_cache));
     return new MessageCenterNotificationManager(
-        g_browser_process->message_center(), local_state);
+        g_browser_process->message_center(),
+        local_state,
+        settings_provider.Pass());
+  }
 
   BalloonNotificationUIManager* balloon_manager =
       new BalloonNotificationUIManager(local_state);
diff --git a/chrome/browser/notifications/notification_ui_manager_mac.mm b/chrome/browser/notifications/notification_ui_manager_mac.mm
index 5222aa1..d0b783c 100644
--- a/chrome/browser/notifications/notification_ui_manager_mac.mm
+++ b/chrome/browser/notifications/notification_ui_manager_mac.mm
@@ -6,12 +6,16 @@
 
 #include "base/mac/cocoa_protocols.h"
 #include "base/mac/mac_util.h"
+#include "base/memory/scoped_ptr.h"
 #include "base/strings/sys_string_conversions.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/notifications/notification.h"
 #include "chrome/browser/notifications/balloon_notification_ui_manager.h"
 #include "chrome/browser/notifications/message_center_notification_manager.h"
+#include "chrome/browser/notifications/message_center_settings_controller.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_info_cache.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "ui/message_center/message_center_util.h"
 
 @class NSUserNotificationCenter;
@@ -101,8 +105,14 @@
   // TODO(rsesek): Remove this function and merge it with the one in
   // notification_ui_manager.cc.
   if (DelegatesToMessageCenter()) {
+    ProfileInfoCache* profile_info_cache =
+        &g_browser_process->profile_manager()->GetProfileInfoCache();
+    scoped_ptr<message_center::NotifierSettingsProvider> settings_provider(
+        new MessageCenterSettingsController(profile_info_cache));
     return new MessageCenterNotificationManager(
-        g_browser_process->message_center(), local_state);
+        g_browser_process->message_center(),
+        local_state,
+        settings_provider.Pass());
   }
 
   BalloonNotificationUIManager* balloon_manager = NULL;
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index e15504b..c45b476 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -1297,18 +1297,7 @@
 }
 #endif
 
-// There's a bug filed for flakiness on windows: http://crbug.com/248464.
-// Unfortunately, the bug doesn't contain any actionable information, so this
-// test is temporarily enabled to get some cycles on the builders in order to
-// gather data on the nature of the flakes.
-#if defined(OS_WIN)
-// TODO(mnissler): Flip back to DISABLED after obtaining logs from flaky runs.
-#define MAYBE_ExtensionInstallBlacklist ExtensionInstallBlacklist
-#else
-#define MAYBE_ExtensionInstallBlacklist ExtensionInstallBlacklist
-#endif
-
-IN_PROC_BROWSER_TEST_F(PolicyTest, MAYBE_ExtensionInstallBlacklist) {
+IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklistSelective) {
   // Verifies that blacklisted extensions can't be installed.
   ExtensionService* service = extension_service();
   ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true));
@@ -1330,15 +1319,24 @@
   EXPECT_EQ(kAdBlockCrxId, adblock->id());
   EXPECT_EQ(adblock,
             service->GetExtensionById(kAdBlockCrxId, true));
+}
 
-  // Now blacklist all extensions.
-  blacklist.Clear();
+IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklistWildcard) {
+  // Verify that a wildcard blacklist takes effect.
+  EXPECT_TRUE(InstallExtension(kAdBlockCrxName));
+  ExtensionService* service = extension_service();
+  ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true));
+  ASSERT_TRUE(service->GetExtensionById(kAdBlockCrxId, true));
+  base::ListValue blacklist;
   blacklist.Append(base::Value::CreateStringValue("*"));
+  PolicyMap policies;
   policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY,
                POLICY_SCOPE_USER, blacklist.DeepCopy(), NULL);
   UpdateProviderPolicy(policies);
+
   // AdBlock was automatically removed.
   ASSERT_FALSE(service->GetExtensionById(kAdBlockCrxId, true));
+
   // And can't be installed again, nor can good.crx.
   EXPECT_FALSE(InstallExtension(kAdBlockCrxName));
   EXPECT_FALSE(service->GetExtensionById(kAdBlockCrxId, true));
diff --git a/chrome/browser/policy/proto/chromeos/chrome_device_policy.proto b/chrome/browser/policy/proto/chromeos/chrome_device_policy.proto
index 06deb8b..a88f58f 100644
--- a/chrome/browser/policy/proto/chromeos/chrome_device_policy.proto
+++ b/chrome/browser/policy/proto/chromeos/chrome_device_policy.proto
@@ -236,6 +236,12 @@
   optional string timezone = 1;
 }
 
+message SystemUse24HourClockProto {
+  // Specifies an owner-determined clock format that applies to the login
+  // screen and all users.
+  optional bool use_24hour_clock = 1;
+}
+
 // Parameters for Kiosk App device-local accounts.
 message KioskAppInfoProto {
   // Indicates the Kiosk App for the corresponding device-local account. The
@@ -539,4 +545,5 @@
   optional AccessibilitySettingsProto accessibility_settings = 27;
   optional SupervisedUsersSettingsProto supervised_users_settings = 28;
   optional LoginScreenPowerManagementProto login_screen_power_management = 29;
+  optional SystemUse24HourClockProto use_24hour_clock = 30;
 }
diff --git a/chrome/browser/policy/test/policy_testserver.py b/chrome/browser/policy/test/policy_testserver.py
index c7113b5..1ccf35a 100644
--- a/chrome/browser/policy/test/policy_testserver.py
+++ b/chrome/browser/policy/test/policy_testserver.py
@@ -310,7 +310,7 @@
     # else return a descriptive default value.
     response = dm.DeviceManagementResponse()
     response.service_api_access_response.auth_code = policy.get(
-        'robot_api_auth_code', 'policy_test_server.py-auth_code')
+        'robot_api_auth_code', 'policy_testserver.py-auth_code')
     self.DumpMessage('Response', response)
 
     return (200, response.SerializeToString())
@@ -592,6 +592,9 @@
     policy_data.valid_serial_number_missing = (
         token_info['machine_id'] in BAD_MACHINE_IDS)
     policy_data.settings_entity_id = msg.settings_entity_id
+    policy_data.service_account_identity = policy.get(
+        'service_account_identity',
+        'policy_testserver.py-service_account_identity')
 
     if signing_key:
       policy_data.public_key_version = current_key_index + 1
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 957e655..f954807 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -178,6 +178,12 @@
 // Chrome To Mobile has been removed; this pref will be cleared from user data.
 const char kChromeToMobilePref[] = "chrome_to_mobile.device_list";
 
+#if !defined(OS_ANDROID)
+// The sync promo error message preference has been removed; this pref will
+// be cleared from user data.
+const char kSyncPromoErrorMessage[] = "sync_promo.error_message";
+#endif
+
 }  // namespace
 
 namespace chrome {
@@ -388,6 +394,12 @@
   registry->RegisterListPref(
       kChromeToMobilePref,
       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+#if !defined(OS_ANDROID)
+  registry->RegisterStringPref(
+      kSyncPromoErrorMessage,
+      std::string(),
+      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+#endif
 }
 
 void RegisterUserProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
@@ -415,6 +427,12 @@
   // Cleanup prefs from now-removed Chrome To Mobile feature.
   prefs->ClearPref(kChromeToMobilePref);
 
+#if !defined(OS_ANDROID)
+  // Cleanup now-removed sync promo error message preference.
+  // TODO(fdoray): Remove this when it's safe to do so (crbug.com/268442).
+  prefs->ClearPref(kSyncPromoErrorMessage);
+#endif
+
   PrefsTabHelper::MigrateUserPrefs(prefs);
   PromoResourceService::MigrateUserPrefs(prefs);
   TranslatePrefs::MigrateUserPrefs(prefs);
diff --git a/chrome/browser/profile_resetter/profile_resetter_unittest.cc b/chrome/browser/profile_resetter/profile_resetter_unittest.cc
index be72377..8a4993e 100644
--- a/chrome/browser/profile_resetter/profile_resetter_unittest.cc
+++ b/chrome/browser/profile_resetter/profile_resetter_unittest.cc
@@ -445,8 +445,6 @@
 }
 
 TEST_F(ProfileResetterTest, ResetExtensionsByDisabling) {
-  service_->Init();
-
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
 
diff --git a/chrome/browser/profiles/avatar_menu_model.cc b/chrome/browser/profiles/avatar_menu_model.cc
index 8b1a4d1..99f9d89 100644
--- a/chrome/browser/profiles/avatar_menu_model.cc
+++ b/chrome/browser/profiles/avatar_menu_model.cc
@@ -249,7 +249,7 @@
 #if defined(ENABLE_MANAGED_USERS)
     ManagedUserService* service = ManagedUserServiceFactory::GetForProfile(
         browser_->profile());
-    base::string16 custodian = UTF8ToUTF16(service->GetCustodianName());
+    base::string16 custodian = UTF8ToUTF16(service->GetCustodianEmailAddress());
     return l10n_util::GetStringFUTF16(IDS_MANAGED_USER_INFO, custodian);
 #endif
   }
diff --git a/chrome/browser/profiles/profile_shortcut_manager_win.cc b/chrome/browser/profiles/profile_shortcut_manager_win.cc
index 7ce8ca2..9a0d9ed 100644
--- a/chrome/browser/profiles/profile_shortcut_manager_win.cc
+++ b/chrome/browser/profiles/profile_shortcut_manager_win.cc
@@ -527,7 +527,6 @@
   ListDesktopShortcutsWithCommandLine(chrome_exe, command_line, false,
                                       &shortcuts);
 
-  BrowserDistribution* distribution = BrowserDistribution::GetDistribution();
   for (size_t i = 0; i < shortcuts.size(); ++i) {
     // Use base::DeleteFile() instead of ShellUtil::RemoveShortcut(), as the
     // latter causes non-profile taskbar shortcuts to be unpinned.
diff --git a/chrome/browser/resources/bookmark_manager/css/bmm.css b/chrome/browser/resources/bookmark_manager/css/bmm.css
index 848482e..5c10770 100644
--- a/chrome/browser/resources/bookmark_manager/css/bmm.css
+++ b/chrome/browser/resources/bookmark_manager/css/bmm.css
@@ -269,6 +269,10 @@
   width: 32px;
 }
 
+html:not(.focus-outline-visible) .logo:focus {
+  outline: none;
+}
+
 .header form {
   float: left;
   margin: 14px 2px 0 2px;
diff --git a/chrome/browser/resources/bookmark_manager/js/main.js b/chrome/browser/resources/bookmark_manager/js/main.js
index 0452c28..f0b2654 100644
--- a/chrome/browser/resources/bookmark_manager/js/main.js
+++ b/chrome/browser/resources/bookmark_manager/js/main.js
@@ -1297,6 +1297,7 @@
     canOpenNewWindows = result;
   });
 
+  cr.ui.FocusOutlineManager.forDocument(document);
   initializeSplitter();
   bmm.addBookmarkModelListeners();
   dnd.init(selectItemsAfterUserAction);
diff --git a/chrome/browser/resources/bookmark_manager/main.html b/chrome/browser/resources/bookmark_manager/main.html
index f8acdf6..e9eb1bf 100644
--- a/chrome/browser/resources/bookmark_manager/main.html
+++ b/chrome/browser/resources/bookmark_manager/main.html
@@ -30,6 +30,7 @@
 <script src="chrome://resources/js/cr/ui/touch_handler.js"></script>
 <script src="chrome://resources/js/cr/ui/array_data_model.js"></script>
 <script src="chrome://resources/js/cr/ui/command.js"></script>
+<script src="chrome://resources/js/cr/ui/focus_outline_manager.js"></script>
 <script src="chrome://resources/js/cr/ui/menu_item.js"></script>
 <script src="chrome://resources/js/cr/ui/menu.js"></script>
 <script src="chrome://resources/js/cr/ui/position_util.js"></script>
diff --git a/chrome/browser/resources/file_manager/js/action_choice.js b/chrome/browser/resources/file_manager/js/action_choice.js
index 936d431..c247ee2 100644
--- a/chrome/browser/resources/file_manager/js/action_choice.js
+++ b/chrome/browser/resources/file_manager/js/action_choice.js
@@ -438,7 +438,7 @@
   }
 
   if (action == this.watchSingleVideoAction_) {
-    chrome.fileBrowserPrivate.viewFiles([this.singleVideo_.toURL()], 'watch',
+    chrome.fileBrowserPrivate.viewFiles([this.singleVideo_.toURL()],
         function(success) {});
     this.recordAction_('watch-single-video');
     this.close_();
diff --git a/chrome/browser/resources/file_manager/js/butter_bar.js b/chrome/browser/resources/file_manager/js/butter_bar.js
index f372539..2be649a 100644
--- a/chrome/browser/resources/file_manager/js/butter_bar.js
+++ b/chrome/browser/resources/file_manager/js/butter_bar.js
@@ -255,15 +255,16 @@
 ButterBar.prototype.showProgress_ = function(progress) {
   this.progress_ = progress;
   var options = {
-    progress: this.progress_.percentage,
+    progress: progress.completedBytes / progress.totalBytes,
     actions: {},
     timeout: false
   };
 
+  var pendingItems = progress.totalItems - progress.completedItems;
   var type = this.transferType_();
-  var progressString = (this.progress_.pendingItems === 1) ?
-          strf(type + '_FILE_NAME', this.progress_.filename) :
-          strf(type + '_ITEMS_REMAINING', this.progress_.pendingItems);
+  var progressString = (pendingItems === 1) ?
+          strf(type + '_FILE_NAME', progress.filename) :
+          strf(type + '_ITEMS_REMAINING', pendingItems);
 
   if (this.currentMode_ == ButterBar.Mode.COPY) {
     this.update_(progressString, options);
diff --git a/chrome/browser/resources/file_manager/js/directory_tree.js b/chrome/browser/resources/file_manager/js/directory_tree.js
index 81bbaa1..9214d23 100644
--- a/chrome/browser/resources/file_manager/js/directory_tree.js
+++ b/chrome/browser/resources/file_manager/js/directory_tree.js
@@ -88,18 +88,19 @@
 };
 
 /**
- * Finds a parent directory of the {@code path} from the {@code items}, and
- * invokes the DirectoryItem.selectPath() of the found directory.
+ * Finds a parent directory of the {@code entry} from the {@code items}, and
+ * invokes the DirectoryItem.selectByEntry() of the found directory.
  *
  * @param {Array.<DirectoryItem>} items Items to be searched.
- * @param {string} path Path to be searched for.
+ * @param {DirectoryEntry|Object} entry The entry to be searched for. Can be
+ *     a fake.
  * @return {boolean} True if the parent item is found.
  */
-DirectoryTreeUtil.searchAndSelectPath = function(items, path) {
+DirectoryTreeUtil.searchAndSelectByEntry = function(items, entry) {
   for (var i = 0; i < items.length; i++) {
     var item = items[i];
-    if (PathUtil.isParentPath(item.entry.fullPath, path)) {
-      item.selectPath(path);
+    if (util.isParentEntry(item.entry, entry)) {
+      item.selectByEntry(entry);
       return true;
     }
   }
@@ -262,19 +263,18 @@
    * The DirectoryEntry corresponding to this DirectoryItem. This may be
    * a dummy DirectoryEntry.
    * @type {DirectoryEntry|Object}
-   * @override
-   **/
+   */
   get entry() {
-      return this.dirEntry_;
+    return this.dirEntry_;
   },
 
   /**
    * The element containing the label text and the icon.
    * @type {!HTMLElement}
    * @override
-   **/
+   */
   get labelElement() {
-      return this.firstElementChild.querySelector('.label');
+    return this.firstElementChild.querySelector('.label');
   }
 };
 
@@ -418,22 +418,22 @@
 };
 
 /**
- * Select the item corresponding to the given {@code path}.
- * @param {string} path Path to be selected.
+ * Select the item corresponding to the given {@code entry}.
+ * @param {DirectoryEntry|Object} entry The entry to be selected. Can be a fake.
  */
-DirectoryItem.prototype.selectPath = function(path) {
-  if (path == this.fullPath) {
+DirectoryItem.prototype.selectByEntry = function(entry) {
+  if (util.isSameEntry(entry, this.entry)) {
     this.selected = true;
     return;
   }
 
-  if (DirectoryTreeUtil.searchAndSelectPath(this.items, path))
+  if (DirectoryTreeUtil.searchAndSelectByEntry(this.items, entry))
     return;
 
   // If the path doesn't exist, updates sub directories and tryes again.
   this.updateSubDirectories(
       false /* recursive */,
-      DirectoryTreeUtil.searchAndSelectPath.bind(null, this.items, path));
+      DirectoryTreeUtil.searchAndSelectByEntry.bind(null, this.items, entry));
 };
 
 /**
@@ -530,18 +530,21 @@
   this.dirEntry_ = null;
 
   /**
-   * The path of the current directory.
-   * @type {string}
+   * The currently selected entry.
+   * For special search entries, this could be a fake DirectoryEntry.
+   * @type {DirectoryEntry|Object}
    */
-  this.currentPath_ = null;
+  this.currentEntry_ = null;
 
   this.directoryModel_.addEventListener('directory-changed',
       this.onCurrentDirectoryChanged_.bind(this));
 
   // Add a handler for directory change.
   this.addEventListener('change', function() {
-    if (this.selectedItem && this.currentPath_ != this.selectedItem.fullPath) {
-      this.currentPath_ = this.selectedItem.fullPath;
+    if (this.selectedItem &&
+        (!this.currentEntry_ ||
+         !util.isSameEntry(this.currentEntry_, this.selectedItem.entry))) {
+      this.currentEntry_ = this.selectedItem.entry;
       this.selectedItem.doAction();
       return;
     }
@@ -557,27 +560,30 @@
 };
 
 /**
- * Select the item corresponding to the given path.
- * @param {string} path Path to be selected.
+ * Select the item corresponding to the given entry.
+ * @param {DirectoryEntry|Object} entry The directory entry to be selected. Can
+ *     be a fake.
  */
-DirectoryTree.prototype.selectPath = function(path) {
-  if ((this.entry && this.entry.fullPath == path) || this.currentPath_ == path)
-    return;
-  this.currentPath_ = path;
-  if (DirectoryTreeUtil.shouldHideTree(path))
+DirectoryTree.prototype.selectByEntry = function(entry) {
+  if ((this.entry && util.isSameEntry(this.entry, entry)) ||
+      (this.currentEntry_ && util.isSameEntry(this.currentEntry_, entry)))
     return;
 
-  this.selectPathInternal_(path);
+  this.currentEntry_ = entry;
+  if (DirectoryTreeUtil.shouldHideTree(entry.fullPath))
+    return;
+
+  this.selectByEntryInternal_(entry);
 };
 
 /**
- * Select the item corresponding to the given path. This method is used
+ * Select the item corresponding to the given entry. This method is used
  * internally.
- * @param {string} path Path to be selected.
+ * @param {DirectoryEntry|Object} entry The directory entry to be selected.
  * @private
  */
-DirectoryTree.prototype.selectPathInternal_ = function(path) {
-  var rootDirPath = PathUtil.getRootPath(path);
+DirectoryTree.prototype.selectByEntryInternal_ = function(entry) {
+  var rootDirPath = PathUtil.getRootPath(entry.fullPath);
 
   if (PathUtil.isSpecialSearchRoot(rootDirPath) ||
       PathUtil.getRootType(rootDirPath) == RootType.DRIVE) {
@@ -589,36 +595,39 @@
   }.bind(this);
 
   if (this.fullPath != rootDirPath || !this.dirEntry_) {
+    // The old root is not the one for the new entry. So, first we try to set
+    // the root, then retry.
     this.fullPath = rootDirPath;
 
     this.directoryModel_.resolveDirectory(
         rootDirPath,
-        function(entry) {
+        function(rootDirEntry) {
           if (this.fullPath != rootDirPath)
             return;
 
-          this.dirEntry_ = entry;
-          this.selectPathInternal_(path);
+          this.dirEntry_ = rootDirEntry;
+          this.selectByEntryInternal_(entry);
         }.bind(this),
         onError);
-  } else {
-    if (this.selectedItem && path == this.selectedItem.fullPath)
-      return;
-
-    if (DirectoryTreeUtil.searchAndSelectPath(this.items, path))
-      return;
-
-    this.selectedItem = null;
-    this.updateSubDirectories(
-        false /* recursive */,
-        function() {
-          if (!DirectoryTreeUtil.searchAndSelectPath(
-              this.items, this.currentPath_))
-            this.selectedItem = null;
-          cr.dispatchSimpleEvent(this, 'content-updated');
-        }.bind(this),
-        onError);
+    return;
   }
+
+  if (this.selectedItem && util.isSameEntry(entry, this.selectedItem.entry))
+    return;
+
+  if (DirectoryTreeUtil.searchAndSelectByEntry(this.items, entry))
+    return;
+
+  this.selectedItem = null;
+  this.updateSubDirectories(
+      false /* recursive */,
+      function() {
+        if (!DirectoryTreeUtil.searchAndSelectByEntry(
+            this.items, this.currentEntry_))
+          this.selectedItem = null;
+        cr.dispatchSimpleEvent(this, 'content-updated');
+      }.bind(this),
+      onError);
 };
 
 /**
@@ -629,7 +638,7 @@
  */
 DirectoryTree.prototype.updateSubDirectories = function(
     recursive, opt_successCallback, opt_errorCallback) {
-  if (!this.currentPath_)
+  if (!this.currentEntry_)
     return;
 
   DirectoryTreeUtil.updateSubDirectories(
@@ -663,7 +672,8 @@
  */
 DirectoryTree.prototype.onFilterChanged_ = function() {
   // Returns immediately, if the tree is hidden.
-  if (!this.currentPath_ || DirectoryTreeUtil.shouldHideTree(this.currentPath_))
+  if (!this.currentEntry_ ||
+      DirectoryTreeUtil.shouldHideTree(this.currentEntry_.fullPath))
     return;
 
   this.redraw(true /* recursive */);
@@ -677,7 +687,8 @@
  */
 DirectoryTree.prototype.onDirectoryContentChanged_ = function(event) {
   // Returns immediately, if the tree is hidden.
-  if (!this.currentPath_ || DirectoryTreeUtil.shouldHideTree(this.currentPath_))
+  if (!this.currentEntry_ ||
+      DirectoryTreeUtil.shouldHideTree(this.currentEntry_.fullPath))
     return;
 
   if (event.eventType == 'changed') {
@@ -692,7 +703,7 @@
  * @private
  */
 DirectoryTree.prototype.onCurrentDirectoryChanged_ = function(event) {
-  this.selectPath(event.newDirEntry.fullPath);
+  this.selectByEntry(event.newDirEntry);
 };
 
 /**
diff --git a/chrome/browser/resources/file_manager/js/file_copy_manager.js b/chrome/browser/resources/file_manager/js/file_copy_manager.js
index 9d911ef..f374a3d 100644
--- a/chrome/browser/resources/file_manager/js/file_copy_manager.js
+++ b/chrome/browser/resources/file_manager/js/file_copy_manager.js
@@ -56,6 +56,144 @@
 };
 
 /**
+ * Copies a file from source to the parent directory with newName.
+ * See also copyFileByStream_ and copyFileOnDrive_ for the implementation
+ * details.
+ *
+ * @param {FileEntry} source The file entry to be copied.
+ * @param {DirectoryEntry} parent The entry of the destination directory.
+ * @param {string} newName The name of copied file.
+ * @param {function(FileEntry, number)} progressCallback Callback invoked
+ *     periodically during the file writing. It takes source and the number of
+ *     copied bytes since the last invocation. This is also called just before
+ *     starting the operation (with '0' bytes) and just after the finishing the
+ *     operation (with the total copied size).
+ * @param {function(FileEntry)} successCallback Callback invoked when the copy
+ *     is successfully done with the entry of the created file.
+ * @param {function(FileError)} errorCallback Callback invoked when an error
+ *     is found.
+ * @return {function()} Callback to cancle the current file copy operation.
+ *     When the cancel is done, errorCallback will be called. The returned
+ *     callback must not be called more than once.
+ */
+fileOperationUtil.copyFile = function(
+    source, parent, newName, progressCallback, successCallback, errorCallback) {
+  if (!PathUtil.isDriveBasedPath(source.fullPath) &&
+      !PathUtil.isDriveBasedPath(parent.fullPath)) {
+    // Copying a file between non-Drive file systems.
+    return fileOperationUtil.copyFileByStream_(
+        source, parent, newName, progressCallback, successCallback,
+        errorCallback);
+  } else {
+    // Copying related to the Drive file system.
+    return fileOperationUtil.copyFileOnDrive_(
+        source, parent, newName, progressCallback, successCallback,
+        errorCallback);
+  }
+};
+
+/**
+ * Copies a file by using File and FileWriter objects.
+ *
+ * This is a js-implementation of FileEntry.copyTo(). Unfortunately, copyTo
+ * doesn't support periodical progress updating nor cancelling. To support
+ * these operations, this method implements copyTo by streaming way in
+ * JavaScript.
+ *
+ * Note that this is designed for file copying on local file system. We have
+ * some special cases about copying on Drive file system. See also
+ * copyFileOnDrive_() for more details.
+ *
+ * @param {FileEntry} source The file entry to be copied.
+ * @param {DirectoryEntry} parent The entry of the destination directory.
+ * @param {string} newName The name of copied file.
+ * @param {function(FileEntry, number)} progressCallback Callback invoked
+ *     periodically during the file writing. It takes source and the number of
+ *     copied bytes since the last invocation. This is also called just before
+ *     starting the operation (with '0' bytes) and just after the finishing the
+ *     operation (with the total copied size).
+ * @param {function(FileEntry)} successCallback Callback invoked when the copy
+ *     is successfully done with the entry of the created file.
+ * @param {function(FileError)} errorCallback Callback invoked when an error
+ *     is found.
+ * @return {function()} Callback to cancel the current file copy operation.
+ *     When the cancel is done, errorCallback will be called. The returned
+ *     callback must not be called more than once.
+ * @private
+ */
+fileOperationUtil.copyFileByStream_ = function(
+    source, parent, newName, progressCallback, successCallback, errorCallback) {
+  // Set to true when cancel is requested.
+  var cancelRequested = false;
+
+  source.file(function(file) {
+    if (cancelRequested) {
+      errorCallback(util.createFileError(FileError.ABORT_ERR));
+      return;
+    }
+
+    parent.getFile(newName, {create: true, exclusive: true}, function(target) {
+      if (cancelRequested) {
+        errorCallback(util.createFileError(FileError.ABORT_ERR));
+        return;
+      }
+
+      target.createWriter(function(writer) {
+        if (cancelRequested) {
+          errorCallback(util.createFileError(FileError.ABORT_ERR));
+          return;
+        }
+
+        writer.onerror = writer.onabort = function(progress) {
+          errorCallback(cancelRequested ?
+              util.createFileError(FileError.ABORT_ERR) :
+                  writer.error);
+        };
+
+        var reportedProgress = 0;
+        writer.onprogress = function(progress) {
+          if (cancelRequested) {
+            // If the copy was cancelled, we should abort the operation.
+            // The errorCallback will be called by writer.onabort after the
+            // termination.
+            writer.abort();
+            return;
+          }
+
+          // |progress.loaded| will contain total amount of data copied by now.
+          // |progressCallback| expects data amount delta from the last progress
+          // update.
+          progressCallback(target, progress.loaded - reportedProgress);
+          reportedProgress = progress.loaded;
+        };
+
+        writer.onwrite = function() {
+          if (cancelRequested) {
+            errorCallback(util.createFileError(FileError.ABORT_ERR));
+            return;
+          }
+
+          source.getMetadata(function(metadata) {
+            if (cancelRequested) {
+              errorCallback(util.createFileError(FileError.ABORT_ERR));
+              return;
+            }
+
+            fileOperationUtil.setLastModified(
+                target, metadata.modificationTime);
+            successCallback(target);
+          }, errorCallback);
+        };
+
+        writer.write(file);
+      }, errorCallback);
+    }, errorCallback);
+  }, errorCallback);
+
+  return function() { cancelRequested = true; };
+};
+
+/**
  * Copies a file a) from Drive to local, b) from local to Drive, or c) from
  * Drive to Drive.
  * Currently, we need to take care about following two things for Drive:
@@ -96,8 +234,9 @@
  * @return {function()} Callback to cancel the current file copy operation.
  *     When the cancel is done, errorCallback will be called. The returned
  *     callback must not be called more than once.
+ * @private
  */
-fileOperationUtil.copyFileOnDrive = function(
+fileOperationUtil.copyFileOnDrive_ = function(
     source, parent, newName, progressCallback, successCallback, errorCallback) {
   // Set to true when cancel is requested.
   var cancelRequested = false;
@@ -328,18 +467,24 @@
   this.zipBaseDirEntry = opt_zipBaseDirEntry;
   this.originalEntries = null;
 
-  this.pendingDirectories = [];
-  this.pendingFiles = [];
-  this.pendingBytes = 0;
+  // TODO(hidehiko): When we support recursive copy, we should be able to
+  // rely on originalEntries. Then remove this.
+  this.entries = [];
 
-  this.completedDirectories = [];
-  this.completedFiles = [];
+  /**
+   * The index of entries being processed. The entries should be processed
+   * from 0, so this is also the number of completed entries.
+   * @type {number}
+   */
+  this.entryIndex = 0;
+  this.totalBytes = 0;
   this.completedBytes = 0;
 
   this.deleteAfterCopy = false;
   this.move = false;
   this.zip = false;
 
+  // TODO(hidehiko): After we support recursive copy, we don't need this.
   // If directory already exists, we try to make a copy named 'dir (X)',
   // where X is a number. When we do this, all subsequent copies from
   // inside the subtree should be mapped to the new directory name.
@@ -348,92 +493,46 @@
   this.renamedDirectories_ = [];
 };
 
-
 /**
  * @param {Array.<Entry>} entries Entries.
  * @param {function()} callback When entries resolved.
  */
 FileCopyManager.Task.prototype.setEntries = function(entries, callback) {
-  var self = this;
   this.originalEntries = entries;
+
   // When moving directories, FileEntry.moveTo() is used if both source
   // and target are on Drive. There is no need to recurse into directories.
   util.recurseAndResolveEntries(entries, !this.move, function(result) {
-    self.pendingDirectories = result.dirEntries;
-    self.pendingFiles = result.fileEntries;
-    self.totalBytes = result.fileBytes;
-    self.completedBytes = 0;
+    if (this.move) {
+      // This may be moving from search results, where it fails if we move
+      // parent entries earlier than child entries. We should process the
+      // deepest entry first. Since move of each entry is done by a single
+      // moveTo() call, we don't need to care about the recursive traversal
+      // order.
+      this.entries = result.dirEntries.concat(result.fileEntries).sort(
+          function(entry1, entry2) {
+            return entry2.fullPath.length - entry1.fullPath.length;
+          });
+    } else {
+      // Copying tasks are recursively processed. So, directories must be
+      // processed earlier than their child files. Since
+      // util.recurseAndResolveEntries is already listing entries in the
+      // recursive traversal order, we just keep the ordering.
+      this.entries = result.dirEntries.concat(result.fileEntries);
+    }
 
+    this.totalBytes = result.fileBytes;
     callback();
-  });
-};
-
-/**
- * @return {Entry} Next entry.
- */
-FileCopyManager.Task.prototype.getNextEntry = function() {
-  // We should keep the file in pending list and remove it after complete.
-  // Otherwise, if we try to get status in the middle of copying. The returned
-  // status is wrong (miss count the pasting item in totalItems).
-  var nextEntry = null;
-  if (this.move) {
-    // This may be moving from search results, where it fails if we move parent
-    // entries earlier than child entries. We should process the deepest entry
-    // first. Since move of each entry is done by a single .MoveTo() call, we
-    // don't need to care about the recursive traversal order.
-    nextEntry = this.getDeepestEntry_();
-  } else {
-    // Copying tasks are recursively processed. So, directories must be
-    // processed earlier than their child files. Since
-    // util.recurseAndResolveEntries is already listing entries in the recursive
-    // traversal order, we just keep the ordering.
-    if (this.pendingDirectories.length)
-      nextEntry = this.pendingDirectories[0];
-    else if (this.pendingFiles.length)
-      nextEntry = this.pendingFiles[0];
-  }
-  if (nextEntry)
-    nextEntry.inProgress = true;
-  return nextEntry;
-};
-
-/**
- * Remove the completed entry from the pending lists.
- * @param {Entry} entry Entry.
- * @param {number} size Bytes completed.
- */
-FileCopyManager.Task.prototype.markEntryComplete = function(entry, size) {
-  if (entry.isDirectory && this.pendingDirectories) {
-    for (var i = 0; i < this.pendingDirectories.length; i++) {
-      if (this.pendingDirectories[i].inProgress) {
-        this.completedDirectories.push(entry);
-        this.pendingDirectories.splice(i, 1);
-        return;
-      }
-    }
-  } else if (this.pendingFiles) {
-    for (var i = 0; i < this.pendingFiles.length; i++) {
-      if (this.pendingFiles[i].inProgress) {
-        this.completedFiles.push(entry);
-        this.completedBytes += size;
-        this.pendingFiles.splice(i, 1);
-        return;
-      }
-    }
-  }
-  throw new Error('Try to remove a source entry which is not correspond to' +
-                  ' the finished target entry');
+  }.bind(this));
 };
 
 /**
  * Updates copy progress status for the entry.
  *
- * @param {Entry} entry Entry which is being coppied.
  * @param {number} size Number of bytes that has been copied since last update.
  */
-FileCopyManager.Task.prototype.updateFileCopyProgress = function(entry, size) {
-  if (entry.isFile && this.pendingFiles && this.pendingFiles[0].inProgress)
-    this.completedBytes += size;
+FileCopyManager.Task.prototype.updateFileCopyProgress = function(size) {
+  this.completedBytes += size;
 };
 
 /**
@@ -465,26 +564,6 @@
 };
 
 /**
- * Obtains the deepest entry by referring to its full path.
- * @return {Entry} The deepest entry.
- * @private
- */
-FileCopyManager.Task.prototype.getDeepestEntry_ = function() {
-  var result = null;
-  for (var i = 0; i < this.pendingDirectories.length; i++) {
-    if (!result ||
-        this.pendingDirectories[i].fullPath.length > result.fullPath.length)
-    result = this.pendingDirectories[i];
-  }
-  for (var i = 0; i < this.pendingFiles.length; i++) {
-    if (!result ||
-        this.pendingFiles[i].fullPath.length > result.fullPath.length)
-    result = this.pendingFiles[i];
-  }
-  return result;
-};
-
-/**
  * Error class used to report problems with a copy operation.
  * If the code is UNEXPECTED_SOURCE_FILE, data should be a path of the file.
  * If the code is TARGET_EXISTS, data should be the existing Entry.
@@ -532,64 +611,47 @@
  * @return {Object} Status object.
  */
 FileCopyManager.prototype.getStatus = function() {
+  // TODO(hidehiko): Reorganize the structure when delete queue is merged
+  // into copy task queue.
   var rv = {
-    pendingItems: 0,  // Files + Directories
-    pendingFiles: 0,
-    pendingDirectories: 0,
-    pendingBytes: 0,
+    totalItems: 0,
+    completedItems: 0,
 
-    completedItems: 0,  // Files + Directories
-    completedFiles: 0,
-    completedDirectories: 0,
+    totalBytes: 0,
     completedBytes: 0,
 
-    percentage: NaN,
     pendingCopies: 0,
     pendingMoves: 0,
     pendingZips: 0,
-    filename: ''  // In case pendingItems == 1
+
+    // In case the number of the incompleted entry is exactly one.
+    filename: '',
   };
 
-  var pendingFile = null;
-
+  var pendingEntry = null;
   for (var i = 0; i < this.copyTasks_.length; i++) {
     var task = this.copyTasks_[i];
-    var pendingFiles = task.pendingFiles.length;
-    var pendingDirectories = task.pendingDirectories.length;
-    rv.pendingFiles += pendingFiles;
-    rv.pendingDirectories += pendingDirectories;
-    rv.pendingBytes += (task.totalBytes - task.completedBytes);
+    rv.totalItems += task.entries.length;
+    rv.completedItems += task.entryIndex;
 
-    rv.completedFiles += task.completedFiles.length;
-    rv.completedDirectories += task.completedDirectories.length;
+    rv.totalBytes += task.totalBytes;
     rv.completedBytes += task.completedBytes;
 
+    var numPendingEntries = task.entries.length - task.entryIndex;
     if (task.zip) {
-      rv.pendingZips += pendingFiles + pendingDirectories;
+      rv.pendingZips += numPendingEntries;
     } else if (task.move || task.deleteAfterCopy) {
-      rv.pendingMoves += pendingFiles + pendingDirectories;
+      rv.pendingMoves += numPendingEntries;
     } else {
-      rv.pendingCopies += pendingFiles + pendingDirectories;
+      rv.pendingCopies += numPendingEntries;
     }
 
-    if (task.pendingFiles.length === 1)
-      pendingFile = task.pendingFiles[0];
-
-    if (task.pendingDirectories.length === 1)
-      pendingFile = task.pendingDirectories[0];
-
+    if (numPendingEntries == 1)
+      pendingEntry = task.entries[task.entries.length - 1];
   }
-  rv.pendingItems = rv.pendingFiles + rv.pendingDirectories;
-  rv.completedItems = rv.completedFiles + rv.completedDirectories;
 
-  rv.totalFiles = rv.pendingFiles + rv.completedFiles;
-  rv.totalDirectories = rv.pendingDirectories + rv.completedDirectories;
-  rv.totalItems = rv.pendingItems + rv.completedItems;
-  rv.totalBytes = rv.pendingBytes + rv.completedBytes;
-
-  rv.percentage = rv.completedBytes / rv.totalBytes;
-  if (rv.pendingItems === 1)
-    rv.filename = pendingFile.name;
+  if (rv.totalItems - rv.completedItems == 1 && pendingEntry)
+    rv.filename = pendingEntry.name;
 
   return rv;
 };
@@ -932,7 +994,7 @@
     errorCallback) {
   // TODO(hidehiko): We should be able to share the code to iterate on entries
   // with serviceMoveTask_().
-  if (task.pendingDirectories.length + task.pendingFiles.length == 0) {
+  if (task.entries.length == 0) {
     successCallback();
     return;
   }
@@ -962,9 +1024,11 @@
   };
 
   var onEntryServiced = function() {
+    task.entryIndex++;
+
     // We should not dispatch a PROGRESS event when there is no pending items
     // in the task.
-    if (task.pendingDirectories.length + task.pendingFiles.length == 0) {
+    if (task.entryIndex >= task.entries.length) {
       if (task.deleteAfterCopy) {
         deleteOriginals();
       } else {
@@ -975,13 +1039,13 @@
 
     progressCallback();
     self.processCopyEntry_(
-        task, task.getNextEntry(), entryChangedCallback, progressCallback,
-        onEntryServiced, errorCallback);
+        task, task.entries[task.entryIndex], entryChangedCallback,
+        progressCallback, onEntryServiced, errorCallback);
   };
 
   this.processCopyEntry_(
-      task, task.getNextEntry(), entryChangedCallback, progressCallback,
-      onEntryServiced, errorCallback);
+      task, task.entries[task.entryIndex], entryChangedCallback,
+      progressCallback, onEntryServiced, errorCallback);
 };
 
 /**
@@ -1022,9 +1086,8 @@
   originalPath = task.applyRenames(originalPath);
 
   var onDeduplicated = function(targetRelativePath) {
-    var onCopyComplete = function(entry, size) {
+    var onCopyComplete = function(entry) {
       entryChangedCallback(util.EntryChangedType.CREATED, entry);
-      task.markEntryComplete(entry, size);
       successCallback();
     };
 
@@ -1042,57 +1105,24 @@
             if (targetRelativePath != originalPath) {
               task.registerRename(originalPath, targetRelativePath);
             }
-            onCopyComplete(targetEntry, 0);
+            onCopyComplete(targetEntry);
           },
           util.flog('Error getting dir: ' + targetRelativePath,
                     onFilesystemError));
-      return;
-    }
-
-    var onCopyProgress = function(entry, size) {
-      task.updateFileCopyProgress(entry, size);
-      progressCallback();
-    };
-
-    // Hereafter copy a file.
-    var isSourceOnDrive = PathUtil.isDriveBasedPath(sourceEntry.fullPath);
-    var isTargetOnDrive = PathUtil.isDriveBasedPath(targetDirEntry.fullPath);
-
-    if (!isSourceOnDrive && !isTargetOnDrive) {
-      // Sending a file from local to local.
-      // To copy local file, we use File blob and FileWriter to take the
-      // progress.
-      targetDirEntry.getFile(
-          targetRelativePath,
-          {create: true, exclusive: true},
-          function(targetEntry) {
-            self.cancelCallback_ = self.copyFileEntry_(
-                sourceEntry, targetEntry,
-                onCopyProgress,
-                function(entry, size) {
-                  self.cancelCallback_ = null;
-                  onCopyComplete(entry, size);
-                },
-                function(error) {
-                  self.cancelCallback_ = null;
-                  onFilesystemError(error);
-                });
-          },
-          util.flog('Error getting file: ' + targetRelativePath,
-                    onFilesystemError));
-      return;
     } else {
-      // Sending a file from a) Drive to Drive, b) Drive to local or c) local
-      // to Drive.
+      // Copy a file.
       targetDirEntry.getDirectory(
           PathUtil.dirname(targetRelativePath), {create: false},
           function(dirEntry) {
-            self.cancelCallback_ = fileOperationUtil.copyFileOnDrive(
+            self.cancelCallback_ = fileOperationUtil.copyFile(
                 sourceEntry, dirEntry, PathUtil.basename(targetRelativePath),
-                onCopyProgress,
+                function(entry, size) {
+                  task.updateFileCopyProgress(size);
+                  progressCallback();
+                },
                 function(entry) {
                   self.cancelCallback_ = null;
-                  onCopyComplete(entry, 0);
+                  onCopyComplete(entry);
                 },
                 function(error) {
                   self.cancelCallback_ = null;
@@ -1108,97 +1138,6 @@
 };
 
 /**
- * Copies the contents of sourceEntry into targetEntry.
- * TODO(hidehiko): Move this method into fileOperationUtil.
- *
- * @param {FileEntry} sourceEntry The file entry that will be copied.
- * @param {FileEntry} targetEntry The file entry to which sourceEntry will be
- *     copied.
- * @param {function(FileEntry, number)} progressCallback Function that will be
- *     called when a part of the source entry is copied. It takes |targetEntry|
- *     and size of the last copied chunk as parameters.
- * @param {function(FileEntry, number)} successCallback Function that will be
- *     called the copy operation finishes. It takes |targetEntry| and size of
- *     the last (not previously reported) copied chunk as parameters.
- * @param {function(FileError)} errorCallback Function that will be called
- *     if an error is encountered. Takes error type and additional error data
- *     as parameters.
- * @return {function()} Callback to cancel the current file copy operation.
- *     When the cancel is done, errorCallback will be called. The returned
- *     callback must not be called more than once.
- * @private
- */
-FileCopyManager.prototype.copyFileEntry_ = function(sourceEntry,
-                                                    targetEntry,
-                                                    progressCallback,
-                                                    successCallback,
-                                                    errorCallback) {
-  // Set to true when cancel is requested.
-  var cancelRequested = false;
-
-  sourceEntry.file(function(file) {
-    if (cancelRequested) {
-      errorCallback(util.createFileError(FileError.ABORT_ERR));
-      return;
-    }
-
-    targetEntry.createWriter(function(writer) {
-      if (cancelRequested) {
-        errorCallback(util.createFileError(FileError.ABORT_ERR));
-        return;
-      }
-
-      var reportedProgress = 0;
-      writer.onerror = writer.onabort = function(progress) {
-        errorCallback(cancelRequested ?
-            util.createFileError(FileError.ABORT_ERR) :
-            writer.error);
-      };
-
-      writer.onprogress = function(progress) {
-        if (cancelRequested) {
-          // If the copy was cancelled, we should abort the operation.
-          // The errorCallback will be called by writer.onabort after the
-          // termination.
-          writer.abort();
-          return;
-        }
-
-        // |progress.loaded| will contain total amount of data copied by now.
-        // |progressCallback| expects data amount delta from the last progress
-        // update.
-        progressCallback(targetEntry, progress.loaded - reportedProgress);
-        reportedProgress = progress.loaded;
-      };
-
-      writer.onwrite = function() {
-        if (cancelRequested) {
-          errorCallback(util.createFileError(FileError.ABORT_ERR));
-          return;
-        }
-
-        sourceEntry.getMetadata(function(metadata) {
-          if (cancelRequested) {
-            errorCallback(util.createFileError(FileError.ABORT_ERR));
-            return;
-          }
-
-          fileOperationUtil.setLastModified(
-              targetEntry, metadata.modificationTime);
-          successCallback(targetEntry, file.size - reportedProgress);
-        });
-      };
-
-      writer.write(file);
-    }, errorCallback);
-  }, errorCallback);
-
-  return function() {
-    cancelRequested = true;
-  };
-};
-
-/**
  * Moves all entries in the task.
  *
  * @param {FileCopyManager.Task} task A move task to be run.
@@ -1213,17 +1152,19 @@
 FileCopyManager.prototype.serviceMoveTask_ = function(
     task, entryChangedCallback, progressCallback, successCallback,
     errorCallback) {
-  if (task.pendingDirectories.length + task.pendingFiles.length == 0) {
+  if (task.entries.length == 0) {
     successCallback();
     return;
   }
 
   this.processMoveEntry_(
-      task, task.getNextEntry(), entryChangedCallback,
+      task, task.entries[task.entryIndex], entryChangedCallback,
       (function onCompleted() {
+        task.entryIndex++;
+
         // We should not dispatch a PROGRESS event when there is no pending
         // items in the task.
-        if (task.pendingDirectories.length + task.pendingFiles.length == 0) {
+        if (task.entryIndex >= task.entries.length) {
           successCallback();
           return;
         }
@@ -1231,7 +1172,7 @@
         // Move the next entry.
         progressCallback();
         this.processMoveEntry_(
-            task, task.getNextEntry(), entryChangedCallback,
+            task, task.entries[task.entryIndex], entryChangedCallback,
             onCompleted.bind(this), errorCallback);
       }).bind(this),
       errorCallback);
@@ -1294,7 +1235,6 @@
                         util.EntryChangedType.CREATED, targetEntry);
                     entryChangedCallback(
                         util.EntryChangedType.DELETED, sourceEntry);
-                    task.markEntryComplete(targetEntry, 0);
                     successCallback();
                   },
                   onFilesystemError);
@@ -1335,7 +1275,7 @@
         progressCallback();
 
         fileOperationUtil.zipSelection(
-            task.pendingDirectories.concat(task.pendingFiles),
+            task.entries,
             task.zipBaseDirEntry,
             destPath,
             function(entry) {
diff --git a/chrome/browser/resources/file_manager/js/file_manager.js b/chrome/browser/resources/file_manager/js/file_manager.js
index 093b23a..657a7f2 100644
--- a/chrome/browser/resources/file_manager/js/file_manager.js
+++ b/chrome/browser/resources/file_manager/js/file_manager.js
@@ -493,9 +493,9 @@
     this.gearButton_.addEventListener('menushow',
         this.refreshRemainingSpace_.bind(this,
                                          false /* Without loading caption. */));
-    cr.ui.decorate(this.gearButton_, cr.ui.MenuButton);
     this.dialogDom_.querySelector('#gear-menu').menuItemSelector =
       'menuitem, hr';
+    cr.ui.decorate(this.gearButton_, cr.ui.MenuButton);
 
     if (this.dialogType == DialogType.FULL_PAGE) {
       var maximizeButton = this.dialogDom_.querySelector('#maximize-button');
@@ -570,13 +570,13 @@
         Commands.changeDefaultAppCommand, this);
 
     CommandUtil.registerCommand(this.navigationList_, 'unmount',
-        Commands.unmountCommand, this.navigationList_, this);
+        Commands.unmountCommand, this);
 
     CommandUtil.registerCommand(this.navigationList_, 'import-photos',
         Commands.importCommand, this.navigationList_);
 
     CommandUtil.registerCommand(this.dialogContainer_, 'format',
-        Commands.formatCommand, this.navigationList_, this,
+        Commands.formatCommand, this,
         this.directoryModel_);
 
     CommandUtil.registerCommand(this.dialogContainer_, 'delete',
diff --git a/chrome/browser/resources/file_manager/js/file_manager_commands.js b/chrome/browser/resources/file_manager/js/file_manager_commands.js
index 67d781b..914c7c5 100644
--- a/chrome/browser/resources/file_manager/js/file_manager_commands.js
+++ b/chrome/browser/resources/file_manager/js/file_manager_commands.js
@@ -171,19 +171,18 @@
 Commands.unmountCommand = {
   /**
    * @param {Event} event Command event.
-   * @param {NavigationList} navigationList Target navigation list.
+   * @param {FileManager} fileManager The file manager instance.
    */
-  execute: function(event, navigationList, fileManager) {
-    var root = CommandUtil.getCommandPath(navigationList);
+  execute: function(event, fileManager) {
+    var root = CommandUtil.getCommandPath(event.target);
     if (root)
       fileManager.unmountVolume(PathUtil.getRootPath(root));
   },
   /**
    * @param {Event} event Command event.
-   * @param {NavigationList} navigationList Target navigation list.
    */
-  canExecute: function(event, navigationList) {
-    var rootType = CommandUtil.getCommandRootType(navigationList);
+  canExecute: function(event) {
+    var rootType = CommandUtil.getCommandRootType(event.target);
 
     event.canExecute = (rootType == RootType.ARCHIVE ||
                         rootType == RootType.REMOVABLE);
@@ -200,11 +199,10 @@
 Commands.formatCommand = {
   /**
    * @param {Event} event Command event.
-   * @param {NavigationList} navigationList Target navigation list.
    * @param {FileManager} fileManager The file manager instance.
    */
-  execute: function(event, navigationList, fileManager) {
-    var root = CommandUtil.getCommandPath(navigationList);
+  execute: function(event, fileManager) {
+    var root = CommandUtil.getCommandPath(event.target);
 
     if (root) {
       var url = util.makeFilesystemUrl(PathUtil.getRootPath(root));
@@ -215,12 +213,11 @@
   },
   /**
    * @param {Event} event Command event.
-   * @param {NavigationList} navigationList Target navigation list.
    * @param {FileManager} fileManager The file manager instance.
    * @param {DirectoryModel} directoryModel The directory model instance.
    */
-  canExecute: function(event, navigationList, fileManager, directoryModel) {
-    var root = CommandUtil.getCommandPath(navigationList);
+  canExecute: function(event, fileManager, directoryModel) {
+    var root = CommandUtil.getCommandPath(event.target);
     var removable = root &&
                     PathUtil.getRootType(root) == RootType.REMOVABLE;
     var isReadOnly = root && directoryModel.isPathReadOnly(root);
@@ -599,7 +596,7 @@
     var eligible = path && PathUtil.isEligibleForFolderShortcut(path);
     event.canExecute =
         eligible && onlyOneFolderSelected && !folderShortcutExists;
-    event.command.setHidden(!onlyOneFolderSelected);
+    event.command.setHidden(!eligible || !onlyOneFolderSelected);
   }
 };
 
@@ -635,7 +632,7 @@
     var eligible = path && PathUtil.isEligibleForFolderShortcut(path);
     var isShortcut = path && fileManager.folderShortcutExists(path);
     event.canExecute = isShortcut && eligible;
-    event.command.setHidden(!isShortcut);
+    event.command.setHidden(!event.canExecute);
   }
 };
 
diff --git a/chrome/browser/resources/file_manager/js/file_tasks.js b/chrome/browser/resources/file_manager/js/file_tasks.js
index e6072ee..fd72362 100644
--- a/chrome/browser/resources/file_manager/js/file_tasks.js
+++ b/chrome/browser/resources/file_manager/js/file_tasks.js
@@ -286,7 +286,7 @@
     }.bind(this);
 
     this.checkAvailability_(function() {
-      chrome.fileBrowserPrivate.viewFiles(urls, 'default', callback);
+      chrome.fileBrowserPrivate.viewFiles(urls, callback);
     }.bind(this));
   }
 
@@ -448,7 +448,7 @@
 
   if (id == 'view-pdf' || id == 'view-swf' || id == 'view-in-browser' ||
       id == 'install-crx' || id.match(/^open-hosted-/) || id == 'watch') {
-    chrome.fileBrowserPrivate.viewFiles(urls, id, function(success) {
+    chrome.fileBrowserPrivate.viewFiles(urls, function(success) {
       if (!success)
         console.error('chrome.fileBrowserPrivate.viewFiles failed', urls);
     });
diff --git a/chrome/browser/resources/file_manager/js/navigation_list.js b/chrome/browser/resources/file_manager/js/navigation_list.js
index 9e2f357..476fe6d 100644
--- a/chrome/browser/resources/file_manager/js/navigation_list.js
+++ b/chrome/browser/resources/file_manager/js/navigation_list.js
@@ -85,26 +85,6 @@
 };
 
 /**
- * Type of the item on the navigation list.
- * @enum {number}
- */
-NavigationListModel.ItemType = {
-  ROOT: 1,
-  PINNED: 2
-};
-
-/**
- * Returns the type of the item at the given index.
- * @param {number} index The index of the entry to get.
- * @return {NavigationListModel.ItemType} The type of the item.
- */
-NavigationListModel.prototype.getItemType = function(index) {
-  var offset = this.volumesList_.length;
-  return index < offset ?
-      NavigationListModel.ItemType.ROOT : NavigationListModel.ItemType.PINNED;
-};
-
-/**
  * Returns the number of items in the model.
  * @return {number} The length of the model.
  * @private
diff --git a/chrome/browser/resources/file_manager/js/path_util.js b/chrome/browser/resources/file_manager/js/path_util.js
index c22013b..774cb13 100644
--- a/chrome/browser/resources/file_manager/js/path_util.js
+++ b/chrome/browser/resources/file_manager/js/path_util.js
@@ -341,5 +341,6 @@
  */
 PathUtil.isEligibleForFolderShortcut = function(directoryPath) {
   return !PathUtil.isSpecialSearchRoot(directoryPath) &&
-         !PathUtil.isRootPath(directoryPath);
+         !PathUtil.isRootPath(directoryPath) &&
+         PathUtil.isDriveBasedPath(directoryPath);
 };
diff --git a/chrome/browser/resources/file_manager/js/util.js b/chrome/browser/resources/file_manager/js/util.js
index 2023266..966c8e6 100644
--- a/chrome/browser/resources/file_manager/js/util.js
+++ b/chrome/browser/resources/file_manager/js/util.js
@@ -1176,3 +1176,26 @@
     code: { get: function() { return code; } }
   });
 };
+
+/**
+ * @param {Entry|Object} entry1 The entry to be compared. Can be a fake.
+ * @param {Entry|Object} entry2 The entry to be compared. Can be a fake.
+ * @return {boolean} True if the both entry represents a same file or directory.
+ */
+util.isSameEntry = function(entry1, entry2) {
+  // Currently, we can assume there is only one root.
+  // When we support multi-file system, we need to look at filesystem, too.
+  return entry1.fullPath == entry2.fullPath;
+};
+
+/**
+ * @param {Entry|Object} parent The parent entry. Can be a fake.
+ * @param {Entry|Object} child The child entry. Can be a fake.
+ * @return {boolean} True if parent entry is actualy the parent of the child
+ *     entry.
+ */
+util.isParentEntry = function(parent, child) {
+  // Currently, we can assume there is only one root.
+  // When we support multi-file system, we need to look at filesystem, too.
+  return PathUtil.isParentPath(parent.fullPath, child.fullPath);
+};
diff --git a/chrome/browser/resources/file_manager/main.html b/chrome/browser/resources/file_manager/main.html
index 7bcc2fd..d2b05db 100644
--- a/chrome/browser/resources/file_manager/main.html
+++ b/chrome/browser/resources/file_manager/main.html
@@ -215,16 +215,18 @@
     </menu>
 
     <menu id="gear-menu" class="chrome-menu" showShortcuts>
-      <menuitem command="#newwindow"></menuitem>
-      <menuitem command="#newfolder"></menuitem>
-      <menuitem command="#change-default-app"></menuitem>
+      <menuitem id="gear-menu-newwindow" command="#newwindow"></menuitem>
+      <menuitem id="gear-menu-newfolder" command="#newfolder"></menuitem>
+      <menuitem id="gear-menu-change-default-app"
+                command="#change-default-app"></menuitem>
       <hr id="drive-separator">
       <menuitem id="drive-sync-settings"
                 i18n-content=DRIVE_MOBILE_CONNECTION_OPTION></menuitem>
       <menuitem id="drive-hosted-settings"
                 i18n-content=DRIVE_SHOW_HOSTED_FILES_OPTION></menuitem>
       <hr command="#drive-clear-local-cache">
-      <menuitem command="#drive-clear-local-cache"></menuitem>
+      <menuitem id="gear-menu-drive-clear-local-cache"
+                command="#drive-clear-local-cache"></menuitem>
       <hr>
       <div>
         View
@@ -236,9 +238,12 @@
               i18n-values="aria-label:THUMBNAIL_VIEW_TOOLTIP">
       </menuitem>
       <hr>
-      <menuitem command="#drive-buy-more-space"></menuitem>
-      <menuitem command="#drive-go-to-drive"></menuitem>
-      <menuitem command="#volume-help"></menuitem>
+      <menuitem id="gear-menu-drive-buy-more-space"
+                command="#drive-buy-more-space"></menuitem>
+      <menuitem id="gear-menu-drive-go-to-drive"
+                command="#drive-go-to-drive"></menuitem>
+      <menuitem id="gear-menu-volume-help"
+                command="#volume-help"></menuitem>
       <hr>
       <div id="volume-space-info">
         <div id="volume-space-info-contents">
@@ -295,7 +300,8 @@
           <div class="buttonbar">
             <button class="menubutton" id="gear-button" tabindex="10"
                     menu="#gear-menu"
-                    i18n-values="aria-label:GEAR_BUTTON_TOOLTIP">
+                    i18n-values="aria-label:GEAR_BUTTON_TOOLTIP"
+                    aria-activedescendant="gear-menu">
             </button>
             <button id="maximize-button" visibleif="full-page" tabindex="-1">
             </button>
diff --git a/chrome/browser/resources/google_now/utility.js b/chrome/browser/resources/google_now/utility.js
index 7a8b2b1..0ab7c4b 100644
--- a/chrome/browser/resources/google_now/utility.js
+++ b/chrome/browser/resources/google_now/utility.js
@@ -257,6 +257,9 @@
     return function() {
       // This is the wrapper for the callback.
       try {
+        verify(!isInInstrumentedCallback, 'Re-entering instrumented callback');
+        isInInstrumentedCallback = true;
+
         if (isTaskCallback) {
           verify(!isInTask, 'wrapCallback: already in task');
           isInTask = true;
@@ -265,12 +268,7 @@
           delete pendingCallbacks[callbackId];
 
         // Call the original callback.
-        verify(!isInInstrumentedCallback, 'Re-entering instrumented callback');
-        isInInstrumentedCallback = true;
         callback.apply(null, arguments);
-        verify(isInInstrumentedCallback,
-               'Instrumented callback is not instrumented upon exit');
-        isInInstrumentedCallback = false;
 
         if (isTaskCallback) {
           verify(isInTask, 'wrapCallback: not in task at exit');
@@ -278,6 +276,10 @@
           if (--taskPendingCallbackCount == 0)
             finish();
         }
+
+        verify(isInInstrumentedCallback,
+               'Instrumented callback is not instrumented upon exit');
+        isInInstrumentedCallback = false;
       } catch (error) {
         var message = 'Uncaught exception:\n' + error.stack;
         console.error(message);
diff --git a/chrome/browser/resources/inspect/inspect.css b/chrome/browser/resources/inspect/inspect.css
index 6316a17..83775d83 100644
--- a/chrome/browser/resources/inspect/inspect.css
+++ b/chrome/browser/resources/inspect/inspect.css
@@ -101,9 +101,32 @@
 
 a {
   color: rgb(17, 85, 204);
+  padding: 0 3px;
   text-decoration: none;
 }
 
+a.disabled {
+  opacity: 0.5;
+  pointer-events: none;
+}
+
+.open {
+  margin-bottom: -4px;
+  margin-top: 5px;
+}
+
+.open > input {
+  border: 1px solid #aaa;
+  height: 17px;
+  line-height: 17px;
+  margin-left: 20px;
+  padding: 0 2px;
+}
+
+.open > button {
+  line-height: 13px;
+}
+
 #port-forwarding-settings {
   position: absolute;
   right: 20px;
diff --git a/chrome/browser/resources/inspect/inspect.js b/chrome/browser/resources/inspect/inspect.js
index 856744b..8ce04b8 100644
--- a/chrome/browser/resources/inspect/inspect.js
+++ b/chrome/browser/resources/inspect/inspect.js
@@ -10,6 +10,14 @@
   chrome.send('terminate', [data]);
 }
 
+function reload(data) {
+  chrome.send('reload', [data]);
+}
+
+function open(browserId, url) {
+  chrome.send('open', [browserId, url]);
+}
+
 function removeChildren(element_id) {
   var element = $(element_id);
   element.textContent = '';
@@ -77,43 +85,122 @@
 }
 
 function populateDeviceLists(devices) {
-  var devicesDigest = JSON.stringify(devices);
-  if (!devices || devicesDigest == window.devicesDigest)
+  if (!devices)
     return;
 
-  window.devicesDigest = devicesDigest;
+  function alreadyDisplayed(element, data) {
+    var json = JSON.stringify(data);
+    if (element.cachedJSON == json)
+      return true;
+    element.cachedJSON = json;
+    return false;
+  }
 
-  var containerElement = $('devices');
-  containerElement.textContent = '';
+  var deviceList = $('devices');
+  if (alreadyDisplayed(deviceList, devices))
+    return;
 
-  // Populate with new entries
+  function removeObsolete(validIds, section) {
+    if (validIds.indexOf(section.id) < 0)
+      section.remove();
+  }
+
+  var newDeviceIds = devices.map(function(d) { return d.adbGlobalId });
+  Array.prototype.forEach.call(
+      deviceList.querySelectorAll('.device'),
+      removeObsolete.bind(null, newDeviceIds));
+
   for (var d = 0; d < devices.length; d++) {
     var device = devices[d];
 
-    var deviceHeader = document.createElement('div');
-    deviceHeader.className = 'section';
-    deviceHeader.textContent = device.adbModel;
-    containerElement.appendChild(deviceHeader);
+    var browserList;
+    var deviceSection = $(device.adbGlobalId);
+    if (deviceSection) {
+      browserList = deviceSection.querySelector('.browsers');
+    } else {
+      deviceSection = document.createElement('div');
+      deviceSection.id = device.adbGlobalId;
+      deviceSection.className = 'device list';
+      deviceList.appendChild(deviceSection);
 
-    var deviceContent = document.createElement('div');
-    deviceContent.className = 'list';
-    containerElement.appendChild(deviceContent);
+      var deviceHeader = document.createElement('div');
+      deviceHeader.className = 'section';
+      deviceHeader.textContent = device.adbModel;
+      deviceSection.appendChild(deviceHeader);
+
+      browserList = document.createElement('div');
+      browserList.className = 'browsers';
+      deviceSection.appendChild(browserList);
+    }
+
+    if (alreadyDisplayed(deviceSection, device))
+      continue;
+
+    var newBrowserIds =
+        device.browsers.map(function(b) { return b.adbGlobalId });
+    Array.prototype.forEach.call(
+        browserList.querySelectorAll('.browser'),
+        removeObsolete.bind(null, newBrowserIds));
 
     for (var b = 0; b < device.browsers.length; b++) {
       var browser = device.browsers[b];
 
-      var browserHeader = document.createElement('div');
-      browserHeader.className = 'small-section';
-      browserHeader.textContent = browser.adbBrowserName;
-      deviceContent.appendChild(browserHeader);
+      var pageList;
+      var browserSection = $(browser.adbGlobalId);
+      if (browserSection) {
+        pageList = browserSection.querySelector('.pages');
+        pageList.textContent = '';
+      } else {
+        browserSection = document.createElement('div');
+        browserSection.id = browser.adbGlobalId;
+        browserSection.className = 'browser';
+        browserList.appendChild(browserSection);
 
-      var browserPages = document.createElement('div');
-      browserPages.className = 'list package';
-      deviceContent.appendChild(browserPages);
+        var browserHeader = document.createElement('div');
+        browserHeader.className = 'small-section';
+        browserHeader.textContent = browser.adbBrowserName;
+        browserSection.appendChild(browserHeader);
+
+        var newPage = document.createElement('div');
+        newPage.className = 'open';
+
+        var newPageUrl = document.createElement('input');
+        newPageUrl.type = 'text';
+        newPageUrl.placeholder = 'Open tab with url';
+        newPage.appendChild(newPageUrl);
+
+        var openHandler = function(browserId, input) {
+          open(browserId, input.value || 'about:blank');
+          input.value = '';
+        }.bind(null, browser.adbGlobalId, newPageUrl);
+        newPageUrl.addEventListener('keyup', function(handler, event) {
+          if (event.keyIdentifier == 'Enter' && event.target.value)
+            handler();
+        }.bind(null, openHandler), true);
+
+        var newPageButton = document.createElement('button');
+        newPageButton.textContent = 'Open';
+        newPage.appendChild(newPageButton);
+        newPageButton.addEventListener('click', openHandler, true);
+
+        browserSection.appendChild(newPage);
+
+        pageList = document.createElement('div');
+        pageList.className = 'list pages';
+        browserSection.appendChild(pageList);
+      }
+
+      if (alreadyDisplayed(browserSection, browser))
+        continue;
 
       for (var p = 0; p < browser.pages.length; p++) {
-        addTargetToList(
-            browser.pages[p], browserPages, ['faviconUrl', 'name', 'url']);
+        var page = browser.pages[p];
+        var row = addTargetToList(
+            page, pageList, ['faviconUrl', 'name', 'url']);
+        row.appendChild(createActionLink(
+            'reload', reload.bind(null, page), page.attached));
+        row.appendChild(createActionLink(
+            'close', terminate.bind(null, page), page.attached));
       }
     }
   }
@@ -132,10 +219,9 @@
 }
 
 function addToWorkersList(data) {
-  addTargetToList(data,
-                  $('workers'),
-                  ['name', 'url', 'pid'],
-                  true);
+  var row = addTargetToList(data, $('workers'), ['name', 'url', 'pid']);
+  row.appendChild(createActionLink(
+      'terminate', terminate.bind(null, data), data.attached));
 }
 
 function addToOthersList(data) {
@@ -165,45 +251,31 @@
   return span;
 }
 
-function addTargetToList(data, list, properties, canTerminate) {
+function addTargetToList(data, list, properties) {
   var row = document.createElement('div');
   row.className = 'row';
   for (var j = 0; j < properties.length; j++)
     row.appendChild(formatValue(data, properties[j]));
 
-  row.appendChild(createInspectElement(data));
-
-  if (canTerminate)
-    row.appendChild(createTerminateElement(data));
+  row.appendChild(createActionLink('inspect', inspect.bind(null, data)));
 
   row.processId = data.processId;
   row.routeId = data.routeId;
 
   list.appendChild(row);
+  return row;
 }
 
-function createInspectElement(data) {
+function createActionLink(text, handler, opt_disabled) {
   var link = document.createElement('a');
-  link.setAttribute('href', '#');
-  link.textContent = ' inspect ';
-  link.addEventListener(
-      'click',
-      inspect.bind(this, data),
-      true);
-  return link;
-}
-
-function createTerminateElement(data) {
-  var link = document.createElement('a');
-  if (data.attached)
-    link.disabled = true;
+  if (opt_disabled)
+    link.classList.add('disabled');
+  else
+    link.classList.remove('disabled');
 
   link.setAttribute('href', '#');
-  link.textContent = ' terminate ';
-  link.addEventListener(
-      'click',
-      terminate.bind(this, data),
-      true);
+  link.textContent = text;
+  link.addEventListener('click', handler, true);
   return link;
 }
 
diff --git a/chrome/browser/resources/options/browser_options.css b/chrome/browser/resources/options/browser_options.css
index 6e24d02..13ad987 100644
--- a/chrome/browser/resources/options/browser_options.css
+++ b/chrome/browser/resources/options/browser_options.css
@@ -11,6 +11,7 @@
   max-width: 400px;
   overflow: hidden;
   text-overflow: ellipsis;
+  vertical-align: top;
 }
 
 #default-browser-state {
diff --git a/chrome/browser/resources/options/import_data_overlay.html b/chrome/browser/resources/options/import_data_overlay.html
index 526c811..2b78735 100644
--- a/chrome/browser/resources/options/import_data_overlay.html
+++ b/chrome/browser/resources/options/import_data_overlay.html
@@ -12,7 +12,8 @@
       <div id="import-checkboxes">
         <div i18n-content="importDescription"></div>
         <div class="checkbox">
-          <span class="controlled-setting-with-label">
+          <span id="import-history-with-label"
+              class="controlled-setting-with-label">
             <input id="import-history" type="checkbox" pref="import_history">
             <span>
               <label for="import-history" i18n-content="importHistory"></label>
@@ -22,7 +23,8 @@
           </span>
         </div>
         <div class="checkbox">
-          <span class="controlled-setting-with-label">
+          <span id="import-favorites-with-label"
+              class="controlled-setting-with-label">
             <input id="import-favorites" type="checkbox"
                 pref="import_bookmarks">
             <span>
@@ -35,7 +37,8 @@
           </span>
         </div>
         <div class="checkbox">
-          <span class="controlled-setting-with-label">
+          <span id="import-passwords-with-label"
+              class="controlled-setting-with-label">
             <input id="import-passwords" type="checkbox"
                 pref="import_saved_passwords">
             <span>
@@ -48,7 +51,8 @@
           </span>
         </div>
         <div class="checkbox">
-          <span class="controlled-setting-with-label">
+          <span id="import-search-with-label"
+              class="controlled-setting-with-label">
             <input id="import-search" type="checkbox"
                 pref="import_search_engine">
             <span>
diff --git a/chrome/browser/resources/options/import_data_overlay.js b/chrome/browser/resources/options/import_data_overlay.js
index ba7949c..8841b73 100644
--- a/chrome/browser/resources/options/import_data_overlay.js
+++ b/chrome/browser/resources/options/import_data_overlay.js
@@ -69,11 +69,11 @@
       };
 
       // Form controls are disabled until the profile list has been loaded.
-      self.setControlsSensitive_(false);
+      self.setAllControlsEnabled_(false);
     },
 
     /**
-     * Set enabled and checked state of the commit button.
+     * Sets the enabled and checked state of the commit button.
      * @private
      */
     validateCommitButton_: function() {
@@ -84,25 +84,29 @@
     },
 
     /**
-     * Sets the sensitivity of all the checkboxes and the commit button.
+     * Sets the enabled state of all the checkboxes and the commit button.
      * @private
      */
-    setControlsSensitive_: function(sensitive) {
+    setAllControlsEnabled_: function(enabled) {
       var checkboxes =
           document.querySelectorAll('#import-checkboxes input[type=checkbox]');
       for (var i = 0; i < checkboxes.length; i++)
-        this.setUpCheckboxState_(checkboxes[i], sensitive);
-      $('import-data-commit').disabled = !sensitive;
+        this.setUpCheckboxState_(checkboxes[i], enabled);
+      $('import-data-commit').disabled = !enabled;
     },
 
     /**
-     * Set enabled and checked states a checkbox element.
+     * Sets the enabled and checked states of a checkbox element.
      * @param {Object} checkbox A checkbox element.
-     * @param {boolean} enabled The enabled state of the chekbox.
+     * @param {boolean} enabled The enabled state of the checkbox. If false,
+     * the checkbox is disabled and unchecked. If true, the checkbox is enabled
+     * and checked.
+     * @param {boolean} visible The visible state of the checkbox.
      * @private
      */
     setUpCheckboxState_: function(checkbox, enabled) {
-       checkbox.setDisabled('noProfileData', !enabled);
+      checkbox.setDisabled('noProfileData', !enabled);
+      checkbox.checked = enabled;
     },
 
     /**
@@ -119,6 +123,8 @@
         var checkbox = $('import-' + importOptions[i]);
         var enable = browserProfile && browserProfile[importOptions[i]];
         this.setUpCheckboxState_(checkbox, enable);
+        var checkboxWithLabel = $('import-' + importOptions[i] + '-with-label');
+        checkboxWithLabel.style.display = enable ? '' : 'none';
       }
     },
 
@@ -138,9 +144,9 @@
         var option = new Option(loadTimeData.getString('noProfileFound'), 0);
         browserSelect.appendChild(option);
 
-        this.setControlsSensitive_(false);
+        this.setAllControlsEnabled_(false);
       } else {
-        this.setControlsSensitive_(true);
+        this.setAllControlsEnabled_(true);
         for (var i = 0; i < browserCount; i++) {
           var browser = browsers[i];
           var option = new Option(browser.name, browser.index);
diff --git a/chrome/browser/resources/options/options_page.js b/chrome/browser/resources/options/options_page.js
index 025eba0..67fbe2f 100644
--- a/chrome/browser/resources/options/options_page.js
+++ b/chrome/browser/resources/options/options_page.js
@@ -277,11 +277,15 @@
     this.setTitle_(overlay.title);
 
     // Change focus to the overlay if any other control was focused by keyboard
-    // before.
-    if (document.activeElement != document.body &&
-        document.documentElement.classList.contains(
-            cr.ui.FocusOutlineManager.CLASS_NAME))
-      overlay.focus();
+    // before. Otherwise, no one should have focus.
+    if (document.activeElement != document.body) {
+      if (document.documentElement.classList.contains(
+          cr.ui.FocusOutlineManager.CLASS_NAME)) {
+        overlay.focus();
+      } else {
+        document.activeElement.blur();
+      }
+    }
 
     $('searchBox').setAttribute('aria-hidden', true);
 
diff --git a/chrome/browser/signin/signin_promo.cc b/chrome/browser/signin/signin_promo.cc
index cf8c4ae..729d6aa 100644
--- a/chrome/browser/signin/signin_promo.cc
+++ b/chrome/browser/signin/signin_promo.cc
@@ -21,7 +21,6 @@
 #include "chrome/browser/sync/profile_sync_service.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/browser/ui/webui/options/core_options_handler.h"
-#include "chrome/browser/ui/webui/sync_promo/sync_promo_trial.h"
 #include "chrome/browser/ui/webui/theme_source.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/net/url_util.h"
@@ -80,12 +79,12 @@
 
 // Returns true if a user has seen the sign in promo at startup previously.
 bool HasShownPromoAtStartup(Profile* profile) {
-  return profile->GetPrefs()->HasPrefPath(prefs::kSyncPromoStartupCount);
+  return profile->GetPrefs()->HasPrefPath(prefs::kSignInPromoStartupCount);
 }
 
 // Returns true if the user has previously skipped the sign in promo.
 bool HasUserSkippedPromo(Profile* profile) {
-  return profile->GetPrefs()->GetBoolean(prefs::kSyncPromoUserSkipped);
+  return profile->GetPrefs()->GetBoolean(prefs::kSignInPromoUserSkipped);
 }
 
 }  // namespace
@@ -138,14 +137,14 @@
     return false;
 
   PrefService* prefs = profile->GetPrefs();
-  int show_count = prefs->GetInteger(prefs::kSyncPromoStartupCount);
+  int show_count = prefs->GetInteger(prefs::kSignInPromoStartupCount);
   if (show_count >= kSignInPromoShowAtStartupMaximum)
     return false;
 
   // This pref can be set in the master preferences file to allow or disallow
   // showing the sign in promo at startup.
-  if (prefs->HasPrefPath(prefs::kSyncPromoShowOnFirstRunAllowed))
-    return prefs->GetBoolean(prefs::kSyncPromoShowOnFirstRunAllowed);
+  if (prefs->HasPrefPath(prefs::kSignInPromoShowOnFirstRunAllowed))
+    return prefs->GetBoolean(prefs::kSignInPromoShowOnFirstRunAllowed);
 
   // For now don't show the promo for some brands.
   if (!AllowPromoAtStartupForCurrentBrand())
@@ -161,13 +160,13 @@
 
 void DidShowPromoAtStartup(Profile* profile) {
   int show_count = profile->GetPrefs()->GetInteger(
-      prefs::kSyncPromoStartupCount);
+      prefs::kSignInPromoStartupCount);
   show_count++;
-  profile->GetPrefs()->SetInteger(prefs::kSyncPromoStartupCount, show_count);
+  profile->GetPrefs()->SetInteger(prefs::kSignInPromoStartupCount, show_count);
 }
 
 void SetUserSkippedPromo(Profile* profile) {
-  profile->GetPrefs()->SetBoolean(prefs::kSyncPromoUserSkipped, true);
+  profile->GetPrefs()->SetBoolean(prefs::kSignInPromoUserSkipped, true);
 }
 
 GURL GetLandingURL(const char* option, int value) {
@@ -255,28 +254,22 @@
 
 void RegisterProfilePrefs(
     user_prefs::PrefRegistrySyncable* registry) {
-  // TODO(fdoray): Rename these preferences to start with kSignInPromo.
-  // (crbug.com/264283)
   registry->RegisterIntegerPref(
-      prefs::kSyncPromoStartupCount,
+      prefs::kSignInPromoStartupCount,
       0,
       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
   registry->RegisterBooleanPref(
-      prefs::kSyncPromoUserSkipped,
+      prefs::kSignInPromoUserSkipped,
       false,
       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
   registry->RegisterBooleanPref(
-      prefs::kSyncPromoShowOnFirstRunAllowed,
+      prefs::kSignInPromoShowOnFirstRunAllowed,
       true,
       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
   registry->RegisterBooleanPref(
-      prefs::kSyncPromoShowNTPBubble,
+      prefs::kSignInPromoShowNTPBubble,
       false,
       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
-  registry->RegisterStringPref(
-      prefs::kSyncPromoErrorMessage,
-      std::string(),
-      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
 }
 
 }  // namespace signin
diff --git a/chrome/browser/signin/signin_promo.h b/chrome/browser/signin/signin_promo.h
index 9005f42..164cbbc 100644
--- a/chrome/browser/signin/signin_promo.h
+++ b/chrome/browser/signin/signin_promo.h
@@ -19,7 +19,6 @@
 // Utility functions for sign in promos.
 namespace signin {
 
-// Please keep this in sync with enums in sync_promo_trial.cc.
 enum Source {
   SOURCE_START_PAGE = 0, // This must be first.
   SOURCE_NTP_LINK,
diff --git a/chrome/browser/spellchecker/feedback.cc b/chrome/browser/spellchecker/feedback.cc
index 4cbdd5e..42bebbc 100644
--- a/chrome/browser/spellchecker/feedback.cc
+++ b/chrome/browser/spellchecker/feedback.cc
@@ -1,6 +1,18 @@
 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+//
+// The |Feedback| object keeps track of each instance of user feedback in a map
+// |misspellings_|. This is a map from uint32 hashes to |Misspelling| objects.
+//
+// Each misspelling should be present in only one renderer process. The
+// |Feedback| objects keeps track of misspelling-renderer relationship in the
+// |renderers_| map of renderer process identifiers to a set of hashes.
+//
+// When the user adds a misspelling to their custom dictionary, all of the
+// |Misspelling| objects with the same misspelled string are updated. The
+// |Feedback| object facilitates efficient access to these misspellings through
+// a |text_| map of misspelled strings to a set of hashes.
 
 #include "chrome/browser/spellchecker/feedback.h"
 
@@ -16,76 +28,86 @@
 }
 
 Misspelling* Feedback::GetMisspelling(uint32 hash) {
-  HashMisspellingMap::iterator it = misspellings_.find(hash);
-  if (it == misspellings_.end())
+  HashMisspellingMap::iterator misspelling_it = misspellings_.find(hash);
+  if (misspelling_it == misspellings_.end())
     return NULL;
-  return &it->second;
+  return &misspelling_it->second;
 }
 
 void Feedback::FinalizeRemovedMisspellings(
     int renderer_process_id,
     const std::vector<uint32>& remaining_markers) {
-  RendererHashesMap::iterator i = renderers_.find(renderer_process_id);
-  if (i == renderers_.end() || i->second.empty())
+  RendererHashesMap::iterator renderer_it =
+      renderers_.find(renderer_process_id);
+  if (renderer_it == renderers_.end() || renderer_it->second.empty())
     return;
-  HashCollection remaining_set(remaining_markers.begin(),
-                               remaining_markers.end());
-  std::vector<uint32> removed_markers;
-  std::set_difference(i->second.begin(),
-                      i->second.end(),
-                      remaining_set.begin(),
-                      remaining_set.end(),
-                      std::back_inserter(removed_markers));
-  for (std::vector<uint32>::const_iterator j = removed_markers.begin();
-       j != removed_markers.end();
-       ++j) {
-    HashMisspellingMap::iterator k = misspellings_.find(*j);
-    if (k != misspellings_.end() && !k->second.action.IsFinal())
-      k->second.action.Finalize();
+  HashCollection& renderer_hashes = renderer_it->second;
+  HashCollection remaining_hashes(remaining_markers.begin(),
+                                  remaining_markers.end());
+  std::vector<uint32> removed_hashes;
+  std::set_difference(renderer_hashes.begin(),
+                      renderer_hashes.end(),
+                      remaining_hashes.begin(),
+                      remaining_hashes.end(),
+                      std::back_inserter(removed_hashes));
+  for (std::vector<uint32>::const_iterator hash_it = removed_hashes.begin();
+       hash_it != removed_hashes.end();
+       ++hash_it) {
+    HashMisspellingMap::iterator misspelling_it = misspellings_.find(*hash_it);
+    if (misspelling_it != misspellings_.end() &&
+        !misspelling_it->second.action.IsFinal()) {
+      misspelling_it->second.action.Finalize();
+    }
   }
 }
 
 bool Feedback::RendererHasMisspellings(int renderer_process_id) const {
-  RendererHashesMap::const_iterator it = renderers_.find(renderer_process_id);
-  return it != renderers_.end() && !it->second.empty();
+  RendererHashesMap::const_iterator renderer_it =
+      renderers_.find(renderer_process_id);
+  return renderer_it != renderers_.end() && !renderer_it->second.empty();
 }
 
 std::vector<Misspelling> Feedback::GetMisspellingsInRenderer(
     int renderer_process_id) const {
-  std::vector<Misspelling> result;
-  RendererHashesMap::const_iterator i = renderers_.find(renderer_process_id);
-  if (i == renderers_.end() || i->second.empty())
-    return result;
-  for (HashCollection::const_iterator j = i->second.begin();
-       j != i->second.end();
-       ++j) {
-    HashMisspellingMap::const_iterator k = misspellings_.find(*j);
-    if (k != misspellings_.end())
-      result.push_back(k->second);
+  std::vector<Misspelling> misspellings_in_renderer;
+  RendererHashesMap::const_iterator renderer_it =
+      renderers_.find(renderer_process_id);
+  if (renderer_it == renderers_.end() || renderer_it->second.empty())
+    return misspellings_in_renderer;
+  const HashCollection& renderer_hashes = renderer_it->second;
+  for (HashCollection::const_iterator hash_it = renderer_hashes.begin();
+       hash_it != renderer_hashes.end();
+       ++hash_it) {
+    HashMisspellingMap::const_iterator misspelling_it =
+        misspellings_.find(*hash_it);
+    if (misspelling_it != misspellings_.end())
+      misspellings_in_renderer.push_back(misspelling_it->second);
   }
-  return result;
+  return misspellings_in_renderer;
 }
 
 void Feedback::EraseFinalizedMisspellings(int renderer_process_id) {
-  RendererHashesMap::iterator i = renderers_.find(renderer_process_id);
-  if (i == renderers_.end() || i->second.empty())
+  RendererHashesMap::iterator renderer_it =
+      renderers_.find(renderer_process_id);
+  if (renderer_it == renderers_.end())
     return;
-  HashCollection pending;
-  for (HashCollection::const_iterator j = i->second.begin();
-       j != i->second.end();
-       ++j) {
-    HashMisspellingMap::iterator k = misspellings_.find(*j);
-    if (k != misspellings_.end()) {
-      if (k->second.action.IsFinal()) {
-        text_[k->second.context.substr(k->second.location, k->second.length)]
-            .erase(k->first);
-        misspellings_.erase(k);
-      } else {
-        pending.insert(*j);
-      }
-    }
+  HashCollection& renderer_hashes = renderer_it->second;
+  for (HashCollection::const_iterator hash_it = renderer_hashes.begin();
+       hash_it != renderer_hashes.end();) {
+    HashMisspellingMap::iterator misspelling_it = misspellings_.find(*hash_it);
+    HashCollection::iterator erasable_hash_it = hash_it;
+    ++hash_it;
+    if (misspelling_it == misspellings_.end())
+      continue;
+    const Misspelling& misspelling = misspelling_it->second;
+    if (!misspelling.action.IsFinal())
+      continue;
+    renderer_hashes.erase(erasable_hash_it);
+    text_[misspelling.GetMisspelledString()].erase(misspelling.hash);
+    misspellings_.erase(misspelling_it);
   }
-  i->second.swap(pending);
+  if (renderer_hashes.empty())
+    renderers_.erase(renderer_it);
 }
 
 bool Feedback::HasMisspelling(uint32 hash) const {
@@ -94,10 +116,24 @@
 
 void Feedback::AddMisspelling(int renderer_process_id,
                               const Misspelling& misspelling) {
+  HashMisspellingMap::iterator misspelling_it =
+      misspellings_.find(misspelling.hash);
+  if (misspelling_it != misspellings_.end()) {
+    const Misspelling& existing_misspelling = misspelling_it->second;
+    text_[existing_misspelling.GetMisspelledString()].erase(misspelling.hash);
+    for (RendererHashesMap::iterator renderer_it = renderers_.begin();
+         renderer_it != renderers_.end();) {
+      HashCollection& renderer_hashes = renderer_it->second;
+      RendererHashesMap::iterator erasable_renderer_it = renderer_it;
+      ++renderer_it;
+      renderer_hashes.erase(misspelling.hash);
+      if (renderer_hashes.empty())
+        renderers_.erase(erasable_renderer_it);
+    }
+  }
   misspellings_[misspelling.hash] = misspelling;
+  text_[misspelling.GetMisspelledString()].insert(misspelling.hash);
   renderers_[renderer_process_id].insert(misspelling.hash);
-  text_[misspelling.context.substr(
-      misspelling.location, misspelling.length)].insert(misspelling.hash);
 }
 
 bool Feedback::Empty() const {
@@ -105,44 +141,46 @@
 }
 
 std::vector<int> Feedback::GetRendersWithMisspellings() const {
-  std::vector<int> result;
-  for (RendererHashesMap::const_iterator it = renderers_.begin();
-       it != renderers_.end();
-       ++it) {
-    if (!it->second.empty())
-      result.push_back(it->first);
+  std::vector<int> renderers_with_misspellings;
+  for (RendererHashesMap::const_iterator renderer_it = renderers_.begin();
+       renderer_it != renderers_.end();
+       ++renderer_it) {
+    if (!renderer_it->second.empty())
+      renderers_with_misspellings.push_back(renderer_it->first);
   }
-  return result;
+  return renderers_with_misspellings;
 }
 
 void Feedback::FinalizeAllMisspellings() {
-  for (HashMisspellingMap::iterator it = misspellings_.begin();
-       it != misspellings_.end();
-       ++it) {
-    if (!it->second.action.IsFinal())
-      it->second.action.Finalize();
+  for (HashMisspellingMap::iterator misspelling_it = misspellings_.begin();
+       misspelling_it != misspellings_.end();
+       ++misspelling_it) {
+    if (!misspelling_it->second.action.IsFinal())
+      misspelling_it->second.action.Finalize();
   }
 }
 
 std::vector<Misspelling> Feedback::GetAllMisspellings() const {
-  std::vector<Misspelling> result;
-  for (HashMisspellingMap::const_iterator it = misspellings_.begin();
-       it != misspellings_.end();
-       ++it) {
-    result.push_back(it->second);
+  std::vector<Misspelling> all_misspellings;
+  for (HashMisspellingMap::const_iterator misspelling_it =
+           misspellings_.begin();
+       misspelling_it != misspellings_.end();
+       ++misspelling_it) {
+    all_misspellings.push_back(misspelling_it->second);
   }
-  return result;
+  return all_misspellings;
 }
 
 void Feedback::Clear() {
   misspellings_.clear();
-  renderers_.clear();
   text_.clear();
+  renderers_.clear();
 }
 
 const std::set<uint32>& Feedback::FindMisspellings(
-    const string16& misspelled_text) {
-  return text_[misspelled_text];
+    const string16& misspelled_text) const {
+  const TextHashesMap::const_iterator text_it = text_.find(misspelled_text);
+  return text_it == text_.end() ? empty_hash_collection_ : text_it->second;
 }
 
 }  // namespace spellcheck
diff --git a/chrome/browser/spellchecker/feedback.h b/chrome/browser/spellchecker/feedback.h
index 01937df..ce4a3a7 100644
--- a/chrome/browser/spellchecker/feedback.h
+++ b/chrome/browser/spellchecker/feedback.h
@@ -1,6 +1,13 @@
 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+//
+// An object to store user feedback to spellcheck suggestions from spelling
+// service.
+//
+// Stores feedback for the spelling service in |Misspelling| objects. Each
+// |Misspelling| object is identified by a |hash| and corresponds to a document
+// marker with the same |hash| identifier in the renderer.
 
 #ifndef CHROME_BROWSER_SPELLCHECKER_FEEDBACK_H_
 #define CHROME_BROWSER_SPELLCHECKER_FEEDBACK_H_
@@ -13,9 +20,15 @@
 
 namespace spellcheck {
 
-// Stores feedback for the spelling service in |Misspelling| objects. Each
-// |Misspelling| object is identified by a |hash| and corresponds to a document
-// marker  with the same |hash| identifier in the renderer.
+// Stores user feedback to spellcheck suggestions. Sample usage:
+//    Feedback feedback;
+//    feedback.AddMisspelling(renderer_process_id, Misspelling(
+//        ASCIIToUTF16("Helllo world"), 0, 6, std::vector<string16>(),
+//        GenerateRandomHash()));
+//    feedback.FinalizeRemovedMisspellings(renderer_process_id,
+//                                         std::vector<uint32>());
+//    ProcessFeedback(feedback.GetMisspellingsInRenderer(renderer_process_id));
+//    feedback.EraseFinalizedMisspellings(renderer_process_id);
 class Feedback {
  public:
   Feedback();
@@ -33,7 +46,7 @@
       const std::vector<uint32>& remaining_markers);
 
   // Returns true if the renderer with process ID |renderer_process_id| has
-  // misspellings. Otherwise returns false.
+  // misspellings.
   bool RendererHasMisspellings(int renderer_process_id) const;
 
   // Returns a copy of the misspellings in renderer with process ID
@@ -45,15 +58,14 @@
   // process ID |renderer_process_id|.
   void EraseFinalizedMisspellings(int renderer_process_id);
 
-  // Returns true if there's a misspelling with |hash| identifier. Otherwise
-  // returns false.
+  // Returns true if there's a misspelling with |hash| identifier.
   bool HasMisspelling(uint32 hash) const;
 
   // Adds the |misspelling| to feedback data. If the |misspelling| has a
   // duplicate hash, then replaces the existing misspelling with the same hash.
   void AddMisspelling(int renderer_process_id, const Misspelling& misspelling);
 
-  // Returns true if there're no misspellings. Otherwise returns false.
+  // Returns true if there're no misspellings.
   bool Empty() const;
 
   // Returns a list of process identifiers for renderers that have misspellings.
@@ -69,21 +81,27 @@
   void Clear();
 
   // Returns a list of all misspelling identifiers for |misspelled_text|.
-  const std::set<uint32>& FindMisspellings(const string16& misspelled_text);
+  const std::set<uint32>& FindMisspellings(
+      const string16& misspelled_text) const;
 
  private:
+  typedef std::map<uint32, Misspelling> HashMisspellingMap;
+  typedef std::set<uint32> HashCollection;
+  typedef std::map<int, HashCollection> RendererHashesMap;
+  typedef std::map<string16, HashCollection> TextHashesMap;
+
+  // An empty hash collection to return when FindMisspellings() does not find
+  // misspellings.
+  const HashCollection empty_hash_collection_;
+
   // A map of hashes that identify document markers to feedback data to be sent
   // to spelling service.
-  typedef std::map<uint32, Misspelling> HashMisspellingMap;
   HashMisspellingMap misspellings_;
 
   // A map of renderer process ID to hashes that identify misspellings.
-  typedef std::set<uint32> HashCollection;
-  typedef std::map<int, HashCollection> RendererHashesMap;
   RendererHashesMap renderers_;
 
   // A map of misspelled text to hashes that identify misspellings.
-  typedef std::map<string16, HashCollection> TextHashesMap;
   TextHashesMap text_;
 
   DISALLOW_COPY_AND_ASSIGN(Feedback);
diff --git a/chrome/browser/spellchecker/feedback_sender.cc b/chrome/browser/spellchecker/feedback_sender.cc
index c250cf4..f8d4957 100644
--- a/chrome/browser/spellchecker/feedback_sender.cc
+++ b/chrome/browser/spellchecker/feedback_sender.cc
@@ -1,6 +1,31 @@
 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+//
+// The |FeedbackSender| object stores the user feedback to spellcheck
+// suggestions in a |Feedback| object.
+//
+// When spelling service returns spellcheck results, these results first arrive
+// in |FeedbackSender| to assign hash identifiers for each
+// misspelling-suggestion pair. If the spelling service identifies the same
+// misspelling as already displayed to the user, then |FeedbackSender| reuses
+// the same hash identifiers to avoid duplication. It detects the duplicates by
+// comparing misspelling offsets in text. Spelling service can return duplicates
+// because we request spellcheck for whole paragraphs, as context around a
+// misspelled word is important to the spellcheck algorithm.
+//
+// All feedback is initially pending. When a user acts upon a misspelling such
+// that the misspelling is no longer displayed (red squiggly line goes away),
+// then the feedback for this misspelling is finalized. All finalized feedback
+// is erased after being sent to the spelling service. Pending feedback is kept
+// around for |kSessionHours| hours and then finalized even if user did not act
+// on the misspellings.
+//
+// |FeedbackSender| periodically requests a list of hashes of all remaining
+// misspellings in renderers. When a renderer responds with a list of hashes,
+// |FeedbackSender| uses the list to determine which misspellings are no longer
+// displayed to the user and sends the current state of user feedback to the
+// spelling service.
 
 #include "chrome/browser/spellchecker/feedback_sender.h"
 
@@ -13,6 +38,7 @@
 #include "base/metrics/field_trial.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/stringprintf.h"
 #include "base/values.h"
 #include "chrome/browser/spellchecker/word_trimmer.h"
 #include "chrome/common/chrome_switches.h"
@@ -38,11 +64,11 @@
 // Returns a hash of |session_start|, the current timestamp, and
 // |suggestion_index|.
 uint32 BuildHash(const base::Time& session_start, size_t suggestion_index) {
-  std::stringstream hash_data;
-  hash_data << session_start.ToTimeT()
-            << base::Time::Now().ToTimeT()
-            << suggestion_index;
-  return base::Hash(hash_data.str());
+  return base::Hash(
+      base::StringPrintf("%" PRId64 "%" PRId64 "%" PRIuS,
+                         session_start.ToInternalValue(),
+                         base::Time::Now().ToInternalValue(),
+                         suggestion_index));
 }
 
 // Returns a pending feedback data structure for the spellcheck |result| and
@@ -66,10 +92,11 @@
     const std::vector<Misspelling>& suggestions,
     bool is_first_feedback_batch) {
   base::ListValue* list = new base::ListValue;
-  for (std::vector<Misspelling>::const_iterator it = suggestions.begin();
-       it != suggestions.end();
-       ++it) {
-    base::DictionaryValue* suggestion = it->Serialize();
+  for (std::vector<Misspelling>::const_iterator suggestion_it =
+           suggestions.begin();
+       suggestion_it != suggestions.end();
+       ++suggestion_it) {
+    base::DictionaryValue* suggestion = suggestion_it->Serialize();
     suggestion->SetBoolean("isFirstInSession", is_first_feedback_batch);
     suggestion->SetBoolean("isAutoCorrection", false);
     list->Append(suggestion);
@@ -101,6 +128,16 @@
   return result;
 }
 
+// Returns true if the misspelling location is within text bounds.
+bool IsInBounds(int misspelling_location,
+                int misspelling_length,
+                size_t text_length) {
+  return misspelling_location >= 0 && misspelling_length > 0 &&
+         static_cast<size_t>(misspelling_location) < text_length &&
+         static_cast<size_t>(misspelling_location + misspelling_length) <=
+             text_length;
+}
+
 }  // namespace
 
 FeedbackSender::FeedbackSender(net::URLRequestContextGetter* request_context,
@@ -172,16 +209,16 @@
     return;
   misspelling->action.type = SpellcheckAction::TYPE_ADD_TO_DICT;
   misspelling->timestamp = base::Time::Now();
-  const std::set<uint32>& misspellings = feedback_.FindMisspellings(
-      misspelling->context.substr(misspelling->location, misspelling->length));
-  for (std::set<uint32>::const_iterator it = misspellings.begin();
-       it != misspellings.end();
-       ++it) {
-    Misspelling* duplicate_misspelling = feedback_.GetMisspelling(*it);
-    if (duplicate_misspelling && !duplicate_misspelling->action.IsFinal()) {
-      duplicate_misspelling->action.type = SpellcheckAction::TYPE_ADD_TO_DICT;
-      duplicate_misspelling->timestamp = misspelling->timestamp;
-    }
+  const std::set<uint32>& hashes =
+      feedback_.FindMisspellings(misspelling->GetMisspelledString());
+  for (std::set<uint32>::const_iterator hash_it = hashes.begin();
+       hash_it != hashes.end();
+       ++hash_it) {
+    Misspelling* duplicate_misspelling = feedback_.GetMisspelling(*hash_it);
+    if (!duplicate_misspelling || duplicate_misspelling->action.IsFinal())
+      continue;
+    duplicate_misspelling->action.type = SpellcheckAction::TYPE_ADD_TO_DICT;
+    duplicate_misspelling->timestamp = misspelling->timestamp;
   }
 }
 
@@ -236,39 +273,41 @@
 }
 
 void FeedbackSender::OnSpellcheckResults(
-    std::vector<SpellCheckResult>* results,
     int renderer_process_id,
     const string16& text,
-    const std::vector<SpellCheckMarker>& markers) {
+    const std::vector<SpellCheckMarker>& markers,
+    std::vector<SpellCheckResult>* results) {
   // Don't collect feedback if not going to send it.
   if (!timer_.IsRunning())
     return;
 
   // Generate a map of marker offsets to marker hashes. This map helps to
   // efficiently lookup feedback data based on the position of the misspelling
-  // in text
+  // in text.
   typedef std::map<size_t, uint32> MarkerMap;
   MarkerMap marker_map;
   for (size_t i = 0; i < markers.size(); ++i)
     marker_map[markers[i].offset] = markers[i].hash;
 
-  for (std::vector<SpellCheckResult>::iterator result_iter = results->begin();
-       result_iter != results->end();
-       ++result_iter) {
-    MarkerMap::iterator marker_iter = marker_map.find(result_iter->location);
-    if (marker_iter != marker_map.end() &&
-        feedback_.HasMisspelling(marker_iter->second)) {
+  for (std::vector<SpellCheckResult>::iterator result_it = results->begin();
+       result_it != results->end();
+       ++result_it) {
+    if (!IsInBounds(result_it->location, result_it->length, text.length()))
+      continue;
+    MarkerMap::const_iterator marker_it = marker_map.find(result_it->location);
+    if (marker_it != marker_map.end() &&
+        feedback_.HasMisspelling(marker_it->second)) {
       // If the renderer already has a marker for this spellcheck result, then
       // set the hash of the spellcheck result to be the same as the marker.
-      result_iter->hash = marker_iter->second;
+      result_it->hash = marker_it->second;
     } else {
       // If the renderer does not yet have a marker for this spellcheck result,
       // then generate a new hash for the spellcheck result.
-      result_iter->hash = BuildHash(session_start_, ++misspelling_counter_);
+      result_it->hash = BuildHash(session_start_, ++misspelling_counter_);
     }
     // Save the feedback data for the spellcheck result.
     feedback_.AddMisspelling(renderer_process_id,
-                             BuildFeedback(*result_iter, text));
+                             BuildFeedback(*result_it, text));
   }
 }
 
@@ -280,31 +319,31 @@
 }
 
 void FeedbackSender::OnURLFetchComplete(const net::URLFetcher* source) {
-  for (ScopedVector<net::URLFetcher>::iterator it = senders_.begin();
-       it != senders_.end();
-       ++it) {
-    if (*it == source) {
-      senders_.erase(it);
-      break;
+  for (ScopedVector<net::URLFetcher>::iterator sender_it = senders_.begin();
+       sender_it != senders_.end();
+       ++sender_it) {
+    if (*sender_it == source) {
+      senders_.erase(sender_it);
+      return;
     }
   }
+  delete source;
 }
 
 void FeedbackSender::RequestDocumentMarkers() {
   // Request document markers from all the renderers that are still alive.
-  std::vector<int> alive_renderers;
+  std::set<int> alive_renderers;
   for (content::RenderProcessHost::iterator it(
            content::RenderProcessHost::AllHostsIterator());
        !it.IsAtEnd();
        it.Advance()) {
-    alive_renderers.push_back(it.GetCurrentValue()->GetID());
+    alive_renderers.insert(it.GetCurrentValue()->GetID());
     it.GetCurrentValue()->Send(new SpellCheckMsg_RequestDocumentMarkers());
   }
 
   // Asynchronously send out the feedback for all the renderers that are no
   // longer alive.
   std::vector<int> known_renderers = feedback_.GetRendersWithMisspellings();
-  std::sort(alive_renderers.begin(), alive_renderers.end());
   std::sort(known_renderers.begin(), known_renderers.end());
   std::vector<int> dead_renderers;
   std::set_difference(known_renderers.begin(),
diff --git a/chrome/browser/spellchecker/feedback_sender.h b/chrome/browser/spellchecker/feedback_sender.h
index 286008f..ea647ad 100644
--- a/chrome/browser/spellchecker/feedback_sender.h
+++ b/chrome/browser/spellchecker/feedback_sender.h
@@ -1,6 +1,13 @@
 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+//
+// An object to record and send user feedback to spelling service. The spelling
+// service uses the feedback to improve its suggestions.
+//
+// Assigns uint32 hash identifiers to spelling suggestions from spelling service
+// and stores these suggestions. Records user's actions on these suggestions.
+// Periodically sends batches of user feedback to the spelling service.
 
 #ifndef CHROME_BROWSER_SPELLCHECKER_FEEDBACK_SENDER_H_
 #define CHROME_BROWSER_SPELLCHECKER_FEEDBACK_SENDER_H_
@@ -27,14 +34,26 @@
 
 namespace spellcheck {
 
-// Constants for the feedback field trial.
-static const char kFeedbackFieldTrialName[] = "SpellingServiceFeedback";
-static const char kFeedbackFieldTrialEnabledGroupName[] = "Enabled";
+namespace {
 
-// Manages sending feedback to the spelling service.
+// Constants for the feedback field trial.
+const char kFeedbackFieldTrialName[] = "SpellingServiceFeedback";
+const char kFeedbackFieldTrialEnabledGroupName[] = "Enabled";
+
+}  // namespace
+
+// Stores and sends user feedback to the spelling service. Sample usage:
+//    FeedbackSender sender(profile.GetRequestContext(), language, country);
+//    sender.OnSpellcheckResults(spellcheck_results_from_spelling_service,
+//                               renderer_process_id,
+//                               spellchecked_text,
+//                               existing_hashes);
+//    sender.SelectedSuggestion(hash, suggestion_index);
 class FeedbackSender : public base::SupportsWeakPtr<FeedbackSender>,
                        public net::URLFetcherDelegate {
  public:
+  // Constructs a feedback sender. Keeps |request_context| in a scoped_refptr,
+  // because URLRequestContextGetter implements RefcountedThreadSafe.
   FeedbackSender(net::URLRequestContextGetter* request_context,
                  const std::string& language,
                  const std::string& country);
@@ -72,11 +91,12 @@
 
   // Generates feedback data based on spellcheck results. The new feedback data
   // is pending. Sets hash identifiers for |results|. Called when spelling
-  // service client receives results from the spelling service.
-  void OnSpellcheckResults(std::vector<SpellCheckResult>* results,
-                           int renderer_process_id,
+  // service client receives results from the spelling service. Does not take
+  // ownership of |results|.
+  void OnSpellcheckResults(int renderer_process_id,
                            const string16& text,
-                           const std::vector<SpellCheckMarker>& markers);
+                           const std::vector<SpellCheckMarker>& markers,
+                           std::vector<SpellCheckResult>* results);
 
   // Receives updated language and country code for feedback. Finalizes and
   // sends out all of the feedback data.
@@ -86,7 +106,7 @@
  private:
   friend class FeedbackSenderTest;
 
-  // net::URLFetcherDelegate implementation.
+  // net::URLFetcherDelegate implementation. Takes ownership of |source|.
   virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
 
   // Requests the document markers from all of the renderers to determine which
@@ -102,7 +122,7 @@
   void SendFeedback(const std::vector<Misspelling>& feedback_data,
                     bool is_first_feedback_batch);
 
-  // Request context for the feedback senders.
+  // URL request context for the feedback senders.
   scoped_refptr<net::URLRequestContextGetter> request_context_;
 
   // The language of text. The string is a BCP 47 language tag.
diff --git a/chrome/browser/spellchecker/feedback_sender_unittest.cc b/chrome/browser/spellchecker/feedback_sender_unittest.cc
index 3532334..5c0b1db 100644
--- a/chrome/browser/spellchecker/feedback_sender_unittest.cc
+++ b/chrome/browser/spellchecker/feedback_sender_unittest.cc
@@ -1,9 +1,10 @@
 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+//
+// Unit tests for |FeedbackSender| object.
 
-#include <string>
-#include <vector>
+#include "chrome/browser/spellchecker/feedback_sender.h"
 
 #include "base/bind.h"
 #include "base/command_line.h"
@@ -13,7 +14,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
-#include "chrome/browser/spellchecker/feedback_sender.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/metrics/entropy_provider.h"
 #include "chrome/common/spellcheck_common.h"
@@ -28,19 +28,20 @@
 
 namespace {
 
-static const int kMisspellingLength = 6;
-static const int kMisspellingStart = 0;
-static const int kRendererProcessId = 0;
-static const int kUrlFetcherId = 0;
-static const std::string kCountry = "USA";
-static const std::string kLanguage = "en";
-static const string16 kText = ASCIIToUTF16("Helllo world.");
+const char kCountry[] = "USA";
+const char kLanguage[] = "en";
+const char kText[] = "Helllo world.";
+const int kMisspellingLength = 6;
+const int kMisspellingStart = 0;
+const int kRendererProcessId = 0;
+const int kUrlFetcherId = 0;
 
+// Builds a simple spellcheck result.
 SpellCheckResult BuildSpellCheckResult() {
   return SpellCheckResult(SpellCheckResult::SPELLING,
                           kMisspellingStart,
                           kMisspellingLength,
-                          ASCIIToUTF16("Hello"));
+                          UTF8ToUTF16("Hello"));
 }
 
 // Returns the number of times that |needle| appears in |haystack| without
@@ -57,10 +58,10 @@
 
 }  // namespace
 
+// A test fixture to help keep tests simple.
 class FeedbackSenderTest : public testing::Test {
  public:
   FeedbackSenderTest() : ui_thread_(content::BrowserThread::UI, &loop_) {
-
     // The command-line switch and the field trial are temporary.
     // TODO(rouslan): Remove the command-line switch and the field trial.
     // http://crbug.com/247726
@@ -71,24 +72,17 @@
     field_trial_ = base::FieldTrialList::CreateFieldTrial(
         kFeedbackFieldTrialName, kFeedbackFieldTrialEnabledGroupName);
     field_trial_->group();
-
     feedback_.reset(new FeedbackSender(NULL, kLanguage, kCountry));
   }
   virtual ~FeedbackSenderTest() {}
 
- private:
-  TestingProfile profile_;
-  base::MessageLoop loop_;
-  content::TestBrowserThread ui_thread_;
-  scoped_ptr<base::FieldTrialList> field_trial_list_;
-  scoped_refptr<base::FieldTrial> field_trial_;
-  net::TestURLFetcherFactory fetchers_;
-
  protected:
   uint32 AddPendingFeedback() {
     std::vector<SpellCheckResult> results(1, BuildSpellCheckResult());
-    feedback_->OnSpellcheckResults(
-        &results, kRendererProcessId, kText, std::vector<SpellCheckMarker>());
+    feedback_->OnSpellcheckResults(kRendererProcessId,
+                                   UTF8ToUTF16(kText),
+                                   std::vector<SpellCheckMarker>(),
+                                   &results);
     return results[0].hash;
   }
 
@@ -112,8 +106,8 @@
                           number_of_occurrences;
   }
 
-  // Returns true if the feedback sender would be uploading data now. Otherwise
-  // returns false. The test does not open network connections.
+  // Returns true if the feedback sender would be uploading data now. The test
+  // does not open network connections.
   bool IsUploadingData() const {
     return !!fetchers_.GetFetcherByID(kUrlFetcherId);
   }
@@ -129,6 +123,14 @@
   }
 
   scoped_ptr<spellcheck::FeedbackSender> feedback_;
+
+ private:
+  TestingProfile profile_;
+  base::MessageLoop loop_;
+  content::TestBrowserThread ui_thread_;
+  scoped_ptr<base::FieldTrialList> field_trial_list_;
+  scoped_refptr<base::FieldTrial> field_trial_;
+  net::TestURLFetcherFactory fetchers_;
 };
 
 // Do not send data if there's no feedback.
@@ -244,8 +246,10 @@
                                      kSecondMisspellingStart,
                                      kSecondMisspellingLength,
                                      ASCIIToUTF16("world")));
-  feedback_->OnSpellcheckResults(
-      &results, kRendererProcessId, kText, std::vector<SpellCheckMarker>());
+  feedback_->OnSpellcheckResults(kRendererProcessId,
+                                 UTF8ToUTF16(kText),
+                                 std::vector<SpellCheckMarker>(),
+                                 &results);
   feedback_->OnReceiveDocumentMarkers(kRendererProcessId,
                                       std::vector<uint32>());
   EXPECT_TRUE(UploadDataContains("\"actionType\":\"NO_ACTION\"", 2));
@@ -291,8 +295,10 @@
                        kMisspellingStart,
                        kMisspellingLength,
                        ASCIIToUTF16("Hello")));
-  feedback_->OnSpellcheckResults(
-      &results, kRendererProcessId, kText, std::vector<SpellCheckMarker>());
+  feedback_->OnSpellcheckResults(kRendererProcessId,
+                                 UTF8ToUTF16(kText),
+                                 std::vector<SpellCheckMarker>(),
+                                 &results);
   uint32 original_hash = results[0].hash;
   std::vector<uint32> remaining_markers(1, original_hash);
 
@@ -327,7 +333,7 @@
                                 kMisspellingLength,
                                 ASCIIToUTF16("Hello"));
   feedback_->OnSpellcheckResults(
-      &results, kRendererProcessId, kText, original_markers);
+      kRendererProcessId, UTF8ToUTF16(kText), original_markers, &results);
   uint32 updated_hash = results[0].hash;
   EXPECT_NE(updated_hash, original_hash);
   remaining_markers[0] = updated_hash;
@@ -433,13 +439,14 @@
   std::vector<SpellCheckResult> results(
       1,
       SpellCheckResult(SpellCheckResult::SPELLING,
-                       kMisspellingStart + 10,
+                       kMisspellingStart,
                        kMisspellingLength,
                        ASCIIToUTF16("Hello")));
   std::vector<SpellCheckMarker> markers(
       1, SpellCheckMarker(hash, results[0].location));
   EXPECT_EQ(static_cast<uint32>(0), results[0].hash);
-  feedback_->OnSpellcheckResults(&results, kRendererProcessId, kText, markers);
+  feedback_->OnSpellcheckResults(
+      kRendererProcessId, UTF8ToUTF16(kText), markers, &results);
   EXPECT_EQ(hash, results[0].hash);
 }
 
@@ -460,10 +467,10 @@
   static const int kNumberOfRenderers = 2;
   int last_renderer_process_id = -1;
   for (int i = 0; i < kNumberOfRenderers; ++i) {
-    feedback_->OnSpellcheckResults(&results,
-                                   kRendererProcessId + i,
+    feedback_->OnSpellcheckResults(kRendererProcessId + i,
                                    kTextWithDuplicates,
-                                   std::vector<SpellCheckMarker>());
+                                   std::vector<SpellCheckMarker>(),
+                                   &results);
     last_renderer_process_id = kRendererProcessId + i;
   }
   std::vector<uint32> remaining_markers;
@@ -495,4 +502,26 @@
   EXPECT_TRUE(UploadDataContains("ADD_TO_DICT", 2));
 }
 
+// Spellcheck results that are out-of-bounds are not added to feedback.
+TEST_F(FeedbackSenderTest, IgnoreOutOfBounds) {
+  std::vector<SpellCheckResult> results;
+  results.push_back(SpellCheckResult(
+      SpellCheckResult::SPELLING, 0, 100, UTF8ToUTF16("Hello")));
+  results.push_back(SpellCheckResult(
+      SpellCheckResult::SPELLING, 100, 3, UTF8ToUTF16("world")));
+  results.push_back(
+      SpellCheckResult(SpellCheckResult::SPELLING, -1, 3, UTF8ToUTF16("how")));
+  results.push_back(
+      SpellCheckResult(SpellCheckResult::SPELLING, 0, 0, UTF8ToUTF16("are")));
+  results.push_back(
+      SpellCheckResult(SpellCheckResult::SPELLING, 2, -1, UTF8ToUTF16("you")));
+  feedback_->OnSpellcheckResults(kRendererProcessId,
+                                 UTF8ToUTF16(kText),
+                                 std::vector<SpellCheckMarker>(),
+                                 &results);
+  feedback_->OnReceiveDocumentMarkers(kRendererProcessId,
+                                      std::vector<uint32>());
+  EXPECT_FALSE(IsUploadingData());
+}
+
 }  // namespace spellcheck
diff --git a/chrome/browser/spellchecker/feedback_unittest.cc b/chrome/browser/spellchecker/feedback_unittest.cc
index 6529fcd..dd7c727 100644
--- a/chrome/browser/spellchecker/feedback_unittest.cc
+++ b/chrome/browser/spellchecker/feedback_unittest.cc
@@ -1,9 +1,12 @@
 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+//
+// Unit tests for |Feedback| object.
+
+#include "chrome/browser/spellchecker/feedback.h"
 
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/spellchecker/feedback.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace spellcheck {
@@ -11,13 +14,14 @@
 namespace {
 
 // Identifier for a renderer process.
-static const int kRendererProcessId = 7;
+const int kRendererProcessId = 7;
 
 // Hash identifier for a misspelling.
-static const uint32 kMisspellingHash = 42;
+const uint32 kMisspellingHash = 42;
 
 }  // namespace
 
+// A test fixture to help keep the tests simple.
 class FeedbackTest : public testing::Test {
  public:
   FeedbackTest() {}
@@ -225,9 +229,7 @@
     EXPECT_NE(static_cast<Misspelling*>(NULL), misspelling);
     EXPECT_TRUE(misspelling->hash >= kMisspellingHash &&
                 misspelling->hash <= hash);
-    EXPECT_EQ(kMisspelledWord,
-              misspelling->context.substr(misspelling->location,
-                                          misspelling->length));
+    EXPECT_EQ(kMisspelledWord, misspelling->GetMisspelledString());
   }
 }
 
diff --git a/chrome/browser/spellchecker/misspelling.cc b/chrome/browser/spellchecker/misspelling.cc
index 4afbaa7..89bcca4 100644
--- a/chrome/browser/spellchecker/misspelling.cc
+++ b/chrome/browser/spellchecker/misspelling.cc
@@ -1,6 +1,11 @@
 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+//
+// The |Misspelling| object stores the misspelling, a spellcheck suggestion for
+// it, and user's action on it. The misspelling is stored as |context|,
+// |location|, and |length| instead of only misspelled text, because the
+// spellcheck algorithm uses the context.
 
 #include "chrome/browser/spellchecker/misspelling.h"
 
@@ -59,3 +64,11 @@
   result->Set("userActions", BuildUserActionValue(action));
   return result;
 }
+
+string16 Misspelling::GetMisspelledString() const {
+  // Feedback sender does not create Misspelling objects for spellcheck results
+  // that are out-of-bounds of checked text length.
+  if (location > context.length())
+    return string16();
+  return context.substr(location, length);
+}
diff --git a/chrome/browser/spellchecker/misspelling.h b/chrome/browser/spellchecker/misspelling.h
index 7cd331b..36a9cdb 100644
--- a/chrome/browser/spellchecker/misspelling.h
+++ b/chrome/browser/spellchecker/misspelling.h
@@ -1,6 +1,13 @@
 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+//
+// An object to store user feedback to a single spellcheck suggestion.
+//
+// Stores the spellcheck suggestion, its uint32 hash identifier, and user's
+// feedback. The feedback is indirect, in the sense that we record user's
+// |action| instead of asking them how they feel about a spellcheck suggestion.
+// The object can serialize itself.
 
 #ifndef CHROME_BROWSER_SPELLCHECKER_MISSPELLING_H_
 #define CHROME_BROWSER_SPELLCHECKER_MISSPELLING_H_
@@ -10,7 +17,16 @@
 #include "base/time/time.h"
 #include "chrome/browser/spellchecker/spellcheck_action.h"
 
-// Spellcheck misspelling.
+// Stores user feedback to a spellcheck suggestion. Sample usage:
+//    Misspelling misspelling.
+//    misspelling.context = ASCIIToUTF16("Helllo world");
+//    misspelling.location = 0;
+//    misspelling.length = 6;
+//    misspelling.suggestions = std::vector<string16>(1, ASCIIToUTF16("Hello"));
+//    misspelling.hash = GenerateRandomHash();
+//    misspelling.action.type = SpellcheckAction::TYPE_SELECT;
+//    misspelling.action.index = 0;
+//    Process(misspelling.Serialize());
 class Misspelling {
  public:
   Misspelling();
@@ -25,6 +41,10 @@
   // the result.
   base::DictionaryValue* Serialize() const;
 
+  // Returns the substring of |context| that begins at |location| and contains
+  // |length| characters.
+  string16 GetMisspelledString() const;
+
   // A several-word text snippet that immediately surrounds the misspelling.
   string16 context;
 
diff --git a/chrome/browser/spellchecker/misspelling_unittest.cc b/chrome/browser/spellchecker/misspelling_unittest.cc
index 5437853..8f58ac8 100644
--- a/chrome/browser/spellchecker/misspelling_unittest.cc
+++ b/chrome/browser/spellchecker/misspelling_unittest.cc
@@ -1,11 +1,14 @@
 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+//
+// Unit tests for |Misspelling| object.
+
+#include "chrome/browser/spellchecker/misspelling.h"
 
 #include "base/json/json_reader.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
-#include "chrome/browser/spellchecker/misspelling.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 TEST(MisspellingTest, SerializeTest) {
@@ -29,3 +32,21 @@
   scoped_ptr<base::DictionaryValue> serialized(misspelling.Serialize());
   EXPECT_TRUE(serialized->Equals(expected.get()));
 }
+
+TEST(MisspellingTest, GetMisspelledStringTest) {
+  Misspelling misspelling;
+  misspelling.context = ASCIIToUTF16("How doe sit know");
+  misspelling.location = 4;
+  misspelling.length = 7;
+  EXPECT_EQ(ASCIIToUTF16("doe sit"), misspelling.GetMisspelledString());
+
+  misspelling.length = 0;
+  EXPECT_EQ(string16(), misspelling.GetMisspelledString());
+
+  misspelling.location = misspelling.context.length();
+  misspelling.length = 7;
+  EXPECT_EQ(string16(), misspelling.GetMisspelledString());
+
+  misspelling.location = misspelling.context.length() + 1;
+  EXPECT_EQ(string16(), misspelling.GetMisspelledString());
+}
diff --git a/chrome/browser/spellchecker/spellcheck_message_filter.cc b/chrome/browser/spellchecker/spellcheck_message_filter.cc
index e58be59..80f012d 100644
--- a/chrome/browser/spellchecker/spellcheck_message_filter.cc
+++ b/chrome/browser/spellchecker/spellcheck_message_filter.cc
@@ -140,7 +140,7 @@
     return;
   std::vector<SpellCheckResult> results_copy = results;
   spellcheck->GetFeedbackSender()->OnSpellcheckResults(
-      &results_copy, render_process_id_, text, markers);
+      render_process_id_, text, markers, &results_copy);
 
   // Erase custom dictionary words from the spellcheck results and record
   // in-dictionary feedback.
diff --git a/chrome/browser/spellchecker/spellcheck_message_filter_mac.cc b/chrome/browser/spellchecker/spellcheck_message_filter_mac.cc
index 7648fb9..812c5ce 100644
--- a/chrome/browser/spellchecker/spellcheck_message_filter_mac.cc
+++ b/chrome/browser/spellchecker/spellcheck_message_filter_mac.cc
@@ -170,10 +170,10 @@
       SpellcheckServiceFactory::GetForRenderProcessId(render_process_id_);
   if (spellcheck_service) {
     spellcheck_service->GetFeedbackSender()->OnSpellcheckResults(
-        &remote_results_,
         render_process_id_,
         text,
-        markers_);
+        markers_,
+        &remote_results_);
   }
 
   OnCheckCompleted();
diff --git a/chrome/browser/ssl/ssl_error_info.cc b/chrome/browser/ssl/ssl_error_info.cc
index a6860dd..d11beb8 100644
--- a/chrome/browser/ssl/ssl_error_info.cc
+++ b/chrome/browser/ssl/ssl_error_info.cc
@@ -6,7 +6,6 @@
 
 #include "base/i18n/time_formatting.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/common/time_format.h"
 #include "content/public/browser/cert_store.h"
 #include "grit/chromium_strings.h"
 #include "grit/generated_resources.h"
diff --git a/chrome/browser/sync/profile_sync_service.cc b/chrome/browser/sync/profile_sync_service.cc
index 51f6c0d..40d198a 100644
--- a/chrome/browser/sync/profile_sync_service.cc
+++ b/chrome/browser/sync/profile_sync_service.cc
@@ -57,7 +57,6 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/chrome_version_info.h"
 #include "chrome/common/pref_names.h"
-#include "chrome/common/time_format.h"
 #include "chrome/common/url_constants.h"
 #include "components/user_prefs/pref_registry_syncable.h"
 #include "content/public/browser/notification_details.h"
@@ -76,6 +75,7 @@
 #include "sync/js/js_event_details.h"
 #include "sync/util/cryptographer.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
 
 #if defined(ENABLE_MANAGED_USERS)
 #include "chrome/browser/managed_mode/managed_user_service.h"
@@ -1371,10 +1371,6 @@
 
 void ProfileSyncService::OnConfigureStart() {
   sync_configure_start_time_ = base::Time::Now();
-  content::NotificationService::current()->Notify(
-      chrome::NOTIFICATION_SYNC_CONFIGURE_START,
-      content::Source<ProfileSyncService>(this),
-      content::NotificationService::NoDetails());
   NotifyObservers();
 }
 
@@ -1478,7 +1474,7 @@
   if (last_synced < base::TimeDelta::FromMinutes(1))
     return l10n_util::GetStringUTF16(IDS_SYNC_TIME_JUST_NOW);
 
-  return TimeFormat::TimeElapsed(last_synced);
+  return ui::TimeFormat::TimeElapsed(last_synced);
 }
 
 void ProfileSyncService::UpdateSelectedTypesHistogram(
diff --git a/chrome/browser/sync/test/integration/autofill_helper.cc b/chrome/browser/sync/test/integration/autofill_helper.cc
index 54bb657..e4a7f61 100644
--- a/chrome/browser/sync/test/integration/autofill_helper.cc
+++ b/chrome/browser/sync/test/integration/autofill_helper.cc
@@ -284,7 +284,7 @@
   for (size_t i = 0; i < all_profiles.size(); ++i) {
     profiles.push_back(*all_profiles[i]);
     if (all_profiles[i]->guid() == guid)
-      profiles.back().SetRawInfo(type.server_type(), value);
+      profiles.back().SetRawInfo(type.GetStorableType(), value);
   }
   autofill_helper::SetProfiles(profile, &profiles);
 }
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc
index 14afe7a..c0307d4 100644
--- a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc
+++ b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc
@@ -35,13 +35,21 @@
 const int64 kCurrentDatabaseVersion = 3;
 const char kServiceMetadataKey[] = "SERVICE";
 const char kFileMetadataKeyPrefix[] = "FILE: ";
+const char kFileTrackerKeyPrefix[] = "TRACKER: ";
 
 struct DatabaseContents {
   scoped_ptr<ServiceMetadata> service_metadata;
+  ScopedVector<FileMetadata> file_metadata;
+  ScopedVector<FileTracker> file_trackers;
 };
 
 namespace {
 
+typedef MetadataDatabase::FileByID FileByID;
+typedef MetadataDatabase::TrackerByID TrackerByID;
+typedef MetadataDatabase::TrackersByParentAndTitle TrackersByParentAndTitle;
+typedef MetadataDatabase::TrackersByTitle TrackersByTitle;
+
 std::string RemovePrefix(const std::string& str, const std::string& prefix) {
   if (StartsWithASCII(str, prefix, true))
     return str.substr(prefix.size());
@@ -75,6 +83,44 @@
   callback.Run(LevelDBStatusToSyncStatusCode(status));
 }
 
+void PutServiceMetadataToBatch(const ServiceMetadata& service_metadata,
+                               leveldb::WriteBatch* batch) {
+  std::string value;
+  bool success = service_metadata.SerializeToString(&value);
+  DCHECK(success);
+  batch->Put(kServiceMetadataKey, value);
+}
+
+void PutFileToBatch(const FileMetadata& file, leveldb::WriteBatch* batch) {
+  std::string value;
+  bool success = file.SerializeToString(&value);
+  DCHECK(success);
+  batch->Put(kFileMetadataKeyPrefix + file.file_id(), value);
+}
+
+void PutTrackerToBatch(const FileTracker& tracker, leveldb::WriteBatch* batch) {
+  std::string value;
+  bool success = tracker.SerializeToString(&value);
+  DCHECK(success);
+  batch->Put(kFileTrackerKeyPrefix + base::Int64ToString(tracker.tracker_id()),
+             value);
+}
+
+void PutFileDeletionToBatch(const std::string& file_id,
+                            leveldb::WriteBatch* batch) {
+  batch->Delete(kFileMetadataKeyPrefix + file_id);
+}
+
+void PutTrackerDeletionToBatch(int64 tracker_id, leveldb::WriteBatch* batch) {
+  batch->Delete(kFileTrackerKeyPrefix + base::Int64ToString(tracker_id));
+}
+
+std::string GetTrackerTitle(const FileTracker& tracker) {
+  if (tracker.has_synced_details())
+    return tracker.synced_details().title();
+  return std::string();
+}
+
 // Returns true if |db| has no content.
 bool IsDatabaseEmpty(leveldb::DB* db) {
   DCHECK(db);
@@ -181,8 +227,38 @@
       continue;
     }
 
-    NOTIMPLEMENTED();
-    continue;
+    if (StartsWithASCII(key, kFileMetadataKeyPrefix, true)) {
+      std::string file_id = RemovePrefix(key, kFileMetadataKeyPrefix);
+
+      scoped_ptr<FileMetadata> file(new FileMetadata);
+      if (!file->ParseFromString(itr->value().ToString())) {
+        util::Log(logging::LOG_WARNING, FROM_HERE,
+                  "Failed to parse a FileMetadata");
+        continue;
+      }
+
+      contents->file_metadata.push_back(file.release());
+      continue;
+    }
+
+    if (StartsWithASCII(key, kFileTrackerKeyPrefix, true)) {
+      int64 tracker_id = 0;
+      if (!base::StringToInt64(RemovePrefix(key, kFileTrackerKeyPrefix),
+                               &tracker_id)) {
+        util::Log(logging::LOG_WARNING, FROM_HERE,
+                  "Failed to parse TrackerID");
+        continue;
+      }
+
+      scoped_ptr<FileTracker> tracker(new FileTracker);
+      if (!tracker->ParseFromString(itr->value().ToString())) {
+        util::Log(logging::LOG_WARNING, FROM_HERE,
+                  "Failed to parse a Tracker");
+        continue;
+      }
+      contents->file_trackers.push_back(tracker.release());
+      continue;
+    }
   }
 
   return SYNC_STATUS_OK;
@@ -193,6 +269,7 @@
 
   if (!contents->service_metadata) {
     contents->service_metadata.reset(new ServiceMetadata);
+    contents->service_metadata->set_next_tracker_id(1);
 
     std::string value;
     contents->service_metadata->SerializeToString(&value);
@@ -201,9 +278,106 @@
   return SYNC_STATUS_OK;
 }
 
-SyncStatusCode RemoveUnreachableFiles(DatabaseContents* contents,
+SyncStatusCode RemoveUnreachableItems(DatabaseContents* contents,
                                       leveldb::WriteBatch* batch) {
-  NOTIMPLEMENTED();
+  TrackerByID unvisited_trackers;
+  typedef std::map<int64, std::set<FileTracker*> > TrackersByParent;
+  TrackersByParent trackers_by_parent;
+
+  for (ScopedVector<FileTracker>::iterator itr =
+           contents->file_trackers.begin();
+       itr != contents->file_trackers.end();
+       ++itr) {
+    FileTracker* tracker = *itr;
+    DCHECK(!ContainsKey(unvisited_trackers, tracker->tracker_id()));
+    unvisited_trackers[tracker->tracker_id()] = tracker;
+    if (tracker->parent_tracker_id())
+      trackers_by_parent[tracker->parent_tracker_id()].insert(tracker);
+  }
+
+  // Traverse synced tracker tree. Take only active items, app-root and their
+  // children. Drop unreachable items.
+  ScopedVector<FileTracker> reachable_trackers;
+  std::stack<int64> pending;
+  if (contents->service_metadata->sync_root_tracker_id())
+    pending.push(contents->service_metadata->sync_root_tracker_id());
+
+  while (!pending.empty()) {
+    int64 tracker_id = pending.top();
+    pending.pop();
+
+    {
+      TrackerByID::iterator found = unvisited_trackers.find(tracker_id);
+      if (found == unvisited_trackers.end())
+        continue;
+
+      FileTracker* tracker = found->second;
+      unvisited_trackers.erase(found);
+      reachable_trackers.push_back(tracker);
+
+      if (!tracker->active() && !tracker->is_app_root())
+        continue;
+    }
+
+    TrackersByParent::iterator found = trackers_by_parent.find(tracker_id);
+    if (found == trackers_by_parent.end())
+      continue;
+
+    for (std::set<FileTracker*>::const_iterator itr =
+             found->second.begin();
+         itr != found->second.end();
+         ++itr)
+      pending.push((*itr)->tracker_id());
+  }
+
+  // Delete all unreachable trackers.
+  for (TrackerByID::iterator itr = unvisited_trackers.begin();
+       itr != unvisited_trackers.end(); ++itr) {
+    FileTracker* tracker = itr->second;
+    PutTrackerDeletionToBatch(tracker->tracker_id(), batch);
+    delete tracker;
+  }
+  unvisited_trackers.clear();
+
+  // |reachable_trackers| contains all files/folders reachable from sync-root
+  // folder via active folders and app-root folders.
+  // Update the tracker set in database contents with the reachable tracker set.
+  contents->file_trackers.weak_clear();
+  contents->file_trackers.swap(reachable_trackers);
+
+  // Do the similar traverse for FileMetadata and remove FileMetadata that don't
+  // have reachable trackers.
+  FileByID unreferred_files;
+  for (ScopedVector<FileMetadata>::const_iterator itr =
+           contents->file_metadata.begin();
+       itr != contents->file_metadata.end();
+       ++itr) {
+    unreferred_files.insert(std::make_pair((*itr)->file_id(), *itr));
+  }
+
+  ScopedVector<FileMetadata> referred_files;
+  for (ScopedVector<FileTracker>::const_iterator itr =
+           contents->file_trackers.begin();
+       itr != contents->file_trackers.end();
+       ++itr) {
+    FileByID::iterator found = unreferred_files.find((*itr)->file_id());
+    if (found != unreferred_files.end()) {
+      referred_files.push_back(found->second);
+      unreferred_files.erase(found);
+    }
+  }
+
+  for (FileByID::iterator itr = unreferred_files.begin();
+       itr != unreferred_files.end(); ++itr) {
+    FileMetadata* file = itr->second;
+    PutFileDeletionToBatch(file->file_id(), batch);
+    delete file;
+  }
+  unreferred_files.clear();
+
+  contents->file_metadata.weak_clear();
+  contents->file_metadata.swap(referred_files);
+
   return SYNC_STATUS_OK;
 }
 
@@ -224,6 +398,12 @@
 
 }  // namespace
 
+bool MetadataDatabase::DirtyTrackerComparator::operator()(
+    const FileTracker* left,
+    const FileTracker* right) const {
+  return left->tracker_id() < right->tracker_id();
+}
+
 // static
 void MetadataDatabase::Create(base::SequencedTaskRunner* task_runner,
                               const base::FilePath& database_path,
@@ -237,6 +417,10 @@
 
 MetadataDatabase::~MetadataDatabase() {
   task_runner_->DeleteSoon(FROM_HERE, db_.release());
+  STLDeleteContainerPairSecondPointers(
+      file_by_id_.begin(), file_by_id_.end());
+  STLDeleteContainerPairSecondPointers(
+      tracker_by_id_.begin(), tracker_by_id_.end());
 }
 
 int64 MetadataDatabase::GetLargestChangeID() const {
@@ -340,7 +524,7 @@
   if (status != SYNC_STATUS_OK)
     return status;
 
-  status = RemoveUnreachableFiles(&contents, &batch);
+  status = RemoveUnreachableItems(&contents, &batch);
   if (status != SYNC_STATUS_OK)
     return status;
 
@@ -354,7 +538,38 @@
 }
 
 void MetadataDatabase::BuildIndexes(DatabaseContents* contents) {
-  NOTIMPLEMENTED();
+  service_metadata_ = contents->service_metadata.Pass();
+
+  for (ScopedVector<FileMetadata>::const_iterator itr =
+           contents->file_metadata.begin();
+       itr != contents->file_metadata.end();
+       ++itr) {
+    file_by_id_[(*itr)->file_id()] = *itr;
+  }
+  contents->file_metadata.weak_clear();
+
+  for (ScopedVector<FileTracker>::const_iterator itr =
+           contents->file_trackers.begin();
+       itr != contents->file_trackers.end();
+       ++itr) {
+    FileTracker* tracker = *itr;
+    tracker_by_id_[tracker->tracker_id()] = tracker;
+    trackers_by_file_id_[tracker->file_id()].Insert(tracker);
+
+    if (tracker->is_app_root())
+      app_root_by_app_id_[tracker->app_id()] = tracker;
+
+    if (tracker->parent_tracker_id()) {
+      std::string title = GetTrackerTitle(*tracker);
+      TrackerSet* trackers =
+          &trackers_by_parent_and_title_[tracker->parent_tracker_id()][title];
+      trackers->Insert(tracker);
+    }
+
+    if (tracker->dirty())
+      dirty_trackers_.insert(tracker);
+  }
+  contents->file_trackers.weak_clear();
 }
 
 void MetadataDatabase::WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch,
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database.h b/chrome/browser/sync_file_system/drive_backend/metadata_database.h
index ea326d0..d2cb9cd 100644
--- a/chrome/browser/sync_file_system/drive_backend/metadata_database.h
+++ b/chrome/browser/sync_file_system/drive_backend/metadata_database.h
@@ -6,12 +6,14 @@
 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_H_
 
 #include <map>
+#include <set>
 #include <string>
 
 #include "base/callback_forward.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/scoped_vector.h"
 #include "base/memory/weak_ptr.h"
+#include "chrome/browser/sync_file_system/drive_backend/tracker_set.h"
 #include "chrome/browser/sync_file_system/sync_callbacks.h"
 #include "chrome/browser/sync_file_system/sync_status_code.h"
 
@@ -35,6 +37,8 @@
 namespace sync_file_system {
 namespace drive_backend {
 
+class FileMetadata;
+class FileTracker;
 class ServiceMetadata;
 struct DatabaseContents;
 
@@ -73,6 +77,13 @@
 //
 class MetadataDatabase {
  public:
+  typedef std::map<std::string, FileMetadata*> FileByID;
+  typedef std::map<int64, FileTracker*> TrackerByID;
+  typedef std::map<std::string, TrackerSet> TrackersByFileID;
+  typedef std::map<std::string, TrackerSet> TrackersByTitle;
+  typedef std::map<int64, TrackersByTitle> TrackersByParentAndTitle;
+  typedef std::map<std::string, FileTracker*> TrackerByAppID;
+
   typedef base::Callback<
       void(SyncStatusCode status, scoped_ptr<MetadataDatabase> instance)>
       CreateCallback;
@@ -114,6 +125,13 @@
                           const SyncStatusCallback& callback);
 
  private:
+  struct DirtyTrackerComparator {
+    bool operator()(const FileTracker* left,
+                    const FileTracker* right) const;
+  };
+
+  typedef std::set<FileTracker*, DirtyTrackerComparator> DirtyTrackers;
+
   friend class MetadataDatabaseTest;
 
   explicit MetadataDatabase(base::SequencedTaskRunner* task_runner);
@@ -135,6 +153,30 @@
 
   scoped_ptr<ServiceMetadata> service_metadata_;
 
+  FileByID file_by_id_;  // Owned.
+  TrackerByID tracker_by_id_;  // Owned.
+
+  // Maps FileID to trackers.  The active tracker must be unique per FileID.
+  // This must be updated when updating |active| field of a tracker.
+  TrackersByFileID trackers_by_file_id_;  // Not owned.
+
+  // Maps AppID to the app-root tracker.
+  // This must be updated when a tracker is registered/unregistered as an
+  // app-root.
+  TrackerByAppID app_root_by_app_id_;  // Not owned.
+
+  // Maps |tracker_id| to its children grouped by their |title|.
+  // If the title is unknown for a tracker, treats its title as empty. Empty
+  // titled file must not be active.
+  // The active tracker must be unique per its parent_tracker and its title.
+  // This must be updated when updating |title|, |active| or
+  // |parent_tracker_id|.
+  TrackersByParentAndTitle trackers_by_parent_and_title_;
+
+  // Holds all trackers which marked as dirty.
+  // This must be updated when updating |dirty| field of a tracker.
+  DirtyTrackers dirty_trackers_;  // Not owned.
+
   base::WeakPtrFactory<MetadataDatabase> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(MetadataDatabase);
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc
index 6df81bb..608a180 100644
--- a/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc
+++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc
@@ -156,7 +156,6 @@
   }
 
  private:
-
   base::ScopedTempDir database_dir_;
   base::MessageLoop message_loop_;
 
@@ -169,5 +168,11 @@
   DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseTest);
 };
 
+TEST_F(MetadataDatabaseTest, InitializationTest_Empty) {
+  EXPECT_EQ(SYNC_STATUS_OK, InitializeMetadataDatabase());
+  DropDatabase();
+  EXPECT_EQ(SYNC_STATUS_OK, InitializeMetadataDatabase());
+}
+
 }  // namespace drive_backend
 }  // namespace sync_file_system
diff --git a/chrome/browser/sync_file_system/drive_backend/tracker_set.cc b/chrome/browser/sync_file_system/drive_backend/tracker_set.cc
new file mode 100644
index 0000000..a16c63f
--- /dev/null
+++ b/chrome/browser/sync_file_system/drive_backend/tracker_set.cc
@@ -0,0 +1,51 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/sync_file_system/drive_backend/tracker_set.h"
+
+#include "base/logging.h"
+#include "base/stl_util.h"
+#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
+
+namespace sync_file_system {
+namespace drive_backend {
+
+bool TrackerSet::TrackerComparator::operator()(const FileTracker* left,
+                                               const FileTracker* right) const {
+  return left->tracker_id() < right->tracker_id();
+}
+
+TrackerSet::TrackerSet()
+    : active_tracker_(NULL) {
+}
+
+TrackerSet::~TrackerSet() {}
+
+void TrackerSet::Insert(FileTracker* tracker) {
+  if (tracker_set_.insert(tracker).second && tracker->active()) {
+    DCHECK(!active_tracker_);
+    active_tracker_ = tracker;
+  }
+}
+
+void TrackerSet::Erase(FileTracker* tracker) {
+  if (tracker_set_.erase(tracker) == 1 && active_tracker_ == tracker)
+    active_tracker_ = NULL;
+}
+
+void TrackerSet::Activate(FileTracker* tracker) {
+  DCHECK(!active_tracker_);
+  DCHECK(ContainsKey(tracker_set_, tracker));
+  active_tracker_ = tracker;
+}
+
+void TrackerSet::Inactivate(FileTracker* tracker) {
+  DCHECK(tracker->active());
+  DCHECK_EQ(tracker, active_tracker_);
+  DCHECK(ContainsKey(tracker_set_, tracker));
+  active_tracker_ = NULL;
+}
+
+}  // namespace drive_backend
+}  // namespace sync_file_system
diff --git a/chrome/browser/sync_file_system/drive_backend/tracker_set.h b/chrome/browser/sync_file_system/drive_backend/tracker_set.h
new file mode 100644
index 0000000..68353a9
--- /dev/null
+++ b/chrome/browser/sync_file_system/drive_backend/tracker_set.h
@@ -0,0 +1,51 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_TRACKER_SET_H_
+#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_TRACKER_SET_H_
+
+#include <set>
+
+namespace sync_file_system {
+namespace drive_backend {
+
+class FileTracker;
+
+class TrackerSet {
+ public:
+  struct TrackerComparator {
+    bool operator()(const FileTracker* left,
+                    const FileTracker* right) const;
+  };
+
+  typedef std::set<FileTracker*, TrackerComparator> RawTrackerSet;
+  typedef RawTrackerSet::iterator iterator;
+  typedef RawTrackerSet::const_iterator const_iterator;
+
+  TrackerSet();
+  ~TrackerSet();
+
+  bool has_active() const { return !!active_tracker_; }
+  void Insert(FileTracker* tracker);
+  void Erase(FileTracker* tracker);
+  void Activate(FileTracker* tracker);
+  void Inactivate(FileTracker* tracker);
+
+  const FileTracker* active_tracker() const { return active_tracker_; }
+  const RawTrackerSet& tracker_set() const { return tracker_set_; }
+
+  iterator begin() { return tracker_set_.begin(); }
+  iterator end() { return tracker_set_.end(); }
+  const_iterator begin() const { return tracker_set_.begin(); }
+  const_iterator end() const { return tracker_set_.end(); }
+
+ private:
+  FileTracker* active_tracker_;
+  RawTrackerSet tracker_set_;
+};
+
+}  // namespace drive_backend
+}  // namespace sync_file_system
+
+#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_TRACKER_SET_H_
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc
index ce5843d..5038dff 100644
--- a/chrome/browser/themes/theme_service.cc
+++ b/chrome/browser/themes/theme_service.cc
@@ -6,7 +6,6 @@
 
 #include "base/bind.h"
 #include "base/memory/ref_counted_memory.h"
-#include "base/message_loop/message_loop.h"
 #include "base/prefs/pref_service.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_util.h"
@@ -54,12 +53,6 @@
 // unpacked on the filesystem.)
 const char* kDefaultThemeGalleryID = "hkacjpbfdknhflllbcmjibkdeoafencn";
 
-// Wait this many seconds after startup to garbage collect unused themes.
-// Removing unused themes is done after a delay because there is no
-// reason to do it at startup.
-// ExtensionService::GarbageCollectExtensions() does something similar.
-const int kRemoveUnusedThemesStartupDelay = 30;
-
 SkColor TintForUnderline(SkColor input) {
   return SkColorSetA(input, SkColorGetA(input) / 3);
 }
@@ -81,12 +74,10 @@
 }  // namespace
 
 ThemeService::ThemeService()
-    : rb_(ResourceBundle::GetSharedInstance()),
+    : ready_(false),
+      rb_(ResourceBundle::GetSharedInstance()),
       profile_(NULL),
-      ready_(false),
-      installed_pending_load_id_(kDefaultThemeID),
-      number_of_infobars_(0),
-      weak_ptr_factory_(this) {
+      number_of_infobars_(0) {
 }
 
 ThemeService::~ThemeService() {
@@ -99,9 +90,11 @@
 
   LoadThemePrefs();
 
-  registrar_.Add(this,
-                 chrome::NOTIFICATION_EXTENSIONS_READY,
-                 content::Source<Profile>(profile_));
+  if (!ready_) {
+    registrar_.Add(this,
+                   chrome::NOTIFICATION_EXTENSIONS_READY,
+                   content::Source<Profile>(profile_));
+  }
 
   theme_syncable_service_.reset(new ThemeSyncableService(profile_, this));
 }
@@ -207,83 +200,36 @@
 void ThemeService::Observe(int type,
                            const content::NotificationSource& source,
                            const content::NotificationDetails& details) {
-  using content::Details;
-  switch (type) {
-    case chrome::NOTIFICATION_EXTENSIONS_READY:
-      registrar_.Remove(this, chrome::NOTIFICATION_EXTENSIONS_READY,
-          content::Source<Profile>(profile_));
-      OnExtensionServiceReady();
-      break;
-    case chrome::NOTIFICATION_EXTENSION_INSTALLED:
-    {
-      // The theme may be initially disabled. Wait till it is loaded (if ever).
-      Details<const extensions::InstalledExtensionInfo> installed_details(
-          details);
-      if (installed_details->extension->is_theme())
-        installed_pending_load_id_ = installed_details->extension->id();
-      break;
-    }
-    case chrome::NOTIFICATION_EXTENSION_LOADED:
-    {
-      const Extension* extension = Details<const Extension>(details).ptr();
-      if (extension->is_theme() &&
-          installed_pending_load_id_ != kDefaultThemeID &&
-          installed_pending_load_id_ == extension->id()) {
-        SetTheme(extension);
-      }
-      installed_pending_load_id_ = kDefaultThemeID;
-      break;
-    }
-    case chrome::NOTIFICATION_EXTENSION_ENABLED:
-    {
-      const Extension* extension = Details<const Extension>(details).ptr();
-      if (extension->is_theme())
-        SetTheme(extension);
-      break;
-    }
-    case chrome::NOTIFICATION_EXTENSION_UNLOADED:
-    {
-      Details<const extensions::UnloadedExtensionInfo> unloaded_details(
-          details);
-      if (unloaded_details->reason != extension_misc::UNLOAD_REASON_UPDATE &&
-          unloaded_details->extension->is_theme() &&
-          unloaded_details->extension->id() == GetThemeID()) {
-        UseDefaultTheme();
-      }
-      break;
-    }
-  }
+  DCHECK(type == chrome::NOTIFICATION_EXTENSIONS_READY);
+  registrar_.Remove(this, chrome::NOTIFICATION_EXTENSIONS_READY,
+      content::Source<Profile>(profile_));
+
+  MigrateTheme();
+  set_ready();
+
+  // Send notification in case anyone requested data and cached it when the
+  // theme service was not ready yet.
+  NotifyThemeChanged();
 }
 
 void ThemeService::SetTheme(const Extension* extension) {
-  DCHECK(extension->is_theme());
-  ExtensionService* service =
-      extensions::ExtensionSystem::Get(profile_)->extension_service();
-  if (!service->IsExtensionEnabled(extension->id())) {
-    // |extension| is disabled when reverting to the previous theme via an
-    // infobar.
-    service->EnableExtension(extension->id());
-    // Enabling the extension will call back to SetTheme().
-    return;
-  }
-
-  std::string previous_theme_id = GetThemeID();
-
   // Clear our image cache.
   FreePlatformCaches();
 
+  DCHECK(extension);
+  DCHECK(extension->is_theme());
+  if (DCHECK_IS_ON()) {
+    ExtensionService* service =
+        extensions::ExtensionSystem::Get(profile_)->extension_service();
+    DCHECK(service);
+    DCHECK(service->GetExtensionById(extension->id(), false));
+  }
+
   BuildFromExtension(extension);
   SaveThemeID(extension->id());
 
   NotifyThemeChanged();
   content::RecordAction(UserMetricsAction("Themes_Installed"));
-
-  if (previous_theme_id != kDefaultThemeID &&
-      previous_theme_id != extension->id()) {
-    // Disable the old theme.
-    service->DisableExtension(previous_theme_id,
-                              extensions::Extension::DISABLE_USER_ACTION);
-  }
 }
 
 void ThemeService::SetCustomDefaultTheme(
@@ -297,41 +243,25 @@
   return false;
 }
 
-void ThemeService::RemoveUnusedThemes(bool ignore_infobars) {
+void ThemeService::RemoveUnusedThemes() {
   // We do not want to garbage collect themes on startup (|ready_| is false).
-  // Themes will get garbage collected after |kRemoveUnusedThemesStartupDelay|.
+  // Themes will get garbage collected once
+  // ExtensionService::GarbageCollectExtensions() runs.
   if (!profile_ || !ready_)
     return;
-  if (!ignore_infobars && number_of_infobars_ != 0)
-    return;
 
   ExtensionService* service = profile_->GetExtensionService();
   if (!service)
     return;
   std::string current_theme = GetThemeID();
   std::vector<std::string> remove_list;
-  scoped_ptr<const ExtensionSet> extensions(
-      service->GenerateInstalledExtensionsSet());
-  extensions::ExtensionPrefs* prefs = service->extension_prefs();
+  const ExtensionSet* extensions = service->extensions();
   for (ExtensionSet::const_iterator it = extensions->begin();
        it != extensions->end(); ++it) {
-    const extensions::Extension* extension = *it;
-    if (extension->is_theme() &&
-        extension->id() != current_theme) {
-      // Only uninstall themes which are not disabled or are disabled with
-      // reason DISABLE_USER_ACTION. We cannot blanket uninstall all disabled
-      // themes because externally installed themes are initially disabled.
-      int disable_reason = prefs->GetDisableReasons(extension->id());
-      if (!prefs->IsExtensionDisabled(extension->id()) ||
-          disable_reason == Extension::DISABLE_USER_ACTION) {
-        remove_list.push_back((*it)->id());
-      }
+    if ((*it)->is_theme() && (*it)->id() != current_theme) {
+      remove_list.push_back((*it)->id());
     }
   }
-  // TODO: Garbage collect all unused themes. This method misses themes which
-  // are installed but not loaded because they are blacklisted by a management
-  // policy provider.
-
   for (size_t i = 0; i < remove_list.size(); ++i)
     service->UninstallExtension(remove_list[i], false, NULL);
 }
@@ -343,10 +273,8 @@
     SetManagedUserTheme();
     return;
   }
-  if (ready_) {
-    ClearAllThemeData();
-    NotifyThemeChanged();
-  }
+  ClearAllThemeData();
+  NotifyThemeChanged();
 }
 
 void ThemeService::SetNativeTheme() {
@@ -378,6 +306,9 @@
 }
 
 void ThemeService::ClearAllThemeData() {
+  if (!ready_)
+    return;
+
   SwapThemeSupplier(NULL);
 
   // Clear our image cache.
@@ -386,14 +317,7 @@
   profile_->GetPrefs()->ClearPref(prefs::kCurrentThemePackFilename);
   SaveThemeID(kDefaultThemeID);
 
-  // There should be no more infobars. This may not be the case because of
-  // http://crbug.com/62154
-  // RemoveUnusedThemes is called on a task because ClearAllThemeData() may
-  // be called as a result of NOTIFICATION_EXTENSION_UNLOADED.
-  base::MessageLoop::current()->PostTask(FROM_HERE,
-      base::Bind(&ThemeService::RemoveUnusedThemes,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 true));
+  RemoveUnusedThemes();
 }
 
 void ThemeService::LoadThemePrefs() {
@@ -424,9 +348,16 @@
   if (loaded_pack) {
     content::RecordAction(UserMetricsAction("Themes.Loaded"));
     set_ready();
+  } else {
+    // TODO(erg): We need to pop up a dialog informing the user that their
+    // theme is being migrated.
+    ExtensionService* service =
+        extensions::ExtensionSystem::Get(profile_)->extension_service();
+    if (service && service->is_ready()) {
+      MigrateTheme();
+      set_ready();
+    }
   }
-  // Else: wait for the extension service to be ready so that the theme pack
-  // can be recreated from the extension.
 }
 
 void ThemeService::NotifyThemeChanged() {
@@ -456,41 +387,16 @@
 }
 #endif
 
-void ThemeService::OnExtensionServiceReady() {
-  if (!ready_) {
-    // If the ThemeService is not ready yet, the custom theme data pack needs to
-    // be recreated from the extension.
-    MigrateTheme();
-    set_ready();
-
-    // Send notification in case anyone requested data and cached it when the
-    // theme service was not ready yet.
-    NotifyThemeChanged();
-  }
-
-  registrar_.Add(this,
-                 chrome::NOTIFICATION_EXTENSION_INSTALLED,
-                 content::Source<Profile>(profile_));
-  registrar_.Add(this,
-                 chrome::NOTIFICATION_EXTENSION_LOADED,
-                 content::Source<Profile>(profile_));
-  registrar_.Add(this,
-                 chrome::NOTIFICATION_EXTENSION_ENABLED,
-                 content::Source<Profile>(profile_));
-  registrar_.Add(this,
-                 chrome::NOTIFICATION_EXTENSION_UNLOADED,
-                 content::Source<Profile>(profile_));
-
-  base::MessageLoop::current()->PostDelayedTask(FROM_HERE,
-      base::Bind(&ThemeService::RemoveUnusedThemes,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 false),
-      base::TimeDelta::FromSeconds(kRemoveUnusedThemesStartupDelay));
+void ThemeService::SwapThemeSupplier(
+    scoped_refptr<CustomThemeSupplier> theme_supplier) {
+  if (theme_supplier_.get())
+    theme_supplier_->StopUsingTheme();
+  theme_supplier_ = theme_supplier;
+  if (theme_supplier_.get())
+    theme_supplier_->StartUsingTheme();
 }
 
 void ThemeService::MigrateTheme() {
-  // TODO(erg): We need to pop up a dialog informing the user that their
-  // theme is being migrated.
   ExtensionService* service =
       extensions::ExtensionSystem::Get(profile_)->extension_service();
   const Extension* extension = service ?
@@ -506,15 +412,6 @@
   }
 }
 
-void ThemeService::SwapThemeSupplier(
-    scoped_refptr<CustomThemeSupplier> theme_supplier) {
-  if (theme_supplier_.get())
-    theme_supplier_->StopUsingTheme();
-  theme_supplier_ = theme_supplier;
-  if (theme_supplier_.get())
-    theme_supplier_->StartUsingTheme();
-}
-
 void ThemeService::SavePackName(const base::FilePath& pack_path) {
   profile_->GetPrefs()->SetFilePath(
       prefs::kCurrentThemePackFilename, pack_path);
@@ -566,7 +463,7 @@
   number_of_infobars_--;
 
   if (number_of_infobars_ == 0)
-    RemoveUnusedThemes(false);
+    RemoveUnusedThemes();
 }
 
 ThemeSyncableService* ThemeService::GetThemeSyncableService() const {
diff --git a/chrome/browser/themes/theme_service.h b/chrome/browser/themes/theme_service.h
index 37e951f..b573d2e 100644
--- a/chrome/browser/themes/theme_service.h
+++ b/chrome/browser/themes/theme_service.h
@@ -13,7 +13,6 @@
 #include "base/compiler_specific.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
-#include "base/memory/weak_ptr.h"
 #include "base/threading/non_thread_safe.h"
 #include "components/browser_context_keyed_service/browser_context_keyed_service.h"
 #include "content/public/browser/notification_observer.h"
@@ -85,11 +84,10 @@
       int id,
       ui::ScaleFactor scale_factor) const OVERRIDE;
 #if defined(OS_MACOSX)
-  virtual NSImage* GetNSImageNamed(int id, bool allow_default) const OVERRIDE;
-  virtual NSColor* GetNSImageColorNamed(int id,
-                                        bool allow_default) const OVERRIDE;
-  virtual NSColor* GetNSColor(int id, bool allow_default) const OVERRIDE;
-  virtual NSColor* GetNSColorTint(int id, bool allow_default) const OVERRIDE;
+  virtual NSImage* GetNSImageNamed(int id) const OVERRIDE;
+  virtual NSColor* GetNSImageColorNamed(int id) const OVERRIDE;
+  virtual NSColor* GetNSColor(int id) const OVERRIDE;
+  virtual NSColor* GetNSColorTint(int id) const OVERRIDE;
   virtual NSGradient* GetNSGradient(int id) const OVERRIDE;
 #elif defined(OS_POSIX) && !defined(TOOLKIT_VIEWS) && !defined(OS_ANDROID)
   // This mismatch between what this class defines and whether or not it
@@ -136,10 +134,8 @@
   // destroyed, uninstalls all themes that aren't the currently selected.
   void OnInfobarDestroyed();
 
-  // Uninstall theme extensions which are no longer in use. |ignore_infobars| is
-  // whether unused themes should be removed despite a theme infobar being
-  // visible.
-  void RemoveUnusedThemes(bool ignore_infobars);
+  // Remove preference values for themes that are no longer in use.
+  void RemoveUnusedThemes();
 
   // Returns the syncable service for syncing theme. The returned service is
   // owned by |this| object.
@@ -174,7 +170,7 @@
 #endif  // OS_MACOSX
 
   // Clears the platform-specific caches. Do not call directly; it's called
-  // from ClearCaches().
+  // from ClearAllThemeData().
   virtual void FreePlatformCaches();
 
   Profile* profile() const { return profile_; }
@@ -185,20 +181,22 @@
     return theme_supplier_.get();
   }
 
+  // True if the theme service is ready to be used.
+  // TODO(pkotwicz): Add DCHECKS to the theme service's getters once
+  // ThemeSource no longer uses the ThemeService when it is not ready.
+  bool ready_;
+
  private:
   friend class theme_service_internal::ThemeServiceTest;
 
-  // Called when the extension service is ready.
-  void OnExtensionServiceReady();
-
-  // Migrate the theme to the new theme pack schema by recreating the data pack
-  // from the extension.
-  void MigrateTheme();
-
   // Replaces the current theme supplier with a new one and calls
   // StopUsingTheme() or StartUsingTheme() as appropriate.
   void SwapThemeSupplier(scoped_refptr<CustomThemeSupplier> theme_supplier);
 
+  // Migrate the theme to the new theme pack schema by recreating the data pack
+  // from the extension.
+  void MigrateTheme();
+
   // Saves the filename of the cached theme pack.
   void SavePackName(const base::FilePath& pack_path);
 
@@ -225,11 +223,12 @@
   typedef std::map<int, GdkPixbuf*> GdkPixbufMap;
   mutable GdkPixbufMap gdk_pixbufs_;
 #elif defined(OS_MACOSX)
+  // |nsimage_cache_| retains the images it has cached.
   typedef std::map<int, NSImage*> NSImageMap;
   mutable NSImageMap nsimage_cache_;
 
-  // The bool member of the pair is whether the color is a default color.
-  typedef std::map<int, std::pair<NSColor*, bool> > NSColorMap;
+  // |nscolor_cache_| retains the colors it has cached.
+  typedef std::map<int, NSColor*> NSColorMap;
   mutable NSColorMap nscolor_cache_;
 
   typedef std::map<int, NSGradient*> NSGradientMap;
@@ -239,20 +238,8 @@
   ui::ResourceBundle& rb_;
   Profile* profile_;
 
-  // True if the theme service is ready to be used.
-  // TODO(pkotwicz): Add DCHECKS to the theme service's getters once
-  // ThemeSource no longer uses the ThemeService when it is not ready.
-  bool ready_;
-
   scoped_refptr<CustomThemeSupplier> theme_supplier_;
 
-  // The id of the theme extension which has just been installed but has not
-  // been loaded yet. The theme extension with |installed_pending_load_id_| may
-  // never be loaded if the install is due to updating a disabled theme.
-  // |pending_install_id_| should be set to |kDefaultThemeID| if there are no
-  // recently installed theme extensions
-  std::string installed_pending_load_id_;
-
   // The number of infobars currently displayed.
   int number_of_infobars_;
 
@@ -260,8 +247,6 @@
 
   scoped_ptr<ThemeSyncableService> theme_syncable_service_;
 
-  base::WeakPtrFactory<ThemeService> weak_ptr_factory_;
-
   DISALLOW_COPY_AND_ASSIGN(ThemeService);
 };
 
diff --git a/chrome/browser/themes/theme_service_mac.mm b/chrome/browser/themes/theme_service_mac.mm
index c39944c..3644f1f 100644
--- a/chrome/browser/themes/theme_service_mac.mm
+++ b/chrome/browser/themes/theme_service_mac.mm
@@ -35,12 +35,9 @@
 
 }  // namespace
 
-NSImage* ThemeService::GetNSImageNamed(int id, bool allow_default) const {
+NSImage* ThemeService::GetNSImageNamed(int id) const {
   DCHECK(CalledOnValidThread());
 
-  if (!allow_default && !HasCustomImage(id))
-    return nil;
-
   // Check to see if we already have the image in the cache.
   NSImageMap::const_iterator nsimage_iter = nsimage_cache_.find(id);
   if (nsimage_iter != nsimage_cache_.end())
@@ -88,86 +85,53 @@
   return empty_image;
 }
 
-NSColor* ThemeService::GetNSImageColorNamed(int id, bool allow_default) const {
+NSColor* ThemeService::GetNSImageColorNamed(int id) const {
   DCHECK(CalledOnValidThread());
 
   // Check to see if we already have the color in the cache.
   NSColorMap::const_iterator nscolor_iter = nscolor_cache_.find(id);
-  if (nscolor_iter != nscolor_cache_.end()) {
-    bool cached_is_default = nscolor_iter->second.second;
-    if (!cached_is_default || allow_default)
-      return nscolor_iter->second.first;
-  }
+  if (nscolor_iter != nscolor_cache_.end())
+    return nscolor_iter->second;
 
-  NSImage* image = GetNSImageNamed(id, allow_default);
+  NSImage* image = GetNSImageNamed(id);
   if (!image)
     return nil;
   NSColor* image_color = [NSColor colorWithPatternImage:image];
 
   // We loaded successfully.  Cache the color.
-  if (image_color) {
-    nscolor_cache_[id] = std::make_pair([image_color retain],
-                                        !HasCustomImage(id));
-  }
+  if (image_color)
+    nscolor_cache_[id] = [image_color retain];
 
   return image_color;
 }
 
-NSColor* ThemeService::GetNSColor(int id, bool allow_default) const {
+NSColor* ThemeService::GetNSColor(int id) const {
   DCHECK(CalledOnValidThread());
 
   // Check to see if we already have the color in the cache.
   NSColorMap::const_iterator nscolor_iter = nscolor_cache_.find(id);
-  if (nscolor_iter != nscolor_cache_.end()) {
-    bool cached_is_default = nscolor_iter->second.second;
-    if (!cached_is_default || allow_default)
-      return nscolor_iter->second.first;
-  }
+  if (nscolor_iter != nscolor_cache_.end())
+    return nscolor_iter->second;
 
-  bool is_default = false;
-  SkColor sk_color;
-  if (theme_supplier_.get() && theme_supplier_->GetColor(id, &sk_color)) {
-    is_default = false;
-  } else {
-    is_default = true;
-    sk_color = ThemeProperties::GetDefaultColor(id);
-  }
-
-  if (is_default && !allow_default)
-    return nil;
-
+  SkColor sk_color = GetColor(id);
   NSColor* color = gfx::SkColorToCalibratedNSColor(sk_color);
 
   // We loaded successfully.  Cache the color.
   if (color)
-    nscolor_cache_[id] = std::make_pair([color retain], is_default);
+    nscolor_cache_[id] = [color retain];
 
   return color;
 }
 
-NSColor* ThemeService::GetNSColorTint(int id, bool allow_default) const {
+NSColor* ThemeService::GetNSColorTint(int id) const {
   DCHECK(CalledOnValidThread());
 
   // Check to see if we already have the color in the cache.
   NSColorMap::const_iterator nscolor_iter = nscolor_cache_.find(id);
-  if (nscolor_iter != nscolor_cache_.end()) {
-    bool cached_is_default = nscolor_iter->second.second;
-    if (!cached_is_default || allow_default)
-      return nscolor_iter->second.first;
-  }
+  if (nscolor_iter != nscolor_cache_.end())
+    return nscolor_iter->second;
 
-  bool is_default = false;
-  color_utils::HSL tint;
-  if (theme_supplier_.get() && theme_supplier_->GetTint(id, &tint)) {
-    is_default = false;
-  } else {
-    is_default = true;
-    tint = ThemeProperties::GetDefaultTint(id);
-  }
-
-  if (is_default && !allow_default)
-    return nil;
-
+  color_utils::HSL tint = GetTint(id);
   NSColor* tint_color = nil;
   if (tint.h == -1 && tint.s == -1 && tint.l == -1) {
     tint_color = [NSColor blackColor];
@@ -183,7 +147,7 @@
 
   // We loaded successfully.  Cache the color.
   if (tint_color)
-    nscolor_cache_[id] = std::make_pair([tint_color retain], is_default);
+    nscolor_cache_[id] = [tint_color retain];
 
   return tint_color;
 }
@@ -312,7 +276,7 @@
   // Free colors.
   for (NSColorMap::iterator i = nscolor_cache_.begin();
        i != nscolor_cache_.end(); i++) {
-    [i->second.first release];
+    [i->second release];
   }
   nscolor_cache_.clear();
 
diff --git a/chrome/browser/themes/theme_service_unittest.cc b/chrome/browser/themes/theme_service_unittest.cc
index 499b2ee..4168f96 100644
--- a/chrome/browser/themes/theme_service_unittest.cc
+++ b/chrome/browser/themes/theme_service_unittest.cc
@@ -4,19 +4,14 @@
 
 #include "chrome/browser/themes/theme_service.h"
 
-#include "base/file_util.h"
-#include "base/path_service.h"
-#include "chrome/browser/chrome_notification_types.h"
+#include "base/json/json_reader.h"
 #include "chrome/browser/extensions/extension_service_unittest.h"
-#include "chrome/browser/extensions/unpacked_installer.h"
 #include "chrome/browser/themes/custom_theme_supplier.h"
 #include "chrome/browser/themes/theme_service_factory.h"
-#include "chrome/common/chrome_paths.h"
 #include "chrome/common/extensions/extension.h"
 #include "chrome/common/extensions/extension_manifest_constants.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
-#include "content/public/test/test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace theme_service_internal {
@@ -26,57 +21,25 @@
   ThemeServiceTest() {}
   virtual ~ThemeServiceTest() {}
 
-  // Moves a minimal theme to |temp_dir_path| and unpacks it from that
-  // directory.
-  std::string LoadUnpackedThemeAt(const base::FilePath& temp_dir) {
-    base::FilePath dst_manifest_path = temp_dir.AppendASCII("manifest.json");
-    base::FilePath test_data_dir;
-    EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir));
-    base::FilePath src_manifest_path =
-        test_data_dir.AppendASCII("extensions/theme_minimal/manifest.json");
-    EXPECT_TRUE(base::CopyFile(src_manifest_path, dst_manifest_path));
-
-    scoped_refptr<extensions::UnpackedInstaller> installer(
-        extensions::UnpackedInstaller::Create(service_));
-    content::WindowedNotificationObserver observer(
-        chrome::NOTIFICATION_EXTENSION_LOADED,
-        content::Source<Profile>(profile_.get()));
-    installer->Load(temp_dir);
-    observer.Wait();
-
-    std::string extension_id =
-        content::Details<extensions::Extension>(observer.details())->id();
-
-    // Let the ThemeService finish creating the theme pack.
-    base::MessageLoop::current()->RunUntilIdle();
-
-    return extension_id;
-  }
-
-  // Update the theme with |extension_id|.
-  void UpdateUnpackedTheme(const std::string& extension_id) {
-    int updated_notification = service_->IsExtensionEnabled(extension_id) ?
-        chrome::NOTIFICATION_EXTENSION_LOADED :
-        chrome::NOTIFICATION_EXTENSION_UPDATE_DISABLED;
-
-    const base::FilePath& path =
-        service_->GetInstalledExtension(extension_id)->path();
-
-    scoped_refptr<extensions::UnpackedInstaller> installer(
-        extensions::UnpackedInstaller::Create(service_));
-    content::WindowedNotificationObserver observer(updated_notification,
-        content::Source<Profile>(profile_.get()));
-    installer->Load(path);
-    observer.Wait();
-
-    // Let the ThemeService finish creating the theme pack.
-    base::MessageLoop::current()->RunUntilIdle();
+  scoped_refptr<extensions::Extension> MakeThemeExtension(base::FilePath path) {
+    DictionaryValue source;
+    source.SetString(extension_manifest_keys::kName, "theme");
+    source.Set(extension_manifest_keys::kTheme, new DictionaryValue());
+    source.SetString(extension_manifest_keys::kUpdateURL, "http://foo.com");
+    source.SetString(extension_manifest_keys::kVersion, "0.0.0.0");
+    std::string error;
+    scoped_refptr<extensions::Extension> extension =
+        extensions::Extension::Create(
+            path, extensions::Manifest::EXTERNAL_PREF_DOWNLOAD,
+            source, extensions::Extension::NO_FLAGS, &error);
+    EXPECT_TRUE(extension.get());
+    EXPECT_EQ("", error);
+    return extension;
   }
 
   virtual void SetUp() {
     ExtensionServiceTestBase::SetUp();
     InitializeEmptyExtensionService();
-    service_->Init();
   }
 
   const CustomThemeSupplier* get_theme_supplier(ThemeService* theme_service) {
@@ -87,128 +50,45 @@
 // Installs then uninstalls a theme and makes sure that the ThemeService
 // reverts to the default theme after the uninstall.
 TEST_F(ThemeServiceTest, ThemeInstallUninstall) {
-  ThemeService* theme_service =
-      ThemeServiceFactory::GetForProfile(profile_.get());
-  theme_service->UseDefaultTheme();
-  // Let the ThemeService uninstall unused themes.
-  base::MessageLoop::current()->RunUntilIdle();
-
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  const std::string& extension_id = LoadUnpackedThemeAt(temp_dir.path());
-  EXPECT_FALSE(theme_service->UsingDefaultTheme());
-  EXPECT_EQ(extension_id, theme_service->GetThemeID());
-
-  // Now uninstall the extension, should revert to the default theme.
-  service_->UninstallExtension(extension_id, false, NULL);
-  EXPECT_TRUE(theme_service->UsingDefaultTheme());
-}
-
-// Test that a theme extension is disabled when not in use. A theme may be
-// installed but not in use if it there is an infobar to revert to the previous
-// theme.
-TEST_F(ThemeServiceTest, DisableUnusedTheme) {
   ThemeService* theme_service =
       ThemeServiceFactory::GetForProfile(profile_.get());
   theme_service->UseDefaultTheme();
-  // Let the ThemeService uninstall unused themes.
+  scoped_refptr<extensions::Extension> extension =
+      MakeThemeExtension(temp_dir.path());
+  service_->FinishInstallationForTest(extension.get());
+  // Let ThemeService finish creating the theme pack.
   base::MessageLoop::current()->RunUntilIdle();
-
-  base::ScopedTempDir temp_dir1;
-  ASSERT_TRUE(temp_dir1.CreateUniqueTempDir());
-  base::ScopedTempDir temp_dir2;
-  ASSERT_TRUE(temp_dir2.CreateUniqueTempDir());
-
-  // 1) Installing a theme should disable the previously active theme.
-  const std::string& extension1_id = LoadUnpackedThemeAt(temp_dir1.path());
   EXPECT_FALSE(theme_service->UsingDefaultTheme());
-  EXPECT_EQ(extension1_id, theme_service->GetThemeID());
-  EXPECT_TRUE(service_->IsExtensionEnabled(extension1_id));
+  EXPECT_EQ(extension->id(), theme_service->GetThemeID());
 
-  // Show an infobar to prevent the current theme from being uninstalled.
-  theme_service->OnInfobarDisplayed();
-
-  const std::string& extension2_id = LoadUnpackedThemeAt(temp_dir2.path());
-  EXPECT_EQ(extension2_id, theme_service->GetThemeID());
-  EXPECT_TRUE(service_->IsExtensionEnabled(extension2_id));
-  EXPECT_TRUE(service_->GetExtensionById(extension1_id,
-      ExtensionService::INCLUDE_DISABLED));
-
-  // 2) Enabling a disabled theme extension should swap the current theme.
-  service_->EnableExtension(extension1_id);
-  base::MessageLoop::current()->RunUntilIdle();
-  EXPECT_EQ(extension1_id, theme_service->GetThemeID());
-  EXPECT_TRUE(service_->IsExtensionEnabled(extension1_id));
-  EXPECT_TRUE(service_->GetExtensionById(extension2_id,
-      ExtensionService::INCLUDE_DISABLED));
-
-  // 3) Using SetTheme() with a disabled theme should enable and set the
-  // theme. This is the case when the user reverts to the previous theme
-  // via an infobar.
-  const extensions::Extension* extension2 =
-      service_->GetInstalledExtension(extension2_id);
-  theme_service->SetTheme(extension2);
-  base::MessageLoop::current()->RunUntilIdle();
-  EXPECT_EQ(extension2_id, theme_service->GetThemeID());
-  EXPECT_TRUE(service_->IsExtensionEnabled(extension2_id));
-  EXPECT_TRUE(service_->GetExtensionById(extension1_id,
-      ExtensionService::INCLUDE_DISABLED));
-
-  // 4) Disabling the current theme extension should revert to the default theme
-  // and uninstall any installed theme extensions.
-  theme_service->OnInfobarDestroyed();
-  EXPECT_FALSE(theme_service->UsingDefaultTheme());
-  service_->DisableExtension(extension2_id,
-      extensions::Extension::DISABLE_USER_ACTION);
-  base::MessageLoop::current()->RunUntilIdle();
+  // Now unload the extension, should revert to the default theme.
+  service_->UnloadExtension(extension->id(),
+                            extension_misc::UNLOAD_REASON_UNINSTALL);
   EXPECT_TRUE(theme_service->UsingDefaultTheme());
-  EXPECT_FALSE(service_->GetInstalledExtension(extension1_id));
-  EXPECT_FALSE(service_->GetInstalledExtension(extension2_id));
 }
 
-// Test the ThemeService's behavior when a theme is upgraded.
+// Upgrades a theme and ensures that the ThemeService does not revert to the
+// default theme.
 TEST_F(ThemeServiceTest, ThemeUpgrade) {
-  // Setup.
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   ThemeService* theme_service =
       ThemeServiceFactory::GetForProfile(profile_.get());
   theme_service->UseDefaultTheme();
-  // Let the ThemeService uninstall unused themes.
+  scoped_refptr<extensions::Extension> extension =
+      MakeThemeExtension(temp_dir.path());
+  service_->FinishInstallationForTest(extension.get());
+  // Let ThemeService finish creating the theme pack.
   base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_FALSE(theme_service->UsingDefaultTheme());
+  EXPECT_EQ(extension->id(), theme_service->GetThemeID());
 
-  theme_service->OnInfobarDisplayed();
-
-  base::ScopedTempDir temp_dir1;
-  ASSERT_TRUE(temp_dir1.CreateUniqueTempDir());
-  base::ScopedTempDir temp_dir2;
-  ASSERT_TRUE(temp_dir2.CreateUniqueTempDir());
-
-  const std::string& extension1_id = LoadUnpackedThemeAt(temp_dir1.path());
-  const std::string& extension2_id = LoadUnpackedThemeAt(temp_dir2.path());
-
-  // Test the initial state.
-  EXPECT_TRUE(service_->GetExtensionById(extension1_id,
-      ExtensionService::INCLUDE_DISABLED));
-  EXPECT_EQ(extension2_id, theme_service->GetThemeID());
-
-  // 1) Upgrading the current theme should not revert to the default theme.
-  content::WindowedNotificationObserver theme_change_observer(
-      chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
-      content::Source<ThemeService>(theme_service));
-  UpdateUnpackedTheme(extension2_id);
-
-  // The ThemeService should have sent an theme change notification even though
-  // the id of the current theme did not change.
-  theme_change_observer.Wait();
-
-  EXPECT_EQ(extension2_id, theme_service->GetThemeID());
-  EXPECT_TRUE(service_->GetExtensionById(extension1_id,
-      ExtensionService::INCLUDE_DISABLED));
-
-  // 2) Upgrading a disabled theme should not change the current theme.
-  UpdateUnpackedTheme(extension1_id);
-  EXPECT_EQ(extension2_id, theme_service->GetThemeID());
-  EXPECT_TRUE(service_->GetExtensionById(extension1_id,
-      ExtensionService::INCLUDE_DISABLED));
+  // Now unload the extension, should revert to the default theme.
+  service_->UnloadExtension(extension->id(),
+                            extension_misc::UNLOAD_REASON_UPDATE);
+  EXPECT_FALSE(theme_service->UsingDefaultTheme());
 }
 
 // Checks that managed users have their own default theme.
diff --git a/chrome/browser/themes/theme_syncable_service.cc b/chrome/browser/themes/theme_syncable_service.cc
index 55d3f74..3389443 100644
--- a/chrome/browser/themes/theme_syncable_service.cc
+++ b/chrome/browser/themes/theme_syncable_service.cc
@@ -208,7 +208,7 @@
     string id(theme_specifics.custom_theme_id());
     GURL update_url(theme_specifics.custom_theme_update_url());
     DVLOG(1) << "Applying theme " << id << " with update_url " << update_url;
-    ExtensionService* extensions_service =
+    ExtensionServiceInterface* extensions_service =
         extensions::ExtensionSystem::Get(profile_)->extension_service();
     CHECK(extensions_service);
     const extensions::Extension* extension =
@@ -218,12 +218,8 @@
         DVLOG(1) << "Extension " << id << " is not a theme; aborting";
         return;
       }
-      int disabled_reasons =
-          extensions_service->extension_prefs()->GetDisableReasons(id);
-      if (!extensions_service->IsExtensionEnabled(id) &&
-          disabled_reasons != extensions::Extension::DISABLE_USER_ACTION) {
-        DVLOG(1) << "Theme " << id << " is disabled with reason "
-                 << disabled_reasons << "; aborting";
+      if (!extensions_service->IsExtensionEnabled(id)) {
+        DVLOG(1) << "Theme " << id << " is not enabled; aborting";
         return;
       }
       // An enabled theme extension with the given id was found, so
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.cc b/chrome/browser/ui/ash/chrome_shell_delegate.cc
index 77b7101..1d0d4f6 100644
--- a/chrome/browser/ui/ash/chrome_shell_delegate.cc
+++ b/chrome/browser/ui/ash/chrome_shell_delegate.cc
@@ -41,7 +41,6 @@
 #include "chrome/browser/ui/host_desktop.h"
 #include "chrome/browser/ui/immersive_fullscreen_configuration.h"
 #include "chrome/common/chrome_switches.h"
-#include "chrome/common/time_format.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/user_metrics.h"
 #include "grit/chromium_strings.h"
@@ -417,14 +416,6 @@
   }
 }
 
-string16 ChromeShellDelegate::GetTimeRemainingString(base::TimeDelta delta) {
-  return TimeFormat::TimeRemainingLong(delta);
-}
-
-string16 ChromeShellDelegate::GetTimeDurationLongString(base::TimeDelta delta) {
-  return TimeFormat::TimeDurationLong(delta);
-}
-
 ui::MenuModel* ChromeShellDelegate::CreateContextMenu(aura::RootWindow* root) {
   DCHECK(launcher_delegate_);
   // Don't show context menu for exclusive app runtime mode.
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.h b/chrome/browser/ui/ash/chrome_shell_delegate.h
index c6e41db..ef8ea0f 100644
--- a/chrome/browser/ui/ash/chrome_shell_delegate.h
+++ b/chrome/browser/ui/ash/chrome_shell_delegate.h
@@ -88,8 +88,6 @@
   virtual void HandleMediaNextTrack() OVERRIDE;
   virtual void HandleMediaPlayPause() OVERRIDE;
   virtual void HandleMediaPrevTrack() OVERRIDE;
-  virtual string16 GetTimeRemainingString(base::TimeDelta delta) OVERRIDE;
-  virtual string16 GetTimeDurationLongString(base::TimeDelta delta) OVERRIDE;
   virtual void SaveScreenMagnifierScale(double scale) OVERRIDE;
   virtual double GetSavedScreenMagnifierScale() OVERRIDE;
   virtual ui::MenuModel* CreateContextMenu(aura::RootWindow* root) OVERRIDE;
diff --git a/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc
index 4fa26a4..f32790d 100644
--- a/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc
+++ b/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc
@@ -231,6 +231,19 @@
         return web_contents;
     }
   }
+  // Coming here our application was not in the LRU list. This could have
+  // happened because it did never get activated yet. So check the browser list
+  // as well.
+  for (BrowserList::const_iterator it = ash_browser_list->begin();
+       it != ash_browser_list->end(); ++it) {
+    Browser* browser = *it;
+    TabStripModel* tab_strip = browser->tab_strip_model();
+    for (int index = 0; index < tab_strip->count(); index++) {
+      content::WebContents* web_contents = tab_strip->GetWebContentsAt(index);
+      if (WebContentMatchesApp(extension, refocus_pattern, web_contents))
+        return web_contents;
+    }
+  }
   return NULL;
 }
 
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app_browsertest.cc
index 8a16e16..8c0cfba 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app_browsertest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app_browsertest.cc
@@ -35,6 +35,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/extensions/application_launch.h"
 #include "chrome/browser/ui/host_desktop.h"
@@ -1344,6 +1345,66 @@
   EXPECT_EQ(window1, ash::wm::GetActiveWindow());
 }
 
+// Checks that after a session restore, we do not start applications on an
+// activation.
+IN_PROC_BROWSER_TEST_F(LauncherPerAppAppBrowserTest,
+    ActivateAfterSessionRestore) {
+  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
+
+  // Create a known application.
+  ChromeLauncherController* controller =
+      static_cast<ChromeLauncherController*>(launcher_->delegate());
+  ash::LauncherID shortcut_id = CreateShortcut("app1");
+
+  // Create a new browser - without activating it - and load an "app" into it.
+  Browser::CreateParams params =
+      Browser::CreateParams(profile(), chrome::GetActiveDesktop());
+  params.initial_show_state = ui::SHOW_STATE_INACTIVE;
+  Browser* browser2 = new Browser(params);
+  controller->SetRefocusURLPatternForTest(
+      shortcut_id, GURL("http://www.example.com/path/*"));
+  std::string url = "http://www.example.com/path/bla";
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser2,
+      GURL(url),
+      NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+
+  // Remember the number of tabs for each browser.
+  TabStripModel* tab_strip = browser()->tab_strip_model();
+  int tab_count1 = tab_strip->count();
+  TabStripModel* tab_strip2 = browser2->tab_strip_model();
+  int tab_count2 = tab_strip2->count();
+
+  // Check that we have two browsers and the inactive browser remained inactive.
+  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
+  EXPECT_EQ(chrome::FindBrowserWithWindow(ash::wm::GetActiveWindow()),
+            browser());
+  // Check that the LRU browser list does only contain the original browser.
+  BrowserList* ash_browser_list =
+      BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_ASH);
+  BrowserList::const_reverse_iterator it =
+      ash_browser_list->begin_last_active();
+  EXPECT_EQ(*it, browser());
+  ++it;
+  EXPECT_EQ(it, ash_browser_list->end_last_active());
+
+  // Now request to either activate an existing app or create a new one.
+  controller->ItemSelected(*model_->ItemByID(shortcut_id),
+                           ui::KeyEvent(ui::ET_KEY_RELEASED,
+                                        ui::VKEY_RETURN,
+                                        0,
+                                        false));
+
+  // Check that we have set focus on the existing application and nothing new
+  // was created.
+  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
+  EXPECT_EQ(tab_count1, tab_strip->count());
+  EXPECT_EQ(tab_count2, tab_strip2->count());
+  EXPECT_EQ(chrome::FindBrowserWithWindow(ash::wm::GetActiveWindow()),
+            browser2);
+}
+
 // Do various drag and drop interaction tests between the application list and
 // the launcher.
 IN_PROC_BROWSER_TEST_F(LauncherPerAppAppBrowserTest, DragAndDrop) {
diff --git a/chrome/browser/ui/ash/screenshot_taker_unittest.cc b/chrome/browser/ui/ash/screenshot_taker_unittest.cc
index 439a6a1..a35339a 100644
--- a/chrome/browser/ui/ash/screenshot_taker_unittest.cc
+++ b/chrome/browser/ui/ash/screenshot_taker_unittest.cc
@@ -14,9 +14,9 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/notifications/notification_ui_manager.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chrome/test/base/testing_profile_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_utils.h"
 #include "ui/aura/root_window.h"
@@ -36,13 +36,10 @@
 
   virtual void SetUp() {
     AshTestBase::SetUp();
-    local_state_.reset(
-        new ScopedTestingLocalState(TestingBrowserProcess::GetGlobal()));
   }
 
   virtual void TearDown() {
     RunAllPendingInMessageLoop();
-    local_state_.reset();
     AshTestBase::TearDown();
   }
 
@@ -87,7 +84,6 @@
     EXPECT_TRUE(screenshot_complete_);
   }
 
-  scoped_ptr<ScopedTestingLocalState> local_state_;
   bool running_;
   bool screenshot_complete_;
   ScreenshotTakerObserver::Result screenshot_result_;
@@ -98,14 +94,18 @@
 };
 
 TEST_F(ScreenshotTakerTest, TakeScreenshot) {
-  TestingProfile profile;
+  scoped_ptr<TestingProfileManager> profile_manager(
+      new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
+  ASSERT_TRUE(profile_manager->SetUp());
+  TestingProfile* profile =
+      profile_manager->CreateTestingProfile("test_profile");
   ScreenshotTaker screenshot_taker;
   screenshot_taker.AddObserver(this);
   base::ScopedTempDir directory;
   ASSERT_TRUE(directory.CreateUniqueTempDir());
   SetScreenshotDirectoryForTest(&screenshot_taker, directory.path());
   SetScreenshotBasenameForTest(&screenshot_taker, "Screenshot");
-  SetScreenshotProfileForTest(&screenshot_taker, &profile);
+  SetScreenshotProfileForTest(&screenshot_taker, profile);
 
   EXPECT_TRUE(screenshot_taker.CanTakeScreenshot());
 
diff --git a/chrome/browser/ui/autofill/autofill_credit_card_bubble.h b/chrome/browser/ui/autofill/autofill_credit_card_bubble.h
index ba91afe..2ef632a 100644
--- a/chrome/browser/ui/autofill/autofill_credit_card_bubble.h
+++ b/chrome/browser/ui/autofill/autofill_credit_card_bubble.h
@@ -28,16 +28,16 @@
 
   virtual ~AutofillCreditCardBubble();
 
-  // Visually reveal the dialog bubble.
+  // Visually reveals the dialog bubble.
   virtual void Show() = 0;
 
-  // Hide the bubble from view.
+  // Hides the bubble from view.
   virtual void Hide() = 0;
 
-  // Whether the bubble is currently in the process of hiding itself.
+  // Returns whether the bubble is currently in the process of hiding itself.
   virtual bool IsHiding() const = 0;
 
-  // Create a bubble view that's operated by |controller| and owned by the
+  // Creates a bubble view that's operated by |controller| and owned by the
   // platform's widget or view management framework. |controller| is invalid
   // while the bubble is closing.
   static base::WeakPtr<AutofillCreditCardBubble> Create(
diff --git a/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller.cc b/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller.cc
index 70d0978..5d79a69 100644
--- a/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller.cc
+++ b/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller.cc
@@ -7,9 +7,6 @@
 #include <climits>
 #include <string>
 
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/message_loop/message_loop.h"
 #include "base/prefs/pref_service.h"
 #include "base/strings/string_split.h"
 #include "base/strings/utf_string_conversions.h"
@@ -44,6 +41,7 @@
 // TODO(dbeam): add back a sensible limit once it's decided or remove
 // kMaxGeneratedCardTimesToShow if this behavior is finalized.
 static const int kMaxGeneratedCardTimesToShow = INT_MAX;
+static const base::char16 kRangeSeparator = '|';
 static const char kWalletGeneratedCardLearnMoreLink[] =
     "http://support.google.com/wallet/bin/answer.py?hl=en&answer=2740044";
 
@@ -62,6 +60,8 @@
       weak_ptr_factory_(this) {}
 
 AutofillCreditCardBubbleController::~AutofillCreditCardBubbleController() {
+  // In the case that the tab is closed, the controller can be deleted while the
+  // bubble is showing. Always calling |Hide()| ensures the bubble is closed.
   Hide();
 }
 
@@ -115,25 +115,27 @@
 }
 
 base::string16 AutofillCreditCardBubbleController::BubbleTitle() const {
-  return !IsGeneratedCardBubble() ? ASCIIToUTF16("Lorem ipsum, savum cardum") :
+  return !IsGeneratedCardBubble() ?
+      ASCIIToUTF16("Lorem ipsum, savum cardum") :
       l10n_util::GetStringUTF16(
           IDS_AUTOFILL_CREDIT_CARD_BUBBLE_GENERATED_TITLE);
 }
 
 base::string16 AutofillCreditCardBubbleController::BubbleText() const {
-  DCHECK(IsSetup());
+  DCHECK(IsSetUp());
   return bubble_text_;
 }
 
 const std::vector<ui::Range>& AutofillCreditCardBubbleController::
     BubbleTextRanges() const {
-  DCHECK(IsSetup());
+  DCHECK(IsSetUp());
   return bubble_text_ranges_;
 }
 
 base::string16 AutofillCreditCardBubbleController::LinkText() const {
-  return l10n_util::GetStringUTF16(IsGeneratedCardBubble() ?
-      IDS_LEARN_MORE : IDS_AUTOFILL_CREDIT_CARD_BUBBLE_MANAGE_CARDS);
+  return l10n_util::GetStringUTF16(
+      IsGeneratedCardBubble() ? IDS_LEARN_MORE :
+                                IDS_AUTOFILL_CREDIT_CARD_BUBBLE_MANAGE_CARDS);
 }
 
 void AutofillCreditCardBubbleController::OnAnchorClicked() {
@@ -143,6 +145,7 @@
 void AutofillCreditCardBubbleController::OnLinkClicked() {
   if (IsGeneratedCardBubble()) {
 #if !defined(OS_ANDROID)
+    // Open a new tab to the Online Wallet help link.
     chrome::NavigateParams params(
         chrome::FindBrowserWithWebContents(web_contents()),
         GURL(kWalletGeneratedCardLearnMoreLink),
@@ -221,13 +224,14 @@
 void AutofillCreditCardBubbleController::Reset() {
   Hide();
 
+  // Clear any generated state or stored |ShowAs*()| arguments.
   fronting_card_name_.clear();
   backing_card_name_.clear();
   new_card_name_.clear();
   bubble_text_.clear();
   bubble_text_ranges_.clear();
 
-  DCHECK(!IsSetup());
+  DCHECK(!IsSetUp());
 }
 
 void AutofillCreditCardBubbleController::SetUp() {
@@ -244,30 +248,43 @@
         NULL);
   }
 
-  base::char16 separator('|');
+  // Split the full text on '|' to highlight certain parts. For example, "sly"
+  // and "jumped" would be bolded in "The |sly| fox |jumped| over the lazy dog".
   std::vector<base::string16> pieces;
-  base::SplitStringDontTrim(full_text, separator, &pieces);
+  base::SplitStringDontTrim(full_text, kRangeSeparator, &pieces);
 
   while (!pieces.empty()) {
     base::string16 piece = pieces.front();
+
+    // Every second piece should be bolded. Because |base::SplitString*()|
+    // leaves an empty "" even if '|' is the first character, this is guaranteed
+    // to work for "|highlighting| starts here". Ignore empty pieces because
+    // there's nothing to highlight.
     if (!piece.empty() && pieces.size() % 2 == 0) {
       const size_t start = bubble_text_.size();
       bubble_text_ranges_.push_back(ui::Range(start, start + piece.size()));
     }
+
+    // Append the piece whether it's bolded or not and move on to the next one.
     bubble_text_.append(piece);
     pieces.erase(pieces.begin(), pieces.begin() + 1);
   }
 
   UpdateAnchor();
-  DCHECK(IsSetup());
+  DCHECK(IsSetUp());
 }
 
-bool AutofillCreditCardBubbleController::IsSetup() const {
+bool AutofillCreditCardBubbleController::IsSetUp() const {
+  // Because |bubble_text_| should never be empty after |SetUp()|, and all
+  // translations should have some text highlighting (i.e. "some |pipes|"),
+  // if there is text there should be text ranges as well. Sanity check this.
   DCHECK_EQ(bubble_text_.empty(), bubble_text_ranges_.empty());
   return !bubble_text_.empty();
 }
 
 bool AutofillCreditCardBubbleController::IsGeneratedCardBubble() const {
+  // Do a quick sanity check to ensure that the bubble isn't partially set up as
+  // the other type (i.e. a fronting card and a new card doesn't make sense).
   DCHECK_EQ(fronting_card_name_.empty(), backing_card_name_.empty());
   DCHECK_NE(backing_card_name_.empty(), new_card_name_.empty());
   return !fronting_card_name_.empty();
diff --git a/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller.h b/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller.h
index e6d8885..dfe5b55 100644
--- a/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller.h
+++ b/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller.h
@@ -74,11 +74,10 @@
       const content::LoadCommittedDetails& details,
       const content::FrameNavigateParams& params) OVERRIDE;
 
-  // Whether |bubble_| is currently in the process of hiding.
+  // Returns whether |bubble_| is currently in the process of hiding.
   bool IsHiding() const;
 
-  // An image that should be shown as an icon in the omnibox and pointed to by
-  // the bubble.
+  // The image that should be shown as an icon in the omnibox.
   gfx::Image AnchorIcon() const;
 
   // The title of the bubble. May be empty.
@@ -93,10 +92,11 @@
   // The text of the link shown at the bubble of the bubble.
   base::string16 LinkText() const;
 
-  // Called when the anchor for this bubble is clicked.
+  // Called when the anchor for this bubble is clicked. Shows a new bubble.
   void OnAnchorClicked();
 
-  // Called when the link at the bottom of the bubble is clicked.
+  // Called when the link at the bottom of the bubble is clicked. Opens and
+  // navigates a new tab to an informational page and hides the bubble.
   void OnLinkClicked();
 
   // The web contents that successfully submitted the Autofill dialog (causing
@@ -105,8 +105,8 @@
   const content::WebContents* web_contents() const { return web_contents_; }
 
  protected:
-  // Create a bubble connected to |web_contents|. Its content will be based on
-  // which |SetupAs*()| method is called.
+  // Creates a bubble connected to |web_contents|. Its content will be based on
+  // which |ShowAs*()| method is called.
   explicit AutofillCreditCardBubbleController(content::WebContents* contents);
 
   // Returns a base::WeakPtr that references |this|. Exposed for testing.
@@ -118,7 +118,7 @@
   // Returns a weak reference to |bubble_|. May be invalid/NULL.
   virtual base::WeakPtr<AutofillCreditCardBubble> bubble();
 
-  // Whether the bubble can show currently.
+  // Returns whether the bubble can currently show itself.
   virtual bool CanShow() const;
 
   // Whether the generated card bubble should be shown initially when showing
@@ -132,7 +132,7 @@
       const base::string16& backing_card_name,
       const base::string16& fronting_card_name);
 
-  // Show a bubble notifying the user that new credit card data has been saved.
+  // Shows a bubble notifying the user that new credit card data has been saved.
   // Exposed for testing.
   virtual void ShowAsNewCardSavedBubble(const base::string16& new_card_name);
 
@@ -142,21 +142,21 @@
   // Nukes the state of this controller and hides |bubble_| (if it exists).
   void Reset();
 
-  // Generate bubble text and ranges now that this class knows which type of
-  // bubble it should be shown as. Called from |ShowAs*()| methods.
+  // Generates the correct bubble text and text highlighting ranges for the
+  // types of bubble being shown. Must be called before showing the bubble.
   void SetUp();
 
-  // Whether the controller has been setup as a certain type of bubble.
-  bool IsSetup() const;
+  // Returns whether the controller has been setup as a certain type of bubble.
+  bool IsSetUp() const;
 
-  // Whether the bubble is an educational bubble about generated cards.
+  // Returns whether the bubble is an educational bubble about generated cards.
   bool IsGeneratedCardBubble() const;
 
-  // An internal helper to show the bubble in response to successful Autofill
-  // dialog submission or anchor click.
+  // Hides any existing bubbles and creates and shows a new one. Called in
+  // response to successful Autofill dialog submission or anchor click.
   void Show(bool was_anchor_click);
 
-  // Update the omnibox icon that |bubble_| will be anchored to.
+  // Updates the omnibox icon that |bubble_| will be anchored to.
   void UpdateAnchor();
 
   // Hides |bubble_| (if it exists and isn't already hiding).
diff --git a/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller_unittest.cc b/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller_unittest.cc
index 942afa5..63efafe 100644
--- a/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller_unittest.cc
+++ b/chrome/browser/ui/autofill/autofill_credit_card_bubble_controller_unittest.cc
@@ -31,10 +31,10 @@
   return ASCIIToUTF16("Visa - 1111");
 }
 base::string16 FrontingCard() {
-  return ASCIIToUTF16("Mastercard - 5888");
+  return ASCIIToUTF16("Mastercard - 4444");
 }
 base::string16 NewCard() {
-  return ASCIIToUTF16("Discover - 7582");
+  return ASCIIToUTF16("Discover - 7777");
 }
 
 base::string16 RangeOfString(const base::string16& string,
@@ -49,8 +49,8 @@
       content::WebContents* contents)
       : AutofillCreditCardBubbleController(contents) {
     contents->SetUserData(UserDataKey(), this);
-    EXPECT_TRUE(IsInstalled());
   }
+
   virtual ~TestAutofillCreditCardBubbleController() {}
 
   bool IsInstalled() const {
@@ -86,6 +86,7 @@
     // Attaches immediately to |test_web_contents_| so a test version will exist
     // before a non-test version can be created.
     new TestAutofillCreditCardBubbleController(test_web_contents_.get());
+    ASSERT_TRUE(controller()->IsInstalled());
   }
 
  protected:
@@ -113,7 +114,7 @@
   }
 
   void ShowNewCardSavedBubble() {
-    EXPECT_TRUE(controller()->IsInstalled());
+    ASSERT_TRUE(controller()->IsInstalled());
     TestAutofillCreditCardBubbleController::ShowNewCardSavedBubble(
         test_web_contents_.get(), NewCard());
   }
@@ -146,6 +147,7 @@
 TEST_F(AutofillCreditCardBubbleControllerTest, GeneratedCardBubbleTimesShown) {
   ASSERT_EQ(0, GeneratedCardBubbleTimesShown());
 
+  // Ensure that showing the generated card UI bumps the persistent count.
   ShowGeneratedCardUI();
   EXPECT_EQ(1, GeneratedCardBubbleTimesShown());
   EXPECT_TRUE(controller()->GetTestingBubble()->showing());
@@ -157,19 +159,24 @@
 }
 
 TEST_F(AutofillCreditCardBubbleControllerTest, BubbleText) {
+  // Ensure that while showing the generated card UI that the bubble's text
+  // contains "Visa - 1111" and "Mastercard - 4444".
   ShowGeneratedCardUI();
   base::string16 generated_text = controller()->BubbleText();
-  EXPECT_NE(generated_text.find(BackingCard()), base::string16::npos);
-  EXPECT_NE(generated_text.find(FrontingCard()), base::string16::npos);
-  EXPECT_EQ(generated_text.find(NewCard()), base::string16::npos);
+  EXPECT_NE(base::string16::npos, generated_text.find(BackingCard()));
+  EXPECT_NE(base::string16::npos, generated_text.find(FrontingCard()));
+  EXPECT_EQ(base::string16::npos, generated_text.find(NewCard()));
 
+  // Ensure that while showing the new card bubble that "Discover - 7777" is in
+  // the bubble text.
   ShowNewCardSavedBubble();
   base::string16 new_text = controller()->BubbleText();
   EXPECT_NE(new_text, generated_text);
-  EXPECT_EQ(new_text.find(BackingCard()), base::string16::npos);
-  EXPECT_EQ(new_text.find(FrontingCard()), base::string16::npos);
-  EXPECT_NE(new_text.find(NewCard()), base::string16::npos);
+  EXPECT_EQ(base::string16::npos, new_text.find(BackingCard()));
+  EXPECT_EQ(base::string16::npos, new_text.find(FrontingCard()));
+  EXPECT_NE(base::string16::npos, new_text.find(NewCard()));
 
+  // Make sure that |bubble_text_| is regenerated the same way in |Setup()|.
   ShowGeneratedCardUI();
   EXPECT_EQ(generated_text, controller()->BubbleText());
 
@@ -178,11 +185,12 @@
 }
 
 TEST_F(AutofillCreditCardBubbleControllerTest, BubbleTextRanges) {
+  // Check that the highlighted ranges in the bubble's text are correct.
   ShowGeneratedCardUI();
   base::string16 text = controller()->BubbleText();
   std::vector<ui::Range> ranges = controller()->BubbleTextRanges();
 
-  ASSERT_EQ(ranges.size(), 2U);
+  ASSERT_EQ(2U, ranges.size());
   EXPECT_EQ(BackingCard(), RangeOfString(text, ranges[0]));
   EXPECT_EQ(FrontingCard(), RangeOfString(text, ranges[1]));
 
@@ -190,11 +198,13 @@
   text = controller()->BubbleText();
   ranges = controller()->BubbleTextRanges();
 
-  ASSERT_EQ(ranges.size(), 1U);
+  ASSERT_EQ(1U, ranges.size());
   EXPECT_EQ(NewCard(), RangeOfString(text, ranges[0]));
 }
 
 TEST_F(AutofillCreditCardBubbleControllerTest, HideOnNavigate) {
+  // When a user navigates away from a page (or refreshes) normally, the bubbles
+  // should be hidden.
   EXPECT_FALSE(controller()->GetTestingBubble());
   ShowGeneratedCardUI();
   EXPECT_TRUE(controller()->GetTestingBubble()->showing());
@@ -213,6 +223,7 @@
 }
 
 TEST_F(AutofillCreditCardBubbleControllerTest, StayOnRedirect) {
+  // If a page redirects right after submitting, the bubble should remain.
   EXPECT_FALSE(controller()->GetTestingBubble());
   ShowGeneratedCardUI();
   EXPECT_TRUE(controller()->GetTestingBubble()->showing());
diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
index 2e0ea7f..3a42603 100644
--- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
@@ -115,19 +115,23 @@
                                const AutofillType& field_type) {
   // If any credit card expiration info is asked for, show both month and year
   // inputs.
-  if (field_type.server_type() == CREDIT_CARD_EXP_4_DIGIT_YEAR ||
-      field_type.server_type() == CREDIT_CARD_EXP_2_DIGIT_YEAR ||
-      field_type.server_type() == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR ||
-      field_type.server_type() == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR ||
-      field_type.server_type() == CREDIT_CARD_EXP_MONTH) {
+  ServerFieldType server_type = field_type.GetStorableType();
+  if (server_type == CREDIT_CARD_EXP_4_DIGIT_YEAR ||
+      server_type == CREDIT_CARD_EXP_2_DIGIT_YEAR ||
+      server_type == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR ||
+      server_type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR ||
+      server_type == CREDIT_CARD_EXP_MONTH) {
     return input.type == CREDIT_CARD_EXP_4_DIGIT_YEAR ||
            input.type == CREDIT_CARD_EXP_MONTH;
   }
 
-  if (field_type.server_type() == CREDIT_CARD_TYPE)
+  if (server_type == CREDIT_CARD_TYPE)
     return input.type == CREDIT_CARD_NUMBER;
 
-  return input.type == field_type.server_type();
+  // Check the groups to distinguish billing types from shipping ones.
+  AutofillType input_type = AutofillType(input.type);
+  return input_type.GetStorableType() == server_type &&
+         input_type.group() == field_type.group();
 }
 
 // Returns true if |input| in the given |section| should be used for a
@@ -138,7 +142,7 @@
   AutofillType field_type = field.Type();
 
   // The credit card name is filled from the billing section's data.
-  if (field_type.server_type() == CREDIT_CARD_NAME &&
+  if (field_type.GetStorableType() == CREDIT_CARD_NAME &&
       (section == SECTION_BILLING || section == SECTION_CC_BILLING)) {
     return input.type == NAME_BILLING_FULL;
   }
@@ -158,7 +162,8 @@
   // Equivalent billing field type is used to support UseBillingAsShipping
   // usecase.
   ServerFieldType field_type =
-      AutofillType::GetEquivalentBillingFieldType(field.Type().server_type());
+      AutofillType::GetEquivalentBillingFieldType(
+          field.Type().GetStorableType());
 
   return InputTypeMatchesFieldType(input, AutofillType(field_type));
 }
@@ -458,7 +463,7 @@
   GetMetricLogger().LogDialogInitialUserState(
       GetDialogType(), initial_user_state_);
 
-  if (deemphasized_render_view_) {
+  if (deemphasized_render_view_ && web_contents()) {
     web_contents()->GetRenderViewHost()->Send(
         new ChromeViewMsg_SetVisuallyDeemphasized(
             web_contents()->GetRenderViewHost()->GetRoutingID(), false));
@@ -509,8 +514,9 @@
 void AutofillDialogControllerImpl::Show() {
   dialog_shown_timestamp_ = base::Time::Now();
 
-  content::NavigationEntry* entry = contents_->GetController().GetActiveEntry();
-  const GURL& active_url = entry ? entry->GetURL() : contents_->GetURL();
+  content::NavigationEntry* entry =
+      web_contents()->GetController().GetActiveEntry();
+  const GURL& active_url = entry ? entry->GetURL() : web_contents()->GetURL();
   invoked_from_same_origin_ = active_url.GetOrigin() == source_url_.GetOrigin();
 
   // Log any relevant UI metrics and security exceptions.
@@ -536,7 +542,7 @@
   bool has_types = false;
   bool has_sections = false;
   form_structure_.ParseFieldTypesFromAutocompleteAttributes(
-      FormStructure::PARSE_FOR_AUTOFILL_DIALOG, &has_types, &has_sections);
+      &has_types, &has_sections);
 
   // Fail if the author didn't specify autocomplete types.
   if (!has_types) {
@@ -748,6 +754,10 @@
   return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_CHECKBOX);
 }
 
+string16 AutofillDialogControllerImpl::SaveLocallyTooltip() const {
+  return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_TOOLTIP);
+}
+
 string16 AutofillDialogControllerImpl::LegalDocumentsText() {
   if (!IsPayingWithWallet() || autocheckout_state_ != AUTOCHECKOUT_NOT_STARTED)
     return string16();
@@ -1200,7 +1210,7 @@
 
 ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType(
     ServerFieldType type) {
-  switch (AutofillType::GetEquivalentFieldType(type)) {
+  switch (type) {
     case CREDIT_CARD_EXP_MONTH:
       return &cc_exp_month_combobox_model_;
 
@@ -1208,6 +1218,7 @@
       return &cc_exp_year_combobox_model_;
 
     case ADDRESS_HOME_COUNTRY:
+    case ADDRESS_BILLING_COUNTRY:
       return &country_combobox_model_;
 
     default:
@@ -1573,7 +1584,7 @@
     }
   }
 
-  switch (AutofillType::GetEquivalentFieldType(type)) {
+  switch (AutofillType(type).GetStorableType()) {
     case EMAIL_ADDRESS:
       if (!value.empty() && !IsValidEmailAddress(value)) {
         return l10n_util::GetStringUTF16(
@@ -2027,8 +2038,8 @@
   return profile_;
 }
 
-content::WebContents* AutofillDialogControllerImpl::web_contents() {
-  return contents_;
+content::WebContents* AutofillDialogControllerImpl::GetWebContents() {
+  return web_contents();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -2326,7 +2337,8 @@
   DCHECK_GT(form_structure_.field_count(), 0U);
 
   for (size_t i = 0; i < form_structure_.field_count(); ++i) {
-    if (IsCreditCardType(form_structure_.field(i)->Type().server_type()))
+    AutofillType type = form_structure_.field(i)->Type();
+    if (IsCreditCardType(type.GetStorableType()))
       return true;
   }
 
@@ -2344,8 +2356,8 @@
     const DialogType dialog_type,
     const base::Callback<void(const FormStructure*,
                               const std::string&)>& callback)
-    : profile_(Profile::FromBrowserContext(contents->GetBrowserContext())),
-      contents_(contents),
+    : WebContentsObserver(contents),
+      profile_(Profile::FromBrowserContext(contents->GetBrowserContext())),
       initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN),
       dialog_type_(dialog_type),
       form_structure_(form_structure, std::string()),
@@ -2786,7 +2798,7 @@
 void AutofillDialogControllerImpl::SetCvcResult(const string16& cvc) {
   for (size_t i = 0; i < form_structure_.field_count(); ++i) {
     AutofillField* field = form_structure_.field(i);
-    if (field->Type().server_type() == CREDIT_CARD_VERIFICATION_CODE) {
+    if (field->Type().GetStorableType() == CREDIT_CARD_VERIFICATION_CODE) {
       field->value = cvc;
       break;
     }
diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.h b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.h
index fcc664d..6aa4ae1 100644
--- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.h
+++ b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.h
@@ -33,6 +33,7 @@
 #include "components/autofill/core/browser/personal_data_manager_observer.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/web_contents_observer.h"
 #include "content/public/common/ssl_status.h"
 #include "ui/base/models/simple_menu_model.h"
 #include "ui/base/ui_base_types.h"
@@ -69,6 +70,7 @@
 class AutofillDialogControllerImpl : public AutofillDialogViewDelegate,
                                      public AutofillPopupDelegate,
                                      public content::NotificationObserver,
+                                     public content::WebContentsObserver,
                                      public SuggestionsMenuModelDelegate,
                                      public wallet::WalletClientDelegate,
                                      public wallet::WalletSigninHelperDelegate,
@@ -119,6 +121,7 @@
   virtual string16 CancelButtonText() const OVERRIDE;
   virtual string16 ConfirmButtonText() const OVERRIDE;
   virtual string16 SaveLocallyText() const OVERRIDE;
+  virtual string16 SaveLocallyTooltip() const OVERRIDE;
   virtual string16 LegalDocumentsText() OVERRIDE;
   virtual DialogSignedInState SignedInState() const OVERRIDE;
   virtual bool ShouldShowSpinner() const OVERRIDE;
@@ -174,7 +177,7 @@
   virtual bool OnCancel() OVERRIDE;
   virtual bool OnAccept() OVERRIDE;
   virtual Profile* profile() OVERRIDE;
-  virtual content::WebContents* web_contents() OVERRIDE;
+  virtual content::WebContents* GetWebContents() OVERRIDE;
 
   // AutofillPopupDelegate implementation.
   virtual void OnPopupShown(content::KeyboardListener* listener) OVERRIDE;
@@ -549,9 +552,6 @@
   // The |profile| for |contents_|.
   Profile* const profile_;
 
-  // The WebContents where the Autofill action originated.
-  content::WebContents* const contents_;
-
   // For logging UMA metrics.
   const AutofillMetrics metric_logger_;
   base::Time dialog_shown_timestamp_;
diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc b/chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc
index a510a96..7d16140 100644
--- a/chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc
+++ b/chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc
@@ -1011,22 +1011,26 @@
 
   controller()->OnAccept();
   ASSERT_EQ(20U, form_structure()->field_count());
-  EXPECT_EQ(ADDRESS_BILLING_STATE,
-            form_structure()->field(9)->Type().server_type());
   EXPECT_EQ(ADDRESS_HOME_STATE,
-            form_structure()->field(16)->Type().server_type());
+            form_structure()->field(9)->Type().GetStorableType());
+  EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(9)->Type().group());
+  EXPECT_EQ(ADDRESS_HOME_STATE,
+            form_structure()->field(16)->Type().GetStorableType());
+  EXPECT_EQ(ADDRESS_HOME, form_structure()->field(16)->Type().group());
   string16 billing_state = form_structure()->field(9)->value;
   string16 shipping_state = form_structure()->field(16)->value;
   EXPECT_FALSE(billing_state.empty());
   EXPECT_FALSE(shipping_state.empty());
   EXPECT_NE(billing_state, shipping_state);
 
-  EXPECT_EQ(CREDIT_CARD_NAME, form_structure()->field(1)->Type().server_type());
+  EXPECT_EQ(CREDIT_CARD_NAME,
+            form_structure()->field(1)->Type().GetStorableType());
   string16 cc_name = form_structure()->field(1)->value;
-  EXPECT_EQ(NAME_BILLING_FULL,
-            form_structure()->field(6)->Type().server_type());
+  EXPECT_EQ(NAME_FULL, form_structure()->field(6)->Type().GetStorableType());
+  EXPECT_EQ(NAME_BILLING, form_structure()->field(6)->Type().group());
   string16 billing_name = form_structure()->field(6)->value;
-  EXPECT_EQ(NAME_FULL, form_structure()->field(13)->Type().server_type());
+  EXPECT_EQ(NAME_FULL, form_structure()->field(13)->Type().GetStorableType());
+  EXPECT_EQ(NAME, form_structure()->field(13)->Type().group());
   string16 shipping_name = form_structure()->field(13)->value;
 
   EXPECT_FALSE(cc_name.empty());
@@ -1051,10 +1055,12 @@
 
   controller()->OnAccept();
   ASSERT_EQ(20U, form_structure()->field_count());
-  EXPECT_EQ(ADDRESS_BILLING_STATE,
-            form_structure()->field(9)->Type().server_type());
   EXPECT_EQ(ADDRESS_HOME_STATE,
-            form_structure()->field(16)->Type().server_type());
+            form_structure()->field(9)->Type().GetStorableType());
+  EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(9)->Type().group());
+  EXPECT_EQ(ADDRESS_HOME_STATE,
+            form_structure()->field(16)->Type().GetStorableType());
+  EXPECT_EQ(ADDRESS_HOME, form_structure()->field(16)->Type().group());
   string16 billing_state = form_structure()->field(9)->value;
   string16 shipping_state = form_structure()->field(16)->value;
   EXPECT_FALSE(billing_state.empty());
@@ -1062,12 +1068,13 @@
   EXPECT_EQ(billing_state, shipping_state);
 
   EXPECT_EQ(CREDIT_CARD_NAME,
-            form_structure()->field(1)->Type().server_type());
+            form_structure()->field(1)->Type().GetStorableType());
   string16 cc_name = form_structure()->field(1)->value;
-  EXPECT_EQ(NAME_BILLING_FULL,
-            form_structure()->field(6)->Type().server_type());
+  EXPECT_EQ(NAME_FULL, form_structure()->field(6)->Type().GetStorableType());
+  EXPECT_EQ(NAME_BILLING, form_structure()->field(6)->Type().group());
   string16 billing_name = form_structure()->field(6)->value;
-  EXPECT_EQ(NAME_FULL, form_structure()->field(13)->Type().server_type());
+  EXPECT_EQ(NAME_FULL, form_structure()->field(13)->Type().GetStorableType());
+  EXPECT_EQ(NAME, form_structure()->field(13)->Type().group());
   string16 shipping_name = form_structure()->field(13)->value;
 
   EXPECT_FALSE(cc_name.empty());
@@ -1105,9 +1112,11 @@
   controller()->OnAccept();
   ASSERT_EQ(2U, form_structure()->field_count());
   EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
-            form_structure()->field(0)->Type().server_type());
-  EXPECT_EQ(PHONE_BILLING_WHOLE_NUMBER,
-            form_structure()->field(1)->Type().server_type());
+            form_structure()->field(0)->Type().GetStorableType());
+  EXPECT_EQ(PHONE_HOME, form_structure()->field(0)->Type().group());
+  EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
+            form_structure()->field(1)->Type().GetStorableType());
+  EXPECT_EQ(PHONE_BILLING, form_structure()->field(1)->Type().group());
   EXPECT_EQ(shipping_profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER),
             form_structure()->field(0)->value);
   EXPECT_EQ(billing_profile.GetRawInfo(PHONE_BILLING_WHOLE_NUMBER),
@@ -2041,7 +2050,7 @@
 
   size_t i = 0;
   for (; i < form_structure()->field_count(); ++i) {
-    if (form_structure()->field(i)->Type().server_type() == EMAIL_ADDRESS) {
+    if (form_structure()->field(i)->Type().GetStorableType() == EMAIL_ADDRESS) {
       EXPECT_EQ(ASCIIToUTF16(kFakeEmail), form_structure()->field(i)->value);
       break;
     }
@@ -2056,13 +2065,16 @@
   controller()->OnAccept();
   controller()->OnDidGetFullWallet(wallet::GetTestFullWallet());
   ASSERT_EQ(20U, form_structure()->field_count());
-  EXPECT_EQ(EMAIL_ADDRESS, form_structure()->field(0)->Type().server_type());
+  EXPECT_EQ(EMAIL_ADDRESS,
+            form_structure()->field(0)->Type().GetStorableType());
   EXPECT_EQ(CREDIT_CARD_NUMBER,
-            form_structure()->field(2)->Type().server_type());
-  EXPECT_EQ(ADDRESS_BILLING_STATE,
-            form_structure()->field(9)->Type().server_type());
+            form_structure()->field(2)->Type().GetStorableType());
   EXPECT_EQ(ADDRESS_HOME_STATE,
-            form_structure()->field(16)->Type().server_type());
+            form_structure()->field(9)->Type().GetStorableType());
+  EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(9)->Type().group());
+  EXPECT_EQ(ADDRESS_HOME_STATE,
+            form_structure()->field(16)->Type().GetStorableType());
+  EXPECT_EQ(ADDRESS_HOME, form_structure()->field(16)->Type().group());
 }
 
 TEST_F(AutofillDialogControllerTest, SaveDetailsInChrome) {
diff --git a/chrome/browser/ui/autofill/autofill_dialog_view_delegate.h b/chrome/browser/ui/autofill/autofill_dialog_view_delegate.h
index d67f9d7..5ecae0f 100644
--- a/chrome/browser/ui/autofill/autofill_dialog_view_delegate.h
+++ b/chrome/browser/ui/autofill/autofill_dialog_view_delegate.h
@@ -46,6 +46,7 @@
   virtual string16 CancelButtonText() const = 0;
   virtual string16 ConfirmButtonText() const = 0;
   virtual string16 SaveLocallyText() const = 0;
+  virtual string16 SaveLocallyTooltip() const = 0;
   virtual string16 LegalDocumentsText() = 0;
 
   // State ---------------------------------------------------------------------
@@ -205,7 +206,7 @@
   virtual Profile* profile() = 0;
 
   // The web contents that prompted the dialog.
-  virtual content::WebContents* web_contents() = 0;
+  virtual content::WebContents* GetWebContents() = 0;
 
  protected:
   virtual ~AutofillDialogViewDelegate();
diff --git a/chrome/browser/ui/autofill/data_model_wrapper.cc b/chrome/browser/ui/autofill/data_model_wrapper.cc
index ac1af54..1992c90 100644
--- a/chrome/browser/ui/autofill/data_model_wrapper.cc
+++ b/chrome/browser/ui/autofill/data_model_wrapper.cc
@@ -123,18 +123,21 @@
 }
 
 void AutofillProfileWrapper::FillFormField(AutofillField* field) const {
-  AutofillType field_type = field->Type();
+  if (field->Type().GetStorableType() == CREDIT_CARD_NAME) {
+    // Cache the field's true type.
+    HtmlFieldType original_type = field->html_type();
 
-  if (field_type.server_type() == CREDIT_CARD_NAME) {
     // Requests for the user's credit card are filled from the billing address,
     // but the AutofillProfile class doesn't know how to fill credit card
     // fields. So, temporarily set the type to the corresponding profile type.
-    field->set_heuristic_type(NAME_FULL);
+    field->SetHtmlType(HTML_TYPE_NAME, field->html_mode());
+    AutofillDataModelWrapper::FillFormField(field);
+
+    // Restore the field's true type.
+    field->SetHtmlType(original_type, field->html_mode());
+  } else {
+    AutofillDataModelWrapper::FillFormField(field);
   }
-
-  AutofillDataModelWrapper::FillFormField(field);
-
-  field->set_heuristic_type(field_type.server_type());
 }
 
 // AutofillCreditCardWrapper
@@ -146,7 +149,7 @@
 AutofillCreditCardWrapper::~AutofillCreditCardWrapper() {}
 
 string16 AutofillCreditCardWrapper::GetInfo(const AutofillType& type) const {
-  if (type.server_type() == CREDIT_CARD_EXP_MONTH)
+  if (type.GetStorableType() == CREDIT_CARD_EXP_MONTH)
     return MonthComboboxModel::FormatMonth(card_->expiration_month());
 
   return AutofillDataModelWrapper::GetInfo(type);
@@ -193,7 +196,7 @@
 WalletInstrumentWrapper::~WalletInstrumentWrapper() {}
 
 string16 WalletInstrumentWrapper::GetInfo(const AutofillType& type) const {
-  if (type.server_type() == CREDIT_CARD_EXP_MONTH)
+  if (type.GetStorableType() == CREDIT_CARD_EXP_MONTH)
     return MonthComboboxModel::FormatMonth(instrument_->expiration_month());
 
   return instrument_->GetInfo(type, g_browser_process->GetApplicationLocale());
@@ -228,7 +231,7 @@
 FullWalletBillingWrapper::~FullWalletBillingWrapper() {}
 
 string16 FullWalletBillingWrapper::GetInfo(const AutofillType& type) const {
-  if (type.server_type() == CREDIT_CARD_EXP_MONTH)
+  if (type.GetStorableType() == CREDIT_CARD_EXP_MONTH)
     return MonthComboboxModel::FormatMonth(full_wallet_->expiration_month());
 
   if (type.group() == CREDIT_CARD)
@@ -267,9 +270,10 @@
 DetailOutputWrapper::~DetailOutputWrapper() {}
 
 base::string16 DetailOutputWrapper::GetInfo(const AutofillType& type) const {
+  ServerFieldType storable_type = type.GetStorableType();
   for (DetailOutputMap::const_iterator it = outputs_.begin();
        it != outputs_.end(); ++it) {
-    if (type.server_type() == it->first->type)
+    if (storable_type == AutofillType(it->first->type).GetStorableType())
       return it->second;
   }
   return base::string16();
diff --git a/chrome/browser/ui/autofill/mock_autofill_dialog_view_delegate.h b/chrome/browser/ui/autofill/mock_autofill_dialog_view_delegate.h
index a02c32c..414b4c7 100644
--- a/chrome/browser/ui/autofill/mock_autofill_dialog_view_delegate.h
+++ b/chrome/browser/ui/autofill/mock_autofill_dialog_view_delegate.h
@@ -22,6 +22,7 @@
   MOCK_CONST_METHOD0(CancelButtonText, string16());
   MOCK_CONST_METHOD0(ConfirmButtonText, string16());
   MOCK_CONST_METHOD0(SaveLocallyText, string16());
+  MOCK_CONST_METHOD0(SaveLocallyTooltip, string16());
   MOCK_METHOD0(LegalDocumentsText, string16());
   MOCK_CONST_METHOD0(SignedInState, DialogSignedInState());
   MOCK_CONST_METHOD0(ShouldShowSpinner, bool());
@@ -74,7 +75,7 @@
   MOCK_METHOD0(OnCancel, bool());
   MOCK_METHOD0(OnAccept, bool());
   MOCK_METHOD0(profile, Profile*());
-  MOCK_METHOD0(web_contents, content::WebContents*());
+  MOCK_METHOD0(GetWebContents, content::WebContents*());
  private:
   DetailInputs default_inputs_;
   DetailInputs cc_default_inputs_;  // Default inputs for SECTION_CC.
diff --git a/chrome/browser/ui/autofill/tab_autofill_manager_delegate.cc b/chrome/browser/ui/autofill/tab_autofill_manager_delegate.cc
index 53c6a90..cf4ab39 100644
--- a/chrome/browser/ui/autofill/tab_autofill_manager_delegate.cc
+++ b/chrome/browser/ui/autofill/tab_autofill_manager_delegate.cc
@@ -22,9 +22,11 @@
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 #include "chrome/common/url_constants.h"
 #include "components/autofill/content/browser/autofill_driver_impl.h"
+#include "components/autofill/core/common/autofill_messages.h"
 #include "components/autofill/core/common/autofill_pref_names.h"
 #include "content/public/browser/navigation_details.h"
 #include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/render_view_host.h"
 #include "content/public/browser/web_contents_view.h"
 #include "ui/gfx/rect.h"
 
@@ -105,13 +107,14 @@
       infobar_service, &metric_logger, save_card_callback);
 }
 
-void TabAutofillManagerDelegate::ShowAutocheckoutBubble(
+bool TabAutofillManagerDelegate::ShowAutocheckoutBubble(
     const gfx::RectF& bounding_box,
     bool is_google_user,
     const base::Callback<void(AutocheckoutBubbleState)>& callback) {
 #if !defined(TOOLKIT_VIEWS)
   callback.Run(AUTOCHECKOUT_BUBBLE_CANCELED);
   NOTIMPLEMENTED();
+  return false;
 #else
   HideAutocheckoutBubble();
 
@@ -127,7 +130,12 @@
               web_contents_->GetView()->GetTopLevelNativeWindow(),
               is_google_user,
               callback)));
+
+  if (!autocheckout_bubble_)
+    return false;
+
   autocheckout_bubble_->ShowBubble();
+  return true;
 #endif  // #if !defined(TOOLKIT_VIEWS)
 }
 
@@ -215,6 +223,13 @@
     dialog_controller_->Hide();
 }
 
+void TabAutofillManagerDelegate::WasShown() {
+  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
+  if (!host)
+    return;
+  host->Send(new AutofillMsg_PageShown(host->GetRoutingID()));
+}
+
 void TabAutofillManagerDelegate::DidNavigateMainFrame(
     const content::LoadCommittedDetails& details,
     const content::FrameNavigateParams& params) {
diff --git a/chrome/browser/ui/autofill/tab_autofill_manager_delegate.h b/chrome/browser/ui/autofill/tab_autofill_manager_delegate.h
index 004a0bb..40588b5 100644
--- a/chrome/browser/ui/autofill/tab_autofill_manager_delegate.h
+++ b/chrome/browser/ui/autofill/tab_autofill_manager_delegate.h
@@ -53,7 +53,7 @@
       const AutofillMetrics& metric_logger,
       const CreditCard& credit_card,
       const base::Closure& save_card_callback) OVERRIDE;
-  virtual void ShowAutocheckoutBubble(
+  virtual bool ShowAutocheckoutBubble(
       const gfx::RectF& bounds,
       bool is_google_user,
       const base::Callback<void(AutocheckoutBubbleState)>& callback) OVERRIDE;
@@ -89,6 +89,7 @@
       const content::FrameNavigateParams& params) OVERRIDE;
   virtual void WebContentsDestroyed(
       content::WebContents* web_contents) OVERRIDE;
+  virtual void WasShown() OVERRIDE;
 
   // Exposed for testing.
   AutofillDialogControllerImpl* GetDialogControllerForTesting() {
diff --git a/chrome/browser/ui/cocoa/autofill/autofill_dialog_cocoa.mm b/chrome/browser/ui/cocoa/autofill/autofill_dialog_cocoa.mm
index 33584f7..292af78 100644
--- a/chrome/browser/ui/cocoa/autofill/autofill_dialog_cocoa.mm
+++ b/chrome/browser/ui/cocoa/autofill/autofill_dialog_cocoa.mm
@@ -54,13 +54,13 @@
   // This should only be called once.
   DCHECK(!sheet_delegate_.get());
   sheet_delegate_.reset([[AutofillDialogWindowController alloc]
-       initWithWebContents:delegate_->web_contents()
+       initWithWebContents:delegate_->GetWebContents()
             autofillDialog:this]);
   base::scoped_nsobject<CustomConstrainedWindowSheet> sheet(
       [[CustomConstrainedWindowSheet alloc]
           initWithCustomWindow:[sheet_delegate_ window]]);
   constrained_window_.reset(
-      new ConstrainedWindowMac(this, delegate_->web_contents(), sheet));
+      new ConstrainedWindowMac(this, delegate_->GetWebContents(), sheet));
 }
 
 void AutofillDialogCocoa::Hide() {
diff --git a/chrome/browser/ui/cocoa/background_gradient_view.mm b/chrome/browser/ui/cocoa/background_gradient_view.mm
index 26a904f..1ed5113 100644
--- a/chrome/browser/ui/cocoa/background_gradient_view.mm
+++ b/chrome/browser/ui/cocoa/background_gradient_view.mm
@@ -93,7 +93,7 @@
     return [NSColor blackColor];
   return themeProvider->GetNSColor(
       isActive ? ThemeProperties::COLOR_TOOLBAR_STROKE :
-                 ThemeProperties::COLOR_TOOLBAR_STROKE_INACTIVE, true);
+                 ThemeProperties::COLOR_TOOLBAR_STROKE_INACTIVE);
 }
 
 - (NSColor*)backgroundImageColor {
@@ -106,12 +106,12 @@
   // theme.
   if (![[self window] isMainWindow] && themeProvider->UsingDefaultTheme()) {
     NSColor* color = themeProvider->GetNSImageColorNamed(
-        IDR_THEME_TOOLBAR_INACTIVE, true);
+        IDR_THEME_TOOLBAR_INACTIVE);
     if (color)
       return color;
   }
 
-  return themeProvider->GetNSImageColorNamed(IDR_THEME_TOOLBAR, true);
+  return themeProvider->GetNSImageColorNamed(IDR_THEME_TOOLBAR);
 }
 
 - (void)windowFocusDidChange:(NSNotification*)notification {
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
index 3851b48..f86c61b 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
@@ -1091,8 +1091,7 @@
   ui::ThemeProvider* themeProvider = [[[self view] window] themeProvider];
   if (themeProvider) {
     NSColor* color =
-        themeProvider->GetNSColor(ThemeProperties::COLOR_BOOKMARK_TEXT,
-                                  true);
+        themeProvider->GetNSColor(ThemeProperties::COLOR_BOOKMARK_TEXT);
     [cell setTextColor:color];
   }
 
@@ -1703,8 +1702,7 @@
   if (!themeProvider)
     return;
   NSColor* color =
-      themeProvider->GetNSColor(ThemeProperties::COLOR_BOOKMARK_TEXT,
-                                true);
+      themeProvider->GetNSColor(ThemeProperties::COLOR_BOOKMARK_TEXT);
   for (BookmarkButton* button in buttons_.get()) {
     BookmarkButtonCell* cell = [button cell];
     [cell setTextColor:color];
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm
index 9ae2499..8a9b7f8 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm
@@ -220,18 +220,16 @@
       ui::ScaleFactor scale_factor) const OVERRIDE {
     return NULL;
   }
-  virtual NSImage* GetNSImageNamed(int id, bool allow_default) const OVERRIDE {
+  virtual NSImage* GetNSImageNamed(int id) const OVERRIDE {
     return nil;
   }
-  virtual NSColor* GetNSImageColorNamed(
-      int id,
-      bool allow_default) const OVERRIDE {
+  virtual NSColor* GetNSImageColorNamed(int id) const OVERRIDE {
     return nil;
   }
-  virtual NSColor* GetNSColor(int id, bool allow_default) const OVERRIDE {
+  virtual NSColor* GetNSColor(int id) const OVERRIDE {
     return color_.get();
   }
-  virtual NSColor* GetNSColorTint(int id, bool allow_default) const OVERRIDE {
+  virtual NSColor* GetNSColorTint(int id) const OVERRIDE {
     return nil;
   }
   virtual NSGradient* GetNSGradient(int id) const OVERRIDE {
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_view.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_view.mm
index b468c6f..617f44a 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_view.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_view.mm
@@ -88,8 +88,7 @@
     return;
 
   NSColor* color =
-      themeProvider->GetNSColor(ThemeProperties::COLOR_BOOKMARK_TEXT,
-                                true);
+      themeProvider->GetNSColor(ThemeProperties::COLOR_BOOKMARK_TEXT);
   [noItemTextfield_ setTextColor:color];
 }
 
diff --git a/chrome/browser/ui/cocoa/bubble_view.mm b/chrome/browser/ui/cocoa/bubble_view.mm
index b9b8648..fd5d14b 100644
--- a/chrome/browser/ui/cocoa/bubble_view.mm
+++ b/chrome/browser/ui/cocoa/bubble_view.mm
@@ -92,7 +92,7 @@
                         bottomRightCornerRadius:bottomRightRadius];
 
   if (themeProvider)
-    [themeProvider->GetNSColor(ThemeProperties::COLOR_TOOLBAR, true) set];
+    [themeProvider->GetNSColor(ThemeProperties::COLOR_TOOLBAR) set];
   [border fill];
 
   [[NSColor colorWithDeviceWhite:kWindowEdge alpha:1.0f] set];
@@ -101,8 +101,7 @@
   // Text
   NSColor* textColor = [NSColor blackColor];
   if (themeProvider)
-    textColor = themeProvider->GetNSColor(ThemeProperties::COLOR_TAB_TEXT,
-                                          true);
+    textColor = themeProvider->GetNSColor(ThemeProperties::COLOR_TAB_TEXT);
   NSFont* textFont = [self font];
   base::scoped_nsobject<NSShadow> textShadow([[NSShadow alloc] init]);
   [textShadow setShadowBlurRadius:0.0f];
diff --git a/chrome/browser/ui/cocoa/download/background_theme.h b/chrome/browser/ui/cocoa/download/background_theme.h
index d044fe1..201b52e 100644
--- a/chrome/browser/ui/cocoa/download/background_theme.h
+++ b/chrome/browser/ui/cocoa/download/background_theme.h
@@ -24,11 +24,10 @@
   virtual base::RefCountedMemory* GetRawData(
       int id,
       ui::ScaleFactor scale_factor) const OVERRIDE;
-  virtual NSImage* GetNSImageNamed(int id, bool allow_default) const OVERRIDE;
-  virtual NSColor* GetNSImageColorNamed(int id,
-                                        bool allow_default) const OVERRIDE;
-  virtual NSColor* GetNSColor(int id, bool allow_default) const OVERRIDE;
-  virtual NSColor* GetNSColorTint(int id, bool allow_default) const OVERRIDE;
+  virtual NSImage* GetNSImageNamed(int id) const OVERRIDE;
+  virtual NSColor* GetNSImageColorNamed(int id) const OVERRIDE;
+  virtual NSColor* GetNSColor(int id) const OVERRIDE;
+  virtual NSColor* GetNSColorTint(int id) const OVERRIDE;
   virtual NSGradient* GetNSGradient(int id) const OVERRIDE;
 
  private:
diff --git a/chrome/browser/ui/cocoa/download/background_theme.mm b/chrome/browser/ui/cocoa/download/background_theme.mm
index 9ee1d29..eb7ffcf 100644
--- a/chrome/browser/ui/cocoa/download/background_theme.mm
+++ b/chrome/browser/ui/cocoa/download/background_theme.mm
@@ -53,24 +53,23 @@
   return NULL;
 }
 
-NSImage* BackgroundTheme::GetNSImageNamed(int id, bool allow_default) const {
+NSImage* BackgroundTheme::GetNSImageNamed(int id) const {
   return nil;
 }
 
-NSColor* BackgroundTheme::GetNSImageColorNamed(int id,
-                                               bool allow_default) const {
+NSColor* BackgroundTheme::GetNSImageColorNamed(int id) const {
   return nil;
 }
 
-NSColor* BackgroundTheme::GetNSColor(int id, bool allow_default) const {
-  return provider_->GetNSColor(id, allow_default);
+NSColor* BackgroundTheme::GetNSColor(int id) const {
+  return provider_->GetNSColor(id);
 }
 
-NSColor* BackgroundTheme::GetNSColorTint(int id, bool allow_default) const {
+NSColor* BackgroundTheme::GetNSColorTint(int id) const {
   if (id == ThemeProperties::TINT_BUTTONS)
     return borderColor_.get();
 
-  return provider_->GetNSColorTint(id, allow_default);
+  return provider_->GetNSColorTint(id);
 }
 
 NSGradient* BackgroundTheme::GetNSGradient(int id) const {
diff --git a/chrome/browser/ui/cocoa/download/download_item_cell.mm b/chrome/browser/ui/cocoa/download/download_item_cell.mm
index 4da8b9b..96c30a0 100644
--- a/chrome/browser/ui/cocoa/download/download_item_cell.mm
+++ b/chrome/browser/ui/cocoa/download/download_item_cell.mm
@@ -414,7 +414,7 @@
       [[[self controlView] window] themeProvider];
   if ([self pressedWithDefaultThemeOnPart:part] || !themeProvider)
     return [NSColor alternateSelectedControlTextColor];
-  return themeProvider->GetNSColor(ThemeProperties::COLOR_BOOKMARK_TEXT, true);
+  return themeProvider->GetNSColor(ThemeProperties::COLOR_BOOKMARK_TEXT);
 }
 
 - (void)drawSecondaryTitleInRect:(NSRect)innerFrame {
diff --git a/chrome/browser/ui/cocoa/download/download_item_controller.mm b/chrome/browser/ui/cocoa/download/download_item_controller.mm
index c5f3ada..eeadce3 100644
--- a/chrome/browser/ui/cocoa/download/download_item_controller.mm
+++ b/chrome/browser/ui/cocoa/download/download_item_controller.mm
@@ -285,8 +285,7 @@
   if (!themeProvider)
     return;
 
-  NSColor* color =
-      themeProvider->GetNSColor(ThemeProperties::COLOR_TAB_TEXT, true);
+  NSColor* color = themeProvider->GetNSColor(ThemeProperties::COLOR_TAB_TEXT);
   [dangerousDownloadLabel_ setTextColor:color];
 }
 
diff --git a/chrome/browser/ui/cocoa/download/download_shelf_view.mm b/chrome/browser/ui/cocoa/download/download_shelf_view.mm
index a80420e..84be11e 100644
--- a/chrome/browser/ui/cocoa/download/download_shelf_view.mm
+++ b/chrome/browser/ui/cocoa/download/download_shelf_view.mm
@@ -37,7 +37,7 @@
   ui::ThemeProvider* themeProvider = [[self window] themeProvider];
   return themeProvider ? themeProvider->GetNSColor(
       isActive ? ThemeProperties::COLOR_TOOLBAR_STROKE :
-                 ThemeProperties::COLOR_TOOLBAR_STROKE_INACTIVE, true) :
+                 ThemeProperties::COLOR_TOOLBAR_STROKE_INACTIVE) :
       [NSColor blackColor];
 }
 
@@ -65,7 +65,7 @@
   if (themeProvider) {
     int resourceName = themeProvider->UsingDefaultTheme() ?
         ThemeProperties::COLOR_TOOLBAR_BEZEL : ThemeProperties::COLOR_TOOLBAR;
-    NSColor* highlightColor = themeProvider->GetNSColor(resourceName, true);
+    NSColor* highlightColor = themeProvider->GetNSColor(resourceName);
     if (highlightColor) {
       [highlightColor set];
       borderRect.origin.y -= [self cr_lineWidth];
diff --git a/chrome/browser/ui/cocoa/download/download_show_all_cell.mm b/chrome/browser/ui/cocoa/download/download_show_all_cell.mm
index d7f6d6b..879477e 100644
--- a/chrome/browser/ui/cocoa/download/download_show_all_cell.mm
+++ b/chrome/browser/ui/cocoa/download/download_show_all_cell.mm
@@ -96,7 +96,7 @@
       [[[self controlView] window] themeProvider];
   if (!themeProvider || [self pressedWithDefaultTheme])
     return [NSColor alternateSelectedControlTextColor];
-  return themeProvider->GetNSColor(ThemeProperties::COLOR_BOOKMARK_TEXT, true);
+  return themeProvider->GetNSColor(ThemeProperties::COLOR_BOOKMARK_TEXT);
 }
 
 - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView {
diff --git a/chrome/browser/ui/cocoa/framed_browser_window.mm b/chrome/browser/ui/cocoa/framed_browser_window.mm
index d53bd30..acf4ca4 100644
--- a/chrome/browser/ui/cocoa/framed_browser_window.mm
+++ b/chrome/browser/ui/cocoa/framed_browser_window.mm
@@ -423,7 +423,7 @@
     else
       themeImageID = IDR_THEME_FRAME_INACTIVE;
     if (themeProvider->HasCustomImage(IDR_THEME_FRAME))
-      themeImageColor = themeProvider->GetNSImageColorNamed(themeImageID, true);
+      themeImageColor = themeProvider->GetNSImageColorNamed(themeImageID);
   }
 
   // If no theme image, use a gradient if incognito.
@@ -487,8 +487,7 @@
       !popup) {
     overlayImage = themeProvider->
         GetNSImageNamed(active ? IDR_THEME_FRAME_OVERLAY :
-                                 IDR_THEME_FRAME_OVERLAY_INACTIVE,
-                        true);
+                                 IDR_THEME_FRAME_OVERLAY_INACTIVE);
   }
 
   if (overlayImage) {
diff --git a/chrome/browser/ui/cocoa/gradient_button_cell.mm b/chrome/browser/ui/cocoa/gradient_button_cell.mm
index 959e0d3..1935761 100644
--- a/chrome/browser/ui/cocoa/gradient_button_cell.mm
+++ b/chrome/browser/ui/cocoa/gradient_button_cell.mm
@@ -362,11 +362,12 @@
     if (!showClickedGradient)
       hoverAlpha *= 0.6;
   } else {
-    backgroundImageColor =
-        themeProvider ?
-          themeProvider->GetNSImageColorNamed(IDR_THEME_BUTTON_BACKGROUND,
-                                              false) :
-          nil;
+    backgroundImageColor = nil;
+    if (themeProvider &&
+        themeProvider->HasCustomImage(IDR_THEME_BUTTON_BACKGROUND)) {
+      backgroundImageColor =
+          themeProvider->GetNSImageColorNamed(IDR_THEME_BUTTON_BACKGROUND);
+    }
     useThemeGradient = backgroundImageColor ? YES : NO;
   }
 
@@ -444,9 +445,9 @@
   } else {
     strokeColor = themeProvider ? themeProvider->GetNSColor(
         active ? ThemeProperties::COLOR_TOOLBAR_BUTTON_STROKE :
-                 ThemeProperties::COLOR_TOOLBAR_BUTTON_STROKE_INACTIVE,
-        true) : [NSColor colorWithCalibratedWhite:0.0
-                                            alpha:0.3 * outerStrokeAlphaMult_];
+                 ThemeProperties::COLOR_TOOLBAR_BUTTON_STROKE_INACTIVE) :
+        [NSColor colorWithCalibratedWhite:0.0
+                                    alpha:0.3 * outerStrokeAlphaMult_];
   }
   [strokeColor setStroke];
 
@@ -559,8 +560,8 @@
     NSDivideRect(cellFrame, &borderRect, &contentRect, lineWidth, NSMaxXEdge);
     NSColor* stroke = themeProvider ? themeProvider->GetNSColor(
         active ? ThemeProperties::COLOR_TOOLBAR_BUTTON_STROKE :
-                 ThemeProperties::COLOR_TOOLBAR_BUTTON_STROKE_INACTIVE,
-        true) : [NSColor blackColor];
+                 ThemeProperties::COLOR_TOOLBAR_BUTTON_STROKE_INACTIVE) :
+        [NSColor blackColor];
 
     [[stroke colorWithAlphaComponent:0.2] set];
     NSRectFillUsingOperation(NSInsetRect(borderRect, 0, 2),
@@ -600,13 +601,13 @@
     ThemeService* themeProvider = static_cast<ThemeService*>(
         [[controlView window] themeProvider]);
     NSColor* color = themeProvider ?
-        themeProvider->GetNSColorTint(ThemeProperties::TINT_BUTTONS, true) :
+        themeProvider->GetNSColorTint(ThemeProperties::TINT_BUTTONS) :
         [NSColor blackColor];
 
     if (isTemplate && themeProvider && themeProvider->UsingDefaultTheme()) {
       base::scoped_nsobject<NSShadow> shadow([[NSShadow alloc] init]);
       [shadow.get() setShadowColor:themeProvider->GetNSColor(
-          ThemeProperties::COLOR_TOOLBAR_BEZEL, true)];
+          ThemeProperties::COLOR_TOOLBAR_BEZEL)];
       [shadow.get() setShadowOffset:NSMakeSize(0.0, -lineWidth)];
       [shadow setShadowBlurRadius:lineWidth];
       [shadow set];
diff --git a/chrome/browser/ui/cocoa/image_button_cell.mm b/chrome/browser/ui/cocoa/image_button_cell.mm
index 13dc59d..773c91d 100644
--- a/chrome/browser/ui/cocoa/image_button_cell.mm
+++ b/chrome/browser/ui/cocoa/image_button_cell.mm
@@ -165,7 +165,7 @@
   if (!themeProvider)
     return nil;
 
-  return themeProvider->GetNSImageNamed(imageID, true);
+  return themeProvider->GetNSImageNamed(imageID);
 }
 
 - (void)setIsMouseInside:(BOOL)isMouseInside {
diff --git a/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm b/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm
index 51fdb17..c86f463 100644
--- a/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm
+++ b/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm
@@ -56,8 +56,7 @@
   BOOL active = [[self window] isMainWindow];
   return themeProvider->GetNSColor(
       active ? ThemeProperties::COLOR_TOOLBAR_STROKE :
-               ThemeProperties::COLOR_TOOLBAR_STROKE_INACTIVE,
-      true);
+               ThemeProperties::COLOR_TOOLBAR_STROKE_INACTIVE);
 }
 
 - (void)drawRect:(NSRect)rect {
diff --git a/chrome/browser/ui/cocoa/notifications/OWNERS b/chrome/browser/ui/cocoa/notifications/OWNERS
index 967c65c..14fce2a 100644
--- a/chrome/browser/ui/cocoa/notifications/OWNERS
+++ b/chrome/browser/ui/cocoa/notifications/OWNERS
@@ -1 +1 @@
-johnnyg@chromium.org
+rsesek@chromium.org
diff --git a/chrome/browser/ui/cocoa/styled_text_field_cell.mm b/chrome/browser/ui/cocoa/styled_text_field_cell.mm
index fedd3fc..c1f53b2 100644
--- a/chrome/browser/ui/cocoa/styled_text_field_cell.mm
+++ b/chrome/browser/ui/cocoa/styled_text_field_cell.mm
@@ -93,8 +93,11 @@
   ThemeService* themeProvider =
       static_cast<ThemeService*>([[controlView window] themeProvider]);
   if (themeProvider) {
-    NSColor* backgroundImageColor =
-        themeProvider->GetNSImageColorNamed(IDR_THEME_BUTTON_BACKGROUND, false);
+    NSColor* backgroundImageColor = nil;
+    if (themeProvider->HasCustomImage(IDR_THEME_BUTTON_BACKGROUND)) {
+      backgroundImageColor =
+          themeProvider->GetNSImageColorNamed(IDR_THEME_BUTTON_BACKGROUND);
+    }
     if (backgroundImageColor) {
       // Set the phase to match window.
       NSRect trueRect = [controlView convertRect:cellFrame toView:nil];
@@ -114,8 +117,7 @@
     BOOL active = [[controlView window] isMainWindow];
     NSColor* strokeColor = themeProvider->GetNSColor(
         active ? ThemeProperties::COLOR_TOOLBAR_BUTTON_STROKE :
-                 ThemeProperties::COLOR_TOOLBAR_BUTTON_STROKE_INACTIVE,
-        true);
+                 ThemeProperties::COLOR_TOOLBAR_BUTTON_STROKE_INACTIVE);
     rect_path_utils::FrameRectWithInset(roundedCornerFlags, frame, 0.0, 0.0,
                                         radius, lineWidth, strokeColor);
   }
@@ -149,7 +151,7 @@
       themeProvider->UsingDefaultTheme()) {
 
     NSColor* bezelColor = themeProvider->GetNSColor(
-        ThemeProperties::COLOR_TOOLBAR_BEZEL, true);
+        ThemeProperties::COLOR_TOOLBAR_BEZEL);
     [[bezelColor colorWithAlphaComponent:0.5 / lineWidth] set];
     NSRect bezelRect = NSMakeRect(cellFrame.origin.x,
                                   NSMaxY(cellFrame) - lineWidth,
diff --git a/chrome/browser/ui/cocoa/tabs/tab_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_controller.mm
index 1006ef0..5f9bb2f 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_controller.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_controller.mm
@@ -359,16 +359,11 @@
 - (void)updateTitleColor {
   NSColor* titleColor = nil;
   ui::ThemeProvider* theme = [[[self view] window] themeProvider];
-  if (theme && ![self selected]) {
-    titleColor =
-        theme->GetNSColor(ThemeProperties::COLOR_BACKGROUND_TAB_TEXT,
-                          true);
-  }
+  if (theme && ![self selected])
+    titleColor = theme->GetNSColor(ThemeProperties::COLOR_BACKGROUND_TAB_TEXT);
   // Default to the selected text color unless told otherwise.
-  if (theme && !titleColor) {
-    titleColor = theme->GetNSColor(ThemeProperties::COLOR_TAB_TEXT,
-                                   true);
-  }
+  if (theme && !titleColor)
+    titleColor = theme->GetNSColor(ThemeProperties::COLOR_TAB_TEXT);
   [titleView_ setTextColor:titleColor ? titleColor : [NSColor textColor]];
 }
 
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
index 55ce2eb..c99c63f 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
@@ -1622,8 +1622,8 @@
         ui::ThemeProvider* theme = [[tabStripView_ window] themeProvider];
         if (theme && [tabController projecting]) {
           NSImage* projectorGlow =
-              theme->GetNSImageNamed(IDR_TAB_CAPTURE_GLOW, true);
-          NSImage* projector = theme->GetNSImageNamed(IDR_TAB_CAPTURE, true);
+              theme->GetNSImageNamed(IDR_TAB_CAPTURE_GLOW);
+          NSImage* projector = theme->GetNSImageNamed(IDR_TAB_CAPTURE);
 
           NSRect frame = NSMakeRect(0,
                                     0,
@@ -1641,8 +1641,8 @@
           iconView = projectingView;
         } else if (theme && chrome::ShouldShowRecordingIndicator(contents)) {
           // Create a masked favicon.
-          NSImage* mask = theme->GetNSImageNamed(IDR_TAB_RECORDING_MASK, true);
-          NSImage* recording = theme->GetNSImageNamed(IDR_TAB_RECORDING, true);
+          NSImage* mask = theme->GetNSImageNamed(IDR_TAB_RECORDING_MASK);
+          NSImage* recording = theme->GetNSImageNamed(IDR_TAB_RECORDING);
           NSImage* favIconMasked = CreateMaskedFaviconForRecording(
                                        [imageView image], mask, recording);
 
@@ -2270,7 +2270,7 @@
   NSImage* pressed = rb.GetNativeImageNamed(IDR_NEWTAB_BUTTON_P).ToNSImage();
 
   NSImage* foreground = ApplyMask(
-      theme->GetNSImageNamed(IDR_THEME_TAB_BACKGROUND, true), mask);
+      theme->GetNSImageNamed(IDR_THEME_TAB_BACKGROUND), mask);
 
   [[newTabButton_ cell] setImage:Overlay(foreground, normal, 1.0)
                   forButtonState:image_button_cell::kDefaultState];
@@ -2283,7 +2283,7 @@
   if (theme->UsingDefaultTheme()) {
     const CGFloat alpha = tabs::kImageNoFocusAlpha;
     NSImage* background = ApplyMask(
-        theme->GetNSImageNamed(IDR_THEME_TAB_BACKGROUND_INACTIVE, true), mask);
+        theme->GetNSImageNamed(IDR_THEME_TAB_BACKGROUND_INACTIVE), mask);
     [[newTabButton_ cell] setImage:Overlay(background, normal, alpha)
                     forButtonState:image_button_cell::kDefaultStateBackground];
     [[newTabButton_ cell] setImage:Overlay(background, hover, alpha)
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm
index e62eb67..1ac010a 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm
@@ -65,13 +65,13 @@
     bool active = [[self window] isKeyWindow] || [[self window] isMainWindow] ||
                   !themeProvider->UsingDefaultTheme();
     int resource_id = active ? IDR_THEME_TOOLBAR : IDR_THEME_TOOLBAR_INACTIVE;
-    [themeProvider->GetNSImageColorNamed(resource_id, true) set];
+    [themeProvider->GetNSImageColorNamed(resource_id) set];
     NSRectFill(
         NSMakeRect(NSMinX(dirtyRect), 0, NSWidth(dirtyRect), backgroundHeight));
   }
 
   // Draw the border bitmap, which is partially transparent.
-  NSImage* image = themeProvider->GetNSImageNamed(IDR_TOOLBAR_SHADE_TOP, true);
+  NSImage* image = themeProvider->GetNSImageNamed(IDR_TOOLBAR_SHADE_TOP);
   if (NSMinY(dirtyRect) >= [image size].height)
     return;
 
diff --git a/chrome/browser/ui/cocoa/tabs/tab_view.mm b/chrome/browser/ui/cocoa/tabs/tab_view.mm
index 99985d9..57c46a5 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_view.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_view.mm
@@ -297,8 +297,7 @@
   // theme.
   bool active = [[self window] isKeyWindow] || [[self window] isMainWindow] ||
                 !themeProvider->UsingDefaultTheme();
-  return themeProvider->GetNSImageColorNamed(
-      bitmapResources[active][selected], true);
+  return themeProvider->GetNSImageColorNamed(bitmapResources[active][selected]);
 }
 
 // Draws the active tab background.
diff --git a/chrome/browser/ui/extensions/application_launch.cc b/chrome/browser/ui/extensions/application_launch.cc
index 72b1c95..02112d1 100644
--- a/chrome/browser/ui/extensions/application_launch.cc
+++ b/chrome/browser/ui/extensions/application_launch.cc
@@ -6,13 +6,13 @@
 
 #include <string>
 
+#include "apps/launcher.h"
 #include "base/command_line.h"
 #include "base/metrics/histogram.h"
 #include "chrome/browser/app_mode/app_mode_utils.h"
 #include "chrome/browser/extensions/extension_prefs.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_system.h"
-#include "chrome/browser/extensions/platform_app_launcher.h"
 #include "chrome/browser/extensions/tab_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -20,6 +20,7 @@
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_tabstrip.h"
 #include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/extensions/app_metro_infobar_delegate_win.h"
 #include "chrome/browser/ui/host_desktop.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/web_applications/web_app.h"
@@ -342,7 +343,18 @@
   UMA_HISTOGRAM_ENUMERATION("Extensions.AppLaunchContainer", container, 100);
 
   if (extension->is_platform_app()) {
-    extensions::LaunchPlatformAppWithCommandLine(
+#if defined(OS_WIN)
+    // On Windows 8's single window Metro mode we can not launch platform apps.
+    // Offer to switch Chrome to desktop mode.
+    if (win8::IsSingleWindowMetroMode()) {
+      AppMetroInfoBarDelegateWin::Create(
+          profile, AppMetroInfoBarDelegateWin::LAUNCH_PACKAGED_APP,
+          extension->id());
+      return NULL;
+    }
+#endif
+
+    apps::LaunchPlatformAppWithCommandLine(
         profile, extension, params.command_line, params.current_directory);
     return NULL;
   }
diff --git a/chrome/browser/ui/gtk/constrained_web_dialog_delegate_gtk.cc b/chrome/browser/ui/gtk/constrained_web_dialog_delegate_gtk.cc
index 5ab07d3..c58ed62 100644
--- a/chrome/browser/ui/gtk/constrained_web_dialog_delegate_gtk.cc
+++ b/chrome/browser/ui/gtk/constrained_web_dialog_delegate_gtk.cc
@@ -34,7 +34,8 @@
       WebDialogDelegate* delegate,
       WebDialogWebContentsDelegate* tab_delegate)
       : ConstrainedWebDialogDelegateBase(
-            browser_context, delegate, tab_delegate) {}
+            browser_context, delegate, tab_delegate),
+        window_(NULL) {}
 
   // WebDialogWebContentsDelegate interface.
   virtual void CloseContents(WebContents* source) OVERRIDE {
diff --git a/chrome/browser/ui/gtk/gtk_theme_service.cc b/chrome/browser/ui/gtk/gtk_theme_service.cc
index e2272c4..76befd6 100644
--- a/chrome/browser/ui/gtk/gtk_theme_service.cc
+++ b/chrome/browser/ui/gtk/gtk_theme_service.cc
@@ -630,13 +630,6 @@
   return false;
 }
 
-void GtkThemeService::ClearAllThemeData() {
-  colors_.clear();
-  tints_.clear();
-
-  ThemeService::ClearAllThemeData();
-}
-
 void GtkThemeService::LoadThemePrefs() {
   // Initialize the values sent to webkit with the default values.
   // ThemeService::LoadThemePrefs() will replace them with values for the native
@@ -651,6 +644,9 @@
 }
 
 void GtkThemeService::NotifyThemeChanged() {
+  if (!ready_)
+    return;
+
   ThemeService::NotifyThemeChanged();
 
   // Notify all GtkChromeButtons of their new rendering mode:
@@ -683,6 +679,8 @@
 }
 
 void GtkThemeService::FreePlatformCaches() {
+  colors_.clear();
+  tints_.clear();
   ThemeService::FreePlatformCaches();
   STLDeleteValues(&gtk_images_);
 }
diff --git a/chrome/browser/ui/gtk/gtk_theme_service.h b/chrome/browser/ui/gtk/gtk_theme_service.h
index a7e3f90..18a840e 100644
--- a/chrome/browser/ui/gtk/gtk_theme_service.h
+++ b/chrome/browser/ui/gtk/gtk_theme_service.h
@@ -159,9 +159,6 @@
   typedef std::map<int, color_utils::HSL> TintMap;
   typedef std::map<int, gfx::Image*> ImageCache;
 
-  // Clears all the GTK color overrides.
-  virtual void ClearAllThemeData() OVERRIDE;
-
   // Load theme data from preferences, possibly picking colors from GTK.
   virtual void LoadThemePrefs() OVERRIDE;
 
diff --git a/chrome/browser/ui/search/instant_extended_interactive_uitest.cc b/chrome/browser/ui/search/instant_extended_interactive_uitest.cc
index 4f5757b..9518620 100644
--- a/chrome/browser/ui/search/instant_extended_interactive_uitest.cc
+++ b/chrome/browser/ui/search/instant_extended_interactive_uitest.cc
@@ -312,21 +312,14 @@
 
   void InstallThemeAndVerify(const std::string& theme_dir,
                              const std::string& theme_name) {
+    const base::FilePath theme_path = test_data_dir_.AppendASCII(theme_dir);
+    ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(
+        theme_path, 1, ExtensionBrowserTest::browser()));
     const extensions::Extension* theme =
         ThemeServiceFactory::GetThemeForProfile(
             ExtensionBrowserTest::browser()->profile());
-    // If there is already a theme installed, the current theme should be
-    // disabled and the new one installed + enabled.
-    int expected_change = theme ? 0 : 1;
-
-    const base::FilePath theme_path = test_data_dir_.AppendASCII(theme_dir);
-    ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(
-        theme_path, expected_change, ExtensionBrowserTest::browser()));
-    const extensions::Extension* new_theme =
-        ThemeServiceFactory::GetThemeForProfile(
-            ExtensionBrowserTest::browser()->profile());
-    ASSERT_NE(static_cast<extensions::Extension*>(NULL), new_theme);
-    ASSERT_EQ(new_theme->name(), theme_name);
+    ASSERT_NE(static_cast<extensions::Extension*>(NULL), theme);
+    ASSERT_EQ(theme->name(), theme_name);
   }
 
  private:
diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
index 481b780..d76ca8d 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
@@ -1047,7 +1047,7 @@
   // }
   StartupBrowserCreator browser_creator;
   browser()->profile()->GetPrefs()->SetBoolean(
-      prefs::kSyncPromoShowOnFirstRunAllowed, false);
+      prefs::kSignInPromoShowOnFirstRunAllowed, false);
 
   // Do a process-startup browser launch.
   CommandLine dummy(CommandLine::NO_PROGRAM);
@@ -1081,7 +1081,7 @@
   // }
   StartupBrowserCreator browser_creator;
   browser()->profile()->GetPrefs()->SetBoolean(
-      prefs::kSyncPromoShowOnFirstRunAllowed, true);
+      prefs::kSignInPromoShowOnFirstRunAllowed, true);
 
   // Do a process-startup browser launch.
   CommandLine dummy(CommandLine::NO_PROGRAM);
@@ -1117,7 +1117,7 @@
   StartupBrowserCreator browser_creator;
   browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
   browser()->profile()->GetPrefs()->SetBoolean(
-      prefs::kSyncPromoShowOnFirstRunAllowed, true);
+      prefs::kSignInPromoShowOnFirstRunAllowed, true);
 
   // Do a process-startup browser launch.
   CommandLine dummy(CommandLine::NO_PROGRAM);
@@ -1156,7 +1156,7 @@
   browser_creator.AddFirstRunTab(signin::GetPromoURL(signin::SOURCE_START_PAGE,
                                                      false));
   browser()->profile()->GetPrefs()->SetBoolean(
-      prefs::kSyncPromoShowOnFirstRunAllowed, true);
+      prefs::kSignInPromoShowOnFirstRunAllowed, true);
 
   // Do a process-startup browser launch.
   CommandLine dummy(CommandLine::NO_PROGRAM);
@@ -1195,7 +1195,7 @@
   browser_creator.AddFirstRunTab(GURL("new_tab_page"));
   browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
   browser()->profile()->GetPrefs()->SetBoolean(
-      prefs::kSyncPromoShowOnFirstRunAllowed, true);
+      prefs::kSignInPromoShowOnFirstRunAllowed, true);
 
   // Do a process-startup browser launch.
   CommandLine dummy(CommandLine::NO_PROGRAM);
@@ -1234,7 +1234,7 @@
   browser_creator.AddFirstRunTab(GURL("new_tab_page"));
   browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
   browser()->profile()->GetPrefs()->SetBoolean(
-      prefs::kSyncPromoShowOnFirstRunAllowed, false);
+      prefs::kSignInPromoShowOnFirstRunAllowed, false);
 
   // Do a process-startup browser launch.
   CommandLine dummy(CommandLine::NO_PROGRAM);
@@ -1271,7 +1271,7 @@
   StartupBrowserCreator browser_creator;
   browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
   browser()->profile()->GetPrefs()->SetBoolean(
-      prefs::kSyncPromoShowOnFirstRunAllowed, false);
+      prefs::kSignInPromoShowOnFirstRunAllowed, false);
 
   // Do a process-startup browser launch.
   CommandLine dummy(CommandLine::NO_PROGRAM);
@@ -1302,7 +1302,7 @@
   // }
   StartupBrowserCreator browser_creator;
   browser()->profile()->GetPrefs()->SetBoolean(
-      prefs::kSyncPromoShowOnFirstRunAllowed, true);
+      prefs::kSignInPromoShowOnFirstRunAllowed, true);
 
   // Set the following user policies:
   // * RestoreOnStartup = RestoreOnStartupIsURLs
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
index 1ec9507..cea4329 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -69,7 +69,6 @@
 #include "chrome/browser/ui/tabs/pinned_tab_codec.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/webui/ntp/core_app_launcher_handler.h"
-#include "chrome/browser/ui/webui/sync_promo/sync_promo_trial.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_result_codes.h"
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
index f58ba89..0ab3291 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
@@ -26,7 +26,6 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/favicon/favicon_types.h"
 #include "chrome/common/pref_names.h"
-#include "chrome/common/time_format.h"
 #include "grit/browser_resources.h"
 #include "grit/generated_resources.h"
 #include "grit/theme_resources.h"
diff --git a/chrome/browser/ui/views/autofill/autocheckout_bubble_views.cc b/chrome/browser/ui/views/autofill/autocheckout_bubble_views.cc
index 27451aa..3496ec6 100644
--- a/chrome/browser/ui/views/autofill/autocheckout_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/autocheckout_bubble_views.cc
@@ -16,6 +16,10 @@
 #include "ui/views/layout/layout_constants.h"
 #include "ui/views/widget/widget.h"
 
+#if defined(USE_AURA)
+#include "ui/aura/window.h"
+#endif
+
 namespace autofill {
 
 AutocheckoutBubbleViews::AutocheckoutBubbleViews(
@@ -136,6 +140,13 @@
 // static
 base::WeakPtr<AutocheckoutBubble> AutocheckoutBubble::Create(
     scoped_ptr<AutocheckoutBubbleController> controller) {
+#if defined(USE_AURA)
+  // If the page hasn't yet been attached to a RootWindow,
+  // Aura code for creating the bubble will fail.
+  if (!controller->native_window()->GetRootWindow())
+    return base::WeakPtr<AutocheckoutBubble>();
+#endif // defined(USE_AURA)
+
   views::Widget* widget = views::Widget::GetTopLevelWidgetForNativeView(
       controller->native_window());
   // The bubble owns itself.
diff --git a/chrome/browser/ui/views/autofill/autofill_credit_card_bubble_views.cc b/chrome/browser/ui/views/autofill/autofill_credit_card_bubble_views.cc
index fb2f238..48f7167 100644
--- a/chrome/browser/ui/views/autofill/autofill_credit_card_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/autofill_credit_card_bubble_views.cc
@@ -22,6 +22,19 @@
 
 namespace autofill {
 
+namespace {
+
+// Get the view this bubble will be anchored to via |controller|.
+views::View* GetAnchor(
+    const base::WeakPtr<AutofillCreditCardBubbleController>& controller) {
+  Browser* browser =
+      chrome::FindBrowserWithWebContents(controller->web_contents());
+  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
+  return browser_view->GetLocationBarView()->autofill_credit_card_view();
+}
+
+}  // namespace
+
 AutofillCreditCardBubbleViews::~AutofillCreditCardBubbleViews() {}
 
 void AutofillCreditCardBubbleViews::Show() {
@@ -29,6 +42,9 @@
   views::BubbleDelegateView::CreateBubble(this);
 
   GetWidget()->Show();
+
+  // This bubble doesn't render correctly on Windows without calling
+  // |SizeToContents()|. This must be called after showing the widget.
   SizeToContents();
 }
 
@@ -88,10 +104,7 @@
 
 AutofillCreditCardBubbleViews::AutofillCreditCardBubbleViews(
     const base::WeakPtr<AutofillCreditCardBubbleController>& controller)
-    : BubbleDelegateView(BrowserView::GetBrowserViewForBrowser(
-          chrome::FindBrowserWithWebContents(controller->web_contents()))->
-              GetLocationBarView()->autofill_credit_card_view(),
-        views::BubbleBorder::TOP_RIGHT),
+    : BubbleDelegateView(GetAnchor(controller), views::BubbleBorder::TOP_RIGHT),
       controller_(controller),
       weak_ptr_factory_(this) {
   // Match bookmarks bubble view's anchor view insets and margins.
diff --git a/chrome/browser/ui/views/autofill/autofill_dialog_views.cc b/chrome/browser/ui/views/autofill/autofill_dialog_views.cc
index 85c46de..40db3e6 100644
--- a/chrome/browser/ui/views/autofill/autofill_dialog_views.cc
+++ b/chrome/browser/ui/views/autofill/autofill_dialog_views.cc
@@ -1115,6 +1115,7 @@
       overlay_view_(NULL),
       button_strip_extra_view_(NULL),
       save_in_chrome_checkbox_(NULL),
+      save_in_chrome_checkbox_container_(NULL),
       button_strip_image_(NULL),
       autocheckout_steps_area_(NULL),
       autocheckout_progress_bar_view_(NULL),
@@ -1150,10 +1151,10 @@
   // care of deleting itself after calling DeleteDelegate().
   WebContentsModalDialogManager* web_contents_modal_dialog_manager =
       WebContentsModalDialogManager::FromWebContents(
-          delegate_->web_contents());
+          delegate_->GetWebContents());
   window_ = CreateWebContentsModalDialogViews(
       this,
-      delegate_->web_contents()->GetView()->GetNativeView(),
+      delegate_->GetWebContents()->GetView()->GetNativeView(),
       web_contents_modal_dialog_manager->delegate()->
           GetWebContentsModalDialogHost());
   web_contents_modal_dialog_manager->ShowDialog(window_->GetNativeView());
@@ -1163,7 +1164,7 @@
   // Listen for size changes on the browser.
   views::Widget* browser_widget =
       views::Widget::GetTopLevelWidgetForNativeView(
-          delegate_->web_contents()->GetView()->GetNativeView());
+          delegate_->GetWebContents()->GetView()->GetNativeView());
   observer_.Add(browser_widget);
 
   gfx::Image splash_image = delegate_->SplashPageImage();
@@ -1432,7 +1433,7 @@
     // bottom of the browser window.
     views::Widget* widget =
         views::Widget::GetTopLevelWidgetForNativeView(
-            delegate_->web_contents()->GetView()->GetNativeView());
+            delegate_->GetWebContents()->GetView()->GetNativeView());
     int browser_window_height =
         widget ? widget->GetContentsView()->bounds().height() : INT_MAX;
     const int kWindowDecorationHeight = 200;
@@ -1588,7 +1589,7 @@
     views::Widget* widget) {
   return CreateConstrainedStyleNonClientFrameView(
       widget,
-      delegate_->web_contents()->GetBrowserContext());
+      delegate_->GetWebContents()->GetBrowserContext());
 }
 
 void AutofillDialogViews::ButtonPressed(views::Button* sender,
@@ -1697,10 +1698,18 @@
   button_strip_extra_view_->SetLayoutManager(
       new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
 
+  save_in_chrome_checkbox_container_ = new views::View();
+  save_in_chrome_checkbox_container_->SetLayoutManager(
+      new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 7));
+  button_strip_extra_view_->AddChildView(save_in_chrome_checkbox_container_);
+
   save_in_chrome_checkbox_ =
       new views::Checkbox(delegate_->SaveLocallyText());
   save_in_chrome_checkbox_->SetChecked(true);
-  button_strip_extra_view_->AddChildView(save_in_chrome_checkbox_);
+  save_in_chrome_checkbox_container_->AddChildView(save_in_chrome_checkbox_);
+
+  save_in_chrome_checkbox_container_->AddChildView(
+      new TooltipIcon(delegate_->SaveLocallyTooltip()));
 
   button_strip_image_ = new views::ImageView();
   button_strip_extra_view_->AddChildView(button_strip_image_);
@@ -2188,7 +2197,7 @@
 }
 
 void AutofillDialogViews::UpdateButtonStripExtraView() {
-  save_in_chrome_checkbox_->SetVisible(
+  save_in_chrome_checkbox_container_->SetVisible(
       delegate_->ShouldOfferToSaveInChrome());
 
   gfx::Image image = delegate_->ButtonStripImage();
diff --git a/chrome/browser/ui/views/autofill/autofill_dialog_views.h b/chrome/browser/ui/views/autofill/autofill_dialog_views.h
index 31c9ae9..7afc8f5 100644
--- a/chrome/browser/ui/views/autofill/autofill_dialog_views.h
+++ b/chrome/browser/ui/views/autofill/autofill_dialog_views.h
@@ -596,6 +596,9 @@
   // database. It lives in |extra_view_|.
   views::Checkbox* save_in_chrome_checkbox_;
 
+  // Holds the above checkbox and an associated tooltip icon.
+  views::View* save_in_chrome_checkbox_container_;
+
   // Used to display an image in the button strip extra view.
   views::ImageView* button_strip_image_;
 
diff --git a/chrome/browser/ui/views/constrained_web_dialog_delegate_views.cc b/chrome/browser/ui/views/constrained_web_dialog_delegate_views.cc
index 917d28c..da98e43 100644
--- a/chrome/browser/ui/views/constrained_web_dialog_delegate_views.cc
+++ b/chrome/browser/ui/views/constrained_web_dialog_delegate_views.cc
@@ -39,7 +39,8 @@
       views::WebView* view)
       : ConstrainedWebDialogDelegateBase(
             browser_context, delegate, tab_delegate),
-        view_(view) {}
+        view_(view),
+        window_(NULL) {}
 
   virtual ~ConstrainedWebDialogDelegateViews() {}
 
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
index 9fd4fac..e469a3c 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
@@ -58,6 +58,19 @@
 // of just more vertical then horizontal.
 const int kSwipeVerticalThresholdMultiplier = 3;
 
+// The height in pixels of the region above the top edge of the display which
+// hosts the immersive fullscreen window in which mouse events are ignored
+// (cannot reveal or unreveal the top-of-window views).
+// See ShouldIgnoreMouseEventAtLocation() for more details.
+const int kHeightOfDeadRegionAboveTopContainer = 10;
+
+// The height in pixels of the region below the top edge of the display in which
+// the mouse can trigger revealing the top-of-window views. The height must be
+// greater than 1px because the top pixel is used to trigger moving the cursor
+// between displays if the user has a vertical display layout (primary display
+// above/below secondary display).
+const int kMouseRevealBoundsHeight = 3;
+
 // If |hovered| is true, moves the mouse above |view|. Moves it outside of
 // |view| otherwise.
 // Should not be called outside of tests.
@@ -255,7 +268,7 @@
       reveal_state_(CLOSED),
       revealed_lock_count_(0),
       tab_indicator_visibility_(TAB_INDICATORS_HIDE),
-      mouse_x_when_hit_top_(-1),
+      mouse_x_when_hit_top_in_screen_(-1),
       gesture_begun_(false),
       native_window_(NULL),
       animation_(new ui::SlideAnimation(this)),
@@ -695,30 +708,33 @@
   }
 
   gfx::Point location_in_screen = GetEventLocationInScreen(*event);
-  gfx::Rect top_container_bounds_in_screen =
-      top_container_->GetBoundsInScreen();
+  if (ShouldIgnoreMouseEventAtLocation(location_in_screen))
+    return;
 
   // Stop the timer if the cursor left the top edge or is on a different
-  // display.
-  if (location_in_screen.y() != top_container_bounds_in_screen.y() ||
-      location_in_screen.x() < top_container_bounds_in_screen.x() ||
-      location_in_screen.x() >= top_container_bounds_in_screen.right()) {
+  // display. The bounds of |top_container_|'s parent are used to infer the hit
+  // bounds because |top_container_| will be partially offscreen if it is
+  // animating closed.
+  gfx::Rect hit_bounds_in_screen =
+      top_container_->parent()->GetBoundsInScreen();
+  hit_bounds_in_screen.set_height(kMouseRevealBoundsHeight);
+  if (!hit_bounds_in_screen.Contains(location_in_screen)) {
     top_edge_hover_timer_.Stop();
     return;
   }
 
   // The cursor is now at the top of the screen. Consider the cursor "not
-  // moving" even if it moves a little bit in x, because users don't have
-  // perfect pointing precision.
-  int mouse_x = location_in_screen.x() - top_container_bounds_in_screen.x();
+  // moving" even if it moves a little bit because users don't have perfect
+  // pointing precision. (The y position is not tested because
+  // |hit_bounds_in_screen| is short.)
   if (top_edge_hover_timer_.IsRunning() &&
-      abs(mouse_x - mouse_x_when_hit_top_) <=
+      abs(location_in_screen.x() - mouse_x_when_hit_top_in_screen_) <=
           ImmersiveFullscreenConfiguration::
               immersive_mode_reveal_x_threshold_pixels())
     return;
 
   // Start the reveal if the cursor doesn't move for some amount of time.
-  mouse_x_when_hit_top_ = mouse_x;
+  mouse_x_when_hit_top_in_screen_ = location_in_screen.x();
   top_edge_hover_timer_.Stop();
   // Timer is stopped when |this| is destroyed, hence Unretained() is safe.
   top_edge_hover_timer_.Start(
@@ -769,7 +785,19 @@
     location_in_screen = aura::Env::GetInstance()->last_mouse_location();
   }
 
-  gfx::Rect hit_bounds_in_screen = top_container_->GetBoundsInScreen();
+  if ((!event || event->IsMouseEvent()) &&
+      ShouldIgnoreMouseEventAtLocation(location_in_screen)) {
+    return;
+  }
+
+  gfx::Rect hit_bounds_in_top_container = top_container_->GetVisibleBounds();
+  // TODO(tdanderson): Implement View::ConvertRectToScreen();
+  gfx::Point hit_bounds_in_screen_origin = hit_bounds_in_top_container.origin();
+  views::View::ConvertPointToScreen(top_container_,
+      &hit_bounds_in_screen_origin);
+  gfx::Rect hit_bounds_in_screen(hit_bounds_in_screen_origin,
+      hit_bounds_in_top_container.size());
+
   gfx::Rect find_bar_hit_bounds_in_screen = find_bar_visible_bounds_in_screen_;
 
   // Allow the cursor to move slightly off the top-of-window views before
@@ -1072,6 +1100,27 @@
   return SWIPE_NONE;
 }
 
+bool ImmersiveModeControllerAsh::ShouldIgnoreMouseEventAtLocation(
+    const gfx::Point& location) const {
+  // Ignore mouse events in the region immediately above the top edge of the
+  // display. This is to handle the case of a user with a vertical display
+  // layout (primary display above/below secondary display) and the immersive
+  // fullscreen window on the bottom display. It is really hard to trigger a
+  // reveal in this case because:
+  // - It is hard to stop the cursor in the top |kMouseRevealBoundsHeight|
+  //   pixels of the bottom display.
+  // - The cursor is warped to the top display if the cursor gets to the top
+  //   edge of the bottom display.
+  // Mouse events are ignored in the bottom few pixels of the top display
+  // (Mouse events in this region cannot start or end a reveal). This allows a
+  // user to overshoot the top of the bottom display and still reveal the
+  // top-of-window views.
+  gfx::Rect dead_region = top_container_->parent()->GetBoundsInScreen();
+  dead_region.set_y(dead_region.y() - kHeightOfDeadRegionAboveTopContainer);
+  dead_region.set_height(kHeightOfDeadRegionAboveTopContainer);
+  return dead_region.Contains(location);
+}
+
 bool ImmersiveModeControllerAsh::ShouldHandleGestureEvent(
     const gfx::Point& location) const {
   // All of the gestures that are of interest start in a region with left &
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.h b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.h
index 8ba1f2a..482c5b2 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.h
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.h
@@ -211,6 +211,12 @@
   // Returns the type of swipe given |event|.
   SwipeType GetSwipeType(ui::GestureEvent* event) const;
 
+  // Returns true if a mouse event at |location_in_screen| should be ignored.
+  // Ignored mouse events should not contribute to revealing or unrevealing the
+  // top-of-window views.
+  bool ShouldIgnoreMouseEventAtLocation(
+      const gfx::Point& location_in_screen) const;
+
   // True when |location| is "near" to the top container. When the top container
   // is not closed "near" means within the displayed bounds or above it. When
   // the top container is closed "near" means either within the displayed
@@ -253,9 +259,9 @@
   // Timer to track cursor being held at the top edge of the screen.
   base::OneShotTimer<ImmersiveModeController> top_edge_hover_timer_;
 
-  // The cursor x position in root coordinates when the cursor first hit
-  // the top edge of the screen.
-  int mouse_x_when_hit_top_;
+  // The cursor x position in screen coordinates when the cursor first hit the
+  // top edge of the screen.
+  int mouse_x_when_hit_top_in_screen_;
 
   // Tracks if the controller has seen a ET_GESTURE_SCROLL_BEGIN, without the
   // following events.
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_unittest.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_unittest.cc
index 3a206ab..d91bbd8 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_unittest.cc
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_unittest.cc
@@ -4,9 +4,12 @@
 
 #include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h"
 
+#include "ash/display/display_controller.h"
+#include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "chrome/browser/ui/immersive_fullscreen_configuration.h"
 #include "ui/aura/client/cursor_client.h"
+#include "ui/aura/env.h"
 #include "ui/aura/root_window.h"
 #include "ui/aura/test/event_generator.h"
 #include "ui/aura/window.h"
@@ -61,16 +64,12 @@
   views::View* top_container() { return top_container_; }
   MockImmersiveModeControllerDelegate* delegate() { return delegate_.get(); }
 
-  aura::test::EventGenerator* event_generator() {
-    return event_generator_.get();
-  }
-
   // Access to private data from the controller.
   bool top_edge_hover_timer_running() const {
     return controller_->top_edge_hover_timer_.IsRunning();
   }
   int mouse_x_when_hit_top() const {
-    return controller_->mouse_x_when_hit_top_;
+    return controller_->mouse_x_when_hit_top_in_screen_;
   }
 
   // ash::test::AshTestBase overrides:
@@ -83,8 +82,6 @@
     controller_.reset(new ImmersiveModeControllerAsh);
     delegate_.reset(new MockImmersiveModeControllerDelegate);
 
-    event_generator_.reset(new aura::test::EventGenerator(CurrentContext()));
-
     widget_ = new views::Widget();
     views::Widget::InitParams params;
     params.context = CurrentContext();
@@ -125,9 +122,9 @@
   // Move the mouse to the given coordinates. The coordinates should be in
   // |top_container_| coordinates.
   void MoveMouse(int x, int y) {
-    // Luckily, |top_container_| is at the top left of the root window so the
-    // provided coordinates are already in the coordinates of the root window.
-    event_generator_->MoveMouseTo(x, y);
+    gfx::Point screen_position(x, y);
+    views::View::ConvertPointToScreen(top_container_, &screen_position);
+    GetEventGenerator().MoveMouseTo(screen_position.x(), screen_position.y());
 
     // If the top edge timer started running as a result of the mouse move, run
     // the task which occurs after the timer delay. This reveals the
@@ -150,11 +147,13 @@
         break;
       }
       case MODALITY_TOUCH: {
-        // Luckily, |top_container_| is at the top left of the root window so
-        // |event_position| is already in the coordinates of the root window.
-        event_generator_->MoveTouch(event_position);
-        event_generator_->PressTouch();
-        event_generator_->ReleaseTouch();
+        gfx::Point screen_position = event_position;
+        views::View::ConvertPointToScreen(top_container_, &screen_position);
+
+        aura::test::EventGenerator& event_generator(GetEventGenerator());
+        event_generator.MoveTouch(event_position);
+        event_generator.PressTouch();
+        event_generator.ReleaseTouch();
         break;
       }
       case MODALITY_GESTURE: {
@@ -208,63 +207,74 @@
   ASSERT_TRUE(controller()->IsEnabled());
   ASSERT_FALSE(controller()->IsRevealed());
 
+  aura::test::EventGenerator& event_generator(GetEventGenerator());
+
+  gfx::Rect top_container_bounds_in_screen =
+      top_container()->GetBoundsInScreen();
+  // A position along the top edge of TopContainerView in screen coordinates.
+  gfx::Point top_edge_pos(top_container_bounds_in_screen.x() + 100,
+                          top_container_bounds_in_screen.y());
+
   // Mouse wheel event does nothing.
   ui::MouseEvent wheel(
-      ui::ET_MOUSEWHEEL, gfx::Point(), gfx::Point(), ui::EF_NONE);
-  event_generator()->Dispatch(&wheel);
+      ui::ET_MOUSEWHEEL, top_edge_pos, top_edge_pos, ui::EF_NONE);
+  event_generator.Dispatch(&wheel);
   EXPECT_FALSE(top_edge_hover_timer_running());
 
   // Move to top edge of screen starts hover timer running. We cannot use
   // MoveMouse() because MoveMouse() stops the timer if it started running.
-  event_generator()->MoveMouseTo(100, 0);
+  event_generator.MoveMouseTo(top_edge_pos);
   EXPECT_TRUE(top_edge_hover_timer_running());
-  EXPECT_EQ(100, mouse_x_when_hit_top());
+  EXPECT_EQ(top_edge_pos.x(), mouse_x_when_hit_top());
 
-  // Moving off the top edge stops it.
-  event_generator()->MoveMouseTo(100, 1);
+  // Moving |ImmersiveModeControllerAsh::kMouseRevealBoundsHeight| down from
+  // the top edge stops it.
+  event_generator.MoveMouseBy(0, 3);
   EXPECT_FALSE(top_edge_hover_timer_running());
 
   // Moving back to the top starts the timer again.
-  event_generator()->MoveMouseTo(100, 0);
+  event_generator.MoveMouseTo(top_edge_pos);
   EXPECT_TRUE(top_edge_hover_timer_running());
-  EXPECT_EQ(100, mouse_x_when_hit_top());
+  EXPECT_EQ(top_edge_pos.x(), mouse_x_when_hit_top());
 
   // Slight move to the right keeps the timer running for the same hit point.
-  event_generator()->MoveMouseTo(101, 0);
+  event_generator.MoveMouseBy(1, 0);
   EXPECT_TRUE(top_edge_hover_timer_running());
-  EXPECT_EQ(100, mouse_x_when_hit_top());
+  EXPECT_EQ(top_edge_pos.x(), mouse_x_when_hit_top());
 
   // Moving back to the left also keeps the timer running.
-  event_generator()->MoveMouseTo(100, 0);
+  event_generator.MoveMouseBy(-1, 0);
   EXPECT_TRUE(top_edge_hover_timer_running());
-  EXPECT_EQ(100, mouse_x_when_hit_top());
+  EXPECT_EQ(top_edge_pos.x(), mouse_x_when_hit_top());
 
   // Large move right restarts the timer (so it is still running) and considers
   // this a new hit at the top.
-  event_generator()->MoveMouseTo(499, 0);
+  event_generator.MoveMouseTo(top_edge_pos.x() + 100, top_edge_pos.y());
   EXPECT_TRUE(top_edge_hover_timer_running());
-  EXPECT_EQ(499, mouse_x_when_hit_top());
+  EXPECT_EQ(top_edge_pos.x() + 100, mouse_x_when_hit_top());
 
   // Moving off the top edge horizontally stops the timer.
   EXPECT_GT(CurrentContext()->bounds().width(), top_container()->width());
-  EXPECT_EQ(500, top_container()->width());
-  event_generator()->MoveMouseTo(500, 0);
+  event_generator.MoveMouseTo(top_container_bounds_in_screen.right(),
+                              top_container_bounds_in_screen.y());
   EXPECT_FALSE(top_edge_hover_timer_running());
 
   // Once revealed, a move just a little below the top container doesn't end a
   // reveal.
   AttemptReveal(MODALITY_MOUSE);
-  event_generator()->MoveMouseTo(0, top_container()->height() + 1);
+  event_generator.MoveMouseTo(top_container_bounds_in_screen.x(),
+                              top_container_bounds_in_screen.bottom() + 1);
   EXPECT_TRUE(controller()->IsRevealed());
 
   // Once revealed, clicking just below the top container ends the reveal.
-  event_generator()->ClickLeftButton();
+  event_generator.ClickLeftButton();
   EXPECT_FALSE(controller()->IsRevealed());
 
   // Moving a lot below the top container ends a reveal.
   AttemptReveal(MODALITY_MOUSE);
   EXPECT_TRUE(controller()->IsRevealed());
-  event_generator()->MoveMouseTo(0, top_container()->height() + 50);
+  event_generator.MoveMouseTo(top_container_bounds_in_screen.x(),
+                              top_container_bounds_in_screen.bottom() + 50);
   EXPECT_FALSE(controller()->IsRevealed());
 
   // The mouse position cannot cause a reveal when TopContainerView's widget
@@ -280,7 +290,8 @@
   AttemptReveal(MODALITY_MOUSE);
   EXPECT_TRUE(controller()->IsRevealed());
   widget->SetCapture(top_container());
-  event_generator()->MoveMouseTo(0, top_container()->height() + 51);
+  event_generator.MoveMouseTo(top_container_bounds_in_screen.x(),
+                              top_container_bounds_in_screen.bottom() + 51);
   EXPECT_TRUE(controller()->IsRevealed());
 
   // Releasing capture should end the reveal.
@@ -288,6 +299,83 @@
   EXPECT_FALSE(controller()->IsRevealed());
 }
 
+// Test mouse event processing for top-of-screen reveal triggering when the user
+// has a vertical display layout (primary display above/below secondary display)
+// and the immersive fullscreen window is on the bottom display.
+TEST_F(ImmersiveModeControllerAshTest, MouseEventsVerticalDisplayLayout) {
+  if (!SupportsMultipleDisplays())
+    return;
+
+  // Set up initial state.
+  UpdateDisplay("800x600,800x600");
+  ash::DisplayLayout display_layout(ash::DisplayLayout::TOP, 0);
+  ash::Shell::GetInstance()->display_controller()->SetLayoutForCurrentDisplays(
+      display_layout);
+
+  controller()->SetEnabled(true);
+  ASSERT_TRUE(controller()->IsEnabled());
+  ASSERT_FALSE(controller()->IsRevealed());
+
+  ash::Shell::RootWindowList root_windows = ash::Shell::GetAllRootWindows();
+  ASSERT_EQ(root_windows[0],
+            top_container()->GetWidget()->GetNativeWindow()->GetRootWindow());
+
+  gfx::Rect primary_root_window_bounds_in_screen =
+      root_windows[0]->GetBoundsInScreen();
+  // Do not set |x| to the root window's x position because the display's
+  // corners have special behavior.
+  int x = primary_root_window_bounds_in_screen.x() + 10;
+  // The y position of the top edge of the primary display.
+  int y_top_edge = primary_root_window_bounds_in_screen.y();
+
+  aura::test::EventGenerator& event_generator(GetEventGenerator());
+
+  // Moving right below the top edge starts the hover timer running. We
+  // cannot use MoveMouse() because MoveMouse() stops the timer if it started
+  // running.
+  event_generator.MoveMouseTo(x, y_top_edge + 1);
+  EXPECT_TRUE(top_edge_hover_timer_running());
+  EXPECT_EQ(y_top_edge + 1,
+            aura::Env::GetInstance()->last_mouse_location().y());
+
+  // The timer should continue running if the user moves the mouse to the top
+  // edge even though the mouse is warped to the secondary display.
+  event_generator.MoveMouseTo(x, y_top_edge);
+  EXPECT_TRUE(top_edge_hover_timer_running());
+  EXPECT_NE(y_top_edge,
+            aura::Env::GetInstance()->last_mouse_location().y());
+
+  // The timer should continue running if the user overshoots the top edge
+  // a bit.
+  event_generator.MoveMouseTo(x, y_top_edge - 2);
+  EXPECT_TRUE(top_edge_hover_timer_running());
+
+  // The timer should stop running if the user overshoots the top edge by
+  // a lot.
+  event_generator.MoveMouseTo(x, y_top_edge - 20);
+  EXPECT_FALSE(top_edge_hover_timer_running());
+
+  // The timer should not start if the user moves the mouse to the bottom of the
+  // secondary display without crossing the top edge first.
+  event_generator.MoveMouseTo(x, y_top_edge - 2);
+
+  // Reveal the top-of-window views by overshooting the top edge slightly.
+  event_generator.MoveMouseTo(x, y_top_edge + 1);
+  // MoveMouse() runs the timer task.
+  MoveMouse(x, y_top_edge - 2);
+  EXPECT_TRUE(controller()->IsRevealed());
+
+  // The top-of-window views should stay revealed if the user moves the mouse
+  // around in the bottom region of the secondary display.
+  event_generator.MoveMouseTo(x + 10, y_top_edge - 3);
+  EXPECT_TRUE(controller()->IsRevealed());
+
+  // The top-of-window views should hide if the user moves the mouse away from
+  // the bottom region of the secondary display.
+  event_generator.MoveMouseTo(x, y_top_edge - 20);
+  EXPECT_FALSE(controller()->IsRevealed());
+}
+
 // Test that hovering the mouse over the find bar does not end a reveal.
 TEST_F(ImmersiveModeControllerAshTest, FindBar) {
   // Set up initial state.
@@ -333,7 +421,7 @@
 
   // Similar to the TopContainerView, clicking the mouse even slightly off of
   // the find bar ends the reveal.
-  event_generator()->ClickLeftButton();
+  GetEventGenerator().ClickLeftButton();
   EXPECT_FALSE(controller()->IsRevealed());
 
   // Set the find bar bounds to empty. Hovering over the position previously
diff --git a/chrome/browser/ui/views/message_center/web_notification_tray_win.cc b/chrome/browser/ui/views/message_center/web_notification_tray_win.cc
index 54a99f4..a6c6ab9 100644
--- a/chrome/browser/ui/views/message_center/web_notification_tray_win.cc
+++ b/chrome/browser/ui/views/message_center/web_notification_tray_win.cc
@@ -38,8 +38,6 @@
   if (win_version == base::win::VERSION_PRE_XP)
     return;
 
-  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-
   // StatusIconWin uses NIIF_LARGE_ICON if the version is >= vista.  According
   // to http://msdn.microsoft.com/en-us/library/windows/desktop/bb773352.aspx:
   // This corresponds to the icon with dimensions SM_CXICON x SM_CYICON. If
diff --git a/chrome/browser/ui/webui/chromeos/imageburner/imageburner_ui.cc b/chrome/browser/ui/webui/chromeos/imageburner/imageburner_ui.cc
index 834a9d0..99125e9 100644
--- a/chrome/browser/ui/webui/chromeos/imageburner/imageburner_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/imageburner/imageburner_ui.cc
@@ -12,7 +12,6 @@
 #include "base/values.h"
 #include "chrome/browser/chromeos/imageburner/burn_controller.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/common/time_format.h"
 #include "chrome/common/url_constants.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
@@ -20,6 +19,7 @@
 #include "grit/browser_resources.h"
 #include "grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
 #include "ui/base/text/bytes_formatting.h"
 #include "url/gurl.h"
 
@@ -168,7 +168,7 @@
       const base::TimeDelta& time_remaining) OVERRIDE {
     const string16 time_remaining_text = l10n_util::GetStringFUTF16(
         IDS_IMAGEBURN_DOWNLOAD_TIME_REMAINING,
-        TimeFormat::TimeRemaining(time_remaining));
+        ui::TimeFormat::TimeRemaining(time_remaining));
     SendProgressSignal(progress_type, amount_finished, amount_total,
                        time_remaining_text);
   }
diff --git a/chrome/browser/ui/webui/cookies_tree_model_util.cc b/chrome/browser/ui/webui/cookies_tree_model_util.cc
index 109f0c7..bb1ac1a 100644
--- a/chrome/browser/ui/webui/cookies_tree_model_util.cc
+++ b/chrome/browser/ui/webui/cookies_tree_model_util.cc
@@ -17,6 +17,7 @@
 #include "content/public/browser/indexed_db_context.h"
 #include "grit/generated_resources.h"
 #include "net/cookies/canonical_cookie.h"
+#include "net/ssl/ssl_client_cert_type.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/text/bytes_formatting.h"
 #include "webkit/common/fileapi/file_system_types.h"
@@ -249,7 +250,7 @@
 
       dict->SetString(kKeyServerId, server_bound_cert.server_identifier());
       dict->SetString(kKeyCertType,
-                      ClientCertTypeToString(server_bound_cert.type()));
+                      ClientCertTypeToString(net::CLIENT_CERT_ECDSA_SIGN));
       dict->SetString(kKeyCreated, UTF16ToUTF8(
           base::TimeFormatFriendlyDateAndTime(
               server_bound_cert.creation_time())));
diff --git a/chrome/browser/ui/webui/downloads_dom_handler.cc b/chrome/browser/ui/webui/downloads_dom_handler.cc
index f107e2c..d9938b2 100644
--- a/chrome/browser/ui/webui/downloads_dom_handler.cc
+++ b/chrome/browser/ui/webui/downloads_dom_handler.cc
@@ -37,7 +37,6 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/fileicon_source.h"
 #include "chrome/common/pref_names.h"
-#include "chrome/common/time_format.h"
 #include "chrome/common/url_constants.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/download_item.h"
@@ -48,6 +47,7 @@
 #include "content/public/browser/web_ui.h"
 #include "grit/generated_resources.h"
 #include "net/base/net_util.h"
+#include "ui/base/l10n/time_format.h"
 #include "ui/gfx/image/image.h"
 
 #if defined(OS_CHROMEOS)
@@ -127,7 +127,7 @@
   file_value->SetInteger(
       "started", static_cast<int>(download_item->GetStartTime().ToTimeT()));
   file_value->SetString(
-      "since_string", TimeFormat::RelativeDate(
+      "since_string", ui::TimeFormat::RelativeDate(
           download_item->GetStartTime(), NULL));
   file_value->SetString(
       "date_string", base::TimeFormatShortDate(download_item->GetStartTime()));
diff --git a/chrome/browser/ui/webui/fileicon_source.cc b/chrome/browser/ui/webui/fileicon_source.cc
index b4a9b48..ee0cb11 100644
--- a/chrome/browser/ui/webui/fileicon_source.cc
+++ b/chrome/browser/ui/webui/fileicon_source.cc
@@ -13,7 +13,6 @@
 #include "base/strings/string_split.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/common/time_format.h"
 #include "grit/generated_resources.h"
 #include "net/base/escape.h"
 #include "third_party/skia/include/core/SkBitmap.h"
diff --git a/chrome/browser/ui/webui/history_ui.cc b/chrome/browser/ui/webui/history_ui.cc
index 2afeea8..7a3f570 100644
--- a/chrome/browser/ui/webui/history_ui.cc
+++ b/chrome/browser/ui/webui/history_ui.cc
@@ -40,7 +40,6 @@
 #include "chrome/browser/ui/webui/metrics_handler.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
-#include "chrome/common/time_format.h"
 #include "chrome/common/url_constants.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_source.h"
@@ -53,6 +52,7 @@
 #include "net/base/escape.h"
 #include "sync/protocol/history_delete_directive_specifics.pb.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
 #include "ui/base/resource/resource_bundle.h"
 
 #if defined(ENABLE_MANAGED_USERS)
@@ -192,7 +192,7 @@
 // indicator (e.g. today, yesterday).
 string16 getRelativeDateLocalized(const base::Time& visit_time) {
   base::Time midnight = base::Time::Now().LocalMidnight();
-  string16 date_str = TimeFormat::RelativeDate(visit_time, &midnight);
+  string16 date_str = ui::TimeFormat::RelativeDate(visit_time, &midnight);
   if (date_str.empty()) {
     date_str = base::TimeFormatFriendlyDate(visit_time);
   } else {
@@ -345,7 +345,7 @@
     result->SetString("snippet", snippet);
   } else {
     base::Time midnight = base::Time::Now().LocalMidnight();
-    string16 date_str = TimeFormat::RelativeDate(time, &midnight);
+    string16 date_str = ui::TimeFormat::RelativeDate(time, &midnight);
     if (date_str.empty()) {
       date_str = base::TimeFormatFriendlyDate(time);
     } else {
diff --git a/chrome/browser/ui/webui/inspect_ui.cc b/chrome/browser/ui/webui/inspect_ui.cc
index d1f550c..ad6488b 100644
--- a/chrome/browser/ui/webui/inspect_ui.cc
+++ b/chrome/browser/ui/webui/inspect_ui.cc
@@ -12,6 +12,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "chrome/browser/devtools/devtools_window.h"
@@ -74,6 +75,9 @@
 static const char kInitUICommand[]  = "init-ui";
 static const char kInspectCommand[]  = "inspect";
 static const char kTerminateCommand[]  = "terminate";
+static const char kReloadCommand[]  = "reload";
+static const char kOpenCommand[]  = "open";
+
 static const char kPortForwardingEnabledCommand[] =
     "set-port-forwarding-enabled";
 static const char kPortForwardingConfigCommand[] = "set-port-forwarding-config";
@@ -89,7 +93,7 @@
 static const char kAdbSerialField[] = "adbSerial";
 static const char kAdbModelField[] = "adbModel";
 static const char kAdbBrowserNameField[] = "adbBrowserName";
-static const char kAdbPageIdField[] = "adbPageId";
+static const char kAdbGlobalIdField[] = "adbGlobalId";
 static const char kAdbBrowsersField[] = "browsers";
 static const char kAdbPagesField[] = "pages";
 
@@ -178,12 +182,16 @@
   void HandleInitUICommand(const ListValue* args);
   void HandleInspectCommand(const ListValue* args);
   void HandleTerminateCommand(const ListValue* args);
+  void HandleReloadCommand(const ListValue* args);
+  void HandleOpenCommand(const ListValue* args);
   void HandlePortForwardingEnabledCommand(const ListValue* args);
   void HandlePortForwardingConfigCommand(const ListValue* args);
 
-  bool GetProcessAndRouteId(const ListValue* args,
-                            int* process_id,
-                            int* route_id);
+  static bool GetProcessAndRouteId(const ListValue* args,
+                                   int* process_id,
+                                   int* route_id);
+
+  static bool GetRemotePageId(const ListValue* args, std::string* page_id);
 
   InspectUI* inspect_ui_;
 
@@ -206,6 +214,12 @@
   web_ui()->RegisterMessageCallback(kPortForwardingConfigCommand,
       base::Bind(&InspectMessageHandler::HandlePortForwardingConfigCommand,
                  base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(kReloadCommand,
+      base::Bind(&InspectMessageHandler::HandleReloadCommand,
+                 base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(kOpenCommand,
+      base::Bind(&InspectMessageHandler::HandleOpenCommand,
+                 base::Unretained(this)));
 }
 
 void InspectMessageHandler::HandleInitUICommand(const ListValue*) {
@@ -217,17 +231,16 @@
   if (!profile)
     return;
 
+  std::string page_id;
+  if (GetRemotePageId(args, &page_id)) {
+    inspect_ui_->InspectRemotePage(page_id);
+    return;
+  }
+
   int process_id;
   int route_id;
   if (!GetProcessAndRouteId(args, &process_id, &route_id) || process_id == 0
       || route_id == 0) {
-    // Check for ADB page id
-    const DictionaryValue* data;
-    std::string page_id;
-    if (args->GetSize() == 1 && args->GetDictionary(0, &data) &&
-        data->GetString(kAdbPageIdField, &page_id)) {
-      inspect_ui_->InspectRemotePage(page_id);
-    }
     return;
   }
 
@@ -250,6 +263,12 @@
 }
 
 void InspectMessageHandler::HandleTerminateCommand(const ListValue* args) {
+  std::string page_id;
+  if (GetRemotePageId(args, &page_id)) {
+    inspect_ui_->CloseRemotePage(page_id);
+    return;
+  }
+
   int process_id;
   int route_id;
   if (!GetProcessAndRouteId(args, &process_id, &route_id))
@@ -259,6 +278,22 @@
       base::Bind(&TerminateWorker, process_id, route_id));
 }
 
+void InspectMessageHandler::HandleReloadCommand(const ListValue* args) {
+  std::string page_id;
+  if (GetRemotePageId(args, &page_id))
+    inspect_ui_->ReloadRemotePage(page_id);
+}
+
+void InspectMessageHandler::HandleOpenCommand(const ListValue* args) {
+  std::string browser_id;
+  std::string url;
+  if (args->GetSize() == 2 &&
+      args->GetString(0, &browser_id) &&
+      args->GetString(1, &url)) {
+    inspect_ui_->OpenRemotePage(browser_id, url);
+  }
+}
+
 bool InspectMessageHandler::GetProcessAndRouteId(const ListValue* args,
                                                  int* process_id,
                                                  int* route_id) {
@@ -295,6 +330,16 @@
     profile->GetPrefs()->Set(prefs::kDevToolsPortForwardingConfig, *dict_src);
 }
 
+bool InspectMessageHandler::GetRemotePageId(const ListValue* args,
+                                            std::string* page_id) {
+  const DictionaryValue* data;
+  if (args->GetSize() == 1 && args->GetDictionary(0, &data) &&
+      data->GetString(kAdbGlobalIdField, page_id)) {
+    return true;
+  }
+  return false;
+}
+
 }  // namespace
 
 class InspectUI::WorkerCreationDestructionListener
@@ -419,6 +464,31 @@
   }
 }
 
+void InspectUI::ReloadRemotePage(const std::string& id) {
+  RemotePages::iterator it = remote_pages_.find(id);
+  if (it != remote_pages_.end())
+    it->second->Reload();
+}
+
+void InspectUI::CloseRemotePage(const std::string& id) {
+  RemotePages::iterator it = remote_pages_.find(id);
+  if (it != remote_pages_.end())
+    it->second->Close();
+}
+
+void InspectUI::OpenRemotePage(const std::string& browser_id,
+                               const std::string& url) {
+  GURL gurl(url);
+  if (!gurl.is_valid()) {
+    gurl = GURL("http://" + url);
+    if (!gurl.is_valid())
+      return;
+  }
+  RemoteBrowsers::iterator it = remote_browsers_.find(browser_id);
+  if (it != remote_browsers_.end())
+    it->second->Open(gurl.spec());
+}
+
 void InspectUI::PopulateLists() {
   std::set<RenderViewHost*> tab_rvhs;
   for (TabContentsIterator it; !it.done(); it.Next())
@@ -504,36 +574,53 @@
 
 void InspectUI::RemoteDevicesChanged(
     DevToolsAdbBridge::RemoteDevices* devices) {
+  remote_browsers_.clear();
   remote_pages_.clear();
   ListValue device_list;
   for (DevToolsAdbBridge::RemoteDevices::iterator dit = devices->begin();
        dit != devices->end(); ++dit) {
-    DevToolsAdbBridge::RemoteDevice& device = *(dit->get());
+    DevToolsAdbBridge::RemoteDevice* device = dit->get();
     DictionaryValue* device_data = new DictionaryValue();
-    device_data->SetString(kAdbModelField, device.model());
-    device_data->SetString(kAdbSerialField, device.serial());
+    device_data->SetString(kAdbModelField, device->model());
+    device_data->SetString(kAdbSerialField, device->serial());
+    std::string device_id = base::StringPrintf(
+        "device:%s",
+        device->serial().c_str());
+    device_data->SetString(kAdbGlobalIdField, device_id);
     ListValue* browser_list = new ListValue();
     device_data->Set(kAdbBrowsersField, browser_list);
 
-    DevToolsAdbBridge::RemoteBrowsers& browsers = device.browsers();
+    DevToolsAdbBridge::RemoteBrowsers& browsers = device->browsers();
     for (DevToolsAdbBridge::RemoteBrowsers::iterator bit =
         browsers.begin(); bit != browsers.end(); ++bit) {
-      DevToolsAdbBridge::RemoteBrowser& browser = *(bit->get());
+      DevToolsAdbBridge::RemoteBrowser* browser = bit->get();
       DictionaryValue* browser_data = new DictionaryValue();
-      browser_data->SetString(kAdbBrowserNameField, browser.name());
+      browser_data->SetString(kAdbBrowserNameField, browser->name());
+      std::string browser_id = base::StringPrintf(
+          "browser:%s:%s:%s",
+          device->serial().c_str(),
+          browser->socket().c_str(),
+          browser->name().c_str());
+      browser_data->SetString(kAdbGlobalIdField, browser_id);
+      remote_browsers_[browser_id] = browser;
       ListValue* page_list = new ListValue();
       browser_data->Set(kAdbPagesField, page_list);
 
-      DevToolsAdbBridge::RemotePages& pages = browser.pages();
+      DevToolsAdbBridge::RemotePages& pages = browser->pages();
       for (DevToolsAdbBridge::RemotePages::iterator it =
           pages.begin(); it != pages.end(); ++it) {
         DevToolsAdbBridge::RemotePage* page =  it->get();
-        DictionaryValue* page_data = BuildTargetDescriptor(kAdbTargetType,
-            false, GURL(page->url()), page->title(), GURL(page->favicon_url()),
+        DictionaryValue* page_data = BuildTargetDescriptor(
+            kAdbTargetType, page->attached(),
+            GURL(page->url()), page->title(), GURL(page->favicon_url()),
             0, 0);
-        page_data->SetString(kAdbPageIdField, page->global_id());
+        std::string page_id = base::StringPrintf("page:%s:%s:%s",
+            device->serial().c_str(),
+            browser->socket().c_str(),
+            page->id().c_str());
+        page_data->SetString(kAdbGlobalIdField, page_id);
+        remote_pages_[page_id] = page;
         page_list->Append(page_data);
-        remote_pages_[page->global_id()] = page;
       }
       browser_list->Append(browser_data);
     }
diff --git a/chrome/browser/ui/webui/inspect_ui.h b/chrome/browser/ui/webui/inspect_ui.h
index 8f5b4d9..9647b76 100644
--- a/chrome/browser/ui/webui/inspect_ui.h
+++ b/chrome/browser/ui/webui/inspect_ui.h
@@ -24,7 +24,10 @@
   virtual ~InspectUI();
 
   void InitUI();
-  void InspectRemotePage(const std::string& id);
+  void InspectRemotePage(const std::string& page_id);
+  void CloseRemotePage(const std::string& page_id);
+  void ReloadRemotePage(const std::string& page_id);
+  void OpenRemotePage(const std::string& browser_id, const std::string& url);
 
  private:
   class WorkerCreationDestructionListener;
@@ -60,6 +63,10 @@
       RemotePages;
   RemotePages remote_pages_;
 
+  typedef std::map<std::string,
+      scoped_refptr<DevToolsAdbBridge::RemoteBrowser> > RemoteBrowsers;
+  RemoteBrowsers remote_browsers_;
+
   DISALLOW_COPY_AND_ASSIGN(InspectUI);
 };
 
diff --git a/chrome/browser/ui/webui/ntp/foreign_session_handler.cc b/chrome/browser/ui/webui/ntp/foreign_session_handler.cc
index 7c42a9b..daed59b 100644
--- a/chrome/browser/ui/webui/ntp/foreign_session_handler.cc
+++ b/chrome/browser/ui/webui/ntp/foreign_session_handler.cc
@@ -25,7 +25,6 @@
 #include "chrome/browser/ui/host_desktop.h"
 #include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
 #include "chrome/common/pref_names.h"
-#include "chrome/common/time_format.h"
 #include "chrome/common/url_constants.h"
 #include "components/user_prefs/pref_registry_syncable.h"
 #include "content/public/browser/notification_service.h"
@@ -36,6 +35,7 @@
 #include "content/public/browser/web_ui.h"
 #include "grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
 #include "ui/webui/web_ui_util.h"
 
 namespace browser_sync {
@@ -221,7 +221,8 @@
   // Return a time like "1 hour ago", "2 days ago", etc.
   base::Time now = base::Time::Now();
   // TimeElapsed does not support negative TimeDelta values, so then we use 0.
-  return TimeFormat::TimeElapsed(now < time ? base::TimeDelta() : now - time);
+  return ui::TimeFormat::TimeElapsed(
+      now < time ? base::TimeDelta() : now - time);
 }
 
 void ForeignSessionHandler::HandleGetForeignSessions(const ListValue* args) {
@@ -401,7 +402,7 @@
   dictionary->SetString("userVisibleTimestamp",
       last_synced < base::TimeDelta::FromMinutes(1) ?
           l10n_util::GetStringUTF16(IDS_SYNC_TIME_JUST_NOW) :
-          TimeFormat::TimeElapsed(last_synced));
+          ui::TimeFormat::TimeElapsed(last_synced));
   dictionary->SetInteger("sessionId", window.window_id.id());
   dictionary->Set("tabs", tab_values.release());
   return true;
diff --git a/chrome/browser/ui/webui/ntp/ntp_login_handler.cc b/chrome/browser/ui/webui/ntp/ntp_login_handler.cc
index 4774a9d..c890db3 100644
--- a/chrome/browser/ui/webui/ntp/ntp_login_handler.cc
+++ b/chrome/browser/ui/webui/ntp/ntp_login_handler.cc
@@ -186,7 +186,7 @@
 
 void NTPLoginHandler::HandleLoginMessageSeen(const ListValue* args) {
   Profile::FromWebUI(web_ui())->GetPrefs()->SetBoolean(
-      prefs::kSyncPromoShowNTPBubble, false);
+      prefs::kSignInPromoShowNTPBubble, false);
   NewTabUI* ntp_ui = NewTabUI::FromWebUIController(web_ui()->GetController());
   // When instant extended is enabled, there may not be a NewTabUI object.
   if (ntp_ui)
@@ -269,20 +269,17 @@
 void NTPLoginHandler::GetLocalizedValues(Profile* profile,
                                          DictionaryValue* values) {
   PrefService* prefs = profile->GetPrefs();
-  std::string error_message = prefs->GetString(prefs::kSyncPromoErrorMessage);
-  bool hide_sync = !prefs->GetBoolean(prefs::kSyncPromoShowNTPBubble);
+  bool hide_sync = !prefs->GetBoolean(prefs::kSignInPromoShowNTPBubble);
 
-  string16 message =
-      hide_sync ? string16() :
-          !error_message.empty() ? UTF8ToUTF16(error_message) :
-              l10n_util::GetStringFUTF16(IDS_SYNC_PROMO_NTP_BUBBLE_MESSAGE,
-                  l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME));
+  string16 message = hide_sync ? string16() :
+      l10n_util::GetStringFUTF16(IDS_SYNC_PROMO_NTP_BUBBLE_MESSAGE,
+          l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME));
 
   values->SetString("login_status_message", message);
   values->SetString("login_status_url",
       hide_sync ? std::string() : chrome::kSyncLearnMoreURL);
   values->SetString("login_status_advanced",
-      hide_sync || !error_message.empty() ? string16() :
+      hide_sync ? string16() :
       l10n_util::GetStringUTF16(IDS_SYNC_PROMO_NTP_BUBBLE_ADVANCED));
   values->SetString("login_status_dismiss",
       hide_sync ? string16() :
diff --git a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
index e2ccfe2..ef3e419 100644
--- a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
+++ b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
@@ -189,7 +189,8 @@
                                      callback);
   profile_pref_change_registrar_.Add(prefs::kShowBookmarkBar, callback);
   profile_pref_change_registrar_.Add(prefs::kNtpShownPage, callback);
-  profile_pref_change_registrar_.Add(prefs::kSyncPromoShowNTPBubble, callback);
+  profile_pref_change_registrar_.Add(prefs::kSignInPromoShowNTPBubble,
+                                     callback);
   profile_pref_change_registrar_.Add(prefs::kHideWebStoreIcon, callback);
 
   // Some tests don't have a local state.
diff --git a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc
index b2fff85..7cb13218 100644
--- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc
+++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc
@@ -48,7 +48,6 @@
 #include "chrome/browser/ui/host_desktop.h"
 #include "chrome/browser/ui/singleton_tabs.h"
 #include "chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.h"
-#include "chrome/common/time_format.h"
 #include "chromeos/chromeos_switches.h"
 #include "chromeos/network/device_state.h"
 #include "chromeos/network/favorite_state.h"
diff --git a/chrome/browser/ui/webui/options/options_ui.cc b/chrome/browser/ui/webui/options/options_ui.cc
index 077ad1b..0d86576 100644
--- a/chrome/browser/ui/webui/options/options_ui.cc
+++ b/chrome/browser/ui/webui/options/options_ui.cc
@@ -45,7 +45,6 @@
 #include "chrome/browser/ui/webui/options/startup_pages_handler.h"
 #include "chrome/browser/ui/webui/sync_setup_handler.h"
 #include "chrome/browser/ui/webui/theme_source.h"
-#include "chrome/common/time_format.h"
 #include "chrome/common/url_constants.h"
 #include "content/public/browser/notification_types.h"
 #include "content/public/browser/render_view_host.h"
diff --git a/chrome/browser/ui/webui/performance_monitor/performance_monitor_handler.cc b/chrome/browser/ui/webui/performance_monitor/performance_monitor_handler.cc
index 118452f..333ecb1 100644
--- a/chrome/browser/ui/webui/performance_monitor/performance_monitor_handler.cc
+++ b/chrome/browser/ui/webui/performance_monitor/performance_monitor_handler.cc
@@ -263,7 +263,6 @@
 
       for (DictionaryValue::Iterator data(*(*event)->data()); !data.IsAtEnd();
            data.Advance()) {
-        std::string localized_key;
         Value* value = NULL;
 
         // The property 'eventType' is set in HandleGetEvents as part of the
diff --git a/chrome/browser/ui/webui/policy_ui.cc b/chrome/browser/ui/webui/policy_ui.cc
index c1c5fc4..c514db3 100644
--- a/chrome/browser/ui/webui/policy_ui.cc
+++ b/chrome/browser/ui/webui/policy_ui.cc
@@ -33,7 +33,6 @@
 #include "chrome/browser/policy/profile_policy_connector_factory.h"
 #include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/common/time_format.h"
 #include "chrome/common/url_constants.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
@@ -46,6 +45,7 @@
 #include "grit/generated_resources.h"
 #include "policy/policy_constants.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
 
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/login/user_manager.h"
@@ -153,11 +153,11 @@
   dict->SetString("clientId", client_id);
   dict->SetString("username", username);
   dict->SetString("refreshInterval",
-                  TimeFormat::TimeRemainingShort(refresh_interval));
+                  ui::TimeFormat::TimeRemainingShort(refresh_interval));
   dict->SetString("timeSinceLastRefresh", last_refresh_time.is_null() ?
       l10n_util::GetStringUTF16(IDS_POLICY_NEVER_FETCHED) :
-      TimeFormat::TimeElapsed(base::Time::NowFromSystemTime() -
-                              last_refresh_time));
+      ui::TimeFormat::TimeElapsed(base::Time::NowFromSystemTime() -
+                                  last_refresh_time));
 }
 
 void ExtractDomainFromUsername(base::DictionaryValue* dict) {
diff --git a/chrome/browser/ui/webui/sync_promo/OWNERS b/chrome/browser/ui/webui/sync_promo/OWNERS
deleted file mode 100644
index 1a98f5f..0000000
--- a/chrome/browser/ui/webui/sync_promo/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-dbeam@chromium.org
-rogerta@chromium.org
-sail@chromium.org
diff --git a/chrome/browser/ui/webui/sync_promo/sync_promo_trial.cc b/chrome/browser/ui/webui/sync_promo/sync_promo_trial.cc
deleted file mode 100644
index 4f8afac..0000000
--- a/chrome/browser/ui/webui/sync_promo/sync_promo_trial.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/sync_promo/sync_promo_trial.h"
-
-#include "base/logging.h"
-#include "chrome/browser/metrics/metrics_service.h"
-#include "chrome/browser/signin/signin_promo.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_ui.h"
-
-namespace {
-
-enum {
-  UMA_START_PAGE_SHOWN = 0,
-  UMA_START_PAGE_SIGNED_IN,
-  UMA_NTP_LINK_SHOWN,
-  UMA_NTP_LINK_SIGNED_IN,
-  UMA_MENU_SHOWN,
-  UMA_MENU_SIGNED_IN,
-  UMA_SETTINGS_SHOWN,
-  UMA_SETTINGS_SIGNED_IN,
-  UMA_EXTENSION_INSTALL_BUBBLE_SHOWN,
-  UMA_EXTENSION_INSTALL_BUBBLE_SIGNED_IN,
-  UMA_UNKNOWN_SHOWN,
-  UMA_UNKNOWN_SIGNED_IN,
-  UMA_WEBSTORE_INSTALL_SHOWN,
-  UMA_WEBSTORE_INSTALL_SIGNED_IN,
-  UMA_APP_LAUNCHER_SHOWN,
-  UMA_APP_LAUNCHER_SIGNED_IN,
-  UMA_APPS_PAGE_LINK_SHOWN,
-  UMA_APPS_PAGE_LINK_SIGNED_IN,
-  UMA_BOOKMARK_BUBBLE_SHOWN,
-  UMA_BOOKMARK_BUBBLE_SIGNED_IN,
-  UMA_MAX,
-};
-
-}  // namespace
-
-namespace sync_promo_trial {
-
-void RecordUserShownPromo(content::WebUI* web_ui) {
-  signin::Source source =
-      signin::GetSourceForPromoURL(web_ui->GetWebContents()->GetURL());
-  int uma = 0;
-  switch (source) {
-    case signin::SOURCE_START_PAGE:
-      uma = UMA_START_PAGE_SHOWN;
-      break;
-    case signin::SOURCE_NTP_LINK:
-      uma = UMA_NTP_LINK_SHOWN;
-      break;
-    case signin::SOURCE_MENU:
-      uma = UMA_MENU_SHOWN;
-      break;
-    case signin::SOURCE_SETTINGS:
-      uma = UMA_SETTINGS_SHOWN;
-      break;
-    case signin::SOURCE_EXTENSION_INSTALL_BUBBLE:
-      uma = UMA_EXTENSION_INSTALL_BUBBLE_SHOWN;
-      break;
-    case signin::SOURCE_WEBSTORE_INSTALL:
-      uma = UMA_WEBSTORE_INSTALL_SHOWN;
-      break;
-    case signin::SOURCE_APP_LAUNCHER:
-      uma = UMA_APP_LAUNCHER_SHOWN;
-      break;
-    case signin::SOURCE_APPS_PAGE_LINK:
-      uma = UMA_APPS_PAGE_LINK_SHOWN;
-      break;
-    case signin::SOURCE_BOOKMARK_BUBBLE:
-      uma = UMA_BOOKMARK_BUBBLE_SHOWN;
-      break;
-    case signin::SOURCE_UNKNOWN:
-      uma = UMA_UNKNOWN_SHOWN;
-      break;
-    default:
-      // If this assert hits, then the signin::Source enum has
-      // changed and the UMA enum above, this switch statement and
-      // histograms.xml all need to be updated to reflect that.
-      COMPILE_ASSERT(signin::SOURCE_UNKNOWN == 9,
-                     kSourceEnumHasChangedButNotThisSwitchStatement);
-      NOTREACHED();
-      break;
-  }
-  UMA_HISTOGRAM_ENUMERATION("SyncPromo.ShowAndSignIn", uma, UMA_MAX);
-}
-
-void RecordUserSignedIn(content::WebUI* web_ui) {
-  signin::Source source =
-      signin::GetSourceForPromoURL(web_ui->GetWebContents()->GetURL());
-  int uma = 0;
-  switch (source) {
-    case signin::SOURCE_START_PAGE:
-      uma = UMA_START_PAGE_SIGNED_IN;
-      break;
-    case signin::SOURCE_NTP_LINK:
-      uma = UMA_NTP_LINK_SIGNED_IN;
-      break;
-    case signin::SOURCE_MENU:
-      uma = UMA_MENU_SIGNED_IN;
-      break;
-    case signin::SOURCE_SETTINGS:
-      uma = UMA_SETTINGS_SIGNED_IN;
-      break;
-    case signin::SOURCE_EXTENSION_INSTALL_BUBBLE:
-      uma = UMA_EXTENSION_INSTALL_BUBBLE_SIGNED_IN;
-      break;
-    case signin::SOURCE_WEBSTORE_INSTALL:
-      uma = UMA_WEBSTORE_INSTALL_SIGNED_IN;
-      break;
-    case signin::SOURCE_APP_LAUNCHER:
-      uma = UMA_APP_LAUNCHER_SIGNED_IN;
-      break;
-    case signin::SOURCE_APPS_PAGE_LINK:
-      uma = UMA_APPS_PAGE_LINK_SIGNED_IN;
-      break;
-    case signin::SOURCE_BOOKMARK_BUBBLE:
-      uma = UMA_BOOKMARK_BUBBLE_SIGNED_IN;
-      break;
-    case signin::SOURCE_UNKNOWN:
-      uma = UMA_UNKNOWN_SIGNED_IN;
-      break;
-    default:
-      // This switch statement needs to be updated when the enum Source changes.
-      COMPILE_ASSERT(signin::SOURCE_UNKNOWN == 9,
-                     kSourceEnumHasChangedButNotThisSwitchStatement);
-      NOTREACHED();
-      break;
-  }
-  UMA_HISTOGRAM_ENUMERATION("SyncPromo.ShowAndSignIn", uma, UMA_MAX);
-}
-
-}  // namespace sync_promo_trial
diff --git a/chrome/browser/ui/webui/sync_promo/sync_promo_trial.h b/chrome/browser/ui/webui/sync_promo/sync_promo_trial.h
deleted file mode 100644
index de0820e..0000000
--- a/chrome/browser/ui/webui/sync_promo/sync_promo_trial.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_SYNC_PROMO_SYNC_PROMO_TRIAL_H_
-#define CHROME_BROWSER_UI_WEBUI_SYNC_PROMO_SYNC_PROMO_TRIAL_H_
-
-#include "base/basictypes.h"
-
-class Profile;
-namespace content {
-class WebUI;
-}
-
-// TODO(fdoray): This file should be moved to chrome/browser/signin.
-namespace sync_promo_trial {
-
-// Records that the user was shown the sync promo for any currently running sync
-// promo trials. |web_ui| is the web UI where the promo was shown.
-void RecordUserShownPromo(content::WebUI* web_ui);
-
-// Records that the user signed into sync for any currently running sync promo
-// trials. |web_ui| is the web UI where the user signed into sync.
-void RecordUserSignedIn(content::WebUI* web_ui);
-
-}  // namespace sync_promo_trial
-
-#endif  // CHROME_BROWSER_UI_WEBUI_SYNC_PROMO_SYNC_PROMO_TRIAL_H_
diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp
index 18493f8..f9334b1 100644
--- a/chrome/chrome.gyp
+++ b/chrome/chrome.gyp
@@ -192,6 +192,8 @@
             'browser/devtools/devtools_file_helper.h',
             'browser/devtools/devtools_file_system_indexer.cc',
             'browser/devtools/devtools_file_system_indexer.h',
+            'browser/devtools/devtools_protocol.cc',
+            'browser/devtools/devtools_protocol.h',
             'browser/devtools/devtools_toggle_action.h',
             'browser/devtools/devtools_window.cc',
             'browser/devtools/devtools_window.h',
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 01d77ee..dc86b55 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -985,6 +985,8 @@
         'browser/media/webrtc_log_uploader.h',
         'browser/media/webrtc_logging_handler_host.cc',
         'browser/media/webrtc_logging_handler_host.h',
+        'browser/media_galleries/fileapi/av_scanning_file_validator.cc',
+        'browser/media_galleries/fileapi/av_scanning_file_validator.h',
         'browser/media_galleries/fileapi/itunes_finder.cc',
         'browser/media_galleries/fileapi/itunes_finder.h',
         'browser/media_galleries/fileapi/itunes_finder_mac.h',
@@ -2178,6 +2180,8 @@
         'browser/sync_file_system/drive_backend/remote_sync_delegate.h',
         'browser/sync_file_system/drive_backend/remote_sync_operation_resolver.cc',
         'browser/sync_file_system/drive_backend/remote_sync_operation_resolver.h',
+        'browser/sync_file_system/drive_backend/tracker_set.cc',
+        'browser/sync_file_system/drive_backend/tracker_set.h',
         'browser/sync_file_system/file_change.cc',
         'browser/sync_file_system/file_change.h',
         'browser/sync_file_system/file_status_observer.h',
diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi
index 79881ee..6f7425d 100644
--- a/chrome/chrome_browser_extensions.gypi
+++ b/chrome/chrome_browser_extensions.gypi
@@ -282,6 +282,14 @@
         'browser/extensions/api/location/location_api.h',
         'browser/extensions/api/location/location_manager.cc',
         'browser/extensions/api/location/location_manager.h',
+        'browser/extensions/api/log_private/filter_handler.cc',
+        'browser/extensions/api/log_private/filter_handler.h',
+        'browser/extensions/api/log_private/log_parser.cc',
+        'browser/extensions/api/log_private/log_parser.h',
+        'browser/extensions/api/log_private/log_private_api.h',
+        'browser/extensions/api/log_private/log_private_api_nonchromeos.cc',
+        'browser/extensions/api/log_private/syslog_parser.cc',
+        'browser/extensions/api/log_private/syslog_parser.h',
         'browser/extensions/api/management/management_api.cc',
         'browser/extensions/api/management/management_api.h',
         'browser/extensions/api/management/management_api_constants.cc',
@@ -723,8 +731,6 @@
         'browser/extensions/pending_extension_manager.h',
         'browser/extensions/permissions_updater.cc',
         'browser/extensions/permissions_updater.h',
-        'browser/extensions/platform_app_launcher.cc',
-        'browser/extensions/platform_app_launcher.h',
         'browser/extensions/plugin_manager.cc',
         'browser/extensions/plugin_manager.h',
         'browser/extensions/process_map.cc',
@@ -751,6 +757,7 @@
         'browser/extensions/suggest_permission_util.cc',
         'browser/extensions/api/system_info/system_info_api.cc',
         'browser/extensions/api/system_info/system_info_api.h',
+        'browser/extensions/api/system_info/system_info_provider.cc',
         'browser/extensions/api/system_info/system_info_provider.h',
         'browser/extensions/api/system_private/system_private_api.cc',
         'browser/extensions/api/system_private/system_private_api.h',
@@ -806,8 +813,9 @@
           ],
           'sources!': [
             'browser/extensions/api/audio/audio_service.cc',
-            'browser/extensions/api/feedback_private/feedback_service_nonchromeos.cc',
             'browser/extensions/api/diagnostics/diagnostics_api_nonchromeos.cc',
+            'browser/extensions/api/feedback_private/feedback_service_nonchromeos.cc',
+            'browser/extensions/api/log_private/log_private_api_nonchromeos.cc',
             'browser/extensions/api/networking_private/networking_private_api_nonchromeos.cc',
             'browser/extensions/default_apps.cc',
             'browser/extensions/default_apps.h',
@@ -817,6 +825,7 @@
             'browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h',
             'browser/extensions/api/input_ime/input_ime_api.cc',
             'browser/extensions/api/input_ime/input_ime_api.h',
+            'browser/extensions/api/log_private/log_private_api_chromeos.cc',
             'browser/extensions/api/rtc_private/rtc_private_api.cc',
             'browser/extensions/api/rtc_private/rtc_private_api.h',
             'browser/extensions/api/terminal/terminal_extension_helper.cc',
@@ -989,8 +998,6 @@
             'browser/extensions/extension_error_ui_default.cc',
             'browser/extensions/extension_error_ui_default.h',
             'browser/extensions/extension_tab_util.cc',
-            'browser/extensions/platform_app_launcher.cc',
-            'browser/extensions/platform_app_launcher.h',
           ],
         }],
         ['chrome_multiple_dll!=1', {
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi
index c9b6885..ea97dd7 100644
--- a/chrome/chrome_browser_ui.gypi
+++ b/chrome/chrome_browser_ui.gypi
@@ -2355,8 +2355,6 @@
         'browser/ui/webui/sync_file_system_internals/sync_file_system_internals_ui.h',
         'browser/ui/webui/sync_internals_ui.cc',
         'browser/ui/webui/sync_internals_ui.h',
-        'browser/ui/webui/sync_promo/sync_promo_trial.cc',
-        'browser/ui/webui/sync_promo/sync_promo_trial.h',
         'browser/ui/webui/sync_setup_handler.cc',
         'browser/ui/webui/sync_setup_handler.h',
         'browser/ui/webui/task_manager/task_manager_dialog.cc',
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi
index d510065..bf7f2ae 100644
--- a/chrome/chrome_common.gypi
+++ b/chrome/chrome_common.gypi
@@ -455,8 +455,6 @@
         'common/switch_utils.h',
         'common/thumbnail_score.cc',
         'common/thumbnail_score.h',
-        'common/time_format.cc',
-        'common/time_format.h',
         'common/translate/language_detection_details.cc',
         'common/translate/language_detection_details.h',
         'common/translate/language_detection_util.cc',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 5de1502..79f7a73 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -30,6 +30,7 @@
         '../testing/gmock.gyp:gmock',
         '../testing/gtest.gyp:gtest',
         '../third_party/zlib/zlib.gyp:zlib',
+        '../ui/message_center/message_center.gyp:message_center_test_support',
       ],
       'export_dependent_settings': [
         'app/policy/cloud_policy_codegen.gyp:policy_test_support',
@@ -645,6 +646,7 @@
         'browser/chromeos/drive/webkit_file_stream_reader_impl_unittest.cc',
         'browser/chromeos/extensions/default_app_order_unittest.cc',
         'browser/chromeos/extensions/file_manager/desktop_notifications_unittest.cc',
+        'browser/chromeos/extensions/file_manager/file_watcher_unittest.cc',
         'browser/chromeos/extensions/wallpaper_private_api_unittest.cc',
         'browser/chromeos/external_metrics_unittest.cc',
         'browser/chromeos/fileapi/file_access_permissions_unittest.cc',
@@ -791,6 +793,7 @@
         'browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc',
         'browser/extensions/api/identity/identity_mint_queue_unittest.cc',
         'browser/extensions/api/idle/idle_api_unittest.cc',
+        'browser/extensions/api/log_private/syslog_parser_unittest.cc',
         'browser/extensions/api/messaging/native_message_process_host_unittest.cc',
         'browser/extensions/api/messaging/native_messaging_host_manifest_unittest.cc',
         'browser/extensions/api/omnibox/omnibox_unittest.cc',
@@ -997,6 +1000,7 @@
         'browser/net/url_info_unittest.cc',
         'browser/notifications/desktop_notification_service_unittest.cc',
         'browser/notifications/message_center_notifications_unittest_win.cc',
+        'browser/notifications/message_center_settings_controller_unittest.cc',
         'browser/notifications/sync_notifier/chrome_notifier_service_unittest.cc',
         'browser/notifications/sync_notifier/synced_notification_unittest.cc',
         'browser/notifications/sync_notifier/sync_notifier_test_utils.cc',
@@ -1762,7 +1766,6 @@
         'common/service_process_util_unittest.cc',
         'common/switch_utils_unittest.cc',
         'common/thumbnail_score_unittest.cc',
-        'common/time_format_unittest.cc',
         'common/translate/language_detection_util_unittest.cc',
         'common/translate/translate_common_metrics_unittest.cc',
         'common/translate/translate_util_unittest.cc',
@@ -2209,6 +2212,7 @@
           'sources!': [
             'browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc',
             'browser/net/gaia/gaia_oauth_fetcher_unittest.cc',
+            'browser/extensions/api/log_private/syslog_parser_unittest.cc',
           ],
         }],
         ['use_x11==1', {
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index d3d5d24..8119470 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -1491,10 +1491,6 @@
 
 // Uses the tablet specific UI components when available.
 const char kTabletUI[]                      = "tablet-ui";
-
-// Enables support for playing videos on Google Cast devices.
-const char kEnableCast[]                    = "enable-cast";
-
 #endif
 
 #if defined(USE_ASH)
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index 3b73862..3272ce5 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -408,7 +408,6 @@
 extern const char kEnableTranslate[];
 extern const char kFakeCloudPolicyType[];
 extern const char kTabletUI[];
-extern const char kEnableCast[];
 #endif
 
 #if defined(USE_ASH)
diff --git a/chrome/common/extensions/OWNERS b/chrome/common/extensions/OWNERS
index a32e240..c80762a 100644
--- a/chrome/common/extensions/OWNERS
+++ b/chrome/common/extensions/OWNERS
@@ -5,6 +5,7 @@
 jyasskin@chromium.org
 kalman@chromium.org
 koz@chromium.org
+mek@chromium.org
 miket@chromium.org
 mpcomplete@chromium.org
 yoz@chromium.org
diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json
index 2780ca1..d9075d7 100644
--- a/chrome/common/extensions/api/_api_features.json
+++ b/chrome/common/extensions/api/_api_features.json
@@ -308,6 +308,11 @@
     "dependencies": ["permission:location"],
     "contexts": ["blessed_extension"]
   },
+  "logPrivate": {
+    "dependencies": ["permission:logPrivate"],
+    "extension_types": ["extension", "packaged_app"],
+    "contexts": ["blessed_extension"]
+  },
   "management": {
     "dependencies": ["permission:management"],
     "contexts": ["blessed_extension"]
diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json
index 464645c..1c761cc 100644
--- a/chrome/common/extensions/api/_permission_features.json
+++ b/chrome/common/extensions/api/_permission_features.json
@@ -334,6 +334,11 @@
       "location": "component"
     }
   ],
+  "logPrivate": {
+    "channel": "dev",
+    "extension_types": ["extension", "packaged_app"],
+    "location": "component"
+  },
   "management": [
     {
       "channel": "stable",
diff --git a/chrome/common/extensions/api/api.gyp b/chrome/common/extensions/api/api.gyp
index f079337..465021a 100644
--- a/chrome/common/extensions/api/api.gyp
+++ b/chrome/common/extensions/api/api.gyp
@@ -66,6 +66,7 @@
           'idle.json',
           'infobars.json',
           'input_ime.json',
+          'log_private.idl',
           'management.json',
           'manifest_types.json',
           'media_galleries.idl',
@@ -123,6 +124,7 @@
         ['OS!="chromeos"', {
           'schema_files!': [
             'file_browser_handler_internal.json',
+            'log_private.idl',
             'rtc_private.idl',
           ],
         }],
diff --git a/chrome/common/extensions/api/audio.idl b/chrome/common/extensions/api/audio.idl
index 15efd77..ebf6585 100644
--- a/chrome/common/extensions/api/audio.idl
+++ b/chrome/common/extensions/api/audio.idl
@@ -2,8 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Use the <code>chrome.audio</code> API to query audio device configuration and
-// be notified when it changes.
+// The <code>chrome.audio</code> API is provided to allow users to
+// get information about and control the audio devices attached to the
+// system. This API is currently only implemented for ChromeOS.
 namespace audio {
 
   dictionary OutputDeviceInfo {
diff --git a/chrome/common/extensions/api/file_browser_private.json b/chrome/common/extensions/api/file_browser_private.json
index 7447974..98fb729 100644
--- a/chrome/common/extensions/api/file_browser_private.json
+++ b/chrome/common/extensions/api/file_browser_private.json
@@ -331,14 +331,14 @@
             "description": "Defines file transfer direction."
           },
           "processed": {
-            "type": "integer",
+            "type": "number",
             "optional": true,
-            "description": "Completed portion of the transfer operation."
+            "description": "Approximated completed portion of the transfer operation."
           },
           "total": {
-            "type": "integer",
+            "type": "number",
             "optional": true,
-            "description": "Total size (cost) of transfer operation."
+            "description": "Approximated total size of transfer operation."
           }
         }
       },
@@ -646,11 +646,6 @@
             "items": {"type": "string"}
           },
           {
-            "name": "id",
-            "type": "string",
-            "description": "File browser handler id as for internal tasks."
-          },
-          {
             "name": "callback",
             "type": "function",
             "parameters": [
diff --git a/chrome/common/extensions/api/log_private.idl b/chrome/common/extensions/api/log_private.idl
new file mode 100644
index 0000000..2194357
--- /dev/null
+++ b/chrome/common/extensions/api/log_private.idl
@@ -0,0 +1,52 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Use chrome.logPrivate API to retrieve log information from multiple
+// resources in a consistent format.
+namespace logPrivate {
+
+  // A filter class that filters log entries by different fields
+  dictionary Filter {
+    // Only logs from |sources| will be returned.
+    DOMString[] sources;
+    // Only logs created in [|start_timestamp|, |end_timestamp|] will
+    // be returned.
+    double start_timestamp;
+    double end_timestamp;
+    // Only logs have process name in |process| will be returned.
+    DOMString[] process;
+    //  Only logs have level in |level| will be returned.
+    DOMString[] level;
+  };
+
+  // The class that contains log information.
+  dictionary LogEntry {
+    // The time of the log in milliseconds.
+    double timestamp;
+    // The raw text of log.
+    DOMString full_entry;
+    // The name of the process that the log associated with.
+    DOMString process;
+    // The ID of the process that the log associated with.
+    DOMString process_id;
+    // The log level.
+    DOMString level;
+  };
+
+  // The class that is returned to callback function.
+  dictionary Result {
+    // The filter specified to filter log result.
+    Filter filter;
+    // Log entries returned based on the filter.
+    LogEntry[] data;
+  };
+
+  callback GetHistoricalCallback = void (Result res);
+
+  interface Functions {
+    // Get the existing logs from ChromeOS system.
+    static void getHistorical(Filter filter, GetHistoricalCallback callback);
+  };
+
+};
diff --git a/chrome/common/extensions/docs/examples/api/downloads/download_links/manifest.json b/chrome/common/extensions/docs/examples/api/downloads/download_links/manifest.json
index affbc47..4745d3b 100644
--- a/chrome/common/extensions/docs/examples/api/downloads/download_links/manifest.json
+++ b/chrome/common/extensions/docs/examples/api/downloads/download_links/manifest.json
@@ -3,11 +3,7 @@
   "description": "Select links on a page and download them.",
   "version": "0.1",
   "minimum_chrome_version": "16.0.884",
-  "permissions": [
-    "experimental", "tabs", "http://*/*", "https://*/*"
-  ],
-  "browser_action": {
-    "default_popup": "popup.html"
-  },
+  "permissions": ["tabs", "downloads"],
+  "browser_action": {"default_popup": "popup.html"},
   "manifest_version": 2
 }
diff --git a/chrome/common/extensions/docs/examples/api/downloads/download_manager/_locales/en/messages.json b/chrome/common/extensions/docs/examples/api/downloads/download_manager/_locales/en/messages.json
index cc1b636..3f59ae2 100644
--- a/chrome/common/extensions/docs/examples/api/downloads/download_manager/_locales/en/messages.json
+++ b/chrome/common/extensions/docs/examples/api/downloads/download_manager/_locales/en/messages.json
@@ -28,6 +28,12 @@
  "zeroSearchResults": {
    "message": "Zero matches",
    "description": ""},
+ "managementPermissionInfo": {
+   "message": "Some files were downloaded by an extension.",
+   "description": ""},
+ "grantManagementPermission": {
+   "message": "Show links to extensions that download files.",
+   "description": ""},
  "showOlderDownloads": {
    "message": "Show Older Downloads",
    "description": ""},
diff --git a/chrome/common/extensions/docs/examples/api/downloads/download_manager/manifest.json b/chrome/common/extensions/docs/examples/api/downloads/download_manager/manifest.json
index 1141c0d..6ae38ad 100644
--- a/chrome/common/extensions/docs/examples/api/downloads/download_manager/manifest.json
+++ b/chrome/common/extensions/docs/examples/api/downloads/download_manager/manifest.json
@@ -11,4 +11,5 @@
    "default_popup": "popup.html"},
  "background": {"persistent": false, "scripts": ["background.js"]},
  "default_locale": "en",
- "permissions": ["management", "downloads", "downloads.open", "downloads.shelf"]}
+ "optional_permissions": ["management"],
+ "permissions": ["downloads", "downloads.open", "downloads.shelf"]}
diff --git a/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.css b/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.css
index 46b0800..967d512 100644
--- a/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.css
+++ b/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.css
@@ -2,10 +2,6 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
-body {
-  text-align: center;
-}
-
 #outer,
 #empty,
 #open-folder,
@@ -15,6 +11,16 @@
   display: inline-block;
 }
 
+#q-outer {
+  display:inline-block;
+  height:1.7em;
+  overflow:hidden;
+}
+
+#q {
+  margin-right: 2em;
+}
+
 #head {
   position: fixed;
   width: 100%;
@@ -58,15 +64,9 @@
 }
 
 #q {
-  margin-top: 0.5em;
   margin-left: 3%;
 }
 
-#clear-all,
-#open-folder {
-  float: right;
-}
-
 .by-ext img,
 svg {
   width: 2em;
@@ -96,11 +96,6 @@
   stroke: black;
 }
 
-.clearfix {
-  clear: both;
-  float: right;
-}
-
 #older,
 #loading-older,
 .item {
diff --git a/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.html b/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.html
index b1cc635..95933be 100644
--- a/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.html
+++ b/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.html
@@ -12,7 +12,9 @@
     <a id="bad-chrome-version" hidden
         href="https://www.google.com/intl/en/chrome/browser/beta.html"></a>
     <span id="empty" hidden></span>
-    <input type="search" id="q" incremental>
+    <div id="q-outer">
+      <input type="search" id="q" incremental><br>&nbsp;
+    </div>
     <a href="#" id="clear-all"><svg viewBox="0 0 100 100"><g>
       <rect x="5" y="5" rx="20" ry="20" width="90" height="90" class="border" />
       <ellipse rx="30" ry="8" cx="50" cy="55" />
@@ -30,13 +32,16 @@
       <polygon points="20,20 20,80 60,80 60,30 35,30 35,20" />
       <polygon points="20,80 60,80 80,45 40,45" />
       </g></svg></a>
-    <div class="clearfix"> </div>
   </div>
   <div id="searching" hidden></div>
   <div id="search-zero" hidden></div>
   <div id="items"></div>
   <a href="#" id="older" hidden></a>
   <span id="loading-older" hidden></span>
+  <div id="request-management-permission" hidden><div
+      id="management-permission-info"></div>
+    <a href="#" id="grant-management-permission"></a>
+  </div>
 </div>
 
 <div class="item" hidden>
diff --git a/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.js b/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.js
index e878fc7..6c88e3d 100644
--- a/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.js
+++ b/chrome/common/extensions/docs/examples/api/downloads/download_manager/popup.js
@@ -26,6 +26,10 @@
   setProperty('#empty', 'innerText', 'zeroItems');
   setProperty('#searching', 'innerText', 'searching');
   setProperty('#search-zero', 'innerText', 'zeroSearchResults');
+  setProperty('#management-permission-info', 'innerText',
+              'managementPermissionInfo');
+  setProperty('#grant-management-permission', 'innerText',
+              'grantManagementPermission');
   setProperty('#older', 'innerText', 'showOlderDownloads');
   setProperty('#loading-older', 'innerText', 'loadingOlderDownloads');
   setProperty('.pause', 'title', 'pauseTitle');
@@ -296,9 +300,9 @@
     });
   }
 
-  item.getElement('removed').style.display = openable ? 'none' : 'inline-block';
+  item.getElement('removed').style.display = openable ? 'none' : 'inline';
   item.getElement('open-filename').style.display = (
-    openable ? 'inline-block' : 'none');
+    openable ? 'inline' : 'none');
   item.getElement('in-progress').hidden = !in_progress;
   item.getElement('pause').style.display = (
     !in_progress || item.paused) ? 'none' : 'inline-block';
@@ -321,14 +325,43 @@
   item.getElement('removed').innerText = item.basename;
   item.getElement('open-filename').innerText = item.basename;
 
+  function setByExtension(show) {
+    if (show) {
+      item.getElement('by-ext').title = item.byExtensionName;
+      item.getElement('by-ext').href =
+        'chrome://extensions#' + item.byExtensionId;
+      item.getElement('by-ext img').src =
+        'chrome://extension-icon/' + item.byExtensionId + '/48/1';
+    } else {
+      item.getElement('by-ext').hidden = true;
+    }
+  }
   if (item.byExtensionId && item.byExtensionName) {
-    item.getElement('by-ext').title = item.byExtensionName;
-    item.getElement('by-ext').href =
-      'chrome://extensions#' + item.byExtensionId;
-    item.getElement('by-ext img').src =
-      'chrome://extension-icon/' + item.byExtensionId + '/48/1';
+    chrome.permissions.contains({permissions: ['management']},
+                                function(result) {
+      if (result) {
+        setByExtension(true);
+      } else {
+        setByExtension(false);
+        if (!localStorage.managementPermissionDenied) {
+          document.getElementById('request-management-permission').hidden =
+            false;
+          document.getElementById('grant-management-permission').onclick =
+              function() {
+            chrome.permissions.request({permissions: ['management']},
+                                      function(granted) {
+              setByExtension(granted);
+              if (!granted) {
+                localStorage.managementPermissionDenied = true;
+              }
+            });
+            return false;
+          };
+        }
+      }
+    });
   } else {
-    item.getElement('by-ext').hidden = true;
+    setByExtension(false);
   }
 
   if (!item.getElement('error').hidden) {
@@ -509,9 +542,9 @@
   var any_items = (document.getElementById('items').childNodes.length > 0);
   document.getElementById('empty').style.display =
     any_items ? 'none' : 'inline-block';
+  document.getElementById('head').style.borderBottomWidth =
+    (any_items ? 1 : 0) + 'px';
   document.getElementById('clear-all').hidden = !any_items;
-  document.getElementById('open-folder').style.float =
-    any_items ? 'right' : 'none';
 
   var query_search = document.getElementById('q');
   query_search.hidden = !any_items;
@@ -682,7 +715,7 @@
 
   window.onload = function() {
     document.body.style.minWidth = (
-      document.getElementById('q').offsetWidth +
+      document.getElementById('q-outer').offsetWidth +
       document.getElementById('clear-all').offsetWidth +
       document.getElementById('open-folder').offsetWidth) + 'px';
     setLastOpened();
diff --git a/chrome/common/extensions/docs/examples/api/downloads/download_open/_locales/en/messages.json b/chrome/common/extensions/docs/examples/api/downloads/download_open/_locales/en/messages.json
index 5a6df11..eae1fbe 100644
--- a/chrome/common/extensions/docs/examples/api/downloads/download_open/_locales/en/messages.json
+++ b/chrome/common/extensions/docs/examples/api/downloads/download_open/_locales/en/messages.json
@@ -1,5 +1,5 @@
 {"extName": {
-   "message": "Download and Open Context Menu Button",
+   "message": "Download and Open Button",
    "description": "Extension name"},
  "extDesc": {
    "message": "Download and Open Context Menu Button",
diff --git a/chrome/common/extensions/docs/server2/api_data_source.py b/chrome/common/extensions/docs/server2/api_data_source.py
index 0301e30..a73a971 100644
--- a/chrome/common/extensions/docs/server2/api_data_source.py
+++ b/chrome/common/extensions/docs/server2/api_data_source.py
@@ -316,7 +316,7 @@
     }
     if (function.parent is not None and
         not isinstance(function.parent, model.Namespace)):
-      function_dict['parent_name'] = function.parent.simple_name
+      function_dict['parentName'] = function.parent.simple_name
     if function.returns:
       function_dict['returns'] = self._GenerateType(function.returns)
     for param in function.params:
@@ -347,7 +347,7 @@
     }
     if (event.parent is not None and
         not isinstance(event.parent, model.Namespace)):
-      event_dict['parent_name'] = event.parent.simple_name
+      event_dict['parentName'] = event.parent.simple_name
     if event.callback is not None:
       # Show the callback as an extra parameter.
       event_dict['parameters'].append(
@@ -408,7 +408,7 @@
 
     if (property_.parent is not None and
         not isinstance(property_.parent, model.Namespace)):
-      property_dict['parent_name'] = property_.parent.simple_name
+      property_dict['parentName'] = property_.parent.simple_name
 
     value = property_.value
     if value is not None:
@@ -431,7 +431,7 @@
     }
     if (callback.parent is not None and
         not isinstance(callback.parent, model.Namespace)):
-      property_dict['parent_name'] = callback.parent.simple_name
+      property_dict['parentName'] = callback.parent.simple_name
     return property_dict
 
   def _RenderTypeInformation(self, type_, dst_dict):
diff --git a/chrome/common/extensions/docs/server2/app.yaml b/chrome/common/extensions/docs/server2/app.yaml
index d0489f2..9c33888 100644
--- a/chrome/common/extensions/docs/server2/app.yaml
+++ b/chrome/common/extensions/docs/server2/app.yaml
@@ -1,5 +1,5 @@
 application: chrome-apps-doc
-version: 2-17-0
+version: 2-18-0
 runtime: python27
 api_version: 1
 threadsafe: false
diff --git a/chrome/common/extensions/docs/server2/cron.yaml b/chrome/common/extensions/docs/server2/cron.yaml
index 9f4691b..902bb80 100644
--- a/chrome/common/extensions/docs/server2/cron.yaml
+++ b/chrome/common/extensions/docs/server2/cron.yaml
@@ -2,4 +2,4 @@
 - description: Repopulates all cached data.
   url: /_cron
   schedule: every 5 minutes
-  target: 2-17-0
+  target: 2-18-0
diff --git a/chrome/common/extensions/docs/server2/fail_on_access_file_system.py b/chrome/common/extensions/docs/server2/fail_on_access_file_system.py
new file mode 100644
index 0000000..866cfd3
--- /dev/null
+++ b/chrome/common/extensions/docs/server2/fail_on_access_file_system.py
@@ -0,0 +1,12 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from file_system import FileSystem
+
+class FailOnAccessFileSystem(FileSystem):
+  # All this needs to do is implement GetIdentity. All other methods will
+  # automatically fail with NotImplementedErrors.
+  def GetIdentity(self):
+    return '42'
+
diff --git a/chrome/common/extensions/docs/server2/handler.py b/chrome/common/extensions/docs/server2/handler.py
index 8701b75..8e5cae8 100644
--- a/chrome/common/extensions/docs/server2/handler.py
+++ b/chrome/common/extensions/docs/server2/handler.py
@@ -6,11 +6,13 @@
 from instance_servlet import InstanceServlet
 from patch_servlet import PatchServlet
 from servlet import Servlet, Request, Response
+from test_servlet import TestServlet
 
 _DEFAULT_SERVLET = InstanceServlet.GetConstructor()
 _SERVLETS = {
   'cron': CronServlet,
   'patch': PatchServlet,
+  'test': TestServlet,
 }
 
 class Handler(Servlet):
diff --git a/chrome/common/extensions/docs/server2/instance_servlet.py b/chrome/common/extensions/docs/server2/instance_servlet.py
index 0382ce4..47a9be4 100644
--- a/chrome/common/extensions/docs/server2/instance_servlet.py
+++ b/chrome/common/extensions/docs/server2/instance_servlet.py
@@ -13,7 +13,7 @@
 from object_store_creator import ObjectStoreCreator
 from server_instance import ServerInstance
 
-class _OfflineRenderServletDelegate(RenderServlet.Delegate):
+class OfflineRenderServletDelegate(RenderServlet.Delegate):
   '''AppEngine instances should never need to call out to SVN. That should only
   ever be done by the cronjobs, which then write the result into DataStore,
   which is as far as instances look. To enable this, crons can pass a custom
@@ -73,7 +73,7 @@
 
   @staticmethod
   def GetConstructor(delegate_for_test=None):
-    render_servlet_delegate = _OfflineRenderServletDelegate(
+    render_servlet_delegate = OfflineRenderServletDelegate(
         delegate_for_test or InstanceServlet.Delegate())
     return lambda request: RenderServlet(request, render_servlet_delegate)
 
diff --git a/chrome/common/extensions/docs/server2/instance_servlet_test.py b/chrome/common/extensions/docs/server2/instance_servlet_test.py
index 8d9abc3..3a2b999 100755
--- a/chrome/common/extensions/docs/server2/instance_servlet_test.py
+++ b/chrome/common/extensions/docs/server2/instance_servlet_test.py
@@ -6,9 +6,9 @@
 import unittest
 
 from empty_dir_file_system import EmptyDirFileSystem
-from file_system import FileSystem
 from instance_servlet import InstanceServlet
 from servlet import Request
+from fail_on_access_file_system import FailOnAccessFileSystem
 from test_branch_utility import TestBranchUtility
 from test_util import DisableLogging
 
@@ -27,16 +27,10 @@
   def CreateAppSamplesFileSystem(self, object_store_creator):
     return EmptyDirFileSystem()
 
-class _FailOnAccessFileSystem(FileSystem):
-  # All this needs to do is implement GetIdentity. All other methods will
-  # automatically fail with NotImplementedErrors.
-  def GetIdentity(self):
-    return '42'
-
 class InstanceServletTest(unittest.TestCase):
   @DisableLogging('warning')
   def testHostFileSystemNotAccessed(self):
-    delegate = _TestDelegate(_FailOnAccessFileSystem)
+    delegate = _TestDelegate(FailOnAccessFileSystem)
     constructor = InstanceServlet.GetConstructor(delegate_for_test=delegate)
     def test_path(path, status=404):
       response = constructor(Request.ForTest(path)).Get()
diff --git a/chrome/common/extensions/docs/server2/integration_test.py b/chrome/common/extensions/docs/server2/integration_test.py
index fa2d1322..6d0e99b 100755
--- a/chrome/common/extensions/docs/server2/integration_test.py
+++ b/chrome/common/extensions/docs/server2/integration_test.py
@@ -8,8 +8,6 @@
 import build_server
 build_server.main()
 
-from itertools import groupby
-from operator import itemgetter
 import optparse
 import os
 import posixpath
@@ -18,7 +16,7 @@
 import unittest
 
 from branch_utility import BranchUtility
-from link_error_detector import LinkErrorDetector
+from link_error_detector import LinkErrorDetector, StringifyBrokenLinks
 from local_file_system import LocalFileSystem
 from local_renderer import LocalRenderer
 from fake_fetchers import ConfigureFakeFetchers
@@ -45,35 +43,6 @@
         public_files['/'.join((relative_posix_path, filename))] = f.read()
   return public_files
 
-def _PrintBrokenLinks(broken_links):
-  '''Prints out broken links in a more readable format.
-  '''
-  def fixed_width(string, width):
-    return "%s%s" % (string, (width - len(string)) * ' ')
-
-  first_col_width = max(len(link[1]) for link in broken_links)
-  second_col_width = max(len(link[2]) for link in broken_links)
-  target = itemgetter(2)
-
-  def pretty_print(link, col_offset=0):
-    return "%s -> %s %s" % (
-        fixed_width(link[1], first_col_width - col_offset),
-        fixed_width(link[2], second_col_width),
-        link[3])
-
-  for target, links in groupby(sorted(broken_links, key=target), target):
-    links = list(links)
-    # Compress messages
-    if len(links) > 50 and not links[0][2].startswith('#'):
-      message = "Found %d broken links (" % len(links)
-      print("%s%s)" % (message, pretty_print(links[0], len(message))))
-        # link = links[0]
-        # out = "%s and %d others" % (link[1], len(links) - 1)
-      # pretty_print(link, url=out)
-    else:
-      for link in links:
-        print(pretty_print(link))
-
 class IntegrationTest(unittest.TestCase):
   def setUp(self):
     ConfigureFakeFetchers()
@@ -108,7 +77,7 @@
       # TODO(jshumway): Test should fail when broken links are detected.
       print('Warning: Found %d broken links:' % (
         len(broken_links)))
-      _PrintBrokenLinks(broken_links)
+      print(StringifyBrokenLinks(broken_links))
 
     print('Took %s seconds.' % (time.time() - start_time))
 
diff --git a/chrome/common/extensions/docs/server2/link_error_detector.py b/chrome/common/extensions/docs/server2/link_error_detector.py
index 7e4c137..528c810 100644
--- a/chrome/common/extensions/docs/server2/link_error_detector.py
+++ b/chrome/common/extensions/docs/server2/link_error_detector.py
@@ -4,6 +4,8 @@
 
 from collections import defaultdict, deque, namedtuple
 from HTMLParser import HTMLParser, HTMLParseError
+from itertools import groupby
+from operator import itemgetter
 import posixpath
 from urlparse import urlsplit
 
@@ -263,3 +265,32 @@
         [url for url, page in self._pages.iteritems() if page.status == 200])
 
     return [url for url in all_urls - found if url.endswith('.html')]
+
+def StringifyBrokenLinks(broken_links):
+  '''Prints out broken links in a more readable format.
+  '''
+  def fixed_width(string, width):
+    return "%s%s" % (string, (width - len(string)) * ' ')
+
+  first_col_width = max(len(link[1]) for link in broken_links)
+  second_col_width = max(len(link[2]) for link in broken_links)
+  target = itemgetter(2)
+  output = []
+
+  def pretty_print(link, col_offset=0):
+    return "%s -> %s %s" % (
+        fixed_width(link[1], first_col_width - col_offset),
+        fixed_width(link[2], second_col_width),
+        link[3])
+
+  for target, links in groupby(sorted(broken_links, key=target), target):
+    links = list(links)
+    # Compress messages
+    if len(links) > 50 and not links[0][2].startswith('#'):
+      message = "Found %d broken links (" % len(links)
+      output.append("%s%s)" % (message, pretty_print(links[0], len(message))))
+    else:
+      for link in links:
+        output.append(pretty_print(link))
+
+  return '\n'.join(output)
diff --git a/chrome/common/extensions/docs/server2/test_servlet.py b/chrome/common/extensions/docs/server2/test_servlet.py
new file mode 100644
index 0000000..81f12aa
--- /dev/null
+++ b/chrome/common/extensions/docs/server2/test_servlet.py
@@ -0,0 +1,69 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from instance_servlet import InstanceServlet, OfflineRenderServletDelegate
+from link_error_detector import LinkErrorDetector, StringifyBrokenLinks
+from servlet import Request, Response, Servlet
+import svn_constants
+
+class BrokenLinkTester(object):
+  '''Run link error detector tests.
+  '''
+  def __init__(self, server_instance, renderer):
+    self.link_error_detector = LinkErrorDetector(
+      server_instance.host_file_system,
+      renderer,
+      svn_constants.PUBLIC_TEMPLATE_PATH,
+      root_pages=('extensions/index.html', 'apps/about_apps.html'))
+
+  def TestBrokenLinks(self):
+    broken_links = self.link_error_detector.GetBrokenLinks()
+    return (
+        len(broken_links),
+        'Warning: Found %d broken links:\n%s' % (
+            len(broken_links), StringifyBrokenLinks(broken_links)))
+
+  def TestOrphanedPages(self):
+    orphaned_pages = self.link_error_detector.GetOrphanedPages()
+    return (
+        len(orphaned_pages),
+        'Warning: Found %d orphaned pages:\n%s' % (
+            len(orphaned_pages), '\n'.join(orphaned_pages)))
+
+class TestServlet(Servlet):
+  '''Runs tests against the live server. Supports running all broken link
+  detection tests, in parts or all at once.
+  '''
+  def __init__(self, request, delegate_for_test=None):
+    Servlet.__init__(self, request)
+    self._delegate = delegate_for_test or InstanceServlet.Delegate()
+
+  def Get(self):
+    link_error_tests = ('broken_links', 'orphaned_pages', 'link_errors')
+
+    if not self._request.path in link_error_tests:
+      return Response.NotFound('Test %s not found. Available tests are: %s' % (
+          self._request.path, ','.join(link_error_tests)))
+
+    constructor = InstanceServlet.GetConstructor(self._delegate)
+    def renderer(path):
+      return constructor(Request(path, '', self._request.headers)).Get()
+
+    link_tester = BrokenLinkTester(
+        OfflineRenderServletDelegate(self._delegate).CreateServerInstance(),
+        renderer)
+    if self._request.path == 'broken_links':
+      errors, content = link_tester.TestBrokenLinks()
+    elif self._request.path == 'orphaned_pages':
+      errors, content = link_tester.TestOrphanedPages()
+    else:
+      link_errors, link_content = link_tester.TestBrokenLinks()
+      orphaned_errors, orphaned_content = link_tester.TestOrphanedPages()
+      errors = link_errors + orphaned_errors
+      content = "%s\n%s" % (link_content, orphaned_content)
+
+    if errors:
+      return Response.InternalError(content=content)
+
+    return Response.Ok(content="%s test passed." % self._request.path)
diff --git a/chrome/common/extensions/docs/server2/test_servlet_test.py b/chrome/common/extensions/docs/server2/test_servlet_test.py
new file mode 100755
index 0000000..0e53afb
--- /dev/null
+++ b/chrome/common/extensions/docs/server2/test_servlet_test.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import unittest
+
+from empty_dir_file_system import EmptyDirFileSystem
+from host_file_system_creator import HostFileSystemCreator
+from servlet import Request
+from test_branch_utility import TestBranchUtility
+from fail_on_access_file_system import FailOnAccessFileSystem
+from test_servlet import TestServlet
+
+class _TestDelegate(object):
+  def CreateBranchUtility(self, object_store_creator):
+    return TestBranchUtility.CreateWithCannedData()
+
+  def CreateAppSamplesFileSystem(self, object_store_creator):
+    return EmptyDirFileSystem()
+
+  def CreateHostFileSystemCreator(self, object_store_creator):
+    return HostFileSystemCreator.ForTest(
+        FailOnAccessFileSystem(), object_store_creator)
+
+# This test can't really be useful. The set of valid tests is changing and
+# there is no reason to test the tests themselves, they are already tested in
+# their respective modules. The only testable behavior TestServlet adds is
+# returning a 404 if a test does not exist.
+class TestServletTest(unittest.TestCase):
+  def testTestServlet(self):
+    request = Request('not_a_real_test_url', 'localhost', {})
+    test_servlet = TestServlet(request, _TestDelegate())
+    response = test_servlet.Get()
+
+    self.assertEqual(404, response.status)
+
+if __name__ == '__main__':
+  unittest.main()
diff --git a/chrome/common/extensions/docs/templates/intros/downloads.html b/chrome/common/extensions/docs/templates/intros/downloads.html
index 559c039..84582dd 100644
--- a/chrome/common/extensions/docs/templates/intros/downloads.html
+++ b/chrome/common/extensions/docs/templates/intros/downloads.html
@@ -1,25 +1,15 @@
 <h2 id='manifest'>Manifest</h2>
 
 <p> You must declare the 'downloads' permission in the <a
-href='manifest.html'>extension manifest</a> to use this API, along with <a
-href='declare_permissions.html'>host permissions</a> for any hosts that you may
-pass to $ref:downloads.download.</p>
+href='manifest.html'>extension manifest</a> to use this API.</p>
 
 <pre>{
   'name': 'My extension',
   ...
-<b>  'permissions': [
-    'downloads',
-    '*://*.google.com'
-  ]</b>,
+<b>  'permissions': ['downloads']</b>,
   ...
 }</pre>
 
-<p>If the URL's hostname is not specified in the permissions, then
-$ref:downloads.download will call its callback with a null
-<code>downloadId</code> and set the $ref:runtime.lastError object to indicate
-that the extension does not have permission to access that hostname.</p>
-
 <h2 id='examples'>Examples</h2>
 
 <p>You can find simple examples of using the downloads module in the <a
diff --git a/chrome/common/extensions/docs/templates/json/intro_tables.json b/chrome/common/extensions/docs/templates/json/intro_tables.json
index 532b6eb..a156fae 100644
--- a/chrome/common/extensions/docs/templates/json/intro_tables.json
+++ b/chrome/common/extensions/docs/templates/json/intro_tables.json
@@ -84,10 +84,6 @@
       {
         "class": "code",
         "text": "\"downloads\""
-      },
-      {
-        "link": "declare_permissions.html",
-        "text": "host permissions"
       }
     ]
   },
diff --git a/chrome/common/extensions/docs/templates/private/event.html b/chrome/common/extensions/docs/templates/private/event.html
index b9443de..898b831 100644
--- a/chrome/common/extensions/docs/templates/private/event.html
+++ b/chrome/common/extensions/docs/templates/private/event.html
@@ -1,7 +1,7 @@
 <div>
   <h4 id="{{id}}">{{name}}</h4>
   <div class="summary">
-    <span class="subdued">{{?parent_name}}{{parent_name}}{{:}}chrome.{{api.name}}{{/}}.</span>{{name}}<span class="subdued">.addListener</span>(function({{#parameters}}{{+partials.parameter_item}}{{^last}}, {{/}}{{/}})<span class="subdued"> {...}</span>);
+    <span class="subdued">{{?parentName}}{{parentName}}{{:}}chrome.{{api.name}}{{/}}.</span>{{name}}<span class="subdued">.addListener</span>(function({{#parameters}}{{+partials.parameter_item}}{{^last}}, {{/}}{{/}})<span class="subdued"> {...}</span>);
   </div>
   <div class="description">
     {{?description}}<p>
diff --git a/chrome/common/extensions/docs/templates/private/function.html b/chrome/common/extensions/docs/templates/private/function.html
index a285d52..3cfcd41 100644
--- a/chrome/common/extensions/docs/templates/private/function.html
+++ b/chrome/common/extensions/docs/templates/private/function.html
@@ -1,7 +1,7 @@
 <div>
   <h4 id="{{id}}">{{name}}</h4>
   <div class="summary{{^returns}} uncapitalize{{/}}">
-    <span>{{?returns}}{{+partials.variable_type}} {{/}}{{?parent_name}}{{parent_name}}{{:}}chrome.{{api.name}}{{/}}.{{name}}</span>({{#parameters}}{{+partials.parameter_item}}{{^last}}, {{/}}{{/}})
+    <span>{{?returns}}{{+partials.variable_type}} {{/}}{{?parentName}}{{parentName}}{{:}}chrome.{{api.name}}{{/}}.{{name}}</span>({{#parameters}}{{+partials.parameter_item}}{{^last}}, {{/}}{{/}})
   </div>
   <div class="description">
     {{?description}}
diff --git a/chrome/common/extensions/docs/templates/private/parameter_full.html b/chrome/common/extensions/docs/templates/private/parameter_full.html
index 7f51c2d..f298501 100644
--- a/chrome/common/extensions/docs/templates/private/parameter_full.html
+++ b/chrome/common/extensions/docs/templates/private/parameter_full.html
@@ -1,5 +1,5 @@
 <div>
-  {{?parent_name}}<a name="{{id}}"></a>{{/}}
+  {{?parentName}}<a name="{{id}}"></a>{{/}}
   {{+partials.property}}
   {{?properties}}
   <dd>
diff --git a/chrome/common/extensions/docs/templates/private/toc_events.html b/chrome/common/extensions/docs/templates/private/toc_events.html
index 00e8858..dd5d4be 100644
--- a/chrome/common/extensions/docs/templates/private/toc_events.html
+++ b/chrome/common/extensions/docs/templates/private/toc_events.html
@@ -1,4 +1,4 @@
-<a href="#{{?parent_name}}{{parent_name}}-{{/}}events">Events</a>
+<a href="#{{?parentName}}{{parentName}}-{{/}}events">Events</a>
 <ol>
   {{#events}}
   <li><a href="#{{id}}">{{name}}</a></li>
diff --git a/chrome/common/extensions/docs/templates/private/toc_functions.html b/chrome/common/extensions/docs/templates/private/toc_functions.html
index 15401a7..23d3995 100644
--- a/chrome/common/extensions/docs/templates/private/toc_functions.html
+++ b/chrome/common/extensions/docs/templates/private/toc_functions.html
@@ -1,4 +1,4 @@
-<a href="#{{?parent_name}}{{parent_name}}-{{/}}methods">Methods</a>
+<a href="#{{?parentName}}{{parentName}}-{{/}}methods">Methods</a>
 <ol>
   {{#functions}}
   <li><a href="#{{id}}">{{name}}</a></li>
diff --git a/chrome/common/extensions/docs/templates/private/toc_properties.html b/chrome/common/extensions/docs/templates/private/toc_properties.html
index 630eac9..02f76c3 100644
--- a/chrome/common/extensions/docs/templates/private/toc_properties.html
+++ b/chrome/common/extensions/docs/templates/private/toc_properties.html
@@ -1,16 +1,16 @@
-<a href="#{{?parent_name}}{{parent_name}}-{{/}}properties">Properties</a>
+<a href="#{{?parentName}}{{parentName}}-{{/}}properties">Properties</a>
 <ol>
   {{#properties}}
   <li>
     <a href="#{{id}}">{{name}}</a>
     {{?functions}}<ol><li>
-      {{+partials.toc_functions parent_name:name functions:functions}}
+      {{+partials.toc_functions parentName:name functions:functions}}
     </li></ol>{{/functions}}
     {{?events}}<ol><li>
-      {{+partials.toc_events parent_name:name events:events}}
+      {{+partials.toc_events parentName:name events:events}}
     </li></ol>{{/events}}
     {{?properties}}<ol><li>
-      {{+partials.toc_properties parent_name:name properties:properties}}
+      {{+partials.toc_properties parentName:name properties:properties}}
     </li></ol>{{/properties}}
   </li>
   {{/}}
diff --git a/chrome/common/extensions/docs/templates/private/toc_types.html b/chrome/common/extensions/docs/templates/private/toc_types.html
index bc46bc7..1bfdd2b 100644
--- a/chrome/common/extensions/docs/templates/private/toc_types.html
+++ b/chrome/common/extensions/docs/templates/private/toc_types.html
@@ -1,13 +1,13 @@
-<a href="#{{?parent_name}}{{parent_name}}-{{/}}types">Types</a>
+<a href="#{{?parentName}}{{parentName}}-{{/}}types">Types</a>
 <ol>
   {{#types}}
   <li>
     <a href="#{{id}}">{{name}}</a>
     {{?functions}}<ol><li>
-      {{+partials.toc_functions parent_name:name functions:functions}}
+      {{+partials.toc_functions parentName:name functions:functions}}
     </li></ol>{{/}}
     {{?events}}<ol><li>
-      {{+partials.toc_events parent_name:name events:events}}
+      {{+partials.toc_events parentName:name events:events}}
     </li></ol>{{/}}
   </li>
   {{/}}
diff --git a/chrome/common/extensions/docs/templates/public/extensions/audio.html b/chrome/common/extensions/docs/templates/public/extensions/audio.html
new file mode 100644
index 0000000..0bf6943
--- /dev/null
+++ b/chrome/common/extensions/docs/templates/public/extensions/audio.html
@@ -0,0 +1 @@
+{{+partials.standard_extensions_api api:apis.audio}}
diff --git a/chrome/common/extensions/docs/templates/public/extensions/redirects.json b/chrome/common/extensions/docs/templates/public/extensions/redirects.json
index 471fa5d..428f62f 100644
--- a/chrome/common/extensions/docs/templates/public/extensions/redirects.json
+++ b/chrome/common/extensions/docs/templates/public/extensions/redirects.json
@@ -1,5 +1,8 @@
 {
   "": "index.html",
+  "experimental.infobars.html": "infobars.html",
+  "experimental_infobars.html": "infobars.html",
+  "experimental.systemInfo_storage.html": "system_storage.html",
   "experimental_systemInfo_storage.html": "system_storage.html",
   "systemInfo_cpu.html": "system_cpu.html",
   "systemInfo_memory.html": "system_memory.html"
diff --git a/chrome/common/extensions/permissions/api_permission.h b/chrome/common/extensions/permissions/api_permission.h
index d99616d..980be54 100644
--- a/chrome/common/extensions/permissions/api_permission.h
+++ b/chrome/common/extensions/permissions/api_permission.h
@@ -91,6 +91,7 @@
     kInput,
     kInputMethodPrivate,
     kLocation,
+    kLogPrivate,
     kManagement,
     kMediaGalleries,
     kMediaGalleriesPrivate,
@@ -141,6 +142,8 @@
     kWebView,
     kSystemCpu,
     kSystemMemory,
+    kSystemInfoCpu,
+    kSystemInfoMemory,
     kEnumBoundary
   };
 
diff --git a/chrome/common/extensions/permissions/chrome_api_permissions.cc b/chrome/common/extensions/permissions/chrome_api_permissions.cc
index 6562f9c..0b368f8 100644
--- a/chrome/common/extensions/permissions/chrome_api_permissions.cc
+++ b/chrome/common/extensions/permissions/chrome_api_permissions.cc
@@ -166,6 +166,7 @@
       APIPermissionInfo::kFlagCannotBeOptional },
     { APIPermission::kIdentityPrivate, "identityPrivate",
       APIPermissionInfo::kFlagCannotBeOptional },
+    { APIPermission::kLogPrivate, "logPrivate"},
     { APIPermission::kNetworkingPrivate, "networkingPrivate",
       APIPermissionInfo::kFlagCannotBeOptional,
       IDS_EXTENSION_PROMPT_WARNING_NETWORKING_PRIVATE,
diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc
index 366843e..f5adabd 100644
--- a/chrome/common/extensions/permissions/permission_set_unittest.cc
+++ b/chrome/common/extensions/permissions/permission_set_unittest.cc
@@ -647,6 +647,7 @@
   skip.insert(APIPermission::kFontSettings);
   skip.insert(APIPermission::kFullscreen);
   skip.insert(APIPermission::kIdle);
+  skip.insert(APIPermission::kLogPrivate);
   skip.insert(APIPermission::kNotification);
   skip.insert(APIPermission::kPointerLock);
   skip.insert(APIPermission::kPower);
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 64ea5b7..bdbb346 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -1916,25 +1916,21 @@
     "google.services.username_pattern";
 
 #if !defined(OS_ANDROID)
-// Tracks the number of times that we have shown the sync promo at startup.
-const char kSyncPromoStartupCount[] = "sync_promo.startup_count";
+// Tracks the number of times that we have shown the sign in promo at startup.
+const char kSignInPromoStartupCount[] = "sync_promo.startup_count";
 
-// Boolean tracking whether the user chose to skip the sync promo.
-const char kSyncPromoUserSkipped[] = "sync_promo.user_skipped";
+// Boolean tracking whether the user chose to skip the sign in promo.
+const char kSignInPromoUserSkipped[] = "sync_promo.user_skipped";
 
-// Boolean that specifies if the sync promo is allowed to show on first run.
+// Boolean that specifies if the sign in promo is allowed to show on first run.
 // This preference is specified in the master preference file to suppress the
-// sync promo for some installations.
-const char kSyncPromoShowOnFirstRunAllowed[] =
+// sign in promo for some installations.
+const char kSignInPromoShowOnFirstRunAllowed[] =
     "sync_promo.show_on_first_run_allowed";
 
 // Boolean that specifies if we should show a bubble in the new tab page.
 // The bubble is used to confirm that the user is signed into sync.
-const char kSyncPromoShowNTPBubble[] = "sync_promo.show_ntp_bubble";
-
-// An error to show in the sync promo bubble, if needed.  If the sign in was
-// successful, this property holds an empty string.
-const char kSyncPromoErrorMessage[] = "sync_promo.error_message";
+const char kSignInPromoShowNTPBubble[] = "sync_promo.show_ntp_bubble";
 #endif
 
 // Time when the user's GAIA info was last updated (represented as an int64).
@@ -2061,6 +2057,20 @@
 const char kDailyHttpReceivedContentLength[] =
     "data_reduction.daily_received_length";
 
+// A List pref that contains daily totals of the size of all HTTP content that
+// has been received via the data reduction proxy.
+const char kDailyHttpReceivedContentLengthViaDataReductionProxy[] =
+    "data_reduction.daily_received_length_via_data_reduction_proxy";
+
+// A List pref that contains daily totals of the size of all HTTP content that
+// has been received when the data reduction proxy is enabled.
+// Note: this is different from
+// kDailyHttpReceivedContentLengthViaDataReductionProxy because content
+// doesn't necessarily go through the data reduction proxy when it is enabled.
+// E.g., the proxy doesn't handle HTTPS traffic.
+const char kDailyHttpReceivedContentLengthWithDataReductionProxyEnabled[] =
+    "data_reduction.daily_received_length_with_data_reduction_proxy_enabled";
+
 // An int64 pref that contains an internal representation of midnight on the
 // date of the last update to |kDailyHttp{Original,Received}ContentLength|.
 const char kDailyHttpContentLengthLastUpdateDate[] =
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 7fe5493..d6d79b2 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -676,11 +676,10 @@
 extern const char kInvalidatorInvalidationState[];
 extern const char kInvalidatorMaxInvalidationVersions[];
 
-extern const char kSyncPromoStartupCount[];
-extern const char kSyncPromoUserSkipped[];
-extern const char kSyncPromoShowOnFirstRunAllowed[];
-extern const char kSyncPromoShowNTPBubble[];
-extern const char kSyncPromoErrorMessage[];
+extern const char kSignInPromoStartupCount[];
+extern const char kSignInPromoUserSkipped[];
+extern const char kSignInPromoShowOnFirstRunAllowed[];
+extern const char kSignInPromoShowNTPBubble[];
 
 extern const char kProfileGAIAInfoUpdateTime[];
 extern const char kProfileGAIAInfoPictureURL[];
@@ -819,6 +818,9 @@
 #if defined(OS_ANDROID) || defined(OS_IOS)
 extern const char kDailyHttpOriginalContentLength[];
 extern const char kDailyHttpReceivedContentLength[];
+extern const char kDailyHttpReceivedContentLengthViaDataReductionProxy[];
+extern const char
+    kDailyHttpReceivedContentLengthWithDataReductionProxyEnabled[];
 extern const char kDailyHttpContentLengthLastUpdateDate[];
 #endif
 
diff --git a/chrome/common/time_format_browsertest.cc b/chrome/common/time_format_browsertest.cc
index 649ac02..1431031 100644
--- a/chrome/common/time_format_browsertest.cc
+++ b/chrome/common/time_format_browsertest.cc
@@ -13,8 +13,8 @@
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_locale.h"
-#include "chrome/common/time_format.h"
 #include "chrome/test/base/in_process_browser_test.h"
+#include "ui/base/l10n/time_format.h"
 
 using base::TimeDelta;
 
@@ -34,6 +34,7 @@
   // This showed up on the browser on estimated download time, for example.
   // http://crbug.com/60476
 
-  string16 one_min = TimeFormat::TimeRemainingShort(TimeDelta::FromMinutes(1));
+  string16 one_min =
+      ui::TimeFormat::TimeRemainingShort(TimeDelta::FromMinutes(1));
   EXPECT_EQ(ASCIIToUTF16("1 min"), one_min);
 }
diff --git a/chrome/installer/linux/debian/build.sh b/chrome/installer/linux/debian/build.sh
index d9d98a1..39e2153 100755
--- a/chrome/installer/linux/debian/build.sh
+++ b/chrome/installer/linux/debian/build.sh
@@ -288,14 +288,16 @@
 rm -rf "$DUMMY_STAGING_DIR"
 
 # Additional dependencies not in the dpkg-shlibdeps output.
-ADDITION_DEPS="ca-certificates, libcurl3, \
+# Pull a more recent version of NSS than required by runtime linking, for
+# security and stability updates in NSS.
+ADDITION_DEPS="ca-certificates, libcurl3, libnss3 (>= 3.14.3), \
   lsb-base (>=3.2), xdg-utils (>= 1.0.2), wget"
 
 # Fix-up libnspr dependency due to renaming in Ubuntu (the old package still
 # exists, but it was moved to "universe" repository, which isn't installed by
 # default).
 DPKG_SHLIB_DEPS=$(sed \
-    's/\(libnspr4-0d ([^)]*)\), /\1 | libnspr4 (>= 4.8.7-0ubuntu1), /g' \
+    's/\(libnspr4-0d ([^)]*)\), /\1 | libnspr4 (>= 4.9.5-0ubuntu0), /g' \
     <<< $DPKG_SHLIB_DEPS)
 
 # Fix-up libudev dependency because Ubuntu 13.04 has libudev1 instead of
diff --git a/chrome/installer/linux/rpm/build.sh b/chrome/installer/linux/rpm/build.sh
index 544a46a..7134e59 100755
--- a/chrome/installer/linux/rpm/build.sh
+++ b/chrome/installer/linux/rpm/build.sh
@@ -124,7 +124,7 @@
   # https://bugzilla.novell.com/show_bug.cgi?id=556248
   DEPENDS="lsb >= 4.0, \
   libcurl.so.4${EMPTY_VERSION}${PKG_ARCH}, \
-  libnss3.so(NSS_3.12.3)${PKG_ARCH}, \
+  libnss3.so(NSS_3.14.3)${PKG_ARCH}, \
   wget, \
   xdg-utils, \
   zlib, \
diff --git a/chrome/installer/util/installer_state.cc b/chrome/installer/util/installer_state.cc
index 6409d44..07b75b3 100644
--- a/chrome/installer/util/installer_state.cc
+++ b/chrome/installer/util/installer_state.cc
@@ -648,7 +648,6 @@
     Version* existing_version,
     const base::FilePath& temp_path) const {
   Version version;
-  std::vector<base::FilePath> key_files;
   scoped_ptr<WorkItem> item;
 
   std::set<std::string> existing_version_strings;
diff --git a/chrome/renderer/extensions/OWNERS b/chrome/renderer/extensions/OWNERS
index 16f17f1..a6cd87d 100644
--- a/chrome/renderer/extensions/OWNERS
+++ b/chrome/renderer/extensions/OWNERS
@@ -5,6 +5,7 @@
 jyasskin@chromium.org
 kalman@chromium.org
 koz@chromium.org
+mek@chromium.org
 miket@chromium.org
 mpcomplete@chromium.org
 yoz@chromium.org
diff --git a/chrome/renderer/pepper/pnacl_translation_resource_host.cc b/chrome/renderer/pepper/pnacl_translation_resource_host.cc
index 75aa6d4..609ddec 100644
--- a/chrome/renderer/pepper/pnacl_translation_resource_host.cc
+++ b/chrome/renderer/pepper/pnacl_translation_resource_host.cc
@@ -102,26 +102,30 @@
 }
 
 void PnaclTranslationResourceHost::ReportTranslationFinished(
-    PP_Instance instance) {
+    PP_Instance instance,
+    PP_Bool success) {
   DCHECK(PpapiGlobals::Get()->
          GetMainThreadMessageLoop()->BelongsToCurrentThread());
   io_message_loop_->PostTask(
       FROM_HERE,
       base::Bind(&PnaclTranslationResourceHost::SendReportTranslationFinished,
                  this,
-                 instance));
+                 instance,
+                 success));
   return;
 }
 
 void PnaclTranslationResourceHost::SendReportTranslationFinished(
-    PP_Instance instance) {
+    PP_Instance instance,
+    PP_Bool success) {
   DCHECK(io_message_loop_->BelongsToCurrentThread());
   // If the channel is closed or we have been detached, we are probably shutting
   // down, so just don't send anything.
   if (!channel_)
     return;
   DCHECK(pending_cache_requests_.count(instance) == 0);
-  channel_->Send(new NaClHostMsg_ReportTranslationFinished(instance));
+  channel_->Send(new NaClHostMsg_ReportTranslationFinished(instance,
+                                                           PP_ToBool(success)));
 }
 
 void PnaclTranslationResourceHost::OnNexeTempFileReply(
diff --git a/chrome/renderer/pepper/pnacl_translation_resource_host.h b/chrome/renderer/pepper/pnacl_translation_resource_host.h
index 9f1a204..5958544 100644
--- a/chrome/renderer/pepper/pnacl_translation_resource_host.h
+++ b/chrome/renderer/pepper/pnacl_translation_resource_host.h
@@ -33,7 +33,7 @@
                      PP_Bool* is_hit,
                      PP_FileHandle* file_handle,
                      scoped_refptr<ppapi::TrackedCallback> callback);
-  void ReportTranslationFinished(PP_Instance instance);
+  void ReportTranslationFinished(PP_Instance instance, PP_Bool success);
 
   // Ensure that PNaCl resources (pnacl-llc.nexe, linker, libs) are installed.
   void EnsurePnaclInstalled(PP_Instance instance,
@@ -74,7 +74,8 @@
                          PP_Bool* is_hit,
                          PP_FileHandle* file_handle,
                          scoped_refptr<ppapi::TrackedCallback> callback);
-  void SendReportTranslationFinished(PP_Instance instance);
+  void SendReportTranslationFinished(PP_Instance instance,
+                                     PP_Bool success);
   void SendEnsurePnaclInstalled(PP_Instance instance,
                                 scoped_refptr<ppapi::TrackedCallback> callback);
 
diff --git a/chrome/renderer/pepper/ppb_nacl_private_impl.cc b/chrome/renderer/pepper/ppb_nacl_private_impl.cc
index 91ce85c..ce95b62 100644
--- a/chrome/renderer/pepper/ppb_nacl_private_impl.cc
+++ b/chrome/renderer/pepper/ppb_nacl_private_impl.cc
@@ -290,12 +290,12 @@
   return enter.SetResult(PP_OK_COMPLETIONPENDING);
 }
 
-void ReportTranslationFinished(PP_Instance instance) {
+void ReportTranslationFinished(PP_Instance instance, PP_Bool success) {
   // If the resource host isn't initialized, don't try to do that here.
   // Just return because something is already very wrong.
   if (g_pnacl_resource_host.Get() == NULL)
     return;
-  g_pnacl_resource_host.Get()->ReportTranslationFinished(instance);
+  g_pnacl_resource_host.Get()->ReportTranslationFinished(instance, success);
 }
 
 PP_Bool IsOffTheRecord() {
diff --git a/chrome/renderer/resources/extensions/OWNERS b/chrome/renderer/resources/extensions/OWNERS
index ad38aab..50f29c1 100644
--- a/chrome/renderer/resources/extensions/OWNERS
+++ b/chrome/renderer/resources/extensions/OWNERS
@@ -5,6 +5,7 @@
 jyasskin@chromium.org
 kalman@chromium.org
 koz@chromium.org
+mek@chromium.org
 miket@chromium.org
 mpcomplete@chromium.org
 yoz@chromium.org
diff --git a/chrome/renderer/resources/neterror.html b/chrome/renderer/resources/neterror.html
index 14e0a74..8b81d1d 100644
--- a/chrome/renderer/resources/neterror.html
+++ b/chrome/renderer/resources/neterror.html
@@ -43,6 +43,12 @@
 </if>
 }
 
+#diagnose-button {
+  margin-top: 20px;
+  margin-bottom: 10px;
+  -webkit-margin-start: 0px;
+}
+
 h1 {
   color: #666;
   margin: 10px 0px 25px 0px;
diff --git a/chrome/test/base/browser_with_test_window_test.cc b/chrome/test/base/browser_with_test_window_test.cc
index d9b8c06..73efa62 100644
--- a/chrome/test/base/browser_with_test_window_test.cc
+++ b/chrome/test/base/browser_with_test_window_test.cc
@@ -51,7 +51,7 @@
   // perhaps by AshTestHelper owning an AuraTestHelper.
   ash_test_helper_.reset(new ash::test::AshTestHelper(
       base::MessageLoopForUI::current()));
-  ash_test_helper_->SetUp();
+  ash_test_helper_->SetUp(true);
 #elif defined(USE_AURA)
   aura_test_helper_.reset(new aura::test::AuraTestHelper(
       base::MessageLoopForUI::current()));
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc
index c9d15d8..0aef3d5 100644
--- a/chrome/test/ppapi/ppapi_browsertest.cc
+++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -679,7 +679,14 @@
       LIST_TEST(PostMessage_ExtraParam)
   );
 }
-IN_PROC_BROWSER_TEST_F(OutOfProcessPPAPITest, PostMessage) {
+
+// Flaky: crbug.com/269530
+#if defined(OS_WIN)
+#define MAYBE_PostMessage DISABLED_PostMessage
+#else
+#define MAYBE_PostMessage PostMessage
+#endif
+IN_PROC_BROWSER_TEST_F(OutOfProcessPPAPITest, MAYBE_PostMessage) {
   RunTestViaHTTP(
       LIST_TEST(PostMessage_SendInInit)
       LIST_TEST(PostMessage_SendingData)
diff --git a/chrome/utility/importer/firefox_importer.cc b/chrome/utility/importer/firefox_importer.cc
index 2869032..b1a29a0 100644
--- a/chrome/utility/importer/firefox_importer.cc
+++ b/chrome/utility/importer/firefox_importer.cc
@@ -19,7 +19,6 @@
 #include "chrome/common/importer/imported_favicon_usage.h"
 #include "chrome/common/importer/importer_bridge.h"
 #include "chrome/common/importer/importer_url_row.h"
-#include "chrome/common/time_format.h"
 #include "chrome/utility/importer/bookmark_html_reader.h"
 #include "chrome/utility/importer/favicon_reencode.h"
 #include "chrome/utility/importer/nss_decryptor.h"
diff --git a/chrome/utility/importer/ie_importer_win.cc b/chrome/utility/importer/ie_importer_win.cc
index 76c350d..11a61c2 100644
--- a/chrome/utility/importer/ie_importer_win.cc
+++ b/chrome/utility/importer/ie_importer_win.cc
@@ -36,7 +36,6 @@
 #include "chrome/common/importer/importer_data_types.h"
 #include "chrome/common/importer/importer_url_row.h"
 #include "chrome/common/importer/pstore_declarations.h"
-#include "chrome/common/time_format.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/utility/importer/favicon_reencode.h"
 #include "content/public/common/password_form.h"
diff --git a/chrome/utility/local_discovery/service_discovery_client_unittest.cc b/chrome/utility/local_discovery/service_discovery_client_unittest.cc
index 2f7a15d..43914ee 100644
--- a/chrome/utility/local_discovery/service_discovery_client_unittest.cc
+++ b/chrome/utility/local_discovery/service_discovery_client_unittest.cc
@@ -135,6 +135,40 @@
   0x03, 0x04,
 };
 
+const uint8 kSamplePacketPTR2[] = {
+  // Header
+  0x00, 0x00,               // ID is zeroed out
+  0x81, 0x80,               // Standard query response, RA, no error
+  0x00, 0x00,               // No questions (for simplicity)
+  0x00, 0x02,               // 2 RR (answers)
+  0x00, 0x00,               // 0 authority RRs
+  0x00, 0x00,               // 0 additional RRs
+
+  0x07, '_', 'p', 'r', 'i', 'v', 'e', 't',
+  0x04, '_', 't', 'c', 'p',
+  0x05, 'l', 'o', 'c', 'a', 'l',
+  0x00,
+  0x00, 0x0c,        // TYPE is PTR.
+  0x00, 0x01,        // CLASS is IN.
+  0x02, 0x00,        // TTL (4 bytes) is 1 second.
+  0x00, 0x01,
+  0x00, 0x08,        // RDLENGTH is 8 bytes.
+  0x05, 'g', 'd', 'b', 'y', 'e',
+  0xc0, 0x0c,
+
+  0x07, '_', 'p', 'r', 'i', 'v', 'e', 't',
+  0x04, '_', 't', 'c', 'p',
+  0x05, 'l', 'o', 'c', 'a', 'l',
+  0x00,
+  0x00, 0x0c,        // TYPE is PTR.
+  0x00, 0x01,        // CLASS is IN.
+  0x02, 0x00,        // TTL (4 bytes) is 1 second.
+  0x00, 0x01,
+  0x00, 0x08,        // RDLENGTH is 8 bytes.
+  0x05, 'h', 'e', 'l', 'l', 'o',
+  0xc0, 0x0c
+};
+
 class MockServiceWatcherClient {
  public:
   MOCK_METHOD2(OnServiceUpdated,
@@ -220,12 +254,6 @@
 };
 
 TEST_F(ServiceDiscoveryTest, ReadCachedServices) {
-  scoped_ptr<ServiceWatcher> watcher_irrelevant(
-      service_discovery_client_.CreateServiceWatcher(
-          "_privet._tcp.local", ServiceWatcher::UpdatedCallback()));
-
-  watcher_irrelevant->Start();
-
   socket_factory_->SimulateReceive(
       kSamplePacketPTR, sizeof(kSamplePacketPTR));
 
@@ -244,6 +272,30 @@
   base::MessageLoop::current()->RunUntilIdle();
 };
 
+
+TEST_F(ServiceDiscoveryTest, ReadCachedServicesMultiple) {
+  socket_factory_->SimulateReceive(
+      kSamplePacketPTR2, sizeof(kSamplePacketPTR2));
+
+  StrictMock<MockServiceWatcherClient> delegate;
+  scoped_ptr<ServiceWatcher> watcher =
+      service_discovery_client_.CreateServiceWatcher(
+          "_privet._tcp.local", delegate.GetCallback());
+
+  watcher->Start();
+
+  EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED,
+                                         "hello._privet._tcp.local"))
+      .Times(Exactly(1));
+
+  EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED,
+                                         "gdbye._privet._tcp.local"))
+      .Times(Exactly(1));
+
+  base::MessageLoop::current()->RunUntilIdle();
+};
+
+
 TEST_F(ServiceDiscoveryTest, OnServiceChanged) {
   StrictMock<MockServiceWatcherClient> delegate;
   scoped_ptr<ServiceWatcher> watcher(
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 48692ed..80e13f6 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-4503.0.0
\ No newline at end of file
+4509.0.0
\ No newline at end of file
diff --git a/components/autofill/content/browser/autocheckout_manager.cc b/components/autofill/content/browser/autocheckout_manager.cc
index ee1c457..be81923 100644
--- a/components/autofill/content/browser/autocheckout_manager.cc
+++ b/components/autofill/content/browser/autocheckout_manager.cc
@@ -356,25 +356,27 @@
   for (size_t i = 0; i < result->field_count(); ++i) {
     const AutofillType& type = result->field(i)->Type();
     const base::string16& value = result->field(i)->value;
-    if (type.server_type() == CREDIT_CARD_VERIFICATION_CODE) {
+    ServerFieldType server_type = type.GetStorableType();
+    if (server_type == CREDIT_CARD_VERIFICATION_CODE) {
       cvv_ = result->field(i)->value;
       continue;
     }
     FieldTypeGroup group = type.group();
     if (group == CREDIT_CARD) {
-      credit_card_->SetRawInfo(type.server_type(), value);
+      credit_card_->SetRawInfo(server_type, value);
       // TODO(dgwallinga): Find a way of cleanly deprecating CREDIT_CARD_NAME.
       // code.google.com/p/chromium/issues/detail?id=263498
-      if (type.server_type() == CREDIT_CARD_NAME)
+      if (server_type == CREDIT_CARD_NAME)
         billing_address_->SetRawInfo(NAME_BILLING_FULL, value);
-    } else if (type.server_type() == ADDRESS_HOME_COUNTRY) {
-      profile_->SetInfo(type, value, autofill_manager_->app_locale());
-    } else if (type.server_type() == ADDRESS_BILLING_COUNTRY) {
-      billing_address_->SetInfo(type, value, autofill_manager_->app_locale());
+    } else if (server_type == ADDRESS_HOME_COUNTRY) {
+      if (IsBillingGroup(group))
+        billing_address_->SetInfo(type, value, autofill_manager_->app_locale());
+      else
+        profile_->SetInfo(type, value, autofill_manager_->app_locale());
     } else if (IsBillingGroup(group)) {
-      billing_address_->SetRawInfo(type.server_type(), value);
+      billing_address_->SetRawInfo(server_type, value);
     } else {
-      profile_->SetRawInfo(type.server_type(), value);
+      profile_->SetRawInfo(server_type, value);
     }
   }
 
@@ -431,11 +433,11 @@
       &AutocheckoutManager::MaybeShowAutocheckoutDialog,
       weak_ptr_factory_.GetWeakPtr(),
       frame_url);
-  autofill_manager_->delegate()->ShowAutocheckoutBubble(
-      bounding_box,
-      cookies.find("LSID") != std::string::npos,
-      callback);
-  is_autocheckout_bubble_showing_ = true;
+  is_autocheckout_bubble_showing_ =
+      autofill_manager_->delegate()->ShowAutocheckoutBubble(
+          bounding_box,
+          cookies.find("LSID") != std::string::npos,
+          callback);
 }
 
 bool AutocheckoutManager::IsStartOfAutofillableFlow() const {
@@ -454,7 +456,8 @@
 
   const AutofillType& type = field.Type();
 
-  if (type.server_type() == FIELD_WITH_DEFAULT_VALUE) {
+  ServerFieldType server_type = type.GetStorableType();
+  if (server_type == FIELD_WITH_DEFAULT_VALUE) {
     // For a form with radio buttons, like:
     // <form>
     //   <input type="radio" name="sex" value="male">Male<br>
@@ -488,7 +491,7 @@
   }
 
   // Handle verification code directly.
-  if (type.server_type() == CREDIT_CARD_VERIFICATION_CODE) {
+  if (server_type == CREDIT_CARD_VERIFICATION_CODE) {
     field_to_fill->value = cvv_;
     return;
   }
diff --git a/components/autofill/content/browser/autocheckout_manager_unittest.cc b/components/autofill/content/browser/autocheckout_manager_unittest.cc
index 3333384..c8e4255 100644
--- a/components/autofill/content/browser/autocheckout_manager_unittest.cc
+++ b/components/autofill/content/browser/autocheckout_manager_unittest.cc
@@ -286,13 +286,14 @@
   MOCK_METHOD0(OnAutocheckoutError, void());
   MOCK_METHOD0(OnAutocheckoutSuccess, void());
 
-  virtual void ShowAutocheckoutBubble(
+  virtual bool ShowAutocheckoutBubble(
       const gfx::RectF& bounds,
       bool is_google_user,
       const base::Callback<void(AutocheckoutBubbleState)>& callback) OVERRIDE {
     autocheckout_bubble_shown_ = true;
     if (should_autoclick_bubble_)
       callback.Run(AUTOCHECKOUT_BUBBLE_ACCEPTED);
+    return true;
   }
 
   virtual void ShowRequestAutocompleteDialog(
diff --git a/components/autofill/content/browser/wallet/full_wallet.cc b/components/autofill/content/browser/wallet/full_wallet.cc
index eaadcc4..28c47b3 100644
--- a/components/autofill/content/browser/wallet/full_wallet.cc
+++ b/components/autofill/content/browser/wallet/full_wallet.cc
@@ -128,7 +128,7 @@
 }
 
 base::string16 FullWallet::GetInfo(const AutofillType& type) {
-  switch (type.server_type()) {
+  switch (type.GetStorableType()) {
     case CREDIT_CARD_NUMBER:
       return UTF8ToUTF16(GetPan());
 
diff --git a/components/autofill/content/browser/wallet/wallet_address.cc b/components/autofill/content/browser/wallet/wallet_address.cc
index 5b69ea3..9595c3c 100644
--- a/components/autofill/content/browser/wallet/wallet_address.cc
+++ b/components/autofill/content/browser/wallet/wallet_address.cc
@@ -264,7 +264,7 @@
 
 string16 Address::GetInfo(const AutofillType& type,
                           const std::string& app_locale) const {
-  switch (AutofillType::GetEquivalentFieldType(type.server_type())) {
+  switch (type.GetStorableType()) {
     case NAME_FULL:
       return recipient_name();
 
diff --git a/components/autofill/content/browser/wallet/wallet_items.cc b/components/autofill/content/browser/wallet/wallet_items.cc
index 6a861e2..03cf3f4 100644
--- a/components/autofill/content/browser/wallet/wallet_items.cc
+++ b/components/autofill/content/browser/wallet/wallet_items.cc
@@ -314,7 +314,7 @@
   if (type.group() != CREDIT_CARD)
     return address().GetInfo(type, app_locale);
 
-  switch (type.server_type()) {
+  switch (type.GetStorableType()) {
     case CREDIT_CARD_NAME:
       return address().recipient_name();
 
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
index f2300e6..e8509c7 100644
--- a/components/autofill/content/renderer/autofill_agent.cc
+++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -177,6 +177,8 @@
                         OnFillFormsAndClick)
     IPC_MESSAGE_HANDLER(AutofillMsg_AutocheckoutSupported,
                         OnAutocheckoutSupported)
+    IPC_MESSAGE_HANDLER(AutofillMsg_PageShown,
+                        OnPageShown)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
@@ -613,6 +615,11 @@
   MaybeShowAutocheckoutBubble();
 }
 
+void AutofillAgent::OnPageShown() {
+  if (is_autocheckout_supported_)
+    MaybeShowAutocheckoutBubble();
+}
+
 void AutofillAgent::CompleteAutocheckoutPage(
     autofill::AutocheckoutStatus status) {
   click_timer_.Stop();
diff --git a/components/autofill/content/renderer/autofill_agent.h b/components/autofill/content/renderer/autofill_agent.h
index 319b3aa..9236246 100644
--- a/components/autofill/content/renderer/autofill_agent.h
+++ b/components/autofill/content/renderer/autofill_agent.h
@@ -132,6 +132,10 @@
   // Called when |topmost_frame_| is supported for Autocheckout.
   void OnAutocheckoutSupported();
 
+  // Called when the page is actually shown in the browser, as opposed to simply
+  // being preloaded.
+  void OnPageShown();
+
   // Called when an Autocheckout page is completed by the renderer.
   void CompleteAutocheckoutPage(autofill::AutocheckoutStatus status);
 
diff --git a/components/autofill/core/browser/address.cc b/components/autofill/core/browser/address.cc
index 339352f..ca522f6 100644
--- a/components/autofill/core/browser/address.cc
+++ b/components/autofill/core/browser/address.cc
@@ -44,70 +44,84 @@
 }
 
 base::string16 Address::GetRawInfo(ServerFieldType type) const {
-  type = AutofillType::GetEquivalentFieldType(type);
-  if (type == ADDRESS_HOME_LINE1)
-    return line1_;
+  // TODO(isherman): Is GetStorableType even necessary?
+  switch (AutofillType(type).GetStorableType()) {
+    case ADDRESS_HOME_LINE1:
+      return line1_;
 
-  if (type == ADDRESS_HOME_LINE2)
-    return line2_;
+    case ADDRESS_HOME_LINE2:
+      return line2_;
 
-  if (type == ADDRESS_HOME_CITY)
-    return city_;
+    case ADDRESS_HOME_CITY:
+      return city_;
 
-  if (type == ADDRESS_HOME_STATE)
-    return state_;
+    case ADDRESS_HOME_STATE:
+      return state_;
 
-  if (type ==  ADDRESS_HOME_ZIP)
-    return zip_code_;
+    case ADDRESS_HOME_ZIP:
+      return zip_code_;
 
-  if (type == ADDRESS_HOME_COUNTRY)
-    return country_code_;
+    case ADDRESS_HOME_COUNTRY:
+      return country_code_;
 
-  return base::string16();
+    default:
+      return base::string16();
+  }
 }
 
 void Address::SetRawInfo(ServerFieldType type, const base::string16& value) {
-  type = AutofillType::GetEquivalentFieldType(type);
-  if (type == ADDRESS_HOME_LINE1) {
-    line1_ = value;
-  } else if (type == ADDRESS_HOME_LINE2) {
-    line2_ = value;
-  } else if (type == ADDRESS_HOME_CITY) {
-    city_ = value;
-  } else if (type == ADDRESS_HOME_STATE) {
-    state_ = value;
-  } else if (type == ADDRESS_HOME_COUNTRY) {
-    DCHECK(value.empty() || value.length() == 2u);
-    country_code_ = value;
-  } else if (type == ADDRESS_HOME_ZIP) {
-    zip_code_ = value;
-  } else {
-    NOTREACHED();
+  // TODO(isherman): Is GetStorableType even necessary?
+  switch (AutofillType(type).GetStorableType()) {
+    case ADDRESS_HOME_LINE1:
+      line1_ = value;
+      break;
+
+    case ADDRESS_HOME_LINE2:
+      line2_ = value;
+      break;
+
+    case ADDRESS_HOME_CITY:
+      city_ = value;
+      break;
+
+    case ADDRESS_HOME_STATE:
+      state_ = value;
+      break;
+
+    case ADDRESS_HOME_COUNTRY:
+      DCHECK(value.empty() || value.length() == 2u);
+      country_code_ = value;
+      break;
+
+    case ADDRESS_HOME_ZIP:
+      zip_code_ = value;
+      break;
+
+    default:
+      NOTREACHED();
   }
 }
 
 base::string16 Address::GetInfo(const AutofillType& type,
                                 const std::string& app_locale) const {
-  ServerFieldType server_type =
-      AutofillType::GetEquivalentFieldType(type.server_type());
-  if (server_type == ADDRESS_HOME_COUNTRY && !country_code_.empty())
+  ServerFieldType storable_type = type.GetStorableType();
+  if (storable_type == ADDRESS_HOME_COUNTRY && !country_code_.empty())
     return AutofillCountry(UTF16ToASCII(country_code_), app_locale).name();
 
-  return GetRawInfo(server_type);
+  return GetRawInfo(storable_type);
 }
 
 bool Address::SetInfo(const AutofillType& type,
                       const base::string16& value,
                       const std::string& app_locale) {
-  ServerFieldType server_type =
-      AutofillType::GetEquivalentFieldType(type.server_type());
-  if (server_type == ADDRESS_HOME_COUNTRY && !value.empty()) {
+  ServerFieldType storable_type = type.GetStorableType();
+  if (storable_type == ADDRESS_HOME_COUNTRY && !value.empty()) {
     country_code_ =
         ASCIIToUTF16(AutofillCountry::GetCountryCode(value, app_locale));
     return !country_code_.empty();
   }
 
-  SetRawInfo(server_type, value);
+  SetRawInfo(storable_type, value);
   return true;
 }
 
diff --git a/components/autofill/core/browser/autofill_data_model.cc b/components/autofill/core/browser/autofill_data_model.cc
index 28a380e..2d1edcf 100644
--- a/components/autofill/core/browser/autofill_data_model.cc
+++ b/components/autofill/core/browser/autofill_data_model.cc
@@ -158,22 +158,20 @@
     return;
   }
 
-  ServerFieldType server_type = type.server_type();
-  if (server_type == ADDRESS_HOME_STATE ||
-      server_type == ADDRESS_BILLING_STATE) {
+  ServerFieldType storable_type = type.GetStorableType();
+  if (storable_type == ADDRESS_HOME_STATE) {
     FillStateSelectControl(field_text, field);
-  } else if (server_type == ADDRESS_HOME_COUNTRY ||
-             server_type == ADDRESS_BILLING_COUNTRY) {
+  } else if (storable_type == ADDRESS_HOME_COUNTRY) {
     FillCountrySelectControl(app_locale, field);
-  } else if (server_type == CREDIT_CARD_EXP_MONTH) {
+  } else if (storable_type == CREDIT_CARD_EXP_MONTH) {
     FillExpirationMonthSelectControl(field_text, field);
-  } else if (server_type == CREDIT_CARD_EXP_4_DIGIT_YEAR) {
+  } else if (storable_type == CREDIT_CARD_EXP_4_DIGIT_YEAR) {
     // Attempt to fill the year as a 2-digit year.  This compensates for the
     // fact that our heuristics do not always correctly detect when a website
     // requests a 2-digit rather than a 4-digit year.
     FillSelectControl(AutofillType(CREDIT_CARD_EXP_2_DIGIT_YEAR), app_locale,
                       field);
-  } else if (server_type == CREDIT_CARD_TYPE) {
+  } else if (storable_type == CREDIT_CARD_TYPE) {
     FillCreditCardTypeSelectControl(field_text, field);
   }
 }
diff --git a/components/autofill/core/browser/autofill_field.cc b/components/autofill/core/browser/autofill_field.cc
index 5d19232..4bcb118 100644
--- a/components/autofill/core/browser/autofill_field.cc
+++ b/components/autofill/core/browser/autofill_field.cc
@@ -31,6 +31,8 @@
 AutofillField::AutofillField()
     : server_type_(NO_SERVER_DATA),
       heuristic_type_(UNKNOWN_TYPE),
+      html_type_(HTML_TYPE_UNKNOWN),
+      html_mode_(HTML_MODE_NONE),
       phone_part_(IGNORED) {
 }
 
@@ -40,6 +42,8 @@
       unique_name_(unique_name),
       server_type_(NO_SERVER_DATA),
       heuristic_type_(UNKNOWN_TYPE),
+      html_type_(HTML_TYPE_UNKNOWN),
+      html_mode_(HTML_MODE_NONE),
       phone_part_(IGNORED) {
 }
 
@@ -65,7 +69,20 @@
   server_type_ = type;
 }
 
+void AutofillField::SetHtmlType(HtmlFieldType type, HtmlFieldMode mode) {
+  html_type_ = type;
+  html_mode_ = mode;
+
+  if (type == HTML_TYPE_TEL_LOCAL_PREFIX)
+    phone_part_ = AutofillField::PHONE_PREFIX;
+  else if (type == HTML_TYPE_TEL_LOCAL_SUFFIX)
+    phone_part_ = AutofillField::PHONE_SUFFIX;
+}
+
 AutofillType AutofillField::Type() const {
+  if (html_type_ != HTML_TYPE_UNKNOWN)
+    return AutofillType(html_type_, html_mode_);
+
   if (server_type_ != NO_SERVER_DATA)
     return AutofillType(server_type_);
 
@@ -83,7 +100,7 @@
 }
 
 bool AutofillField::IsFieldFillable() const {
-  return Type().server_type() != UNKNOWN_TYPE;
+  return !Type().IsUnknown();
 }
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_field.h b/components/autofill/core/browser/autofill_field.h
index 53826cd..6f57484 100644
--- a/components/autofill/core/browser/autofill_field.h
+++ b/components/autofill/core/browser/autofill_field.h
@@ -33,17 +33,19 @@
   const std::string& section() const { return section_; }
   ServerFieldType heuristic_type() const { return heuristic_type_; }
   ServerFieldType server_type() const { return server_type_; }
+  HtmlFieldType html_type() const { return html_type_; }
+  HtmlFieldMode html_mode() const { return html_mode_; }
   const ServerFieldTypeSet& possible_types() const { return possible_types_; }
   PhonePart phone_part() const { return phone_part_; }
 
-  // Sets the heuristic type of this field, validating the input.
+  // Setters for the detected type and section for this field.
   void set_section(const std::string& section) { section_ = section; }
   void set_heuristic_type(ServerFieldType type);
   void set_server_type(ServerFieldType type);
   void set_possible_types(const ServerFieldTypeSet& possible_types) {
     possible_types_ = possible_types;
   }
-  void set_phone_part(PhonePart part) { phone_part_ = part; }
+  void SetHtmlType(HtmlFieldType type, HtmlFieldMode mode);
 
   // This function automatically chooses between server and heuristic autofill
   // type, depending on the data available.
@@ -77,6 +79,13 @@
   // The type of the field, as determined by the local heuristics.
   ServerFieldType heuristic_type_;
 
+  // The type of the field, as specified by the site author in HTML.
+  HtmlFieldType html_type_;
+
+  // The "mode" of the field, as specified by the site author in HTML.
+  // Currently this is used to distinguish between billing and shipping fields.
+  HtmlFieldMode html_mode_;
+
   // The set of possible types for this field.
   ServerFieldTypeSet possible_types_;
 
diff --git a/components/autofill/core/browser/autofill_field_unittest.cc b/components/autofill/core/browser/autofill_field_unittest.cc
index c47f314..3c26302 100644
--- a/components/autofill/core/browser/autofill_field_unittest.cc
+++ b/components/autofill/core/browser/autofill_field_unittest.cc
@@ -18,19 +18,22 @@
   ASSERT_EQ(UNKNOWN_TYPE, field.heuristic_type());
 
   // |server_type_| is NO_SERVER_DATA, so |heuristic_type_| is returned.
-  EXPECT_EQ(UNKNOWN_TYPE, field.Type().server_type());
+  EXPECT_EQ(UNKNOWN_TYPE, field.Type().GetStorableType());
 
   // Set the heuristic type and check it.
   field.set_heuristic_type(NAME_FIRST);
-  EXPECT_EQ(NAME_FIRST, field.Type().server_type());
+  EXPECT_EQ(NAME_FIRST, field.Type().GetStorableType());
+  EXPECT_EQ(NAME, field.Type().group());
 
   // Set the server type and check it.
   field.set_server_type(ADDRESS_BILLING_LINE1);
-  EXPECT_EQ(ADDRESS_BILLING_LINE1, field.Type().server_type());
+  EXPECT_EQ(ADDRESS_HOME_LINE1, field.Type().GetStorableType());
+  EXPECT_EQ(ADDRESS_BILLING, field.Type().group());
 
   // Remove the server type to make sure the heuristic type is preserved.
   field.set_server_type(NO_SERVER_DATA);
-  EXPECT_EQ(NAME_FIRST, field.Type().server_type());
+  EXPECT_EQ(NAME_FIRST, field.Type().GetStorableType());
+  EXPECT_EQ(NAME, field.Type().group());
 }
 
 TEST(AutofillFieldTest, IsEmpty) {
@@ -72,7 +75,7 @@
 
 TEST(AutofillFieldTest, IsFieldFillable) {
   AutofillField field;
-  ASSERT_EQ(UNKNOWN_TYPE, field.Type().server_type());
+  ASSERT_EQ(UNKNOWN_TYPE, field.Type().GetStorableType());
 
   // Type is unknown.
   EXPECT_FALSE(field.IsFieldFillable());
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index dded980..4c66699 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -1075,7 +1075,7 @@
     std::vector<int>* unique_ids) const {
   std::vector<ServerFieldType> field_types(form->field_count());
   for (size_t i = 0; i < form->field_count(); ++i) {
-    field_types.push_back(form->field(i)->Type().server_type());
+    field_types.push_back(form->field(i)->Type().GetStorableType());
   }
   std::vector<GUIDPair> guid_pairs;
 
diff --git a/components/autofill/core/browser/autofill_manager_delegate.h b/components/autofill/core/browser/autofill_manager_delegate.h
index 9847f6b..374c105 100644
--- a/components/autofill/core/browser/autofill_manager_delegate.h
+++ b/components/autofill/core/browser/autofill_manager_delegate.h
@@ -96,8 +96,9 @@
   // Causes the Autocheckout bubble UI to be displayed. |bounding_box| is the
   // anchor for the bubble. |is_google_user| is whether or not the user is
   // logged into or has been logged into accounts.google.com. |callback| is run
-  // if the bubble is accepted.
-  virtual void ShowAutocheckoutBubble(
+  // if the bubble is accepted. The returned boolean informs the caller whether
+  // or not the bubble is successfully shown.
+  virtual bool ShowAutocheckoutBubble(
       const gfx::RectF& bounding_box,
       bool is_google_user,
       const base::Callback<void(AutocheckoutBubbleState)>& callback) = 0;
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc
index 8c2a8ef..e69ed0f 100644
--- a/components/autofill/core/browser/autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -522,7 +522,7 @@
                  expected_submitted_field_types_[i].begin();
              it != expected_submitted_field_types_[i].end(); ++it) {
           EXPECT_TRUE(possible_types.count(*it))
-              << "Expected type: " << AutofillType::FieldTypeToString(*it);
+              << "Expected type: " << AutofillType(*it).ToString();
         }
       }
     }
@@ -2652,7 +2652,7 @@
   std::vector<ServerFieldType> heuristic_types, server_types;
   for (size_t i = 0; i < form.fields.size(); ++i) {
     heuristic_types.push_back(UNKNOWN_TYPE);
-    server_types.push_back(form_structure->field(i)->Type().server_type());
+    server_types.push_back(form_structure->field(i)->heuristic_type());
   }
   form_structure->SetFieldTypes(heuristic_types, server_types);
   autofill_manager_->AddSeenForm(form_structure);
@@ -3113,12 +3113,13 @@
 
   virtual ~MockAutofillManagerDelegate() {}
 
-  virtual void ShowAutocheckoutBubble(
+  virtual bool ShowAutocheckoutBubble(
       const gfx::RectF& bounds,
       bool is_google_user,
       const base::Callback<void(AutocheckoutBubbleState)>& callback) OVERRIDE {
     autocheckout_bubble_shown_ = true;
     callback.Run(AUTOCHECKOUT_BUBBLE_ACCEPTED);
+    return true;
   }
 
   virtual void ShowRequestAutocompleteDialog(
@@ -3166,7 +3167,7 @@
   std::vector<ServerFieldType> heuristic_types, server_types;
   for (size_t i = 0; i < form.fields.size(); ++i) {
     heuristic_types.push_back(UNKNOWN_TYPE);
-    server_types.push_back(form_structure->field(i)->Type().server_type());
+    server_types.push_back(form_structure->field(i)->heuristic_type());
   }
   form_structure->SetFieldTypes(heuristic_types, server_types);
   autofill_manager_->AddSeenForm(form_structure);
@@ -3195,7 +3196,7 @@
   // Build form structure without server data.
   std::vector<ServerFieldType> heuristic_types, server_types;
   for (size_t i = 0; i < form.fields.size(); ++i) {
-    heuristic_types.push_back(form_structure->field(i)->Type().server_type());
+    heuristic_types.push_back(form_structure->field(i)->heuristic_type());
     server_types.push_back(NO_SERVER_DATA);
   }
   form_structure->SetFieldTypes(heuristic_types, server_types);
@@ -3240,7 +3241,7 @@
   std::vector<ServerFieldType> heuristic_types, server_types;
   for (size_t i = 0; i < address.fields.size(); ++i) {
     heuristic_types.push_back(UNKNOWN_TYPE);
-    server_types.push_back(form_structure->field(i)->Type().server_type());
+    server_types.push_back(form_structure->field(i)->heuristic_type());
   }
   form_structure->SetFieldTypes(heuristic_types, server_types);
   autofill_manager_->AddSeenForm(form_structure.release());
diff --git a/components/autofill/core/browser/autofill_merge_unittest.cc b/components/autofill/core/browser/autofill_merge_unittest.cc
index e13f494..21918d7 100644
--- a/components/autofill/core/browser/autofill_merge_unittest.cc
+++ b/components/autofill/core/browser/autofill_merge_unittest.cc
@@ -67,7 +67,7 @@
       std::vector<base::string16> values;
       profiles[i]->GetRawMultiInfo(type, &values);
       for (size_t k = 0; k < values.size(); ++k) {
-        result += AutofillType::FieldTypeToString(type);
+        result += AutofillType(type).ToString();
         result += kFieldSeparator;
         result += UTF16ToUTF8(values[k]);
         result += "\n";
diff --git a/components/autofill/core/browser/autofill_profile.cc b/components/autofill/core/browser/autofill_profile.cc
index f1577ed..6e18011 100644
--- a/components/autofill/core/browser/autofill_profile.cc
+++ b/components/autofill/core/browser/autofill_profile.cc
@@ -30,14 +30,14 @@
 namespace autofill {
 namespace {
 
-// Like |AutofillType::GetEquivalentFieldType()|, but also returns |NAME_FULL|
-// for first, middle, and last name field types.
-ServerFieldType GetEquivalentFieldTypeCollapsingNames(ServerFieldType type) {
-  if (type == NAME_FIRST || type == NAME_MIDDLE || type == NAME_LAST ||
-      type == NAME_MIDDLE_INITIAL)
+// Like |AutofillType::GetStorableType()|, but also returns |NAME_FULL| for
+// first, middle, and last name field types.
+ServerFieldType GetStorableTypeCollapsingNames(ServerFieldType type) {
+  ServerFieldType storable_type = AutofillType(type).GetStorableType();
+  if (AutofillType(storable_type).group() == NAME)
     return NAME_FULL;
 
-  return AutofillType::GetEquivalentFieldType(type);
+  return storable_type;
 }
 
 // Fills |distinguishing_fields| with a list of fields to use when creating
@@ -76,13 +76,13 @@
   // Always ignore fields of unknown type and the excluded field.
   std::set<ServerFieldType> seen_fields;
   seen_fields.insert(UNKNOWN_TYPE);
-  seen_fields.insert(GetEquivalentFieldTypeCollapsingNames(excluded_field));
+  seen_fields.insert(GetStorableTypeCollapsingNames(excluded_field));
 
   distinguishing_fields->clear();
   for (std::vector<ServerFieldType>::const_iterator it =
            suggested_fields->begin();
        it != suggested_fields->end(); ++it) {
-    ServerFieldType suggested_type = GetEquivalentFieldTypeCollapsingNames(*it);
+    ServerFieldType suggested_type = GetStorableTypeCollapsingNames(*it);
     if (seen_fields.insert(suggested_type).second)
       distinguishing_fields->push_back(suggested_type);
   }
@@ -92,12 +92,12 @@
   // list of distinguishing fields as a last-ditch fallback. This allows us to
   // distinguish between profiles that are identical except for the name.
   if (excluded_field != NAME_FULL &&
-      GetEquivalentFieldTypeCollapsingNames(excluded_field) == NAME_FULL) {
+      GetStorableTypeCollapsingNames(excluded_field) == NAME_FULL) {
     for (std::vector<ServerFieldType>::const_iterator it =
              suggested_fields->begin();
          it != suggested_fields->end(); ++it) {
       if (*it != excluded_field &&
-          GetEquivalentFieldTypeCollapsingNames(*it) == NAME_FULL) {
+          GetStorableTypeCollapsingNames(*it) == NAME_FULL) {
         distinguishing_fields->push_back(NAME_FULL);
         break;
       }
@@ -124,7 +124,7 @@
                                 const AutofillType& type,
                                 const std::string& app_locale) {
   return app_locale.empty() ?
-      form_group.GetRawInfo(type.server_type()) :
+      form_group.GetRawInfo(type.GetStorableType()) :
       form_group.GetInfo(type, app_locale);
 }
 
@@ -275,12 +275,11 @@
 }
 
 base::string16 AutofillProfile::GetRawInfo(ServerFieldType type) const {
-  ServerFieldType return_type = AutofillType::GetEquivalentFieldType(type);
-  const FormGroup* form_group = FormGroupForType(AutofillType(return_type));
+  const FormGroup* form_group = FormGroupForType(AutofillType(type));
   if (!form_group)
     return base::string16();
 
-  return form_group->GetRawInfo(return_type);
+  return form_group->GetRawInfo(type);
 }
 
 void AutofillProfile::SetRawInfo(ServerFieldType type,
@@ -292,13 +291,11 @@
 
 base::string16 AutofillProfile::GetInfo(const AutofillType& type,
                                         const std::string& app_locale) const {
-  ServerFieldType return_type =
-      AutofillType::GetEquivalentFieldType(type.server_type());
-  const FormGroup* form_group = FormGroupForType(AutofillType(return_type));
+  const FormGroup* form_group = FormGroupForType(type);
   if (!form_group)
     return base::string16();
 
-  return form_group->GetInfo(AutofillType(return_type), app_locale);
+  return form_group->GetInfo(type, app_locale);
 }
 
 bool AutofillProfile::SetInfo(const AutofillType& type,
@@ -363,8 +360,7 @@
   DCHECK_NE(CREDIT_CARD, type.group());
   DCHECK(field_data);
 
-  if (type.server_type() == PHONE_HOME_NUMBER ||
-      type.server_type() == PHONE_BILLING_NUMBER) {
+  if (type.GetStorableType() == PHONE_HOME_NUMBER) {
     FillPhoneNumberField(field, variant, app_locale, field_data);
   } else if (field_data->form_control_type == "select-one") {
     FillSelectControl(type, app_locale, field_data);
diff --git a/components/autofill/core/browser/autofill_type.cc b/components/autofill/core/browser/autofill_type.cc
index 14eeee0..c47a9df 100644
--- a/components/autofill/core/browser/autofill_type.cc
+++ b/components/autofill/core/browser/autofill_type.cc
@@ -4,13 +4,13 @@
 
 #include "components/autofill/core/browser/autofill_type.h"
 
-#include <ostream>
-
 #include "base/logging.h"
 
 namespace autofill {
 
-AutofillType::AutofillType(ServerFieldType field_type) {
+AutofillType::AutofillType(ServerFieldType field_type)
+    : html_type_(HTML_TYPE_UNKNOWN),
+      html_mode_(HTML_MODE_NONE) {
   if ((field_type < NO_SERVER_DATA || field_type >= MAX_VALID_FIELD_TYPE) ||
       (field_type >= 15 && field_type <= 19) ||
       (field_type >= 25 && field_type <= 29) ||
@@ -21,13 +21,23 @@
   }
 }
 
+AutofillType::AutofillType(HtmlFieldType field_type, HtmlFieldMode mode)
+    : server_type_(UNKNOWN_TYPE),
+      html_type_(field_type),
+      html_mode_(mode) {}
+
+
 AutofillType::AutofillType(const AutofillType& autofill_type) {
   *this = autofill_type;
 }
 
 AutofillType& AutofillType::operator=(const AutofillType& autofill_type) {
-  if (this != &autofill_type)
+  if (this != &autofill_type) {
     this->server_type_ = autofill_type.server_type_;
+    this->html_type_ = autofill_type.html_type_;
+    this->html_mode_ = autofill_type.html_mode_;
+  }
+
   return *this;
 }
 
@@ -98,17 +108,83 @@
     case COMPANY_NAME:
       return COMPANY;
 
-    default:
+    case NO_SERVER_DATA:
+    case EMPTY_TYPE:
+    case PHONE_FAX_NUMBER:
+    case PHONE_FAX_CITY_CODE:
+    case PHONE_FAX_COUNTRY_CODE:
+    case PHONE_FAX_CITY_AND_NUMBER:
+    case PHONE_FAX_WHOLE_NUMBER:
+    case FIELD_WITH_DEFAULT_VALUE:
       return NO_GROUP;
+
+    case MAX_VALID_FIELD_TYPE:
+      NOTREACHED();
+      return NO_GROUP;
+
+    case UNKNOWN_TYPE:
+      break;
   }
+
+  switch (html_type_) {
+    case HTML_TYPE_NAME:
+    case HTML_TYPE_GIVEN_NAME:
+    case HTML_TYPE_ADDITIONAL_NAME:
+    case HTML_TYPE_ADDITIONAL_NAME_INITIAL:
+    case HTML_TYPE_FAMILY_NAME:
+      return html_mode_ == HTML_MODE_BILLING ? NAME_BILLING : NAME;
+
+    case HTML_TYPE_ORGANIZATION:
+      return COMPANY;
+
+    case HTML_TYPE_ADDRESS_LINE1:
+    case HTML_TYPE_ADDRESS_LINE2:
+    case HTML_TYPE_LOCALITY:
+    case HTML_TYPE_REGION:
+    case HTML_TYPE_COUNTRY_CODE:
+    case HTML_TYPE_COUNTRY_NAME:
+    case HTML_TYPE_POSTAL_CODE:
+      return html_mode_ == HTML_MODE_BILLING ? ADDRESS_BILLING : ADDRESS_HOME;
+
+    case HTML_TYPE_CREDIT_CARD_NAME:
+    case HTML_TYPE_CREDIT_CARD_NUMBER:
+    case HTML_TYPE_CREDIT_CARD_EXP:
+    case HTML_TYPE_CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR:
+    case HTML_TYPE_CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR:
+    case HTML_TYPE_CREDIT_CARD_EXP_MONTH:
+    case HTML_TYPE_CREDIT_CARD_EXP_YEAR:
+    case HTML_TYPE_CREDIT_CARD_EXP_2_DIGIT_YEAR:
+    case HTML_TYPE_CREDIT_CARD_EXP_4_DIGIT_YEAR:
+    case HTML_TYPE_CREDIT_CARD_VERIFICATION_CODE:
+    case HTML_TYPE_CREDIT_CARD_TYPE:
+      return CREDIT_CARD;
+
+    case HTML_TYPE_TEL:
+    case HTML_TYPE_TEL_COUNTRY_CODE:
+    case HTML_TYPE_TEL_NATIONAL:
+    case HTML_TYPE_TEL_AREA_CODE:
+    case HTML_TYPE_TEL_LOCAL:
+    case HTML_TYPE_TEL_LOCAL_PREFIX:
+    case HTML_TYPE_TEL_LOCAL_SUFFIX:
+      return html_mode_ == HTML_MODE_BILLING ? PHONE_BILLING : PHONE_HOME;
+
+    case HTML_TYPE_EMAIL:
+      return EMAIL;
+
+    case HTML_TYPE_UNKNOWN:
+      break;
+  }
+
+  return NO_GROUP;
 }
 
-// static
-ServerFieldType AutofillType::GetEquivalentFieldType(
-    ServerFieldType field_type) {
-  // When billing information is requested from the profile we map to the
-  // home address equivalents.
-  switch (field_type) {
+bool AutofillType::IsUnknown() const {
+  return server_type_ == UNKNOWN_TYPE && html_type_ == HTML_TYPE_UNKNOWN;
+}
+
+ServerFieldType AutofillType::GetStorableType() const {
+  // Map billing types to the equivalent non-billing types.
+  switch (server_type_) {
     case ADDRESS_BILLING_LINE1:
       return ADDRESS_HOME_LINE1;
 
@@ -163,9 +239,110 @@
     case NAME_BILLING_SUFFIX:
       return NAME_SUFFIX;
 
+    case UNKNOWN_TYPE:
+      break;  // Try to parse HTML types instead.
+
     default:
-      return field_type;
+      return server_type_;
   }
+
+  switch (html_type_) {
+    case HTML_TYPE_UNKNOWN:
+      return UNKNOWN_TYPE;
+
+    case HTML_TYPE_NAME:
+      return NAME_FULL;
+
+    case HTML_TYPE_GIVEN_NAME:
+      return NAME_FIRST;
+
+    case HTML_TYPE_ADDITIONAL_NAME:
+      return NAME_MIDDLE;
+
+    case HTML_TYPE_FAMILY_NAME:
+      return NAME_LAST;
+
+    case HTML_TYPE_ORGANIZATION:
+      return COMPANY_NAME;
+
+    case HTML_TYPE_ADDRESS_LINE1:
+      return ADDRESS_HOME_LINE1;
+
+    case HTML_TYPE_ADDRESS_LINE2:
+      return ADDRESS_HOME_LINE2;
+
+    case HTML_TYPE_LOCALITY:
+      return ADDRESS_HOME_CITY;
+
+    case HTML_TYPE_REGION:
+      return ADDRESS_HOME_STATE;
+
+    case HTML_TYPE_COUNTRY_CODE:
+    case HTML_TYPE_COUNTRY_NAME:
+      return ADDRESS_HOME_COUNTRY;
+
+    case HTML_TYPE_POSTAL_CODE:
+      return ADDRESS_HOME_ZIP;
+
+    case HTML_TYPE_CREDIT_CARD_NAME:
+      return CREDIT_CARD_NAME;
+
+    case HTML_TYPE_CREDIT_CARD_NUMBER:
+      return CREDIT_CARD_NUMBER;
+
+    case HTML_TYPE_CREDIT_CARD_EXP:
+      return CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR;
+
+    case HTML_TYPE_CREDIT_CARD_EXP_MONTH:
+      return CREDIT_CARD_EXP_MONTH;
+
+    case HTML_TYPE_CREDIT_CARD_EXP_YEAR:
+      return CREDIT_CARD_EXP_4_DIGIT_YEAR;
+
+    case HTML_TYPE_CREDIT_CARD_VERIFICATION_CODE:
+      return CREDIT_CARD_VERIFICATION_CODE;
+
+    case HTML_TYPE_CREDIT_CARD_TYPE:
+      return CREDIT_CARD_TYPE;
+
+    case HTML_TYPE_TEL:
+      return PHONE_HOME_WHOLE_NUMBER;
+
+    case HTML_TYPE_TEL_COUNTRY_CODE:
+      return PHONE_HOME_COUNTRY_CODE;
+
+    case HTML_TYPE_TEL_NATIONAL:
+      return PHONE_HOME_CITY_AND_NUMBER;
+
+    case HTML_TYPE_TEL_AREA_CODE:
+      return PHONE_HOME_CITY_CODE;
+
+    case HTML_TYPE_TEL_LOCAL:
+    case HTML_TYPE_TEL_LOCAL_PREFIX:
+    case HTML_TYPE_TEL_LOCAL_SUFFIX:
+      return PHONE_HOME_NUMBER;
+
+    case HTML_TYPE_EMAIL:
+      return EMAIL_ADDRESS;
+
+    case HTML_TYPE_ADDITIONAL_NAME_INITIAL:
+      return NAME_MIDDLE_INITIAL;
+
+    case HTML_TYPE_CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR:
+      return CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR;
+
+    case HTML_TYPE_CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR:
+      return CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR;
+
+    case HTML_TYPE_CREDIT_CARD_EXP_2_DIGIT_YEAR:
+      return CREDIT_CARD_EXP_2_DIGIT_YEAR;
+
+    case HTML_TYPE_CREDIT_CARD_EXP_4_DIGIT_YEAR:
+      return CREDIT_CARD_EXP_4_DIGIT_YEAR;
+  }
+
+  NOTREACHED();
+  return UNKNOWN_TYPE;
 }
 
 // static
@@ -231,13 +408,15 @@
   }
 }
 
-// static
-std::string AutofillType::FieldTypeToString(ServerFieldType type) {
-  switch (type) {
+std::string AutofillType::ToString() const {
+  if (IsUnknown())
+    return "UNKNOWN_TYPE";
+
+  switch (server_type_) {
     case NO_SERVER_DATA:
       return "NO_SERVER_DATA";
     case UNKNOWN_TYPE:
-      return "UNKNOWN_TYPE";
+      break;  // Should be handled in the HTML type handling code below.
     case EMPTY_TYPE:
       return "EMPTY_TYPE";
     case NAME_FIRST:
@@ -349,6 +528,78 @@
     case MAX_VALID_FIELD_TYPE:
       return std::string();
   }
+
+  switch (html_type_) {
+    case HTML_TYPE_UNKNOWN:
+      NOTREACHED();
+      break;
+    case HTML_TYPE_NAME:
+      return "HTML_TYPE_NAME";
+    case HTML_TYPE_GIVEN_NAME:
+      return "HTML_TYPE_GIVEN_NAME";
+    case HTML_TYPE_ADDITIONAL_NAME:
+      return "HTML_TYPE_ADDITIONAL_NAME";
+    case HTML_TYPE_FAMILY_NAME:
+      return "HTML_TYPE_FAMILY_NAME";
+    case HTML_TYPE_ORGANIZATION:
+      return "HTML_TYPE_ORGANIZATION";
+    case HTML_TYPE_ADDRESS_LINE1:
+      return "HTML_TYPE_ADDRESS_LINE1";
+    case HTML_TYPE_ADDRESS_LINE2:
+      return "HTML_TYPE_ADDRESS_LINE2";
+    case HTML_TYPE_LOCALITY:
+      return "HTML_TYPE_LOCALITY";
+    case HTML_TYPE_REGION:
+      return "HTML_TYPE_REGION";
+    case HTML_TYPE_COUNTRY_CODE:
+      return "HTML_TYPE_COUNTRY_CODE";
+    case HTML_TYPE_COUNTRY_NAME:
+      return "HTML_TYPE_COUNTRY_NAME";
+    case HTML_TYPE_POSTAL_CODE:
+      return "HTML_TYPE_POSTAL_CODE";
+    case HTML_TYPE_CREDIT_CARD_NAME:
+      return "HTML_TYPE_CREDIT_CARD_NAME";
+    case HTML_TYPE_CREDIT_CARD_NUMBER:
+      return "HTML_TYPE_CREDIT_CARD_NUMBER";
+    case HTML_TYPE_CREDIT_CARD_EXP:
+      return "HTML_TYPE_CREDIT_CARD_EXP";
+    case HTML_TYPE_CREDIT_CARD_EXP_MONTH:
+      return "HTML_TYPE_CREDIT_CARD_EXP_MONTH";
+    case HTML_TYPE_CREDIT_CARD_EXP_YEAR:
+      return "HTML_TYPE_CREDIT_CARD_EXP_YEAR";
+    case HTML_TYPE_CREDIT_CARD_VERIFICATION_CODE:
+      return "HTML_TYPE_CREDIT_CARD_VERIFICATION_CODE";
+    case HTML_TYPE_CREDIT_CARD_TYPE:
+      return "HTML_TYPE_CREDIT_CARD_TYPE";
+    case HTML_TYPE_TEL:
+      return "HTML_TYPE_TEL";
+    case HTML_TYPE_TEL_COUNTRY_CODE:
+      return "HTML_TYPE_TEL_COUNTRY_CODE";
+    case HTML_TYPE_TEL_NATIONAL:
+      return "HTML_TYPE_TEL_NATIONAL";
+    case HTML_TYPE_TEL_AREA_CODE:
+      return "HTML_TYPE_TEL_AREA_CODE";
+    case HTML_TYPE_TEL_LOCAL:
+      return "HTML_TYPE_TEL_LOCAL";
+    case HTML_TYPE_TEL_LOCAL_PREFIX:
+      return "HTML_TYPE_TEL_LOCAL_PREFIX";
+    case HTML_TYPE_TEL_LOCAL_SUFFIX:
+      return "HTML_TYPE_TEL_LOCAL_SUFFIX";
+    case HTML_TYPE_EMAIL:
+      return "HTML_TYPE_EMAIL";
+    case HTML_TYPE_ADDITIONAL_NAME_INITIAL:
+      return "HTML_TYPE_ADDITIONAL_NAME_INITIAL";
+    case HTML_TYPE_CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR:
+      return "HTML_TYPE_CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR";
+    case HTML_TYPE_CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR:
+      return "HTML_TYPE_CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR";
+    case HTML_TYPE_CREDIT_CARD_EXP_2_DIGIT_YEAR:
+      return "HTML_TYPE_CREDIT_CARD_EXP_2_DIGIT_YEAR";
+    case HTML_TYPE_CREDIT_CARD_EXP_4_DIGIT_YEAR:
+      return "HTML_TYPE_CREDIT_CARD_EXP_4_DIGIT_YEAR";
+  }
+
+  NOTREACHED();
   return std::string();
 }
 
diff --git a/components/autofill/core/browser/autofill_type.h b/components/autofill/core/browser/autofill_type.h
index a7d243c..653c023 100644
--- a/components/autofill/core/browser/autofill_type.h
+++ b/components/autofill/core/browser/autofill_type.h
@@ -16,31 +16,45 @@
 class AutofillType {
  public:
   explicit AutofillType(ServerFieldType field_type);
+  AutofillType(HtmlFieldType field_type, HtmlFieldMode mode);
   AutofillType(const AutofillType& autofill_type);
   AutofillType& operator=(const AutofillType& autofill_type);
 
-  // TODO(isherman): Audit all uses of this method.
-  ServerFieldType server_type() const { return server_type_; }
   FieldTypeGroup group() const;
 
-  // Maps |field_type| to a field type that can be directly stored in a profile
-  // (in the sense that it makes sense to call |AutofillProfile::SetInfo()| with
-  // the returned field type as the first parameter).
-  static ServerFieldType GetEquivalentFieldType(ServerFieldType field_type);
+  // Returns true if both the |server_type_| and the |html_type_| are set to
+  // their respective enum's unknown value.
+  bool IsUnknown() const;
+
+  // Maps |this| type to a field type that can be directly stored in an Autofill
+  // data model (in the sense that it makes sense to call
+  // |AutofillDataModel::SetRawInfo()| with the returned field type as the first
+  // parameter).
+  ServerFieldType GetStorableType() const;
+
+  // Serializes |this| type to a string.
+  std::string ToString() const;
 
   // Maps |field_type| to a field type from ADDRESS_BILLING FieldTypeGroup if
   // field type is an Address type.
+  // TODO(isherman): This method is only used by the
+  // AutofillDialogControllerImpl class.  Consider moving it to a more focused
+  // location.
   static ServerFieldType GetEquivalentBillingFieldType(
       ServerFieldType field_type);
 
-  // Utilities for serializing and deserializing a |ServerFieldType|.
-  // TODO(isherman): This should probably serialize an HTML type as well.
-  //                 Audit all uses of these functions.
-  static std::string FieldTypeToString(ServerFieldType field_type);
+  // TODO(isherman): This method is only used be a single test class.  Move the
+  // logic into there or something, eh?
   static ServerFieldType StringToFieldType(const std::string& str);
 
  private:
+  // The server-native field type, or UNKNOWN_TYPE if unset.
   ServerFieldType server_type_;
+
+  // The HTML autocomplete field type and mode hints, or HTML_TYPE_UNKNOWN and
+  // HTML_MODE_NONE if unset.
+  HtmlFieldType html_type_;
+  HtmlFieldMode html_mode_;
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_type_unittest.cc b/components/autofill/core/browser/autofill_type_unittest.cc
index d9e8f9e..71e98b4 100644
--- a/components/autofill/core/browser/autofill_type_unittest.cc
+++ b/components/autofill/core/browser/autofill_type_unittest.cc
@@ -8,47 +8,84 @@
 namespace autofill {
 namespace {
 
-TEST(AutofillTypeTest, AutofillTypes) {
+TEST(AutofillTypeTest, ServerFieldTypes) {
   // No server data.
   AutofillType none(NO_SERVER_DATA);
-  EXPECT_EQ(NO_SERVER_DATA, none.server_type());
+  EXPECT_EQ(NO_SERVER_DATA, none.GetStorableType());
   EXPECT_EQ(NO_GROUP, none.group());
 
   // Unknown type.
   AutofillType unknown(UNKNOWN_TYPE);
-  EXPECT_EQ(UNKNOWN_TYPE, unknown.server_type());
+  EXPECT_EQ(UNKNOWN_TYPE, unknown.GetStorableType());
   EXPECT_EQ(NO_GROUP, unknown.group());
 
   // Type with group but no subgroup.
   AutofillType first(NAME_FIRST);
-  EXPECT_EQ(NAME_FIRST, first.server_type());
+  EXPECT_EQ(NAME_FIRST, first.GetStorableType());
   EXPECT_EQ(NAME, first.group());
 
   // Type with group and subgroup.
   AutofillType phone(PHONE_HOME_NUMBER);
-  EXPECT_EQ(PHONE_HOME_NUMBER, phone.server_type());
+  EXPECT_EQ(PHONE_HOME_NUMBER, phone.GetStorableType());
   EXPECT_EQ(PHONE_HOME, phone.group());
 
+  // Billing type.
+  AutofillType billing_address(ADDRESS_BILLING_LINE1);
+  EXPECT_EQ(ADDRESS_HOME_LINE1, billing_address.GetStorableType());
+  EXPECT_EQ(ADDRESS_BILLING, billing_address.group());
+
   // Last value, to check any offset errors.
-  AutofillType last(COMPANY_NAME);
-  EXPECT_EQ(COMPANY_NAME, last.server_type());
-  EXPECT_EQ(COMPANY, last.group());
+  AutofillType last(NAME_BILLING_SUFFIX);
+  EXPECT_EQ(NAME_SUFFIX, last.GetStorableType());
+  EXPECT_EQ(NAME_BILLING, last.group());
 
   // Boundary (error) condition.
   AutofillType boundary(MAX_VALID_FIELD_TYPE);
-  EXPECT_EQ(UNKNOWN_TYPE, boundary.server_type());
+  EXPECT_EQ(UNKNOWN_TYPE, boundary.GetStorableType());
   EXPECT_EQ(NO_GROUP, boundary.group());
 
   // Beyond the boundary (error) condition.
-  AutofillType beyond(static_cast<ServerFieldType>(MAX_VALID_FIELD_TYPE+10));
-  EXPECT_EQ(UNKNOWN_TYPE, beyond.server_type());
+  AutofillType beyond(static_cast<ServerFieldType>(MAX_VALID_FIELD_TYPE + 10));
+  EXPECT_EQ(UNKNOWN_TYPE, beyond.GetStorableType());
   EXPECT_EQ(NO_GROUP, beyond.group());
 
   // In-between value.  Missing from enum but within range.  Error condition.
   AutofillType between(static_cast<ServerFieldType>(16));
-  EXPECT_EQ(UNKNOWN_TYPE, between.server_type());
+  EXPECT_EQ(UNKNOWN_TYPE, between.GetStorableType());
   EXPECT_EQ(NO_GROUP, between.group());
 }
 
+TEST(AutofillTypeTest, HtmlFieldTypes) {
+  // Unknown type.
+  AutofillType unknown(HTML_TYPE_UNKNOWN, HTML_MODE_NONE);
+  EXPECT_EQ(UNKNOWN_TYPE, unknown.GetStorableType());
+  EXPECT_EQ(NO_GROUP, unknown.group());
+
+  // Type with group but no subgroup.
+  AutofillType first(HTML_TYPE_GIVEN_NAME, HTML_MODE_NONE);
+  EXPECT_EQ(NAME_FIRST, first.GetStorableType());
+  EXPECT_EQ(NAME, first.group());
+
+  // Type with group and subgroup.
+  AutofillType phone(HTML_TYPE_TEL, HTML_MODE_NONE);
+  EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, phone.GetStorableType());
+  EXPECT_EQ(PHONE_HOME, phone.group());
+
+  // Last value, to check any offset errors.
+  AutofillType last(HTML_TYPE_CREDIT_CARD_EXP_4_DIGIT_YEAR, HTML_MODE_NONE);
+  EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, last.GetStorableType());
+  EXPECT_EQ(CREDIT_CARD, last.group());
+
+  // Shipping mode.
+  AutofillType shipping_first(HTML_TYPE_GIVEN_NAME, HTML_MODE_SHIPPING);
+  EXPECT_EQ(NAME_FIRST, shipping_first.GetStorableType());
+  EXPECT_EQ(NAME, shipping_first.group());
+
+  // Billing mode.
+  AutofillType billing_first(HTML_TYPE_GIVEN_NAME, HTML_MODE_BILLING);
+  EXPECT_EQ(NAME_FIRST, billing_first.GetStorableType());
+  EXPECT_EQ(NAME_BILLING, billing_first.group());
+}
+
 }  // namespace
 }  // namespace autofill
diff --git a/components/autofill/core/browser/contact_info.cc b/components/autofill/core/browser/contact_info.cc
index 7ecf44d..603c4fa 100644
--- a/components/autofill/core/browser/contact_info.cc
+++ b/components/autofill/core/browser/contact_info.cc
@@ -52,38 +52,53 @@
 }
 
 base::string16 NameInfo::GetRawInfo(ServerFieldType type) const {
-  type = AutofillType::GetEquivalentFieldType(type);
-  if (type == NAME_FIRST)
-    return first();
+  // TODO(isherman): Is GetStorableType even necessary?
+  switch (AutofillType(type).GetStorableType()) {
+    case NAME_FIRST:
+      return first();
 
-  if (type == NAME_MIDDLE)
-    return middle();
+    case NAME_MIDDLE:
+      return middle();
 
-  if (type == NAME_LAST)
-    return last();
+    case NAME_LAST:
+      return last();
 
-  if (type == NAME_MIDDLE_INITIAL)
-    return MiddleInitial();
+    case NAME_MIDDLE_INITIAL:
+      return MiddleInitial();
 
-  if (type == NAME_FULL)
-    return FullName();
+    case NAME_FULL:
+      return FullName();
 
-  return base::string16();
+    default:
+      return base::string16();
+  }
 }
 
 void NameInfo::SetRawInfo(ServerFieldType type, const base::string16& value) {
-  type = AutofillType::GetEquivalentFieldType(type);
-  DCHECK_EQ(NAME, AutofillType(type).group());
-  if (type == NAME_FIRST)
-    first_ = value;
-  else if (type == NAME_MIDDLE || type == NAME_MIDDLE_INITIAL)
-    middle_ = value;
-  else if (type == NAME_LAST)
-    last_ = value;
-  else if (type == NAME_FULL)
-    SetFullName(value);
-  else
-    NOTREACHED();
+  // TODO(isherman): Is GetStorableType even necessary?
+  ServerFieldType storable_type = AutofillType(type).GetStorableType();
+  DCHECK_EQ(NAME, AutofillType(storable_type).group());
+  switch (storable_type) {
+    case NAME_FIRST:
+      first_ = value;
+      break;
+
+    case NAME_MIDDLE:
+    case NAME_MIDDLE_INITIAL:
+      middle_ = value;
+      break;
+
+    case NAME_LAST:
+      last_ = value;
+      break;
+
+    case NAME_FULL:
+      SetFullName(value);
+      break;
+
+    default:
+      NOTREACHED();
+  }
 }
 
 base::string16 NameInfo::FullName() const {
diff --git a/components/autofill/core/browser/credit_card.cc b/components/autofill/core/browser/credit_card.cc
index e627207..f3ac6b1 100644
--- a/components/autofill/core/browser/credit_card.cc
+++ b/components/autofill/core/browser/credit_card.cc
@@ -371,22 +371,23 @@
 
 base::string16 CreditCard::GetInfo(const AutofillType& type,
                                    const std::string& app_locale) const {
-  if (type.server_type() == CREDIT_CARD_NUMBER)
+  ServerFieldType storable_type = type.GetStorableType();
+  if (storable_type == CREDIT_CARD_NUMBER)
     return StripSeparators(number_);
 
-  return GetRawInfo(type.server_type());
+  return GetRawInfo(storable_type);
 }
 
 bool CreditCard::SetInfo(const AutofillType& type,
                          const base::string16& value,
                          const std::string& app_locale) {
-  ServerFieldType server_type = type.server_type();
-  if (server_type == CREDIT_CARD_NUMBER)
-    SetRawInfo(server_type, StripSeparators(value));
-  else if (server_type == CREDIT_CARD_EXP_MONTH)
+  ServerFieldType storable_type = type.GetStorableType();
+  if (storable_type == CREDIT_CARD_NUMBER)
+    SetRawInfo(storable_type, StripSeparators(value));
+  else if (storable_type == CREDIT_CARD_EXP_MONTH)
     SetExpirationMonthFromString(value, app_locale);
   else
-    SetRawInfo(server_type, value);
+    SetRawInfo(storable_type, value);
 
   return true;
 }
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h
index c083b39..dc86ffd 100644
--- a/components/autofill/core/browser/field_types.h
+++ b/components/autofill/core/browser/field_types.h
@@ -105,6 +105,70 @@
   MAX_VALID_FIELD_TYPE = 73,
 };
 
+// The list of all HTML autocomplete field type hints supported by Chrome.
+// See [ http://is.gd/whatwg_autocomplete ] for the full list of specced hints.
+enum HtmlFieldType {
+  // Default type.
+  HTML_TYPE_UNKNOWN,
+
+  // Name types.
+  HTML_TYPE_NAME,
+  HTML_TYPE_GIVEN_NAME,
+  HTML_TYPE_ADDITIONAL_NAME,
+  HTML_TYPE_FAMILY_NAME,
+
+  // Business types.
+  HTML_TYPE_ORGANIZATION,
+
+  // Address types.
+  HTML_TYPE_ADDRESS_LINE1,
+  HTML_TYPE_ADDRESS_LINE2,
+  HTML_TYPE_LOCALITY,      // For U.S. addresses, corresponds to the city.
+  HTML_TYPE_REGION,        // For U.S. addresses, corresponds to the state.
+  HTML_TYPE_COUNTRY_CODE,  // The ISO 3166-1-alpha-2 country code.
+  HTML_TYPE_COUNTRY_NAME,  // The localized country name.
+  HTML_TYPE_POSTAL_CODE,
+
+  // Credit card types.
+  HTML_TYPE_CREDIT_CARD_NAME,
+  HTML_TYPE_CREDIT_CARD_NUMBER,
+  HTML_TYPE_CREDIT_CARD_EXP,
+  HTML_TYPE_CREDIT_CARD_EXP_MONTH,
+  HTML_TYPE_CREDIT_CARD_EXP_YEAR,
+  HTML_TYPE_CREDIT_CARD_VERIFICATION_CODE,
+  HTML_TYPE_CREDIT_CARD_TYPE,
+
+  // Phone number types.
+  HTML_TYPE_TEL,
+  HTML_TYPE_TEL_COUNTRY_CODE,
+  HTML_TYPE_TEL_NATIONAL,
+  HTML_TYPE_TEL_AREA_CODE,
+  HTML_TYPE_TEL_LOCAL,
+  HTML_TYPE_TEL_LOCAL_PREFIX,
+  HTML_TYPE_TEL_LOCAL_SUFFIX,
+
+  // Email.
+  HTML_TYPE_EMAIL,
+
+  // Variants of type hints specified in the HTML specification that are
+  // inferred based on a field's 'maxlength' attribute.
+  // TODO(isherman): Remove these types, in favor of understanding maxlength
+  // when filling fields.  See also: AutofillField::phone_part_.
+  HTML_TYPE_ADDITIONAL_NAME_INITIAL,
+  HTML_TYPE_CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR,
+  HTML_TYPE_CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR,
+  HTML_TYPE_CREDIT_CARD_EXP_2_DIGIT_YEAR,
+  HTML_TYPE_CREDIT_CARD_EXP_4_DIGIT_YEAR,
+};
+
+// The list of all HTML autocomplete field mode hints supported by Chrome.
+// See [ http://is.gd/whatwg_autocomplete ] for the full list of specced hints.
+enum HtmlFieldMode {
+  HTML_MODE_NONE,
+  HTML_MODE_BILLING,
+  HTML_MODE_SHIPPING,
+};
+
 enum FieldTypeGroup {
   NO_GROUP,
   NAME,
diff --git a/components/autofill/core/browser/form_group.cc b/components/autofill/core/browser/form_group.cc
index 7114ee2..17eb036 100644
--- a/components/autofill/core/browser/form_group.cc
+++ b/components/autofill/core/browser/form_group.cc
@@ -38,13 +38,13 @@
 
 base::string16 FormGroup::GetInfo(const AutofillType& type,
                                   const std::string& app_locale) const {
-  return GetRawInfo(type.server_type());
+  return GetRawInfo(type.GetStorableType());
 }
 
 bool FormGroup::SetInfo(const AutofillType& type,
                         const base::string16& value,
                         const std::string& app_locale) {
-  SetRawInfo(type.server_type(), value);
+  SetRawInfo(type.GetStorableType(), value);
   return true;
 }
 
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index d502a0d..fd907dc 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -57,8 +57,8 @@
 const char kXMLElementField[] = "field";
 const char kXMLElementFields[] = "fields";
 const char kXMLElementForm[] = "form";
-const char kBillingSection[] = "billing";
-const char kShippingSection[] = "shipping";
+const char kBillingMode[] = "billing";
+const char kShippingMode[] = "shipping";
 
 // Stip away >= 5 consecutive digits.
 const char kIgnorePatternInFieldName[] = "\\d{5,}+";
@@ -165,130 +165,132 @@
 // Returns |true| iff the |token| is a type hint appropriate for a field of the
 // given |field_type|, as specified in the implementation section of
 // http://is.gd/whatwg_autocomplete
-// TODO(isherman): This should use HTML field types, not native ones.
 bool ContactTypeHintMatchesFieldType(const std::string& token,
-                                     ServerFieldType field_type) {
+                                     HtmlFieldType field_type) {
   // The "home" and "work" type hints are only appropriate for email and phone
   // number field types.
   if (token == "home" || token == "work") {
-    return field_type == EMAIL_ADDRESS ||
-        (field_type >= PHONE_HOME_NUMBER &&
-         field_type <= PHONE_HOME_WHOLE_NUMBER);
+    return field_type == HTML_TYPE_EMAIL ||
+        (field_type >= HTML_TYPE_TEL &&
+         field_type <= HTML_TYPE_TEL_LOCAL_SUFFIX);
   }
 
   // The "mobile" type hint is only appropriate for phone number field types.
   // Note that "fax" and "pager" are intentionally ignored, as Chrome does not
   // support filling either type of information.
   if (token == "mobile") {
-    return field_type >= PHONE_HOME_NUMBER &&
-        field_type <= PHONE_HOME_WHOLE_NUMBER;
+    return field_type >= HTML_TYPE_TEL &&
+        field_type <= HTML_TYPE_TEL_LOCAL_SUFFIX;
   }
 
   return false;
 }
 
 // Returns the Chrome Autofill-supported field type corresponding to the given
-// |autocomplete_type|, if there is one, in the context of the given |field|.
-// Chrome Autofill supports a subset of the field types listed at
+// |autocomplete_attribute_value|, if there is one, in the context of the given
+// |field|.  Chrome Autofill supports a subset of the field types listed at
 // http://is.gd/whatwg_autocomplete
-// TODO(isherman): This should use HTML field types, not native ones.
-ServerFieldType FieldTypeFromAutocompleteType(
-    const std::string& autocomplete_type,
+HtmlFieldType FieldTypeFromAutocompleteAttributeValue(
+    const std::string& autocomplete_attribute_value,
     const AutofillField& field) {
-  if (autocomplete_type == "name")
-    return NAME_FULL;
+  if (autocomplete_attribute_value == "name")
+    return HTML_TYPE_NAME;
 
-  if (autocomplete_type == "given-name")
-    return NAME_FIRST;
+  if (autocomplete_attribute_value == "given-name")
+    return HTML_TYPE_GIVEN_NAME;
 
-  if (autocomplete_type == "additional-name") {
+  if (autocomplete_attribute_value == "additional-name") {
     if (field.max_length == 1)
-      return NAME_MIDDLE_INITIAL;
+      return HTML_TYPE_ADDITIONAL_NAME_INITIAL;
     else
-      return NAME_MIDDLE;
+      return HTML_TYPE_ADDITIONAL_NAME;
   }
 
-  if (autocomplete_type == "family-name")
-    return NAME_LAST;
+  if (autocomplete_attribute_value == "family-name")
+    return HTML_TYPE_FAMILY_NAME;
 
-  if (autocomplete_type == "honorific-suffix")
-    return NAME_SUFFIX;
+  if (autocomplete_attribute_value == "organization")
+    return HTML_TYPE_ORGANIZATION;
 
-  if (autocomplete_type == "organization")
-    return COMPANY_NAME;
+  if (autocomplete_attribute_value == "address-line1")
+    return HTML_TYPE_ADDRESS_LINE1;
 
-  if (autocomplete_type == "address-line1")
-    return ADDRESS_HOME_LINE1;
+  if (autocomplete_attribute_value == "address-line2")
+    return HTML_TYPE_ADDRESS_LINE2;
 
-  if (autocomplete_type == "address-line2")
-    return ADDRESS_HOME_LINE2;
+  if (autocomplete_attribute_value == "locality")
+    return HTML_TYPE_LOCALITY;
 
-  if (autocomplete_type == "locality")
-    return ADDRESS_HOME_CITY;
+  if (autocomplete_attribute_value == "region")
+    return HTML_TYPE_REGION;
 
-  if (autocomplete_type == "region")
-    return ADDRESS_HOME_STATE;
+  if (autocomplete_attribute_value == "country")
+    return HTML_TYPE_COUNTRY_CODE;
 
-  if (autocomplete_type == "country")
-    return ADDRESS_HOME_COUNTRY;
+  if (autocomplete_attribute_value == "country-name")
+    return HTML_TYPE_COUNTRY_NAME;
 
-  if (autocomplete_type == "postal-code")
-    return ADDRESS_HOME_ZIP;
+  if (autocomplete_attribute_value == "postal-code")
+    return HTML_TYPE_POSTAL_CODE;
 
-  if (autocomplete_type == "cc-name")
-    return CREDIT_CARD_NAME;
+  if (autocomplete_attribute_value == "cc-name")
+    return HTML_TYPE_CREDIT_CARD_NAME;
 
-  if (autocomplete_type == "cc-number")
-    return CREDIT_CARD_NUMBER;
+  if (autocomplete_attribute_value == "cc-number")
+    return HTML_TYPE_CREDIT_CARD_NUMBER;
 
-  if (autocomplete_type == "cc-exp") {
+  if (autocomplete_attribute_value == "cc-exp") {
     if (field.max_length == 5)
-      return CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR;
+      return HTML_TYPE_CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR;
+    else if (field.max_length == 7)
+      return HTML_TYPE_CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR;
     else
-      return CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR;
+      return HTML_TYPE_CREDIT_CARD_EXP;
   }
 
-  if (autocomplete_type == "cc-exp-month")
-    return CREDIT_CARD_EXP_MONTH;
+  if (autocomplete_attribute_value == "cc-exp-month")
+    return HTML_TYPE_CREDIT_CARD_EXP_MONTH;
 
-  if (autocomplete_type == "cc-exp-year") {
+  if (autocomplete_attribute_value == "cc-exp-year") {
     if (field.max_length == 2)
-      return CREDIT_CARD_EXP_2_DIGIT_YEAR;
+      return HTML_TYPE_CREDIT_CARD_EXP_2_DIGIT_YEAR;
+    else if (field.max_length == 4)
+      return HTML_TYPE_CREDIT_CARD_EXP_4_DIGIT_YEAR;
     else
-      return CREDIT_CARD_EXP_4_DIGIT_YEAR;
+      return HTML_TYPE_CREDIT_CARD_EXP_YEAR;
   }
 
-  if (autocomplete_type == "cc-csc")
-    return CREDIT_CARD_VERIFICATION_CODE;
+  if (autocomplete_attribute_value == "cc-csc")
+    return HTML_TYPE_CREDIT_CARD_VERIFICATION_CODE;
 
-  if (autocomplete_type == "cc-type")
-    return CREDIT_CARD_TYPE;
+  if (autocomplete_attribute_value == "cc-type")
+    return HTML_TYPE_CREDIT_CARD_TYPE;
 
-  if (autocomplete_type == "tel")
-    return PHONE_HOME_WHOLE_NUMBER;
+  if (autocomplete_attribute_value == "tel")
+    return HTML_TYPE_TEL;
 
-  if (autocomplete_type == "tel-country-code")
-    return PHONE_HOME_COUNTRY_CODE;
+  if (autocomplete_attribute_value == "tel-country-code")
+    return HTML_TYPE_TEL_COUNTRY_CODE;
 
-  if (autocomplete_type == "tel-national")
-    return PHONE_HOME_CITY_AND_NUMBER;
+  if (autocomplete_attribute_value == "tel-national")
+    return HTML_TYPE_TEL_NATIONAL;
 
-  if (autocomplete_type == "tel-area-code")
-    return PHONE_HOME_CITY_CODE;
+  if (autocomplete_attribute_value == "tel-area-code")
+    return HTML_TYPE_TEL_AREA_CODE;
 
-  if (autocomplete_type == "tel-local")
-    return PHONE_HOME_NUMBER;
+  if (autocomplete_attribute_value == "tel-local")
+    return HTML_TYPE_TEL_LOCAL;
 
-  if (autocomplete_type == "tel-local-prefix")
-    return PHONE_HOME_NUMBER;
+  if (autocomplete_attribute_value == "tel-local-prefix")
+    return HTML_TYPE_TEL_LOCAL_PREFIX;
 
-  if (autocomplete_type == "tel-local-suffix")
-    return PHONE_HOME_NUMBER;
+  if (autocomplete_attribute_value == "tel-local-suffix")
+    return HTML_TYPE_TEL_LOCAL_SUFFIX;
 
-  if (autocomplete_type == "email")
-    return EMAIL_ADDRESS;
+  if (autocomplete_attribute_value == "email")
+    return HTML_TYPE_EMAIL;
 
-  return UNKNOWN_TYPE;
+  return HTML_TYPE_UNKNOWN;
 }
 
 std::string StripDigitsIfRequired(const base::string16& input) {
@@ -377,8 +379,7 @@
   // autocomplete type hint, don't try to apply other heuristics to match fields
   // in this form.
   bool has_author_specified_sections;
-  ParseFieldTypesFromAutocompleteAttributes(PARSE_FOR_AUTOFILL,
-                                            &has_author_specified_types_,
+  ParseFieldTypesFromAutocompleteAttributes(&has_author_specified_types_,
                                             &has_author_specified_sections);
 
   if (!has_author_specified_types_) {
@@ -607,7 +608,7 @@
         heuristics_detected_fillable_field = true;
 
       (*field)->set_server_type(current_info->field_type);
-      if (heuristic_type != (*field)->Type().server_type())
+      if (heuristic_type != (*field)->Type().GetStorableType())
         query_response_overrode_heuristics = true;
 
       // Copy default value into the field if available.
@@ -659,11 +660,10 @@
       FormFieldDataPredictions annotated_field;
       annotated_field.signature = (*field)->FieldSignature();
       annotated_field.heuristic_type =
-          AutofillType::FieldTypeToString((*field)->heuristic_type());
+          AutofillType((*field)->heuristic_type()).ToString();
       annotated_field.server_type =
-          AutofillType::FieldTypeToString((*field)->server_type());
-      annotated_field.overall_type =
-          AutofillType::FieldTypeToString((*field)->Type().server_type());
+          AutofillType((*field)->server_type()).ToString();
+      annotated_field.overall_type = (*field)->Type().ToString();
       form.fields.push_back(annotated_field);
     }
 
@@ -835,7 +835,7 @@
       if (*it == PHONE_HOME_CITY_AND_NUMBER)
         collapsed_field_types.insert(PHONE_HOME_WHOLE_NUMBER);
       else
-        collapsed_field_types.insert(AutofillType::GetEquivalentFieldType(*it));
+        collapsed_field_types.insert(AutofillType(*it).GetStorableType());
     }
 
     // Capture the field's type, if it is unambiguous.
@@ -843,9 +843,11 @@
     if (collapsed_field_types.size() == 1)
       field_type = *collapsed_field_types.begin();
 
-    ServerFieldType heuristic_type = field->heuristic_type();
-    ServerFieldType server_type = field->server_type();
-    ServerFieldType predicted_type = field->Type().server_type();
+    ServerFieldType heuristic_type =
+        AutofillType(field->heuristic_type()).GetStorableType();
+    ServerFieldType server_type =
+        AutofillType(field->server_type()).GetStorableType();
+    ServerFieldType predicted_type = field->Type().GetStorableType();
 
     // Log heuristic, server, and overall type quality metrics, independently of
     // whether the field was autofilled.
@@ -1080,7 +1082,6 @@
 }
 
 void FormStructure::ParseFieldTypesFromAutocompleteAttributes(
-    ParseTarget parse_target,
     bool* found_types,
     bool* found_sections) {
   const std::string kDefaultSection = "-default";
@@ -1132,9 +1133,9 @@
     DCHECK(!tokens.empty());
     std::string field_type_token = tokens.back();
     tokens.pop_back();
-    ServerFieldType field_type =
-        FieldTypeFromAutocompleteType(field_type_token, *field);
-    if (field_type == UNKNOWN_TYPE)
+    HtmlFieldType field_type =
+        FieldTypeFromAutocompleteAttributeValue(field_type_token, *field);
+    if (field_type == HTML_TYPE_UNKNOWN)
       continue;
 
     // The preceding token, if any, may be a type hint.
@@ -1154,21 +1155,15 @@
     // section name suffixes.
     DCHECK_EQ(kDefaultSection, field->section());
     std::string section = field->section();
-    if (!tokens.empty() &&
-        (tokens.back() == kShippingSection ||
-         tokens.back() == kBillingSection)) {
-      // Set Autofill field type to billing if section is billing.
-      if (tokens.back() == kBillingSection) {
-        field_type = AutofillType::GetEquivalentBillingFieldType(field_type);
+    HtmlFieldMode mode = HTML_MODE_NONE;
+    if (!tokens.empty()) {
+      if (tokens.back() == kShippingMode)
+        mode = HTML_MODE_SHIPPING;
+      else if (tokens.back() == kBillingMode)
+        mode = HTML_MODE_BILLING;
+    }
 
-        // The Autofill dialog uses the type CREDIT_CARD_NAME to refer to both
-        // the credit card holder's name and the name on the billing address.
-        if (parse_target == PARSE_FOR_AUTOFILL_DIALOG &&
-            field_type == NAME_FULL) {
-          field_type = CREDIT_CARD_NAME;
-        }
-      }
-
+    if (mode != HTML_MODE_NONE) {
       section = "-" + tokens.back();
       tokens.pop_back();
     }
@@ -1193,11 +1188,7 @@
 
     // No errors encountered while parsing!
     // Update the |field|'s type based on what was parsed from the attribute.
-    field->set_heuristic_type(field_type);
-    if (field_type_token == "tel-local-prefix")
-      field->set_phone_part(AutofillField::PHONE_PREFIX);
-    else if (field_type_token == "tel-local-suffix")
-      field->set_phone_part(AutofillField::PHONE_SUFFIX);
+    field->SetHtmlType(field_type, mode);
   }
 }
 
@@ -1215,8 +1206,7 @@
 
     for (std::vector<AutofillField*>::iterator field = fields_.begin();
          field != fields_.end(); ++field) {
-      const ServerFieldType current_type =
-          AutofillType::GetEquivalentFieldType((*field)->Type().server_type());
+      const ServerFieldType current_type = (*field)->Type().GetStorableType();
 
       bool already_saw_current_type = seen_types.count(current_type) > 0;
 
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h
index 8b914b1..1af7650 100644
--- a/components/autofill/core/browser/form_structure.h
+++ b/components/autofill/core/browser/form_structure.h
@@ -48,13 +48,6 @@
 // in the fields along with additional information needed by Autofill.
 class FormStructure {
  public:
-  // Whether the form fields should be parsed to match the semantics of plain
-  // ol' Autofill, or of the interactive Autofill dialog.
-  enum ParseTarget {
-    PARSE_FOR_AUTOFILL,
-    PARSE_FOR_AUTOFILL_DIALOG,
-  };
-
   FormStructure(const FormData& form,
                 const std::string& autocheckout_url_prefix);
   virtual ~FormStructure();
@@ -138,15 +131,12 @@
 
   // Classifies each field in |fields_| based upon its |autocomplete| attribute,
   // if the attribute is available.  The association is stored into the field's
-  // |heuristic_type|.  The exact method of classification depends on
-  // |parse_target|, as the Autofill dialog has slightly different semantics
-  // from regular ol' Autofill.
+  // |heuristic_type|.
   // Fills |found_types| with |true| if the attribute is available and neither
   // empty nor set to the special values "on" or "off" for at least one field.
   // Fills |found_sections| with |true| if the attribute specifies a section for
   // at least one field.
-  void ParseFieldTypesFromAutocompleteAttributes(ParseTarget parse_target,
-                                                 bool* found_types,
+  void ParseFieldTypesFromAutocompleteAttributes(bool* found_types,
                                                  bool* found_sections);
 
   const AutofillField* field(size_t index) const;
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc
index 73343f8..7d38165 100644
--- a/components/autofill/core/browser/form_structure_unittest.cc
+++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -442,9 +442,12 @@
   ASSERT_EQ(3U, form_structure->field_count());
   ASSERT_EQ(3U, form_structure->autofill_count());
 
-  EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
-  EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type());
-  EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type());
+  EXPECT_EQ(HTML_TYPE_GIVEN_NAME, form_structure->field(0)->html_type());
+  EXPECT_EQ(HTML_TYPE_FAMILY_NAME, form_structure->field(1)->html_type());
+  EXPECT_EQ(HTML_TYPE_EMAIL, form_structure->field(2)->html_type());
+  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type());
+  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type());
+  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
 }
 
 // Verify that we can correctly process the 'autocomplete' attribute for phone
@@ -480,12 +483,12 @@
   ASSERT_EQ(3U, form_structure->field_count());
   EXPECT_EQ(3U, form_structure->autofill_count());
 
-  EXPECT_EQ(PHONE_HOME_NUMBER, form_structure->field(0)->heuristic_type());
+  EXPECT_EQ(HTML_TYPE_TEL_LOCAL, form_structure->field(0)->html_type());
   EXPECT_EQ(AutofillField::IGNORED, form_structure->field(0)->phone_part());
-  EXPECT_EQ(PHONE_HOME_NUMBER, form_structure->field(1)->heuristic_type());
+  EXPECT_EQ(HTML_TYPE_TEL_LOCAL_PREFIX, form_structure->field(1)->html_type());
   EXPECT_EQ(AutofillField::PHONE_PREFIX,
             form_structure->field(1)->phone_part());
-  EXPECT_EQ(PHONE_HOME_NUMBER, form_structure->field(2)->heuristic_type());
+  EXPECT_EQ(HTML_TYPE_TEL_LOCAL_SUFFIX, form_structure->field(2)->html_type());
   EXPECT_EQ(AutofillField::PHONE_SUFFIX,
             form_structure->field(2)->phone_part());
 }
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index c14723d..9ddff25 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -259,7 +259,7 @@
       continue;
 
     AutofillType field_type = field->Type();
-    ServerFieldType server_field_type = field_type.server_type();
+    ServerFieldType server_field_type = field_type.GetStorableType();
     FieldTypeGroup group(field_type.group());
 
     // There can be multiple email fields (e.g. in the case of 'confirm email'
@@ -617,8 +617,7 @@
         // Phone numbers could be split in US forms, so field value could be
         // either prefix or suffix of the phone.
         bool matched_phones = false;
-        if ((type.server_type() == PHONE_HOME_NUMBER ||
-             type.server_type() == PHONE_BILLING_NUMBER) &&
+        if (type.GetStorableType() == PHONE_HOME_NUMBER &&
             !field_value_lower_case.empty() &&
             profile_value_lower_case.find(field_value_lower_case) !=
                 base::string16::npos) {
@@ -646,7 +645,7 @@
   if (!field_is_autofilled) {
     AutofillProfile::CreateInferredLabels(
         &matched_profiles, &other_field_types,
-        type.server_type(), 1, labels);
+        type.GetStorableType(), 1, labels);
   } else {
     // No sub-labels for previously filled fields.
     labels->resize(values->size());
@@ -678,7 +677,7 @@
         credit_card->GetInfo(type, app_locale_);
     if (!creditcard_field_value.empty() &&
         StartsWith(creditcard_field_value, field_contents, false)) {
-      if (type.server_type() == CREDIT_CARD_NUMBER)
+      if (type.GetStorableType() == CREDIT_CARD_NUMBER)
         creditcard_field_value = credit_card->ObfuscatedNumber();
 
       base::string16 label;
diff --git a/components/autofill/core/browser/phone_number.cc b/components/autofill/core/browser/phone_number.cc
index e452f98..2ee67f9 100644
--- a/components/autofill/core/browser/phone_number.cc
+++ b/components/autofill/core/browser/phone_number.cc
@@ -74,8 +74,8 @@
 }
 
 base::string16 PhoneNumber::GetRawInfo(ServerFieldType type) const {
-  type = AutofillType::GetEquivalentFieldType(type);
-  if (type == PHONE_HOME_WHOLE_NUMBER)
+  // TODO(isherman): Is GetStorableType even necessary?
+  if (AutofillType(type).GetStorableType() == PHONE_HOME_WHOLE_NUMBER)
     return number_;
 
   // Only the whole number is available as raw data.  All of the other types are
@@ -86,9 +86,9 @@
 
 void PhoneNumber::SetRawInfo(ServerFieldType type,
                              const base::string16& value) {
-  type = AutofillType::GetEquivalentFieldType(type);
-  if (type != PHONE_HOME_CITY_AND_NUMBER &&
-      type != PHONE_HOME_WHOLE_NUMBER) {
+  // TODO(isherman): Is GetStorableType even necessary?
+  type = AutofillType(type).GetStorableType();
+  if (type != PHONE_HOME_CITY_AND_NUMBER && type != PHONE_HOME_WHOLE_NUMBER) {
     // Only full phone numbers should be set directly.  The remaining field
     // field types are read-only.
     return;
@@ -106,18 +106,17 @@
 // If the phone cannot be normalized, returns the stored value verbatim.
 base::string16 PhoneNumber::GetInfo(const AutofillType& type,
                                     const std::string& app_locale) const {
-  ServerFieldType server_type =
-      AutofillType::GetEquivalentFieldType(type.server_type());
+  ServerFieldType storable_type = type.GetStorableType();
   UpdateCacheIfNeeded(app_locale);
 
   // Queries for whole numbers will return the non-normalized number if
   // normalization for the number fails.  All other field types require
   // normalization.
-  if (server_type != PHONE_HOME_WHOLE_NUMBER &&
+  if (storable_type != PHONE_HOME_WHOLE_NUMBER &&
       !cached_parsed_phone_.IsValidNumber())
     return base::string16();
 
-  switch (server_type) {
+  switch (storable_type) {
     case PHONE_HOME_WHOLE_NUMBER:
       return cached_parsed_phone_.GetWholeNumber();
 
@@ -143,9 +142,7 @@
 bool PhoneNumber::SetInfo(const AutofillType& type,
                           const base::string16& value,
                           const std::string& app_locale) {
-  ServerFieldType server_type =
-      AutofillType::GetEquivalentFieldType(type.server_type());
-  SetRawInfo(server_type, value);
+  SetRawInfo(type.GetStorableType(), value);
 
   if (number_.empty())
     return true;
@@ -196,31 +193,30 @@
 PhoneNumber::PhoneCombineHelper::~PhoneCombineHelper() {
 }
 
-bool PhoneNumber::PhoneCombineHelper::SetInfo(const AutofillType& field_type,
+bool PhoneNumber::PhoneCombineHelper::SetInfo(const AutofillType& type,
                                               const base::string16& value) {
-  ServerFieldType server_field_type =
-      AutofillType::GetEquivalentFieldType(field_type.server_type());
-  if (server_field_type == PHONE_HOME_COUNTRY_CODE) {
+  ServerFieldType storable_type = type.GetStorableType();
+  if (storable_type == PHONE_HOME_COUNTRY_CODE) {
     country_ = value;
     return true;
   }
 
-  if (server_field_type == PHONE_HOME_CITY_CODE) {
+  if (storable_type == PHONE_HOME_CITY_CODE) {
     city_ = value;
     return true;
   }
 
-  if (server_field_type == PHONE_HOME_CITY_AND_NUMBER) {
+  if (storable_type == PHONE_HOME_CITY_AND_NUMBER) {
     phone_ = value;
     return true;
   }
 
-  if (server_field_type == PHONE_HOME_WHOLE_NUMBER) {
+  if (storable_type == PHONE_HOME_WHOLE_NUMBER) {
     whole_number_ = value;
     return true;
   }
 
-  if (server_field_type == PHONE_HOME_NUMBER) {
+  if (storable_type == PHONE_HOME_NUMBER) {
     phone_.append(value);
     return true;
   }
diff --git a/components/autofill/core/browser/test_autofill_manager_delegate.cc b/components/autofill/core/browser/test_autofill_manager_delegate.cc
index 4ea359d..dc9781d 100644
--- a/components/autofill/core/browser/test_autofill_manager_delegate.cc
+++ b/components/autofill/core/browser/test_autofill_manager_delegate.cc
@@ -35,10 +35,12 @@
     const CreditCard& credit_card,
     const base::Closure& save_card_callback) {}
 
-void TestAutofillManagerDelegate::ShowAutocheckoutBubble(
+bool TestAutofillManagerDelegate::ShowAutocheckoutBubble(
     const gfx::RectF& bounding_box,
     bool is_google_user,
-    const base::Callback<void(AutocheckoutBubbleState)>& callback) {}
+    const base::Callback<void(AutocheckoutBubbleState)>& callback) {
+  return true;
+}
 
 void TestAutofillManagerDelegate::HideAutocheckoutBubble() {}
 
diff --git a/components/autofill/core/browser/test_autofill_manager_delegate.h b/components/autofill/core/browser/test_autofill_manager_delegate.h
index 24d771e..1fee0ba 100644
--- a/components/autofill/core/browser/test_autofill_manager_delegate.h
+++ b/components/autofill/core/browser/test_autofill_manager_delegate.h
@@ -32,7 +32,7 @@
       const AutofillMetrics& metric_logger,
       const CreditCard& credit_card,
       const base::Closure& save_card_callback) OVERRIDE;
-  virtual void ShowAutocheckoutBubble(
+  virtual bool ShowAutocheckoutBubble(
       const gfx::RectF& bounding_box,
       bool is_google_user,
       const base::Callback<void(AutocheckoutBubbleState)>& callback) OVERRIDE;
diff --git a/components/autofill/core/common/autofill_messages.h b/components/autofill/core/common/autofill_messages.h
index 81fde2c..a432887 100644
--- a/components/autofill/core/common/autofill_messages.h
+++ b/components/autofill/core/common/autofill_messages.h
@@ -183,6 +183,10 @@
 // metadata.
 IPC_MESSAGE_ROUTED0(AutofillMsg_AutocheckoutSupported)
 
+// Sent when the current page is actually displayed in the browser, possibly
+// after being preloaded.
+IPC_MESSAGE_ROUTED0(AutofillMsg_PageShown)
+
 // Autofill messages sent from the renderer to the browser.
 
 // TODO(creis): check in the browser that the renderer actually has permission
diff --git a/components/nacl/common/nacl_host_messages.h b/components/nacl/common/nacl_host_messages.h
index 7a39504..d9a835b 100644
--- a/components/nacl/common/nacl_host_messages.h
+++ b/components/nacl/common/nacl_host_messages.h
@@ -91,8 +91,9 @@
 
 // A renderer sends this to the browser to report that its translation has
 // finished and its temp file contains the translated nexe.
-IPC_MESSAGE_CONTROL1(NaClHostMsg_ReportTranslationFinished,
-                     int /* instance */)
+IPC_MESSAGE_CONTROL2(NaClHostMsg_ReportTranslationFinished,
+                     int /* instance */,
+                     bool /* success */)
 
 // A renderer sends this to the browser process to report an error.
 IPC_MESSAGE_CONTROL2(NaClHostMsg_NaClErrorStatus,
diff --git a/content/browser/accessibility/accessibility_tree_formatter_mac.mm b/content/browser/accessibility/accessibility_tree_formatter_mac.mm
index fda76bf..58881b4 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_mac.mm
+++ b/content/browser/accessibility/accessibility_tree_formatter_mac.mm
@@ -84,7 +84,7 @@
 }
 
 NSArray* BuildAllAttributesArray() {
-  return [NSArray arrayWithObjects:
+  NSArray* array = [NSArray arrayWithObjects:
       NSAccessibilityRoleDescriptionAttribute,
       NSAccessibilityTitleAttribute,
       NSAccessibilityValueAttribute,
@@ -115,6 +115,7 @@
       NSAccessibilityVisibleCharacterRangeAttribute,
       @"AXVisited",
       nil];
+  return [array retain];
 }
 
 }  // namespace
diff --git a/content/browser/android/in_process/synchronous_compositor_impl.cc b/content/browser/android/in_process/synchronous_compositor_impl.cc
index 3c7dfe9..041511e 100644
--- a/content/browser/android/in_process/synchronous_compositor_impl.cc
+++ b/content/browser/android/in_process/synchronous_compositor_impl.cc
@@ -16,6 +16,7 @@
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/renderer/android/synchronous_compositor_factory.h"
+#include "ui/gl/gl_surface.h"
 #include "webkit/common/gpu/context_provider_in_process.h"
 
 namespace content {
@@ -143,10 +144,12 @@
   compositor_client_ = compositor_client;
 }
 
-bool SynchronousCompositorImpl::InitializeHwDraw() {
+bool SynchronousCompositorImpl::InitializeHwDraw(
+    scoped_refptr<gfx::GLSurface> surface) {
   DCHECK(CalledOnValidThread());
   DCHECK(output_surface_);
   return output_surface_->InitializeHwDraw(
+      surface,
       g_factory.Get().GetOffscreenContextProviderForCompositorThread());
 }
 
diff --git a/content/browser/android/in_process/synchronous_compositor_impl.h b/content/browser/android/in_process/synchronous_compositor_impl.h
index f4c932b..f0ea2c6 100644
--- a/content/browser/android/in_process/synchronous_compositor_impl.h
+++ b/content/browser/android/in_process/synchronous_compositor_impl.h
@@ -48,7 +48,8 @@
   // SynchronousCompositor
   virtual void SetClient(SynchronousCompositorClient* compositor_client)
       OVERRIDE;
-  virtual bool InitializeHwDraw() OVERRIDE;
+  virtual bool InitializeHwDraw(
+      scoped_refptr<gfx::GLSurface> surface) OVERRIDE;
   virtual void ReleaseHwDraw() OVERRIDE;
   virtual bool DemandDrawHw(
       gfx::Size view_size,
diff --git a/content/browser/android/in_process/synchronous_compositor_output_surface.cc b/content/browser/android/in_process/synchronous_compositor_output_surface.cc
index fafd06f..a6115e9 100644
--- a/content/browser/android/in_process/synchronous_compositor_output_surface.cc
+++ b/content/browser/android/in_process/synchronous_compositor_output_surface.cc
@@ -15,30 +15,50 @@
 #include "content/browser/android/in_process/synchronous_compositor_impl.h"
 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/public/browser/browser_thread.h"
+#include "gpu/command_buffer/client/gl_in_process_context.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkDevice.h"
 #include "ui/gfx/rect_conversions.h"
 #include "ui/gfx/skia_util.h"
 #include "ui/gfx/transform.h"
-#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_surface.h"
 #include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
 
-using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
 
 namespace content {
 
 namespace {
 
-// TODO(boliu): RenderThreadImpl should create in process contexts as well.
-scoped_ptr<WebKit::WebGraphicsContext3D> CreateWebGraphicsContext3D() {
+scoped_ptr<WebKit::WebGraphicsContext3D> CreateWebGraphicsContext3D(
+    scoped_refptr<gfx::GLSurface> surface) {
+  using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
+  if (!gfx::GLSurface::InitializeOneOff())
+    return scoped_ptr<WebKit::WebGraphicsContext3D>();
+
+  const char* allowed_extensions = "*";
+  const gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
+
   WebKit::WebGraphicsContext3D::Attributes attributes;
   attributes.antialias = false;
   attributes.shareResources = true;
   attributes.noAutomaticFlushes = true;
 
+  gpu::GLInProcessContextAttribs in_process_attribs;
+  WebGraphicsContext3DInProcessCommandBufferImpl::ConvertAttributes(
+      attributes, &in_process_attribs);
+  scoped_ptr<gpu::GLInProcessContext> context(
+      gpu::GLInProcessContext::CreateWithSurface(surface,
+                                                 attributes.shareResources,
+                                                 allowed_extensions,
+                                                 in_process_attribs,
+                                                 gpu_preference));
+
+  if (!context.get())
+    return scoped_ptr<WebKit::WebGraphicsContext3D>();
+
   return scoped_ptr<WebKit::WebGraphicsContext3D>(
-      WebGraphicsContext3DInProcessCommandBufferImpl
-          ::CreateViewContext(attributes, NULL));
+      WebGraphicsContext3DInProcessCommandBufferImpl::WrapContext(
+          context.Pass(), attributes));
 }
 
 void DidActivatePendingTree(int routing_id) {
@@ -176,13 +196,15 @@
 } // namespace
 
 bool SynchronousCompositorOutputSurface::InitializeHwDraw(
+    scoped_refptr<gfx::GLSurface> surface,
     scoped_refptr<cc::ContextProvider> offscreen_context) {
   DCHECK(CalledOnValidThread());
   DCHECK(HasClient());
   DCHECK(!context3d_);
+  DCHECK(surface);
 
-  return InitializeAndSetContext3D(CreateWebGraphicsContext3D().Pass(),
-                                   offscreen_context);
+  return InitializeAndSetContext3D(
+      CreateWebGraphicsContext3D(surface).Pass(), offscreen_context);
 }
 
 void SynchronousCompositorOutputSurface::ReleaseHwDraw() {
@@ -205,8 +227,6 @@
   SetExternalStencilTest(stencil_enabled);
   InvokeComposite(clip.size());
 
-  // TODO(boliu): Check if context is lost here.
-
   return did_swap_buffer_;
 }
 
diff --git a/content/browser/android/in_process/synchronous_compositor_output_surface.h b/content/browser/android/in_process/synchronous_compositor_output_surface.h
index a3a9066..3ab1498 100644
--- a/content/browser/android/in_process/synchronous_compositor_output_surface.h
+++ b/content/browser/android/in_process/synchronous_compositor_output_surface.h
@@ -61,7 +61,9 @@
   virtual void SwapBuffers(cc::CompositorFrame* frame) OVERRIDE;
 
   // Partial SynchronousCompositor API implementation.
-  bool InitializeHwDraw(scoped_refptr<cc::ContextProvider> offscreen_context);
+  bool InitializeHwDraw(
+      scoped_refptr<gfx::GLSurface> surface,
+      scoped_refptr<cc::ContextProvider> offscreen_context);
   void ReleaseHwDraw();
   bool DemandDrawHw(gfx::Size surface_size,
                     const gfx::Transform& transform,
diff --git a/content/browser/aura/gpu_process_transport_factory.cc b/content/browser/aura/gpu_process_transport_factory.cc
index dda8bc8..8822e85 100644
--- a/content/browser/aura/gpu_process_transport_factory.cc
+++ b/content/browser/aura/gpu_process_transport_factory.cc
@@ -15,6 +15,7 @@
 #include "content/browser/aura/browser_compositor_output_surface.h"
 #include "content/browser/aura/browser_compositor_output_surface_proxy.h"
 #include "content/browser/aura/reflector_impl.h"
+#include "content/browser/aura/software_browser_compositor_output_surface.h"
 #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
 #include "content/browser/gpu/gpu_data_manager_impl.h"
 #include "content/browser/gpu/gpu_surface_tracker.h"
@@ -179,41 +180,6 @@
   DISALLOW_COPY_AND_ASSIGN(CompositorSwapClient);
 };
 
-class SoftwareOutputSurface : public cc::OutputSurface {
- public:
-  explicit SoftwareOutputSurface(
-      scoped_ptr<cc::SoftwareOutputDevice> software_device)
-      : cc::OutputSurface(software_device.Pass()) {}
-
-  virtual void SwapBuffers(cc::CompositorFrame* frame) OVERRIDE {
-    ui::LatencyInfo latency_info = frame->metadata.latency_info;
-    latency_info.swap_timestamp = base::TimeTicks::HighResNow();
-    RenderWidgetHostImpl::CompositorFrameDrawn(latency_info);
-    cc::OutputSurface::SwapBuffers(frame);
-  }
-};
-
-scoped_ptr<cc::OutputSurface> CreateSoftwareOutputSurface(
-    ui::Compositor* compositor) {
-  scoped_ptr<cc::OutputSurface> output_surface;
-
-#if defined(OS_WIN)
-  scoped_ptr<SoftwareOutputDeviceWin> software_device(
-      new SoftwareOutputDeviceWin(compositor));
-  output_surface.reset(new SoftwareOutputSurface(
-      software_device.PassAs<cc::SoftwareOutputDevice>()));
-#elif defined(USE_X11)
-  scoped_ptr<SoftwareOutputDeviceX11> software_device(
-      new SoftwareOutputDeviceX11(compositor));
-  output_surface.reset(new SoftwareOutputSurface(
-      software_device.PassAs<cc::SoftwareOutputDevice>()));
-#else
-  NOTIMPLEMENTED();
-#endif
-
-  return output_surface.Pass();
-}
-
 GpuProcessTransportFactory::GpuProcessTransportFactory()
     : callback_factory_(this) {
   output_surface_proxy_ = new BrowserCompositorOutputSurfaceProxy(
@@ -239,6 +205,20 @@
       .PassAs<WebKit::WebGraphicsContext3D>();
 }
 
+scoped_ptr<cc::SoftwareOutputDevice> CreateSoftwareOutputDevice(
+    ui::Compositor* compositor) {
+#if defined(OS_WIN)
+  return scoped_ptr<cc::SoftwareOutputDevice>(new SoftwareOutputDeviceWin(
+      compositor));
+#elif defined(USE_X11)
+  return scoped_ptr<cc::SoftwareOutputDevice>(new SoftwareOutputDeviceX11(
+      compositor));
+#endif
+
+  NOTREACHED();
+  return scoped_ptr<cc::SoftwareOutputDevice>();
+}
+
 scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
     ui::Compositor* compositor) {
   PerCompositorData* data = per_compositor_data_[compositor];
@@ -251,8 +231,12 @@
     context =
         CreateContextCommon(data->swap_client->AsWeakPtr(), data->surface_id);
   }
-  if (!context)
-    return CreateSoftwareOutputSurface(compositor);
+  if (!context) {
+    scoped_ptr<SoftwareBrowserCompositorOutputSurface> surface =
+        SoftwareBrowserCompositorOutputSurface::Create(
+            CreateSoftwareOutputDevice(compositor));
+    return surface.PassAs<cc::OutputSurface>();
+  }
 
   scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_task_runner =
       ui::Compositor::GetCompositorMessageLoop();
diff --git a/content/browser/aura/software_browser_compositor_output_surface.cc b/content/browser/aura/software_browser_compositor_output_surface.cc
new file mode 100644
index 0000000..c59806e
--- /dev/null
+++ b/content/browser/aura/software_browser_compositor_output_surface.cc
@@ -0,0 +1,26 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/aura/software_browser_compositor_output_surface.h"
+
+#include "base/time/time.h"
+#include "cc/output/compositor_frame.h"
+#include "cc/output/software_output_device.h"
+#include "content/browser/renderer_host/render_widget_host_impl.h"
+#include "ui/base/latency_info.h"
+
+namespace content {
+
+SoftwareBrowserCompositorOutputSurface::SoftwareBrowserCompositorOutputSurface(
+    scoped_ptr<cc::SoftwareOutputDevice> software_device)
+    : cc::OutputSurface(software_device.Pass()) {}
+
+void SoftwareBrowserCompositorOutputSurface::SwapBuffers(
+    cc::CompositorFrame* frame) {
+  ui::LatencyInfo latency_info = frame->metadata.latency_info;
+  latency_info.swap_timestamp = base::TimeTicks::HighResNow();
+  RenderWidgetHostImpl::CompositorFrameDrawn(latency_info);
+}
+
+}  // namespace content
diff --git a/content/browser/aura/software_browser_compositor_output_surface.h b/content/browser/aura/software_browser_compositor_output_surface.h
new file mode 100644
index 0000000..ac499da
--- /dev/null
+++ b/content/browser/aura/software_browser_compositor_output_surface.h
@@ -0,0 +1,33 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_AURA_SOFTWARE_OUTPUT_SURFACE_H_
+#define CONTENT_BROWSER_AURA_SOFTWARE_OUTPUT_SURFACE_H_
+
+#include "cc/output/output_surface.h"
+
+namespace cc { class SoftwareOutputDevice; }
+
+namespace content {
+
+// TODO(danakj): Inherit from BrowserCompositorOutputSurface to share stuff like
+// reflectors, when we split the GL-specific stuff out of the class.
+class SoftwareBrowserCompositorOutputSurface : public cc::OutputSurface {
+ public:
+  static scoped_ptr<SoftwareBrowserCompositorOutputSurface> Create(
+      scoped_ptr<cc::SoftwareOutputDevice> software_device) {
+    return make_scoped_ptr(
+        new SoftwareBrowserCompositorOutputSurface(software_device.Pass()));
+  }
+
+ private:
+  explicit SoftwareBrowserCompositorOutputSurface(
+      scoped_ptr<cc::SoftwareOutputDevice> software_device);
+
+  virtual void SwapBuffers(cc::CompositorFrame* frame) OVERRIDE;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_AURA_SOFTWARE_OUTPUT_SURFACE_H_
diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc
index d02aa72..2e76dc0 100644
--- a/content/browser/browser_context.cc
+++ b/content/browser/browser_context.cc
@@ -6,7 +6,7 @@
 
 #if !defined(OS_IOS)
 #include "content/browser/appcache/chrome_appcache_service.h"
-#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
 #include "content/browser/download/download_manager_impl.h"
 #include "content/browser/indexed_db/indexed_db_context_impl.h"
 #include "content/browser/loader/resource_dispatcher_host_impl.h"
@@ -65,7 +65,7 @@
   return partition_map->Get(partition_domain, partition_name, in_memory);
 }
 
-// Run |callback| on each DOMStorageContextImpl in |browser_context|.
+// Run |callback| on each DOMStorageContextWrapper in |browser_context|.
 void PurgeDOMStorageContextInPartition(StoragePartition* storage_partition) {
   static_cast<StoragePartitionImpl*>(storage_partition)->
       GetDOMStorageContext()->PurgeMemory();
@@ -233,10 +233,10 @@
             storage_partition->GetAppCacheService()));
   }
 
-  DOMStorageContextImpl* dom_storage_context_impl =
-      static_cast<DOMStorageContextImpl*>(
+  DOMStorageContextWrapper* dom_storage_context_proxy =
+      static_cast<DOMStorageContextWrapper*>(
           storage_partition->GetDOMStorageContext());
-  dom_storage_context_impl->SetForceKeepSessionState();
+  dom_storage_context_proxy->SetForceKeepSessionState();
 
   IndexedDBContextImpl* indexed_db_context_impl =
       static_cast<IndexedDBContextImpl*>(
diff --git a/content/browser/devtools/devtools_browser_target.cc b/content/browser/devtools/devtools_browser_target.cc
index f0fa8d0..a782462 100644
--- a/content/browser/devtools/devtools_browser_target.cc
+++ b/content/browser/devtools/devtools_browser_target.cc
@@ -7,7 +7,6 @@
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
 #include "base/message_loop/message_loop_proxy.h"
 #include "base/values.h"
 #include "content/public/browser/browser_thread.h"
@@ -44,8 +43,8 @@
 
 void DevToolsBrowserTarget::HandleMessage(const std::string& data) {
   std::string error_response;
-  scoped_ptr<DevToolsProtocol::Command> command(
-      DevToolsProtocol::ParseCommand(data, &error_response));
+  scoped_refptr<DevToolsProtocol::Command> command =
+      DevToolsProtocol::ParseCommand(data, &error_response);
   if (!command) {
     Respond(error_response);
     return;
@@ -61,8 +60,10 @@
   bool handle_directly = handle_on_ui_thread_.find(command->domain()) ==
       handle_on_ui_thread_.end();
   if (handle_directly) {
-    scoped_ptr<DevToolsProtocol::Response> response(
-        handler->HandleCommand(command.get()));
+    scoped_refptr<DevToolsProtocol::Response> response =
+        handler->HandleCommand(command);
+    if (response && response->is_async_promise())
+      return;
     if (response)
       Respond(response->Serialize());
     else
@@ -76,7 +77,7 @@
       base::Bind(&DevToolsBrowserTarget::HandleCommandOnUIThread,
                  this,
                  handler,
-                 command.release()));
+                 command));
 }
 
 void DevToolsBrowserTarget::Detach() {
@@ -106,10 +107,12 @@
 
 void DevToolsBrowserTarget::HandleCommandOnUIThread(
     DevToolsProtocol::Handler* handler,
-    DevToolsProtocol::Command* command_ptr) {
-  scoped_ptr<DevToolsProtocol::Command> command(command_ptr);
-  scoped_ptr<DevToolsProtocol::Response> response(
-      handler->HandleCommand(command.get()));
+    scoped_refptr<DevToolsProtocol::Command> command) {
+  scoped_refptr<DevToolsProtocol::Response> response =
+      handler->HandleCommand(command);
+  if (response && response->is_async_promise())
+    return;
+
   if (response)
     RespondFromUIThread(response->Serialize());
   else
diff --git a/content/browser/devtools/devtools_browser_target.h b/content/browser/devtools/devtools_browser_target.h
index 04b1e8a..46ed291 100644
--- a/content/browser/devtools/devtools_browser_target.h
+++ b/content/browser/devtools/devtools_browser_target.h
@@ -51,8 +51,9 @@
   friend class base::RefCountedThreadSafe<DevToolsBrowserTarget>;
   ~DevToolsBrowserTarget();
 
-  void HandleCommandOnUIThread(DevToolsProtocol::Handler*,
-                               DevToolsProtocol::Command* command);
+  void HandleCommandOnUIThread(
+      DevToolsProtocol::Handler*,
+      scoped_refptr<DevToolsProtocol::Command> command);
 
   void DeleteHandlersOnUIThread(
       std::vector<DevToolsProtocol::Handler*> handlers);
diff --git a/content/browser/devtools/devtools_protocol.cc b/content/browser/devtools/devtools_protocol.cc
index d2883f9..d39cc33 100644
--- a/content/browser/devtools/devtools_protocol.cc
+++ b/content/browser/devtools/devtools_protocol.cc
@@ -61,30 +61,34 @@
   return json_command;
 }
 
-scoped_ptr<DevToolsProtocol::Response>
+scoped_refptr<DevToolsProtocol::Response>
 DevToolsProtocol::Command::SuccessResponse(base::DictionaryValue* result) {
-  return scoped_ptr<DevToolsProtocol::Response>(
-      new DevToolsProtocol::Response(id_, result));
+  return new DevToolsProtocol::Response(id_, result);
 }
 
-scoped_ptr<DevToolsProtocol::Response>
+scoped_refptr<DevToolsProtocol::Response>
 DevToolsProtocol::Command::InternalErrorResponse(const std::string& message) {
-  return scoped_ptr<DevToolsProtocol::Response>(
-      new DevToolsProtocol::Response(id_, kErrorInternalError, message));
+  return new DevToolsProtocol::Response(id_, kErrorInternalError, message);
 }
 
-scoped_ptr<DevToolsProtocol::Response>
+scoped_refptr<DevToolsProtocol::Response>
 DevToolsProtocol::Command::InvalidParamResponse(const std::string& param) {
   std::string message =
       base::StringPrintf("Missing or invalid '%s' parameter", param.c_str());
-  return scoped_ptr<DevToolsProtocol::Response>(
-      new DevToolsProtocol::Response(id_, kErrorInvalidParams, message));
+  return new DevToolsProtocol::Response(id_, kErrorInvalidParams, message);
 }
 
-scoped_ptr<DevToolsProtocol::Response>
+scoped_refptr<DevToolsProtocol::Response>
 DevToolsProtocol::Command::NoSuchMethodErrorResponse() {
-  return scoped_ptr<DevToolsProtocol::Response>(
-      new Response(id_, kErrorNoSuchMethod, "No such method"));
+  return new Response(id_, kErrorNoSuchMethod, "No such method");
+}
+
+scoped_refptr<DevToolsProtocol::Response>
+DevToolsProtocol::Command::AsyncResponsePromise() {
+  scoped_refptr<DevToolsProtocol::Response> promise =
+      new DevToolsProtocol::Response(0, NULL);
+  promise->is_async_promise_ = true;
+  return promise;
 }
 
 DevToolsProtocol::Command::Command(int id,
@@ -94,6 +98,9 @@
       id_(id) {
 }
 
+DevToolsProtocol::Response::~Response() {
+}
+
 std::string DevToolsProtocol::Response::Serialize() {
   base::DictionaryValue response;
 
@@ -118,7 +125,8 @@
 DevToolsProtocol::Response::Response(int id, base::DictionaryValue* result)
     : id_(id),
       result_(result),
-      error_code_(0) {
+      error_code_(0),
+      is_async_promise_(false) {
 }
 
 DevToolsProtocol::Response::Response(int id,
@@ -126,9 +134,6 @@
                                      const std::string& error_message)
     : id_(id), error_code_(error_code), error_message_(error_message) {}
 
-DevToolsProtocol::Response::~Response() {
-}
-
 DevToolsProtocol::Notification::Notification(const std::string& method,
                                              base::DictionaryValue* params)
     : Message(method, params) {
@@ -151,12 +156,12 @@
 DevToolsProtocol::Handler::~Handler() {
 }
 
-scoped_ptr<DevToolsProtocol::Response>
+scoped_refptr<DevToolsProtocol::Response>
 DevToolsProtocol::Handler::HandleCommand(
-    DevToolsProtocol::Command* command) {
+    scoped_refptr<DevToolsProtocol::Command> command) {
   CommandHandlers::iterator it = command_handlers_.find(command->method());
   if (it == command_handlers_.end())
-    return scoped_ptr<DevToolsProtocol::Response>();
+    return NULL;
   return (it->second).Run(command);
 }
 
@@ -176,8 +181,9 @@
 void DevToolsProtocol::Handler::SendNotification(
     const std::string& method,
     base::DictionaryValue* params) {
-  DevToolsProtocol::Notification notification(method, params);
-  SendRawMessage(notification.Serialize());
+  scoped_refptr<DevToolsProtocol::Notification> notification =
+      new DevToolsProtocol::Notification(method, params);
+  SendRawMessage(notification->Serialize());
 }
 
 void DevToolsProtocol::Handler::SendRawMessage(const std::string& message) {
@@ -196,7 +202,7 @@
 }
 
 // static
-DevToolsProtocol::Command* DevToolsProtocol::ParseCommand(
+scoped_refptr<DevToolsProtocol::Command> DevToolsProtocol::ParseCommand(
     const std::string& json,
     std::string* error_response) {
   scoped_ptr<base::DictionaryValue> command_dict(
@@ -209,8 +215,9 @@
   bool ok = command_dict->GetInteger(kIdParam, &id) && id >= 0;
   ok = ok && ParseMethod(command_dict.get(), &method);
   if (!ok) {
-    Response response(kNoId, kErrorInvalidRequest, "No such method");
-    *error_response = response.Serialize();
+    scoped_refptr<Response> response =
+        new Response(kNoId, kErrorInvalidRequest, "No such method");
+    *error_response = response->Serialize();
     return NULL;
   }
 
@@ -220,7 +227,7 @@
 }
 
 // static
-DevToolsProtocol::Notification*
+scoped_refptr<DevToolsProtocol::Notification>
 DevToolsProtocol::ParseNotification(const std::string& json) {
   scoped_ptr<base::DictionaryValue> dict(ParseMessage(json, NULL));
   if (!dict)
@@ -237,7 +244,8 @@
 }
 
 //static
-DevToolsProtocol::Notification* DevToolsProtocol::CreateNotification(
+scoped_refptr<DevToolsProtocol::Notification>
+DevToolsProtocol::CreateNotification(
     const std::string& method,
     base::DictionaryValue* params) {
   return new Notification(method, params);
@@ -254,9 +262,10 @@
           json, 0, &parse_error_code, &error_message));
 
   if (!message || !message->IsType(Value::TYPE_DICTIONARY)) {
-    Response response(0, kErrorParseError, error_message);
+    scoped_refptr<Response> response =
+        new Response(0, kErrorParseError, error_message);
     if (error_response)
-      *error_response = response.Serialize();
+      *error_response = response->Serialize();
     return NULL;
   }
 
diff --git a/content/browser/devtools/devtools_protocol.h b/content/browser/devtools/devtools_protocol.h
index 71e8f58..0012947 100644
--- a/content/browser/devtools/devtools_protocol.h
+++ b/content/browser/devtools/devtools_protocol.h
@@ -11,6 +11,7 @@
 #include "base/basictypes.h"
 #include "base/callback.h"
 #include "base/compiler_specific.h"
+#include "base/memory/ref_counted.h"
 #include "base/values.h"
 
 namespace content {
@@ -23,16 +24,16 @@
 
   class Response;
 
-  class Message {
+  class Message : public base::RefCountedThreadSafe<Message> {
    public:
-    virtual ~Message();
-
     std::string domain() { return domain_; }
     std::string method() { return method_; }
     base::DictionaryValue* params() { return params_.get(); }
     virtual std::string Serialize() = 0;
 
    protected:
+    friend class base::RefCountedThreadSafe<Message>;
+    virtual ~Message();
     Message(const std::string& method,
             base::DictionaryValue* params);
 
@@ -46,23 +47,27 @@
 
   class Command : public Message {
    public:
-    virtual  ~Command();
-
     int id() { return id_; }
 
     virtual std::string Serialize() OVERRIDE;
 
     // Creates success response. Takes ownership of |result|.
-    scoped_ptr<Response> SuccessResponse(base::DictionaryValue* result);
+    scoped_refptr<Response> SuccessResponse(base::DictionaryValue* result);
 
-    // Creates error response. Caller takes ownership of the return value.
-    scoped_ptr<Response> InternalErrorResponse(const std::string& message);
+    // Creates error response.
+    scoped_refptr<Response> InternalErrorResponse(const std::string& message);
 
-    // Creates error response. Caller takes ownership of the return value.
-    scoped_ptr<Response> InvalidParamResponse(const std::string& param);
+    // Creates error response.
+    scoped_refptr<Response> InvalidParamResponse(const std::string& param);
 
-    // Creates error response. Caller takes ownership of the return value.
-    scoped_ptr<Response> NoSuchMethodErrorResponse();
+    // Creates error response.
+    scoped_refptr<Response> NoSuchMethodErrorResponse();
+
+    // Creates async response promise.
+    scoped_refptr<Response> AsyncResponsePromise();
+
+   protected:
+    virtual  ~Command();
 
    private:
     friend class DevToolsProtocol;
@@ -74,15 +79,17 @@
     DISALLOW_COPY_AND_ASSIGN(Command);
   };
 
-  class Response {
+  class Response : public base::RefCountedThreadSafe<Response> {
    public:
-    ~Response();
-
     std::string Serialize();
 
+    bool is_async_promise() { return is_async_promise_; }
+
    private:
+    friend class base::RefCountedThreadSafe<Response>;
     friend class Command;
     friend class DevToolsProtocol;
+    virtual  ~Response();
 
     Response(int id, base::DictionaryValue* result);
     Response(int id, int error_code, const std::string& error_message);
@@ -91,18 +98,19 @@
     scoped_ptr<base::DictionaryValue> result_;
     int error_code_;
     std::string error_message_;
+    bool is_async_promise_;
 
     DISALLOW_COPY_AND_ASSIGN(Response);
   };
 
   class Notification : public Message {
    public:
-    virtual ~Notification();
 
     virtual std::string Serialize() OVERRIDE;
 
    private:
     friend class DevToolsProtocol;
+    virtual ~Notification();
 
     // Takes ownership of |params|.
     Notification(const std::string& method,
@@ -113,13 +121,13 @@
 
   class Handler {
    public:
-    typedef base::Callback<scoped_ptr<DevToolsProtocol::Response>(
-        DevToolsProtocol::Command* command)> CommandHandler;
+    typedef base::Callback<scoped_refptr<DevToolsProtocol::Response>(
+        scoped_refptr<DevToolsProtocol::Command> command)> CommandHandler;
 
     virtual ~Handler();
 
-    virtual scoped_ptr<DevToolsProtocol::Response> HandleCommand(
-        DevToolsProtocol::Command* command);
+    virtual scoped_refptr<DevToolsProtocol::Response> HandleCommand(
+        scoped_refptr<DevToolsProtocol::Command> command);
 
     void SetNotifier(const Notifier& notifier);
 
@@ -146,13 +154,14 @@
     DISALLOW_COPY_AND_ASSIGN(Handler);
   };
 
-  static Command* ParseCommand(const std::string& json,
-                               std::string* error_response);
+  static scoped_refptr<Command> ParseCommand(const std::string& json,
+                                             std::string* error_response);
 
-  static Notification* ParseNotification(const std::string& json);
+  static scoped_refptr<Notification> ParseNotification(
+      const std::string& json);
 
-  static Notification* CreateNotification(const std::string& method,
-                                          base::DictionaryValue* params);
+  static scoped_refptr<Notification> CreateNotification(
+      const std::string& method, base::DictionaryValue* params);
 
  private:
   static base::DictionaryValue* ParseMessage(const std::string& json,
diff --git a/content/browser/devtools/devtools_tracing_handler.cc b/content/browser/devtools/devtools_tracing_handler.cc
index 2b4fddc..0657b8e 100644
--- a/content/browser/devtools/devtools_tracing_handler.cc
+++ b/content/browser/devtools/devtools_tracing_handler.cc
@@ -82,8 +82,9 @@
   return static_cast<base::debug::TraceLog::Options>(ret);
 }
 
-scoped_ptr<DevToolsProtocol::Response>
-DevToolsTracingHandler::OnStart(DevToolsProtocol::Command* command) {
+scoped_refptr<DevToolsProtocol::Response>
+DevToolsTracingHandler::OnStart(
+    scoped_refptr<DevToolsProtocol::Command> command) {
   std::string categories;
   base::DictionaryValue* params = command->params();
   if (params)
@@ -102,8 +103,9 @@
   return command->SuccessResponse(NULL);
 }
 
-scoped_ptr<DevToolsProtocol::Response>
-DevToolsTracingHandler::OnEnd(DevToolsProtocol::Command* command) {
+scoped_refptr<DevToolsProtocol::Response>
+DevToolsTracingHandler::OnEnd(
+    scoped_refptr<DevToolsProtocol::Command> command) {
   TraceController::GetInstance()->EndTracingAsync(this);
   return command->SuccessResponse(NULL);
 }
diff --git a/content/browser/devtools/devtools_tracing_handler.h b/content/browser/devtools/devtools_tracing_handler.h
index 0c528c5..43cd615 100644
--- a/content/browser/devtools/devtools_tracing_handler.h
+++ b/content/browser/devtools/devtools_tracing_handler.h
@@ -26,10 +26,10 @@
       const scoped_refptr<base::RefCountedString>& trace_fragment) OVERRIDE;
 
  private:
-  scoped_ptr<DevToolsProtocol::Response> OnStart(
-      DevToolsProtocol::Command* command);
-  scoped_ptr<DevToolsProtocol::Response> OnEnd(
-      DevToolsProtocol::Command* command);
+  scoped_refptr<DevToolsProtocol::Response> OnStart(
+      scoped_refptr<DevToolsProtocol::Command> command);
+  scoped_refptr<DevToolsProtocol::Response> OnEnd(
+      scoped_refptr<DevToolsProtocol::Command> command);
 
   base::debug::TraceLog::Options TraceOptionsFromString(
       const std::string& options);
diff --git a/content/browser/devtools/render_view_devtools_agent_host.cc b/content/browser/devtools/render_view_devtools_agent_host.cc
index 202589b..0c2d323 100644
--- a/content/browser/devtools/render_view_devtools_agent_host.cc
+++ b/content/browser/devtools/render_view_devtools_agent_host.cc
@@ -156,15 +156,17 @@
 void RenderViewDevToolsAgentHost::DispatchOnInspectorBackend(
     const std::string& message) {
   std::string error_message;
-  scoped_ptr<DevToolsProtocol::Command> command(
-      DevToolsProtocol::ParseCommand(message, &error_message));
+  scoped_refptr<DevToolsProtocol::Command> command =
+      DevToolsProtocol::ParseCommand(message, &error_message);
+
   if (command) {
-    scoped_ptr<DevToolsProtocol::Response> overridden_response(
-        overrides_handler_->HandleCommand(command.get()));
+    scoped_refptr<DevToolsProtocol::Response> overridden_response =
+        overrides_handler_->HandleCommand(command);
     if (!overridden_response)
-      overridden_response = tracing_handler_->HandleCommand(command.get());
+      overridden_response = tracing_handler_->HandleCommand(command);
     if (overridden_response) {
-      OnDispatchOnInspectorFrontend(overridden_response->Serialize());
+      if (!overridden_response->is_async_promise())
+        OnDispatchOnInspectorFrontend(overridden_response->Serialize());
       return;
     }
   }
@@ -290,9 +292,9 @@
 }
 
 void RenderViewDevToolsAgentHost::RenderViewCrashed() {
-  scoped_ptr<DevToolsProtocol::Notification> notification(
+  scoped_refptr<DevToolsProtocol::Notification> notification =
       DevToolsProtocol::CreateNotification(
-          devtools::Inspector::targetCrashed::kName, NULL));
+          devtools::Inspector::targetCrashed::kName, NULL);
   DevToolsManagerImpl::GetInstance()->
       DispatchOnInspectorFrontend(this, notification->Serialize());
 }
diff --git a/content/browser/devtools/renderer_overrides_handler.cc b/content/browser/devtools/renderer_overrides_handler.cc
index cbc26f4..69fe055 100644
--- a/content/browser/devtools/renderer_overrides_handler.cc
+++ b/content/browser/devtools/renderer_overrides_handler.cc
@@ -16,6 +16,7 @@
 #include "content/browser/devtools/devtools_protocol_constants.h"
 #include "content/browser/devtools/devtools_tracing_handler.h"
 #include "content/browser/renderer_host/render_view_host_delegate.h"
+#include "content/public/browser/browser_thread.h"
 #include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/javascript_dialog_manager.h"
 #include "content/public/browser/navigation_controller.h"
@@ -32,7 +33,8 @@
 namespace content {
 
 RendererOverridesHandler::RendererOverridesHandler(DevToolsAgentHost* agent)
-    : agent_(agent) {
+    : agent_(agent),
+      weak_factory_(this) {
   RegisterCommandHandler(
       devtools::DOM::setFileInputFiles::kName,
       base::Bind(
@@ -57,9 +59,9 @@
 
 RendererOverridesHandler::~RendererOverridesHandler() {}
 
-scoped_ptr<DevToolsProtocol::Response>
+scoped_refptr<DevToolsProtocol::Response>
 RendererOverridesHandler::GrantPermissionsForSetFileInputFiles(
-    DevToolsProtocol::Command* command) {
+    scoped_refptr<DevToolsProtocol::Command> command) {
   base::DictionaryValue* params = command->params();
   base::ListValue* file_list = NULL;
   const char* param =
@@ -68,7 +70,7 @@
     return command->InvalidParamResponse(param);
   RenderViewHost* host = agent_->GetRenderViewHost();
   if (!host)
-    return scoped_ptr<DevToolsProtocol::Response>();
+    return NULL;
 
   for (size_t i = 0; i < file_list->GetSize(); ++i) {
     base::FilePath::StringType file;
@@ -77,12 +79,12 @@
     ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadFile(
         host->GetProcess()->GetID(), base::FilePath(file));
   }
-  return scoped_ptr<DevToolsProtocol::Response>();
+  return NULL;
 }
 
-scoped_ptr<DevToolsProtocol::Response>
+scoped_refptr<DevToolsProtocol::Response>
 RendererOverridesHandler::PageHandleJavaScriptDialog(
-    DevToolsProtocol::Command* command) {
+    scoped_refptr<DevToolsProtocol::Command> command) {
   base::DictionaryValue* params = command->params();
   const char* paramAccept =
       devtools::Page::handleJavaScriptDialog::kParamAccept;
@@ -105,16 +107,16 @@
           web_contents->GetDelegate()->GetJavaScriptDialogManager();
       if (manager && manager->HandleJavaScriptDialog(
               web_contents, accept, prompt_override_ptr)) {
-        return scoped_ptr<DevToolsProtocol::Response>();
+        return NULL;
       }
     }
   }
   return command->InternalErrorResponse("No JavaScript dialog to handle");
 }
 
-scoped_ptr<DevToolsProtocol::Response>
+scoped_refptr<DevToolsProtocol::Response>
 RendererOverridesHandler::PageNavigate(
-    DevToolsProtocol::Command* command) {
+    scoped_refptr<DevToolsProtocol::Command> command) {
   base::DictionaryValue* params = command->params();
   std::string url;
   const char* param = devtools::Page::navigate::kParamUrl;
@@ -136,34 +138,47 @@
   return command->InternalErrorResponse("No WebContents to navigate");
 }
 
-scoped_ptr<DevToolsProtocol::Response>
+scoped_refptr<DevToolsProtocol::Response>
 RendererOverridesHandler::PageCaptureScreenshot(
-    DevToolsProtocol::Command* command) {
-  std::string base_64_data;
-  if (!CaptureScreenshot(&base_64_data))
-    return command->InternalErrorResponse("Unable to capture a screenshot");
+    scoped_refptr<DevToolsProtocol::Command> command) {
+  // Emulate async processing.
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::Bind(&RendererOverridesHandler::CaptureScreenshot,
+                 weak_factory_.GetWeakPtr(),
+                 command));
 
-  base::DictionaryValue* response = new base::DictionaryValue();
-  response->SetString(
-      devtools::Page::captureScreenshot::kResponseData, base_64_data);
-  return command->SuccessResponse(response);
+  return command->AsyncResponsePromise();
 }
 
-bool RendererOverridesHandler::CaptureScreenshot(std::string* base_64_data) {
+void RendererOverridesHandler::CaptureScreenshot(
+    scoped_refptr<DevToolsProtocol::Command> command) {
+
   RenderViewHost* host = agent_->GetRenderViewHost();
   gfx::Rect view_bounds = host->GetView()->GetViewBounds();
   gfx::Rect snapshot_bounds(view_bounds.size());
   gfx::Size snapshot_size = snapshot_bounds.size();
-  std::vector<unsigned char> png;
-  if (!ui::GrabViewSnapshot(host->GetView()->GetNativeView(),
-                            &png,
-                            snapshot_bounds))
-    return false;
 
-  return base::Base64Encode(base::StringPiece(
-                                reinterpret_cast<char*>(&*png.begin()),
-                                png.size()),
-                            base_64_data);
+  std::vector<unsigned char> png;
+  if (ui::GrabViewSnapshot(host->GetView()->GetNativeView(),
+                           &png,
+                           snapshot_bounds)) {
+    std::string base_64_data;
+    bool success = base::Base64Encode(
+        base::StringPiece(reinterpret_cast<char*>(&*png.begin()), png.size()),
+        &base_64_data);
+    if (success) {
+      base::DictionaryValue* result = new base::DictionaryValue();
+      result->SetString(
+          devtools::Page::captureScreenshot::kResponseData, base_64_data);
+      scoped_refptr<DevToolsProtocol::Response> response =
+          command->SuccessResponse(result);
+      SendRawMessage(response->Serialize());
+      return;
+    }
+  }
+  SendRawMessage(command->
+      InternalErrorResponse("Unable to capture a screenshot")->Serialize());
 }
 
 }  // namespace content
diff --git a/content/browser/devtools/renderer_overrides_handler.h b/content/browser/devtools/renderer_overrides_handler.h
index ca85af1..9a46c38 100644
--- a/content/browser/devtools/renderer_overrides_handler.h
+++ b/content/browser/devtools/renderer_overrides_handler.h
@@ -8,6 +8,7 @@
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
 #include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
 #include "content/browser/devtools/devtools_protocol.h"
 
 namespace content {
@@ -24,19 +25,20 @@
   virtual ~RendererOverridesHandler();
 
  private:
-  scoped_ptr<DevToolsProtocol::Response> GrantPermissionsForSetFileInputFiles(
-      DevToolsProtocol::Command* command);
-  scoped_ptr<DevToolsProtocol::Response> PageHandleJavaScriptDialog(
-      DevToolsProtocol::Command* command);
-  scoped_ptr<DevToolsProtocol::Response> PageNavigate(
-      DevToolsProtocol::Command* command);
-  scoped_ptr<DevToolsProtocol::Response> PageCaptureScreenshot(
-      DevToolsProtocol::Command* command);
+  scoped_refptr<DevToolsProtocol::Response>
+      GrantPermissionsForSetFileInputFiles(
+          scoped_refptr<DevToolsProtocol::Command> command);
+  scoped_refptr<DevToolsProtocol::Response> PageHandleJavaScriptDialog(
+      scoped_refptr<DevToolsProtocol::Command> command);
+  scoped_refptr<DevToolsProtocol::Response> PageNavigate(
+      scoped_refptr<DevToolsProtocol::Command> command);
+  scoped_refptr<DevToolsProtocol::Response> PageCaptureScreenshot(
+      scoped_refptr<DevToolsProtocol::Command> command);
 
-  bool CaptureScreenshot(std::string* base_64_data);
+  void CaptureScreenshot(scoped_refptr<DevToolsProtocol::Command> command);
 
   DevToolsAgentHost* agent_;
-
+  base::WeakPtrFactory<RendererOverridesHandler> weak_factory_;
   DISALLOW_COPY_AND_ASSIGN(RendererOverridesHandler);
 };
 
diff --git a/content/browser/devtools/tethering_handler.cc b/content/browser/devtools/tethering_handler.cc
index fc25e63..711adcd 100644
--- a/content/browser/devtools/tethering_handler.cc
+++ b/content/browser/devtools/tethering_handler.cc
@@ -264,7 +264,7 @@
   SendNotification(kTetheringAccepted, params);
 }
 
-static int GetPort(DevToolsProtocol::Command* command) {
+static int GetPort(scoped_refptr<DevToolsProtocol::Command> command) {
   base::DictionaryValue* params = command->params();
   int port = 0;
   if (!params || !params->GetInteger(kPortParam, &port) ||
@@ -273,8 +273,8 @@
   return port;
 }
 
-scoped_ptr<DevToolsProtocol::Response>
-TetheringHandler::OnBind(DevToolsProtocol::Command* command) {
+scoped_refptr<DevToolsProtocol::Response>
+TetheringHandler::OnBind(scoped_refptr<DevToolsProtocol::Command> command) {
   int port = GetPort(command);
   if (port == 0)
     return command->InvalidParamResponse(kPortParam);
@@ -290,8 +290,8 @@
   return command->SuccessResponse(NULL);
 }
 
-scoped_ptr<DevToolsProtocol::Response>
-TetheringHandler::OnUnbind(DevToolsProtocol::Command* command) {
+scoped_refptr<DevToolsProtocol::Response>
+TetheringHandler::OnUnbind(scoped_refptr<DevToolsProtocol::Command> command) {
   int port = GetPort(command);
   if (port == 0)
     return command->InvalidParamResponse(kPortParam);
diff --git a/content/browser/devtools/tethering_handler.h b/content/browser/devtools/tethering_handler.h
index a9931cc..7086e17 100644
--- a/content/browser/devtools/tethering_handler.h
+++ b/content/browser/devtools/tethering_handler.h
@@ -25,10 +25,10 @@
 
  private:
   class BoundSocket;
-  scoped_ptr<DevToolsProtocol::Response> OnBind(
-      DevToolsProtocol::Command* command);
-  scoped_ptr<DevToolsProtocol::Response> OnUnbind(
-      DevToolsProtocol::Command* command);
+  scoped_refptr<DevToolsProtocol::Response> OnBind(
+      scoped_refptr<DevToolsProtocol::Command> command);
+  scoped_refptr<DevToolsProtocol::Response> OnUnbind(
+      scoped_refptr<DevToolsProtocol::Command>  command);
 
   typedef std::map<int, BoundSocket*> BoundSockets;
   BoundSockets bound_sockets_;
diff --git a/content/browser/dom_storage/DEPS b/content/browser/dom_storage/DEPS
index aabd9ff..743a2f3 100644
--- a/content/browser/dom_storage/DEPS
+++ b/content/browser/dom_storage/DEPS
@@ -1,3 +1,3 @@
 include_rules = [
-  "+webkit/dom_storage",
+  "+third_party/leveldatabase",
 ]
diff --git a/content/browser/dom_storage/OWNERS b/content/browser/dom_storage/OWNERS
index 74fb7e1..e765c6f 100644
--- a/content/browser/dom_storage/OWNERS
+++ b/content/browser/dom_storage/OWNERS
@@ -1,4 +1,2 @@
 michaeln@chromium.org
-kinuko@chromium.org
-jsbell@chromium.org
-ericu@chromium.org
+marja@chromium.org
diff --git a/webkit/browser/dom_storage/dom_storage_area.cc b/content/browser/dom_storage/dom_storage_area.cc
similarity index 76%
rename from webkit/browser/dom_storage/dom_storage_area.cc
rename to content/browser/dom_storage/dom_storage_area.cc
index d0e2ac3..e358301 100644
--- a/webkit/browser/dom_storage/dom_storage_area.cc
+++ b/content/browser/dom_storage/dom_storage_area.cc
@@ -1,8 +1,8 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "webkit/browser/dom_storage/dom_storage_area.h"
+#include "content/browser/dom_storage/dom_storage_area.h"
 
 #include "base/bind.h"
 #include "base/location.h"
@@ -10,35 +10,35 @@
 #include "base/metrics/histogram.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
+#include "content/browser/dom_storage/dom_storage_namespace.h"
+#include "content/browser/dom_storage/dom_storage_task_runner.h"
+#include "content/browser/dom_storage/local_storage_database_adapter.h"
+#include "content/browser/dom_storage/session_storage_database.h"
+#include "content/browser/dom_storage/session_storage_database_adapter.h"
+#include "content/common/dom_storage/dom_storage_map.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "webkit/browser/database/database_util.h"
-#include "webkit/browser/dom_storage/dom_storage_namespace.h"
-#include "webkit/browser/dom_storage/dom_storage_task_runner.h"
-#include "webkit/browser/dom_storage/local_storage_database_adapter.h"
-#include "webkit/browser/dom_storage/session_storage_database.h"
-#include "webkit/browser/dom_storage/session_storage_database_adapter.h"
 #include "webkit/common/database/database_identifier.h"
-#include "webkit/common/dom_storage/dom_storage_map.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 #include "webkit/common/fileapi/file_system_util.h"
 
 using webkit_database::DatabaseUtil;
 
-namespace dom_storage {
+namespace content {
 
 static const int kCommitTimerSeconds = 1;
 
-DomStorageArea::CommitBatch::CommitBatch()
+DOMStorageArea::CommitBatch::CommitBatch()
   : clear_all_first(false) {
 }
-DomStorageArea::CommitBatch::~CommitBatch() {}
+DOMStorageArea::CommitBatch::~CommitBatch() {}
 
 
 // static
-const base::FilePath::CharType DomStorageArea::kDatabaseFileExtension[] =
+const base::FilePath::CharType DOMStorageArea::kDatabaseFileExtension[] =
     FILE_PATH_LITERAL(".localstorage");
 
 // static
-base::FilePath DomStorageArea::DatabaseFileNameFromOrigin(const GURL& origin) {
+base::FilePath DOMStorageArea::DatabaseFileNameFromOrigin(const GURL& origin) {
   std::string filename = webkit_database::GetIdentifierFromOrigin(origin);
   // There is no base::FilePath.AppendExtension() method, so start with just the
   // extension as the filename, and then InsertBeforeExtension the desired
@@ -48,19 +48,21 @@
 }
 
 // static
-GURL DomStorageArea::OriginFromDatabaseFileName(const base::FilePath& name) {
+GURL DOMStorageArea::OriginFromDatabaseFileName(const base::FilePath& name) {
   DCHECK(name.MatchesExtension(kDatabaseFileExtension));
   std::string origin_id =
       name.BaseName().RemoveExtension().MaybeAsASCII();
   return webkit_database::GetOriginFromIdentifier(origin_id);
 }
 
-DomStorageArea::DomStorageArea(const GURL& origin, const base::FilePath& directory,
-                               DomStorageTaskRunner* task_runner)
+DOMStorageArea::DOMStorageArea(
+    const GURL& origin, const base::FilePath& directory,
+    DOMStorageTaskRunner* task_runner)
     : namespace_id_(kLocalStorageNamespaceId), origin_(origin),
       directory_(directory),
       task_runner_(task_runner),
-      map_(new DomStorageMap(kPerAreaQuota + kPerAreaOverQuotaAllowance)),
+      map_(new DOMStorageMap(kPerStorageAreaQuota +
+                             kPerStorageAreaOverQuotaAllowance)),
       is_initial_import_done_(true),
       is_shutdown_(false),
       commit_batches_in_flight_(0) {
@@ -71,17 +73,18 @@
   }
 }
 
-DomStorageArea::DomStorageArea(
+DOMStorageArea::DOMStorageArea(
     int64 namespace_id,
     const std::string& persistent_namespace_id,
     const GURL& origin,
     SessionStorageDatabase* session_storage_backing,
-    DomStorageTaskRunner* task_runner)
+    DOMStorageTaskRunner* task_runner)
     : namespace_id_(namespace_id),
       persistent_namespace_id_(persistent_namespace_id),
       origin_(origin),
       task_runner_(task_runner),
-      map_(new DomStorageMap(kPerAreaQuota + kPerAreaOverQuotaAllowance)),
+      map_(new DOMStorageMap(kPerStorageAreaQuota +
+                             kPerStorageAreaOverQuotaAllowance)),
       session_storage_backing_(session_storage_backing),
       is_initial_import_done_(true),
       is_shutdown_(false),
@@ -94,38 +97,38 @@
   }
 }
 
-DomStorageArea::~DomStorageArea() {
+DOMStorageArea::~DOMStorageArea() {
 }
 
-void DomStorageArea::ExtractValues(ValuesMap* map) {
+void DOMStorageArea::ExtractValues(DOMStorageValuesMap* map) {
   if (is_shutdown_)
     return;
   InitialImportIfNeeded();
   map_->ExtractValues(map);
 }
 
-unsigned DomStorageArea::Length() {
+unsigned DOMStorageArea::Length() {
   if (is_shutdown_)
     return 0;
   InitialImportIfNeeded();
   return map_->Length();
 }
 
-base::NullableString16 DomStorageArea::Key(unsigned index) {
+base::NullableString16 DOMStorageArea::Key(unsigned index) {
   if (is_shutdown_)
     return base::NullableString16();
   InitialImportIfNeeded();
   return map_->Key(index);
 }
 
-base::NullableString16 DomStorageArea::GetItem(const base::string16& key) {
+base::NullableString16 DOMStorageArea::GetItem(const base::string16& key) {
   if (is_shutdown_)
     return base::NullableString16();
   InitialImportIfNeeded();
   return map_->GetItem(key);
 }
 
-bool DomStorageArea::SetItem(const base::string16& key,
+bool DOMStorageArea::SetItem(const base::string16& key,
                              const base::string16& value,
                              base::NullableString16* old_value) {
   if (is_shutdown_)
@@ -141,7 +144,7 @@
   return success;
 }
 
-bool DomStorageArea::RemoveItem(const base::string16& key,
+bool DOMStorageArea::RemoveItem(const base::string16& key,
                                 base::string16* old_value) {
   if (is_shutdown_)
     return false;
@@ -156,14 +159,15 @@
   return success;
 }
 
-bool DomStorageArea::Clear() {
+bool DOMStorageArea::Clear() {
   if (is_shutdown_)
     return false;
   InitialImportIfNeeded();
   if (map_->Length() == 0)
     return false;
 
-  map_ = new DomStorageMap(kPerAreaQuota + kPerAreaOverQuotaAllowance);
+  map_ = new DOMStorageMap(kPerStorageAreaQuota +
+                           kPerStorageAreaOverQuotaAllowance);
 
   if (backing_) {
     CommitBatch* commit_batch = CreateCommitBatchIfNeeded();
@@ -174,14 +178,15 @@
   return true;
 }
 
-void DomStorageArea::FastClear() {
+void DOMStorageArea::FastClear() {
   // TODO(marja): Unify clearing localStorage and sessionStorage. The problem is
   // to make the following 3 to work together: 1) FastClear, 2) PurgeMemory and
   // 3) not creating events when clearing an empty area.
   if (is_shutdown_)
     return;
 
-  map_ = new DomStorageMap(kPerAreaQuota + kPerAreaOverQuotaAllowance);
+  map_ = new DOMStorageMap(kPerStorageAreaQuota +
+                           kPerStorageAreaOverQuotaAllowance);
   // This ensures no import will happen while we're waiting to clear the data
   // from the database. This mechanism fails if PurgeMemory is called.
   is_initial_import_done_ = true;
@@ -193,13 +198,13 @@
   }
 }
 
-DomStorageArea* DomStorageArea::ShallowCopy(
+DOMStorageArea* DOMStorageArea::ShallowCopy(
     int64 destination_namespace_id,
     const std::string& destination_persistent_namespace_id) {
   DCHECK_NE(kLocalStorageNamespaceId, namespace_id_);
   DCHECK_NE(kLocalStorageNamespaceId, destination_namespace_id);
 
-  DomStorageArea* copy = new DomStorageArea(
+  DOMStorageArea* copy = new DOMStorageArea(
       destination_namespace_id, destination_persistent_namespace_id, origin_,
       session_storage_backing_.get(), task_runner_.get());
   copy->map_ = map_;
@@ -215,12 +220,12 @@
   return copy;
 }
 
-bool DomStorageArea::HasUncommittedChanges() const {
+bool DOMStorageArea::HasUncommittedChanges() const {
   DCHECK(!is_shutdown_);
   return commit_batch_.get() || commit_batches_in_flight_;
 }
 
-void DomStorageArea::DeleteOrigin() {
+void DOMStorageArea::DeleteOrigin() {
   DCHECK(!is_shutdown_);
   // This function shouldn't be called for sessionStorage.
   DCHECK(!session_storage_backing_.get());
@@ -233,7 +238,8 @@
     Clear();
     return;
   }
-  map_ = new DomStorageMap(kPerAreaQuota + kPerAreaOverQuotaAllowance);
+  map_ = new DOMStorageMap(kPerStorageAreaQuota +
+                           kPerStorageAreaOverQuotaAllowance);
   if (backing_) {
     is_initial_import_done_ = false;
     backing_->Reset();
@@ -241,7 +247,7 @@
   }
 }
 
-void DomStorageArea::PurgeMemory() {
+void DOMStorageArea::PurgeMemory() {
   DCHECK(!is_shutdown_);
   // Purging sessionStorage is not supported; it won't work with FastClear.
   DCHECK(!session_storage_backing_.get());
@@ -252,14 +258,15 @@
 
   // Drop the in memory cache, we'll reload when needed.
   is_initial_import_done_ = false;
-  map_ = new DomStorageMap(kPerAreaQuota + kPerAreaOverQuotaAllowance);
+  map_ = new DOMStorageMap(kPerStorageAreaQuota +
+                           kPerStorageAreaOverQuotaAllowance);
 
   // Recreate the database object, this frees up the open sqlite connection
   // and its page cache.
   backing_->Reset();
 }
 
-void DomStorageArea::Shutdown() {
+void DOMStorageArea::Shutdown() {
   DCHECK(!is_shutdown_);
   is_shutdown_ = true;
   map_ = NULL;
@@ -268,19 +275,19 @@
 
   bool success = task_runner_->PostShutdownBlockingTask(
       FROM_HERE,
-      DomStorageTaskRunner::COMMIT_SEQUENCE,
-      base::Bind(&DomStorageArea::ShutdownInCommitSequence, this));
+      DOMStorageTaskRunner::COMMIT_SEQUENCE,
+      base::Bind(&DOMStorageArea::ShutdownInCommitSequence, this));
   DCHECK(success);
 }
 
-void DomStorageArea::InitialImportIfNeeded() {
+void DOMStorageArea::InitialImportIfNeeded() {
   if (is_initial_import_done_)
     return;
 
   DCHECK(backing_.get());
 
   base::TimeTicks before = base::TimeTicks::Now();
-  ValuesMap initial_values;
+  DOMStorageValuesMap initial_values;
   backing_->ReadAllValues(&initial_values);
   map_->SwapValues(&initial_values);
   is_initial_import_done_ = true;
@@ -310,7 +317,7 @@
   }
 }
 
-DomStorageArea::CommitBatch* DomStorageArea::CreateCommitBatchIfNeeded() {
+DOMStorageArea::CommitBatch* DOMStorageArea::CreateCommitBatchIfNeeded() {
   DCHECK(!is_shutdown_);
   if (!commit_batch_) {
     commit_batch_.reset(new CommitBatch());
@@ -321,14 +328,14 @@
     if (!commit_batches_in_flight_) {
       task_runner_->PostDelayedTask(
           FROM_HERE,
-          base::Bind(&DomStorageArea::OnCommitTimer, this),
+          base::Bind(&DOMStorageArea::OnCommitTimer, this),
           base::TimeDelta::FromSeconds(kCommitTimerSeconds));
     }
   }
   return commit_batch_.get();
 }
 
-void DomStorageArea::OnCommitTimer() {
+void DOMStorageArea::OnCommitTimer() {
   if (is_shutdown_)
     return;
 
@@ -344,14 +351,14 @@
   DCHECK(task_runner_->IsRunningOnPrimarySequence());
   bool success = task_runner_->PostShutdownBlockingTask(
       FROM_HERE,
-      DomStorageTaskRunner::COMMIT_SEQUENCE,
-      base::Bind(&DomStorageArea::CommitChanges, this,
+      DOMStorageTaskRunner::COMMIT_SEQUENCE,
+      base::Bind(&DOMStorageArea::CommitChanges, this,
                  base::Owned(commit_batch_.release())));
   ++commit_batches_in_flight_;
   DCHECK(success);
 }
 
-void DomStorageArea::CommitChanges(const CommitBatch* commit_batch) {
+void DOMStorageArea::CommitChanges(const CommitBatch* commit_batch) {
   // This method executes on the commit sequence.
   DCHECK(task_runner_->IsRunningOnCommitSequence());
   bool success = backing_->CommitChanges(commit_batch->clear_all_first,
@@ -359,10 +366,10 @@
   DCHECK(success);  // TODO(michaeln): what if it fails?
   task_runner_->PostTask(
       FROM_HERE,
-      base::Bind(&DomStorageArea::OnCommitComplete, this));
+      base::Bind(&DOMStorageArea::OnCommitComplete, this));
 }
 
-void DomStorageArea::OnCommitComplete() {
+void DOMStorageArea::OnCommitComplete() {
   // We're back on the primary sequence in this method.
   DCHECK(task_runner_->IsRunningOnPrimarySequence());
   --commit_batches_in_flight_;
@@ -372,12 +379,12 @@
     // More changes have accrued, restart the timer.
     task_runner_->PostDelayedTask(
         FROM_HERE,
-        base::Bind(&DomStorageArea::OnCommitTimer, this),
+        base::Bind(&DOMStorageArea::OnCommitTimer, this),
         base::TimeDelta::FromSeconds(kCommitTimerSeconds));
   }
 }
 
-void DomStorageArea::ShutdownInCommitSequence() {
+void DOMStorageArea::ShutdownInCommitSequence() {
   // This method executes on the commit sequence.
   DCHECK(task_runner_->IsRunningOnCommitSequence());
   DCHECK(backing_.get());
@@ -393,4 +400,4 @@
   session_storage_backing_ = NULL;
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/webkit/browser/dom_storage/dom_storage_area.h b/content/browser/dom_storage/dom_storage_area.h
similarity index 66%
rename from webkit/browser/dom_storage/dom_storage_area.h
rename to content/browser/dom_storage/dom_storage_area.h
index 04923aa..ca28be1 100644
--- a/webkit/browser/dom_storage/dom_storage_area.h
+++ b/content/browser/dom_storage/dom_storage_area.h
@@ -1,9 +1,9 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_AREA_H_
-#define WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_AREA_H_
+#ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_AREA_H_
+#define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_AREA_H_
 
 #include "base/files/file_path.h"
 #include "base/gtest_prod_util.h"
@@ -11,22 +11,22 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/strings/nullable_string16.h"
 #include "base/strings/string16.h"
+#include "content/common/content_export.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "url/gurl.h"
-#include "webkit/browser/webkit_storage_browser_export.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
-namespace dom_storage {
+namespace content {
 
-class DomStorageDatabaseAdapter;
-class DomStorageMap;
-class DomStorageTaskRunner;
+class DOMStorageDatabaseAdapter;
+class DOMStorageMap;
+class DOMStorageTaskRunner;
 class SessionStorageDatabase;
 
 // Container for a per-origin Map of key/value pairs potentially
 // backed by storage on disk and lazily commits changes to disk.
-// See class comments for DomStorageContext for a larger overview.
-class WEBKIT_STORAGE_BROWSER_EXPORT DomStorageArea
-    : public base::RefCountedThreadSafe<DomStorageArea> {
+// See class comments for DOMStorageContextImpl for a larger overview.
+class CONTENT_EXPORT DOMStorageArea
+    : public base::RefCountedThreadSafe<DOMStorageArea> {
 
  public:
   static const base::FilePath::CharType kDatabaseFileExtension[];
@@ -34,22 +34,22 @@
   static GURL OriginFromDatabaseFileName(const base::FilePath& file_name);
 
   // Local storage. Backed on disk if directory is nonempty.
-  DomStorageArea(const GURL& origin,
+  DOMStorageArea(const GURL& origin,
                  const base::FilePath& directory,
-                 DomStorageTaskRunner* task_runner);
+                 DOMStorageTaskRunner* task_runner);
 
   // Session storage. Backed on disk if |session_storage_backing| is not NULL.
-  DomStorageArea(int64 namespace_id,
+  DOMStorageArea(int64 namespace_id,
                  const std::string& persistent_namespace_id,
                  const GURL& origin,
                  SessionStorageDatabase* session_storage_backing,
-                 DomStorageTaskRunner* task_runner);
+                 DOMStorageTaskRunner* task_runner);
 
   const GURL& origin() const { return origin_; }
   int64 namespace_id() const { return namespace_id_; }
 
   // Writes a copy of the current set of values in the area to the |map|.
-  void ExtractValues(ValuesMap* map);
+  void ExtractValues(DOMStorageValuesMap* map);
 
   unsigned Length();
   base::NullableString16 Key(unsigned index);
@@ -60,7 +60,7 @@
   bool Clear();
   void FastClear();
 
-  DomStorageArea* ShallowCopy(
+  DOMStorageArea* ShallowCopy(
       int64 destination_namespace_id,
       const std::string& destination_persistent_namespace_id);
 
@@ -84,25 +84,25 @@
   bool IsLoadedInMemory() const { return is_initial_import_done_; }
 
  private:
-  friend class DomStorageAreaTest;
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, DomStorageAreaBasics);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, BackingDatabaseOpened);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, TestDatabaseFilePath);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, CommitTasks);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, CommitChangesAtShutdown);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, DeleteOrigin);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, PurgeMemory);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageContextTest, PersistentIds);
-  friend class base::RefCountedThreadSafe<DomStorageArea>;
+  friend class DOMStorageAreaTest;
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, DOMStorageAreaBasics);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, BackingDatabaseOpened);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, TestDatabaseFilePath);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, CommitTasks);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, CommitChangesAtShutdown);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, DeleteOrigin);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, PurgeMemory);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageContextImplTest, PersistentIds);
+  friend class base::RefCountedThreadSafe<DOMStorageArea>;
 
   struct CommitBatch {
     bool clear_all_first;
-    ValuesMap changed_values;
+    DOMStorageValuesMap changed_values;
     CommitBatch();
     ~CommitBatch();
   };
 
-  ~DomStorageArea();
+  ~DOMStorageArea();
 
   // If we haven't done so already and this is a local storage area,
   // will attempt to read any values for this origin currently
@@ -123,9 +123,9 @@
   std::string persistent_namespace_id_;
   GURL origin_;
   base::FilePath directory_;
-  scoped_refptr<DomStorageTaskRunner> task_runner_;
-  scoped_refptr<DomStorageMap> map_;
-  scoped_ptr<DomStorageDatabaseAdapter> backing_;
+  scoped_refptr<DOMStorageTaskRunner> task_runner_;
+  scoped_refptr<DOMStorageMap> map_;
+  scoped_ptr<DOMStorageDatabaseAdapter> backing_;
   scoped_refptr<SessionStorageDatabase> session_storage_backing_;
   bool is_initial_import_done_;
   bool is_shutdown_;
@@ -133,6 +133,6 @@
   int commit_batches_in_flight_;
 };
 
-}  // namespace dom_storage
+}  // namespace content
 
-#endif  // WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_AREA_H_
+#endif  // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_AREA_H_
diff --git a/webkit/browser/dom_storage/dom_storage_area_unittest.cc b/content/browser/dom_storage/dom_storage_area_unittest.cc
similarity index 82%
rename from webkit/browser/dom_storage/dom_storage_area_unittest.cc
rename to content/browser/dom_storage/dom_storage_area_unittest.cc
index 68aff17..697f625 100644
--- a/webkit/browser/dom_storage/dom_storage_area_unittest.cc
+++ b/content/browser/dom_storage/dom_storage_area_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -10,20 +10,20 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "base/time/time.h"
+#include "content/browser/dom_storage/dom_storage_area.h"
+#include "content/browser/dom_storage/dom_storage_database.h"
+#include "content/browser/dom_storage/dom_storage_database_adapter.h"
+#include "content/browser/dom_storage/dom_storage_task_runner.h"
+#include "content/browser/dom_storage/local_storage_database_adapter.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "webkit/browser/dom_storage/dom_storage_area.h"
-#include "webkit/browser/dom_storage/dom_storage_database.h"
-#include "webkit/browser/dom_storage/dom_storage_database_adapter.h"
-#include "webkit/browser/dom_storage/dom_storage_task_runner.h"
-#include "webkit/browser/dom_storage/local_storage_database_adapter.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
-namespace dom_storage {
+namespace content {
 
 
-class DomStorageAreaTest : public testing::Test {
+class DOMStorageAreaTest : public testing::Test {
  public:
-  DomStorageAreaTest()
+  DOMStorageAreaTest()
     : kOrigin(GURL("http://dom_storage/")),
       kKey(ASCIIToUTF16("key")),
       kValue(ASCIIToUTF16("value")),
@@ -38,7 +38,7 @@
   const base::string16 kValue2;
 
   // Method used in the CommitTasks test case.
-  void InjectedCommitSequencingTask(DomStorageArea* area) {
+  void InjectedCommitSequencingTask(DOMStorageArea* area) {
     // At this point the OnCommitTimer has run.
     // Verify that it put a commit in flight.
     EXPECT_EQ(1, area->commit_batches_in_flight_);
@@ -54,13 +54,13 @@
   }
 
   // Class used in the CommitChangesAtShutdown test case.
-  class VerifyChangesCommittedDatabase : public DomStorageDatabase {
+  class VerifyChangesCommittedDatabase : public DOMStorageDatabase {
    public:
     VerifyChangesCommittedDatabase() {}
     virtual ~VerifyChangesCommittedDatabase() {
       const base::string16 kKey(ASCIIToUTF16("key"));
       const base::string16 kValue(ASCIIToUTF16("value"));
-      ValuesMap values;
+      DOMStorageValuesMap values;
       ReadAllValues(&values);
       EXPECT_EQ(1u, values.size());
       EXPECT_EQ(kValue, values[kKey].string());
@@ -71,14 +71,14 @@
   base::MessageLoop message_loop_;
 };
 
-TEST_F(DomStorageAreaTest, DomStorageAreaBasics) {
-  scoped_refptr<DomStorageArea> area(
-      new DomStorageArea(1, std::string(), kOrigin, NULL, NULL));
+TEST_F(DOMStorageAreaTest, DOMStorageAreaBasics) {
+  scoped_refptr<DOMStorageArea> area(
+      new DOMStorageArea(1, std::string(), kOrigin, NULL, NULL));
   base::string16 old_value;
   base::NullableString16 old_nullable_value;
-  scoped_refptr<DomStorageArea> copy;
+  scoped_refptr<DOMStorageArea> copy;
 
-  // We don't focus on the underlying DomStorageMap functionality
+  // We don't focus on the underlying DOMStorageMap functionality
   // since that's covered by seperate unit tests.
   EXPECT_EQ(kOrigin, area->origin());
   EXPECT_EQ(1, area->namespace_id());
@@ -122,17 +122,17 @@
   EXPECT_FALSE(area->Clear());
 }
 
-TEST_F(DomStorageAreaTest, BackingDatabaseOpened) {
+TEST_F(DOMStorageAreaTest, BackingDatabaseOpened) {
   const int64 kSessionStorageNamespaceId = kLocalStorageNamespaceId + 1;
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   const base::FilePath kExpectedOriginFilePath = temp_dir.path().Append(
-      DomStorageArea::DatabaseFileNameFromOrigin(kOrigin));
+      DOMStorageArea::DatabaseFileNameFromOrigin(kOrigin));
 
   // No directory, backing should be null.
   {
-    scoped_refptr<DomStorageArea> area(
-        new DomStorageArea(kOrigin, base::FilePath(), NULL));
+    scoped_refptr<DOMStorageArea> area(
+        new DOMStorageArea(kOrigin, base::FilePath(), NULL));
     EXPECT_EQ(NULL, area->backing_.get());
     EXPECT_TRUE(area->is_initial_import_done_);
     EXPECT_FALSE(base::PathExists(kExpectedOriginFilePath));
@@ -141,8 +141,8 @@
   // Valid directory and origin but no session storage backing. Backing should
   // be null.
   {
-    scoped_refptr<DomStorageArea> area(
-        new DomStorageArea(kSessionStorageNamespaceId, std::string(), kOrigin,
+    scoped_refptr<DOMStorageArea> area(
+        new DOMStorageArea(kSessionStorageNamespaceId, std::string(), kOrigin,
                            NULL, NULL));
     EXPECT_EQ(NULL, area->backing_.get());
     EXPECT_TRUE(area->is_initial_import_done_);
@@ -156,15 +156,15 @@
     EXPECT_FALSE(base::PathExists(kExpectedOriginFilePath));
   }
 
-  // This should set up a DomStorageArea that is correctly backed to disk.
+  // This should set up a DOMStorageArea that is correctly backed to disk.
   {
-    scoped_refptr<DomStorageArea> area(new DomStorageArea(
+    scoped_refptr<DOMStorageArea> area(new DOMStorageArea(
         kOrigin,
         temp_dir.path(),
-        new MockDomStorageTaskRunner(base::MessageLoopProxy::current().get())));
+        new MockDOMStorageTaskRunner(base::MessageLoopProxy::current().get())));
 
     EXPECT_TRUE(area->backing_.get());
-    DomStorageDatabase* database = static_cast<LocalStorageDatabaseAdapter*>(
+    DOMStorageDatabase* database = static_cast<LocalStorageDatabaseAdapter*>(
         area->backing_.get())->db_.get();
     EXPECT_FALSE(database->IsOpen());
     EXPECT_FALSE(area->is_initial_import_done_);
@@ -194,21 +194,21 @@
     EXPECT_EQ(kValue, area->GetItem(kKey).string());
 
     // Verify the content made it to the in memory database.
-    ValuesMap values;
+    DOMStorageValuesMap values;
     area->backing_->ReadAllValues(&values);
     EXPECT_EQ(1u, values.size());
     EXPECT_EQ(kValue, values[kKey].string());
   }
 }
 
-TEST_F(DomStorageAreaTest, CommitTasks) {
+TEST_F(DOMStorageAreaTest, CommitTasks) {
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
 
-  scoped_refptr<DomStorageArea> area(new DomStorageArea(
+  scoped_refptr<DOMStorageArea> area(new DOMStorageArea(
       kOrigin,
       temp_dir.path(),
-      new MockDomStorageTaskRunner(base::MessageLoopProxy::current().get())));
+      new MockDOMStorageTaskRunner(base::MessageLoopProxy::current().get())));
   // Inject an in-memory db to speed up the test.
   area->backing_.reset(new LocalStorageDatabaseAdapter());
 
@@ -218,7 +218,7 @@
   EXPECT_EQ(0u, area->Length());
   EXPECT_TRUE(area->is_initial_import_done_);
 
-  ValuesMap values;
+  DOMStorageValuesMap values;
   base::NullableString16 old_value;
 
   // See that changes are batched up.
@@ -266,7 +266,7 @@
   // we'll make an additional SetItem() call.
   base::MessageLoop::current()->PostTask(
       FROM_HERE,
-      base::Bind(&DomStorageAreaTest::InjectedCommitSequencingTask,
+      base::Bind(&DOMStorageAreaTest::InjectedCommitSequencingTask,
                  base::Unretained(this),
                  area));
   base::MessageLoop::current()->RunUntilIdle();
@@ -280,20 +280,20 @@
   EXPECT_EQ(kValue2, values[kKey2].string());
 }
 
-TEST_F(DomStorageAreaTest, CommitChangesAtShutdown) {
+TEST_F(DOMStorageAreaTest, CommitChangesAtShutdown) {
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  scoped_refptr<DomStorageArea> area(new DomStorageArea(
+  scoped_refptr<DOMStorageArea> area(new DOMStorageArea(
       kOrigin,
       temp_dir.path(),
-      new MockDomStorageTaskRunner(base::MessageLoopProxy::current().get())));
+      new MockDOMStorageTaskRunner(base::MessageLoopProxy::current().get())));
 
   // Inject an in-memory db to speed up the test and also to verify
   // the final changes are commited in it's dtor.
   static_cast<LocalStorageDatabaseAdapter*>(area->backing_.get())->db_.reset(
       new VerifyChangesCommittedDatabase());
 
-  ValuesMap values;
+  DOMStorageValuesMap values;
   base::NullableString16 old_value;
   EXPECT_TRUE(area->SetItem(kKey, kValue, &old_value));
   EXPECT_TRUE(area->HasUncommittedChanges());
@@ -307,19 +307,19 @@
   // were committed.
 }
 
-TEST_F(DomStorageAreaTest, DeleteOrigin) {
+TEST_F(DOMStorageAreaTest, DeleteOrigin) {
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  scoped_refptr<DomStorageArea> area(new DomStorageArea(
+  scoped_refptr<DOMStorageArea> area(new DOMStorageArea(
       kOrigin,
       temp_dir.path(),
-      new MockDomStorageTaskRunner(base::MessageLoopProxy::current().get())));
+      new MockDOMStorageTaskRunner(base::MessageLoopProxy::current().get())));
 
   // This test puts files on disk.
   base::FilePath db_file_path = static_cast<LocalStorageDatabaseAdapter*>(
       area->backing_.get())->db_->file_path();
   base::FilePath db_journal_file_path =
-      DomStorageDatabase::GetJournalFilePath(db_file_path);
+      DOMStorageDatabase::GetJournalFilePath(db_file_path);
 
   // Nothing bad should happen when invoked w/o any files on disk.
   area->DeleteOrigin();
@@ -368,28 +368,28 @@
   EXPECT_FALSE(base::PathExists(db_file_path));
 }
 
-TEST_F(DomStorageAreaTest, PurgeMemory) {
+TEST_F(DOMStorageAreaTest, PurgeMemory) {
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  scoped_refptr<DomStorageArea> area(new DomStorageArea(
+  scoped_refptr<DOMStorageArea> area(new DOMStorageArea(
       kOrigin,
       temp_dir.path(),
-      new MockDomStorageTaskRunner(base::MessageLoopProxy::current().get())));
+      new MockDOMStorageTaskRunner(base::MessageLoopProxy::current().get())));
 
   // Inject an in-memory db to speed up the test.
   area->backing_.reset(new LocalStorageDatabaseAdapter());
 
   // Unowned ptrs we use to verify that 'purge' has happened.
-  DomStorageDatabase* original_backing =
+  DOMStorageDatabase* original_backing =
       static_cast<LocalStorageDatabaseAdapter*>(
           area->backing_.get())->db_.get();
-  DomStorageMap* original_map = area->map_.get();
+  DOMStorageMap* original_map = area->map_.get();
 
   // Should do no harm when called on a newly constructed object.
   EXPECT_FALSE(area->is_initial_import_done_);
   area->PurgeMemory();
   EXPECT_FALSE(area->is_initial_import_done_);
-  DomStorageDatabase* new_backing = static_cast<LocalStorageDatabaseAdapter*>(
+  DOMStorageDatabase* new_backing = static_cast<LocalStorageDatabaseAdapter*>(
       area->backing_.get())->db_.get();
   EXPECT_EQ(original_backing, new_backing);
   EXPECT_EQ(original_map, area->map_.get());
@@ -425,7 +425,7 @@
   EXPECT_NE(original_map, area->map_.get());
 }
 
-TEST_F(DomStorageAreaTest, DatabaseFileNames) {
+TEST_F(DOMStorageAreaTest, DatabaseFileNames) {
   struct {
     const char* origin;
     const char* file_name;
@@ -444,30 +444,31 @@
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kCases); ++i) {
     GURL origin = GURL(kCases[i].origin).GetOrigin();
-    base::FilePath file_name = base::FilePath().AppendASCII(kCases[i].file_name);
+    base::FilePath file_name =
+        base::FilePath().AppendASCII(kCases[i].file_name);
     base::FilePath journal_file_name =
         base::FilePath().AppendASCII(kCases[i].journal_file_name);
 
     EXPECT_EQ(file_name,
-              DomStorageArea::DatabaseFileNameFromOrigin(origin));
+              DOMStorageArea::DatabaseFileNameFromOrigin(origin));
     EXPECT_EQ(origin,
-              DomStorageArea::OriginFromDatabaseFileName(file_name));
+              DOMStorageArea::OriginFromDatabaseFileName(file_name));
     EXPECT_EQ(journal_file_name,
-              DomStorageDatabase::GetJournalFilePath(file_name));
+              DOMStorageDatabase::GetJournalFilePath(file_name));
   }
 
-  // Also test some DomStorageDatabase::GetJournalFilePath cases here.
+  // Also test some DOMStorageDatabase::GetJournalFilePath cases here.
   base::FilePath parent = base::FilePath().AppendASCII("a").AppendASCII("b");
   EXPECT_EQ(
       parent.AppendASCII("file-journal"),
-      DomStorageDatabase::GetJournalFilePath(parent.AppendASCII("file")));
+      DOMStorageDatabase::GetJournalFilePath(parent.AppendASCII("file")));
   EXPECT_EQ(
       base::FilePath().AppendASCII("-journal"),
-      DomStorageDatabase::GetJournalFilePath(base::FilePath()));
+      DOMStorageDatabase::GetJournalFilePath(base::FilePath()));
   EXPECT_EQ(
       base::FilePath().AppendASCII(".extensiononly-journal"),
-      DomStorageDatabase::GetJournalFilePath(
+      DOMStorageDatabase::GetJournalFilePath(
           base::FilePath().AppendASCII(".extensiononly")));
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/content/browser/dom_storage/dom_storage_browsertest.cc b/content/browser/dom_storage/dom_storage_browsertest.cc
index d160dac..54da50a 100644
--- a/content/browser/dom_storage/dom_storage_browsertest.cc
+++ b/content/browser/dom_storage/dom_storage_browsertest.cc
@@ -4,21 +4,21 @@
 
 #include "base/path_service.h"
 #include "content/browser/web_contents/web_contents_impl.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "content/public/common/content_paths.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/shell/shell.h"
 #include "content/test/content_browser_test.h"
 #include "content/test/content_browser_test_utils.h"
 #include "net/base/net_util.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
 namespace content {
 
-// This browser test is aimed towards exercising the DomStorage system
+// This browser test is aimed towards exercising the DOMStorage system
 // from end-to-end.
-class DomStorageBrowserTest : public ContentBrowserTest {
+class DOMStorageBrowserTest : public ContentBrowserTest {
  public:
-  DomStorageBrowserTest() {}
+  DOMStorageBrowserTest() {}
 
   void SimpleTest(const GURL& test_url, bool incognito) {
     // The test page will perform tests then navigate to either
@@ -40,11 +40,11 @@
 static const bool kIncognito = true;
 static const bool kNotIncognito = false;
 
-IN_PROC_BROWSER_TEST_F(DomStorageBrowserTest, SanityCheck) {
+IN_PROC_BROWSER_TEST_F(DOMStorageBrowserTest, SanityCheck) {
   SimpleTest(GetTestUrl("dom_storage", "sanity_check.html"), kNotIncognito);
 }
 
-IN_PROC_BROWSER_TEST_F(DomStorageBrowserTest, SanityCheckIncognito) {
+IN_PROC_BROWSER_TEST_F(DOMStorageBrowserTest, SanityCheckIncognito) {
   SimpleTest(GetTestUrl("dom_storage", "sanity_check.html"), kIncognito);
 }
 
diff --git a/content/browser/dom_storage/dom_storage_context_impl.cc b/content/browser/dom_storage/dom_storage_context_impl.cc
index f790ecd..dd1f33e 100644
--- a/content/browser/dom_storage/dom_storage_context_impl.cc
+++ b/content/browser/dom_storage/dom_storage_context_impl.cc
@@ -6,171 +6,417 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
-#include "base/files/file_path.h"
-#include "base/message_loop/message_loop_proxy.h"
-#include "content/browser/dom_storage/session_storage_namespace_impl.h"
-#include "content/public/browser/browser_thread.h"
-#include "webkit/browser/dom_storage/dom_storage_area.h"
-#include "webkit/browser/dom_storage/dom_storage_context.h"
-#include "webkit/browser/dom_storage/dom_storage_task_runner.h"
-
-using dom_storage::DomStorageArea;
-using dom_storage::DomStorageContext;
-using dom_storage::DomStorageTaskRunner;
-using dom_storage::DomStorageWorkerPoolTaskRunner;
+#include "base/file_util.h"
+#include "base/files/file_enumerator.h"
+#include "base/guid.h"
+#include "base/location.h"
+#include "base/time/time.h"
+#include "content/browser/dom_storage/dom_storage_area.h"
+#include "content/browser/dom_storage/dom_storage_database.h"
+#include "content/browser/dom_storage/dom_storage_namespace.h"
+#include "content/browser/dom_storage/dom_storage_task_runner.h"
+#include "content/browser/dom_storage/session_storage_database.h"
+#include "content/common/dom_storage/dom_storage_types.h"
+#include "content/public/browser/dom_storage_context.h"
+#include "content/public/browser/local_storage_usage_info.h"
+#include "content/public/browser/session_storage_usage_info.h"
+#include "webkit/browser/quota/special_storage_policy.h"
 
 namespace content {
-namespace {
 
-const char kLocalStorageDirectory[] = "Local Storage";
-const char kSessionStorageDirectory[] = "Session Storage";
-
-void InvokeLocalStorageUsageCallbackHelper(
-      const DOMStorageContext::GetLocalStorageUsageCallback& callback,
-      const std::vector<dom_storage::LocalStorageUsageInfo>* infos) {
-  callback.Run(*infos);
-}
-
-void GetLocalStorageUsageHelper(
-    base::MessageLoopProxy* reply_loop,
-    DomStorageContext* context,
-    const DOMStorageContext::GetLocalStorageUsageCallback& callback) {
-  std::vector<dom_storage::LocalStorageUsageInfo>* infos =
-      new std::vector<dom_storage::LocalStorageUsageInfo>;
-  context->GetLocalStorageUsage(infos, true);
-  reply_loop->PostTask(
-      FROM_HERE,
-      base::Bind(&InvokeLocalStorageUsageCallbackHelper,
-                 callback, base::Owned(infos)));
-}
-
-void InvokeSessionStorageUsageCallbackHelper(
-      const DOMStorageContext::GetSessionStorageUsageCallback& callback,
-      const std::vector<dom_storage::SessionStorageUsageInfo>* infos) {
-  callback.Run(*infos);
-}
-
-void GetSessionStorageUsageHelper(
-    base::MessageLoopProxy* reply_loop,
-    DomStorageContext* context,
-    const DOMStorageContext::GetSessionStorageUsageCallback& callback) {
-  std::vector<dom_storage::SessionStorageUsageInfo>* infos =
-      new std::vector<dom_storage::SessionStorageUsageInfo>;
-  context->GetSessionStorageUsage(infos);
-  reply_loop->PostTask(
-      FROM_HERE,
-      base::Bind(&InvokeSessionStorageUsageCallbackHelper,
-                 callback, base::Owned(infos)));
-}
-
-}  // namespace
+static const int kSessionStoraceScavengingSeconds = 60;
 
 DOMStorageContextImpl::DOMStorageContextImpl(
-    const base::FilePath& data_path,
-    quota::SpecialStoragePolicy* special_storage_policy) {
-  base::SequencedWorkerPool* worker_pool = BrowserThread::GetBlockingPool();
-  context_ = new dom_storage::DomStorageContext(
-      data_path.empty() ? data_path
-                        : data_path.AppendASCII(kLocalStorageDirectory),
-      data_path.empty() ? data_path
-                        : data_path.AppendASCII(kSessionStorageDirectory),
-      special_storage_policy,
-      new DomStorageWorkerPoolTaskRunner(
-          worker_pool,
-          worker_pool->GetNamedSequenceToken("dom_storage_primary"),
-          worker_pool->GetNamedSequenceToken("dom_storage_commit"),
-          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)
-              .get()));
+    const base::FilePath& localstorage_directory,
+    const base::FilePath& sessionstorage_directory,
+    quota::SpecialStoragePolicy* special_storage_policy,
+    DOMStorageTaskRunner* task_runner)
+    : localstorage_directory_(localstorage_directory),
+      sessionstorage_directory_(sessionstorage_directory),
+      task_runner_(task_runner),
+      is_shutdown_(false),
+      force_keep_session_state_(false),
+      special_storage_policy_(special_storage_policy),
+      scavenging_started_(false) {
+  // AtomicSequenceNum starts at 0 but we want to start session
+  // namespace ids at one since zero is reserved for the
+  // kLocalStorageNamespaceId.
+  session_id_sequence_.GetNext();
 }
 
 DOMStorageContextImpl::~DOMStorageContextImpl() {
+  if (session_storage_database_.get()) {
+    // SessionStorageDatabase shouldn't be deleted right away: deleting it will
+    // potentially involve waiting in leveldb::DBImpl::~DBImpl, and waiting
+    // shouldn't happen on this thread.
+    SessionStorageDatabase* to_release = session_storage_database_.get();
+    to_release->AddRef();
+    session_storage_database_ = NULL;
+    task_runner_->PostShutdownBlockingTask(
+        FROM_HERE,
+        DOMStorageTaskRunner::COMMIT_SEQUENCE,
+        base::Bind(&SessionStorageDatabase::Release,
+                   base::Unretained(to_release)));
+  }
+}
+
+DOMStorageNamespace* DOMStorageContextImpl::GetStorageNamespace(
+    int64 namespace_id) {
+  if (is_shutdown_)
+    return NULL;
+  StorageNamespaceMap::iterator found = namespaces_.find(namespace_id);
+  if (found == namespaces_.end()) {
+    if (namespace_id == kLocalStorageNamespaceId) {
+      if (!localstorage_directory_.empty()) {
+        if (!file_util::CreateDirectory(localstorage_directory_)) {
+          LOG(ERROR) << "Failed to create 'Local Storage' directory,"
+                        " falling back to in-memory only.";
+          localstorage_directory_ = base::FilePath();
+        }
+      }
+      DOMStorageNamespace* local =
+          new DOMStorageNamespace(localstorage_directory_, task_runner_.get());
+      namespaces_[kLocalStorageNamespaceId] = local;
+      return local;
+    }
+    return NULL;
+  }
+  return found->second.get();
 }
 
 void DOMStorageContextImpl::GetLocalStorageUsage(
-    const GetLocalStorageUsageCallback& callback) {
-  DCHECK(context_.get());
-  context_->task_runner()
-      ->PostShutdownBlockingTask(FROM_HERE,
-                                 DomStorageTaskRunner::PRIMARY_SEQUENCE,
-                                 base::Bind(&GetLocalStorageUsageHelper,
-                                            base::MessageLoopProxy::current(),
-                                            context_,
-                                            callback));
+    std::vector<LocalStorageUsageInfo>* infos,
+    bool include_file_info) {
+  if (localstorage_directory_.empty())
+    return;
+  base::FileEnumerator enumerator(localstorage_directory_, false,
+                                  base::FileEnumerator::FILES);
+  for (base::FilePath path = enumerator.Next(); !path.empty();
+       path = enumerator.Next()) {
+    if (path.MatchesExtension(DOMStorageArea::kDatabaseFileExtension)) {
+      LocalStorageUsageInfo info;
+      info.origin = DOMStorageArea::OriginFromDatabaseFileName(path);
+      if (include_file_info) {
+        base::FileEnumerator::FileInfo find_info = enumerator.GetInfo();
+        info.data_size = find_info.GetSize();
+        info.last_modified = find_info.GetLastModifiedTime();
+      }
+      infos->push_back(info);
+    }
+  }
 }
 
 void DOMStorageContextImpl::GetSessionStorageUsage(
-    const GetSessionStorageUsageCallback& callback) {
-  DCHECK(context_.get());
-  context_->task_runner()
-      ->PostShutdownBlockingTask(FROM_HERE,
-                                 DomStorageTaskRunner::PRIMARY_SEQUENCE,
-                                 base::Bind(&GetSessionStorageUsageHelper,
-                                            base::MessageLoopProxy::current(),
-                                            context_,
-                                            callback));
+    std::vector<SessionStorageUsageInfo>* infos) {
+  if (!session_storage_database_.get())
+    return;
+  std::map<std::string, std::vector<GURL> > namespaces_and_origins;
+  session_storage_database_->ReadNamespacesAndOrigins(
+      &namespaces_and_origins);
+  for (std::map<std::string, std::vector<GURL> >::const_iterator it =
+           namespaces_and_origins.begin();
+       it != namespaces_and_origins.end(); ++it) {
+    for (std::vector<GURL>::const_iterator origin_it = it->second.begin();
+         origin_it != it->second.end(); ++origin_it) {
+      SessionStorageUsageInfo info;
+      info.persistent_namespace_id = it->first;
+      info.origin = *origin_it;
+      infos->push_back(info);
+    }
+  }
 }
 
 void DOMStorageContextImpl::DeleteLocalStorage(const GURL& origin) {
-  DCHECK(context_.get());
-  context_->task_runner()->PostShutdownBlockingTask(
-      FROM_HERE,
-      DomStorageTaskRunner::PRIMARY_SEQUENCE,
-      base::Bind(&DomStorageContext::DeleteLocalStorage, context_, origin));
+  DCHECK(!is_shutdown_);
+  DOMStorageNamespace* local = GetStorageNamespace(kLocalStorageNamespaceId);
+  local->DeleteLocalStorageOrigin(origin);
+  // Synthesize a 'cleared' event if the area is open so CachedAreas in
+  // renderers get emptied out too.
+  DOMStorageArea* area = local->GetOpenStorageArea(origin);
+  if (area)
+    NotifyAreaCleared(area, origin);
 }
 
 void DOMStorageContextImpl::DeleteSessionStorage(
-    const dom_storage::SessionStorageUsageInfo& usage_info) {
-  DCHECK(context_.get());
-  context_->task_runner()->PostShutdownBlockingTask(
-      FROM_HERE,
-      DomStorageTaskRunner::PRIMARY_SEQUENCE,
-      base::Bind(
-          &DomStorageContext::DeleteSessionStorage, context_, usage_info));
-}
-
-void DOMStorageContextImpl::SetSaveSessionStorageOnDisk() {
-  DCHECK(context_.get());
-  context_->SetSaveSessionStorageOnDisk();
-}
-
-scoped_refptr<SessionStorageNamespace>
-DOMStorageContextImpl::RecreateSessionStorage(
-    const std::string& persistent_id) {
-  return scoped_refptr<SessionStorageNamespace>(
-      new SessionStorageNamespaceImpl(this, persistent_id));
-}
-
-void DOMStorageContextImpl::StartScavengingUnusedSessionStorage() {
-  DCHECK(context_.get());
-  context_->task_runner()->PostShutdownBlockingTask(
-      FROM_HERE,
-      DomStorageTaskRunner::PRIMARY_SEQUENCE,
-      base::Bind(&DomStorageContext::StartScavengingUnusedSessionStorage,
-                 context_));
+    const SessionStorageUsageInfo& usage_info) {
+  DCHECK(!is_shutdown_);
+  DOMStorageNamespace* dom_storage_namespace = NULL;
+  std::map<std::string, int64>::const_iterator it =
+      persistent_namespace_id_to_namespace_id_.find(
+          usage_info.persistent_namespace_id);
+  if (it != persistent_namespace_id_to_namespace_id_.end()) {
+    dom_storage_namespace = GetStorageNamespace(it->second);
+  } else {
+    int64 namespace_id = AllocateSessionId();
+    CreateSessionNamespace(namespace_id, usage_info.persistent_namespace_id);
+    dom_storage_namespace = GetStorageNamespace(namespace_id);
+  }
+  dom_storage_namespace->DeleteSessionStorageOrigin(usage_info.origin);
+  // Synthesize a 'cleared' event if the area is open so CachedAreas in
+  // renderers get emptied out too.
+  DOMStorageArea* area =
+      dom_storage_namespace->GetOpenStorageArea(usage_info.origin);
+  if (area)
+    NotifyAreaCleared(area, usage_info.origin);
 }
 
 void DOMStorageContextImpl::PurgeMemory() {
-  DCHECK(context_.get());
-  context_->task_runner()->PostShutdownBlockingTask(
-      FROM_HERE,
-      DomStorageTaskRunner::PRIMARY_SEQUENCE,
-      base::Bind(&DomStorageContext::PurgeMemory, context_));
-}
-
-void DOMStorageContextImpl::SetForceKeepSessionState() {
-  DCHECK(context_.get());
-  context_->task_runner()->PostShutdownBlockingTask(
-      FROM_HERE,
-      DomStorageTaskRunner::PRIMARY_SEQUENCE,
-      base::Bind(&DomStorageContext::SetForceKeepSessionState, context_));
+  // We can only purge memory from the local storage namespace
+  // which is backed by disk.
+  // TODO(marja): Purge sessionStorage, too. (Requires changes to the FastClear
+  // functionality.)
+  StorageNamespaceMap::iterator found =
+      namespaces_.find(kLocalStorageNamespaceId);
+  if (found != namespaces_.end())
+    found->second->PurgeMemory(DOMStorageNamespace::PURGE_AGGRESSIVE);
 }
 
 void DOMStorageContextImpl::Shutdown() {
-  DCHECK(context_.get());
-  context_->task_runner()->PostShutdownBlockingTask(
-      FROM_HERE,
-      DomStorageTaskRunner::PRIMARY_SEQUENCE,
-      base::Bind(&DomStorageContext::Shutdown, context_));
+  is_shutdown_ = true;
+  StorageNamespaceMap::const_iterator it = namespaces_.begin();
+  for (; it != namespaces_.end(); ++it)
+    it->second->Shutdown();
+
+  if (localstorage_directory_.empty() && !session_storage_database_.get())
+    return;
+
+  // Respect the content policy settings about what to
+  // keep and what to discard.
+  if (force_keep_session_state_)
+    return;  // Keep everything.
+
+  bool has_session_only_origins =
+      special_storage_policy_.get() &&
+      special_storage_policy_->HasSessionOnlyOrigins();
+
+  if (has_session_only_origins) {
+    // We may have to delete something. We continue on the
+    // commit sequence after area shutdown tasks have cycled
+    // thru that sequence (and closed their database files).
+    bool success = task_runner_->PostShutdownBlockingTask(
+        FROM_HERE,
+        DOMStorageTaskRunner::COMMIT_SEQUENCE,
+        base::Bind(&DOMStorageContextImpl::ClearSessionOnlyOrigins, this));
+    DCHECK(success);
+  }
+}
+
+void DOMStorageContextImpl::AddEventObserver(EventObserver* observer) {
+  event_observers_.AddObserver(observer);
+}
+
+void DOMStorageContextImpl::RemoveEventObserver(EventObserver* observer) {
+  event_observers_.RemoveObserver(observer);
+}
+
+void DOMStorageContextImpl::NotifyItemSet(
+    const DOMStorageArea* area,
+    const base::string16& key,
+    const base::string16& new_value,
+    const base::NullableString16& old_value,
+    const GURL& page_url) {
+  FOR_EACH_OBSERVER(
+      EventObserver, event_observers_,
+      OnDOMStorageItemSet(area, key, new_value, old_value, page_url));
+}
+
+void DOMStorageContextImpl::NotifyItemRemoved(
+    const DOMStorageArea* area,
+    const base::string16& key,
+    const base::string16& old_value,
+    const GURL& page_url) {
+  FOR_EACH_OBSERVER(
+      EventObserver, event_observers_,
+      OnDOMStorageItemRemoved(area, key, old_value, page_url));
+}
+
+void DOMStorageContextImpl::NotifyAreaCleared(
+    const DOMStorageArea* area,
+    const GURL& page_url) {
+  FOR_EACH_OBSERVER(
+      EventObserver, event_observers_,
+      OnDOMStorageAreaCleared(area, page_url));
+}
+
+std::string DOMStorageContextImpl::AllocatePersistentSessionId() {
+  std::string guid = base::GenerateGUID();
+  std::replace(guid.begin(), guid.end(), '-', '_');
+  return guid;
+}
+
+void DOMStorageContextImpl::CreateSessionNamespace(
+    int64 namespace_id,
+    const std::string& persistent_namespace_id) {
+  if (is_shutdown_)
+    return;
+  DCHECK(namespace_id != kLocalStorageNamespaceId);
+  DCHECK(namespaces_.find(namespace_id) == namespaces_.end());
+  namespaces_[namespace_id] = new DOMStorageNamespace(
+      namespace_id, persistent_namespace_id, session_storage_database_.get(),
+      task_runner_.get());
+  persistent_namespace_id_to_namespace_id_[persistent_namespace_id] =
+      namespace_id;
+}
+
+void DOMStorageContextImpl::DeleteSessionNamespace(
+    int64 namespace_id, bool should_persist_data) {
+  DCHECK_NE(kLocalStorageNamespaceId, namespace_id);
+  StorageNamespaceMap::const_iterator it = namespaces_.find(namespace_id);
+  if (it == namespaces_.end())
+    return;
+  std::string persistent_namespace_id = it->second->persistent_namespace_id();
+  if (session_storage_database_.get()) {
+    if (!should_persist_data) {
+      task_runner_->PostShutdownBlockingTask(
+          FROM_HERE,
+          DOMStorageTaskRunner::COMMIT_SEQUENCE,
+          base::Bind(
+              base::IgnoreResult(&SessionStorageDatabase::DeleteNamespace),
+              session_storage_database_,
+              persistent_namespace_id));
+    } else {
+      // Ensure that the data gets committed before we shut down.
+      it->second->Shutdown();
+      if (!scavenging_started_) {
+        // Protect the persistent namespace ID from scavenging.
+        protected_persistent_session_ids_.insert(persistent_namespace_id);
+      }
+    }
+  }
+  persistent_namespace_id_to_namespace_id_.erase(persistent_namespace_id);
+  namespaces_.erase(namespace_id);
+}
+
+void DOMStorageContextImpl::CloneSessionNamespace(
+    int64 existing_id, int64 new_id,
+    const std::string& new_persistent_id) {
+  if (is_shutdown_)
+    return;
+  DCHECK_NE(kLocalStorageNamespaceId, existing_id);
+  DCHECK_NE(kLocalStorageNamespaceId, new_id);
+  StorageNamespaceMap::iterator found = namespaces_.find(existing_id);
+  if (found != namespaces_.end())
+    namespaces_[new_id] = found->second->Clone(new_id, new_persistent_id);
+  else
+    CreateSessionNamespace(new_id, new_persistent_id);
+}
+
+void DOMStorageContextImpl::ClearSessionOnlyOrigins() {
+  if (!localstorage_directory_.empty()) {
+    std::vector<LocalStorageUsageInfo> infos;
+    const bool kDontIncludeFileInfo = false;
+    GetLocalStorageUsage(&infos, kDontIncludeFileInfo);
+    for (size_t i = 0; i < infos.size(); ++i) {
+      const GURL& origin = infos[i].origin;
+      if (special_storage_policy_->IsStorageProtected(origin))
+        continue;
+      if (!special_storage_policy_->IsStorageSessionOnly(origin))
+        continue;
+
+      base::FilePath database_file_path = localstorage_directory_.Append(
+          DOMStorageArea::DatabaseFileNameFromOrigin(origin));
+      sql::Connection::Delete(database_file_path);
+    }
+  }
+  if (session_storage_database_.get()) {
+    std::vector<SessionStorageUsageInfo> infos;
+    GetSessionStorageUsage(&infos);
+    for (size_t i = 0; i < infos.size(); ++i) {
+      const GURL& origin = infos[i].origin;
+      if (special_storage_policy_->IsStorageProtected(origin))
+        continue;
+      if (!special_storage_policy_->IsStorageSessionOnly(origin))
+        continue;
+      session_storage_database_->DeleteArea(infos[i].persistent_namespace_id,
+                                            origin);
+    }
+  }
+}
+
+void DOMStorageContextImpl::SetSaveSessionStorageOnDisk() {
+  DCHECK(namespaces_.empty());
+  if (!sessionstorage_directory_.empty()) {
+    session_storage_database_ = new SessionStorageDatabase(
+        sessionstorage_directory_);
+  }
+}
+
+void DOMStorageContextImpl::StartScavengingUnusedSessionStorage() {
+  if (session_storage_database_.get()) {
+    task_runner_->PostDelayedTask(
+        FROM_HERE, base::Bind(&DOMStorageContextImpl::FindUnusedNamespaces,
+                              this),
+        base::TimeDelta::FromSeconds(kSessionStoraceScavengingSeconds));
+  }
+}
+
+void DOMStorageContextImpl::FindUnusedNamespaces() {
+  DCHECK(session_storage_database_.get());
+  if (scavenging_started_)
+    return;
+  scavenging_started_ = true;
+  std::set<std::string> namespace_ids_in_use;
+  for (StorageNamespaceMap::const_iterator it = namespaces_.begin();
+       it != namespaces_.end(); ++it)
+    namespace_ids_in_use.insert(it->second->persistent_namespace_id());
+  std::set<std::string> protected_persistent_session_ids;
+  protected_persistent_session_ids.swap(protected_persistent_session_ids_);
+  task_runner_->PostShutdownBlockingTask(
+      FROM_HERE, DOMStorageTaskRunner::COMMIT_SEQUENCE,
+      base::Bind(
+          &DOMStorageContextImpl::FindUnusedNamespacesInCommitSequence,
+          this, namespace_ids_in_use, protected_persistent_session_ids));
+}
+
+void DOMStorageContextImpl::FindUnusedNamespacesInCommitSequence(
+    const std::set<std::string>& namespace_ids_in_use,
+    const std::set<std::string>& protected_persistent_session_ids) {
+  DCHECK(session_storage_database_.get());
+  // Delete all namespaces which don't have an associated DOMStorageNamespace
+  // alive.
+  std::map<std::string, std::vector<GURL> > namespaces_and_origins;
+  session_storage_database_->ReadNamespacesAndOrigins(&namespaces_and_origins);
+  for (std::map<std::string, std::vector<GURL> >::const_iterator it =
+           namespaces_and_origins.begin();
+       it != namespaces_and_origins.end(); ++it) {
+    if (namespace_ids_in_use.find(it->first) == namespace_ids_in_use.end() &&
+        protected_persistent_session_ids.find(it->first) ==
+        protected_persistent_session_ids.end()) {
+      deletable_persistent_namespace_ids_.push_back(it->first);
+    }
+  }
+  if (!deletable_persistent_namespace_ids_.empty()) {
+    task_runner_->PostDelayedTask(
+        FROM_HERE, base::Bind(
+            &DOMStorageContextImpl::DeleteNextUnusedNamespace,
+            this),
+        base::TimeDelta::FromSeconds(kSessionStoraceScavengingSeconds));
+  }
+}
+
+void DOMStorageContextImpl::DeleteNextUnusedNamespace() {
+  if (is_shutdown_)
+    return;
+  task_runner_->PostShutdownBlockingTask(
+        FROM_HERE, DOMStorageTaskRunner::COMMIT_SEQUENCE,
+        base::Bind(
+            &DOMStorageContextImpl::DeleteNextUnusedNamespaceInCommitSequence,
+            this));
+}
+
+void DOMStorageContextImpl::DeleteNextUnusedNamespaceInCommitSequence() {
+  if (deletable_persistent_namespace_ids_.empty())
+    return;
+  const std::string& persistent_id = deletable_persistent_namespace_ids_.back();
+  session_storage_database_->DeleteNamespace(persistent_id);
+  deletable_persistent_namespace_ids_.pop_back();
+  if (!deletable_persistent_namespace_ids_.empty()) {
+    task_runner_->PostDelayedTask(
+        FROM_HERE, base::Bind(
+            &DOMStorageContextImpl::DeleteNextUnusedNamespace,
+            this),
+        base::TimeDelta::FromSeconds(kSessionStoraceScavengingSeconds));
+  }
 }
 
 }  // namespace content
diff --git a/content/browser/dom_storage/dom_storage_context_impl.h b/content/browser/dom_storage/dom_storage_context_impl.h
index a418ea3..8f55656 100644
--- a/content/browser/dom_storage/dom_storage_context_impl.h
+++ b/content/browser/dom_storage/dom_storage_context_impl.h
@@ -5,15 +5,24 @@
 #ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_CONTEXT_IMPL_H_
 #define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_CONTEXT_IMPL_H_
 
+#include <map>
+#include <set>
+#include <vector>
+
+#include "base/atomic_sequence_num.h"
+#include "base/basictypes.h"
+#include "base/files/file_path.h"
+#include "base/gtest_prod_util.h"
 #include "base/memory/ref_counted.h"
-#include "content/public/browser/dom_storage_context.h"
+#include "base/observer_list.h"
+#include "base/time/time.h"
+#include "content/common/content_export.h"
+#include "url/gurl.h"
 
 namespace base {
 class FilePath;
-}
-
-namespace dom_storage {
-class DomStorageContext;
+class NullableString16;
+class Time;
 }
 
 namespace quota {
@@ -22,52 +31,202 @@
 
 namespace content {
 
-// This is owned by BrowserContext (aka Profile) and encapsulates all
-// per-profile dom storage state.
-class CONTENT_EXPORT DOMStorageContextImpl :
-    NON_EXPORTED_BASE(public DOMStorageContext),
-    public base::RefCountedThreadSafe<DOMStorageContextImpl> {
+class DOMStorageArea;
+class DOMStorageNamespace;
+class DOMStorageSession;
+class DOMStorageTaskRunner;
+class SessionStorageDatabase;
+struct LocalStorageUsageInfo;
+struct SessionStorageUsageInfo;
+
+// The Context is the root of an object containment hierachy for
+// Namespaces and Areas related to the owning profile.
+// One instance is allocated in the main process for each profile,
+// instance methods should be called serially in the background as
+// determined by the task_runner. Specifcally not on chrome's non-blocking
+// IO thread since these methods can result in blocking file io.
+//
+// In general terms, the DOMStorage object relationships are...
+//   Contexts (per-profile) own Namespaces which own Areas which share Maps.
+//   Hosts(per-renderer) refer to Namespaces and Areas open in its renderer.
+//   Sessions (per-tab) cause the creation and deletion of session Namespaces.
+//
+// Session Namespaces are cloned by initially making a shallow copy of
+// all contained Areas, the shallow copies refer to the same refcounted Map,
+// and does a deep copy-on-write if needed.
+//
+// Classes intended to be used by an embedder are DOMStorageContextImpl,
+// DOMStorageHost, and DOMStorageSession. The other classes are for
+// internal consumption.
+class CONTENT_EXPORT DOMStorageContextImpl
+    : public base::RefCountedThreadSafe<DOMStorageContextImpl> {
  public:
-  // If |data_path| is empty, nothing will be saved to disk.
-  DOMStorageContextImpl(const base::FilePath& data_path,
-                        quota::SpecialStoragePolicy* special_storage_policy);
+  // An interface for observing Local and Session Storage events on the
+  // background thread.
+  class EventObserver {
+   public:
+    // |old_value| may be null on initial insert.
+    virtual void OnDOMStorageItemSet(
+        const DOMStorageArea* area,
+        const base::string16& key,
+        const base::string16& new_value,
+        const base::NullableString16& old_value,
+        const GURL& page_url) = 0;
+    virtual void OnDOMStorageItemRemoved(
+        const DOMStorageArea* area,
+        const base::string16& key,
+        const base::string16& old_value,
+        const GURL& page_url) = 0;
+    virtual void OnDOMStorageAreaCleared(
+        const DOMStorageArea* area,
+        const GURL& page_url) = 0;
 
-  // DOMStorageContext implementation.
-  virtual void GetLocalStorageUsage(
-      const GetLocalStorageUsageCallback& callback) OVERRIDE;
-  virtual void GetSessionStorageUsage(
-      const GetSessionStorageUsageCallback& callback) OVERRIDE;
-  virtual void DeleteLocalStorage(const GURL& origin) OVERRIDE;
-  virtual void DeleteSessionStorage(
-      const dom_storage::SessionStorageUsageInfo& usage_info) OVERRIDE;
-  virtual void SetSaveSessionStorageOnDisk() OVERRIDE;
-  virtual scoped_refptr<SessionStorageNamespace>
-      RecreateSessionStorage(const std::string& persistent_id) OVERRIDE;
-  virtual void StartScavengingUnusedSessionStorage() OVERRIDE;
+   protected:
+    virtual ~EventObserver() {}
+  };
 
-  // Called to free up memory that's not strictly needed.
+  // |localstorage_directory| and |sessionstorage_directory| may be empty
+  // for incognito browser contexts.
+  DOMStorageContextImpl(
+      const base::FilePath& localstorage_directory,
+      const base::FilePath& sessionstorage_directory,
+      quota::SpecialStoragePolicy* special_storage_policy,
+      DOMStorageTaskRunner* task_runner);
+
+  // Returns the directory path for localStorage, or an empty directory, if
+  // there is no backing on disk.
+  const base::FilePath& localstorage_directory() {
+    return localstorage_directory_;
+  }
+
+  // Returns the directory path for sessionStorage, or an empty directory, if
+  // there is no backing on disk.
+  const base::FilePath& sessionstorage_directory() {
+    return sessionstorage_directory_;
+  }
+
+  DOMStorageTaskRunner* task_runner() const { return task_runner_.get(); }
+  DOMStorageNamespace* GetStorageNamespace(int64 namespace_id);
+
+  void GetLocalStorageUsage(std::vector<LocalStorageUsageInfo>* infos,
+                            bool include_file_info);
+  void GetSessionStorageUsage(std::vector<SessionStorageUsageInfo>* infos);
+  void DeleteLocalStorage(const GURL& origin);
+  void DeleteSessionStorage(const SessionStorageUsageInfo& usage_info);
   void PurgeMemory();
 
   // Used by content settings to alter the behavior around
   // what data to keep and what data to discard at shutdown.
   // The policy is not so straight forward to describe, see
   // the implementation for details.
-  void SetForceKeepSessionState();
+  void SetForceKeepSessionState() {
+    force_keep_session_state_ = true;
+  }
 
-  // Called when the BrowserContext/Profile is going away.
+  // Called when the owning BrowserContext is ending.
+  // Schedules the commit of any unsaved changes and will delete
+  // and keep data on disk per the content settings and special storage
+  // policies. Contained areas and namespaces will stop functioning after
+  // this method has been called.
   void Shutdown();
 
+  // Methods to add, remove, and notify EventObservers.
+  void AddEventObserver(EventObserver* observer);
+  void RemoveEventObserver(EventObserver* observer);
+  void NotifyItemSet(
+      const DOMStorageArea* area,
+      const base::string16& key,
+      const base::string16& new_value,
+      const base::NullableString16& old_value,
+      const GURL& page_url);
+  void NotifyItemRemoved(
+      const DOMStorageArea* area,
+      const base::string16& key,
+      const base::string16& old_value,
+      const GURL& page_url);
+  void NotifyAreaCleared(
+      const DOMStorageArea* area,
+      const GURL& page_url);
+
+  // May be called on any thread.
+  int64 AllocateSessionId() {
+    return session_id_sequence_.GetNext();
+  }
+
+  std::string AllocatePersistentSessionId();
+
+  // Must be called on the background thread.
+  void CreateSessionNamespace(int64 namespace_id,
+                              const std::string& persistent_namespace_id);
+  void DeleteSessionNamespace(int64 namespace_id, bool should_persist_data);
+  void CloneSessionNamespace(int64 existing_id, int64 new_id,
+                             const std::string& new_persistent_id);
+
+  // Starts backing sessionStorage on disk. This function must be called right
+  // after DOMStorageContextImpl is created, before it's used.
+  void SetSaveSessionStorageOnDisk();
+
+  // Deletes all namespaces which don't have an associated DOMStorageNamespace
+  // alive. This function is used for deleting possible leftover data after an
+  // unclean exit.
+  void StartScavengingUnusedSessionStorage();
+
  private:
-  friend class DOMStorageMessageFilter;  // for access to context()
-  friend class SessionStorageNamespaceImpl;  // ditto
+  friend class DOMStorageContextImplTest;
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageContextImplTest, Basics);
   friend class base::RefCountedThreadSafe<DOMStorageContextImpl>;
+  typedef std::map<int64, scoped_refptr<DOMStorageNamespace> >
+      StorageNamespaceMap;
 
-  virtual ~DOMStorageContextImpl();
-  dom_storage::DomStorageContext* context() const { return context_.get(); }
+  ~DOMStorageContextImpl();
 
-  scoped_refptr<dom_storage::DomStorageContext> context_;
+  void ClearSessionOnlyOrigins();
 
-  DISALLOW_IMPLICIT_CONSTRUCTORS(DOMStorageContextImpl);
+  // For scavenging unused sessionStorages.
+  void FindUnusedNamespaces();
+  void FindUnusedNamespacesInCommitSequence(
+      const std::set<std::string>& namespace_ids_in_use,
+      const std::set<std::string>& protected_persistent_session_ids);
+  void DeleteNextUnusedNamespace();
+  void DeleteNextUnusedNamespaceInCommitSequence();
+
+  // Collection of namespaces keyed by id.
+  StorageNamespaceMap namespaces_;
+
+  // Where localstorage data is stored, maybe empty for the incognito use case.
+  base::FilePath localstorage_directory_;
+
+  // Where sessionstorage data is stored, maybe empty for the incognito use
+  // case. Always empty until the file-backed session storage feature is
+  // implemented.
+  base::FilePath sessionstorage_directory_;
+
+  // Used to schedule sequenced background tasks.
+  scoped_refptr<DOMStorageTaskRunner> task_runner_;
+
+  // List of objects observing local storage events.
+  ObserverList<EventObserver> event_observers_;
+
+  // We use a 32 bit identifier for per tab storage sessions.
+  // At a tab per second, this range is large enough for 68 years.
+  base::AtomicSequenceNumber session_id_sequence_;
+
+  bool is_shutdown_;
+  bool force_keep_session_state_;
+  scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy_;
+  scoped_refptr<SessionStorageDatabase> session_storage_database_;
+
+  // For cleaning up unused namespaces gradually.
+  bool scavenging_started_;
+  std::vector<std::string> deletable_persistent_namespace_ids_;
+
+  // Persistent namespace IDs to protect from gradual deletion (they will
+  // be needed for session restore).
+  std::set<std::string> protected_persistent_session_ids_;
+
+  // Mapping between persistent namespace IDs and namespace IDs for
+  // sessionStorage.
+  std::map<std::string, int64> persistent_namespace_id_to_namespace_id_;
 };
 
 }  // namespace content
diff --git a/webkit/browser/dom_storage/dom_storage_context_unittest.cc b/content/browser/dom_storage/dom_storage_context_impl_unittest.cc
similarity index 77%
rename from webkit/browser/dom_storage/dom_storage_context_unittest.cc
rename to content/browser/dom_storage/dom_storage_context_impl_unittest.cc
index 8c0d155..27aaefb 100644
--- a/webkit/browser/dom_storage/dom_storage_context_unittest.cc
+++ b/content/browser/dom_storage/dom_storage_context_impl_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -10,19 +10,20 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "base/time/time.h"
+#include "content/browser/dom_storage/dom_storage_area.h"
+#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_namespace.h"
+#include "content/browser/dom_storage/dom_storage_task_runner.h"
+#include "content/public/browser/local_storage_usage_info.h"
+#include "content/public/browser/session_storage_usage_info.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "webkit/browser/dom_storage/dom_storage_area.h"
-#include "webkit/browser/dom_storage/dom_storage_context.h"
-#include "webkit/browser/dom_storage/dom_storage_namespace.h"
-#include "webkit/browser/dom_storage/dom_storage_task_runner.h"
 #include "webkit/browser/quota/mock_special_storage_policy.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
-namespace dom_storage {
+namespace content {
 
-class DomStorageContextTest : public testing::Test {
+class DOMStorageContextImplTest : public testing::Test {
  public:
-  DomStorageContextTest()
+  DOMStorageContextImplTest()
     : kOrigin(GURL("http://dom_storage/")),
       kKey(ASCIIToUTF16("key")),
       kValue(ASCIIToUTF16("value")),
@@ -40,11 +41,11 @@
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     storage_policy_ = new quota::MockSpecialStoragePolicy;
     task_runner_ =
-        new MockDomStorageTaskRunner(base::MessageLoopProxy::current().get());
-    context_ = new DomStorageContext(temp_dir_.path(),
-                                     base::FilePath(),
-                                     storage_policy_.get(),
-                                     task_runner_.get());
+        new MockDOMStorageTaskRunner(base::MessageLoopProxy::current().get());
+    context_ = new DOMStorageContextImpl(temp_dir_.path(),
+                                         base::FilePath(),
+                                         storage_policy_.get(),
+                                         task_runner_.get());
   }
 
   virtual void TearDown() {
@@ -53,8 +54,9 @@
 
   void VerifySingleOriginRemains(const GURL& origin) {
     // Use a new instance to examine the contexts of temp_dir_.
-    scoped_refptr<DomStorageContext> context =
-        new DomStorageContext(temp_dir_.path(), base::FilePath(), NULL, NULL);
+    scoped_refptr<DOMStorageContextImpl> context =
+        new DOMStorageContextImpl(temp_dir_.path(), base::FilePath(),
+                                  NULL, NULL);
     std::vector<LocalStorageUsageInfo> infos;
     context->GetLocalStorageUsage(&infos, kDontIncludeFileInfo);
     ASSERT_EQ(1u, infos.size());
@@ -65,12 +67,12 @@
   base::MessageLoop message_loop_;
   base::ScopedTempDir temp_dir_;
   scoped_refptr<quota::MockSpecialStoragePolicy> storage_policy_;
-  scoped_refptr<MockDomStorageTaskRunner> task_runner_;
-  scoped_refptr<DomStorageContext> context_;
-  DISALLOW_COPY_AND_ASSIGN(DomStorageContextTest);
+  scoped_refptr<MockDOMStorageTaskRunner> task_runner_;
+  scoped_refptr<DOMStorageContextImpl> context_;
+  DISALLOW_COPY_AND_ASSIGN(DOMStorageContextImplTest);
 };
 
-TEST_F(DomStorageContextTest, Basics) {
+TEST_F(DOMStorageContextImplTest, Basics) {
   // This test doesn't do much, checks that the constructor
   // initializes members properly and that invoking methods
   // on a newly created object w/o any data on disk do no harm.
@@ -89,7 +91,7 @@
   context_->Shutdown();
 }
 
-TEST_F(DomStorageContextTest, UsageInfo) {
+TEST_F(DOMStorageContextImplTest, UsageInfo) {
   // Should be empty initially
   std::vector<LocalStorageUsageInfo> infos;
   context_->GetLocalStorageUsage(&infos, kDontIncludeFileInfo);
@@ -108,7 +110,8 @@
 
   // Create a new context that points to the same directory, see that
   // it knows about the origin that we stored data for.
-  context_ = new DomStorageContext(temp_dir_.path(), base::FilePath(), NULL, NULL);
+  context_ = new DOMStorageContextImpl(temp_dir_.path(), base::FilePath(),
+                                       NULL, NULL);
   context_->GetLocalStorageUsage(&infos, kDontIncludeFileInfo);
   EXPECT_EQ(1u, infos.size());
   EXPECT_EQ(kOrigin, infos[0].origin);
@@ -122,7 +125,7 @@
   EXPECT_NE(base::Time(), infos[0].last_modified);
 }
 
-TEST_F(DomStorageContextTest, SessionOnly) {
+TEST_F(DOMStorageContextImplTest, SessionOnly) {
   const GURL kSessionOnlyOrigin("http://www.sessiononly.com/");
   storage_policy_->AddSessionOnly(kSessionOnlyOrigin);
 
@@ -142,7 +145,7 @@
   VerifySingleOriginRemains(kOrigin);
 }
 
-TEST_F(DomStorageContextTest, SetForceKeepSessionState) {
+TEST_F(DOMStorageContextImplTest, SetForceKeepSessionState) {
   const GURL kSessionOnlyOrigin("http://www.sessiononly.com/");
   storage_policy_->AddSessionOnly(kSessionOnlyOrigin);
 
@@ -159,17 +162,17 @@
   VerifySingleOriginRemains(kSessionOnlyOrigin);
 }
 
-TEST_F(DomStorageContextTest, PersistentIds) {
+TEST_F(DOMStorageContextImplTest, PersistentIds) {
   const int kFirstSessionStorageNamespaceId = 1;
   const std::string kPersistentId = "persistent";
   context_->CreateSessionNamespace(kFirstSessionStorageNamespaceId,
                                    kPersistentId);
-  DomStorageNamespace* dom_namespace =
+  DOMStorageNamespace* dom_namespace =
       context_->GetStorageNamespace(kFirstSessionStorageNamespaceId);
   ASSERT_TRUE(dom_namespace);
   EXPECT_EQ(kPersistentId, dom_namespace->persistent_namespace_id());
   // Verify that the areas inherit the persistent ID.
-  DomStorageArea* area = dom_namespace->OpenStorageArea(kOrigin);
+  DOMStorageArea* area = dom_namespace->OpenStorageArea(kOrigin);
   EXPECT_EQ(kPersistentId, area->persistent_namespace_id_);
 
   // Verify that the persistent IDs are handled correctly when cloning.
@@ -178,22 +181,22 @@
   context_->CloneSessionNamespace(kFirstSessionStorageNamespaceId,
                                   kClonedSessionStorageNamespaceId,
                                   kClonedPersistentId);
-  DomStorageNamespace* cloned_dom_namespace =
+  DOMStorageNamespace* cloned_dom_namespace =
       context_->GetStorageNamespace(kClonedSessionStorageNamespaceId);
   ASSERT_TRUE(dom_namespace);
   EXPECT_EQ(kClonedPersistentId,
             cloned_dom_namespace->persistent_namespace_id());
   // Verify that the areas inherit the persistent ID.
-  DomStorageArea* cloned_area = cloned_dom_namespace->OpenStorageArea(kOrigin);
+  DOMStorageArea* cloned_area = cloned_dom_namespace->OpenStorageArea(kOrigin);
   EXPECT_EQ(kClonedPersistentId, cloned_area->persistent_namespace_id_);
 }
 
-TEST_F(DomStorageContextTest, DeleteSessionStorage) {
-  // Create a DomStorageContext which will save sessionStorage on disk.
-  context_ = new DomStorageContext(temp_dir_.path(),
-                                   temp_dir_.path(),
-                                   storage_policy_.get(),
-                                   task_runner_.get());
+TEST_F(DOMStorageContextImplTest, DeleteSessionStorage) {
+  // Create a DOMStorageContextImpl which will save sessionStorage on disk.
+  context_ = new DOMStorageContextImpl(temp_dir_.path(),
+                                       temp_dir_.path(),
+                                       storage_policy_.get(),
+                                       task_runner_.get());
   context_->SetSaveSessionStorageOnDisk();
   ASSERT_EQ(temp_dir_.path(), context_->sessionstorage_directory());
 
@@ -202,20 +205,20 @@
   const std::string kPersistentId = "persistent";
   context_->CreateSessionNamespace(kSessionStorageNamespaceId,
                                    kPersistentId);
-  DomStorageNamespace* dom_namespace =
+  DOMStorageNamespace* dom_namespace =
       context_->GetStorageNamespace(kSessionStorageNamespaceId);
-  DomStorageArea* area = dom_namespace->OpenStorageArea(kOrigin);
+  DOMStorageArea* area = dom_namespace->OpenStorageArea(kOrigin);
   const base::string16 kKey(ASCIIToUTF16("foo"));
   const base::string16 kValue(ASCIIToUTF16("bar"));
   base::NullableString16 old_nullable_value;
   area->SetItem(kKey, kValue, &old_nullable_value);
   dom_namespace->CloseStorageArea(area);
 
-  // Destroy and recreate the DomStorageContext.
+  // Destroy and recreate the DOMStorageContextImpl.
   context_->Shutdown();
   context_ = NULL;
   base::MessageLoop::current()->RunUntilIdle();
-  context_ = new DomStorageContext(
+  context_ = new DOMStorageContextImpl(
       temp_dir_.path(), temp_dir_.path(),
       storage_policy_.get(), task_runner_.get());
   context_->SetSaveSessionStorageOnDisk();
@@ -239,7 +242,7 @@
   context_->Shutdown();
   context_ = NULL;
   base::MessageLoop::current()->RunUntilIdle();
-  context_ = new DomStorageContext(
+  context_ = new DOMStorageContextImpl(
       temp_dir_.path(), temp_dir_.path(),
       storage_policy_.get(), task_runner_.get());
   context_->SetSaveSessionStorageOnDisk();
@@ -257,4 +260,4 @@
   base::MessageLoop::current()->RunUntilIdle();
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/content/browser/dom_storage/dom_storage_context_wrapper.cc b/content/browser/dom_storage/dom_storage_context_wrapper.cc
new file mode 100644
index 0000000..56ea51e
--- /dev/null
+++ b/content/browser/dom_storage/dom_storage_context_wrapper.cc
@@ -0,0 +1,173 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/files/file_path.h"
+#include "base/message_loop/message_loop_proxy.h"
+#include "content/browser/dom_storage/dom_storage_area.h"
+#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_task_runner.h"
+#include "content/browser/dom_storage/session_storage_namespace_impl.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/local_storage_usage_info.h"
+#include "content/public/browser/session_storage_usage_info.h"
+
+namespace content {
+namespace {
+
+const char kLocalStorageDirectory[] = "Local Storage";
+const char kSessionStorageDirectory[] = "Session Storage";
+
+void InvokeLocalStorageUsageCallbackHelper(
+      const DOMStorageContext::GetLocalStorageUsageCallback& callback,
+      const std::vector<LocalStorageUsageInfo>* infos) {
+  callback.Run(*infos);
+}
+
+void GetLocalStorageUsageHelper(
+    base::MessageLoopProxy* reply_loop,
+    DOMStorageContextImpl* context,
+    const DOMStorageContext::GetLocalStorageUsageCallback& callback) {
+  std::vector<LocalStorageUsageInfo>* infos =
+      new std::vector<LocalStorageUsageInfo>;
+  context->GetLocalStorageUsage(infos, true);
+  reply_loop->PostTask(
+      FROM_HERE,
+      base::Bind(&InvokeLocalStorageUsageCallbackHelper,
+                 callback, base::Owned(infos)));
+}
+
+void InvokeSessionStorageUsageCallbackHelper(
+      const DOMStorageContext::GetSessionStorageUsageCallback& callback,
+      const std::vector<SessionStorageUsageInfo>* infos) {
+  callback.Run(*infos);
+}
+
+void GetSessionStorageUsageHelper(
+    base::MessageLoopProxy* reply_loop,
+    DOMStorageContextImpl* context,
+    const DOMStorageContext::GetSessionStorageUsageCallback& callback) {
+  std::vector<SessionStorageUsageInfo>* infos =
+      new std::vector<SessionStorageUsageInfo>;
+  context->GetSessionStorageUsage(infos);
+  reply_loop->PostTask(
+      FROM_HERE,
+      base::Bind(&InvokeSessionStorageUsageCallbackHelper,
+                 callback, base::Owned(infos)));
+}
+
+}  // namespace
+
+DOMStorageContextWrapper::DOMStorageContextWrapper(
+    const base::FilePath& data_path,
+    quota::SpecialStoragePolicy* special_storage_policy) {
+  base::SequencedWorkerPool* worker_pool = BrowserThread::GetBlockingPool();
+  context_ = new DOMStorageContextImpl(
+      data_path.empty() ? data_path
+                        : data_path.AppendASCII(kLocalStorageDirectory),
+      data_path.empty() ? data_path
+                        : data_path.AppendASCII(kSessionStorageDirectory),
+      special_storage_policy,
+      new DOMStorageWorkerPoolTaskRunner(
+          worker_pool,
+          worker_pool->GetNamedSequenceToken("dom_storage_primary"),
+          worker_pool->GetNamedSequenceToken("dom_storage_commit"),
+          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)
+              .get()));
+}
+
+DOMStorageContextWrapper::~DOMStorageContextWrapper() {
+}
+
+void DOMStorageContextWrapper::GetLocalStorageUsage(
+    const GetLocalStorageUsageCallback& callback) {
+  DCHECK(context_.get());
+  context_->task_runner()
+      ->PostShutdownBlockingTask(FROM_HERE,
+                                 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
+                                 base::Bind(&GetLocalStorageUsageHelper,
+                                            base::MessageLoopProxy::current(),
+                                            context_,
+                                            callback));
+}
+
+void DOMStorageContextWrapper::GetSessionStorageUsage(
+    const GetSessionStorageUsageCallback& callback) {
+  DCHECK(context_.get());
+  context_->task_runner()
+      ->PostShutdownBlockingTask(FROM_HERE,
+                                 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
+                                 base::Bind(&GetSessionStorageUsageHelper,
+                                            base::MessageLoopProxy::current(),
+                                            context_,
+                                            callback));
+}
+
+void DOMStorageContextWrapper::DeleteLocalStorage(const GURL& origin) {
+  DCHECK(context_.get());
+  context_->task_runner()->PostShutdownBlockingTask(
+      FROM_HERE,
+      DOMStorageTaskRunner::PRIMARY_SEQUENCE,
+      base::Bind(&DOMStorageContextImpl::DeleteLocalStorage, context_, origin));
+}
+
+void DOMStorageContextWrapper::DeleteSessionStorage(
+    const SessionStorageUsageInfo& usage_info) {
+  DCHECK(context_.get());
+  context_->task_runner()->PostShutdownBlockingTask(
+      FROM_HERE,
+      DOMStorageTaskRunner::PRIMARY_SEQUENCE,
+      base::Bind(&DOMStorageContextImpl::DeleteSessionStorage,
+                 context_, usage_info));
+}
+
+void DOMStorageContextWrapper::SetSaveSessionStorageOnDisk() {
+  DCHECK(context_.get());
+  context_->SetSaveSessionStorageOnDisk();
+}
+
+scoped_refptr<SessionStorageNamespace>
+DOMStorageContextWrapper::RecreateSessionStorage(
+    const std::string& persistent_id) {
+  return scoped_refptr<SessionStorageNamespace>(
+      new SessionStorageNamespaceImpl(this, persistent_id));
+}
+
+void DOMStorageContextWrapper::StartScavengingUnusedSessionStorage() {
+  DCHECK(context_.get());
+  context_->task_runner()->PostShutdownBlockingTask(
+      FROM_HERE,
+      DOMStorageTaskRunner::PRIMARY_SEQUENCE,
+      base::Bind(&DOMStorageContextImpl::StartScavengingUnusedSessionStorage,
+                 context_));
+}
+
+void DOMStorageContextWrapper::PurgeMemory() {
+  DCHECK(context_.get());
+  context_->task_runner()->PostShutdownBlockingTask(
+      FROM_HERE,
+      DOMStorageTaskRunner::PRIMARY_SEQUENCE,
+      base::Bind(&DOMStorageContextImpl::PurgeMemory, context_));
+}
+
+void DOMStorageContextWrapper::SetForceKeepSessionState() {
+  DCHECK(context_.get());
+  context_->task_runner()->PostShutdownBlockingTask(
+      FROM_HERE,
+      DOMStorageTaskRunner::PRIMARY_SEQUENCE,
+      base::Bind(&DOMStorageContextImpl::SetForceKeepSessionState, context_));
+}
+
+void DOMStorageContextWrapper::Shutdown() {
+  DCHECK(context_.get());
+  context_->task_runner()->PostShutdownBlockingTask(
+      FROM_HERE,
+      DOMStorageTaskRunner::PRIMARY_SEQUENCE,
+      base::Bind(&DOMStorageContextImpl::Shutdown, context_));
+}
+
+}  // namespace content
diff --git a/content/browser/dom_storage/dom_storage_context_wrapper.h b/content/browser/dom_storage/dom_storage_context_wrapper.h
new file mode 100644
index 0000000..0971f88
--- /dev/null
+++ b/content/browser/dom_storage/dom_storage_context_wrapper.h
@@ -0,0 +1,74 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_CONTEXT_WRAPPER_H_
+#define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_CONTEXT_WRAPPER_H_
+
+#include "base/memory/ref_counted.h"
+#include "content/common/content_export.h"
+#include "content/public/browser/dom_storage_context.h"
+
+namespace base {
+class FilePath;
+}
+
+namespace quota {
+class SpecialStoragePolicy;
+}
+
+namespace content {
+
+class DOMStorageContextImpl;
+
+// This is owned by BrowserContext (aka Profile) and encapsulates all
+// per-profile dom storage state.
+class CONTENT_EXPORT DOMStorageContextWrapper :
+    NON_EXPORTED_BASE(public DOMStorageContext),
+    public base::RefCountedThreadSafe<DOMStorageContextWrapper> {
+ public:
+  // If |data_path| is empty, nothing will be saved to disk.
+  DOMStorageContextWrapper(const base::FilePath& data_path,
+                        quota::SpecialStoragePolicy* special_storage_policy);
+
+  // DOMStorageContext implementation.
+  virtual void GetLocalStorageUsage(
+      const GetLocalStorageUsageCallback& callback) OVERRIDE;
+  virtual void GetSessionStorageUsage(
+      const GetSessionStorageUsageCallback& callback) OVERRIDE;
+  virtual void DeleteLocalStorage(const GURL& origin) OVERRIDE;
+  virtual void DeleteSessionStorage(
+      const SessionStorageUsageInfo& usage_info) OVERRIDE;
+  virtual void SetSaveSessionStorageOnDisk() OVERRIDE;
+  virtual scoped_refptr<SessionStorageNamespace>
+      RecreateSessionStorage(const std::string& persistent_id) OVERRIDE;
+  virtual void StartScavengingUnusedSessionStorage() OVERRIDE;
+
+  // Called to free up memory that's not strictly needed.
+  void PurgeMemory();
+
+  // Used by content settings to alter the behavior around
+  // what data to keep and what data to discard at shutdown.
+  // The policy is not so straight forward to describe, see
+  // the implementation for details.
+  void SetForceKeepSessionState();
+
+  // Called when the BrowserContext/Profile is going away.
+  void Shutdown();
+
+ private:
+  friend class DOMStorageMessageFilter;  // for access to context()
+  friend class SessionStorageNamespaceImpl;  // ditto
+  friend class base::RefCountedThreadSafe<DOMStorageContextWrapper>;
+
+  virtual ~DOMStorageContextWrapper();
+  DOMStorageContextImpl* context() const { return context_.get(); }
+
+  scoped_refptr<DOMStorageContextImpl> context_;
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(DOMStorageContextWrapper);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_CONTEXT_WRAPPER_H_
diff --git a/webkit/browser/dom_storage/dom_storage_database.cc b/content/browser/dom_storage/dom_storage_database.cc
similarity index 88%
rename from webkit/browser/dom_storage/dom_storage_database.cc
rename to content/browser/dom_storage/dom_storage_database.cc
index f3199b6..690d02a 100644
--- a/webkit/browser/dom_storage/dom_storage_database.cc
+++ b/content/browser/dom_storage/dom_storage_database.cc
@@ -1,8 +1,8 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "webkit/browser/dom_storage/dom_storage_database.h"
+#include "content/browser/dom_storage/dom_storage_database.h"
 
 #include "base/bind.h"
 #include "base/file_util.h"
@@ -17,17 +17,17 @@
 
 }  // anon namespace
 
-namespace dom_storage {
+namespace content {
 
 // static
-base::FilePath DomStorageDatabase::GetJournalFilePath(
+base::FilePath DOMStorageDatabase::GetJournalFilePath(
     const base::FilePath& database_path) {
   base::FilePath::StringType journal_file_name =
       database_path.BaseName().value() + kJournal;
   return database_path.DirName().Append(journal_file_name);
 }
 
-DomStorageDatabase::DomStorageDatabase(const base::FilePath& file_path)
+DOMStorageDatabase::DOMStorageDatabase(const base::FilePath& file_path)
     : file_path_(file_path) {
   // Note: in normal use we should never get an empty backing path here.
   // However, the unit test for this class can contruct an instance
@@ -35,17 +35,17 @@
   Init();
 }
 
-DomStorageDatabase::DomStorageDatabase() {
+DOMStorageDatabase::DOMStorageDatabase() {
   Init();
 }
 
-void DomStorageDatabase::Init() {
+void DOMStorageDatabase::Init() {
   failed_to_open_ = false;
   tried_to_recreate_ = false;
   known_to_be_empty_ = false;
 }
 
-DomStorageDatabase::~DomStorageDatabase() {
+DOMStorageDatabase::~DOMStorageDatabase() {
   if (known_to_be_empty_ && !file_path_.empty()) {
     // Delete the db and any lingering journal file from disk.
     Close();
@@ -53,7 +53,7 @@
   }
 }
 
-void DomStorageDatabase::ReadAllValues(ValuesMap* result) {
+void DOMStorageDatabase::ReadAllValues(DOMStorageValuesMap* result) {
   if (!LazyOpen(false))
     return;
 
@@ -70,8 +70,8 @@
   known_to_be_empty_ = result->empty();
 }
 
-bool DomStorageDatabase::CommitChanges(bool clear_all_first,
-                                       const ValuesMap& changes) {
+bool DOMStorageDatabase::CommitChanges(bool clear_all_first,
+                                       const DOMStorageValuesMap& changes) {
   if (!LazyOpen(!changes.empty())) {
     // If we're being asked to commit changes that will result in an
     // empty database, we return true if the database file doesn't exist.
@@ -92,7 +92,7 @@
 
   bool did_delete = false;
   bool did_insert = false;
-  ValuesMap::const_iterator it = changes.begin();
+  DOMStorageValuesMap::const_iterator it = changes.begin();
   for(; it != changes.end(); ++it) {
     sql::Statement statement;
     base::string16 key = it->first;
@@ -128,7 +128,7 @@
   return success;
 }
 
-bool DomStorageDatabase::LazyOpen(bool create_if_needed) {
+bool DOMStorageDatabase::LazyOpen(bool create_if_needed) {
   if (failed_to_open_) {
     // Don't try to open a database that we know has failed
     // already.
@@ -149,7 +149,7 @@
   }
 
   db_.reset(new sql::Connection());
-  db_->set_histogram_tag("DomStorageDatabase");
+  db_->set_histogram_tag("DOMStorageDatabase");
 
   if (file_path_.empty()) {
     // This code path should only be triggered by unit tests.
@@ -197,7 +197,7 @@
   return DeleteFileAndRecreate();
 }
 
-DomStorageDatabase::SchemaVersion DomStorageDatabase::DetectSchemaVersion() {
+DOMStorageDatabase::SchemaVersion DOMStorageDatabase::DetectSchemaVersion() {
   DCHECK(IsOpen());
 
   // Connection::Open() may succeed even if the file we try and open is not a
@@ -233,7 +233,7 @@
   return INVALID;
 }
 
-bool DomStorageDatabase::CreateTableV2() {
+bool DOMStorageDatabase::CreateTableV2() {
   DCHECK(IsOpen());
 
   return db_->Execute(
@@ -242,7 +242,7 @@
       "value BLOB NOT NULL ON CONFLICT FAIL)");
 }
 
-bool DomStorageDatabase::DeleteFileAndRecreate() {
+bool DOMStorageDatabase::DeleteFileAndRecreate() {
   DCHECK(!IsOpen());
   DCHECK(base::PathExists(file_path_));
 
@@ -262,7 +262,7 @@
   return false;
 }
 
-bool DomStorageDatabase::UpgradeVersion1To2() {
+bool DOMStorageDatabase::UpgradeVersion1To2() {
   DCHECK(IsOpen());
   DCHECK(DetectSchemaVersion() == V1);
 
@@ -273,7 +273,7 @@
   // Need to migrate from TEXT value column to BLOB.
   // Store the current database content so we can re-insert
   // the data into the new V2 table.
-  ValuesMap values;
+  DOMStorageValuesMap values;
   while (statement.Step()) {
     base::string16 key = statement.ColumnString16(0);
     base::NullableString16 value(statement.ColumnString16(1), false);
@@ -288,8 +288,8 @@
       migration.Commit();
 }
 
-void DomStorageDatabase::Close() {
+void DOMStorageDatabase::Close() {
   db_.reset(NULL);
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/webkit/browser/dom_storage/dom_storage_database.h b/content/browser/dom_storage/dom_storage_database.h
similarity index 68%
rename from webkit/browser/dom_storage/dom_storage_database.h
rename to content/browser/dom_storage/dom_storage_database.h
index 1f1d501..72f5d73 100644
--- a/webkit/browser/dom_storage/dom_storage_database.h
+++ b/content/browser/dom_storage/dom_storage_database.h
@@ -1,9 +1,9 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_H_
-#define WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_H_
+#ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_H_
+#define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_H_
 
 #include <map>
 
@@ -12,60 +12,60 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/strings/nullable_string16.h"
 #include "base/strings/string16.h"
+#include "content/common/content_export.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "sql/connection.h"
-#include "webkit/browser/webkit_storage_browser_export.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
-namespace dom_storage {
+namespace content {
 
 // Represents a SQLite based backing for DOM storage data. This
 // class is designed to be used on a single thread.
-class WEBKIT_STORAGE_BROWSER_EXPORT DomStorageDatabase {
+class CONTENT_EXPORT DOMStorageDatabase {
  public:
   static base::FilePath GetJournalFilePath(const base::FilePath& database_path);
 
-  explicit DomStorageDatabase(const base::FilePath& file_path);
-  virtual ~DomStorageDatabase();  // virtual for unit testing
+  explicit DOMStorageDatabase(const base::FilePath& file_path);
+  virtual ~DOMStorageDatabase();  // virtual for unit testing
 
   // Reads all the key, value pairs stored in the database and returns
   // them. |result| is assumed to be empty and any duplicate keys will
   // be overwritten. If the database exists on disk then it will be
   // opened. If it does not exist then it will not be created and
   // |result| will be unmodified.
-  void ReadAllValues(ValuesMap* result);
+  void ReadAllValues(DOMStorageValuesMap* result);
 
   // Updates the backing database. Will remove all keys before updating
   // the database if |clear_all_first| is set. Then all entries in
   // |changes| will be examined - keys mapped to a null NullableString16
   // will be removed and all others will be inserted/updated as appropriate.
-  bool CommitChanges(bool clear_all_first, const ValuesMap& changes);
+  bool CommitChanges(bool clear_all_first, const DOMStorageValuesMap& changes);
 
   // Simple getter for the path we were constructed with.
   const base::FilePath& file_path() const { return file_path_; }
 
  protected:
   // Constructor that uses an in-memory sqlite database, for testing.
-  DomStorageDatabase();
+  DOMStorageDatabase();
 
  private:
   friend class LocalStorageDatabaseAdapter;
-  FRIEND_TEST_ALL_PREFIXES(DomStorageDatabaseTest, SimpleOpenAndClose);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageDatabaseTest, TestLazyOpenIsLazy);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageDatabaseTest, TestDetectSchemaVersion);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageDatabaseTest,
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageDatabaseTest, SimpleOpenAndClose);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageDatabaseTest, TestLazyOpenIsLazy);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageDatabaseTest, TestDetectSchemaVersion);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageDatabaseTest,
                            TestLazyOpenUpgradesDatabase);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageDatabaseTest, SimpleWriteAndReadBack);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageDatabaseTest, WriteWithClear);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageDatabaseTest,
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageDatabaseTest, SimpleWriteAndReadBack);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageDatabaseTest, WriteWithClear);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageDatabaseTest,
                            UpgradeFromV1ToV2WithData);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageDatabaseTest, TestSimpleRemoveOneValue);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageDatabaseTest,
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageDatabaseTest, TestSimpleRemoveOneValue);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageDatabaseTest,
                            TestCanOpenAndReadWebCoreDatabase);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageDatabaseTest,
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageDatabaseTest,
                            TestCanOpenFileThatIsNotADatabase);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, BackingDatabaseOpened);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, CommitTasks);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, PurgeMemory);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, BackingDatabaseOpened);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, CommitTasks);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, PurgeMemory);
 
   enum SchemaVersion {
     INVALID,
@@ -114,6 +114,6 @@
   bool known_to_be_empty_;
 };
 
-}  // namespace dom_storage
+}  // namespace content
 
-#endif  // WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_H_
+#endif  // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_H_
diff --git a/content/browser/dom_storage/dom_storage_database_adapter.h b/content/browser/dom_storage/dom_storage_database_adapter.h
new file mode 100644
index 0000000..9068af2
--- /dev/null
+++ b/content/browser/dom_storage/dom_storage_database_adapter.h
@@ -0,0 +1,29 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_ADAPTER_H_
+#define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_ADAPTER_H_
+
+// Database interface used by DOMStorageArea. Abstracts the differences between
+// the per-origin DOMStorageDatabases for localStorage and
+// SessionStorageDatabase which stores multiple origins.
+
+#include "content/common/content_export.h"
+#include "content/common/dom_storage/dom_storage_types.h"
+
+namespace content {
+
+class CONTENT_EXPORT DOMStorageDatabaseAdapter {
+ public:
+  virtual ~DOMStorageDatabaseAdapter() {}
+  virtual void ReadAllValues(DOMStorageValuesMap* result) = 0;
+  virtual bool CommitChanges(
+      bool clear_all_first, const DOMStorageValuesMap& changes) = 0;
+  virtual void DeleteFiles() {}
+  virtual void Reset() {}
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_ADAPTER_H_
diff --git a/webkit/browser/dom_storage/dom_storage_database_unittest.cc b/content/browser/dom_storage/dom_storage_database_unittest.cc
similarity index 78%
rename from webkit/browser/dom_storage/dom_storage_database_unittest.cc
rename to content/browser/dom_storage/dom_storage_database_unittest.cc
index d1be10b..f3ba0b6 100644
--- a/webkit/browser/dom_storage/dom_storage_database_unittest.cc
+++ b/content/browser/dom_storage/dom_storage_database_unittest.cc
@@ -1,8 +1,8 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "webkit/browser/dom_storage/dom_storage_database.h"
+#include "content/browser/dom_storage/dom_storage_database.h"
 
 #include "base/file_util.h"
 #include "base/files/file_path.h"
@@ -14,7 +14,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/sqlite/sqlite3.h"
 
-namespace dom_storage {
+namespace content {
 
 void CreateV1Table(sql::Connection* db) {
   ASSERT_TRUE(db->is_open());
@@ -66,13 +66,13 @@
   statement.Run();
 }
 
-void CheckValuesMatch(DomStorageDatabase* db,
-                      const ValuesMap& expected) {
-  ValuesMap values_read;
+void CheckValuesMatch(DOMStorageDatabase* db,
+                      const DOMStorageValuesMap& expected) {
+  DOMStorageValuesMap values_read;
   db->ReadAllValues(&values_read);
   EXPECT_EQ(expected.size(), values_read.size());
 
-  ValuesMap::const_iterator it = values_read.begin();
+  DOMStorageValuesMap::const_iterator it = values_read.begin();
   for (; it != values_read.end(); ++it) {
     base::string16 key = it->first;
     base::NullableString16 value = it->second;
@@ -82,7 +82,7 @@
   }
 }
 
-void CreateMapWithValues(ValuesMap* values) {
+void CreateMapWithValues(DOMStorageValuesMap* values) {
   base::string16 kCannedKeys[] = {
       ASCIIToUTF16("test"),
       ASCIIToUTF16("company"),
@@ -99,28 +99,28 @@
     (*values)[kCannedKeys[i]] = kCannedValues[i];
 }
 
-TEST(DomStorageDatabaseTest, SimpleOpenAndClose) {
-  DomStorageDatabase db;
+TEST(DOMStorageDatabaseTest, SimpleOpenAndClose) {
+  DOMStorageDatabase db;
   EXPECT_FALSE(db.IsOpen());
   ASSERT_TRUE(db.LazyOpen(true));
   EXPECT_TRUE(db.IsOpen());
-  EXPECT_EQ(DomStorageDatabase::V2, db.DetectSchemaVersion());
+  EXPECT_EQ(DOMStorageDatabase::V2, db.DetectSchemaVersion());
   db.Close();
   EXPECT_FALSE(db.IsOpen());
 }
 
-TEST(DomStorageDatabaseTest, CloseEmptyDatabaseDeletesFile) {
+TEST(DOMStorageDatabaseTest, CloseEmptyDatabaseDeletesFile) {
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   base::FilePath file_name =
-      temp_dir.path().AppendASCII("TestDomStorageDatabase.db");
-  ValuesMap storage;
+      temp_dir.path().AppendASCII("TestDOMStorageDatabase.db");
+  DOMStorageValuesMap storage;
   CreateMapWithValues(&storage);
 
   // First test the case that explicitly clearing the database will
   // trigger its deletion from disk.
   {
-    DomStorageDatabase db(file_name);
+    DOMStorageDatabase db(file_name);
     EXPECT_EQ(file_name, db.file_path());
     ASSERT_TRUE(db.CommitChanges(false, storage));
   }
@@ -129,8 +129,8 @@
   {
     // Check that reading an existing db with data in it
     // keeps the DB on disk on close.
-    DomStorageDatabase db(file_name);
-    ValuesMap values;
+    DOMStorageDatabase db(file_name);
+    DOMStorageValuesMap values;
     db.ReadAllValues(&values);
     EXPECT_EQ(storage.size(), values.size());
   }
@@ -139,7 +139,7 @@
   storage.clear();
 
   {
-    DomStorageDatabase db(file_name);
+    DOMStorageDatabase db(file_name);
     ASSERT_TRUE(db.CommitChanges(true, storage));
   }
   EXPECT_FALSE(base::PathExists(file_name));
@@ -148,16 +148,16 @@
   // is an empty database also triggers deletion.
   CreateMapWithValues(&storage);
   {
-    DomStorageDatabase db(file_name);
+    DOMStorageDatabase db(file_name);
     ASSERT_TRUE(db.CommitChanges(false, storage));
   }
 
   EXPECT_TRUE(base::PathExists(file_name));
 
   {
-    DomStorageDatabase db(file_name);
+    DOMStorageDatabase db(file_name);
     ASSERT_TRUE(db.CommitChanges(false, storage));
-    ValuesMap::iterator it = storage.begin();
+    DOMStorageValuesMap::iterator it = storage.begin();
     for (; it != storage.end(); ++it)
       it->second = base::NullableString16();
     ASSERT_TRUE(db.CommitChanges(false, storage));
@@ -165,17 +165,17 @@
   EXPECT_FALSE(base::PathExists(file_name));
 }
 
-TEST(DomStorageDatabaseTest, TestLazyOpenIsLazy) {
+TEST(DOMStorageDatabaseTest, TestLazyOpenIsLazy) {
   // This test needs to operate with a file on disk to ensure that we will
   // open a file that already exists when only invoking ReadAllValues.
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   base::FilePath file_name =
-      temp_dir.path().AppendASCII("TestDomStorageDatabase.db");
+      temp_dir.path().AppendASCII("TestDOMStorageDatabase.db");
 
-  DomStorageDatabase db(file_name);
+  DOMStorageDatabase db(file_name);
   EXPECT_FALSE(db.IsOpen());
-  ValuesMap values;
+  DOMStorageValuesMap values;
   db.ReadAllValues(&values);
   // Reading an empty db should not open the database.
   EXPECT_FALSE(db.IsOpen());
@@ -194,25 +194,25 @@
   EXPECT_TRUE(db.IsOpen());
 }
 
-TEST(DomStorageDatabaseTest, TestDetectSchemaVersion) {
-  DomStorageDatabase db;
+TEST(DOMStorageDatabaseTest, TestDetectSchemaVersion) {
+  DOMStorageDatabase db;
   db.db_.reset(new sql::Connection());
   ASSERT_TRUE(db.db_->OpenInMemory());
 
   CreateInvalidValueColumnTable(db.db_.get());
-  EXPECT_EQ(DomStorageDatabase::INVALID, db.DetectSchemaVersion());
+  EXPECT_EQ(DOMStorageDatabase::INVALID, db.DetectSchemaVersion());
 
   CreateInvalidKeyColumnTable(db.db_.get());
-  EXPECT_EQ(DomStorageDatabase::INVALID, db.DetectSchemaVersion());
+  EXPECT_EQ(DOMStorageDatabase::INVALID, db.DetectSchemaVersion());
 
   CreateV1Table(db.db_.get());
-  EXPECT_EQ(DomStorageDatabase::V1, db.DetectSchemaVersion());
+  EXPECT_EQ(DOMStorageDatabase::V1, db.DetectSchemaVersion());
 
   CreateV2Table(db.db_.get());
-  EXPECT_EQ(DomStorageDatabase::V2, db.DetectSchemaVersion());
+  EXPECT_EQ(DOMStorageDatabase::V2, db.DetectSchemaVersion());
 }
 
-TEST(DomStorageDatabaseTest, TestLazyOpenUpgradesDatabase) {
+TEST(DOMStorageDatabaseTest, TestLazyOpenUpgradesDatabase) {
   // This test needs to operate with a file on disk so that we
   // can create a table at version 1 and then close it again
   // so that LazyOpen sees there is work to do (LazyOpen will return
@@ -220,32 +220,32 @@
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   base::FilePath file_name =
-      temp_dir.path().AppendASCII("TestDomStorageDatabase.db");
+      temp_dir.path().AppendASCII("TestDOMStorageDatabase.db");
 
-  DomStorageDatabase db(file_name);
+  DOMStorageDatabase db(file_name);
   db.db_.reset(new sql::Connection());
   ASSERT_TRUE(db.db_->Open(file_name));
   CreateV1Table(db.db_.get());
   db.Close();
 
   EXPECT_TRUE(db.LazyOpen(true));
-  EXPECT_EQ(DomStorageDatabase::V2, db.DetectSchemaVersion());
+  EXPECT_EQ(DOMStorageDatabase::V2, db.DetectSchemaVersion());
 }
 
-TEST(DomStorageDatabaseTest, SimpleWriteAndReadBack) {
-  DomStorageDatabase db;
+TEST(DOMStorageDatabaseTest, SimpleWriteAndReadBack) {
+  DOMStorageDatabase db;
 
-  ValuesMap storage;
+  DOMStorageValuesMap storage;
   CreateMapWithValues(&storage);
 
   EXPECT_TRUE(db.CommitChanges(false, storage));
   CheckValuesMatch(&db, storage);
 }
 
-TEST(DomStorageDatabaseTest, WriteWithClear) {
-  DomStorageDatabase db;
+TEST(DOMStorageDatabaseTest, WriteWithClear) {
+  DOMStorageDatabase db;
 
-  ValuesMap storage;
+  DOMStorageValuesMap storage;
   CreateMapWithValues(&storage);
 
   ASSERT_TRUE(db.CommitChanges(false, storage));
@@ -264,13 +264,13 @@
   CheckValuesMatch(&db, storage);
 }
 
-TEST(DomStorageDatabaseTest, UpgradeFromV1ToV2WithData) {
+TEST(DOMStorageDatabaseTest, UpgradeFromV1ToV2WithData) {
   const base::string16 kCannedKey = ASCIIToUTF16("foo");
   const base::NullableString16 kCannedValue(ASCIIToUTF16("bar"), false);
-  ValuesMap expected;
+  DOMStorageValuesMap expected;
   expected[kCannedKey] = kCannedValue;
 
-  DomStorageDatabase db;
+  DOMStorageDatabase db;
   db.db_.reset(new sql::Connection());
   ASSERT_TRUE(db.db_->OpenInMemory());
   CreateV1Table(db.db_.get());
@@ -278,25 +278,25 @@
 
   ASSERT_TRUE(db.UpgradeVersion1To2());
 
-  EXPECT_EQ(DomStorageDatabase::V2, db.DetectSchemaVersion());
+  EXPECT_EQ(DOMStorageDatabase::V2, db.DetectSchemaVersion());
 
   CheckValuesMatch(&db, expected);
 }
 
-TEST(DomStorageDatabaseTest, TestSimpleRemoveOneValue) {
-  DomStorageDatabase db;
+TEST(DOMStorageDatabaseTest, TestSimpleRemoveOneValue) {
+  DOMStorageDatabase db;
 
   ASSERT_TRUE(db.LazyOpen(true));
   const base::string16 kCannedKey = ASCIIToUTF16("test");
   const base::NullableString16 kCannedValue(ASCIIToUTF16("data"), false);
-  ValuesMap expected;
+  DOMStorageValuesMap expected;
   expected[kCannedKey] = kCannedValue;
 
   // First write some data into the database.
   ASSERT_TRUE(db.CommitChanges(false, expected));
   CheckValuesMatch(&db, expected);
 
-  ValuesMap values;
+  DOMStorageValuesMap values;
   // A null string in the map should mean that that key gets
   // removed.
   values[kCannedKey] = base::NullableString16();
@@ -306,7 +306,7 @@
   CheckValuesMatch(&db, expected);
 }
 
-TEST(DomStorageDatabaseTest, TestCanOpenAndReadWebCoreDatabase) {
+TEST(DOMStorageDatabaseTest, TestCanOpenAndReadWebCoreDatabase) {
   base::FilePath webcore_database;
   PathService::Get(base::DIR_SOURCE_ROOT, &webcore_database);
   webcore_database = webcore_database.AppendASCII("webkit");
@@ -317,13 +317,13 @@
 
   ASSERT_TRUE(base::PathExists(webcore_database));
 
-  DomStorageDatabase db(webcore_database);
-  ValuesMap values;
+  DOMStorageDatabase db(webcore_database);
+  DOMStorageValuesMap values;
   db.ReadAllValues(&values);
   EXPECT_TRUE(db.IsOpen());
   EXPECT_EQ(2u, values.size());
 
-  ValuesMap::const_iterator it =
+  DOMStorageValuesMap::const_iterator it =
       values.find(ASCIIToUTF16("value"));
   EXPECT_TRUE(it != values.end());
   EXPECT_EQ(ASCIIToUTF16("I am in local storage!"), it->second.string());
@@ -336,12 +336,12 @@
   EXPECT_TRUE(it == values.end());
 }
 
-TEST(DomStorageDatabaseTest, TestCanOpenFileThatIsNotADatabase) {
+TEST(DOMStorageDatabaseTest, TestCanOpenFileThatIsNotADatabase) {
   // Write into the temporary file first.
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   base::FilePath file_name =
-      temp_dir.path().AppendASCII("TestDomStorageDatabase.db");
+      temp_dir.path().AppendASCII("TestDOMStorageDatabase.db");
 
   const char kData[] = "I am not a database.";
   file_util::WriteFile(file_name, kData, strlen(kData));
@@ -353,8 +353,8 @@
     // Try and open the file. As it's not a database, we should end up deleting
     // it and creating a new, valid file, so everything should actually
     // succeed.
-    DomStorageDatabase db(file_name);
-    ValuesMap values;
+    DOMStorageDatabase db(file_name);
+    DOMStorageValuesMap values;
     CreateMapWithValues(&values);
     EXPECT_TRUE(db.CommitChanges(true, values));
     EXPECT_TRUE(db.CommitChanges(false, values));
@@ -371,8 +371,8 @@
 
     // Try to open a directory, we should fail gracefully and not attempt
     // to delete it.
-    DomStorageDatabase db(temp_dir.path());
-    ValuesMap values;
+    DOMStorageDatabase db(temp_dir.path());
+    DOMStorageValuesMap values;
     CreateMapWithValues(&values);
     EXPECT_FALSE(db.CommitChanges(true, values));
     EXPECT_FALSE(db.CommitChanges(false, values));
@@ -390,4 +390,4 @@
   }
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/webkit/browser/dom_storage/dom_storage_host.cc b/content/browser/dom_storage/dom_storage_host.cc
similarity index 64%
rename from webkit/browser/dom_storage/dom_storage_host.cc
rename to content/browser/dom_storage/dom_storage_host.cc
index 9b6da67..296d52e 100644
--- a/webkit/browser/dom_storage/dom_storage_host.cc
+++ b/content/browser/dom_storage/dom_storage_host.cc
@@ -1,29 +1,29 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "webkit/browser/dom_storage/dom_storage_host.h"
+#include "content/browser/dom_storage/dom_storage_host.h"
 
+#include "content/browser/dom_storage/dom_storage_area.h"
+#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_namespace.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "url/gurl.h"
-#include "webkit/browser/dom_storage/dom_storage_area.h"
-#include "webkit/browser/dom_storage/dom_storage_context.h"
-#include "webkit/browser/dom_storage/dom_storage_namespace.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
-namespace dom_storage {
+namespace content {
 
-DomStorageHost::DomStorageHost(DomStorageContext* context)
+DOMStorageHost::DOMStorageHost(DOMStorageContextImpl* context)
     : context_(context) {
 }
 
-DomStorageHost::~DomStorageHost() {
+DOMStorageHost::~DOMStorageHost() {
   AreaMap::const_iterator it = connections_.begin();
   for (; it != connections_.end(); ++it)
     it->second.namespace_->CloseStorageArea(it->second.area_.get());
   connections_.clear();  // Clear prior to releasing the context_
 }
 
-bool DomStorageHost::OpenStorageArea(int connection_id, int namespace_id,
+bool DOMStorageHost::OpenStorageArea(int connection_id, int namespace_id,
                                      const GURL& origin) {
   DCHECK(!GetOpenArea(connection_id));
   if (GetOpenArea(connection_id))
@@ -42,7 +42,7 @@
   return true;
 }
 
-void DomStorageHost::CloseStorageArea(int connection_id) {
+void DOMStorageHost::CloseStorageArea(int connection_id) {
   AreaMap::iterator found = connections_.find(connection_id);
   if (found == connections_.end())
     return;
@@ -50,10 +50,10 @@
   connections_.erase(found);
 }
 
-bool DomStorageHost::ExtractAreaValues(
-    int connection_id, ValuesMap* map) {
+bool DOMStorageHost::ExtractAreaValues(
+    int connection_id, DOMStorageValuesMap* map) {
   map->clear();
-  DomStorageArea* area = GetOpenArea(connection_id);
+  DOMStorageArea* area = GetOpenArea(connection_id);
   if (!area) {
     // TODO(michaeln): Fix crbug/134003 and return false here.
     // Until then return true to avoid crashing the renderer
@@ -61,46 +61,46 @@
     return true;
   }
   if (!area->IsLoadedInMemory()) {
-    DomStorageNamespace* ns = GetNamespace(connection_id);
+    DOMStorageNamespace* ns = GetNamespace(connection_id);
     DCHECK(ns);
-    if (ns->CountInMemoryAreas() > kMaxInMemoryAreas) {
-      ns->PurgeMemory(DomStorageNamespace::PURGE_UNOPENED);
-      if (ns->CountInMemoryAreas() > kMaxInMemoryAreas)
-        ns->PurgeMemory(DomStorageNamespace::PURGE_AGGRESSIVE);
+    if (ns->CountInMemoryAreas() > kMaxInMemoryStorageAreas) {
+      ns->PurgeMemory(DOMStorageNamespace::PURGE_UNOPENED);
+      if (ns->CountInMemoryAreas() > kMaxInMemoryStorageAreas)
+        ns->PurgeMemory(DOMStorageNamespace::PURGE_AGGRESSIVE);
     }
   }
   area->ExtractValues(map);
   return true;
 }
 
-unsigned DomStorageHost::GetAreaLength(int connection_id) {
-  DomStorageArea* area = GetOpenArea(connection_id);
+unsigned DOMStorageHost::GetAreaLength(int connection_id) {
+  DOMStorageArea* area = GetOpenArea(connection_id);
   if (!area)
     return 0;
   return area->Length();
 }
 
-base::NullableString16 DomStorageHost::GetAreaKey(int connection_id,
+base::NullableString16 DOMStorageHost::GetAreaKey(int connection_id,
                                                   unsigned index) {
-  DomStorageArea* area = GetOpenArea(connection_id);
+  DOMStorageArea* area = GetOpenArea(connection_id);
   if (!area)
     return base::NullableString16();
   return area->Key(index);
 }
 
-base::NullableString16 DomStorageHost::GetAreaItem(int connection_id,
+base::NullableString16 DOMStorageHost::GetAreaItem(int connection_id,
                                                    const base::string16& key) {
-  DomStorageArea* area = GetOpenArea(connection_id);
+  DOMStorageArea* area = GetOpenArea(connection_id);
   if (!area)
     return base::NullableString16();
   return area->GetItem(key);
 }
 
-bool DomStorageHost::SetAreaItem(
+bool DOMStorageHost::SetAreaItem(
     int connection_id, const base::string16& key,
     const base::string16& value, const GURL& page_url,
     base::NullableString16* old_value) {
-  DomStorageArea* area = GetOpenArea(connection_id);
+  DOMStorageArea* area = GetOpenArea(connection_id);
   if (!area) {
     // TODO(michaeln): Fix crbug/134003 and return false here.
     // Until then return true to allow the renderer to operate
@@ -114,10 +114,10 @@
   return true;
 }
 
-bool DomStorageHost::RemoveAreaItem(
+bool DOMStorageHost::RemoveAreaItem(
     int connection_id, const base::string16& key, const GURL& page_url,
     base::string16* old_value) {
-  DomStorageArea* area = GetOpenArea(connection_id);
+  DOMStorageArea* area = GetOpenArea(connection_id);
   if (!area)
     return false;
   if (!area->RemoveItem(key, old_value))
@@ -126,8 +126,8 @@
   return true;
 }
 
-bool DomStorageHost::ClearArea(int connection_id, const GURL& page_url) {
-  DomStorageArea* area = GetOpenArea(connection_id);
+bool DOMStorageHost::ClearArea(int connection_id, const GURL& page_url) {
+  DOMStorageArea* area = GetOpenArea(connection_id);
   if (!area)
     return false;
   if (!area->Clear())
@@ -136,7 +136,7 @@
   return true;
 }
 
-bool DomStorageHost::HasAreaOpen(
+bool DOMStorageHost::HasAreaOpen(
     int namespace_id, const GURL& origin) const {
   AreaMap::const_iterator it = connections_.begin();
   for (; it != connections_.end(); ++it) {
@@ -148,14 +148,14 @@
   return false;
 }
 
-DomStorageArea* DomStorageHost::GetOpenArea(int connection_id) {
+DOMStorageArea* DOMStorageHost::GetOpenArea(int connection_id) {
   AreaMap::iterator found = connections_.find(connection_id);
   if (found == connections_.end())
     return NULL;
   return found->second.area_.get();
 }
 
-DomStorageNamespace* DomStorageHost::GetNamespace(int connection_id) {
+DOMStorageNamespace* DOMStorageHost::GetNamespace(int connection_id) {
   AreaMap::iterator found = connections_.find(connection_id);
   if (found == connections_.end())
     return NULL;
@@ -164,7 +164,7 @@
 
 // NamespaceAndArea
 
-DomStorageHost::NamespaceAndArea::NamespaceAndArea() {}
-DomStorageHost::NamespaceAndArea::~NamespaceAndArea() {}
+DOMStorageHost::NamespaceAndArea::NamespaceAndArea() {}
+DOMStorageHost::NamespaceAndArea::~NamespaceAndArea() {}
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/webkit/browser/dom_storage/dom_storage_host.h b/content/browser/dom_storage/dom_storage_host.h
similarity index 60%
rename from webkit/browser/dom_storage/dom_storage_host.h
rename to content/browser/dom_storage/dom_storage_host.h
index 31e1962..3aa9d80 100644
--- a/webkit/browser/dom_storage/dom_storage_host.h
+++ b/content/browser/dom_storage/dom_storage_host.h
@@ -1,41 +1,41 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_HOST_H_
-#define WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_HOST_H_
+#ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_HOST_H_
+#define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_HOST_H_
 
 #include <map>
 
 #include "base/memory/ref_counted.h"
 #include "base/strings/nullable_string16.h"
 #include "base/strings/string16.h"
-#include "webkit/browser/webkit_storage_browser_export.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
+#include "content/common/content_export.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 
 class GURL;
 
-namespace dom_storage {
+namespace content {
 
-class DomStorageContext;
-class DomStorageHost;
-class DomStorageNamespace;
-class DomStorageArea;
+class DOMStorageContextImpl;
+class DOMStorageHost;
+class DOMStorageNamespace;
+class DOMStorageArea;
 
 // One instance is allocated in the main process for each client process.
-// Used by DomStorageMessageFilter in Chrome and by SimpleDomStorage in DRT.
+// Used by DOMStorageMessageFilter in Chrome and by SimpleDOMStorage in DRT.
 // This class is single threaded, and performs blocking file reads/writes,
 // so it shouldn't be used on chrome's IO thread.
-// See class comments for DomStorageContext for a larger overview.
-class WEBKIT_STORAGE_BROWSER_EXPORT DomStorageHost {
+// See class comments for DOMStorageContextImpl for a larger overview.
+class CONTENT_EXPORT DOMStorageHost {
  public:
-  explicit DomStorageHost(DomStorageContext* context);
-  ~DomStorageHost();
+  explicit DOMStorageHost(DOMStorageContextImpl* context);
+  ~DOMStorageHost();
 
   bool OpenStorageArea(int connection_id, int namespace_id,
                        const GURL& origin);
   void CloseStorageArea(int connection_id);
-  bool ExtractAreaValues(int connection_id, ValuesMap* map);
+  bool ExtractAreaValues(int connection_id, DOMStorageValuesMap* map);
   unsigned GetAreaLength(int connection_id);
   base::NullableString16 GetAreaKey(int connection_id, unsigned index);
   base::NullableString16 GetAreaItem(int connection_id,
@@ -53,20 +53,20 @@
   // Struct to hold references needed for areas that are open
   // within our associated client process.
   struct NamespaceAndArea {
-    scoped_refptr<DomStorageNamespace> namespace_;
-    scoped_refptr<DomStorageArea> area_;
+    scoped_refptr<DOMStorageNamespace> namespace_;
+    scoped_refptr<DOMStorageArea> area_;
     NamespaceAndArea();
     ~NamespaceAndArea();
   };
   typedef std::map<int, NamespaceAndArea > AreaMap;
 
-  DomStorageArea* GetOpenArea(int connection_id);
-  DomStorageNamespace* GetNamespace(int connection_id);
+  DOMStorageArea* GetOpenArea(int connection_id);
+  DOMStorageNamespace* GetNamespace(int connection_id);
 
-  scoped_refptr<DomStorageContext> context_;
+  scoped_refptr<DOMStorageContextImpl> context_;
   AreaMap connections_;
 };
 
-}  // namespace dom_storage
+}  // namespace content
 
-#endif  // WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_HOST_H_
+#endif  // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_HOST_H_
diff --git a/content/browser/dom_storage/dom_storage_message_filter.cc b/content/browser/dom_storage/dom_storage_message_filter.cc
index 8649ebe..52aabe1 100644
--- a/content/browser/dom_storage/dom_storage_message_filter.cc
+++ b/content/browser/dom_storage/dom_storage_message_filter.cc
@@ -9,19 +9,20 @@
 #include "base/strings/nullable_string16.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/sequenced_worker_pool.h"
-#include "content/browser/dom_storage/dom_storage_context_impl.h"
-#include "content/common/dom_storage_messages.h"
+#include "content/browser/dom_storage/dom_storage_area.h"
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
+#include "content/browser/dom_storage/dom_storage_host.h"
+#include "content/browser/dom_storage/dom_storage_namespace.h"
+#include "content/browser/dom_storage/dom_storage_task_runner.h"
+#include "content/common/dom_storage/dom_storage_messages.h"
 #include "content/public/browser/user_metrics.h"
 #include "url/gurl.h"
-#include "webkit/browser/dom_storage/dom_storage_area.h"
-#include "webkit/browser/dom_storage/dom_storage_host.h"
-#include "webkit/browser/dom_storage/dom_storage_task_runner.h"
 
 namespace content {
 
 DOMStorageMessageFilter::DOMStorageMessageFilter(
     int unused,
-    DOMStorageContextImpl* context)
+    DOMStorageContextWrapper* context)
     : context_(context->context()),
       connection_dispatching_message_for_(0) {
 }
@@ -32,7 +33,7 @@
 
 void DOMStorageMessageFilter::InitializeInSequence() {
   DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
-  host_.reset(new dom_storage::DomStorageHost(context_.get()));
+  host_.reset(new DOMStorageHost(context_.get()));
   context_->AddEventObserver(this);
 }
 
@@ -49,7 +50,7 @@
   BrowserMessageFilter::OnFilterAdded(channel);
   context_->task_runner()->PostShutdownBlockingTask(
       FROM_HERE,
-      dom_storage::DomStorageTaskRunner::PRIMARY_SEQUENCE,
+      DOMStorageTaskRunner::PRIMARY_SEQUENCE,
       base::Bind(&DOMStorageMessageFilter::InitializeInSequence, this));
 }
 
@@ -58,7 +59,7 @@
   BrowserMessageFilter::OnFilterRemoved();
   context_->task_runner()->PostShutdownBlockingTask(
       FROM_HERE,
-      dom_storage::DomStorageTaskRunner::PRIMARY_SEQUENCE,
+      DOMStorageTaskRunner::PRIMARY_SEQUENCE,
       base::Bind(&DOMStorageMessageFilter::UninitializeInSequence, this));
 }
 
@@ -106,7 +107,7 @@
 }
 
 void DOMStorageMessageFilter::OnLoadStorageArea(int connection_id,
-                                                dom_storage::ValuesMap* map) {
+                                                DOMStorageValuesMap* map) {
   DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
   if (!host_->ExtractAreaValues(connection_id, map)) {
     RecordAction(UserMetricsAction("BadMessageTerminate_DSMF_2"));
@@ -154,40 +155,40 @@
   // Intentionally empty method body.
 }
 
-void DOMStorageMessageFilter::OnDomStorageItemSet(
-    const dom_storage::DomStorageArea* area,
+void DOMStorageMessageFilter::OnDOMStorageItemSet(
+    const DOMStorageArea* area,
     const string16& key,
     const string16& new_value,
     const base::NullableString16& old_value,
     const GURL& page_url) {
-  SendDomStorageEvent(area, page_url,
+  SendDOMStorageEvent(area, page_url,
                       base::NullableString16(key, false),
                       base::NullableString16(new_value, false),
                       old_value);
 }
 
-void DOMStorageMessageFilter::OnDomStorageItemRemoved(
-    const dom_storage::DomStorageArea* area,
+void DOMStorageMessageFilter::OnDOMStorageItemRemoved(
+    const DOMStorageArea* area,
     const string16& key,
     const string16& old_value,
     const GURL& page_url) {
-  SendDomStorageEvent(area, page_url,
+  SendDOMStorageEvent(area, page_url,
                       base::NullableString16(key, false),
                       base::NullableString16(),
                       base::NullableString16(old_value, false));
 }
 
-void DOMStorageMessageFilter::OnDomStorageAreaCleared(
-    const dom_storage::DomStorageArea* area,
+void DOMStorageMessageFilter::OnDOMStorageAreaCleared(
+    const DOMStorageArea* area,
     const GURL& page_url) {
-  SendDomStorageEvent(area, page_url,
+  SendDOMStorageEvent(area, page_url,
                       base::NullableString16(),
                       base::NullableString16(),
                       base::NullableString16());
 }
 
-void DOMStorageMessageFilter::SendDomStorageEvent(
-    const dom_storage::DomStorageArea* area,
+void DOMStorageMessageFilter::SendDOMStorageEvent(
+    const DOMStorageArea* area,
     const GURL& page_url,
     const base::NullableString16& key,
     const base::NullableString16& new_value,
diff --git a/content/browser/dom_storage/dom_storage_message_filter.h b/content/browser/dom_storage/dom_storage_message_filter.h
index cc6ec35..2ec928a 100644
--- a/content/browser/dom_storage/dom_storage_message_filter.h
+++ b/content/browser/dom_storage/dom_storage_message_filter.h
@@ -7,9 +7,9 @@
 
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
+#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "content/public/browser/browser_message_filter.h"
-#include "webkit/browser/dom_storage/dom_storage_context.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
 class GURL;
 
@@ -17,22 +17,21 @@
 class NullableString16;
 }
 
-namespace dom_storage {
-class DomStorageArea;
-class DomStorageContext;
-class DomStorageHost;
-}
-
 namespace content {
+
+class DOMStorageArea;
 class DOMStorageContextImpl;
+class DOMStorageContextWrapper;
+class DOMStorageHost;
 
 // This class handles the logistics of DOM Storage within the browser process.
 // It mostly ferries information between IPCs and the dom_storage classes.
 class DOMStorageMessageFilter
     : public BrowserMessageFilter,
-      public dom_storage::DomStorageContext::EventObserver {
+      public DOMStorageContextImpl::EventObserver {
  public:
-  explicit DOMStorageMessageFilter(int unused, DOMStorageContextImpl* context);
+  explicit DOMStorageMessageFilter(int unused,
+                                   DOMStorageContextWrapper* context);
 
  private:
   virtual ~DOMStorageMessageFilter();
@@ -52,7 +51,7 @@
   void OnOpenStorageArea(int connection_id, int64 namespace_id,
                          const GURL& origin);
   void OnCloseStorageArea(int connection_id);
-  void OnLoadStorageArea(int connection_id, dom_storage::ValuesMap* map);
+  void OnLoadStorageArea(int connection_id, DOMStorageValuesMap* map);
   void OnSetItem(int connection_id, const string16& key,
                  const string16& value, const GURL& page_url);
   void OnRemoveItem(int connection_id, const string16& key,
@@ -60,32 +59,32 @@
   void OnClear(int connection_id, const GURL& page_url);
   void OnFlushMessages();
 
-  // DomStorageContext::EventObserver implementation which
+  // DOMStorageContextImpl::EventObserver implementation which
   // sends events back to our renderer process.
-  virtual void OnDomStorageItemSet(
-      const dom_storage::DomStorageArea* area,
+  virtual void OnDOMStorageItemSet(
+      const DOMStorageArea* area,
       const string16& key,
       const string16& new_value,
       const base::NullableString16& old_value,
       const GURL& page_url) OVERRIDE;
-  virtual void OnDomStorageItemRemoved(
-      const dom_storage::DomStorageArea* area,
+  virtual void OnDOMStorageItemRemoved(
+      const DOMStorageArea* area,
       const string16& key,
       const string16& old_value,
       const GURL& page_url) OVERRIDE;
-  virtual void OnDomStorageAreaCleared(
-      const dom_storage::DomStorageArea* area,
+  virtual void OnDOMStorageAreaCleared(
+      const DOMStorageArea* area,
       const GURL& page_url) OVERRIDE;
 
-  void SendDomStorageEvent(
-      const dom_storage::DomStorageArea* area,
+  void SendDOMStorageEvent(
+      const DOMStorageArea* area,
       const GURL& page_url,
       const base::NullableString16& key,
       const base::NullableString16& new_value,
       const base::NullableString16& old_value);
 
-  scoped_refptr<dom_storage::DomStorageContext> context_;
-  scoped_ptr<dom_storage::DomStorageHost> host_;
+  scoped_refptr<DOMStorageContextImpl> context_;
+  scoped_ptr<DOMStorageHost> host_;
   int connection_dispatching_message_for_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(DOMStorageMessageFilter);
diff --git a/webkit/browser/dom_storage/dom_storage_namespace.cc b/content/browser/dom_storage/dom_storage_namespace.cc
similarity index 68%
rename from webkit/browser/dom_storage/dom_storage_namespace.cc
rename to content/browser/dom_storage/dom_storage_namespace.cc
index fe3195b..75bfdaa 100644
--- a/webkit/browser/dom_storage/dom_storage_namespace.cc
+++ b/content/browser/dom_storage/dom_storage_namespace.cc
@@ -1,33 +1,33 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "webkit/browser/dom_storage/dom_storage_namespace.h"
+#include "content/browser/dom_storage/dom_storage_namespace.h"
 
 #include "base/basictypes.h"
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "webkit/browser/dom_storage/dom_storage_area.h"
-#include "webkit/browser/dom_storage/dom_storage_task_runner.h"
-#include "webkit/browser/dom_storage/session_storage_database.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
+#include "content/browser/dom_storage/dom_storage_area.h"
+#include "content/browser/dom_storage/dom_storage_task_runner.h"
+#include "content/browser/dom_storage/session_storage_database.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 
-namespace dom_storage {
+namespace content {
 
-DomStorageNamespace::DomStorageNamespace(
+DOMStorageNamespace::DOMStorageNamespace(
     const base::FilePath& directory,
-    DomStorageTaskRunner* task_runner)
+    DOMStorageTaskRunner* task_runner)
     : namespace_id_(kLocalStorageNamespaceId),
       directory_(directory),
       task_runner_(task_runner) {
 }
 
-DomStorageNamespace::DomStorageNamespace(
+DOMStorageNamespace::DOMStorageNamespace(
     int64 namespace_id,
     const std::string& persistent_namespace_id,
     SessionStorageDatabase* session_storage_database,
-    DomStorageTaskRunner* task_runner)
+    DOMStorageTaskRunner* task_runner)
     : namespace_id_(namespace_id),
       persistent_namespace_id_(persistent_namespace_id),
       task_runner_(task_runner),
@@ -35,19 +35,19 @@
   DCHECK_NE(kLocalStorageNamespaceId, namespace_id);
 }
 
-DomStorageNamespace::~DomStorageNamespace() {
+DOMStorageNamespace::~DOMStorageNamespace() {
 }
 
-DomStorageArea* DomStorageNamespace::OpenStorageArea(const GURL& origin) {
+DOMStorageArea* DOMStorageNamespace::OpenStorageArea(const GURL& origin) {
   if (AreaHolder* holder = GetAreaHolder(origin)) {
     ++(holder->open_count_);
     return holder->area_.get();
   }
-  DomStorageArea* area;
+  DOMStorageArea* area;
   if (namespace_id_ == kLocalStorageNamespaceId) {
-    area = new DomStorageArea(origin, directory_, task_runner_.get());
+    area = new DOMStorageArea(origin, directory_, task_runner_.get());
   } else {
-    area = new DomStorageArea(
+    area = new DOMStorageArea(
         namespace_id_, persistent_namespace_id_, origin,
         session_storage_database_.get(), task_runner_.get());
   }
@@ -55,7 +55,7 @@
   return area;
 }
 
-void DomStorageNamespace::CloseStorageArea(DomStorageArea* area) {
+void DOMStorageNamespace::CloseStorageArea(DOMStorageArea* area) {
   AreaHolder* holder = GetAreaHolder(area->origin());
   DCHECK(holder);
   DCHECK_EQ(holder->area_.get(), area);
@@ -64,25 +64,25 @@
   // The in-process-webkit based impl didn't do this either, but would be nice.
 }
 
-DomStorageArea* DomStorageNamespace::GetOpenStorageArea(const GURL& origin) {
+DOMStorageArea* DOMStorageNamespace::GetOpenStorageArea(const GURL& origin) {
   AreaHolder* holder = GetAreaHolder(origin);
   if (holder && holder->open_count_)
     return holder->area_.get();
   return NULL;
 }
 
-DomStorageNamespace* DomStorageNamespace::Clone(
+DOMStorageNamespace* DOMStorageNamespace::Clone(
     int64 clone_namespace_id,
     const std::string& clone_persistent_namespace_id) {
   DCHECK_NE(kLocalStorageNamespaceId, namespace_id_);
   DCHECK_NE(kLocalStorageNamespaceId, clone_namespace_id);
-  DomStorageNamespace* clone = new DomStorageNamespace(
+  DOMStorageNamespace* clone = new DOMStorageNamespace(
       clone_namespace_id, clone_persistent_namespace_id,
       session_storage_database_.get(), task_runner_.get());
   AreaMap::const_iterator it = areas_.begin();
   // Clone the in-memory structures.
   for (; it != areas_.end(); ++it) {
-    DomStorageArea* area = it->second.area_->ShallowCopy(
+    DOMStorageArea* area = it->second.area_->ShallowCopy(
         clone_namespace_id, clone_persistent_namespace_id);
     clone->areas_[it->first] = AreaHolder(area, 0);
   }
@@ -90,7 +90,7 @@
   if (session_storage_database_.get()) {
     task_runner_->PostShutdownBlockingTask(
         FROM_HERE,
-        DomStorageTaskRunner::COMMIT_SEQUENCE,
+        DOMStorageTaskRunner::COMMIT_SEQUENCE,
         base::Bind(base::IgnoreResult(&SessionStorageDatabase::CloneNamespace),
                    session_storage_database_.get(), persistent_namespace_id_,
                    clone_persistent_namespace_id));
@@ -98,7 +98,7 @@
   return clone;
 }
 
-void DomStorageNamespace::DeleteLocalStorageOrigin(const GURL& origin) {
+void DOMStorageNamespace::DeleteLocalStorageOrigin(const GURL& origin) {
   DCHECK(!session_storage_database_.get());
   AreaHolder* holder = GetAreaHolder(origin);
   if (holder) {
@@ -106,19 +106,19 @@
     return;
   }
   if (!directory_.empty()) {
-    scoped_refptr<DomStorageArea> area =
-        new DomStorageArea(origin, directory_, task_runner_.get());
+    scoped_refptr<DOMStorageArea> area =
+        new DOMStorageArea(origin, directory_, task_runner_.get());
     area->DeleteOrigin();
   }
 }
 
-void DomStorageNamespace::DeleteSessionStorageOrigin(const GURL& origin) {
-  DomStorageArea* area = OpenStorageArea(origin);
+void DOMStorageNamespace::DeleteSessionStorageOrigin(const GURL& origin) {
+  DOMStorageArea* area = OpenStorageArea(origin);
   area->FastClear();
   CloseStorageArea(area);
 }
 
-void DomStorageNamespace::PurgeMemory(PurgeOption option) {
+void DOMStorageNamespace::PurgeMemory(PurgeOption option) {
   if (directory_.empty())
     return;  // We can't purge w/o backing on disk.
   AreaMap::iterator it = areas_.begin();
@@ -147,13 +147,13 @@
   }
 }
 
-void DomStorageNamespace::Shutdown() {
+void DOMStorageNamespace::Shutdown() {
   AreaMap::const_iterator it = areas_.begin();
   for (; it != areas_.end(); ++it)
     it->second.area_->Shutdown();
 }
 
-unsigned int DomStorageNamespace::CountInMemoryAreas() const {
+unsigned int DOMStorageNamespace::CountInMemoryAreas() const {
   unsigned int area_count = 0;
   for (AreaMap::const_iterator it = areas_.begin(); it != areas_.end(); ++it) {
     if (it->second.area_->IsLoadedInMemory())
@@ -162,8 +162,8 @@
   return area_count;
 }
 
-DomStorageNamespace::AreaHolder*
-DomStorageNamespace::GetAreaHolder(const GURL& origin) {
+DOMStorageNamespace::AreaHolder*
+DOMStorageNamespace::GetAreaHolder(const GURL& origin) {
   AreaMap::iterator found = areas_.find(origin);
   if (found == areas_.end())
     return NULL;
@@ -172,16 +172,16 @@
 
 // AreaHolder
 
-DomStorageNamespace::AreaHolder::AreaHolder()
+DOMStorageNamespace::AreaHolder::AreaHolder()
     : open_count_(0) {
 }
 
-DomStorageNamespace::AreaHolder::AreaHolder(
-    DomStorageArea* area, int count)
+DOMStorageNamespace::AreaHolder::AreaHolder(
+    DOMStorageArea* area, int count)
     : area_(area), open_count_(count) {
 }
 
-DomStorageNamespace::AreaHolder::~AreaHolder() {
+DOMStorageNamespace::AreaHolder::~AreaHolder() {
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/webkit/browser/dom_storage/dom_storage_namespace.h b/content/browser/dom_storage/dom_storage_namespace.h
similarity index 64%
rename from webkit/browser/dom_storage/dom_storage_namespace.h
rename to content/browser/dom_storage/dom_storage_namespace.h
index 758ca2e..f33042f 100644
--- a/webkit/browser/dom_storage/dom_storage_namespace.h
+++ b/content/browser/dom_storage/dom_storage_namespace.h
@@ -1,29 +1,29 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_NAMESPACE_H_
-#define WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_NAMESPACE_H_
+#ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_NAMESPACE_H_
+#define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_NAMESPACE_H_
 
 #include <map>
 
 #include "base/basictypes.h"
 #include "base/files/file_path.h"
 #include "base/memory/ref_counted.h"
-#include "webkit/browser/webkit_storage_browser_export.h"
+#include "content/common/content_export.h"
 
 class GURL;
 
-namespace dom_storage {
+namespace content {
 
-class DomStorageArea;
-class DomStorageTaskRunner;
+class DOMStorageArea;
+class DOMStorageTaskRunner;
 class SessionStorageDatabase;
 
 // Container for the set of per-origin Areas.
-// See class comments for DomStorageContext for a larger overview.
-class WEBKIT_STORAGE_BROWSER_EXPORT DomStorageNamespace
-    : public base::RefCountedThreadSafe<DomStorageNamespace> {
+// See class comments for DOMStorageContextImpl for a larger overview.
+class CONTENT_EXPORT DOMStorageNamespace
+    : public base::RefCountedThreadSafe<DOMStorageNamespace> {
  public:
   // Option for PurgeMemory.
   enum PurgeOption {
@@ -37,15 +37,15 @@
 
   // Constructor for a LocalStorage namespace with id of 0
   // and an optional backing directory on disk.
-  DomStorageNamespace(const base::FilePath& directory,  // may be empty
-                      DomStorageTaskRunner* task_runner);
+  DOMStorageNamespace(const base::FilePath& directory,  // may be empty
+                      DOMStorageTaskRunner* task_runner);
 
   // Constructor for a SessionStorage namespace with a non-zero id and an
   // optional backing on disk via |session_storage_database| (may be NULL).
-  DomStorageNamespace(int64 namespace_id,
+  DOMStorageNamespace(int64 namespace_id,
                       const std::string& persistent_namespace_id,
                       SessionStorageDatabase* session_storage_database,
-                      DomStorageTaskRunner* task_runner);
+                      DOMStorageTaskRunner* task_runner);
 
   int64 namespace_id() const { return namespace_id_; }
   const std::string& persistent_namespace_id() const {
@@ -55,16 +55,16 @@
   // Returns the storage area for the given origin,
   // creating instance if needed. Each call to open
   // must be balanced with a call to CloseStorageArea.
-  DomStorageArea* OpenStorageArea(const GURL& origin);
-  void CloseStorageArea(DomStorageArea* area);
+  DOMStorageArea* OpenStorageArea(const GURL& origin);
+  void CloseStorageArea(DOMStorageArea* area);
 
   // Returns the area for |origin| if it's open, otherwise NULL.
-  DomStorageArea* GetOpenStorageArea(const GURL& origin);
+  DOMStorageArea* GetOpenStorageArea(const GURL& origin);
 
   // Creates a clone of |this| namespace including
   // shallow copies of all contained areas.
   // Should only be called for session storage namespaces.
-  DomStorageNamespace* Clone(int64 clone_namespace_id,
+  DOMStorageNamespace* Clone(int64 clone_namespace_id,
                              const std::string& clone_persistent_namespace_id);
 
   void DeleteLocalStorageOrigin(const GURL& origin);
@@ -75,20 +75,20 @@
   unsigned int CountInMemoryAreas() const;
 
  private:
-  friend class base::RefCountedThreadSafe<DomStorageNamespace>;
+  friend class base::RefCountedThreadSafe<DOMStorageNamespace>;
 
   // Struct to hold references to our contained areas and
   // to keep track of how many tabs have a given area open.
   struct AreaHolder {
-    scoped_refptr<DomStorageArea> area_;
+    scoped_refptr<DOMStorageArea> area_;
     int open_count_;
     AreaHolder();
-    AreaHolder(DomStorageArea* area, int count);
+    AreaHolder(DOMStorageArea* area, int count);
     ~AreaHolder();
   };
   typedef std::map<GURL, AreaHolder> AreaMap;
 
-  ~DomStorageNamespace();
+  ~DOMStorageNamespace();
 
   // Returns a pointer to the area holder in our map or NULL.
   AreaHolder* GetAreaHolder(const GURL& origin);
@@ -97,11 +97,11 @@
   std::string persistent_namespace_id_;
   base::FilePath directory_;
   AreaMap areas_;
-  scoped_refptr<DomStorageTaskRunner> task_runner_;
+  scoped_refptr<DOMStorageTaskRunner> task_runner_;
   scoped_refptr<SessionStorageDatabase> session_storage_database_;
 };
 
-}  // namespace dom_storage
+}  // namespace content
 
 
-#endif  // WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_NAMESPACE_H_
+#endif  // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_NAMESPACE_H_
diff --git a/webkit/browser/dom_storage/dom_storage_session.cc b/content/browser/dom_storage/dom_storage_session.cc
similarity index 61%
rename from webkit/browser/dom_storage/dom_storage_session.cc
rename to content/browser/dom_storage/dom_storage_session.cc
index 2c33ed3..7706ec8 100644
--- a/webkit/browser/dom_storage/dom_storage_session.cc
+++ b/content/browser/dom_storage/dom_storage_session.cc
@@ -1,30 +1,30 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "webkit/browser/dom_storage/dom_storage_session.h"
+#include "content/browser/dom_storage/dom_storage_session.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/tracked_objects.h"
-#include "webkit/browser/dom_storage/dom_storage_context.h"
-#include "webkit/browser/dom_storage/dom_storage_task_runner.h"
+#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_task_runner.h"
 
-namespace dom_storage {
+namespace content {
 
-DomStorageSession::DomStorageSession(DomStorageContext* context)
+DOMStorageSession::DOMStorageSession(DOMStorageContextImpl* context)
     : context_(context),
       namespace_id_(context->AllocateSessionId()),
       persistent_namespace_id_(context->AllocatePersistentSessionId()),
       should_persist_(false) {
   context->task_runner()->PostTask(
       FROM_HERE,
-      base::Bind(&DomStorageContext::CreateSessionNamespace,
+      base::Bind(&DOMStorageContextImpl::CreateSessionNamespace,
                  context_, namespace_id_, persistent_namespace_id_));
 }
 
-DomStorageSession::DomStorageSession(DomStorageContext* context,
+DOMStorageSession::DOMStorageSession(DOMStorageContextImpl* context,
                                      const std::string& persistent_namespace_id)
     : context_(context),
       namespace_id_(context->AllocateSessionId()),
@@ -32,39 +32,39 @@
       should_persist_(false) {
   context->task_runner()->PostTask(
       FROM_HERE,
-      base::Bind(&DomStorageContext::CreateSessionNamespace,
+      base::Bind(&DOMStorageContextImpl::CreateSessionNamespace,
                  context_, namespace_id_, persistent_namespace_id_));
 }
 
-void DomStorageSession::SetShouldPersist(bool should_persist) {
+void DOMStorageSession::SetShouldPersist(bool should_persist) {
   should_persist_ = should_persist;
 }
 
-bool DomStorageSession::should_persist() const {
+bool DOMStorageSession::should_persist() const {
   return should_persist_;
 }
 
-bool DomStorageSession::IsFromContext(DomStorageContext* context) {
+bool DOMStorageSession::IsFromContext(DOMStorageContextImpl* context) {
   return context_.get() == context;
 }
 
-DomStorageSession* DomStorageSession::Clone() {
+DOMStorageSession* DOMStorageSession::Clone() {
   return CloneFrom(context_.get(), namespace_id_);
 }
 
 // static
-DomStorageSession* DomStorageSession::CloneFrom(DomStorageContext* context,
+DOMStorageSession* DOMStorageSession::CloneFrom(DOMStorageContextImpl* context,
                                                 int64 namepace_id_to_clone) {
   int64 clone_id = context->AllocateSessionId();
   std::string persistent_clone_id = context->AllocatePersistentSessionId();
   context->task_runner()->PostTask(
       FROM_HERE,
-      base::Bind(&DomStorageContext::CloneSessionNamespace,
+      base::Bind(&DOMStorageContextImpl::CloneSessionNamespace,
                  context, namepace_id_to_clone, clone_id, persistent_clone_id));
-  return new DomStorageSession(context, clone_id, persistent_clone_id);
+  return new DOMStorageSession(context, clone_id, persistent_clone_id);
 }
 
-DomStorageSession::DomStorageSession(DomStorageContext* context,
+DOMStorageSession::DOMStorageSession(DOMStorageContextImpl* context,
                                      int64 namespace_id,
                                      const std::string& persistent_namespace_id)
     : context_(context),
@@ -74,11 +74,11 @@
   // This ctor is intended for use by the Clone() method.
 }
 
-DomStorageSession::~DomStorageSession() {
+DOMStorageSession::~DOMStorageSession() {
   context_->task_runner()->PostTask(
       FROM_HERE,
-      base::Bind(&DomStorageContext::DeleteSessionNamespace,
+      base::Bind(&DOMStorageContextImpl::DeleteSessionNamespace,
                  context_, namespace_id_, should_persist_));
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/content/browser/dom_storage/dom_storage_session.h b/content/browser/dom_storage/dom_storage_session.h
new file mode 100644
index 0000000..62c6d97
--- /dev/null
+++ b/content/browser/dom_storage/dom_storage_session.h
@@ -0,0 +1,65 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_SESSION_H_
+#define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_SESSION_H_
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/memory/ref_counted.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+class DOMStorageContextImpl;
+
+// This refcounted class determines the lifetime of a session
+// storage namespace and provides an interface to Clone() an
+// existing session storage namespace. It may be used on any thread.
+// See class comments for DOMStorageContextImpl for a larger overview.
+class CONTENT_EXPORT DOMStorageSession
+    : public base::RefCountedThreadSafe<DOMStorageSession> {
+ public:
+  // Constructs a |DOMStorageSession| and allocates new IDs for it.
+  explicit DOMStorageSession(DOMStorageContextImpl* context);
+
+  // Constructs a |DOMStorageSession| and assigns |persistent_namespace_id|
+  // to it. Allocates a new non-persistent ID.
+  DOMStorageSession(DOMStorageContextImpl* context,
+                    const std::string& persistent_namespace_id);
+
+  int64 namespace_id() const { return namespace_id_; }
+  const std::string& persistent_namespace_id() const {
+    return persistent_namespace_id_;
+  }
+  void SetShouldPersist(bool should_persist);
+  bool should_persist() const;
+  bool IsFromContext(DOMStorageContextImpl* context);
+  DOMStorageSession* Clone();
+
+  // Constructs a |DOMStorageSession| by cloning
+  // |namespace_id_to_clone|. Allocates new IDs for it.
+  static DOMStorageSession* CloneFrom(DOMStorageContextImpl* context,
+                                      int64 namepace_id_to_clone);
+
+ private:
+  friend class base::RefCountedThreadSafe<DOMStorageSession>;
+
+  DOMStorageSession(DOMStorageContextImpl* context,
+                    int64 namespace_id,
+                    const std::string& persistent_namespace_id);
+  ~DOMStorageSession();
+
+  scoped_refptr<DOMStorageContextImpl> context_;
+  int64 namespace_id_;
+  std::string persistent_namespace_id_;
+  bool should_persist_;
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(DOMStorageSession);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_SESSION_H_
diff --git a/webkit/browser/dom_storage/dom_storage_task_runner.cc b/content/browser/dom_storage/dom_storage_task_runner.cc
similarity index 70%
rename from webkit/browser/dom_storage/dom_storage_task_runner.cc
rename to content/browser/dom_storage/dom_storage_task_runner.cc
index e1cc2f4..aa75c3c 100644
--- a/webkit/browser/dom_storage/dom_storage_task_runner.cc
+++ b/content/browser/dom_storage/dom_storage_task_runner.cc
@@ -1,25 +1,25 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "webkit/browser/dom_storage/dom_storage_task_runner.h"
+#include "content/browser/dom_storage/dom_storage_task_runner.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/message_loop/message_loop_proxy.h"
 #include "base/tracked_objects.h"
 
-namespace dom_storage {
+namespace content {
 
-// DomStorageTaskRunner
+// DOMStorageTaskRunner
 
-bool DomStorageTaskRunner::RunsTasksOnCurrentThread() const {
+bool DOMStorageTaskRunner::RunsTasksOnCurrentThread() const {
   return IsRunningOnSequence(PRIMARY_SEQUENCE);
 }
 
-// DomStorageWorkerPoolTaskRunner
+// DOMStorageWorkerPoolTaskRunner
 
-DomStorageWorkerPoolTaskRunner::DomStorageWorkerPoolTaskRunner(
+DOMStorageWorkerPoolTaskRunner::DOMStorageWorkerPoolTaskRunner(
     base::SequencedWorkerPool* sequenced_worker_pool,
     base::SequencedWorkerPool::SequenceToken primary_sequence_token,
     base::SequencedWorkerPool::SequenceToken commit_sequence_token,
@@ -30,10 +30,10 @@
       commit_sequence_token_(commit_sequence_token) {
 }
 
-DomStorageWorkerPoolTaskRunner::~DomStorageWorkerPoolTaskRunner() {
+DOMStorageWorkerPoolTaskRunner::~DOMStorageWorkerPoolTaskRunner() {
 }
 
-bool DomStorageWorkerPoolTaskRunner::PostDelayedTask(
+bool DOMStorageWorkerPoolTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
     const base::Closure& task,
     base::TimeDelta delay) {
@@ -48,12 +48,12 @@
   // Post a task to call this->PostTask() after the delay.
   return message_loop_->PostDelayedTask(
       FROM_HERE,
-      base::Bind(base::IgnoreResult(&DomStorageWorkerPoolTaskRunner::PostTask),
+      base::Bind(base::IgnoreResult(&DOMStorageWorkerPoolTaskRunner::PostTask),
                  this, from_here, task),
       delay);
 }
 
-bool DomStorageWorkerPoolTaskRunner::PostShutdownBlockingTask(
+bool DOMStorageWorkerPoolTaskRunner::PostShutdownBlockingTask(
     const tracked_objects::Location& from_here,
     SequenceID sequence_id,
     const base::Closure& task) {
@@ -62,46 +62,46 @@
       base::SequencedWorkerPool::BLOCK_SHUTDOWN);
 }
 
-bool DomStorageWorkerPoolTaskRunner::IsRunningOnSequence(
+bool DOMStorageWorkerPoolTaskRunner::IsRunningOnSequence(
     SequenceID sequence_id) const {
   return sequenced_worker_pool_->IsRunningSequenceOnCurrentThread(
       IDtoToken(sequence_id));
 }
 
 base::SequencedWorkerPool::SequenceToken
-DomStorageWorkerPoolTaskRunner::IDtoToken(SequenceID id) const {
+DOMStorageWorkerPoolTaskRunner::IDtoToken(SequenceID id) const {
   if (id == PRIMARY_SEQUENCE)
     return primary_sequence_token_;
   DCHECK_EQ(COMMIT_SEQUENCE, id);
   return commit_sequence_token_;
 }
 
-// MockDomStorageTaskRunner
+// MockDOMStorageTaskRunner
 
-MockDomStorageTaskRunner::MockDomStorageTaskRunner(
+MockDOMStorageTaskRunner::MockDOMStorageTaskRunner(
     base::MessageLoopProxy* message_loop)
     : message_loop_(message_loop) {
 }
 
-MockDomStorageTaskRunner::~MockDomStorageTaskRunner() {
+MockDOMStorageTaskRunner::~MockDOMStorageTaskRunner() {
 }
 
-bool MockDomStorageTaskRunner::PostDelayedTask(
+bool MockDOMStorageTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
     const base::Closure& task,
     base::TimeDelta delay) {
   return message_loop_->PostTask(from_here, task);
 }
 
-bool MockDomStorageTaskRunner::PostShutdownBlockingTask(
+bool MockDOMStorageTaskRunner::PostShutdownBlockingTask(
     const tracked_objects::Location& from_here,
     SequenceID sequence_id,
     const base::Closure& task) {
   return message_loop_->PostTask(from_here, task);
 }
 
-bool MockDomStorageTaskRunner::IsRunningOnSequence(SequenceID) const {
+bool MockDOMStorageTaskRunner::IsRunningOnSequence(SequenceID) const {
   return message_loop_->RunsTasksOnCurrentThread();
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/webkit/browser/dom_storage/dom_storage_task_runner.h b/content/browser/dom_storage/dom_storage_task_runner.h
similarity index 81%
rename from webkit/browser/dom_storage/dom_storage_task_runner.h
rename to content/browser/dom_storage/dom_storage_task_runner.h
index a18bedf..1fb8a19 100644
--- a/webkit/browser/dom_storage/dom_storage_task_runner.h
+++ b/content/browser/dom_storage/dom_storage_task_runner.h
@@ -1,23 +1,23 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_
-#define WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_
+#ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_
+#define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_
 
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "base/time/time.h"
-#include "webkit/browser/webkit_storage_browser_export.h"
+#include "content/common/content_export.h"
 
 namespace base {
 class MessageLoopProxy;
 }
 
-namespace dom_storage {
+namespace content {
 
-// DomStorage uses two task sequences (primary vs commit) to avoid
+// DOMStorage uses two task sequences (primary vs commit) to avoid
 // primary access from queuing up behind commits to disk.
 // * Initialization, shutdown, and administrative tasks are performed as
 //   shutdown-blocking primary sequence tasks.
@@ -26,7 +26,7 @@
 //   TODO(michaeln): Skip tasks for reading during shutdown.
 // * Internal tasks related to committing changes to disk are performed as
 //   shutdown-blocking commit sequence tasks.
-class WEBKIT_STORAGE_BROWSER_EXPORT DomStorageTaskRunner
+class CONTENT_EXPORT DOMStorageTaskRunner
     : public base::TaskRunner {
  public:
   enum SequenceID {
@@ -61,16 +61,16 @@
   }
 
  protected:
-  virtual ~DomStorageTaskRunner() {}
+  virtual ~DOMStorageTaskRunner() {}
 };
 
 // A derived class used in chromium that utilizes a SequenceWorkerPool
 // under dom_storage specific SequenceTokens. The |delayed_task_loop|
 // is used to delay scheduling on the worker pool.
-class WEBKIT_STORAGE_BROWSER_EXPORT DomStorageWorkerPoolTaskRunner :
-      public DomStorageTaskRunner {
+class CONTENT_EXPORT DOMStorageWorkerPoolTaskRunner :
+      public DOMStorageTaskRunner {
  public:
-  DomStorageWorkerPoolTaskRunner(
+  DOMStorageWorkerPoolTaskRunner(
       base::SequencedWorkerPool* sequenced_worker_pool,
       base::SequencedWorkerPool::SequenceToken primary_sequence_token,
       base::SequencedWorkerPool::SequenceToken commit_sequence_token,
@@ -89,7 +89,7 @@
   virtual bool IsRunningOnSequence(SequenceID sequence_id) const OVERRIDE;
 
  protected:
-  virtual ~DomStorageWorkerPoolTaskRunner();
+  virtual ~DOMStorageWorkerPoolTaskRunner();
 
  private:
 
@@ -106,10 +106,10 @@
 // There is no distinction between [non]-shutdown-blocking or
 // the primary sequence vs the commit sequence in the mock,
 // all tasks are scheduled on |message_loop| with zero delay.
-class WEBKIT_STORAGE_BROWSER_EXPORT MockDomStorageTaskRunner :
-      public DomStorageTaskRunner {
+class CONTENT_EXPORT MockDOMStorageTaskRunner :
+      public DOMStorageTaskRunner {
  public:
-  explicit MockDomStorageTaskRunner(base::MessageLoopProxy* message_loop);
+  explicit MockDOMStorageTaskRunner(base::MessageLoopProxy* message_loop);
 
   virtual bool PostDelayedTask(
       const tracked_objects::Location& from_here,
@@ -124,12 +124,12 @@
   virtual bool IsRunningOnSequence(SequenceID sequence_id) const OVERRIDE;
 
  protected:
-  virtual ~MockDomStorageTaskRunner();
+  virtual ~MockDOMStorageTaskRunner();
 
  private:
   const scoped_refptr<base::MessageLoopProxy> message_loop_;
 };
 
-}  // namespace dom_storage
+}  // namespace content
 
-#endif  // WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_
+#endif  // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_
diff --git a/content/browser/dom_storage/local_storage_database_adapter.cc b/content/browser/dom_storage/local_storage_database_adapter.cc
new file mode 100644
index 0000000..f5d87e3
--- /dev/null
+++ b/content/browser/dom_storage/local_storage_database_adapter.cc
@@ -0,0 +1,40 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/dom_storage/local_storage_database_adapter.h"
+
+#include "base/file_util.h"
+#include "content/browser/dom_storage/dom_storage_database.h"
+
+namespace content {
+
+LocalStorageDatabaseAdapter::LocalStorageDatabaseAdapter(
+    const base::FilePath& path)
+    : db_(new DOMStorageDatabase(path)) {
+}
+
+LocalStorageDatabaseAdapter::~LocalStorageDatabaseAdapter() { }
+
+void LocalStorageDatabaseAdapter::ReadAllValues(DOMStorageValuesMap* result) {
+  db_->ReadAllValues(result);
+}
+
+bool LocalStorageDatabaseAdapter::CommitChanges(
+    bool clear_all_first, const DOMStorageValuesMap& changes) {
+  return db_->CommitChanges(clear_all_first, changes);
+}
+
+void LocalStorageDatabaseAdapter::DeleteFiles() {
+  sql::Connection::Delete(db_->file_path());
+}
+
+void LocalStorageDatabaseAdapter::Reset() {
+  db_.reset(new DOMStorageDatabase(db_->file_path()));
+}
+
+LocalStorageDatabaseAdapter::LocalStorageDatabaseAdapter()
+    : db_(new DOMStorageDatabase()) {
+}
+
+}  // namespace content
diff --git a/content/browser/dom_storage/local_storage_database_adapter.h b/content/browser/dom_storage/local_storage_database_adapter.h
new file mode 100644
index 0000000..1298d9c
--- /dev/null
+++ b/content/browser/dom_storage/local_storage_database_adapter.h
@@ -0,0 +1,50 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOM_STORAGE_LOCAL_STORAGE_DATABASE_ADAPTER_H_
+#define CONTENT_BROWSER_DOM_STORAGE_LOCAL_STORAGE_DATABASE_ADAPTER_H_
+
+#include "base/gtest_prod_util.h"
+#include "base/memory/scoped_ptr.h"
+#include "content/browser/dom_storage/dom_storage_database_adapter.h"
+#include "content/common/content_export.h"
+
+namespace base {
+class FilePath;
+}
+
+namespace content {
+
+class DOMStorageDatabase;
+
+class CONTENT_EXPORT LocalStorageDatabaseAdapter :
+      public DOMStorageDatabaseAdapter {
+ public:
+  explicit LocalStorageDatabaseAdapter(const base::FilePath& path);
+  virtual ~LocalStorageDatabaseAdapter();
+  virtual void ReadAllValues(DOMStorageValuesMap* result) OVERRIDE;
+  virtual bool CommitChanges(bool clear_all_first,
+                             const DOMStorageValuesMap& changes) OVERRIDE;
+  virtual void DeleteFiles() OVERRIDE;
+  virtual void Reset() OVERRIDE;
+
+ protected:
+  // Constructor that uses an in-memory sqlite database, for testing.
+  LocalStorageDatabaseAdapter();
+
+ private:
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, BackingDatabaseOpened);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, CommitChangesAtShutdown);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, CommitTasks);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, DeleteOrigin);
+  FRIEND_TEST_ALL_PREFIXES(DOMStorageAreaTest, PurgeMemory);
+
+  scoped_ptr<DOMStorageDatabase> db_;
+
+  DISALLOW_COPY_AND_ASSIGN(LocalStorageDatabaseAdapter);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_DOM_STORAGE_LOCAL_STORAGE_DATABASE_ADAPTER_H_
diff --git a/webkit/browser/dom_storage/session_storage_database.cc b/content/browser/dom_storage/session_storage_database.cc
similarity index 96%
rename from webkit/browser/dom_storage/session_storage_database.cc
rename to content/browser/dom_storage/session_storage_database.cc
index 8352a9c..bac3df7 100644
--- a/webkit/browser/dom_storage/session_storage_database.cc
+++ b/content/browser/dom_storage/session_storage_database.cc
@@ -1,8 +1,8 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "webkit/browser/dom_storage/session_storage_database.h"
+#include "content/browser/dom_storage/session_storage_database.h"
 
 #include "base/file_util.h"
 #include "base/logging.h"
@@ -49,7 +49,7 @@
 // | namespace-3-origin2            | 2 (shallow copy)                   |
 // | next-map-id                    | 4                                  |
 
-namespace dom_storage {
+namespace content {
 
 SessionStorageDatabase::SessionStorageDatabase(const base::FilePath& file_path)
     : file_path_(file_path),
@@ -62,7 +62,7 @@
 
 void SessionStorageDatabase::ReadAreaValues(const std::string& namespace_id,
                                             const GURL& origin,
-                                            ValuesMap* result) {
+                                            DOMStorageValuesMap* result) {
   // We don't create a database if it doesn't exist. In that case, there is
   // nothing to be added to the result.
   if (!LazyOpen(false))
@@ -83,10 +83,11 @@
   db_->ReleaseSnapshot(options.snapshot);
 }
 
-bool SessionStorageDatabase::CommitAreaChanges(const std::string& namespace_id,
-                                               const GURL& origin,
-                                               bool clear_all_first,
-                                               const ValuesMap& changes) {
+bool SessionStorageDatabase::CommitAreaChanges(
+    const std::string& namespace_id,
+    const GURL& origin,
+    bool clear_all_first,
+    const DOMStorageValuesMap& changes) {
   // Even if |changes| is empty, we need to write the appropriate placeholders
   // in the database, so that it can be later shallow-copied succssfully.
   if (!LazyOpen(true))
@@ -502,7 +503,7 @@
 
 bool SessionStorageDatabase::ReadMap(const std::string& map_id,
                                      const leveldb::ReadOptions& options,
-                                     ValuesMap* result,
+                                     DOMStorageValuesMap* result,
                                      bool only_keys) {
   scoped_ptr<leveldb::Iterator> it(db_->NewIterator(options));
   std::string map_start_key = MapRefCountKey(map_id);
@@ -539,9 +540,10 @@
 }
 
 void SessionStorageDatabase::WriteValuesToMap(const std::string& map_id,
-                                              const ValuesMap& values,
+                                              const DOMStorageValuesMap& values,
                                               leveldb::WriteBatch* batch) {
-  for (ValuesMap::const_iterator it = values.begin(); it != values.end();
+  for (DOMStorageValuesMap::const_iterator it = values.begin();
+       it != values.end();
        ++it) {
     base::NullableString16 value = it->second;
     std::string key = MapKey(map_id, UTF16ToUTF8(it->first));
@@ -601,10 +603,11 @@
 
 bool SessionStorageDatabase::ClearMap(const std::string& map_id,
                                       leveldb::WriteBatch* batch) {
-  ValuesMap values;
+  DOMStorageValuesMap values;
   if (!ReadMap(map_id, leveldb::ReadOptions(), &values, true))
     return false;
-  for (ValuesMap::const_iterator it = values.begin(); it != values.end(); ++it)
+  for (DOMStorageValuesMap::const_iterator it = values.begin();
+       it != values.end(); ++it)
     batch->Delete(MapKey(map_id, UTF16ToUTF8(it->first)));
   return true;
 }
@@ -632,7 +635,7 @@
 
   // Read the values from the old map here. If we don't need to copy the data,
   // this can stay empty.
-  ValuesMap values;
+  DOMStorageValuesMap values;
   if (copy_data && !ReadMap(*map_id, leveldb::ReadOptions(), &values, false))
     return false;
   if (!DecreaseMapRefCount(*map_id, 1, batch))
@@ -674,4 +677,4 @@
   return "next-map-id";
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/webkit/browser/dom_storage/session_storage_database.h b/content/browser/dom_storage/session_storage_database.h
similarity index 91%
rename from webkit/browser/dom_storage/session_storage_database.h
rename to content/browser/dom_storage/session_storage_database.h
index c442504..09d4773 100644
--- a/webkit/browser/dom_storage/session_storage_database.h
+++ b/content/browser/dom_storage/session_storage_database.h
@@ -1,9 +1,9 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef WEBKIT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_
-#define WEBKIT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_
+#ifndef CONTENT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_
+#define CONTENT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_
 
 #include <map>
 #include <string>
@@ -12,9 +12,9 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/synchronization/lock.h"
+#include "content/common/content_export.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "third_party/leveldatabase/src/include/leveldb/status.h"
-#include "webkit/browser/webkit_storage_browser_export.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
 class GURL;
 
@@ -24,16 +24,16 @@
 class WriteBatch;
 }  // namespace leveldb
 
-namespace dom_storage {
+namespace content {
 
 // SessionStorageDatabase holds the data from multiple namespaces and multiple
-// origins. All DomStorageAreas for session storage share the same
+// origins. All DOMStorageAreas for session storage share the same
 // SessionStorageDatabase.
 
 // Only one thread is allowed to call the public functions other than
 // ReadAreaValues and ReadNamespacesAndOrigins. Other threads are allowed to
 // call ReadAreaValues and ReadNamespacesAndOrigins.
-class WEBKIT_STORAGE_BROWSER_EXPORT SessionStorageDatabase :
+class CONTENT_EXPORT SessionStorageDatabase :
     public base::RefCountedThreadSafe<SessionStorageDatabase> {
  public:
   explicit SessionStorageDatabase(const base::FilePath& file_path);
@@ -44,7 +44,7 @@
   // it will not be created and |result| will be unmodified.
   void ReadAreaValues(const std::string& namespace_id,
                       const GURL& origin,
-                      ValuesMap* result);
+                      DOMStorageValuesMap* result);
 
   // Updates the data for |namespace_id| and |origin|. Will remove all keys
   // before updating the database if |clear_all_first| is set. Then all entries
@@ -55,7 +55,7 @@
   bool CommitAreaChanges(const std::string& namespace_id,
                          const GURL& origin,
                          bool clear_all_first,
-                         const ValuesMap& changes);
+                         const DOMStorageValuesMap& changes);
 
   // Creates shallow copies of the areas for |namespace_id| and associates them
   // with |new_namespace_id|.
@@ -149,11 +149,11 @@
   // be empty.
   bool ReadMap(const std::string& map_id,
                const leveldb::ReadOptions& options,
-               ValuesMap* result,
+               DOMStorageValuesMap* result,
                bool only_keys);
   // Writes |values| into the map |map_id|.
   void WriteValuesToMap(const std::string& map_id,
-                        const ValuesMap& values,
+                        const DOMStorageValuesMap& values,
                         leveldb::WriteBatch* batch);
 
   bool GetMapRefCount(const std::string& map_id, int64* ref_count);
@@ -200,6 +200,6 @@
   DISALLOW_COPY_AND_ASSIGN(SessionStorageDatabase);
 };
 
-}  // namespace dom_storage
+}  // namespace content
 
-#endif  // WEBKIT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_
+#endif  // CONTENT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_
diff --git a/webkit/browser/dom_storage/session_storage_database_adapter.cc b/content/browser/dom_storage/session_storage_database_adapter.cc
similarity index 63%
rename from webkit/browser/dom_storage/session_storage_database_adapter.cc
rename to content/browser/dom_storage/session_storage_database_adapter.cc
index 766f1cb..69f5bcd 100644
--- a/webkit/browser/dom_storage/session_storage_database_adapter.cc
+++ b/content/browser/dom_storage/session_storage_database_adapter.cc
@@ -1,12 +1,12 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "webkit/browser/dom_storage/session_storage_database_adapter.h"
+#include "content/browser/dom_storage/session_storage_database_adapter.h"
 
-#include "webkit/browser/dom_storage/session_storage_database.h"
+#include "content/browser/dom_storage/session_storage_database.h"
 
-namespace dom_storage {
+namespace content {
 
 SessionStorageDatabaseAdapter::SessionStorageDatabaseAdapter(
     SessionStorageDatabase* db,
@@ -19,14 +19,14 @@
 
 SessionStorageDatabaseAdapter::~SessionStorageDatabaseAdapter() { }
 
-void SessionStorageDatabaseAdapter::ReadAllValues(ValuesMap* result) {
+void SessionStorageDatabaseAdapter::ReadAllValues(DOMStorageValuesMap* result) {
   db_->ReadAreaValues(permanent_namespace_id_, origin_, result);
 }
 
 bool SessionStorageDatabaseAdapter::CommitChanges(
-    bool clear_all_first, const ValuesMap& changes) {
+    bool clear_all_first, const DOMStorageValuesMap& changes) {
   return db_->CommitAreaChanges(permanent_namespace_id_, origin_,
                                 clear_all_first, changes);
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/content/browser/dom_storage/session_storage_database_adapter.h b/content/browser/dom_storage/session_storage_database_adapter.h
new file mode 100644
index 0000000..9db5f17
--- /dev/null
+++ b/content/browser/dom_storage/session_storage_database_adapter.h
@@ -0,0 +1,35 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_ADAPTER_H_
+#define CONTENT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_ADAPTER_H_
+
+#include "base/memory/ref_counted.h"
+#include "content/browser/dom_storage/dom_storage_database_adapter.h"
+#include "url/gurl.h"
+
+namespace content {
+
+class SessionStorageDatabase;
+
+class SessionStorageDatabaseAdapter : public DOMStorageDatabaseAdapter {
+ public:
+  SessionStorageDatabaseAdapter(SessionStorageDatabase* db,
+                                const std::string& permanent_namespace_id,
+                                const GURL& origin);
+  virtual ~SessionStorageDatabaseAdapter();
+  virtual void ReadAllValues(DOMStorageValuesMap* result) OVERRIDE;
+  virtual bool CommitChanges(bool clear_all_first,
+                             const DOMStorageValuesMap& changes) OVERRIDE;
+ private:
+  scoped_refptr<SessionStorageDatabase> db_;
+  std::string permanent_namespace_id_;
+  GURL origin_;
+
+  DISALLOW_COPY_AND_ASSIGN(SessionStorageDatabaseAdapter);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_ADAPTER_H_
diff --git a/webkit/browser/dom_storage/session_storage_database_unittest.cc b/content/browser/dom_storage/session_storage_database_unittest.cc
similarity index 92%
rename from webkit/browser/dom_storage/session_storage_database_unittest.cc
rename to content/browser/dom_storage/session_storage_database_unittest.cc
index 127b183..9722d72 100644
--- a/webkit/browser/dom_storage/session_storage_database_unittest.cc
+++ b/content/browser/dom_storage/session_storage_database_unittest.cc
@@ -1,9 +1,9 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 
-#include "webkit/browser/dom_storage/session_storage_database.h"
+#include "content/browser/dom_storage/session_storage_database.h"
 
 #include <algorithm>
 #include <map>
@@ -14,14 +14,14 @@
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/leveldatabase/src/include/leveldb/db.h"
 #include "third_party/leveldatabase/src/include/leveldb/iterator.h"
 #include "third_party/leveldatabase/src/include/leveldb/options.h"
 #include "url/gurl.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
-namespace dom_storage {
+namespace content {
 
 class SessionStorageDatabaseTest : public testing::Test {
  public:
@@ -48,8 +48,9 @@
   void DumpData() const;
   void CheckAreaData(const std::string& namespace_id,
                      const GURL& origin,
-                     const ValuesMap& reference) const;
-  void CompareValuesMaps(const ValuesMap& map1, const ValuesMap& map2) const;
+                     const DOMStorageValuesMap& reference) const;
+  void CompareValuesMaps(const DOMStorageValuesMap& map1,
+                         const DOMStorageValuesMap& map2) const;
   void CheckNamespaceIds(
       const std::set<std::string>& expected_namespace_ids) const;
   void CheckOrigins(
@@ -316,17 +317,18 @@
 
 void SessionStorageDatabaseTest::CheckAreaData(
     const std::string& namespace_id, const GURL& origin,
-    const ValuesMap& reference) const {
-  ValuesMap values;
+    const DOMStorageValuesMap& reference) const {
+  DOMStorageValuesMap values;
   db_->ReadAreaValues(namespace_id, origin, &values);
   CompareValuesMaps(values, reference);
 }
 
 void SessionStorageDatabaseTest::CompareValuesMaps(
-    const ValuesMap& map1,
-    const ValuesMap& map2) const {
+    const DOMStorageValuesMap& map1,
+    const DOMStorageValuesMap& map2) const {
   ASSERT_EQ(map2.size(), map1.size());
-  for (ValuesMap::const_iterator it = map1.begin(); it != map1.end(); ++it) {
+  for (DOMStorageValuesMap::const_iterator it = map1.begin();
+       it != map1.end(); ++it) {
     base::string16 key = it->first;
     ASSERT_TRUE(map2.find(key) != map2.end());
     base::NullableString16 val1 = it->second;
@@ -386,10 +388,10 @@
 
 TEST_F(SessionStorageDatabaseTest, WriteDataForOneOrigin) {
   // Keep track on what the values should look like.
-  ValuesMap reference;
+  DOMStorageValuesMap reference;
   // Write data.
   {
-    ValuesMap changes;
+    DOMStorageValuesMap changes;
     changes[kKey1] = kValue1;
     changes[kKey2] = kValue2;
     changes[kKey3] = kValue3;
@@ -403,7 +405,7 @@
 
   // Overwrite and delete values.
   {
-    ValuesMap changes;
+    DOMStorageValuesMap changes;
     changes[kKey1] = kValue4;
     changes[kKey3] = kValueNull;
     reference[kKey1] = kValue4;
@@ -415,7 +417,7 @@
 
   // Clear data before writing.
   {
-    ValuesMap changes;
+    DOMStorageValuesMap changes;
     changes[kKey2] = kValue2;
     reference.erase(kKey1);
     reference[kKey2] = kValue2;
@@ -427,13 +429,13 @@
 
 TEST_F(SessionStorageDatabaseTest, WriteDataForTwoOrigins) {
   // Write data.
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   data1[kKey2] = kValue2;
   data1[kKey3] = kValue3;
   EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
 
-  ValuesMap data2;
+  DOMStorageValuesMap data2;
   data2[kKey1] = kValue4;
   data2[kKey2] = kValue1;
   data2[kKey3] = kValue2;
@@ -446,20 +448,20 @@
 
 TEST_F(SessionStorageDatabaseTest, WriteDataForTwoNamespaces) {
   // Write data.
-  ValuesMap data11;
+  DOMStorageValuesMap data11;
   data11[kKey1] = kValue1;
   data11[kKey2] = kValue2;
   data11[kKey3] = kValue3;
   EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data11));
-  ValuesMap data12;
+  DOMStorageValuesMap data12;
   data12[kKey2] = kValue4;
   data12[kKey3] = kValue3;
   EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data12));
-  ValuesMap data21;
+  DOMStorageValuesMap data21;
   data21[kKey1] = kValue2;
   data21[kKey2] = kValue4;
   EXPECT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin1, false, data21));
-  ValuesMap data22;
+  DOMStorageValuesMap data22;
   data22[kKey2] = kValue1;
   data22[kKey3] = kValue2;
   EXPECT_TRUE(db_->CommitAreaChanges(kNamespace2, kOrigin2, false, data22));
@@ -472,12 +474,12 @@
 
 TEST_F(SessionStorageDatabaseTest, ShallowCopy) {
   // Write data for a namespace, for 2 origins.
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   data1[kKey2] = kValue2;
   data1[kKey3] = kValue3;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
-  ValuesMap data2;
+  DOMStorageValuesMap data2;
   data2[kKey1] = kValue2;
   data2[kKey3] = kValue1;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
@@ -499,15 +501,15 @@
 }
 
 TEST_F(SessionStorageDatabaseTest, WriteIntoShallowCopy) {
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   data1[kKey2] = kValue2;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
   EXPECT_TRUE(db_->CloneNamespace(kNamespace1, kNamespaceClone));
 
   // Write data into a shallow copy.
-  ValuesMap changes;
-  ValuesMap reference;
+  DOMStorageValuesMap changes;
+  DOMStorageValuesMap reference;
   changes[kKey1] = kValueNull;
   changes[kKey2] = kValue4;
   changes[kKey3] = kValue4;
@@ -530,12 +532,12 @@
 
 TEST_F(SessionStorageDatabaseTest, ManyShallowCopies) {
   // Write data for a namespace, for 2 origins.
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   data1[kKey2] = kValue2;
   data1[kKey3] = kValue3;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
-  ValuesMap data2;
+  DOMStorageValuesMap data2;
   data2[kKey1] = kValue2;
   data2[kKey3] = kValue1;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
@@ -580,7 +582,7 @@
 }
 
 TEST_F(SessionStorageDatabaseTest, DisassociateShallowCopy) {
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   data1[kKey2] = kValue2;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
@@ -591,8 +593,8 @@
   CheckDatabaseConsistency();
 
   // Now new data can be written to that map.
-  ValuesMap reference;
-  ValuesMap changes;
+  DOMStorageValuesMap reference;
+  DOMStorageValuesMap changes;
   changes[kKey1] = kValueNull;
   changes[kKey2] = kValue4;
   changes[kKey3] = kValue4;
@@ -609,12 +611,12 @@
 }
 
 TEST_F(SessionStorageDatabaseTest, DeleteNamespace) {
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   data1[kKey2] = kValue2;
   data1[kKey3] = kValue3;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
-  ValuesMap data2;
+  DOMStorageValuesMap data2;
   data2[kKey2] = kValue4;
   data2[kKey3] = kValue3;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
@@ -625,12 +627,12 @@
 
 TEST_F(SessionStorageDatabaseTest, DeleteNamespaceWithShallowCopy) {
   // Write data for a namespace, for 2 origins.
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   data1[kKey2] = kValue2;
   data1[kKey3] = kValue3;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
-  ValuesMap data2;
+  DOMStorageValuesMap data2;
   data2[kKey1] = kValue2;
   data2[kKey3] = kValue1;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
@@ -641,8 +643,8 @@
 
   // The original namespace has no data.
   CheckDatabaseConsistency();
-  CheckAreaData(kNamespace1, kOrigin1, ValuesMap());
-  CheckAreaData(kNamespace1, kOrigin2, ValuesMap());
+  CheckAreaData(kNamespace1, kOrigin1, DOMStorageValuesMap());
+  CheckAreaData(kNamespace1, kOrigin2, DOMStorageValuesMap());
   // But the copy persists.
   CheckAreaData(kNamespaceClone, kOrigin1, data1);
   CheckAreaData(kNamespaceClone, kOrigin2, data2);
@@ -650,12 +652,12 @@
 
 TEST_F(SessionStorageDatabaseTest, DeleteArea) {
   // Write data for a namespace, for 2 origins.
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   data1[kKey2] = kValue2;
   data1[kKey3] = kValue3;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
-  ValuesMap data2;
+  DOMStorageValuesMap data2;
   data2[kKey1] = kValue2;
   data2[kKey3] = kValue1;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
@@ -665,17 +667,17 @@
   // The data for the non-deleted origin persists.
   CheckAreaData(kNamespace1, kOrigin1, data1);
   // The data for the deleted origin is gone.
-  CheckAreaData(kNamespace1, kOrigin2, ValuesMap());
+  CheckAreaData(kNamespace1, kOrigin2, DOMStorageValuesMap());
 }
 
 TEST_F(SessionStorageDatabaseTest, DeleteAreaWithShallowCopy) {
   // Write data for a namespace, for 2 origins.
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   data1[kKey2] = kValue2;
   data1[kKey3] = kValue3;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
-  ValuesMap data2;
+  DOMStorageValuesMap data2;
   data2[kKey1] = kValue2;
   data2[kKey3] = kValue1;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
@@ -686,7 +688,7 @@
   CheckDatabaseConsistency();
 
   // The original namespace has data for only the non-deleted origin.
-  CheckAreaData(kNamespace1, kOrigin1, ValuesMap());
+  CheckAreaData(kNamespace1, kOrigin1, DOMStorageValuesMap());
   CheckAreaData(kNamespace1, kOrigin2, data2);
   // But the copy persists.
   CheckAreaData(kNamespaceClone, kOrigin1, data1);
@@ -696,13 +698,13 @@
 TEST_F(SessionStorageDatabaseTest, WriteRawBytes) {
   // Write data which is not valid utf8 and contains null bytes.
   unsigned char raw_data[10] = {255, 0, 0, 0, 1, 2, 3, 4, 5, 0};
-  ValuesMap changes;
+  DOMStorageValuesMap changes;
   base::string16 string_with_raw_data;
   string_with_raw_data.assign(reinterpret_cast<char16*>(raw_data), 5);
   changes[kKey1] = base::NullableString16(string_with_raw_data, false);
   EXPECT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, changes));
   CheckDatabaseConsistency();
-  ValuesMap values;
+  DOMStorageValuesMap values;
   db_->ReadAreaValues(kNamespace1, kOrigin1, &values);
   const unsigned char* data =
       reinterpret_cast<const unsigned char*>(values[kKey1].string().data());
@@ -714,7 +716,7 @@
   // Regression test for a bug where a namespace with id 10 prevented deleting
   // the namespace with id 1.
 
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   ASSERT_TRUE(db_->CommitAreaChanges("foobar", kOrigin1, false, data1));
   ASSERT_TRUE(db_->CommitAreaChanges("foobarbaz", kOrigin1, false, data1));
@@ -724,7 +726,7 @@
 }
 
 TEST_F(SessionStorageDatabaseTest, ReadNamespaceIds) {
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   data1[kKey2] = kValue2;
   data1[kKey3] = kValue3;
@@ -751,7 +753,7 @@
 }
 
 TEST_F(SessionStorageDatabaseTest, ReadOriginsInNamespace) {
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   data1[kKey2] = kValue2;
   data1[kKey3] = kValue3;
@@ -780,10 +782,10 @@
 
 TEST_F(SessionStorageDatabaseTest, DeleteAllOrigins) {
   // Write data for a namespace, for 2 origins.
-  ValuesMap data1;
+  DOMStorageValuesMap data1;
   data1[kKey1] = kValue1;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin1, false, data1));
-  ValuesMap data2;
+  DOMStorageValuesMap data2;
   data2[kKey1] = kValue2;
   ASSERT_TRUE(db_->CommitAreaChanges(kNamespace1, kOrigin2, false, data2));
 
@@ -794,4 +796,4 @@
 }
 
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/content/browser/dom_storage/session_storage_namespace_impl.cc b/content/browser/dom_storage/session_storage_namespace_impl.cc
index fb46a31..a1f7f2d 100644
--- a/content/browser/dom_storage/session_storage_namespace_impl.cc
+++ b/content/browser/dom_storage/session_storage_namespace_impl.cc
@@ -4,28 +4,25 @@
 
 #include "content/browser/dom_storage/session_storage_namespace_impl.h"
 
-#include "content/browser/dom_storage/dom_storage_context_impl.h"
-#include "webkit/browser/dom_storage/dom_storage_session.h"
-
-using dom_storage::DomStorageContext;
-using dom_storage::DomStorageSession;
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
+#include "content/browser/dom_storage/dom_storage_session.h"
 
 namespace content {
 
 SessionStorageNamespaceImpl::SessionStorageNamespaceImpl(
-    DOMStorageContextImpl* context)
-    : session_(new DomStorageSession(context->context())) {
+    DOMStorageContextWrapper* context)
+    : session_(new DOMStorageSession(context->context())) {
 }
 
 SessionStorageNamespaceImpl::SessionStorageNamespaceImpl(
-    DOMStorageContextImpl* context, int64 namepace_id_to_clone)
-    : session_(DomStorageSession::CloneFrom(context->context(),
+    DOMStorageContextWrapper* context, int64 namepace_id_to_clone)
+    : session_(DOMStorageSession::CloneFrom(context->context(),
                                             namepace_id_to_clone)) {
 }
 
 SessionStorageNamespaceImpl::SessionStorageNamespaceImpl(
-    DOMStorageContextImpl* context, const std::string& persistent_id)
-    : session_(new DomStorageSession(context->context(), persistent_id)) {
+    DOMStorageContextWrapper* context, const std::string& persistent_id)
+    : session_(new DOMStorageSession(context->context(), persistent_id)) {
 }
 
 int64 SessionStorageNamespaceImpl::id() const {
@@ -49,12 +46,12 @@
 }
 
 bool SessionStorageNamespaceImpl::IsFromContext(
-    DOMStorageContextImpl* context) {
+    DOMStorageContextWrapper* context) {
   return session_->IsFromContext(context->context());
 }
 
 SessionStorageNamespaceImpl::SessionStorageNamespaceImpl(
-    DomStorageSession* clone)
+    DOMStorageSession* clone)
     : session_(clone) {
 }
 
diff --git a/content/browser/dom_storage/session_storage_namespace_impl.h b/content/browser/dom_storage/session_storage_namespace_impl.h
index edae801..d741848 100644
--- a/content/browser/dom_storage/session_storage_namespace_impl.h
+++ b/content/browser/dom_storage/session_storage_namespace_impl.h
@@ -10,12 +10,10 @@
 #include "content/common/content_export.h"
 #include "content/public/browser/session_storage_namespace.h"
 
-namespace dom_storage {
-class DomStorageSession;
-}
-
 namespace content {
-class DOMStorageContextImpl;
+
+class DOMStorageContextWrapper;
+class DOMStorageSession;
 
 class SessionStorageNamespaceImpl
     : NON_EXPORTED_BASE(public SessionStorageNamespace) {
@@ -24,16 +22,16 @@
   //
   // The CONTENT_EXPORT allows TestRenderViewHost to instantiate these.
   CONTENT_EXPORT explicit SessionStorageNamespaceImpl(
-      DOMStorageContextImpl* context);
+      DOMStorageContextWrapper* context);
 
   // Constructs a |SessionStorageNamespaceImpl| by cloning
   // |namespace_to_clone|. Allocates new IDs for it.
-  SessionStorageNamespaceImpl(DOMStorageContextImpl* context,
+  SessionStorageNamespaceImpl(DOMStorageContextWrapper* context,
                               int64 namepace_id_to_clone);
 
   // Constructs a |SessionStorageNamespaceImpl| and assigns |persistent_id|
   // to it. Allocates a new non-persistent ID.
-  SessionStorageNamespaceImpl(DOMStorageContextImpl* context,
+  SessionStorageNamespaceImpl(DOMStorageContextWrapper* context,
                               const std::string& persistent_id);
 
   // SessionStorageNamespace implementation.
@@ -43,13 +41,13 @@
   virtual bool should_persist() const OVERRIDE;
 
   SessionStorageNamespaceImpl* Clone();
-  bool IsFromContext(DOMStorageContextImpl* context);
+  bool IsFromContext(DOMStorageContextWrapper* context);
 
  private:
-  explicit SessionStorageNamespaceImpl(dom_storage::DomStorageSession* clone);
+  explicit SessionStorageNamespaceImpl(DOMStorageSession* clone);
   virtual ~SessionStorageNamespaceImpl();
 
-  scoped_refptr<dom_storage::DomStorageSession> session_;
+  scoped_refptr<DOMStorageSession> session_;
 
   DISALLOW_COPY_AND_ASSIGN(SessionStorageNamespaceImpl);
 };
diff --git a/content/browser/media/webrtc_browsertest.cc b/content/browser/media/webrtc_browsertest.cc
index 8ab977d..58b3d3f 100644
--- a/content/browser/media/webrtc_browsertest.cc
+++ b/content/browser/media/webrtc_browsertest.cc
@@ -282,4 +282,14 @@
     ExpectTitle("OK");
   }
 }
+
+IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, AddTwoMediaStreamsToOnePC) {
+  GURL url(embedded_test_server()->GetURL("/media/peerconnection-call.html"));
+  NavigateToURL(shell(), url);
+
+  EXPECT_TRUE(
+      ExecuteJavascript("addTwoMediaStreamsToOneConnection();"));
+  ExpectTitle("OK");
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/java/java_bridge_dispatcher_host.cc b/content/browser/renderer_host/java/java_bridge_dispatcher_host.cc
index eeb8d96..95a1c6a 100644
--- a/content/browser/renderer_host/java/java_bridge_dispatcher_host.cc
+++ b/content/browser/renderer_host/java/java_bridge_dispatcher_host.cc
@@ -4,9 +4,9 @@
 
 #include "content/browser/renderer_host/java/java_bridge_dispatcher_host.h"
 
+#include "base/android/java_handler_thread.h"
 #include "base/bind.h"
 #include "base/lazy_instance.h"
-#include "base/threading/thread.h"
 #include "content/browser/renderer_host/java/java_bridge_channel_host.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
 #include "content/child/child_process.h"
@@ -17,12 +17,18 @@
 #include "content/public/browser/render_process_host.h"
 #include "third_party/WebKit/public/web/WebBindings.h"
 
+#if !defined(OS_ANDROID)
+#error "JavaBridge currently only supports OS_ANDROID"
+#endif
+
 namespace content {
 
 namespace {
-class JavaBridgeThread : public base::Thread {
+// The JavaBridge needs to use a Java thread so the callback
+// will happen on a thread with a prepared Looper.
+class JavaBridgeThread : public base::android::JavaHandlerThread {
  public:
-  JavaBridgeThread() : base::Thread("JavaBridge") {
+  JavaBridgeThread() : base::android::JavaHandlerThread("JavaBridge") {
     Start();
   }
   virtual ~JavaBridgeThread() {
diff --git a/content/browser/renderer_host/media/audio_input_renderer_host.cc b/content/browser/renderer_host/media/audio_input_renderer_host.cc
index 37d93ef..4a2f731 100644
--- a/content/browser/renderer_host/media/audio_input_renderer_host.cc
+++ b/content/browser/renderer_host/media/audio_input_renderer_host.cc
@@ -15,10 +15,6 @@
 #include "content/browser/renderer_host/media/web_contents_capture_util.h"
 #include "media/audio/audio_manager_base.h"
 
-#if defined(USE_CRAS)
-#include "media/audio/cras/audio_manager_cras.h"
-#endif
-
 namespace content {
 
 struct AudioInputRendererHost::AudioEntry {
@@ -241,18 +237,7 @@
       return;
     }
 
-    if (info->device.type == content::MEDIA_SYSTEM_AUDIO_CAPTURE) {
-#if defined(USE_CRAS)
-      // Use the special loopback device ID for system audio capture.
-      device_id = media::AudioManagerCras::kLoopbackDeviceId;
-#else
-      SendErrorMessage(stream_id);
-      DLOG(WARNING) << "Loopback device is not supported on this platform";
-      return;
-#endif
-    } else {
-      device_id = info->device.id;
-    }
+    device_id = info->device.id;
   }
 
   // Create a new AudioEntry structure.
diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc
index 98959a8..e4cb17c 100644
--- a/content/browser/renderer_host/render_message_filter.cc
+++ b/content/browser/renderer_host/render_message_filter.cc
@@ -16,7 +16,7 @@
 #include "base/threading/worker_pool.h"
 #include "content/browser/browser_main_loop.h"
 #include "content/browser/child_process_security_policy_impl.h"
-#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
 #include "content/browser/dom_storage/session_storage_namespace_impl.h"
 #include "content/browser/download/download_stats.h"
 #include "content/browser/gpu/gpu_data_manager_impl.h"
@@ -295,7 +295,7 @@
     RenderWidgetHelper* render_widget_helper,
     media::AudioManager* audio_manager,
     MediaInternals* media_internals,
-    DOMStorageContextImpl* dom_storage_context)
+    DOMStorageContextWrapper* dom_storage_context)
     : resource_dispatcher_host_(ResourceDispatcherHostImpl::Get()),
       plugin_service_(plugin_service),
       profile_data_directory_(browser_context->GetPath()),
diff --git a/content/browser/renderer_host/render_message_filter.h b/content/browser/renderer_host/render_message_filter.h
index 3037c07..4eb9864 100644
--- a/content/browser/renderer_host/render_message_filter.h
+++ b/content/browser/renderer_host/render_message_filter.h
@@ -66,7 +66,7 @@
 
 namespace content {
 class BrowserContext;
-class DOMStorageContextImpl;
+class DOMStorageContextWrapper;
 class MediaInternals;
 class PluginServiceImpl;
 class RenderWidgetHelper;
@@ -88,7 +88,7 @@
                       RenderWidgetHelper* render_widget_helper,
                       media::AudioManager* audio_manager,
                       MediaInternals* media_internals,
-                      DOMStorageContextImpl* dom_storage_context);
+                      DOMStorageContextWrapper* dom_storage_context);
 
   // IPC::ChannelProxy::MessageFilter methods:
   virtual void OnChannelClosing() OVERRIDE;
@@ -284,7 +284,7 @@
   // Initialized to 0, accessed on FILE thread only.
   base::TimeTicks last_plugin_refresh_time_;
 
-  scoped_refptr<DOMStorageContextImpl> dom_storage_context_;
+  scoped_refptr<DOMStorageContextWrapper> dom_storage_context_;
 
   int render_process_id_;
 
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 36acbd9..d3ba06e 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -46,7 +46,7 @@
 #include "content/browser/device_orientation/device_motion_message_filter.h"
 #include "content/browser/device_orientation/device_orientation_message_filter.h"
 #include "content/browser/device_orientation/orientation_message_filter.h"
-#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
 #include "content/browser/dom_storage/dom_storage_message_filter.h"
 #include "content/browser/download/mhtml_generation_manager.h"
 #include "content/browser/fileapi/chrome_blob_storage_context.h"
@@ -977,9 +977,6 @@
     switches::kDefaultTileHeight,
     switches::kMaxUntiledLayerWidth,
     switches::kMaxUntiledLayerHeight,
-#if defined(OS_CHROMEOS)
-    switches::kEnableEncodedScreenCapture,
-#endif
     switches::kEnableViewport,
     switches::kEnableInbandTextTracks,
     switches::kEnableOpusPlayback,
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 647f4cf..56801c0 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -1520,16 +1520,15 @@
     const string16& message,
     int32 line_no,
     const string16& source_id) {
-  if (!delegate_->AddMessageToConsole(level, message, line_no, source_id)) {
-    // Pass through log level only on WebUI pages to limit console spew.
-    int32 resolved_level = HasWebUIScheme(delegate_->GetURL()) ? level : 0;
-    if (resolved_level >= ::logging::GetMinLogLevel()) {
-      logging::LogMessage("CONSOLE", line_no, resolved_level).stream() <<
-          "\"" << message << "\", source: " << source_id <<
-          " (" << line_no << ")";
-    }
+  if (delegate_->AddMessageToConsole(level, message, line_no, source_id))
+    return;
+  // Pass through log level only on WebUI pages to limit console spew.
+  int32 resolved_level = HasWebUIScheme(delegate_->GetURL()) ? level : 0;
+
+  if (resolved_level >= ::logging::GetMinLogLevel()) {
+    logging::LogMessage("CONSOLE", line_no, resolved_level).stream() << "\"" <<
+        message << "\", source: " << source_id << " (" << line_no << ")";
   }
-  Send(new ViewMsg_AddMessageToConsole_ACK(GetRoutingID()));
 }
 
 void RenderViewHostImpl::AddObserver(RenderViewHostObserver* observer) {
diff --git a/content/browser/renderer_host/test_render_view_host.cc b/content/browser/renderer_host/test_render_view_host.cc
index a395093..56be05c 100644
--- a/content/browser/renderer_host/test_render_view_host.cc
+++ b/content/browser/renderer_host/test_render_view_host.cc
@@ -4,10 +4,11 @@
 
 #include "content/browser/renderer_host/test_render_view_host.h"
 
-#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
 #include "content/browser/dom_storage/session_storage_namespace_impl.h"
 #include "content/browser/renderer_host/test_backing_store.h"
 #include "content/browser/site_instance_impl.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "content/common/view_messages.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/navigation_controller.h"
@@ -18,7 +19,6 @@
 #include "content/test/test_web_contents.h"
 #include "media/base/video_frame.h"
 #include "ui/gfx/rect.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 #include "webkit/common/webpreferences.h"
 
 namespace content {
diff --git a/content/browser/speech/speech_recognizer_impl.cc b/content/browser/speech/speech_recognizer_impl.cc
index 31f0e62..2081b2f 100644
--- a/content/browser/speech/speech_recognizer_impl.cc
+++ b/content/browser/speech/speech_recognizer_impl.cc
@@ -511,7 +511,6 @@
 
   int chunk_duration_ms = recognition_engine_->GetDesiredAudioChunkDurationMs();
 
-  // TODO(xians): use the correct input device here.
   AudioParameters in_params = audio_manager->GetInputStreamParameters(
       device_id_);
   if (!in_params.IsValid() && !unit_test_is_active) {
@@ -564,7 +563,6 @@
   audio_converter_.reset(
       new OnDataConverter(input_parameters, output_parameters));
 
-  // TODO(xians): use the correct input device here.
   audio_controller_ = AudioInputController::Create(
       audio_manager, this, input_parameters, device_id_);
 
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index e58ac42..1775b5f 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -9,10 +9,13 @@
 #include "content/browser/browser_main_loop.h"
 #include "content/browser/fileapi/browser_file_system_helper.h"
 #include "content/browser/gpu/shader_disk_cache.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/dom_storage_context.h"
 #include "content/public/browser/indexed_db_context.h"
+#include "content/public/browser/local_storage_usage_info.h"
+#include "content/public/browser/session_storage_usage_info.h"
 #include "net/base/completion_callback.h"
 #include "net/base/net_errors.h"
 #include "net/cookies/cookie_monster.h"
@@ -20,7 +23,6 @@
 #include "net/url_request/url_request_context_getter.h"
 #include "webkit/browser/database/database_tracker.h"
 #include "webkit/browser/quota/quota_manager.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
 namespace content {
 
@@ -143,11 +145,11 @@
 }
 
 void OnLocalStorageUsageInfo(
-    const scoped_refptr<DOMStorageContextImpl>& dom_storage_context,
+    const scoped_refptr<DOMStorageContextWrapper>& dom_storage_context,
     const base::Time delete_begin,
     const base::Time delete_end,
     const base::Closure& callback,
-    const std::vector<dom_storage::LocalStorageUsageInfo>& infos) {
+    const std::vector<LocalStorageUsageInfo>& infos) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
   for (size_t i = 0; i < infos.size(); ++i) {
@@ -160,9 +162,9 @@
 }
 
 void OnSessionStorageUsageInfo(
-    const scoped_refptr<DOMStorageContextImpl>& dom_storage_context,
+    const scoped_refptr<DOMStorageContextWrapper>& dom_storage_context,
     const base::Closure& callback,
-    const std::vector<dom_storage::SessionStorageUsageInfo>& infos) {
+    const std::vector<SessionStorageUsageInfo>& infos) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
   for (size_t i = 0; i < infos.size(); ++i)
@@ -172,7 +174,7 @@
 }
 
 void ClearLocalStorageOnUIThread(
-    const scoped_refptr<DOMStorageContextImpl>& dom_storage_context,
+    const scoped_refptr<DOMStorageContextWrapper>& dom_storage_context,
     const GURL& remove_origin,
     const base::Time begin,
     const base::Time end,
@@ -191,7 +193,7 @@
 }
 
 void ClearSessionStorageOnUIThread(
-    const scoped_refptr<DOMStorageContextImpl>& dom_storage_context,
+    const scoped_refptr<DOMStorageContextWrapper>& dom_storage_context,
     const base::Closure& callback) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
@@ -248,7 +250,7 @@
                            const GURL& remove_origin,
                            const base::FilePath& path,
                            net::URLRequestContextGetter* rq_context,
-                           DOMStorageContextImpl* dom_storage_context,
+                           DOMStorageContextWrapper* dom_storage_context,
                            quota::QuotaManager* quota_manager,
                            const base::Time begin,
                            const base::Time end);
@@ -280,7 +282,7 @@
     ChromeAppCacheService* appcache_service,
     fileapi::FileSystemContext* filesystem_context,
     webkit_database::DatabaseTracker* database_tracker,
-    DOMStorageContextImpl* dom_storage_context,
+    DOMStorageContextWrapper* dom_storage_context,
     IndexedDBContextImpl* indexed_db_context,
     scoped_ptr<WebRTCIdentityStore> webrtc_identity_store)
     : partition_path_(partition_path),
@@ -345,8 +347,8 @@
               .get());
 
   base::FilePath path = in_memory ? base::FilePath() : partition_path;
-  scoped_refptr<DOMStorageContextImpl> dom_storage_context =
-      new DOMStorageContextImpl(path, context->GetSpecialStoragePolicy());
+  scoped_refptr<DOMStorageContextWrapper> dom_storage_context =
+      new DOMStorageContextWrapper(path, context->GetSpecialStoragePolicy());
 
   // BrowserMainLoop may not be initialized in unit tests. Tests will
   // need to inject their own task runner into the IndexedDBContext.
@@ -407,7 +409,7 @@
   return database_tracker_.get();
 }
 
-DOMStorageContextImpl* StoragePartitionImpl::GetDOMStorageContext() {
+DOMStorageContextWrapper* StoragePartitionImpl::GetDOMStorageContext() {
   return dom_storage_context_.get();
 }
 
@@ -542,7 +544,7 @@
     const GURL& remove_origin,
     const base::FilePath& path,
     net::URLRequestContextGetter* rq_context,
-    DOMStorageContextImpl* dom_storage_context,
+    DOMStorageContextWrapper* dom_storage_context,
     quota::QuotaManager* quota_manager,
     const base::Time begin,
     const base::Time end) {
diff --git a/content/browser/storage_partition_impl.h b/content/browser/storage_partition_impl.h
index 0410f4d..8665a74 100644
--- a/content/browser/storage_partition_impl.h
+++ b/content/browser/storage_partition_impl.h
@@ -9,7 +9,7 @@
 #include "base/files/file_path.h"
 #include "base/memory/ref_counted.h"
 #include "content/browser/appcache/chrome_appcache_service.h"
-#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
 #include "content/browser/indexed_db/indexed_db_context_impl.h"
 #include "content/browser/media/webrtc_identity_store.h"
 #include "content/common/content_export.h"
@@ -29,7 +29,7 @@
   virtual ChromeAppCacheService* GetAppCacheService() OVERRIDE;
   virtual fileapi::FileSystemContext* GetFileSystemContext() OVERRIDE;
   virtual webkit_database::DatabaseTracker* GetDatabaseTracker() OVERRIDE;
-  virtual DOMStorageContextImpl* GetDOMStorageContext() OVERRIDE;
+  virtual DOMStorageContextWrapper* GetDOMStorageContext() OVERRIDE;
   virtual IndexedDBContextImpl* GetIndexedDBContext() OVERRIDE;
 
   virtual void ClearDataForOrigin(
@@ -75,7 +75,7 @@
       ChromeAppCacheService* appcache_service,
       fileapi::FileSystemContext* filesystem_context,
       webkit_database::DatabaseTracker* database_tracker,
-      DOMStorageContextImpl* dom_storage_context,
+      DOMStorageContextWrapper* dom_storage_context,
       IndexedDBContextImpl* indexed_db_context,
       scoped_ptr<WebRTCIdentityStore> webrtc_identity_store);
 
@@ -110,7 +110,7 @@
   scoped_refptr<ChromeAppCacheService> appcache_service_;
   scoped_refptr<fileapi::FileSystemContext> filesystem_context_;
   scoped_refptr<webkit_database::DatabaseTracker> database_tracker_;
-  scoped_refptr<DOMStorageContextImpl> dom_storage_context_;
+  scoped_refptr<DOMStorageContextWrapper> dom_storage_context_;
   scoped_refptr<IndexedDBContextImpl> indexed_db_context_;
   scoped_ptr<WebRTCIdentityStore> webrtc_identity_store_;
 
diff --git a/content/browser/web_contents/interstitial_page_impl.cc b/content/browser/web_contents/interstitial_page_impl.cc
index f08b0c9..232217d 100644
--- a/content/browser/web_contents/interstitial_page_impl.cc
+++ b/content/browser/web_contents/interstitial_page_impl.cc
@@ -12,7 +12,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread.h"
-#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
 #include "content/browser/dom_storage/session_storage_namespace_impl.h"
 #include "content/browser/loader/resource_dispatcher_host_impl.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
@@ -490,9 +490,10 @@
   BrowserContext* browser_context = web_contents()->GetBrowserContext();
   scoped_refptr<SiteInstance> site_instance =
       SiteInstance::Create(browser_context);
-  DOMStorageContextImpl* dom_storage_context =
-      static_cast<DOMStorageContextImpl*>(BrowserContext::GetStoragePartition(
-          browser_context, site_instance.get())->GetDOMStorageContext());
+  DOMStorageContextWrapper* dom_storage_context =
+      static_cast<DOMStorageContextWrapper*>(
+          BrowserContext::GetStoragePartition(
+              browser_context, site_instance.get())->GetDOMStorageContext());
   session_storage_namespace_ =
       new SessionStorageNamespaceImpl(dom_storage_context);
 
diff --git a/content/browser/web_contents/navigation_controller_impl.cc b/content/browser/web_contents/navigation_controller_impl.cc
index 6176606..c3e9140 100644
--- a/content/browser/web_contents/navigation_controller_impl.cc
+++ b/content/browser/web_contents/navigation_controller_impl.cc
@@ -12,7 +12,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
 #include "content/browser/browser_url_handler_impl.h"
-#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
 #include "content/browser/dom_storage/session_storage_namespace_impl.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"  // Temporary
 #include "content/browser/site_instance_impl.h"
@@ -105,18 +105,15 @@
 // See NavigationController::IsURLInPageNavigation for how this works and why.
 bool AreURLsInPageNavigation(const GURL& existing_url,
                              const GURL& new_url,
-                             bool renderer_says_in_page) {
+                             bool renderer_says_in_page,
+                             NavigationType navigation_type) {
   if (existing_url == new_url)
     return renderer_says_in_page;
 
   if (!new_url.has_ref()) {
-    // TODO(jcampan): what about when navigating back from a ref URL to the top
-    // non ref URL? Nothing is loaded in that case but we return false here.
-    // The user could also navigate from the ref URL to the non ref URL by
-    // entering the non ref URL in the location bar or through a bookmark, in
-    // which case there would be a load.  I am not sure if the non-load/load
-    // scenarios can be differentiated with the TransitionType.
-    return false;
+    // When going back from the ref URL to the non ref one the navigation type
+    // is IN_PAGE.
+    return navigation_type == NAVIGATION_TYPE_IN_PAGE;
   }
 
   url_canon::Replacements<char> replacements;
@@ -740,13 +737,13 @@
   details->did_replace_entry =
       pending_entry_ && pending_entry_->should_replace_entry();
 
-  // is_in_page must be computed before the entry gets committed.
-  details->is_in_page = IsURLInPageNavigation(
-      params.url, params.was_within_same_page);
-
   // Do navigation-type specific actions. These will make and commit an entry.
   details->type = ClassifyNavigation(params);
 
+  // is_in_page must be computed before the entry gets committed.
+  details->is_in_page = IsURLInPageNavigation(
+      params.url, params.was_within_same_page, details->type);
+
   switch (details->type) {
     case NAVIGATION_TYPE_NEW_PAGE:
       RendererDidNavigateToNewPage(params, details->did_replace_entry);
@@ -956,7 +953,8 @@
   // navigations that don't actually navigate, but it can happen when there is
   // an encoding override (it always sends a navigation request).
   if (AreURLsInPageNavigation(existing_entry->GetURL(), params.url,
-                              params.was_within_same_page)) {
+                              params.was_within_same_page,
+                              NAVIGATION_TYPE_UNKNOWN)) {
     return NAVIGATION_TYPE_IN_PAGE;
   }
 
@@ -1197,10 +1195,12 @@
 }
 
 bool NavigationControllerImpl::IsURLInPageNavigation(
-    const GURL& url, bool renderer_says_in_page) const {
+    const GURL& url,
+    bool renderer_says_in_page,
+    NavigationType navigation_type) const {
   NavigationEntry* last_committed = GetLastCommittedEntry();
   return last_committed && AreURLsInPageNavigation(
-      last_committed->GetURL(), url, renderer_says_in_page);
+      last_committed->GetURL(), url, renderer_says_in_page, navigation_type);
 }
 
 void NavigationControllerImpl::CopyStateFrom(
@@ -1393,7 +1393,7 @@
               BrowserContext::GetStoragePartition(browser_context_, instance);
   SessionStorageNamespaceImpl* session_storage_namespace =
       new SessionStorageNamespaceImpl(
-          static_cast<DOMStorageContextImpl*>(
+          static_cast<DOMStorageContextWrapper*>(
               partition->GetDOMStorageContext()));
   session_storage_namespace_map_[partition_id] = session_storage_namespace;
 
diff --git a/content/browser/web_contents/navigation_controller_impl.h b/content/browser/web_contents/navigation_controller_impl.h
index c95ef45..bef3be2 100644
--- a/content/browser/web_contents/navigation_controller_impl.h
+++ b/content/browser/web_contents/navigation_controller_impl.h
@@ -155,7 +155,7 @@
   // be a reload, while only a different ref would be in-page (pages can't clear
   // refs without reload, only change to "#" which we don't count as empty).
   bool IsURLInPageNavigation(const GURL& url) const {
-    return IsURLInPageNavigation(url, false);
+    return IsURLInPageNavigation(url, false, NAVIGATION_TYPE_UNKNOWN);
   }
 
   // The situation is made murkier by history.replaceState(), which could
@@ -163,7 +163,10 @@
   // we need this form which lets the (untrustworthy) renderer resolve the
   // ambiguity, but only when the URLs are equal. This should be safe since the
   // origin isn't changing.
-  bool IsURLInPageNavigation(const GURL& url, bool renderer_says_in_page) const;
+  bool IsURLInPageNavigation(
+      const GURL& url,
+      bool renderer_says_in_page,
+      NavigationType navigation_type) const;
 
   // Sets the SessionStorageNamespace for the given |partition_id|. This is
   // used during initialization of a new NavigationController to allow
diff --git a/content/browser/web_contents/navigation_controller_impl_unittest.cc b/content/browser/web_contents/navigation_controller_impl_unittest.cc
index 6af4a55..c86e3a5 100644
--- a/content/browser/web_contents/navigation_controller_impl_unittest.cc
+++ b/content/browser/web_contents/navigation_controller_impl_unittest.cc
@@ -1922,6 +1922,7 @@
   params.gesture = NavigationGestureUser;
   params.is_post = false;
   params.page_state = PageState::CreateFromURL(url2);
+  params.was_within_same_page = true;
 
   // This should generate a new entry.
   EXPECT_TRUE(controller.RendererDidNavigate(params, &details));
@@ -1939,9 +1940,7 @@
   EXPECT_TRUE(controller.RendererDidNavigate(back_params, &details));
   EXPECT_EQ(1U, navigation_entry_committed_counter_);
   navigation_entry_committed_counter_ = 0;
-  // is_in_page is false in that case but should be true.
-  // See comment in AreURLsInPageNavigation() in navigation_controller.cc
-  // EXPECT_TRUE(details.is_in_page);
+  EXPECT_TRUE(details.is_in_page);
   EXPECT_EQ(2, controller.GetEntryCount());
   EXPECT_EQ(0, controller.GetCurrentEntryIndex());
   EXPECT_EQ(back_params.url, controller.GetActiveEntry()->GetURL());
@@ -2756,8 +2755,17 @@
   EXPECT_FALSE(controller.IsURLInPageNavigation(url));
   EXPECT_FALSE(controller.IsURLInPageNavigation(other_url));
   const GURL other_url_with_ref("http://www.google.com/home.html#my_other_ref");
-  EXPECT_TRUE(controller.IsURLInPageNavigation(
-      other_url_with_ref));
+  EXPECT_TRUE(controller.IsURLInPageNavigation(other_url_with_ref));
+
+  // Going to the same url again will be considered in-page
+  // if the renderer says it is even if the navigation type isn't IN_PAGE.
+  EXPECT_TRUE(controller.IsURLInPageNavigation(url_with_ref, true,
+      NAVIGATION_TYPE_UNKNOWN));
+
+  // Going back to the non ref url will be considered in-page if the navigation
+  // type is IN_PAGE.
+  EXPECT_TRUE(controller.IsURLInPageNavigation(url, true,
+      NAVIGATION_TYPE_IN_PAGE));
 }
 
 // Some pages can have subframes with the same base URL (minus the reference) as
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index cafaea5..66e110e 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -24,7 +24,7 @@
 #include "content/browser/browser_plugin/browser_plugin_guest_manager.h"
 #include "content/browser/child_process_security_policy_impl.h"
 #include "content/browser/devtools/devtools_manager_impl.h"
-#include "content/browser/dom_storage/dom_storage_context_impl.h"
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
 #include "content/browser/dom_storage/session_storage_namespace_impl.h"
 #include "content/browser/download/download_stats.h"
 #include "content/browser/download/mhtml_generation_manager.h"
@@ -1465,8 +1465,8 @@
                                        site_instance->GetSiteURL());
   StoragePartition* partition = BrowserContext::GetStoragePartition(
       GetBrowserContext(), site_instance.get());
-  DOMStorageContextImpl* dom_storage_context =
-      static_cast<DOMStorageContextImpl*>(partition->GetDOMStorageContext());
+  DOMStorageContextWrapper* dom_storage_context =
+      static_cast<DOMStorageContextWrapper*>(partition->GetDOMStorageContext());
   SessionStorageNamespaceImpl* session_storage_namespace_impl =
       static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace);
   CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context));
diff --git a/content/child/npapi/npobject_proxy.cc b/content/child/npapi/npobject_proxy.cc
index dcab2b4..fa28bbd 100644
--- a/content/child/npapi/npobject_proxy.cc
+++ b/content/child/npapi/npobject_proxy.cc
@@ -6,11 +6,13 @@
 
 #include "content/child/npapi/np_channel_base.h"
 #include "content/child/npapi/npobject_util.h"
-#include "content/child/npapi/plugin_host.h"
-#include "content/child/npapi/plugin_instance.h"
 #include "content/child/plugin_messages.h"
 #include "third_party/WebKit/public/web/WebBindings.h"
 
+#if defined(ENABLE_PLUGINS)
+#include "content/child/npapi/plugin_instance.h"
+#endif
+
 using WebKit::WebBindings;
 
 namespace content {
@@ -388,9 +390,7 @@
     return false;
 
   *count = static_cast<unsigned int>(value_param.size());
-  *value = static_cast<NPIdentifier *>(
-      PluginHost::Singleton()->host_functions()->memalloc(
-          sizeof(NPIdentifier) * *count));
+  *value = static_cast<NPIdentifier *>(malloc(sizeof(NPIdentifier) * *count));
   for (unsigned int i = 0; i < *count; ++i)
     (*value)[i] = CreateNPIdentifier(value_param[i]);
 
@@ -468,12 +468,14 @@
   int render_view_id = proxy->render_view_id_;
   bool popups_allowed = false;
 
+#if defined(ENABLE_PLUGINS)
   if (npp) {
     PluginInstance* plugin_instance =
         reinterpret_cast<PluginInstance*>(npp->ndata);
     if (plugin_instance)
       popups_allowed = plugin_instance->popups_allowed();
   }
+#endif
 
   NPVariant_Param result_param;
   std::string script_str = std::string(
diff --git a/content/child/npapi/npobject_stub.cc b/content/child/npapi/npobject_stub.cc
index 739c0b5..b58ecca 100644
--- a/content/child/npapi/npobject_stub.cc
+++ b/content/child/npapi/npobject_stub.cc
@@ -6,7 +6,6 @@
 
 #include "content/child/npapi/np_channel_base.h"
 #include "content/child/npapi/npobject_util.h"
-#include "content/child/npapi/plugin_host.h"
 #include "content/child/plugin_messages.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_switches.h"
@@ -339,7 +338,7 @@
     value->push_back(param);
   }
 
-  PluginHost::Singleton()->host_functions()->memfree(value_np);
+  free(value_np);
 }
 
 void NPObjectStub::OnConstruct(const std::vector<NPVariant_Param>& args,
diff --git a/content/child/plugin_param_traits.cc b/content/child/plugin_param_traits.cc
index 255369a..b444c17 100644
--- a/content/child/plugin_param_traits.cc
+++ b/content/child/plugin_param_traits.cc
@@ -5,7 +5,6 @@
 #include "content/child/plugin_param_traits.h"
 
 #include "base/strings/string_number_conversions.h"
-#include "content/child/npapi/plugin_host.h"
 #include "ipc/ipc_message_utils.h"
 #include "third_party/WebKit/public/web/WebBindings.h"
 
@@ -127,7 +126,7 @@
   if (WebKit::WebBindings::identifierIsString(p.identifier)) {
     NPUTF8* str = WebKit::WebBindings::utf8FromIdentifier(p.identifier);
     l->append(str);
-    content::PluginHost::Singleton()->host_functions()->memfree(str);
+    free(str);
   } else {
     l->append(base::IntToString(
         WebKit::WebBindings::intFromIdentifier(p.identifier)));
diff --git a/content/common/content_message_generator.h b/content/common/content_message_generator.h
index 1c3b85b..5f2e12a 100644
--- a/content/common/content_message_generator.h
+++ b/content/common/content_message_generator.h
@@ -16,7 +16,7 @@
 #include "content/common/device_orientation/device_motion_messages.h"
 #include "content/common/device_orientation/device_orientation_messages.h"
 #include "content/common/devtools_messages.h"
-#include "content/common/dom_storage_messages.h"
+#include "content/common/dom_storage/dom_storage_messages.h"
 #include "content/common/drag_messages.h"
 #include "content/common/drag_traits.h"
 #include "content/common/file_utilities_messages.h"
@@ -30,7 +30,6 @@
 #include "content/common/input_messages.h"
 #include "content/common/java_bridge_messages.h"
 #include "content/common/media/audio_messages.h"
-#include "content/common/media/encoded_video_capture_messages.h"
 #include "content/common/media/midi_messages.h"
 #if defined(OS_ANDROID)
 #include "content/common/media/media_player_messages_android.h"
diff --git a/content/common/dom_storage/OWNERS b/content/common/dom_storage/OWNERS
new file mode 100644
index 0000000..66ceac5
--- /dev/null
+++ b/content/common/dom_storage/OWNERS
@@ -0,0 +1,2 @@
+marja@chromium.org
+michaeln@chromium.org
diff --git a/webkit/common/dom_storage/dom_storage_map.cc b/content/common/dom_storage/dom_storage_map.cc
similarity index 70%
rename from webkit/common/dom_storage/dom_storage_map.cc
rename to content/common/dom_storage/dom_storage_map.cc
index 5cc3c5e..4fe2c3c 100644
--- a/webkit/common/dom_storage/dom_storage_map.cc
+++ b/content/common/dom_storage/dom_storage_map.cc
@@ -1,23 +1,25 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "webkit/common/dom_storage/dom_storage_map.h"
+#include "content/common/dom_storage/dom_storage_map.h"
 
 #include "base/logging.h"
 
+namespace content {
+
 namespace {
 
 size_t size_of_item(const base::string16& key, const base::string16& value) {
   return (key.length() + value.length()) * sizeof(char16);
 }
 
-size_t CountBytes(const dom_storage::ValuesMap& values) {
+size_t CountBytes(const DOMStorageValuesMap& values) {
   if (values.size() == 0)
     return 0;
 
   size_t count = 0;
-  dom_storage::ValuesMap::const_iterator it = values.begin();
+  DOMStorageValuesMap::const_iterator it = values.begin();
   for (; it != values.end(); ++it)
     count += size_of_item(it->first, it->second.string());
   return count;
@@ -25,21 +27,19 @@
 
 }  // namespace
 
-namespace dom_storage {
-
-DomStorageMap::DomStorageMap(size_t quota)
+DOMStorageMap::DOMStorageMap(size_t quota)
     : bytes_used_(0),
       quota_(quota) {
   ResetKeyIterator();
 }
 
-DomStorageMap::~DomStorageMap() {}
+DOMStorageMap::~DOMStorageMap() {}
 
-unsigned DomStorageMap::Length() const {
+unsigned DOMStorageMap::Length() const {
   return values_.size();
 }
 
-base::NullableString16 DomStorageMap::Key(unsigned index) {
+base::NullableString16 DOMStorageMap::Key(unsigned index) {
   if (index >= values_.size())
     return base::NullableString16();
   while (last_key_index_ != index) {
@@ -54,17 +54,17 @@
   return base::NullableString16(key_iterator_->first, false);
 }
 
-base::NullableString16 DomStorageMap::GetItem(const base::string16& key) const {
-  ValuesMap::const_iterator found = values_.find(key);
+base::NullableString16 DOMStorageMap::GetItem(const base::string16& key) const {
+  DOMStorageValuesMap::const_iterator found = values_.find(key);
   if (found == values_.end())
     return base::NullableString16();
   return found->second;
 }
 
-bool DomStorageMap::SetItem(
+bool DOMStorageMap::SetItem(
     const base::string16& key, const base::string16& value,
     base::NullableString16* old_value) {
-  ValuesMap::const_iterator found = values_.find(key);
+  DOMStorageValuesMap::const_iterator found = values_.find(key);
   if (found == values_.end())
     *old_value = base::NullableString16();
   else
@@ -86,10 +86,10 @@
   return true;
 }
 
-bool DomStorageMap::RemoveItem(
+bool DOMStorageMap::RemoveItem(
     const base::string16& key,
     base::string16* old_value) {
-  ValuesMap::iterator found = values_.find(key);
+  DOMStorageValuesMap::iterator found = values_.find(key);
   if (found == values_.end())
     return false;
   *old_value = found->second.string();
@@ -99,24 +99,24 @@
   return true;
 }
 
-void DomStorageMap::SwapValues(ValuesMap* values) {
+void DOMStorageMap::SwapValues(DOMStorageValuesMap* values) {
   // Note: A pre-existing file may be over the quota budget.
   values_.swap(*values);
   bytes_used_ = CountBytes(values_);
   ResetKeyIterator();
 }
 
-DomStorageMap* DomStorageMap::DeepCopy() const {
-  DomStorageMap* copy = new DomStorageMap(quota_);
+DOMStorageMap* DOMStorageMap::DeepCopy() const {
+  DOMStorageMap* copy = new DOMStorageMap(quota_);
   copy->values_ = values_;
   copy->bytes_used_ = bytes_used_;
   copy->ResetKeyIterator();
   return copy;
 }
 
-void DomStorageMap::ResetKeyIterator() {
+void DOMStorageMap::ResetKeyIterator() {
   key_iterator_ = values_.begin();
   last_key_index_ = 0;
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/content/common/dom_storage/dom_storage_map.h b/content/common/dom_storage/dom_storage_map.h
new file mode 100644
index 0000000..140de07
--- /dev/null
+++ b/content/common/dom_storage/dom_storage_map.h
@@ -0,0 +1,64 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_COMMON_DOM_STORAGE_DOM_STORAGE_MAP_H_
+#define CONTENT_COMMON_DOM_STORAGE_DOM_STORAGE_MAP_H_
+
+#include <map>
+
+#include "base/memory/ref_counted.h"
+#include "base/strings/nullable_string16.h"
+#include "base/strings/string16.h"
+#include "content/common/content_export.h"
+#include "content/common/dom_storage/dom_storage_types.h"
+
+namespace content {
+
+// A wrapper around a std::map that adds refcounting and
+// tracks the size in bytes of the keys/values, enforcing a quota.
+// See class comments for DOMStorageContextImpl for a larger overview.
+class CONTENT_EXPORT DOMStorageMap
+    : public base::RefCountedThreadSafe<DOMStorageMap> {
+ public:
+  explicit DOMStorageMap(size_t quota);
+
+  unsigned Length() const;
+  base::NullableString16 Key(unsigned index);
+  base::NullableString16 GetItem(const base::string16& key) const;
+  bool SetItem(const base::string16& key, const base::string16& value,
+               base::NullableString16* old_value);
+  bool RemoveItem(const base::string16& key, base::string16* old_value);
+
+  // Swaps this instances values_ with |map|.
+  // Note: to grandfather in pre-existing files that are overbudget,
+  // this method does not do quota checking.
+  void SwapValues(DOMStorageValuesMap* map);
+
+  // Writes a copy of the current set of values_ to the |map|.
+  void ExtractValues(DOMStorageValuesMap* map) const { *map = values_; }
+
+  // Creates a new instance of DOMStorageMap containing
+  // a deep copy of values_.
+  DOMStorageMap* DeepCopy() const;
+
+  size_t bytes_used() const { return bytes_used_; }
+  size_t quota() const { return quota_; }
+  void set_quota(size_t quota) { quota_ = quota; }
+
+ private:
+  friend class base::RefCountedThreadSafe<DOMStorageMap>;
+  ~DOMStorageMap();
+
+  void ResetKeyIterator();
+
+  DOMStorageValuesMap values_;
+  DOMStorageValuesMap::const_iterator key_iterator_;
+  unsigned last_key_index_;
+  size_t bytes_used_;
+  size_t quota_;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_COMMON_DOM_STORAGE_DOM_STORAGE_MAP_H_
diff --git a/webkit/common/dom_storage/dom_storage_map_unittest.cc b/content/common/dom_storage/dom_storage_map_unittest.cc
similarity index 89%
rename from webkit/common/dom_storage/dom_storage_map_unittest.cc
rename to content/common/dom_storage/dom_storage_map_unittest.cc
index d634bce..0937c21 100644
--- a/webkit/common/dom_storage/dom_storage_map_unittest.cc
+++ b/content/common/dom_storage/dom_storage_map_unittest.cc
@@ -1,14 +1,14 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 #include "base/strings/utf_string_conversions.h"
+#include "content/common/dom_storage/dom_storage_map.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "webkit/common/dom_storage/dom_storage_map.h"
 
-namespace dom_storage {
+namespace content {
 
-TEST(DomStorageMapTest, DomStorageMapBasics) {
+TEST(DOMStorageMapTest, DOMStorageMapBasics) {
   const base::string16 kKey(ASCIIToUTF16("key"));
   const base::string16 kValue(ASCIIToUTF16("value"));
   const size_t kValueBytes = kValue.size() * sizeof(char16);
@@ -21,11 +21,11 @@
       (kKey2.size() + kValue2.size()) * sizeof(char16);
   const size_t kQuota = 1024;  // 1K quota for this test.
 
-  scoped_refptr<DomStorageMap> map(new DomStorageMap(kQuota));
+  scoped_refptr<DOMStorageMap> map(new DOMStorageMap(kQuota));
   base::string16 old_value;
   base::NullableString16 old_nullable_value;
-  ValuesMap swap;
-  scoped_refptr<DomStorageMap> copy;
+  DOMStorageValuesMap swap;
+  scoped_refptr<DOMStorageMap> copy;
 
   // Check the behavior of an empty map.
   EXPECT_EQ(0u, map->Length());
@@ -82,19 +82,19 @@
   EXPECT_EQ(0u, map->bytes_used());
 }
 
-TEST(DomStorageMapTest, EnforcesQuota) {
+TEST(DOMStorageMapTest, EnforcesQuota) {
   const base::string16 kKey = ASCIIToUTF16("test_key");
   const base::string16 kValue = ASCIIToUTF16("test_value");
   const base::string16 kKey2 = ASCIIToUTF16("test_key_2");
 
   // A 50 byte quota is too small to hold both keys, so we
-  // should see the DomStorageMap enforcing it.
+  // should see the DOMStorageMap enforcing it.
   const size_t kQuota = 50;
 
   base::string16 old_value;
   base::NullableString16 old_nullable_value;
 
-  scoped_refptr<DomStorageMap> map(new DomStorageMap(kQuota));
+  scoped_refptr<DOMStorageMap> map(new DOMStorageMap(kQuota));
   EXPECT_TRUE(map->SetItem(kKey, kValue, &old_nullable_value));
   EXPECT_FALSE(map->SetItem(kKey2, kValue, &old_nullable_value));
   EXPECT_EQ(1u, map->Length());
@@ -106,7 +106,7 @@
   EXPECT_EQ(1u, map->Length());
 
   // Verify that the SwapValues method does not do quota checking.
-  ValuesMap swap;
+  DOMStorageValuesMap swap;
   swap[kKey] = base::NullableString16(kValue, false);
   swap[kKey2] = base::NullableString16(kValue, false);
   map->SwapValues(&swap);
@@ -121,4 +121,4 @@
   EXPECT_EQ(kValue, old_nullable_value.string());
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/content/common/dom_storage_messages.h b/content/common/dom_storage/dom_storage_messages.h
similarity index 95%
rename from content/common/dom_storage_messages.h
rename to content/common/dom_storage/dom_storage_messages.h
index da847ec..11c05e8 100644
--- a/content/common/dom_storage_messages.h
+++ b/content/common/dom_storage/dom_storage_messages.h
@@ -1,14 +1,14 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 // Multiply-included message file, no traditional include guard.
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "content/public/common/common_param_traits.h"
 #include "ipc/ipc_message_macros.h"
 #include "ipc/ipc_param_traits.h"
 #include "third_party/WebKit/public/platform/WebStorageArea.h"
 #include "url/gurl.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
 #define IPC_MESSAGE_START DOMStorageMsgStart
 
@@ -69,7 +69,7 @@
 // the renderer-side cache. A completion notification is sent in response.
 IPC_SYNC_MESSAGE_CONTROL1_1(DOMStorageHostMsg_LoadStorageArea,
                             int /* connection_id */,
-                            dom_storage::ValuesMap)
+                            content::DOMStorageValuesMap)
 
 // Set a value that's associated with a key in a storage area.
 // A completion notification is sent in response.
diff --git a/content/common/dom_storage/dom_storage_types.h b/content/common/dom_storage/dom_storage_types.h
new file mode 100644
index 0000000..1b25b41
--- /dev/null
+++ b/content/common/dom_storage/dom_storage_types.h
@@ -0,0 +1,41 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_COMMON_DOM_STORAGE_DOM_STORAGE_TYPES_H_
+#define CONTENT_COMMON_DOM_STORAGE_DOM_STORAGE_TYPES_H_
+
+#include <map>
+
+#include "base/basictypes.h"
+#include "base/strings/nullable_string16.h"
+#include "base/strings/string16.h"
+#include "base/time/time.h"
+#include "url/gurl.h"
+
+namespace content {
+
+typedef std::map<base::string16, base::NullableString16> DOMStorageValuesMap;
+
+// The quota for each storage area.
+// This value is enforced in renderer processes and the browser process.
+const size_t kPerStorageAreaQuota = 10 * 1024 * 1024;
+
+// In the browser process we allow some overage to
+// accomodate concurrent writes from different renderers
+// that were allowed because the limit imposed in the renderer
+// wasn't exceeded.
+const size_t kPerStorageAreaOverQuotaAllowance = 100 * 1024;
+
+// Value to indicate the localstorage namespace vs non-zero
+// values for sessionstorage namespaces.
+const int64 kLocalStorageNamespaceId = 0;
+
+const int64 kInvalidSessionStorageNamespaceId = kLocalStorageNamespaceId;
+
+// Start purging memory if the number of in-memory areas exceeds this.
+const int64 kMaxInMemoryStorageAreas = 100;
+
+}  // namespace content
+
+#endif  // CONTENT_COMMON_DOM_STORAGE_DOM_STORAGE_TYPES_H_
diff --git a/content/common/gpu/media/video_decode_accelerator_unittest.cc b/content/common/gpu/media/video_decode_accelerator_unittest.cc
index c81cef2..a180ff6 100644
--- a/content/common/gpu/media/video_decode_accelerator_unittest.cc
+++ b/content/common/gpu/media/video_decode_accelerator_unittest.cc
@@ -1254,11 +1254,16 @@
     ::testing::Values(
         MakeTuple(1, 1, 1, 4, END_OF_STREAM_RESET, CS_RESET, false, false)));
 
+// This hangs on Exynos, preventing further testing and wasting test machine
+// time.
+// TODO(ihf): Enable again once http://crbug.com/269754 is fixed.
+#if defined(ARCH_CPU_X86_FAMILY)
 // Test that Reset() before the first Decode() works fine.
 INSTANTIATE_TEST_CASE_P(
     ResetBeforeDecode, VideoDecodeAcceleratorTest,
     ::testing::Values(
         MakeTuple(1, 1, 1, 1, START_OF_STREAM_RESET, CS_RESET, false, false)));
+#endif  // ARCH_CPU_X86_FAMILY
 
 // Test that Reset() mid-stream works fine and doesn't affect decoding even when
 // Decode() calls are made during the reset.
diff --git a/content/common/media/encoded_video_capture_messages.h b/content/common/media/encoded_video_capture_messages.h
deleted file mode 100644
index 6313f72..0000000
--- a/content/common/media/encoded_video_capture_messages.h
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/shared_memory.h"
-#include "ipc/ipc_message_macros.h"
-#include "media/video/capture/video_capture_types.h"
-#include "media/video/video_encode_types.h"
-
-#undef IPC_MESSAGE_EXPORT
-#define IPC_MESSAGE_EXPORT CONTENT_EXPORT
-#define IPC_MESSAGE_START EncodedVideoCaptureMsgStart
-
-#if !defined(OS_ANDROID)
-IPC_ENUM_TRAITS(media::VideoCodec)
-#endif  // !defined(OS_ANDROID)
-
-IPC_STRUCT_TRAITS_BEGIN(media::VideoEncodingConfig)
-  IPC_STRUCT_TRAITS_MEMBER(codec_type)
-  IPC_STRUCT_TRAITS_MEMBER(codec_name)
-  IPC_STRUCT_TRAITS_MEMBER(max_resolution)
-  IPC_STRUCT_TRAITS_MEMBER(max_frames_per_second)
-  IPC_STRUCT_TRAITS_MEMBER(max_bitrate)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(media::RuntimeVideoEncodingParameters)
-  IPC_STRUCT_TRAITS_MEMBER(target_bitrate)
-  IPC_STRUCT_TRAITS_MEMBER(max_bitrate)
-  IPC_STRUCT_TRAITS_MEMBER(frames_per_second)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(media::VideoEncodingParameters)
-  IPC_STRUCT_TRAITS_MEMBER(codec_name)
-  IPC_STRUCT_TRAITS_MEMBER(resolution)
-  IPC_STRUCT_TRAITS_MEMBER(runtime_params)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(media::BufferEncodingMetadata)
-  IPC_STRUCT_TRAITS_MEMBER(timestamp)
-  IPC_STRUCT_TRAITS_MEMBER(key_frame)
-IPC_STRUCT_TRAITS_END()
-
-//------------------------------------------------------------------------------
-// Renderer Source Messages
-// These are messages from the renderer to the browser process.
-
-// Queries the encoding capabilities for the device. A successful request
-// results in EncoderVideoSourceMessage_CapabilitiesAvailable message.
-IPC_MESSAGE_CONTROL2(EncodedVideoCaptureHostMsg_GetCapabilities,
-                     int /* device_id */,
-                     media::VideoCaptureSessionId /* session_id */)
-
-// Message from renderer to browser process to create a bitstream with specific
-// parameters. A successful request results in beginning of streaming and
-// EncoderVideoCaptureMsg_BitstreamCreated message to renderer. A failed request
-// triggers EncodedVideoCaptureMsg_BitstreamDestroyed message. |session_id| is
-// the capture session id returned by the MediaStreamManager. The renderer is
-// responsible for generating unique |device_id| within its context that will be
-// used to identify bitstreams in IPC.
-IPC_MESSAGE_CONTROL3(EncodedVideoCaptureHostMsg_OpenBitstream,
-                     int /* device_id */,
-                     media::VideoCaptureSessionId /* session_id */,
-                     media::VideoEncodingParameters /* params */)
-
-// Stops streaming a bitstream. When browser has finalized the bitstream it will
-// trigger EncodedVideoCaptureMsg_BitstreamClosed message back to renderer.
-// Renderer must be prepared to receive EncodedVideoCaptureMsg_BitstreamReady
-// messages until it receives EncodedVideoCaptureMsg_BitstreamClosed message.
-IPC_MESSAGE_CONTROL1(EncodedVideoCaptureHostMsg_CloseBitstream,
-                    int /* device_id */)
-
-// Sets a stream's bitstream configuration. Will always result in
-// EncodedVideoCaptureMsg_BitstreamConfigChanged message containing
-// currently active parameters, regardless of whether this call succeeded or
-// not.
-IPC_MESSAGE_CONTROL2(EncodedVideoCaptureHostMsg_TryConfigureBitstream,
-                     int /* device_id */,
-                     media::RuntimeVideoEncodingParameters /* params */)
-
-// Requests a key frame in the encoded bitstream. Upon receiving this request,
-// browser will try to encode an upcoming captured frame as a key frame. This
-// allows the receiver to quickly recover from data loss. The request is served
-// on a best-effort basis and there is no explicit acknowledgement.
-IPC_MESSAGE_CONTROL1(EncodedVideoCaptureHostMsg_RequestKeyFrame,
-                     int /* device_id */)
-
-// Notifies that the data within a buffer has been processed and it can be
-// reused to encode upcoming bitstream.
-IPC_MESSAGE_CONTROL2(EncodedVideoCaptureHostMsg_BitstreamBufferConsumed,
-                     int /* device_id */,
-                     int /* buffer_id */)
-
-//------------------------------------------------------------------------------
-// Renderer Messages
-// These are messages from the browser to the renderer process.
-
-// Reports the encoding capabilities of the device.
-IPC_MESSAGE_CONTROL2(EncodedVideoCaptureMsg_CapabilitiesAvailable,
-                     int /* device_id */,
-                     media::VideoEncodingCapabilities /* capabilities */)
-
-// Acknowledges a request to open an encoded video bitstream. When this message
-// occurs, bitstream can be considered to be streaming, and renderer should be
-// ready to start accepting EncodedVideoCaptureMsg_BitstreamReady messages and
-// buffers contained within them. Shared memory buffers used to deliver the
-// bitstream are assigned with buffer IDs as specified by the buffers parameter.
-// All buffers have the same size as indicated by |buffer_size|.
-IPC_MESSAGE_CONTROL4(EncodedVideoCaptureMsg_BitstreamOpened,
-                     int /* device_id */,
-                     media::VideoEncodingParameters /* params */,
-                     std::vector<base::SharedMemoryHandle> /* buffers */,
-                     uint32 /* buffer_size */)
-
-// Acknowledges a request to close an encoded video bitstream.
-IPC_MESSAGE_CONTROL1(EncodedVideoCaptureMsg_BitstreamClosed,
-                     int /* device_id */)
-
-// Informs the clients of the current encoding parameters, regardless of whether
-// the previous request to change them has been successful or not. It is usually
-// called in response to EncodedVideoCaptureHostMsg_TryConfigureBitstream
-// at runtime, but can occur also as a result of config change initiated by
-// encoder or other clients in the system, e.g. if there are multiple clients
-// and bitstream config change is requested from one client, all clients should
-// be prepared to handle the configuration change.
-IPC_MESSAGE_CONTROL2(EncodedVideoCaptureMsg_BitstreamConfigChanged,
-                     int /* device_id */,
-                     media::RuntimeVideoEncodingParameters /* current_params */)
-
-// Indicates that a bitstream buffer is available for the stream. The value of
-// |size| indicates the amount of valid bitstream data (in bytes).
-IPC_MESSAGE_CONTROL4(EncodedVideoCaptureMsg_BitstreamReady,
-                     int /* device_id */,
-                     int /* buffer_id */,
-                     uint32 /* size */,
-                     media::BufferEncodingMetadata /* metadata */)
diff --git a/content/common/sandbox_linux.cc b/content/common/sandbox_linux.cc
index de7f7e4..1746390 100644
--- a/content/common/sandbox_linux.cc
+++ b/content/common/sandbox_linux.cc
@@ -138,7 +138,7 @@
     // The GPU process is allowed to call InitializeSandbox() with threads for
     // now, because it loads third party libraries.
     if (process_type != switches::kGpuProcess)
-      DCHECK(false) << error_message;
+      CHECK(false) << error_message;
     LOG(ERROR) << error_message;
     return false;
   }
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index 7bd409f..9ab0e99 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -2016,10 +2016,6 @@
                     int32, /* line number */
                     string16 /* source id */)
 
-// Sent to the renderer process to indicate completion of the previous
-// ViewHostMsg_AddMessageToConsole operation.
-IPC_MESSAGE_ROUTED0(ViewMsg_AddMessageToConsole_ACK)
-
 // Sent by the renderer process to indicate that a plugin instance has crashed.
 // Note: |plugin_pid| should not be trusted. The corresponding process has
 // probably died. Moreover, the ID may have been reused by a new process. Any
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 1124248..b3751ac 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -3,9 +3,6 @@
 # found in the LICENSE file.
 
 {
-  'variables': {
-    'use_cras%': 0,
-  },
   'dependencies': [
     'browser/speech/proto/speech_proto.gyp:speech_proto',
     '../base/base.gyp:base_static',
@@ -116,6 +113,8 @@
     'public/browser/load_from_memory_cache_details.cc',
     'public/browser/load_from_memory_cache_details.h',
     'public/browser/load_notification_details.h',
+    'public/browser/local_storage_usage_info.cc',
+    'public/browser/local_storage_usage_info.h',
     'public/browser/media_devices_monitor.h',
     'public/browser/native_web_keyboard_event.h',
     'public/browser/navigation_controller.cc',
@@ -136,8 +135,8 @@
     'public/browser/page_navigator.h',
     'public/browser/pepper_flash_settings_helper.h',
     'public/browser/plugin_data_remover.h',
-    'public/browser/plugin_service_filter.h',
     'public/browser/plugin_service.h',
+    'public/browser/plugin_service_filter.h',
     'public/browser/power_save_blocker.h',
     'public/browser/profiler_controller.h',
     'public/browser/profiler_subscriber.h',
@@ -163,6 +162,7 @@
     'public/browser/resource_throttle.h',
     'public/browser/save_page_type.h',
     'public/browser/session_storage_namespace.h',
+    'public/browser/session_storage_usage_info.h',
     'public/browser/site_instance.h',
     'public/browser/speech_recognition_event_listener.h',
     'public/browser/speech_recognition_manager.h',
@@ -305,6 +305,8 @@
     'browser/aura/no_transport_image_transport_factory.h',
     'browser/aura/reflector_impl.cc',
     'browser/aura/reflector_impl.h',
+    'browser/aura/software_browser_compositor_output_surface.cc',
+    'browser/aura/software_browser_compositor_output_surface.h',
     'browser/aura/software_output_device_win.cc',
     'browser/aura/software_output_device_win.h',
     'browser/aura/software_output_device_x11.cc',
@@ -420,10 +422,31 @@
     'browser/device_orientation/provider.h',
     'browser/device_orientation/provider_impl.cc',
     'browser/device_orientation/provider_impl.h',
+    'browser/dom_storage/dom_storage_area.cc',
+    'browser/dom_storage/dom_storage_area.h',
     'browser/dom_storage/dom_storage_context_impl.cc',
     'browser/dom_storage/dom_storage_context_impl.h',
+    'browser/dom_storage/dom_storage_context_wrapper.cc',
+    'browser/dom_storage/dom_storage_context_wrapper.h',
+    'browser/dom_storage/dom_storage_database.cc',
+    'browser/dom_storage/dom_storage_database.h',
+    'browser/dom_storage/dom_storage_database_adapter.h',
+    'browser/dom_storage/dom_storage_host.cc',
+    'browser/dom_storage/dom_storage_host.h',
     'browser/dom_storage/dom_storage_message_filter.cc',
     'browser/dom_storage/dom_storage_message_filter.h',
+    'browser/dom_storage/dom_storage_namespace.cc',
+    'browser/dom_storage/dom_storage_namespace.h',
+    'browser/dom_storage/dom_storage_session.cc',
+    'browser/dom_storage/dom_storage_session.h',
+    'browser/dom_storage/dom_storage_task_runner.cc',
+    'browser/dom_storage/dom_storage_task_runner.h',
+    'browser/dom_storage/local_storage_database_adapter.cc',
+    'browser/dom_storage/local_storage_database_adapter.h',
+    'browser/dom_storage/session_storage_database.cc',
+    'browser/dom_storage/session_storage_database.h',
+    'browser/dom_storage/session_storage_database_adapter.cc',
+    'browser/dom_storage/session_storage_database_adapter.h',
     'browser/dom_storage/session_storage_namespace_impl.cc',
     'browser/dom_storage/session_storage_namespace_impl.h',
     'browser/download/base_file.cc',
@@ -1347,11 +1370,6 @@
         '../build/linux/system.gyp:x11',
       ],
     }],
-    ['use_cras==1', {
-      'defines': [
-        'USE_CRAS',
-      ],
-    }],
     ['use_pango==1', {
       'dependencies': [
         '../build/linux/system.gyp:pangocairo',
diff --git a/content/content_browser.target.darwin-arm.mk b/content/content_browser.target.darwin-arm.mk
index 5cf9dfc..1b6db5c 100644
--- a/content/content_browser.target.darwin-arm.mk
+++ b/content/content_browser.target.darwin-arm.mk
@@ -57,6 +57,7 @@
 	content/public/browser/indexed_db_info.cc \
 	content/public/browser/javascript_dialog_manager.cc \
 	content/public/browser/load_from_memory_cache_details.cc \
+	content/public/browser/local_storage_usage_info.cc \
 	content/public/browser/navigation_controller.cc \
 	content/public/browser/navigation_details.cc \
 	content/public/browser/notification_registrar.cc \
@@ -159,8 +160,18 @@
 	content/browser/device_orientation/orientation_message_filter.cc \
 	content/browser/device_orientation/provider.cc \
 	content/browser/device_orientation/provider_impl.cc \
+	content/browser/dom_storage/dom_storage_area.cc \
 	content/browser/dom_storage/dom_storage_context_impl.cc \
+	content/browser/dom_storage/dom_storage_context_wrapper.cc \
+	content/browser/dom_storage/dom_storage_database.cc \
+	content/browser/dom_storage/dom_storage_host.cc \
 	content/browser/dom_storage/dom_storage_message_filter.cc \
+	content/browser/dom_storage/dom_storage_namespace.cc \
+	content/browser/dom_storage/dom_storage_session.cc \
+	content/browser/dom_storage/dom_storage_task_runner.cc \
+	content/browser/dom_storage/local_storage_database_adapter.cc \
+	content/browser/dom_storage/session_storage_database.cc \
+	content/browser/dom_storage/session_storage_database_adapter.cc \
 	content/browser/dom_storage/session_storage_namespace_impl.cc \
 	content/browser/download/base_file.cc \
 	content/browser/download/base_file_posix.cc \
diff --git a/content/content_browser.target.darwin-mips.mk b/content/content_browser.target.darwin-mips.mk
index 44d0f5b..ee0dac8 100644
--- a/content/content_browser.target.darwin-mips.mk
+++ b/content/content_browser.target.darwin-mips.mk
@@ -57,6 +57,7 @@
 	content/public/browser/indexed_db_info.cc \
 	content/public/browser/javascript_dialog_manager.cc \
 	content/public/browser/load_from_memory_cache_details.cc \
+	content/public/browser/local_storage_usage_info.cc \
 	content/public/browser/navigation_controller.cc \
 	content/public/browser/navigation_details.cc \
 	content/public/browser/notification_registrar.cc \
@@ -159,8 +160,18 @@
 	content/browser/device_orientation/orientation_message_filter.cc \
 	content/browser/device_orientation/provider.cc \
 	content/browser/device_orientation/provider_impl.cc \
+	content/browser/dom_storage/dom_storage_area.cc \
 	content/browser/dom_storage/dom_storage_context_impl.cc \
+	content/browser/dom_storage/dom_storage_context_wrapper.cc \
+	content/browser/dom_storage/dom_storage_database.cc \
+	content/browser/dom_storage/dom_storage_host.cc \
 	content/browser/dom_storage/dom_storage_message_filter.cc \
+	content/browser/dom_storage/dom_storage_namespace.cc \
+	content/browser/dom_storage/dom_storage_session.cc \
+	content/browser/dom_storage/dom_storage_task_runner.cc \
+	content/browser/dom_storage/local_storage_database_adapter.cc \
+	content/browser/dom_storage/session_storage_database.cc \
+	content/browser/dom_storage/session_storage_database_adapter.cc \
 	content/browser/dom_storage/session_storage_namespace_impl.cc \
 	content/browser/download/base_file.cc \
 	content/browser/download/base_file_posix.cc \
diff --git a/content/content_browser.target.darwin-x86.mk b/content/content_browser.target.darwin-x86.mk
index f0508e2..bac157c 100644
--- a/content/content_browser.target.darwin-x86.mk
+++ b/content/content_browser.target.darwin-x86.mk
@@ -57,6 +57,7 @@
 	content/public/browser/indexed_db_info.cc \
 	content/public/browser/javascript_dialog_manager.cc \
 	content/public/browser/load_from_memory_cache_details.cc \
+	content/public/browser/local_storage_usage_info.cc \
 	content/public/browser/navigation_controller.cc \
 	content/public/browser/navigation_details.cc \
 	content/public/browser/notification_registrar.cc \
@@ -159,8 +160,18 @@
 	content/browser/device_orientation/orientation_message_filter.cc \
 	content/browser/device_orientation/provider.cc \
 	content/browser/device_orientation/provider_impl.cc \
+	content/browser/dom_storage/dom_storage_area.cc \
 	content/browser/dom_storage/dom_storage_context_impl.cc \
+	content/browser/dom_storage/dom_storage_context_wrapper.cc \
+	content/browser/dom_storage/dom_storage_database.cc \
+	content/browser/dom_storage/dom_storage_host.cc \
 	content/browser/dom_storage/dom_storage_message_filter.cc \
+	content/browser/dom_storage/dom_storage_namespace.cc \
+	content/browser/dom_storage/dom_storage_session.cc \
+	content/browser/dom_storage/dom_storage_task_runner.cc \
+	content/browser/dom_storage/local_storage_database_adapter.cc \
+	content/browser/dom_storage/session_storage_database.cc \
+	content/browser/dom_storage/session_storage_database_adapter.cc \
 	content/browser/dom_storage/session_storage_namespace_impl.cc \
 	content/browser/download/base_file.cc \
 	content/browser/download/base_file_posix.cc \
diff --git a/content/content_browser.target.linux-arm.mk b/content/content_browser.target.linux-arm.mk
index 5cf9dfc..1b6db5c 100644
--- a/content/content_browser.target.linux-arm.mk
+++ b/content/content_browser.target.linux-arm.mk
@@ -57,6 +57,7 @@
 	content/public/browser/indexed_db_info.cc \
 	content/public/browser/javascript_dialog_manager.cc \
 	content/public/browser/load_from_memory_cache_details.cc \
+	content/public/browser/local_storage_usage_info.cc \
 	content/public/browser/navigation_controller.cc \
 	content/public/browser/navigation_details.cc \
 	content/public/browser/notification_registrar.cc \
@@ -159,8 +160,18 @@
 	content/browser/device_orientation/orientation_message_filter.cc \
 	content/browser/device_orientation/provider.cc \
 	content/browser/device_orientation/provider_impl.cc \
+	content/browser/dom_storage/dom_storage_area.cc \
 	content/browser/dom_storage/dom_storage_context_impl.cc \
+	content/browser/dom_storage/dom_storage_context_wrapper.cc \
+	content/browser/dom_storage/dom_storage_database.cc \
+	content/browser/dom_storage/dom_storage_host.cc \
 	content/browser/dom_storage/dom_storage_message_filter.cc \
+	content/browser/dom_storage/dom_storage_namespace.cc \
+	content/browser/dom_storage/dom_storage_session.cc \
+	content/browser/dom_storage/dom_storage_task_runner.cc \
+	content/browser/dom_storage/local_storage_database_adapter.cc \
+	content/browser/dom_storage/session_storage_database.cc \
+	content/browser/dom_storage/session_storage_database_adapter.cc \
 	content/browser/dom_storage/session_storage_namespace_impl.cc \
 	content/browser/download/base_file.cc \
 	content/browser/download/base_file_posix.cc \
diff --git a/content/content_browser.target.linux-mips.mk b/content/content_browser.target.linux-mips.mk
index 44d0f5b..ee0dac8 100644
--- a/content/content_browser.target.linux-mips.mk
+++ b/content/content_browser.target.linux-mips.mk
@@ -57,6 +57,7 @@
 	content/public/browser/indexed_db_info.cc \
 	content/public/browser/javascript_dialog_manager.cc \
 	content/public/browser/load_from_memory_cache_details.cc \
+	content/public/browser/local_storage_usage_info.cc \
 	content/public/browser/navigation_controller.cc \
 	content/public/browser/navigation_details.cc \
 	content/public/browser/notification_registrar.cc \
@@ -159,8 +160,18 @@
 	content/browser/device_orientation/orientation_message_filter.cc \
 	content/browser/device_orientation/provider.cc \
 	content/browser/device_orientation/provider_impl.cc \
+	content/browser/dom_storage/dom_storage_area.cc \
 	content/browser/dom_storage/dom_storage_context_impl.cc \
+	content/browser/dom_storage/dom_storage_context_wrapper.cc \
+	content/browser/dom_storage/dom_storage_database.cc \
+	content/browser/dom_storage/dom_storage_host.cc \
 	content/browser/dom_storage/dom_storage_message_filter.cc \
+	content/browser/dom_storage/dom_storage_namespace.cc \
+	content/browser/dom_storage/dom_storage_session.cc \
+	content/browser/dom_storage/dom_storage_task_runner.cc \
+	content/browser/dom_storage/local_storage_database_adapter.cc \
+	content/browser/dom_storage/session_storage_database.cc \
+	content/browser/dom_storage/session_storage_database_adapter.cc \
 	content/browser/dom_storage/session_storage_namespace_impl.cc \
 	content/browser/download/base_file.cc \
 	content/browser/download/base_file_posix.cc \
diff --git a/content/content_browser.target.linux-x86.mk b/content/content_browser.target.linux-x86.mk
index f0508e2..bac157c 100644
--- a/content/content_browser.target.linux-x86.mk
+++ b/content/content_browser.target.linux-x86.mk
@@ -57,6 +57,7 @@
 	content/public/browser/indexed_db_info.cc \
 	content/public/browser/javascript_dialog_manager.cc \
 	content/public/browser/load_from_memory_cache_details.cc \
+	content/public/browser/local_storage_usage_info.cc \
 	content/public/browser/navigation_controller.cc \
 	content/public/browser/navigation_details.cc \
 	content/public/browser/notification_registrar.cc \
@@ -159,8 +160,18 @@
 	content/browser/device_orientation/orientation_message_filter.cc \
 	content/browser/device_orientation/provider.cc \
 	content/browser/device_orientation/provider_impl.cc \
+	content/browser/dom_storage/dom_storage_area.cc \
 	content/browser/dom_storage/dom_storage_context_impl.cc \
+	content/browser/dom_storage/dom_storage_context_wrapper.cc \
+	content/browser/dom_storage/dom_storage_database.cc \
+	content/browser/dom_storage/dom_storage_host.cc \
 	content/browser/dom_storage/dom_storage_message_filter.cc \
+	content/browser/dom_storage/dom_storage_namespace.cc \
+	content/browser/dom_storage/dom_storage_session.cc \
+	content/browser/dom_storage/dom_storage_task_runner.cc \
+	content/browser/dom_storage/local_storage_database_adapter.cc \
+	content/browser/dom_storage/session_storage_database.cc \
+	content/browser/dom_storage/session_storage_database_adapter.cc \
 	content/browser/dom_storage/session_storage_namespace_impl.cc \
 	content/browser/download/base_file.cc \
 	content/browser/download/base_file_posix.cc \
diff --git a/content/content_child.gypi b/content/content_child.gypi
index 109ae20..b0c18ed 100644
--- a/content/content_child.gypi
+++ b/content/content_child.gypi
@@ -23,6 +23,8 @@
     'child/appcache_backend_proxy.h',
     'child/appcache_dispatcher.cc',
     'child/appcache_dispatcher.h',
+    'child/browser_font_resource_trusted.cc',
+    'child/browser_font_resource_trusted.h',
     'child/child_histogram_message_filter.cc',
     'child/child_histogram_message_filter.h',
     'child/child_process.cc',
@@ -135,10 +137,13 @@
         '../build/android/cpufeatures.gypi',
       ],
     }],
-    ['enable_plugins==1', {
-      'sources': [
+    ['enable_plugins==0', {
+      'sources!': [
         'child/browser_font_resource_trusted.cc',
-        'child/browser_font_resource_trusted.h',
+      ],
+      'sources/': [
+        ['exclude', '^child/npapi/plugin_'],
+        ['exclude', '^child/npapi/webplugin_'],
       ],
     }],
     ['OS=="ios"', {
diff --git a/content/content_child.target.darwin-arm.mk b/content/content_child.target.darwin-arm.mk
index 540ce0c..264be10 100644
--- a/content/content_child.target.darwin-arm.mk
+++ b/content/content_child.target.darwin-arm.mk
@@ -55,15 +55,6 @@
 	content/child/npapi/npobject_stub.cc \
 	content/child/npapi/npobject_util.cc \
 	content/child/npapi/npruntime_util.cc \
-	content/child/npapi/plugin_host.cc \
-	content/child/npapi/plugin_instance.cc \
-	content/child/npapi/plugin_lib.cc \
-	content/child/npapi/plugin_stream.cc \
-	content/child/npapi/plugin_stream_posix.cc \
-	content/child/npapi/plugin_stream_url.cc \
-	content/child/npapi/plugin_string_stream.cc \
-	content/child/npapi/webplugin_delegate_impl.cc \
-	content/child/npapi/webplugin_delegate_impl_android.cc \
 	content/child/plugin_message_generator.cc \
 	content/child/plugin_param_traits.cc \
 	content/child/power_monitor_broadcast_source.cc \
diff --git a/content/content_child.target.darwin-mips.mk b/content/content_child.target.darwin-mips.mk
index 88dbb58..aea02dd 100644
--- a/content/content_child.target.darwin-mips.mk
+++ b/content/content_child.target.darwin-mips.mk
@@ -55,15 +55,6 @@
 	content/child/npapi/npobject_stub.cc \
 	content/child/npapi/npobject_util.cc \
 	content/child/npapi/npruntime_util.cc \
-	content/child/npapi/plugin_host.cc \
-	content/child/npapi/plugin_instance.cc \
-	content/child/npapi/plugin_lib.cc \
-	content/child/npapi/plugin_stream.cc \
-	content/child/npapi/plugin_stream_posix.cc \
-	content/child/npapi/plugin_stream_url.cc \
-	content/child/npapi/plugin_string_stream.cc \
-	content/child/npapi/webplugin_delegate_impl.cc \
-	content/child/npapi/webplugin_delegate_impl_android.cc \
 	content/child/plugin_message_generator.cc \
 	content/child/plugin_param_traits.cc \
 	content/child/power_monitor_broadcast_source.cc \
diff --git a/content/content_child.target.darwin-x86.mk b/content/content_child.target.darwin-x86.mk
index eea5017..affffa7 100644
--- a/content/content_child.target.darwin-x86.mk
+++ b/content/content_child.target.darwin-x86.mk
@@ -55,15 +55,6 @@
 	content/child/npapi/npobject_stub.cc \
 	content/child/npapi/npobject_util.cc \
 	content/child/npapi/npruntime_util.cc \
-	content/child/npapi/plugin_host.cc \
-	content/child/npapi/plugin_instance.cc \
-	content/child/npapi/plugin_lib.cc \
-	content/child/npapi/plugin_stream.cc \
-	content/child/npapi/plugin_stream_posix.cc \
-	content/child/npapi/plugin_stream_url.cc \
-	content/child/npapi/plugin_string_stream.cc \
-	content/child/npapi/webplugin_delegate_impl.cc \
-	content/child/npapi/webplugin_delegate_impl_android.cc \
 	content/child/plugin_message_generator.cc \
 	content/child/plugin_param_traits.cc \
 	content/child/power_monitor_broadcast_source.cc \
diff --git a/content/content_child.target.linux-arm.mk b/content/content_child.target.linux-arm.mk
index 540ce0c..264be10 100644
--- a/content/content_child.target.linux-arm.mk
+++ b/content/content_child.target.linux-arm.mk
@@ -55,15 +55,6 @@
 	content/child/npapi/npobject_stub.cc \
 	content/child/npapi/npobject_util.cc \
 	content/child/npapi/npruntime_util.cc \
-	content/child/npapi/plugin_host.cc \
-	content/child/npapi/plugin_instance.cc \
-	content/child/npapi/plugin_lib.cc \
-	content/child/npapi/plugin_stream.cc \
-	content/child/npapi/plugin_stream_posix.cc \
-	content/child/npapi/plugin_stream_url.cc \
-	content/child/npapi/plugin_string_stream.cc \
-	content/child/npapi/webplugin_delegate_impl.cc \
-	content/child/npapi/webplugin_delegate_impl_android.cc \
 	content/child/plugin_message_generator.cc \
 	content/child/plugin_param_traits.cc \
 	content/child/power_monitor_broadcast_source.cc \
diff --git a/content/content_child.target.linux-mips.mk b/content/content_child.target.linux-mips.mk
index 88dbb58..aea02dd 100644
--- a/content/content_child.target.linux-mips.mk
+++ b/content/content_child.target.linux-mips.mk
@@ -55,15 +55,6 @@
 	content/child/npapi/npobject_stub.cc \
 	content/child/npapi/npobject_util.cc \
 	content/child/npapi/npruntime_util.cc \
-	content/child/npapi/plugin_host.cc \
-	content/child/npapi/plugin_instance.cc \
-	content/child/npapi/plugin_lib.cc \
-	content/child/npapi/plugin_stream.cc \
-	content/child/npapi/plugin_stream_posix.cc \
-	content/child/npapi/plugin_stream_url.cc \
-	content/child/npapi/plugin_string_stream.cc \
-	content/child/npapi/webplugin_delegate_impl.cc \
-	content/child/npapi/webplugin_delegate_impl_android.cc \
 	content/child/plugin_message_generator.cc \
 	content/child/plugin_param_traits.cc \
 	content/child/power_monitor_broadcast_source.cc \
diff --git a/content/content_child.target.linux-x86.mk b/content/content_child.target.linux-x86.mk
index eea5017..affffa7 100644
--- a/content/content_child.target.linux-x86.mk
+++ b/content/content_child.target.linux-x86.mk
@@ -55,15 +55,6 @@
 	content/child/npapi/npobject_stub.cc \
 	content/child/npapi/npobject_util.cc \
 	content/child/npapi/npruntime_util.cc \
-	content/child/npapi/plugin_host.cc \
-	content/child/npapi/plugin_instance.cc \
-	content/child/npapi/plugin_lib.cc \
-	content/child/npapi/plugin_stream.cc \
-	content/child/npapi/plugin_stream_posix.cc \
-	content/child/npapi/plugin_stream_url.cc \
-	content/child/npapi/plugin_string_stream.cc \
-	content/child/npapi/webplugin_delegate_impl.cc \
-	content/child/npapi/webplugin_delegate_impl_android.cc \
 	content/child/plugin_message_generator.cc \
 	content/child/plugin_param_traits.cc \
 	content/child/power_monitor_broadcast_source.cc \
diff --git a/content/content_common.gypi b/content/content_common.gypi
index b89fb5e..42a345b 100644
--- a/content/content_common.gypi
+++ b/content/content_common.gypi
@@ -157,7 +157,9 @@
     'common/device_orientation/device_orientation_hardware_buffer.h',
     'common/device_orientation/device_orientation_messages.h',
     'common/devtools_messages.h',
-    'common/dom_storage_messages.h',
+    'common/dom_storage/dom_storage_map.cc',
+    'common/dom_storage/dom_storage_map.h',
+    'common/dom_storage/dom_storage_messages.h',
     'common/drag_event_source_info.h',
     'common/drag_messages.h',
     'common/drag_traits.h',
@@ -259,7 +261,6 @@
     'common/mac/font_loader.h',
     'common/mac/font_loader.mm',
     'common/media/audio_messages.h',
-    'common/media/encoded_video_capture_messages.h',
     'common/media/media_param_traits.cc',
     'common/media/media_param_traits.h',
     'common/media/media_player_messages_android.h',
diff --git a/content/content_common.target.darwin-arm.mk b/content/content_common.target.darwin-arm.mk
index a957abb..d1a213b 100644
--- a/content/content_common.target.darwin-arm.mk
+++ b/content/content_common.target.darwin-arm.mk
@@ -76,6 +76,7 @@
 	content/common/content_param_traits.cc \
 	content/common/content_paths.cc \
 	content/common/cookie_data.cc \
+	content/common/dom_storage/dom_storage_map.cc \
 	content/common/find_match_rect_android.cc \
 	content/common/font_list.cc \
 	content/common/font_list_android.cc \
diff --git a/content/content_common.target.darwin-mips.mk b/content/content_common.target.darwin-mips.mk
index 18c3033..ba84ef0 100644
--- a/content/content_common.target.darwin-mips.mk
+++ b/content/content_common.target.darwin-mips.mk
@@ -76,6 +76,7 @@
 	content/common/content_param_traits.cc \
 	content/common/content_paths.cc \
 	content/common/cookie_data.cc \
+	content/common/dom_storage/dom_storage_map.cc \
 	content/common/find_match_rect_android.cc \
 	content/common/font_list.cc \
 	content/common/font_list_android.cc \
diff --git a/content/content_common.target.darwin-x86.mk b/content/content_common.target.darwin-x86.mk
index 60ed34b..9d0a842 100644
--- a/content/content_common.target.darwin-x86.mk
+++ b/content/content_common.target.darwin-x86.mk
@@ -76,6 +76,7 @@
 	content/common/content_param_traits.cc \
 	content/common/content_paths.cc \
 	content/common/cookie_data.cc \
+	content/common/dom_storage/dom_storage_map.cc \
 	content/common/find_match_rect_android.cc \
 	content/common/font_list.cc \
 	content/common/font_list_android.cc \
diff --git a/content/content_common.target.linux-arm.mk b/content/content_common.target.linux-arm.mk
index a957abb..d1a213b 100644
--- a/content/content_common.target.linux-arm.mk
+++ b/content/content_common.target.linux-arm.mk
@@ -76,6 +76,7 @@
 	content/common/content_param_traits.cc \
 	content/common/content_paths.cc \
 	content/common/cookie_data.cc \
+	content/common/dom_storage/dom_storage_map.cc \
 	content/common/find_match_rect_android.cc \
 	content/common/font_list.cc \
 	content/common/font_list_android.cc \
diff --git a/content/content_common.target.linux-mips.mk b/content/content_common.target.linux-mips.mk
index 18c3033..ba84ef0 100644
--- a/content/content_common.target.linux-mips.mk
+++ b/content/content_common.target.linux-mips.mk
@@ -76,6 +76,7 @@
 	content/common/content_param_traits.cc \
 	content/common/content_paths.cc \
 	content/common/cookie_data.cc \
+	content/common/dom_storage/dom_storage_map.cc \
 	content/common/find_match_rect_android.cc \
 	content/common/font_list.cc \
 	content/common/font_list_android.cc \
diff --git a/content/content_common.target.linux-x86.mk b/content/content_common.target.linux-x86.mk
index 60ed34b..9d0a842 100644
--- a/content/content_common.target.linux-x86.mk
+++ b/content/content_common.target.linux-x86.mk
@@ -76,6 +76,7 @@
 	content/common/content_param_traits.cc \
 	content/common/content_paths.cc \
 	content/common/cookie_data.cc \
+	content/common/dom_storage/dom_storage_map.cc \
 	content/common/find_match_rect_android.cc \
 	content/common/font_list.cc \
 	content/common/font_list_android.cc \
diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi
index 53ddc8a..25ad0ea 100644
--- a/content/content_renderer.gypi
+++ b/content/content_renderer.gypi
@@ -402,8 +402,6 @@
     'renderer/pepper/usb_key_code_conversion_win.cc',
     'renderer/pepper/v8_var_converter.cc',
     'renderer/pepper/v8_var_converter.h',
-    'renderer/plugin_channel_host.cc',
-    'renderer/plugin_channel_host.h',
     'renderer/browser_plugin/browser_plugin.cc',
     'renderer/browser_plugin/browser_plugin.h',
     'renderer/browser_plugin/browser_plugin_backing_store.h',
@@ -431,6 +429,12 @@
     'renderer/fetchers/resource_fetcher.h',
     'renderer/ime_event_guard.cc',
     'renderer/ime_event_guard.h',
+    'renderer/npapi/plugin_channel_host.cc',
+    'renderer/npapi/plugin_channel_host.h',
+    'renderer/npapi/webplugin_delegate_proxy.cc',
+    'renderer/npapi/webplugin_delegate_proxy.h',
+    'renderer/npapi/webplugin_impl.cc',
+    'renderer/npapi/webplugin_impl.h',
     'renderer/render_frame_impl.cc',
     'renderer/render_frame_impl.h',
     'renderer/render_process.h',
@@ -500,10 +504,6 @@
     'renderer/web_ui_extension.h',
     'renderer/web_ui_extension_data.cc',
     'renderer/web_ui_extension_data.h',
-    'renderer/webplugin_delegate_proxy.cc',
-    'renderer/webplugin_delegate_proxy.h',
-    'renderer/webplugin_impl.cc',
-    'renderer/webplugin_impl.h',
     'renderer/websharedworker_proxy.cc',
     'renderer/websharedworker_proxy.h',
     'renderer/websharedworkerrepository_impl.cc',
@@ -599,10 +599,6 @@
         'renderer/media/rtc_data_channel_handler.h',
         'renderer/media/rtc_dtmf_sender_handler.cc',
         'renderer/media/rtc_dtmf_sender_handler.h',
-        'renderer/media/rtc_encoding_video_capturer.cc',
-        'renderer/media/rtc_encoding_video_capturer.h',
-        'renderer/media/rtc_encoding_video_capturer_factory.cc',
-        'renderer/media/rtc_encoding_video_capturer_factory.h',
         'renderer/media/rtc_media_constraints.cc',
         'renderer/media/rtc_media_constraints.h',
         'renderer/media/rtc_peer_connection_handler.cc',
@@ -674,6 +670,7 @@
       ],
     }, {  # enable_plugins==0
       'sources/': [
+        ['exclude', '^renderer/npapi/'],
         ['exclude', '^renderer/pepper/'],
       ],
       'sources!': [
diff --git a/content/content_renderer.target.darwin-arm.mk b/content/content_renderer.target.darwin-arm.mk
index 0eca00f..4fb613c 100644
--- a/content/content_renderer.target.darwin-arm.mk
+++ b/content/content_renderer.target.darwin-arm.mk
@@ -138,7 +138,6 @@
 	content/renderer/mouse_lock_dispatcher.cc \
 	content/renderer/paint_aggregator.cc \
 	content/renderer/password_form_conversion_utils.cc \
-	content/renderer/plugin_channel_host.cc \
 	content/renderer/browser_plugin/browser_plugin.cc \
 	content/renderer/browser_plugin/browser_plugin_backing_store.cc \
 	content/renderer/browser_plugin/browser_plugin_bindings.cc \
@@ -185,8 +184,6 @@
 	content/renderer/webcrypto_impl.cc \
 	content/renderer/web_ui_extension.cc \
 	content/renderer/web_ui_extension_data.cc \
-	content/renderer/webplugin_delegate_proxy.cc \
-	content/renderer/webplugin_impl.cc \
 	content/renderer/websharedworker_proxy.cc \
 	content/renderer/websharedworkerrepository_impl.cc
 
diff --git a/content/content_renderer.target.darwin-mips.mk b/content/content_renderer.target.darwin-mips.mk
index be11b4b..5ccec42 100644
--- a/content/content_renderer.target.darwin-mips.mk
+++ b/content/content_renderer.target.darwin-mips.mk
@@ -138,7 +138,6 @@
 	content/renderer/mouse_lock_dispatcher.cc \
 	content/renderer/paint_aggregator.cc \
 	content/renderer/password_form_conversion_utils.cc \
-	content/renderer/plugin_channel_host.cc \
 	content/renderer/browser_plugin/browser_plugin.cc \
 	content/renderer/browser_plugin/browser_plugin_backing_store.cc \
 	content/renderer/browser_plugin/browser_plugin_bindings.cc \
@@ -185,8 +184,6 @@
 	content/renderer/webcrypto_impl.cc \
 	content/renderer/web_ui_extension.cc \
 	content/renderer/web_ui_extension_data.cc \
-	content/renderer/webplugin_delegate_proxy.cc \
-	content/renderer/webplugin_impl.cc \
 	content/renderer/websharedworker_proxy.cc \
 	content/renderer/websharedworkerrepository_impl.cc
 
diff --git a/content/content_renderer.target.darwin-x86.mk b/content/content_renderer.target.darwin-x86.mk
index ab3a363..1db78f3 100644
--- a/content/content_renderer.target.darwin-x86.mk
+++ b/content/content_renderer.target.darwin-x86.mk
@@ -138,7 +138,6 @@
 	content/renderer/mouse_lock_dispatcher.cc \
 	content/renderer/paint_aggregator.cc \
 	content/renderer/password_form_conversion_utils.cc \
-	content/renderer/plugin_channel_host.cc \
 	content/renderer/browser_plugin/browser_plugin.cc \
 	content/renderer/browser_plugin/browser_plugin_backing_store.cc \
 	content/renderer/browser_plugin/browser_plugin_bindings.cc \
@@ -185,8 +184,6 @@
 	content/renderer/webcrypto_impl.cc \
 	content/renderer/web_ui_extension.cc \
 	content/renderer/web_ui_extension_data.cc \
-	content/renderer/webplugin_delegate_proxy.cc \
-	content/renderer/webplugin_impl.cc \
 	content/renderer/websharedworker_proxy.cc \
 	content/renderer/websharedworkerrepository_impl.cc
 
diff --git a/content/content_renderer.target.linux-arm.mk b/content/content_renderer.target.linux-arm.mk
index 0eca00f..4fb613c 100644
--- a/content/content_renderer.target.linux-arm.mk
+++ b/content/content_renderer.target.linux-arm.mk
@@ -138,7 +138,6 @@
 	content/renderer/mouse_lock_dispatcher.cc \
 	content/renderer/paint_aggregator.cc \
 	content/renderer/password_form_conversion_utils.cc \
-	content/renderer/plugin_channel_host.cc \
 	content/renderer/browser_plugin/browser_plugin.cc \
 	content/renderer/browser_plugin/browser_plugin_backing_store.cc \
 	content/renderer/browser_plugin/browser_plugin_bindings.cc \
@@ -185,8 +184,6 @@
 	content/renderer/webcrypto_impl.cc \
 	content/renderer/web_ui_extension.cc \
 	content/renderer/web_ui_extension_data.cc \
-	content/renderer/webplugin_delegate_proxy.cc \
-	content/renderer/webplugin_impl.cc \
 	content/renderer/websharedworker_proxy.cc \
 	content/renderer/websharedworkerrepository_impl.cc
 
diff --git a/content/content_renderer.target.linux-mips.mk b/content/content_renderer.target.linux-mips.mk
index be11b4b..5ccec42 100644
--- a/content/content_renderer.target.linux-mips.mk
+++ b/content/content_renderer.target.linux-mips.mk
@@ -138,7 +138,6 @@
 	content/renderer/mouse_lock_dispatcher.cc \
 	content/renderer/paint_aggregator.cc \
 	content/renderer/password_form_conversion_utils.cc \
-	content/renderer/plugin_channel_host.cc \
 	content/renderer/browser_plugin/browser_plugin.cc \
 	content/renderer/browser_plugin/browser_plugin_backing_store.cc \
 	content/renderer/browser_plugin/browser_plugin_bindings.cc \
@@ -185,8 +184,6 @@
 	content/renderer/webcrypto_impl.cc \
 	content/renderer/web_ui_extension.cc \
 	content/renderer/web_ui_extension_data.cc \
-	content/renderer/webplugin_delegate_proxy.cc \
-	content/renderer/webplugin_impl.cc \
 	content/renderer/websharedworker_proxy.cc \
 	content/renderer/websharedworkerrepository_impl.cc
 
diff --git a/content/content_renderer.target.linux-x86.mk b/content/content_renderer.target.linux-x86.mk
index ab3a363..1db78f3 100644
--- a/content/content_renderer.target.linux-x86.mk
+++ b/content/content_renderer.target.linux-x86.mk
@@ -138,7 +138,6 @@
 	content/renderer/mouse_lock_dispatcher.cc \
 	content/renderer/paint_aggregator.cc \
 	content/renderer/password_form_conversion_utils.cc \
-	content/renderer/plugin_channel_host.cc \
 	content/renderer/browser_plugin/browser_plugin.cc \
 	content/renderer/browser_plugin/browser_plugin_backing_store.cc \
 	content/renderer/browser_plugin/browser_plugin_bindings.cc \
@@ -185,8 +184,6 @@
 	content/renderer/webcrypto_impl.cc \
 	content/renderer/web_ui_extension.cc \
 	content/renderer/web_ui_extension_data.cc \
-	content/renderer/webplugin_delegate_proxy.cc \
-	content/renderer/webplugin_impl.cc \
 	content/renderer/websharedworker_proxy.cc \
 	content/renderer/websharedworkerrepository_impl.cc
 
diff --git a/content/content_tests.gypi b/content/content_tests.gypi
index df479b0..bbd785c 100644
--- a/content/content_tests.gypi
+++ b/content/content_tests.gypi
@@ -284,6 +284,10 @@
         'browser/device_orientation/provider_unittest.cc',
         'browser/devtools/devtools_http_handler_unittest.cc',
         'browser/devtools/devtools_manager_unittest.cc',
+        'browser/dom_storage/dom_storage_area_unittest.cc',
+        'browser/dom_storage/dom_storage_context_impl_unittest.cc',
+        'browser/dom_storage/dom_storage_database_unittest.cc',
+        'browser/dom_storage/session_storage_database_unittest.cc',
         'browser/download/base_file_unittest.cc',
         'browser/download/download_file_unittest.cc',
         'browser/download/download_item_impl_unittest.cc',
@@ -396,6 +400,7 @@
         'common/android/address_parser_unittest.cc',
         'common/cc_messages_unittest.cc',
         'common/common_param_traits_unittest.cc',
+        'common/dom_storage/dom_storage_map_unittest.cc',
         'common/gpu/gpu_memory_manager_unittest.cc',
         'common/indexed_db/indexed_db_key_unittest.cc',
         'common/inter_process_time_ticks_converter_unittest.cc',
@@ -435,6 +440,7 @@
         'renderer/media/video_capture_message_filter_unittest.cc',
         'renderer/media/video_destination_handler_unittest.cc',
         'renderer/media/webaudiosourceprovider_impl_unittest.cc',
+        'renderer/npapi/webplugin_impl_unittest.cc',
         'renderer/paint_aggregator_unittest.cc',
         'renderer/pepper/host_var_tracker_unittest.cc',
         'renderer/pepper/mock_resource.h',
@@ -447,9 +453,9 @@
         'renderer/render_view_impl_unittest.cc',
         'renderer/skia_benchmarking_extension_unittest.cc',
         'renderer/v8_value_converter_impl_unittest.cc',
-        'renderer/webplugin_impl_unittest.cc',
         'test/image_decoder_test.cc',
         'test/image_decoder_test.h',
+        'test/run_all_unittests.cc',
         '../webkit/browser/appcache/appcache_database_unittest.cc',
         '../webkit/browser/appcache/appcache_group_unittest.cc',
         '../webkit/browser/appcache/appcache_host_unittest.cc',
@@ -480,10 +486,6 @@
         '../webkit/browser/database/database_tracker_unittest.cc',
         '../webkit/browser/database/database_util_unittest.cc',
         '../webkit/browser/database/databases_table_unittest.cc',
-        '../webkit/browser/dom_storage/dom_storage_area_unittest.cc',
-        '../webkit/browser/dom_storage/dom_storage_context_unittest.cc',
-        '../webkit/browser/dom_storage/dom_storage_database_unittest.cc',
-        '../webkit/browser/dom_storage/session_storage_database_unittest.cc',
         '../webkit/browser/fileapi/async_file_test_helper.cc',
         '../webkit/browser/fileapi/async_file_test_helper.h',
         '../webkit/browser/fileapi/copy_or_move_file_validator_unittest.cc',
@@ -525,7 +527,6 @@
         '../webkit/browser/fileapi/timed_task_helper_unittest.cc',
         '../webkit/browser/fileapi/transient_file_util_unittest.cc',
         '../webkit/browser/fileapi/upload_file_system_file_element_reader_unittest.cc',
-        'test/run_all_unittests.cc',
         '../webkit/child/multipart_response_delegate_unittest.cc',
         '../webkit/child/touch_fling_gesture_curve_unittest.cc',
         '../webkit/child/worker_task_runner_unittest.cc',
@@ -533,7 +534,6 @@
         '../webkit/common/cursors/webcursor_unittest.cc',
         '../webkit/common/database/database_connections_unittest.cc',
         '../webkit/common/database/database_identifier_unittest.cc',
-        '../webkit/common/dom_storage/dom_storage_map_unittest.cc',
         '../webkit/common/fileapi/file_system_util_unittest.cc',
         '../webkit/glue/webkit_glue_unittest.cc',
         '../webkit/mocks/mock_weburlloader.cc',
@@ -599,8 +599,10 @@
         }],
         ['enable_plugins==0', {
           'sources/': [
-            ['exclude', '^renderer/pepper/'],
             ['exclude', '^browser/renderer_host/pepper/'],
+            ['exclude', '^child/npapi/'],
+            ['exclude', '^renderer/npapi/'],
+            ['exclude', '^renderer/pepper/'],
           ],
           'sources!': [
             'browser/plugin_loader_posix_unittest.cc',
@@ -841,12 +843,12 @@
             'browser/webkit_browsertest.cc',
             'browser/worker_host/test/worker_browsertest.cc',
             'renderer/accessibility/renderer_accessibility_browsertest.cc',
-            'renderer/browser_plugin/mock_browser_plugin.h',
-            'renderer/browser_plugin/mock_browser_plugin.cc',
-            'renderer/browser_plugin/mock_browser_plugin_manager.h',
-            'renderer/browser_plugin/mock_browser_plugin_manager.cc',
-            'renderer/browser_plugin/browser_plugin_browsertest.h',
             'renderer/browser_plugin/browser_plugin_browsertest.cc',
+            'renderer/browser_plugin/browser_plugin_browsertest.h',
+            'renderer/browser_plugin/mock_browser_plugin.cc',
+            'renderer/browser_plugin/mock_browser_plugin.h',
+            'renderer/browser_plugin/mock_browser_plugin_manager.cc',
+            'renderer/browser_plugin/mock_browser_plugin_manager.h',
             'renderer/cpp_bound_class_unittest.cc',
             'renderer/dom_serializer_browsertest.cc',
             'renderer/mouse_lock_dispatcher_browsertest.cc',
@@ -871,8 +873,8 @@
             'test/content_browser_test_utils_mac.mm',
             'test/content_browser_test_test.cc',
             'test/content_test_launcher.cc',
-            '../webkit/renderer/cpp_binding_example.cc',
-            '../webkit/renderer/cpp_binding_example.h',
+            'test/cpp_binding_example.cc',
+            'test/cpp_binding_example.h',
           ],
           'conditions': [
             ['chromeos==0', {
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentView.java b/content/public/android/java/src/org/chromium/content/browser/ContentView.java
index dce2cbf..135cb26 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentView.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentView.java
@@ -314,10 +314,6 @@
         mContentViewCore.getContentViewGestureHandler().fling(timeMs, x, y, velocityX, velocityY);
     }
 
-    void endFling(long timeMs) {
-        mContentViewCore.getContentViewGestureHandler().endFling(timeMs);
-    }
-
     /**
      * Start pinch zoom. You must call {@link #pinchEnd} to stop.
      */
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewGestureHandler.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewGestureHandler.java
index eb5ef13..053aa9a 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewGestureHandler.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewGestureHandler.java
@@ -86,12 +86,12 @@
     // will be mistakenly fired.
     private boolean mIgnoreSingleTap;
 
-    // Does native think we are scrolling?  True from right before we
-    // send the first scroll event until the last finger is raised.
-    // Call nativeScrollBegin() when setting this to true, and use
-    // tellNativeScrollingHasEnded() to set it to false.
-    private boolean mNativeScrolling;
+    // True from right before we send the first scroll event until the last finger is raised.
+    private boolean mTouchScrolling;
 
+    // TODO(wangxianzhu): For now it is true after a fling is started until the next
+    // touch. Should reset it to false on end of fling if the UI is able to know when the
+    // fling ends.
     private boolean mFlingMayBeActive;
 
     private boolean mSeenFirstScrollEvent;
@@ -352,7 +352,7 @@
                     public boolean onDown(MotionEvent e) {
                         mShowPressIsCalled = false;
                         mIgnoreSingleTap = false;
-                        mNativeScrolling = false;
+                        mTouchScrolling = false;
                         mSeenFirstScrollEvent = false;
                         mSnapScrollController.resetSnapScrollMode();
                         mLastRawX = e.getRawX();
@@ -394,11 +394,11 @@
                         mLastRawX = e2.getRawX();
                         mLastRawY = e2.getRawY();
                         if (didUIStealScroll) return true;
-                        if (!mNativeScrolling) {
+                        if (!mTouchScrolling) {
                             sendShowPressCancelIfNecessary(e1);
-                            endFling(e2.getEventTime());
+                            endFlingIfNecessary(e2.getEventTime());
                             if (sendMotionEventAsGesture(GESTURE_SCROLL_START, e1, null)) {
-                                mNativeScrolling = true;
+                                mTouchScrolling = true;
                             }
                         }
                         // distanceX and distanceY is the scrolling offset since last onScroll.
@@ -632,13 +632,13 @@
      * @param velocityY Initial velocity of the fling (Y) measured in pixels per second.
      */
     void fling(long timeMs, int x, int y, int velocityX, int velocityY) {
-        boolean nativeScrolling = mNativeScrolling;
-        endFling(timeMs);
-        if (!nativeScrolling) {
+        endFlingIfNecessary(timeMs);
+        if (!mTouchScrolling) {
             // The native side needs a GESTURE_SCROLL_BEGIN before GESTURE_FLING_START
             // to send the fling to the correct target. Send if it has not sent.
             sendGesture(GESTURE_SCROLL_START, timeMs, x, y, null);
         }
+        endTouchScrollIfNecessary(timeMs, false);
 
         mFlingMayBeActive = true;
 
@@ -649,15 +649,13 @@
     }
 
     /**
-     * Send a FlingCancel gesture event and also cancel scrolling if it is active.
+     * Send a GESTURE_FLING_CANCEL event if necessary.
      * @param timeMs The time in ms for the event initiating this gesture.
      */
-    void endFling(long timeMs) {
-        if (mFlingMayBeActive) {
-            sendGesture(GESTURE_FLING_CANCEL, timeMs, 0, 0, null);
-            tellNativeScrollingHasEnded(timeMs, false);
-            mFlingMayBeActive = false;
-        }
+    void endFlingIfNecessary(long timeMs) {
+        if (!mFlingMayBeActive) return;
+        mFlingMayBeActive = false;
+        sendGesture(GESTURE_FLING_CANCEL, timeMs, 0, 0, null);
     }
 
     /**
@@ -675,23 +673,26 @@
         mDoubleTapDragMode = DOUBLE_TAP_DRAG_MODE_NONE;
     }
 
-    // If native thinks scrolling (or fling-scrolling) is going on, tell native
-    // it has ended.
-    private void tellNativeScrollingHasEnded(long timeMs, boolean sendScrollEndEvent) {
-        if (mNativeScrolling) {
-            mNativeScrolling = false;
-            if (sendScrollEndEvent) {
-                sendGesture(GESTURE_SCROLL_END, timeMs, 0, 0, null);
-            }
+    /**
+     * Reset touch scroll flag and optionally send a GESTURE_SCROLL_END event if necessary.
+     * @param timeMs The time in ms for the event initiating this gesture.
+     * @param sendScrollEndEvent Whether to send GESTURE_SCROLL_END event.
+     */
+    private void endTouchScrollIfNecessary(long timeMs, boolean sendScrollEndEvent) {
+        if (!mTouchScrolling) return;
+        mTouchScrolling = false;
+        if (sendScrollEndEvent) {
+            sendGesture(GESTURE_SCROLL_END, timeMs, 0, 0, null);
         }
     }
 
     /**
-     * @return Whether native is tracking a scroll (i.e. between sending GESTURE_SCROLL_START and
-     *         GESTURE_SCROLL_END, or during a fling before sending GESTURE_FLING_CANCEL).
+     * @return Whether native is tracking a scroll.
      */
     boolean isNativeScrolling() {
-        return mNativeScrolling;
+        // TODO(wangxianzhu): Also return true when fling is active once the UI knows exactly when
+        // the fling ends.
+        return mTouchScrolling;
     }
 
     /**
@@ -777,7 +778,7 @@
             if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
                 mNoTouchHandlerForGesture = false;
                 mJavaScriptIsConsumingGesture = false;
-                endFling(event.getEventTime());
+                endFlingIfNecessary(event.getEventTime());
             } else if (event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) {
                 endDoubleTapDragMode(null);
             }
@@ -899,14 +900,15 @@
 
         if (type == TouchPoint.CONVERSION_ERROR) return EVENT_NOT_FORWARDED;
 
-        if (!mNativeScrolling && !mPinchInProgress) {
+        if (!mTouchScrolling && !mPinchInProgress) {
             mTouchCancelEventSent = false;
 
             if (mMotionEventDelegate.sendTouchEvent(event.getEventTime(), type, pts)) {
                 // If confirmTouchEvent() is called synchronously with respect to sendTouchEvent(),
                 // then |event| will have been recycled. Only start the timer if the sent event has
                 // not yet been confirmed.
-                if (event == mPendingMotionEvents.peekFirst()
+                if (!mJavaScriptIsConsumingGesture
+                        && event == mPendingMotionEvents.peekFirst()
                         && event.getAction() != MotionEvent.ACTION_UP
                         && event.getAction() != MotionEvent.ACTION_CANCEL) {
                     mTouchEventTimeoutHandler.start(event.getEventTime(), pts);
@@ -940,7 +942,7 @@
         // give the mSimpleTouchDetector a chance to continue
         // scrolling with a fling.
         if (event.getAction() == MotionEvent.ACTION_UP) {
-            if (mNativeScrolling) {
+            if (mTouchScrolling) {
                 possiblyEndMovement = true;
             }
         }
@@ -960,7 +962,7 @@
         handled |= mZoomManager.processTouchEvent(event);
 
         if (possiblyEndMovement && !handled) {
-            tellNativeScrollingHasEnded(event.getEventTime(), true);
+            endTouchScrollIfNecessary(event.getEventTime(), true);
         }
 
         return handled;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java
index 8cc0709..2647b3a 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java
@@ -605,7 +605,7 @@
                 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
                 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
         assertTrue(mGestureHandler.onTouchEvent(event));
-
+        assertTrue(mGestureHandler.isNativeScrolling());
         assertTrue("A scrollStart event should have been sent",
                 mockDelegate.mGestureTypeList.contains(
                         ContentViewGestureHandler.GESTURE_SCROLL_START));
@@ -619,6 +619,7 @@
                 downTime, eventTime + 15, MotionEvent.ACTION_UP,
                 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
         assertTrue(mGestureHandler.onTouchEvent(event));
+        assertFalse(mGestureHandler.isNativeScrolling());
         assertEquals("We should have started flinging",
                 ContentViewGestureHandler.GESTURE_FLING_START,
                         mockDelegate.mMostRecentGestureEvent.mType);
diff --git a/content/public/browser/android/synchronous_compositor.h b/content/public/browser/android/synchronous_compositor.h
index 5223480..f559b97 100644
--- a/content/public/browser/android/synchronous_compositor.h
+++ b/content/public/browser/android/synchronous_compositor.h
@@ -5,6 +5,7 @@
 #ifndef CONTENT_PUBLIC_BROWSER_ANDROID_SYNCHRONOUS_COMPOSITOR_H_
 #define CONTENT_PUBLIC_BROWSER_ANDROID_SYNCHRONOUS_COMPOSITOR_H_
 
+#include "base/memory/ref_counted.h"
 #include "content/common/content_export.h"
 #include "ui/gfx/rect.h"
 #include "ui/gfx/size.h"
@@ -12,6 +13,7 @@
 class SkCanvas;
 
 namespace gfx {
+class GLSurface;
 class Transform;
 };
 
@@ -40,8 +42,9 @@
   // Synchronously initialize compositor for hardware draw. Can only be called
   // while compositor is in software only mode, either after compositor is
   // first created or after ReleaseHwDraw is called. It is invalid to
-  // DemandDrawHw before this returns true.
-  virtual bool InitializeHwDraw() = 0;
+  // DemandDrawHw before this returns true. |surface| is the GLSurface that
+  // should be used to create the underlying hardware context.
+  virtual bool InitializeHwDraw(scoped_refptr<gfx::GLSurface> surface) = 0;
 
   // Reverse of InitializeHwDraw above. Can only be called while hardware draw
   // is already initialized. Brings compositor back to software only mode and
diff --git a/content/public/browser/dom_storage_context.h b/content/public/browser/dom_storage_context.h
index d0c502f..a4aba1e 100644
--- a/content/public/browser/dom_storage_context.h
+++ b/content/public/browser/dom_storage_context.h
@@ -9,29 +9,25 @@
 #include <vector>
 
 #include "base/callback.h"
-#include "content/common/content_export.h"
 
 class GURL;
 
-namespace dom_storage {
-struct LocalStorageUsageInfo;
-struct SessionStorageUsageInfo;
-}
-
 namespace content {
 
 class BrowserContext;
+struct LocalStorageUsageInfo;
 class SessionStorageNamespace;
+struct SessionStorageUsageInfo;
 
 // Represents the per-BrowserContext Local Storage data.
 class DOMStorageContext {
  public:
   typedef base::Callback<
-      void(const std::vector<dom_storage::LocalStorageUsageInfo>&)>
+      void(const std::vector<LocalStorageUsageInfo>&)>
           GetLocalStorageUsageCallback;
 
   typedef base::Callback<
-      void(const std::vector<dom_storage::SessionStorageUsageInfo>&)>
+      void(const std::vector<SessionStorageUsageInfo>&)>
           GetSessionStorageUsageCallback;
 
   // Returns a collection of origins using local storage to the given callback.
@@ -48,12 +44,12 @@
 
   // Deletes the session storage data identified by |usage_info|.
   virtual void DeleteSessionStorage(
-      const dom_storage::SessionStorageUsageInfo& usage_info) = 0;
+      const SessionStorageUsageInfo& usage_info) = 0;
 
   // If this is called, sessionStorage data will be stored on disk, and can be
   // restored after a browser restart (with RecreateSessionStorage). This
-  // function must be called right after DOMStorageContextImpl is created, and
-  // before it's used.
+  // function must be called right after DOMStorageContextWrapper is created,
+  // and before it's used.
   virtual void SetSaveSessionStorageOnDisk() = 0;
 
   // Creates a SessionStorageNamespace with the given |persistent_id|. Used
diff --git a/content/public/browser/local_storage_usage_info.cc b/content/public/browser/local_storage_usage_info.cc
new file mode 100644
index 0000000..7bbfed3
--- /dev/null
+++ b/content/public/browser/local_storage_usage_info.cc
@@ -0,0 +1,14 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/browser/local_storage_usage_info.h"
+
+namespace content {
+
+LocalStorageUsageInfo::LocalStorageUsageInfo()
+    : data_size(0) {}
+
+LocalStorageUsageInfo::~LocalStorageUsageInfo() {}
+
+}  // namespace content
diff --git a/content/public/browser/local_storage_usage_info.h b/content/public/browser/local_storage_usage_info.h
new file mode 100644
index 0000000..8048c6c
--- /dev/null
+++ b/content/public/browser/local_storage_usage_info.h
@@ -0,0 +1,26 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_BROWSER_LOCAL_STORAGE_USAGE_INFO_H_
+#define CONTENT_PUBLIC_BROWSER_LOCAL_STORAGE_USAGE_INFO_H_
+
+#include "base/time/time.h"
+#include "content/common/content_export.h"
+#include "url/gurl.h"
+
+namespace content {
+
+// Used to report Local Storage usage info by DOMStorageContext.
+struct CONTENT_EXPORT LocalStorageUsageInfo {
+  GURL origin;
+  size_t data_size;
+  base::Time last_modified;
+
+  LocalStorageUsageInfo();
+  ~LocalStorageUsageInfo();
+};
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_BROWSER_LOCAL_STORAGE_USAGE_INFO_H_
diff --git a/content/public/browser/session_storage_usage_info.h b/content/public/browser/session_storage_usage_info.h
new file mode 100644
index 0000000..2faf952
--- /dev/null
+++ b/content/public/browser/session_storage_usage_info.h
@@ -0,0 +1,18 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_BROWSER_SESSION_STORAGE_USAGE_INFO_H_
+#define CONTENT_PUBLIC_BROWSER_SESSION_STORAGE_USAGE_INFO_H_
+
+namespace content {
+
+// Used to report Session Storage usage info by DOMStorageContext.
+struct CONTENT_EXPORT SessionStorageUsageInfo {
+  GURL origin;
+  std::string persistent_namespace_id;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_BROWSER_SESSION_STORAGE_USAGE_INFO_H_
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index fe4150e..40e932b 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -335,11 +335,6 @@
 // Enables restarting interrupted downloads.
 const char kEnableDownloadResumption[]      = "enable-download-resumption";
 
-#if defined(OS_CHROMEOS)
-// Enables hardware-encoded screen capture.
-const char kEnableEncodedScreenCapture[]    = "enable-encoded-screen-capture";
-#endif
-
 // Enables Web Platform features that are in development.
 const char kEnableExperimentalWebPlatformFeatures[] =
     "enable-experimental-web-platform-features";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index 7b548ac..9124de1 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -35,9 +35,6 @@
 CONTENT_EXPORT extern const char kDisableDatabases[];
 extern const char kDisableDesktopNotifications[];
 CONTENT_EXPORT extern const char kDisableDeviceOrientation[];
-#if defined(OS_CHROMEOS)
-CONTENT_EXPORT extern const char kEnableEncodedScreenCapture[];
-#endif
 CONTENT_EXPORT extern const char kDisableExperimentalWebGL[];
 CONTENT_EXPORT extern const char kBlacklistAcceleratedCompositing[];
 CONTENT_EXPORT extern const char kBlacklistWebGL[];
diff --git a/content/public/test/render_view_fake_resources_test.cc b/content/public/test/render_view_fake_resources_test.cc
index 3b9d35b..89c6900 100644
--- a/content/public/test/render_view_fake_resources_test.cc
+++ b/content/public/test/render_view_fake_resources_test.cc
@@ -11,6 +11,7 @@
 #include "base/process/process.h"
 #include "base/run_loop.h"
 #include "base/time/time.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "content/common/resource_messages.h"
 #include "content/common/view_messages.h"
 #include "content/public/common/resource_response.h"
@@ -30,7 +31,6 @@
 #include "third_party/WebKit/public/web/WebView.h"
 #include "ui/base/ui_base_switches.h"
 #include "url/gurl.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 #include "webkit/glue/webkit_glue.h"
 
 namespace content {
@@ -87,8 +87,7 @@
   ViewMsg_New_Params params;
   params.view_id = kViewId;
   params.opener_route_id = MSG_ROUTING_NONE;
-  params.session_storage_namespace_id =
-      dom_storage::kInvalidSessionStorageNamespaceId;
+  params.session_storage_namespace_id = kInvalidSessionStorageNamespaceId;
   ASSERT_TRUE(channel_->Send(new ViewMsg_New(params)));
   message_loop_.Run();
 }
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc
index 99bdc18..df772f6 100644
--- a/content/public/test/render_view_test.cc
+++ b/content/public/test/render_view_test.cc
@@ -5,6 +5,7 @@
 #include "content/public/test/render_view_test.h"
 
 #include "base/run_loop.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "content/common/input_messages.h"
 #include "content/common/view_messages.h"
 #include "content/public/browser/native_web_keyboard_event.h"
@@ -25,7 +26,6 @@
 #include "third_party/WebKit/public/web/WebScriptSource.h"
 #include "third_party/WebKit/public/web/WebView.h"
 #include "ui/base/resource/resource_bundle.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 #include "webkit/glue/webkit_glue.h"
 
 using WebKit::WebFrame;
@@ -173,7 +173,7 @@
       kRouteId,
       kMainFrameRouteId,
       kSurfaceId,
-      dom_storage::kInvalidSessionStorageNamespaceId,
+      kInvalidSessionStorageNamespaceId,
       string16(),
       false,
       false,
diff --git a/content/renderer/cpp_bound_class_unittest.cc b/content/renderer/cpp_bound_class_unittest.cc
index 29c2fd4..2c0f75f 100644
--- a/content/renderer/cpp_bound_class_unittest.cc
+++ b/content/renderer/cpp_bound_class_unittest.cc
@@ -10,13 +10,12 @@
 #include "content/public/common/url_constants.h"
 #include "content/public/renderer/render_view_observer.h"
 #include "content/public/test/render_view_test.h"
+#include "content/test/cpp_binding_example.h"
 #include "third_party/WebKit/public/platform/WebURLRequest.h"
 #include "third_party/WebKit/public/web/WebDocument.h"
 #include "third_party/WebKit/public/web/WebElement.h"
-#include "webkit/renderer/cpp_binding_example.h"
 
 using webkit_glue::CppArgumentList;
-using webkit_glue::CppBindingExample;
 using webkit_glue::CppVariant;
 
 namespace content {
diff --git a/content/renderer/devtools/devtools_agent_filter.cc b/content/renderer/devtools/devtools_agent_filter.cc
index 8d448dd..1613ad8 100644
--- a/content/renderer/devtools/devtools_agent_filter.cc
+++ b/content/renderer/devtools/devtools_agent_filter.cc
@@ -8,7 +8,6 @@
 #include "base/message_loop/message_loop.h"
 #include "content/common/devtools_messages.h"
 #include "content/renderer/devtools/devtools_agent.h"
-#include "content/renderer/plugin_channel_host.h"
 #include "third_party/WebKit/public/platform/WebString.h"
 #include "third_party/WebKit/public/web/WebDevToolsAgent.h"
 
diff --git a/content/renderer/dom_storage/OWNERS b/content/renderer/dom_storage/OWNERS
index 66ceac5..e1e6b1b 100644
--- a/content/renderer/dom_storage/OWNERS
+++ b/content/renderer/dom_storage/OWNERS
@@ -1,2 +1,7 @@
-marja@chromium.org
 michaeln@chromium.org
+kinuko@chromium.org
+jsbell@chromium.org
+ericu@chromium.org
+marja@chromium.org
+
+# Please include michaeln@ or marja@ if you make any functional/runtime changes.
diff --git a/content/renderer/dom_storage/dom_storage_cached_area.cc b/content/renderer/dom_storage/dom_storage_cached_area.cc
index a0203bb..a01d3c6 100644
--- a/content/renderer/dom_storage/dom_storage_cached_area.cc
+++ b/content/renderer/dom_storage/dom_storage_cached_area.cc
@@ -7,47 +7,47 @@
 #include "base/basictypes.h"
 #include "base/metrics/histogram.h"
 #include "base/time/time.h"
+#include "content/common/dom_storage/dom_storage_map.h"
 #include "content/renderer/dom_storage/dom_storage_proxy.h"
-#include "webkit/common/dom_storage/dom_storage_map.h"
 
 namespace content {
 
-DomStorageCachedArea::DomStorageCachedArea(int64 namespace_id,
+DOMStorageCachedArea::DOMStorageCachedArea(int64 namespace_id,
                                            const GURL& origin,
-                                           DomStorageProxy* proxy)
+                                           DOMStorageProxy* proxy)
     : ignore_all_mutations_(false),
       namespace_id_(namespace_id),
       origin_(origin),
       proxy_(proxy),
       weak_factory_(this) {}
 
-DomStorageCachedArea::~DomStorageCachedArea() {}
+DOMStorageCachedArea::~DOMStorageCachedArea() {}
 
-unsigned DomStorageCachedArea::GetLength(int connection_id) {
+unsigned DOMStorageCachedArea::GetLength(int connection_id) {
   PrimeIfNeeded(connection_id);
   return map_->Length();
 }
 
-base::NullableString16 DomStorageCachedArea::GetKey(int connection_id,
+base::NullableString16 DOMStorageCachedArea::GetKey(int connection_id,
                                                     unsigned index) {
   PrimeIfNeeded(connection_id);
   return map_->Key(index);
 }
 
-base::NullableString16 DomStorageCachedArea::GetItem(
+base::NullableString16 DOMStorageCachedArea::GetItem(
     int connection_id,
     const base::string16& key) {
   PrimeIfNeeded(connection_id);
   return map_->GetItem(key);
 }
 
-bool DomStorageCachedArea::SetItem(int connection_id,
+bool DOMStorageCachedArea::SetItem(int connection_id,
                                    const base::string16& key,
                                    const base::string16& value,
                                    const GURL& page_url) {
   // A quick check to reject obviously overbudget items to avoid
   // the priming the cache.
-  if (key.length() + value.length() > dom_storage::kPerAreaQuota)
+  if (key.length() + value.length() > kPerStorageAreaQuota)
     return false;
 
   PrimeIfNeeded(connection_id);
@@ -59,12 +59,12 @@
   ignore_key_mutations_[key]++;
   proxy_->SetItem(
       connection_id, key, value, page_url,
-      base::Bind(&DomStorageCachedArea::OnSetItemComplete,
+      base::Bind(&DOMStorageCachedArea::OnSetItemComplete,
                  weak_factory_.GetWeakPtr(), key));
   return true;
 }
 
-void DomStorageCachedArea::RemoveItem(int connection_id,
+void DOMStorageCachedArea::RemoveItem(int connection_id,
                                       const base::string16& key,
                                       const GURL& page_url) {
   PrimeIfNeeded(connection_id);
@@ -76,24 +76,24 @@
   ignore_key_mutations_[key]++;
   proxy_->RemoveItem(
       connection_id, key, page_url,
-      base::Bind(&DomStorageCachedArea::OnRemoveItemComplete,
+      base::Bind(&DOMStorageCachedArea::OnRemoveItemComplete,
                  weak_factory_.GetWeakPtr(), key));
 }
 
-void DomStorageCachedArea::Clear(int connection_id, const GURL& page_url) {
+void DOMStorageCachedArea::Clear(int connection_id, const GURL& page_url) {
   // No need to prime the cache in this case.
   Reset();
-  map_ = new dom_storage::DomStorageMap(dom_storage::kPerAreaQuota);
+  map_ = new DOMStorageMap(kPerStorageAreaQuota);
 
   // Ignore all mutations until OnClearComplete time.
   ignore_all_mutations_ = true;
   proxy_->ClearArea(connection_id,
                     page_url,
-                    base::Bind(&DomStorageCachedArea::OnClearComplete,
+                    base::Bind(&DOMStorageCachedArea::OnClearComplete,
                                weak_factory_.GetWeakPtr()));
 }
 
-void DomStorageCachedArea::ApplyMutation(
+void DOMStorageCachedArea::ApplyMutation(
     const base::NullableString16& key,
     const base::NullableString16& new_value) {
   if (!map_.get() || ignore_all_mutations_)
@@ -101,8 +101,8 @@
 
   if (key.is_null()) {
     // It's a clear event.
-    scoped_refptr<dom_storage::DomStorageMap> old = map_;
-    map_ = new dom_storage::DomStorageMap(dom_storage::kPerAreaQuota);
+    scoped_refptr<DOMStorageMap> old = map_;
+    map_ = new DOMStorageMap(kPerStorageAreaQuota);
 
     // We have to retain local additions which happened after this
     // clear operation from another process.
@@ -136,14 +136,14 @@
   base::NullableString16 unused;
   map_->set_quota(kint32max);
   map_->SetItem(key.string(), new_value.string(), &unused);
-  map_->set_quota(dom_storage::kPerAreaQuota);
+  map_->set_quota(kPerStorageAreaQuota);
 }
 
-size_t DomStorageCachedArea::MemoryBytesUsedByCache() const {
+size_t DOMStorageCachedArea::MemoryBytesUsedByCache() const {
   return map_.get() ? map_->bytes_used() : 0;
 }
 
-void DomStorageCachedArea::Prime(int connection_id) {
+void DOMStorageCachedArea::Prime(int connection_id) {
   DCHECK(!map_.get());
 
   // The LoadArea method is actually synchronous, but we have to
@@ -154,18 +154,18 @@
 
   // Ignore all mutations until OnLoadComplete time.
   ignore_all_mutations_ = true;
-  dom_storage::ValuesMap values;
+  DOMStorageValuesMap values;
   base::TimeTicks before = base::TimeTicks::Now();
   proxy_->LoadArea(connection_id,
                    &values,
-                   base::Bind(&DomStorageCachedArea::OnLoadComplete,
+                   base::Bind(&DOMStorageCachedArea::OnLoadComplete,
                               weak_factory_.GetWeakPtr()));
   base::TimeDelta time_to_prime = base::TimeTicks::Now() - before;
   // Keeping this histogram named the same (without the ForRenderer suffix)
   // to maintain histogram continuity.
   UMA_HISTOGRAM_TIMES("LocalStorage.TimeToPrimeLocalStorage",
                       time_to_prime);
-  map_ = new dom_storage::DomStorageMap(dom_storage::kPerAreaQuota);
+  map_ = new DOMStorageMap(kPerStorageAreaQuota);
   map_->SwapValues(&values);
 
   size_t local_storage_size_kb = map_->bytes_used() / 1024;
@@ -190,20 +190,20 @@
   }
 }
 
-void DomStorageCachedArea::Reset() {
+void DOMStorageCachedArea::Reset() {
   map_ = NULL;
   weak_factory_.InvalidateWeakPtrs();
   ignore_key_mutations_.clear();
   ignore_all_mutations_ = false;
 }
 
-void DomStorageCachedArea::OnLoadComplete(bool success) {
+void DOMStorageCachedArea::OnLoadComplete(bool success) {
   DCHECK(success);
   DCHECK(ignore_all_mutations_);
   ignore_all_mutations_ = false;
 }
 
-void DomStorageCachedArea::OnSetItemComplete(const base::string16& key,
+void DOMStorageCachedArea::OnSetItemComplete(const base::string16& key,
                                              bool success) {
   if (!success) {
     Reset();
@@ -216,7 +216,7 @@
     ignore_key_mutations_.erase(found);
 }
 
-void DomStorageCachedArea::OnRemoveItemComplete(const base::string16& key,
+void DOMStorageCachedArea::OnRemoveItemComplete(const base::string16& key,
                                                 bool success) {
   DCHECK(success);
   std::map<base::string16, int>::iterator found =
@@ -226,7 +226,7 @@
     ignore_key_mutations_.erase(found);
 }
 
-void DomStorageCachedArea::OnClearComplete(bool success) {
+void DOMStorageCachedArea::OnClearComplete(bool success) {
   DCHECK(success);
   DCHECK(ignore_all_mutations_);
   ignore_all_mutations_ = false;
diff --git a/content/renderer/dom_storage/dom_storage_cached_area.h b/content/renderer/dom_storage/dom_storage_cached_area.h
index 2aa4cd9..b991038 100644
--- a/content/renderer/dom_storage/dom_storage_cached_area.h
+++ b/content/renderer/dom_storage/dom_storage_cached_area.h
@@ -13,13 +13,10 @@
 #include "content/common/content_export.h"
 #include "url/gurl.h"
 
-namespace dom_storage {
-class DomStorageMap;
-}
-
 namespace content {
 
-class DomStorageProxy;
+class DOMStorageMap;
+class DOMStorageProxy;
 
 // Unlike the other classes in the dom_storage library, this one is intended
 // for use in renderer processes. It maintains a complete cache of the
@@ -27,12 +24,12 @@
 // first access and changes are written to the backend thru the |proxy|.
 // Mutations originating in other processes are applied to the cache via
 // the ApplyMutation method.
-class CONTENT_EXPORT DomStorageCachedArea
-    : public base::RefCounted<DomStorageCachedArea> {
+class CONTENT_EXPORT DOMStorageCachedArea
+    : public base::RefCounted<DOMStorageCachedArea> {
  public:
-  DomStorageCachedArea(int64 namespace_id,
+  DOMStorageCachedArea(int64 namespace_id,
                        const GURL& origin,
-                       DomStorageProxy* proxy);
+                       DOMStorageProxy* proxy);
 
   int64 namespace_id() const { return namespace_id_; }
   const GURL& origin() const { return origin_; }
@@ -55,9 +52,9 @@
   size_t MemoryBytesUsedByCache() const;
 
  private:
-  friend class DomStorageCachedAreaTest;
-  friend class base::RefCounted<DomStorageCachedArea>;
-  ~DomStorageCachedArea();
+  friend class DOMStorageCachedAreaTest;
+  friend class base::RefCounted<DOMStorageCachedArea>;
+  ~DOMStorageCachedArea();
 
   // Primes the cache, loading all values for the area.
   void Prime(int connection_id);
@@ -87,9 +84,9 @@
 
   int64 namespace_id_;
   GURL origin_;
-  scoped_refptr<dom_storage::DomStorageMap> map_;
-  scoped_refptr<DomStorageProxy> proxy_;
-  base::WeakPtrFactory<DomStorageCachedArea> weak_factory_;
+  scoped_refptr<DOMStorageMap> map_;
+  scoped_refptr<DOMStorageProxy> proxy_;
+  base::WeakPtrFactory<DOMStorageCachedArea> weak_factory_;
 };
 
 }  // namespace content
diff --git a/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc b/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc
index 9dcef95..ada36d7 100644
--- a/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc
+++ b/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc
@@ -14,17 +14,17 @@
 namespace content {
 
 namespace {
-// A mock implementation of the DomStorageProxy interface.
-class MockProxy : public DomStorageProxy {
+// A mock implementation of the DOMStorageProxy interface.
+class MockProxy : public DOMStorageProxy {
  public:
   MockProxy() {
     ResetObservations();
   }
 
-  // DomStorageProxy interface for use by DomStorageCachedArea.
+  // DOMStorageProxy interface for use by DOMStorageCachedArea.
 
   virtual void LoadArea(int connection_id,
-                        dom_storage::ValuesMap* values,
+                        DOMStorageValuesMap* values,
                         const CompletionCallback& callback) OVERRIDE {
     pending_callbacks_.push_back(callback);
     observed_load_area_ = true;
@@ -91,7 +91,7 @@
 
   typedef std::list<CompletionCallback> CallbackList;
 
-  dom_storage::ValuesMap load_area_return_values_;
+  DOMStorageValuesMap load_area_return_values_;
   CallbackList pending_callbacks_;
   bool observed_load_area_;
   bool observed_set_item_;
@@ -108,9 +108,9 @@
 
 }  // namespace
 
-class DomStorageCachedAreaTest : public testing::Test {
+class DOMStorageCachedAreaTest : public testing::Test {
  public:
-  DomStorageCachedAreaTest()
+  DOMStorageCachedAreaTest()
     : kNamespaceId(10),
       kOrigin("http://dom_storage/"),
       kKey(ASCIIToUTF16("key")),
@@ -128,26 +128,26 @@
     mock_proxy_ = new MockProxy();
   }
 
-  bool IsPrimed(DomStorageCachedArea* cached_area) {
+  bool IsPrimed(DOMStorageCachedArea* cached_area) {
     return cached_area->map_.get();
   }
 
-  bool IsIgnoringAllMutations(DomStorageCachedArea* cached_area) {
+  bool IsIgnoringAllMutations(DOMStorageCachedArea* cached_area) {
     return cached_area->ignore_all_mutations_;
   }
 
-  bool IsIgnoringKeyMutations(DomStorageCachedArea* cached_area,
+  bool IsIgnoringKeyMutations(DOMStorageCachedArea* cached_area,
                               const base::string16& key) {
     return cached_area->should_ignore_key_mutation(key);
   }
 
-  void ResetAll(DomStorageCachedArea* cached_area) {
+  void ResetAll(DOMStorageCachedArea* cached_area) {
     cached_area->Reset();
     mock_proxy_->ResetObservations();
     mock_proxy_->pending_callbacks_.clear();
   }
 
-  void ResetCacheOnly(DomStorageCachedArea* cached_area) {
+  void ResetCacheOnly(DOMStorageCachedArea* cached_area) {
     cached_area->Reset();
   }
 
@@ -155,10 +155,10 @@
   scoped_refptr<MockProxy> mock_proxy_;
 };
 
-TEST_F(DomStorageCachedAreaTest, Basics) {
+TEST_F(DOMStorageCachedAreaTest, Basics) {
   EXPECT_TRUE(mock_proxy_->HasOneRef());
-  scoped_refptr<DomStorageCachedArea> cached_area =
-      new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
+  scoped_refptr<DOMStorageCachedArea> cached_area =
+      new DOMStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
   EXPECT_EQ(kNamespaceId, cached_area->namespace_id());
   EXPECT_EQ(kOrigin, cached_area->origin());
   EXPECT_FALSE(mock_proxy_->HasOneRef());
@@ -180,10 +180,10 @@
   EXPECT_EQ(0u, cached_area->GetLength(kConnectionId));
 }
 
-TEST_F(DomStorageCachedAreaTest, Getters) {
+TEST_F(DOMStorageCachedAreaTest, Getters) {
   const int kConnectionId = 7;
-  scoped_refptr<DomStorageCachedArea> cached_area =
-      new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
+  scoped_refptr<DOMStorageCachedArea> cached_area =
+      new DOMStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
 
   // GetLength, we expect to see one call to load in the proxy.
   EXPECT_FALSE(IsPrimed(cached_area.get()));
@@ -215,10 +215,10 @@
   EXPECT_EQ(1u, mock_proxy_->pending_callbacks_.size());
 }
 
-TEST_F(DomStorageCachedAreaTest, Setters) {
+TEST_F(DOMStorageCachedAreaTest, Setters) {
   const int kConnectionId = 7;
-  scoped_refptr<DomStorageCachedArea> cached_area =
-      new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
+  scoped_refptr<DOMStorageCachedArea> cached_area =
+      new DOMStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
 
   // SetItem, we expect a call to load followed by a call to set item
   // in the proxy.
@@ -270,10 +270,10 @@
   EXPECT_EQ(2u, mock_proxy_->pending_callbacks_.size());
 }
 
-TEST_F(DomStorageCachedAreaTest, MutationsAreIgnoredUntilLoadCompletion) {
+TEST_F(DOMStorageCachedAreaTest, MutationsAreIgnoredUntilLoadCompletion) {
   const int kConnectionId = 7;
-  scoped_refptr<DomStorageCachedArea> cached_area =
-      new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
+  scoped_refptr<DOMStorageCachedArea> cached_area =
+      new DOMStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
   EXPECT_TRUE(cached_area->GetItem(kConnectionId, kKey).is_null());
   EXPECT_TRUE(IsPrimed(cached_area.get()));
   EXPECT_TRUE(IsIgnoringAllMutations(cached_area.get()));
@@ -293,10 +293,10 @@
   EXPECT_EQ(kValue, cached_area->GetItem(kConnectionId, kKey).string());
 }
 
-TEST_F(DomStorageCachedAreaTest, MutationsAreIgnoredUntilClearCompletion) {
+TEST_F(DOMStorageCachedAreaTest, MutationsAreIgnoredUntilClearCompletion) {
   const int kConnectionId = 4;
-  scoped_refptr<DomStorageCachedArea> cached_area =
-      new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
+  scoped_refptr<DOMStorageCachedArea> cached_area =
+      new DOMStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
   cached_area->Clear(kConnectionId, kPageUrl);
   EXPECT_TRUE(IsIgnoringAllMutations(cached_area.get()));
   mock_proxy_->CompleteOnePendingCallback(true);
@@ -315,10 +315,10 @@
   EXPECT_FALSE(IsIgnoringAllMutations(cached_area.get()));
 }
 
-TEST_F(DomStorageCachedAreaTest, KeyMutationsAreIgnoredUntilCompletion) {
+TEST_F(DOMStorageCachedAreaTest, KeyMutationsAreIgnoredUntilCompletion) {
   const int kConnectionId = 8;
-  scoped_refptr<DomStorageCachedArea> cached_area =
-      new DomStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
+  scoped_refptr<DOMStorageCachedArea> cached_area =
+      new DOMStorageCachedArea(kNamespaceId, kOrigin, mock_proxy_.get());
 
   // SetItem
   EXPECT_TRUE(cached_area->SetItem(kConnectionId, kKey, kValue, kPageUrl));
@@ -353,4 +353,4 @@
   EXPECT_FALSE(IsPrimed(cached_area.get()));
 }
 
-}  // namespace dom_storage
+}  // namespace content
diff --git a/content/renderer/dom_storage/dom_storage_dispatcher.cc b/content/renderer/dom_storage/dom_storage_dispatcher.cc
index 3cab4fe..a8a37c9 100644
--- a/content/renderer/dom_storage/dom_storage_dispatcher.cc
+++ b/content/renderer/dom_storage/dom_storage_dispatcher.cc
@@ -9,7 +9,8 @@
 
 #include "base/strings/string_number_conversions.h"
 #include "base/synchronization/lock.h"
-#include "content/common/dom_storage_messages.h"
+#include "content/common/dom_storage/dom_storage_messages.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "content/renderer/dom_storage/dom_storage_cached_area.h"
 #include "content/renderer/dom_storage/dom_storage_proxy.h"
 #include "content/renderer/dom_storage/webstoragearea_impl.h"
@@ -18,9 +19,6 @@
 #include "third_party/WebKit/public/platform/Platform.h"
 #include "third_party/WebKit/public/web/WebKit.h"
 #include "third_party/WebKit/public/web/WebStorageEventDispatcher.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
-
-using dom_storage::ValuesMap;
 
 namespace content {
 
@@ -92,24 +90,24 @@
 }  // namespace
 
 // ProxyImpl -----------------------------------------------------
-// An implementation of the DomStorageProxy interface in terms of IPC.
+// An implementation of the DOMStorageProxy interface in terms of IPC.
 // This class also manages the collection of cached areas and pending
 // operations awaiting completion callbacks.
-class DomStorageDispatcher::ProxyImpl : public DomStorageProxy {
+class DomStorageDispatcher::ProxyImpl : public DOMStorageProxy {
  public:
   explicit ProxyImpl(RenderThreadImpl* sender);
 
   // Methods for use by DomStorageDispatcher directly.
-  DomStorageCachedArea* OpenCachedArea(
+  DOMStorageCachedArea* OpenCachedArea(
       int64 namespace_id, const GURL& origin);
-  void CloseCachedArea(DomStorageCachedArea* area);
-  DomStorageCachedArea* LookupCachedArea(
+  void CloseCachedArea(DOMStorageCachedArea* area);
+  DOMStorageCachedArea* LookupCachedArea(
       int64 namespace_id, const GURL& origin);
   void CompleteOnePendingCallback(bool success);
   void Shutdown();
 
-  // DomStorageProxy interface for use by DomStorageCachedArea.
-  virtual void LoadArea(int connection_id, ValuesMap* values,
+  // DOMStorageProxy interface for use by DOMStorageCachedArea.
+  virtual void LoadArea(int connection_id, DOMStorageValuesMap* values,
                         const CompletionCallback& callback) OVERRIDE;
   virtual void SetItem(int connection_id, const string16& key,
                        const string16& value, const GURL& page_url,
@@ -125,10 +123,10 @@
   // Struct to hold references to our contained areas and
   // to keep track of how many tabs have a given area open.
   struct CachedAreaHolder {
-    scoped_refptr<DomStorageCachedArea> area_;
+    scoped_refptr<DOMStorageCachedArea> area_;
     int open_count_;
     CachedAreaHolder() : open_count_(0) {}
-    CachedAreaHolder(DomStorageCachedArea* area, int count)
+    CachedAreaHolder(DOMStorageCachedArea* area, int count)
         : area_(area), open_count_(count) {}
   };
   typedef std::map<std::string, CachedAreaHolder> CachedAreaMap;
@@ -176,21 +174,21 @@
   sender_->AddFilter(throttling_filter_.get());
 }
 
-DomStorageCachedArea* DomStorageDispatcher::ProxyImpl::OpenCachedArea(
+DOMStorageCachedArea* DomStorageDispatcher::ProxyImpl::OpenCachedArea(
     int64 namespace_id, const GURL& origin) {
   std::string key = GetCachedAreaKey(namespace_id, origin);
   if (CachedAreaHolder* holder = GetAreaHolder(key)) {
     ++(holder->open_count_);
     return holder->area_.get();
   }
-  scoped_refptr<DomStorageCachedArea> area =
-      new DomStorageCachedArea(namespace_id, origin, this);
+  scoped_refptr<DOMStorageCachedArea> area =
+      new DOMStorageCachedArea(namespace_id, origin, this);
   cached_areas_[key] = CachedAreaHolder(area.get(), 1);
   return area.get();
 }
 
 void DomStorageDispatcher::ProxyImpl::CloseCachedArea(
-    DomStorageCachedArea* area) {
+    DOMStorageCachedArea* area) {
   std::string key = GetCachedAreaKey(area->namespace_id(), area->origin());
   CachedAreaHolder* holder = GetAreaHolder(key);
   DCHECK(holder);
@@ -201,7 +199,7 @@
   }
 }
 
-DomStorageCachedArea* DomStorageDispatcher::ProxyImpl::LookupCachedArea(
+DOMStorageCachedArea* DomStorageDispatcher::ProxyImpl::LookupCachedArea(
     int64 namespace_id, const GURL& origin) {
   std::string key = GetCachedAreaKey(namespace_id, origin);
   CachedAreaHolder* holder = GetAreaHolder(key);
@@ -223,7 +221,7 @@
 }
 
 void DomStorageDispatcher::ProxyImpl::LoadArea(
-    int connection_id, ValuesMap* values,
+    int connection_id, DOMStorageValuesMap* values,
     const CompletionCallback& callback) {
   PushPendingCallback(callback);
   throttling_filter_->SendThrottled(new DOMStorageHostMsg_LoadStorageArea(
@@ -265,7 +263,7 @@
   proxy_->Shutdown();
 }
 
-scoped_refptr<DomStorageCachedArea> DomStorageDispatcher::OpenCachedArea(
+scoped_refptr<DOMStorageCachedArea> DomStorageDispatcher::OpenCachedArea(
     int connection_id, int64 namespace_id, const GURL& origin) {
   RenderThreadImpl::current()->Send(
       new DOMStorageHostMsg_OpenStorageArea(
@@ -274,7 +272,7 @@
 }
 
 void DomStorageDispatcher::CloseCachedArea(
-    int connection_id, DomStorageCachedArea* area) {
+    int connection_id, DOMStorageCachedArea* area) {
   RenderThreadImpl::current()->Send(
       new DOMStorageHostMsg_CloseStorageArea(connection_id));
   proxy_->CloseCachedArea(area);
@@ -301,13 +299,13 @@
     originating_area = WebStorageAreaImpl::FromConnectionId(
         params.connection_id);
   } else {
-    DomStorageCachedArea* cached_area = proxy_->LookupCachedArea(
+    DOMStorageCachedArea* cached_area = proxy_->LookupCachedArea(
         params.namespace_id, params.origin);
     if (cached_area)
       cached_area->ApplyMutation(params.key, params.new_value);
   }
 
-  if (params.namespace_id == dom_storage::kLocalStorageNamespaceId) {
+  if (params.namespace_id == kLocalStorageNamespaceId) {
     WebKit::WebStorageEventDispatcher::dispatchLocalStorageEvent(
         params.key,
         params.old_value,
diff --git a/content/renderer/dom_storage/dom_storage_dispatcher.h b/content/renderer/dom_storage/dom_storage_dispatcher.h
index f5d4004..f395d57 100644
--- a/content/renderer/dom_storage/dom_storage_dispatcher.h
+++ b/content/renderer/dom_storage/dom_storage_dispatcher.h
@@ -16,23 +16,23 @@
 
 namespace content {
 
-class DomStorageCachedArea;
+class DOMStorageCachedArea;
 
 // Dispatches DomStorage related messages sent to a renderer process from the
 // main browser process. There is one instance per child process. Messages
 // are dispatched on the main renderer thread. The RenderThreadImpl
 // creates an instance and delegates calls to it. This classes also manages
-// the collection of DomStorageCachedAreas that are active in the process.
+// the collection of DOMStorageCachedAreas that are active in the process.
 class DomStorageDispatcher {
  public:
   DomStorageDispatcher();
   ~DomStorageDispatcher();
 
   // Each call to open should be balanced with a call to close.
-  scoped_refptr<DomStorageCachedArea> OpenCachedArea(int connection_id,
+  scoped_refptr<DOMStorageCachedArea> OpenCachedArea(int connection_id,
                                                      int64 namespace_id,
                                                      const GURL& origin);
-  void CloseCachedArea(int connection_id, DomStorageCachedArea* area);
+  void CloseCachedArea(int connection_id, DOMStorageCachedArea* area);
 
   bool OnMessageReceived(const IPC::Message& msg);
 
diff --git a/content/renderer/dom_storage/dom_storage_proxy.h b/content/renderer/dom_storage/dom_storage_proxy.h
index 57fcfaf..80cd87c 100644
--- a/content/renderer/dom_storage/dom_storage_proxy.h
+++ b/content/renderer/dom_storage/dom_storage_proxy.h
@@ -9,18 +9,18 @@
 #include "base/memory/ref_counted.h"
 #include "base/strings/nullable_string16.h"
 #include "base/strings/string16.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "url/gurl.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
 namespace content {
 
 // Abstract interface for cached area, renderer to browser communications.
-class DomStorageProxy : public base::RefCounted<DomStorageProxy> {
+class DOMStorageProxy : public base::RefCounted<DOMStorageProxy> {
  public:
   typedef base::Callback<void(bool)> CompletionCallback;
 
   virtual void LoadArea(int connection_id,
-                        dom_storage::ValuesMap* values,
+                        DOMStorageValuesMap* values,
                         const CompletionCallback& callback) = 0;
 
   virtual void SetItem(int connection_id,
@@ -39,8 +39,8 @@
                          const CompletionCallback& callback) = 0;
 
  protected:
-  friend class base::RefCounted<DomStorageProxy>;
-  virtual ~DomStorageProxy() {}
+  friend class base::RefCounted<DOMStorageProxy>;
+  virtual ~DOMStorageProxy() {}
 };
 
 }  // namespace content
diff --git a/content/renderer/dom_storage/webstoragearea_impl.cc b/content/renderer/dom_storage/webstoragearea_impl.cc
index 72e9415..d5bf07d 100644
--- a/content/renderer/dom_storage/webstoragearea_impl.cc
+++ b/content/renderer/dom_storage/webstoragearea_impl.cc
@@ -8,7 +8,7 @@
 #include "base/metrics/histogram.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
-#include "content/common/dom_storage_messages.h"
+#include "content/common/dom_storage/dom_storage_messages.h"
 #include "content/renderer/dom_storage/dom_storage_cached_area.h"
 #include "content/renderer/dom_storage/dom_storage_dispatcher.h"
 #include "content/renderer/render_thread_impl.h"
diff --git a/content/renderer/dom_storage/webstoragearea_impl.h b/content/renderer/dom_storage/webstoragearea_impl.h
index 47d0581..7854562 100644
--- a/content/renderer/dom_storage/webstoragearea_impl.h
+++ b/content/renderer/dom_storage/webstoragearea_impl.h
@@ -14,7 +14,7 @@
 
 namespace content {
 
-class DomStorageCachedArea;
+class DOMStorageCachedArea;
 
 class WebStorageAreaImpl : public WebKit::WebStorageArea {
  public:
@@ -37,7 +37,7 @@
 
  private:
   int connection_id_;
-  scoped_refptr<DomStorageCachedArea> cached_area_;
+  scoped_refptr<DOMStorageCachedArea> cached_area_;
 };
 
 }  // namespace content
diff --git a/content/renderer/dom_storage/webstoragenamespace_impl.cc b/content/renderer/dom_storage/webstoragenamespace_impl.cc
index de2b6c5..d5f1dc5 100644
--- a/content/renderer/dom_storage/webstoragenamespace_impl.cc
+++ b/content/renderer/dom_storage/webstoragenamespace_impl.cc
@@ -5,10 +5,10 @@
 #include "content/renderer/dom_storage/webstoragenamespace_impl.h"
 
 #include "base/logging.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "content/renderer/dom_storage/webstoragearea_impl.h"
 #include "third_party/WebKit/public/platform/WebString.h"
 #include "url/gurl.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 
 using WebKit::WebStorageArea;
 using WebKit::WebStorageNamespace;
@@ -17,13 +17,13 @@
 namespace content {
 
 WebStorageNamespaceImpl::WebStorageNamespaceImpl()
-    : namespace_id_(dom_storage::kLocalStorageNamespaceId) {
+    : namespace_id_(kLocalStorageNamespaceId) {
 }
 
 WebStorageNamespaceImpl::WebStorageNamespaceImpl(
     int64 namespace_id)
     : namespace_id_(namespace_id) {
-  DCHECK_NE(dom_storage::kInvalidSessionStorageNamespaceId, namespace_id);
+  DCHECK_NE(kInvalidSessionStorageNamespaceId, namespace_id);
 }
 
 WebStorageNamespaceImpl::~WebStorageNamespaceImpl() {
diff --git a/content/renderer/media/media_stream_dependency_factory.cc b/content/renderer/media/media_stream_dependency_factory.cc
index a0f25a6..7f5e64a 100644
--- a/content/renderer/media/media_stream_dependency_factory.cc
+++ b/content/renderer/media/media_stream_dependency_factory.cc
@@ -37,10 +37,6 @@
 #include "third_party/WebKit/public/web/WebFrame.h"
 #include "third_party/libjingle/source/talk/app/webrtc/mediaconstraintsinterface.h"
 
-#if defined(ENABLE_WEBRTC)
-#include "content/renderer/media/rtc_encoding_video_capturer_factory.h"
-#endif
-
 #if defined(USE_OPENSSL)
 #include "third_party/libjingle/source/talk/base/ssladapter.h"
 #else
@@ -303,6 +299,11 @@
   RTCMediaConstraints native_audio_constraints(audio_constraints);
   WebKit::WebVector<WebKit::WebMediaStreamTrack> audio_tracks;
   web_stream->audioTracks(audio_tracks);
+  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
+  if (command_line.HasSwitch(switches::kEnableWebRtcAecRecordings)) {
+    native_audio_constraints.AddOptional(
+        RTCMediaConstraints::kInternalAecDump, "true");
+  }
   for (size_t i = 0; i < audio_tracks.size(); ++i) {
     const WebKit::WebMediaStreamSource& source = audio_tracks[i].source();
     MediaStreamSourceExtraData* source_data =
@@ -313,22 +314,20 @@
       continue;
     }
 
+    // TODO(xians): Create a new capturer for difference microphones when we
+    // support multiple microphones. See issue crbug/262117 .
     const StreamDeviceInfo device_info = source_data->device_info();
-    if (IsAudioMediaType(device_info.device.type)) {
-      if (!InitializeAudioSource(render_view_id, device_info)) {
-        DLOG(WARNING) << "Unsupported audio source";
-        sources_created.Run(web_stream, false);
-        return;
-      }
-    }
-
-    const CommandLine& command_line = *CommandLine::ForCurrentProcess();
-    if (command_line.HasSwitch(switches::kEnableWebRtcAecRecordings)) {
-      native_audio_constraints.AddOptional(
-          RTCMediaConstraints::kInternalAecDump, "true");
+    scoped_refptr<WebRtcAudioCapturer> capturer(
+        MaybeCreateAudioCapturer(render_view_id, device_info));
+    if (!capturer.get()) {
+      DLOG(WARNING) << "Failed to create the capturer for device "
+                    << device_info.device.id;
+      sources_created.Run(web_stream, false);
+      return;
     }
 
     // Creates a LocalAudioSource object which holds audio options.
+    // TODO(xians): The option should apply to the track instead of the source.
     source_data->SetLocalAudioSource(
         CreateLocalAudioSource(&native_audio_constraints).get());
     source_observer->AddSource(source_data->local_audio_source());
@@ -389,21 +388,14 @@
   MediaStreamSourceExtraData* source_data =
       static_cast<MediaStreamSourceExtraData*>(source.extraData());
 
+  scoped_refptr<WebRtcAudioCapturer> capturer;
   if (!source_data) {
     if (source.requiresAudioConsumer()) {
       // We're adding a WebAudio MediaStream.
-      // TODO(crogers, xians): In reality we should be able to send a unique
-      // audio stream to each PeerConnection separately.
-      // Currently WebRTC is only able to handle a global audio stream sent to
-      // ALL peers. Create a special source where default WebAudio constraints
-      // are used.
-      if (CreateWebAudioSource(&source)) {
-        source_data =
-            static_cast<MediaStreamSourceExtraData*>(source.extraData());
-      } else {
-        LOG(ERROR) << "Failed to create WebAudio source";
-        return false;
-      }
+      // Create a specific capturer for each WebAudio consumer.
+      capturer = CreateWebAudioSource(&source);
+      source_data =
+          static_cast<MediaStreamSourceExtraData*>(source.extraData());
     } else {
       // TODO(perkj): Implement support for sources from
       // remote MediaStreams.
@@ -418,16 +410,17 @@
 
   std::string track_id = UTF16ToUTF8(track.id());
   if (source.type() == WebKit::WebMediaStreamSource::TypeAudio) {
-    scoped_refptr<webrtc::AudioTrackInterface> audio_track(
-        CreateLocalAudioTrack(track_id, source_data->local_audio_source()));
-    audio_track->set_enabled(track.isEnabled());
-    // Start the audio track. This will hook the |audio_track| to the capturer
-    // as the sink of the audio, and only start the source of the capturer if
-    // it is the first audio track connecting to the capturer.
-    static_cast<WebRtcLocalAudioTrack*>(audio_track.get())->Start();
+    if (!capturer.get() && GetWebRtcAudioDevice())
+      capturer = GetWebRtcAudioDevice()->GetDefaultCapturer();
 
+    scoped_refptr<webrtc::AudioTrackInterface> audio_track(
+        CreateLocalAudioTrack(track_id,
+                              capturer,
+                              source_data->local_audio_source()));
+    audio_track->set_enabled(track.isEnabled());
     return native_stream->AddTrack(audio_track.get());
   } else {
+    DCHECK(source.type() == WebKit::WebMediaStreamSource::TypeVideo);
     scoped_refptr<webrtc::VideoTrackInterface> video_track(
         CreateLocalVideoTrack(track_id, source_data->video_source()));
     video_track->set_enabled(track.isEnabled());
@@ -494,7 +487,6 @@
     audio_device_ = new WebRtcAudioDeviceImpl();
 
     scoped_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory;
-    scoped_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory;
 
     const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
     if (cmd_line->HasSwitch(switches::kEnableWebRtcHWDecoding)) {
@@ -511,24 +503,11 @@
     decoder_factory.reset(decoder_factory_tv_ = new RTCVideoDecoderFactoryTv);
 #endif
 
-#if defined(ENABLE_WEBRTC) && defined(OS_CHROMEOS)
-    const CommandLine& command_line = *CommandLine::ForCurrentProcess();
-    if (command_line.HasSwitch(switches::kEnableEncodedScreenCapture)) {
-      // PeerConnectionFactory owns the encoder factory. Pass a weak pointer of
-      // encoder factory to |vc_manager_| because the manager outlives it.
-      RtcEncodingVideoCapturerFactory* rtc_encoding_capturer_factory =
-          new RtcEncodingVideoCapturerFactory();
-      encoder_factory.reset(rtc_encoding_capturer_factory);
-      vc_manager_->set_encoding_capturer_factory(
-          rtc_encoding_capturer_factory->AsWeakPtr());
-    }
-#endif
-
     scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory(
         webrtc::CreatePeerConnectionFactory(worker_thread_,
                                             signaling_thread_,
                                             audio_device_.get(),
-                                            encoder_factory.release(),
+                                            NULL,
                                             decoder_factory.release()));
     if (factory.get())
       pc_factory_ = factory;
@@ -610,47 +589,23 @@
   return source;
 }
 
-bool MediaStreamDependencyFactory::InitializeAudioSource(
-    int render_view_id,
-    const StreamDeviceInfo& device_info) {
-  DVLOG(1) << "MediaStreamDependencyFactory::InitializeAudioSource()";
-
-  // TODO(henrika): the current design does not support a unique source
-  // for each audio track.
-  if (device_info.session_id <= 0)
-    return false;
-
-  // Initialize the source using audio parameters for the selected
-  // capture device.
-  WebRtcAudioCapturer* capturer = GetWebRtcAudioDevice()->capturer().get();
-  // TODO(henrika): refactor \content\public\common\media_stream_request.h
-  // to allow dependency of media::ChannelLayout and avoid static_cast.
-  if (!capturer->Initialize(
-          render_view_id,
-          static_cast<media::ChannelLayout>(device_info.device.channel_layout),
-          device_info.device.sample_rate, device_info.session_id))
-    return false;
-
-  return true;
-}
-
-bool MediaStreamDependencyFactory::CreateWebAudioSource(
+scoped_refptr<WebRtcAudioCapturer>
+MediaStreamDependencyFactory::CreateWebAudioSource(
     WebKit::WebMediaStreamSource* source) {
   DVLOG(1) << "MediaStreamDependencyFactory::CreateWebAudioSource()";
   DCHECK(GetWebRtcAudioDevice());
 
-  // WebAudio needs the WebRtcAudioCapturer to be able to send its data
-  // over a PeerConnection. The microphone source is not utilized in this
-  // case; instead the WebRtcAudioCapturer is driving.
-  WebRtcAudioCapturer* capturer = GetWebRtcAudioDevice()->capturer().get();
-  if (!capturer)
-    return false;
-
   // Set up the source and ensure that WebAudio is driving things instead of
-  // a microphone.
+  // a microphone. For WebAudio, we always create a new capturer without
+  // calling initialize(), WebAudio will re-configure the capturer later on.
+  // Pass -1 as the |render_view_id| and an empty device struct to tell the
+  // capturer not to start the default source.
+  scoped_refptr<WebRtcAudioCapturer> capturer(
+      MaybeCreateAudioCapturer(-1, StreamDeviceInfo()));
+  DCHECK(capturer.get());
 
   scoped_refptr<WebAudioCapturerSource>
-      webaudio_capturer_source(new WebAudioCapturerSource(capturer));
+      webaudio_capturer_source(new WebAudioCapturerSource(capturer.get()));
   MediaStreamSourceExtraData* source_data =
       new content::MediaStreamSourceExtraData(webaudio_capturer_source.get());
 
@@ -667,7 +622,7 @@
   // Replace the default source with WebAudio as source instead.
   source->addAudioConsumer(webaudio_capturer_source.get());
 
-  return true;
+  return capturer;
 }
 
 scoped_refptr<webrtc::VideoTrackInterface>
@@ -696,12 +651,20 @@
 scoped_refptr<webrtc::AudioTrackInterface>
 MediaStreamDependencyFactory::CreateLocalAudioTrack(
     const std::string& id,
+    const scoped_refptr<WebRtcAudioCapturer>& capturer,
     webrtc::AudioSourceInterface* source) {
   // TODO(xians): Merge |source| to the capturer(). We can't do this today
   // because only one capturer() is supported while one |source| is created
   // for each audio track.
-  return WebRtcLocalAudioTrack::Create(id, GetWebRtcAudioDevice()->capturer(),
-                                       source);
+  scoped_refptr<WebRtcLocalAudioTrack> audio_track(
+      WebRtcLocalAudioTrack::Create(id, capturer, source));
+  // Add the WebRtcAudioDevice as the sink to the local audio track.
+  audio_track->AddSink(GetWebRtcAudioDevice());
+  // Start the audio track. This will hook the |audio_track| to the capturer
+  // as the sink of the audio, and only start the source of the capturer if
+  // it is the first audio track connecting to the capturer.
+  audio_track->Start();
+  return audio_track;
 }
 
 webrtc::SessionDescriptionInterface*
@@ -724,20 +687,6 @@
   return audio_device_.get();
 }
 
-void MediaStreamDependencyFactory::StopLocalAudioSource(
-    const WebKit::WebMediaStream& web_stream) {
-  MediaStreamExtraData* extra_data = static_cast<MediaStreamExtraData*>(
-      web_stream.extraData());
-  if (extra_data && extra_data->is_local() && extra_data->stream().get() &&
-      !extra_data->stream()->GetAudioTracks().empty()) {
-    // Stop the audio track. This will unhook the audio track from the capturer
-    // and will shutdown the source of the capturer if it is the last audio
-    // track connecting to the capturer.
-    static_cast<WebRtcLocalAudioTrack*>(
-        extra_data->stream()->GetAudioTracks()[0].get())->Stop();
-  }
-}
-
 void MediaStreamDependencyFactory::InitializeWorkerThread(
     talk_base::Thread** thread,
     base::WaitableEvent* event) {
@@ -841,4 +790,36 @@
   }
 }
 
+scoped_refptr<WebRtcAudioCapturer>
+MediaStreamDependencyFactory::MaybeCreateAudioCapturer(
+    int render_view_id,
+    const StreamDeviceInfo& device_info) {
+  scoped_refptr<WebRtcAudioCapturer> capturer;
+  if (render_view_id != -1) {
+    // From a normal getUserMedia, re-use the existing default capturer.
+    capturer = GetWebRtcAudioDevice()->GetDefaultCapturer();
+  }
+  // If the default capturer does not exist or |render_view_id| == -1, create
+  // a new capturer.
+  bool is_new_capturer = false;
+  if (!capturer.get()) {
+    capturer = WebRtcAudioCapturer::CreateCapturer();
+    is_new_capturer = true;
+  }
+
+  if (!capturer->Initialize(
+          render_view_id,
+          static_cast<media::ChannelLayout>(device_info.device.channel_layout),
+          device_info.device.sample_rate, device_info.session_id,
+          device_info.device.id)) {
+    return NULL;
+  }
+
+  // Add the capturer to the WebRtcAudioDeviceImpl if it is a new capturer.
+  if (is_new_capturer)
+    GetWebRtcAudioDevice()->AddAudioCapturer(capturer);
+
+  return capturer;
+}
+
 }  // namespace content
diff --git a/content/renderer/media/media_stream_dependency_factory.h b/content/renderer/media/media_stream_dependency_factory.h
index 74dceb5..720ecb0 100644
--- a/content/renderer/media/media_stream_dependency_factory.h
+++ b/content/renderer/media/media_stream_dependency_factory.h
@@ -43,6 +43,7 @@
 class IpcNetworkManager;
 class IpcPacketSocketFactory;
 class VideoCaptureImplManager;
+class WebRtcAudioCapturer;
 class WebRtcAudioDeviceImpl;
 class WebRtcLoggingHandlerImpl;
 class WebRtcLoggingMessageFilter;
@@ -135,11 +136,6 @@
 
   WebRtcAudioDeviceImpl* GetWebRtcAudioDevice();
 
-  // Stop the audio source for local audio tracks.
-  // TODO(xians): Remove this function if each audio track takes care of their
-  // own source.
-  void StopLocalAudioSource(const WebKit::WebMediaStream& web_stream);
-
 #if defined(GOOGLE_TV)
   RTCVideoDecoderFactoryTv* decoder_factory_tv() { return decoder_factory_tv_; }
 #endif
@@ -161,21 +157,17 @@
           bool is_screen_cast,
           const webrtc::MediaConstraintsInterface* constraints);
 
-  // Initializes the source using audio parameters for the selected
-  // capture device and specifies which capture device to use as capture
-  // source.
-  virtual bool InitializeAudioSource(int render_view_id,
-                                     const StreamDeviceInfo& device_info);
-
   // Creates a media::AudioCapturerSource with an implementation that is
   // specific for a WebAudio source. The created WebAudioCapturerSource
   // instance will function as audio source instead of the default
   // WebRtcAudioCapturer.
-  virtual bool CreateWebAudioSource(WebKit::WebMediaStreamSource* source);
+  virtual scoped_refptr<WebRtcAudioCapturer> CreateWebAudioSource(
+      WebKit::WebMediaStreamSource* source);
 
   // Asks the PeerConnection factory to create a Local AudioTrack object.
   virtual scoped_refptr<webrtc::AudioTrackInterface>
       CreateLocalAudioTrack(const std::string& id,
+                            const scoped_refptr<WebRtcAudioCapturer>& capturer,
                             webrtc::AudioSourceInterface* source);
 
   // Asks the PeerConnection factory to create a Local VideoTrack object.
@@ -192,6 +184,12 @@
   virtual bool EnsurePeerConnectionFactory();
   virtual bool PeerConnectionFactoryCreated();
 
+  // Returns a new capturer or existing capturer based on the |render_view_id|
+  // and |device_info|. When the |render_view_id| and |device_info| are valid,
+  // it reuses existing capture if any; otherwise it creates a new capturer.
+  virtual scoped_refptr<WebRtcAudioCapturer> MaybeCreateAudioCapturer(
+      int render_view_id, const StreamDeviceInfo& device_info);
+
  private:
   // Creates and deletes |pc_factory_|, which in turn is used for
   // creating PeerConnection objects.
diff --git a/content/renderer/media/media_stream_impl.cc b/content/renderer/media/media_stream_impl.cc
index 3033301..abe68a2 100644
--- a/content/renderer/media/media_stream_impl.cc
+++ b/content/renderer/media/media_stream_impl.cc
@@ -132,8 +132,7 @@
 
   UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label);
   if (user_media_request) {
-    dependency_factory_->StopLocalAudioSource(user_media_request->web_stream);
-
+    StopLocalAudioTrack(user_media_request->web_stream);
     media_stream_dispatcher_->StopStream(label);
     DeleteUserMediaRequestInfo(user_media_request);
   } else {
@@ -514,7 +513,7 @@
       // If not, we cancel the request and delete the request object.
       if ((*request_it)->generated) {
         // Stop the local audio track before closing the device in the browser.
-        dependency_factory_->StopLocalAudioSource((*request_it)->web_stream);
+        StopLocalAudioTrack((*request_it)->web_stream);
 
         media_stream_dispatcher_->StopStream(
             UTF16ToUTF8((*request_it)->web_stream.id()));
@@ -566,12 +565,6 @@
   DVLOG(1) << "MediaStreamImpl::CreateLocalAudioRenderer label:"
            << stream->label();
 
-  scoped_refptr<WebRtcAudioCapturer> source =
-      dependency_factory_->GetWebRtcAudioDevice()->capturer();
-  if (!source.get()) {
-    return NULL;
-  }
-
   webrtc::AudioTrackVector audio_tracks = stream->GetAudioTracks();
   DCHECK_EQ(audio_tracks.size(), 1u);
   webrtc::AudioTrackInterface* audio_track = audio_tracks[0];
@@ -586,6 +579,27 @@
       RenderViewObserver::routing_id());
 }
 
+void MediaStreamImpl::StopLocalAudioTrack(
+    const WebKit::WebMediaStream& web_stream) {
+  MediaStreamExtraData* extra_data = static_cast<MediaStreamExtraData*>(
+      web_stream.extraData());
+  if (extra_data && extra_data->is_local() && extra_data->stream().get() &&
+      !extra_data->stream()->GetAudioTracks().empty()) {
+    webrtc::AudioTrackVector audio_tracks =
+        extra_data->stream()->GetAudioTracks();
+    for (size_t i = 0; i < audio_tracks.size(); ++i) {
+      WebRtcLocalAudioTrack* audio_track = static_cast<WebRtcLocalAudioTrack*>(
+          audio_tracks[i].get());
+      // Remove the WebRtcAudioDevice as the sink to the local audio track.
+      audio_track->RemoveSink(dependency_factory_->GetWebRtcAudioDevice());
+      // Stop the audio track. This will unhook the audio track from the
+      // capturer and will shutdown the source of the capturer if it is the
+      // last audio track connecting to the capturer.
+      audio_track->Stop();
+    }
+  }
+}
+
 MediaStreamSourceExtraData::MediaStreamSourceExtraData(
     const StreamDeviceInfo& device_info,
     const WebKit::WebMediaStreamSource& webkit_source)
diff --git a/content/renderer/media/media_stream_impl.h b/content/renderer/media/media_stream_impl.h
index fb3db97..ee506cc 100644
--- a/content/renderer/media/media_stream_impl.h
+++ b/content/renderer/media/media_stream_impl.h
@@ -152,6 +152,8 @@
   scoped_refptr<WebRtcLocalAudioRenderer> CreateLocalAudioRenderer(
       webrtc::MediaStreamInterface* stream);
 
+  void StopLocalAudioTrack(const WebKit::WebMediaStream& web_stream);
+
   // Weak ref to a MediaStreamDependencyFactory, owned by the RenderThread.
   // It's valid for the lifetime of RenderThread.
   MediaStreamDependencyFactory* dependency_factory_;
diff --git a/content/renderer/media/mock_media_stream_dependency_factory.cc b/content/renderer/media/mock_media_stream_dependency_factory.cc
index d2ca141..cac1eaf4 100644
--- a/content/renderer/media/mock_media_stream_dependency_factory.cc
+++ b/content/renderer/media/mock_media_stream_dependency_factory.cc
@@ -406,15 +406,10 @@
   return last_video_source_;
 }
 
-bool MockMediaStreamDependencyFactory::InitializeAudioSource(
-    int render_view_id,
-    const StreamDeviceInfo& device_info) {
-  return true;
-}
-
-bool MockMediaStreamDependencyFactory::CreateWebAudioSource(
+scoped_refptr<WebRtcAudioCapturer>
+MockMediaStreamDependencyFactory::CreateWebAudioSource(
     WebKit::WebMediaStreamSource* source) {
-  return true;
+  return NULL;
 }
 
 scoped_refptr<webrtc::MediaStreamInterface>
@@ -451,11 +446,12 @@
 scoped_refptr<webrtc::AudioTrackInterface>
 MockMediaStreamDependencyFactory::CreateLocalAudioTrack(
     const std::string& id,
+    const scoped_refptr<WebRtcAudioCapturer>& capturer,
     webrtc::AudioSourceInterface* source) {
   DCHECK(mock_pc_factory_created_);
-  scoped_refptr<WebRtcAudioCapturer> capturer(
-      WebRtcAudioCapturer::CreateCapturer());
-  return WebRtcLocalAudioTrack::Create(id, capturer, source);
+  DCHECK(!capturer.get());
+  return WebRtcLocalAudioTrack::Create(
+      id, WebRtcAudioCapturer::CreateCapturer(), source);
 }
 
 SessionDescriptionInterface*
@@ -474,4 +470,10 @@
   return new MockIceCandidate(sdp_mid, sdp_mline_index, sdp);
 }
 
+scoped_refptr<WebRtcAudioCapturer>
+MockMediaStreamDependencyFactory::MaybeCreateAudioCapturer(
+    int render_view_id, const StreamDeviceInfo& device_info) {
+  return WebRtcAudioCapturer::CreateCapturer();
+}
+
 }  // namespace content
diff --git a/content/renderer/media/mock_media_stream_dependency_factory.h b/content/renderer/media/mock_media_stream_dependency_factory.h
index 65faa66..1d37a2f 100644
--- a/content/renderer/media/mock_media_stream_dependency_factory.h
+++ b/content/renderer/media/mock_media_stream_dependency_factory.h
@@ -126,9 +126,7 @@
           int video_session_id,
           bool is_screencast,
           const webrtc::MediaConstraintsInterface* constraints) OVERRIDE;
-  virtual bool InitializeAudioSource(
-      int render_view_id, const StreamDeviceInfo& device_info) OVERRIDE;
-  virtual bool CreateWebAudioSource(
+  virtual scoped_refptr<WebRtcAudioCapturer> CreateWebAudioSource(
       WebKit::WebMediaStreamSource* source) OVERRIDE;
   virtual scoped_refptr<webrtc::MediaStreamInterface>
       CreateLocalMediaStream(const std::string& label) OVERRIDE;
@@ -140,6 +138,7 @@
                             cricket::VideoCapturer* capturer) OVERRIDE;
   virtual scoped_refptr<webrtc::AudioTrackInterface>
       CreateLocalAudioTrack(const std::string& id,
+                            const scoped_refptr<WebRtcAudioCapturer>& capturer,
                             webrtc::AudioSourceInterface* source) OVERRIDE;
   virtual webrtc::SessionDescriptionInterface* CreateSessionDescription(
       const std::string& type,
@@ -153,6 +152,9 @@
   virtual bool EnsurePeerConnectionFactory() OVERRIDE;
   virtual bool PeerConnectionFactoryCreated() OVERRIDE;
 
+  virtual scoped_refptr<WebRtcAudioCapturer> MaybeCreateAudioCapturer(
+      int render_view_id, const StreamDeviceInfo& device_info) OVERRIDE;
+
   MockAudioSource* last_audio_source() { return last_audio_source_.get(); }
   MockVideoSource* last_video_source() { return last_video_source_.get(); }
 
diff --git a/content/renderer/media/rtc_encoding_video_capturer.cc b/content/renderer/media/rtc_encoding_video_capturer.cc
deleted file mode 100644
index 9561c83..0000000
--- a/content/renderer/media/rtc_encoding_video_capturer.cc
+++ /dev/null
@@ -1,260 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/media/rtc_encoding_video_capturer.h"
-
-#include "base/logging.h"
-#include "media/base/encoded_bitstream_buffer.h"
-
-namespace content {
-
-namespace {
-
-static const unsigned int kMaxBitrateKbps = 50 * 1000;
-
-}  // namespace
-
-// Client of EncodedVideoSource. This object is created and owned by the
-// RtcEncodingVideoCapturer.
-class RtcEncodingVideoCapturer::EncodedVideoSourceClient :
-    public media::EncodedVideoSource::Client {
- public:
-  EncodedVideoSourceClient(
-      media::EncodedVideoSource* encoded_video_source,
-      media::VideoEncodingParameters params,
-      webrtc::VideoCodecType rtc_codec_type);
-  virtual ~EncodedVideoSourceClient();
-
-  // media::EncodedVideoSource::Client implementation.
-  virtual void OnOpened(
-      const media::VideoEncodingParameters& params) OVERRIDE;
-  virtual void OnClosed() OVERRIDE;
-  virtual void OnBufferReady(
-      scoped_refptr<const media::EncodedBitstreamBuffer> buffer) OVERRIDE;
-  virtual void OnConfigChanged(
-      const media::RuntimeVideoEncodingParameters& params) OVERRIDE;
-
-  // Getters and setters for bitstream properties.
-  media::RuntimeVideoEncodingParameters runtime_params() const;
-  void set_round_trip_time(base::TimeDelta round_trip_time);
-  void set_callback(webrtc::EncodedImageCallback* callback);
-
-  // Sets target bitrate and framerate.
-  void SetRates(uint32_t target_bitrate, uint32_t frame_rate);
-
-  // Requests key frame.
-  void RequestKeyFrame();
-
- private:
-  // Convert buffer to webrtc types and invoke encode complete callback.
-  void ReportEncodedFrame(
-      scoped_refptr<const media::EncodedBitstreamBuffer> buffer);
-
-  media::VideoEncodingParameters params_;
-  webrtc::VideoCodecType rtc_codec_type_;
-  bool finished_;
-
-  base::Time time_base_;
-  base::TimeDelta round_trip_time_;
-  media::EncodedVideoSource* encoded_video_source_;
-  webrtc::EncodedImageCallback* callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(EncodedVideoSourceClient);
-};
-
-RtcEncodingVideoCapturer::EncodedVideoSourceClient::EncodedVideoSourceClient(
-    media::EncodedVideoSource* encoded_video_source,
-    media::VideoEncodingParameters params,
-    webrtc::VideoCodecType rtc_codec_type)
-    : params_(params),
-      rtc_codec_type_(rtc_codec_type),
-      finished_(false),
-      encoded_video_source_(encoded_video_source),
-      callback_(NULL) {
-  DCHECK(encoded_video_source_);
-  encoded_video_source_->OpenBitstream(this, params);
-}
-
-RtcEncodingVideoCapturer::EncodedVideoSourceClient::
-    ~EncodedVideoSourceClient() {
-  if (!finished_)
-    encoded_video_source_->CloseBitstream();
-}
-
-media::RuntimeVideoEncodingParameters
-    RtcEncodingVideoCapturer::EncodedVideoSourceClient::runtime_params() const {
-  return params_.runtime_params;
-}
-
-void RtcEncodingVideoCapturer::EncodedVideoSourceClient::set_round_trip_time(
-    base::TimeDelta round_trip_time) {
-  round_trip_time_ = round_trip_time;
-}
-
-void RtcEncodingVideoCapturer::EncodedVideoSourceClient::set_callback(
-    webrtc::EncodedImageCallback* callback) {
-  DCHECK(!callback_);
-  callback_ = callback;
-}
-
-void RtcEncodingVideoCapturer::EncodedVideoSourceClient::OnOpened(
-    const media::VideoEncodingParameters& params) {
-  params_ = params;
-}
-
-void RtcEncodingVideoCapturer::EncodedVideoSourceClient::OnClosed() {
-  finished_ = true;
-}
-
-void RtcEncodingVideoCapturer::EncodedVideoSourceClient::OnBufferReady(
-    scoped_refptr<const media::EncodedBitstreamBuffer> buffer) {
-  DCHECK(!finished_ && buffer.get());
-
-  // First buffer constitutes the origin of the time for this bitstream context.
-  if (time_base_.is_null())
-    time_base_ = buffer->metadata().timestamp;
-
-  ReportEncodedFrame(buffer);
-  encoded_video_source_->ReturnBitstreamBuffer(buffer);
-}
-
-void RtcEncodingVideoCapturer::EncodedVideoSourceClient::OnConfigChanged(
-    const media::RuntimeVideoEncodingParameters& params) {
-  params_.runtime_params = params;
-}
-
-void RtcEncodingVideoCapturer::EncodedVideoSourceClient::SetRates(
-    uint32_t target_bitrate, uint32_t frame_rate) {
-  params_.runtime_params.target_bitrate = target_bitrate;
-  params_.runtime_params.frames_per_second = frame_rate;
-  encoded_video_source_->TrySetBitstreamConfig(params_.runtime_params);
-}
-
-void RtcEncodingVideoCapturer::EncodedVideoSourceClient::RequestKeyFrame() {
-  encoded_video_source_->RequestKeyFrame();
-}
-
-void RtcEncodingVideoCapturer::EncodedVideoSourceClient::ReportEncodedFrame(
-    scoped_refptr<const media::EncodedBitstreamBuffer> buffer) {
-  if (!callback_)
-    return;
-
-  webrtc::EncodedImage image;
-  webrtc::CodecSpecificInfo codecInfo;
-  webrtc::RTPFragmentationHeader fragHeader;
-
-  // TODO(hshi): remove this const_cast. Unfortunately webrtc::EncodedImage
-  // defines member |_buffer| of type uint8_t* even though webrtc never modifies
-  // the buffer contents.
-  image._buffer = const_cast<uint8_t*>(buffer->buffer());
-  image._length = buffer->size();
-  image._size = image._length;
-
-  const media::BufferEncodingMetadata& metadata = buffer->metadata();
-  base::TimeDelta capture_time = metadata.timestamp - time_base_;
-  image.capture_time_ms_ = capture_time.InMilliseconds();
-  // Convert capture time to 90 kHz RTP timestamp.
-  image._timeStamp = (capture_time * 90000).InSeconds();
-  if (metadata.key_frame) {
-    image._frameType = webrtc::kKeyFrame;
-  } else {
-    image._frameType = webrtc::kDeltaFrame;
-  }
-  image._completeFrame = true;
-  image._encodedWidth = params_.resolution.width();
-  image._encodedHeight = params_.resolution.height();
-
-  // TODO(hshi): generate codec specific info for VP8.
-  codecInfo.codecType = rtc_codec_type_;
-
-  // Generate header containing a single fragmentation.
-  fragHeader.VerifyAndAllocateFragmentationHeader(1);
-  fragHeader.fragmentationOffset[0] = 0;
-  fragHeader.fragmentationLength[0] = buffer->size();
-  fragHeader.fragmentationPlType[0] = 0;
-  fragHeader.fragmentationTimeDiff[0] = 0;
-
-  callback_->Encoded(image, &codecInfo, &fragHeader);
-}
-
-// RtcEncodingVideoCapturer
-RtcEncodingVideoCapturer::RtcEncodingVideoCapturer(
-    media::EncodedVideoSource* encoded_video_source,
-    webrtc::VideoCodecType codec_type)
-    : encoded_video_source_(encoded_video_source),
-      rtc_codec_type_(codec_type) {
-}
-
-RtcEncodingVideoCapturer::~RtcEncodingVideoCapturer() {
-}
-
-int32_t RtcEncodingVideoCapturer::InitEncode(
-    const webrtc::VideoCodec* codecSettings,
-    int32_t numberOfCores,
-    uint32_t maxPayloadSize) {
-  DCHECK(!encoded_video_source_client_);
-  if (codecSettings->codecType != rtc_codec_type_)
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  if (codecSettings->startBitrate > kMaxBitrateKbps ||
-      codecSettings->maxBitrate > kMaxBitrateKbps)
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-
-  // Convert |codecSettings| to |params|.
-  media::VideoEncodingParameters params;
-  params.codec_name = codecSettings->plName;
-  params.resolution = gfx::Size(codecSettings->width, codecSettings->height);
-  params.runtime_params.target_bitrate = codecSettings->startBitrate * 1000;
-  params.runtime_params.max_bitrate = codecSettings->maxBitrate * 1000;
-  params.runtime_params.frames_per_second = codecSettings->maxFramerate;
-  encoded_video_source_client_.reset(new EncodedVideoSourceClient(
-      encoded_video_source_, params, rtc_codec_type_));
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t RtcEncodingVideoCapturer::Encode(
-    const webrtc::I420VideoFrame& /* inputImage */,
-    const webrtc::CodecSpecificInfo* codecSpecificInfo,
-    const std::vector<webrtc::VideoFrameType>* frame_types) {
-  if (frame_types && !frame_types->empty()) {
-    webrtc::VideoFrameType type = frame_types->front();
-    if (type == webrtc::kKeyFrame)
-      encoded_video_source_client_->RequestKeyFrame();
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t RtcEncodingVideoCapturer::RegisterEncodeCompleteCallback(
-      webrtc::EncodedImageCallback* callback) {
-  DCHECK(encoded_video_source_client_);
-  encoded_video_source_client_->set_callback(callback);
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t RtcEncodingVideoCapturer::Release() {
-  DCHECK(encoded_video_source_client_);
-  encoded_video_source_client_.reset(NULL);
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t RtcEncodingVideoCapturer::SetChannelParameters(
-    uint32_t /* packetLoss */,
-    int rtt_in_ms) {
-  if (!encoded_video_source_client_)
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  encoded_video_source_client_->set_round_trip_time(
-      base::TimeDelta::FromMilliseconds(rtt_in_ms));
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t RtcEncodingVideoCapturer::SetRates(uint32_t newBitRate,
-                                           uint32_t frameRate) {
-  if (!encoded_video_source_client_)
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  if (newBitRate > kMaxBitrateKbps)
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  encoded_video_source_client_->SetRates(newBitRate * 1000, frameRate);
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-}  // namespace content
diff --git a/content/renderer/media/rtc_encoding_video_capturer.h b/content/renderer/media/rtc_encoding_video_capturer.h
deleted file mode 100644
index 77f9626..0000000
--- a/content/renderer/media/rtc_encoding_video_capturer.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_MEDIA_RTC_ENCODING_VIDEO_CAPTURER_H_
-#define CONTENT_RENDERER_MEDIA_RTC_ENCODING_VIDEO_CAPTURER_H_
-
-#include "base/memory/ref_counted.h"
-#include "media/video/encoded_video_source.h"
-#include "media/video/video_encode_types.h"
-#include "third_party/libjingle/source/talk/media/webrtc/webrtcvie.h"
-
-namespace content {
-
-// Class to represent an encoding capable video capture interface for the
-// WebRTC component. This class expects to be registered as an encoder with
-// an internal source to the WebRTC stack and will not be able to function as
-// an encoder for uncompressed video frames.
-class RtcEncodingVideoCapturer : public webrtc::VideoEncoder {
- public:
-  RtcEncodingVideoCapturer(media::EncodedVideoSource* encoded_video_source,
-                           webrtc::VideoCodecType codec_type);
-  virtual ~RtcEncodingVideoCapturer();
-
-  // webrtc::VideoEncoder implementation.
-  virtual int32_t InitEncode(const webrtc::VideoCodec* codecSettings,
-                             int32_t numberOfCores,
-                             uint32_t maxPayloadSize) OVERRIDE;
-  virtual int32_t Encode(
-      const webrtc::I420VideoFrame& /* inputImage */,
-      const webrtc::CodecSpecificInfo* codecSpecificInfo,
-      const std::vector<webrtc::VideoFrameType>* frame_types) OVERRIDE;
-  virtual int32_t RegisterEncodeCompleteCallback(
-      webrtc::EncodedImageCallback* callback) OVERRIDE;
-  virtual int32_t Release() OVERRIDE;
-  virtual int32_t SetChannelParameters(uint32_t /* packetLoss */,
-                                       int rtt_in_ms) OVERRIDE;
-  virtual int32_t SetRates(uint32_t newBitRate,
-                           uint32_t frameRate) OVERRIDE;
- private:
-  // Forward declaration for private implementation to represent the
-  // encoded video source client;
-  class EncodedVideoSourceClient;
-  scoped_ptr<EncodedVideoSourceClient> encoded_video_source_client_;
-
-  // Pointer to the underlying EncodedVideoSource object. It is guaranteed to
-  // outlive the RtcEncodingVideoCapturer.
-  media::EncodedVideoSource* encoded_video_source_;
-  webrtc::VideoCodecType rtc_codec_type_;
-
-  DISALLOW_COPY_AND_ASSIGN(RtcEncodingVideoCapturer);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_MEDIA_RTC_ENCODING_VIDEO_CAPTURER_H_
diff --git a/content/renderer/media/rtc_encoding_video_capturer_factory.cc b/content/renderer/media/rtc_encoding_video_capturer_factory.cc
deleted file mode 100644
index a699aed..0000000
--- a/content/renderer/media/rtc_encoding_video_capturer_factory.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/media/rtc_encoding_video_capturer_factory.h"
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "content/renderer/media/rtc_encoding_video_capturer.h"
-#include "media/base/encoded_bitstream_buffer.h"
-
-namespace content {
-
-RtcEncodingVideoCapturerFactory::RtcEncodingVideoCapturerFactory()
-    : encoded_video_source_(NULL) {
-}
-
-RtcEncodingVideoCapturerFactory::~RtcEncodingVideoCapturerFactory() {
-  DCHECK(encoder_set_.empty());
-}
-
-void RtcEncodingVideoCapturerFactory::OnEncodedVideoSourceAdded(
-    media::EncodedVideoSource* source) {
-  // TODO(hshi): support multiple encoded video sources.
-  // For now we only support one instance of encoded video source at a time.
-  DCHECK(!encoded_video_source_);
-  encoded_video_source_ = source;
-  source->RequestCapabilities(base::Bind(
-      &RtcEncodingVideoCapturerFactory::OnCapabilitiesAvailable,
-      AsWeakPtr()));
-}
-
-void RtcEncodingVideoCapturerFactory::OnEncodedVideoSourceRemoved(
-    media::EncodedVideoSource* source) {
-  encoded_video_source_ = NULL;
-}
-
-webrtc::VideoEncoder* RtcEncodingVideoCapturerFactory::CreateVideoEncoder(
-    webrtc::VideoCodecType type) {
-  for (size_t i = 0; i < codecs_.size(); ++i) {
-    if (codecs_[i].type == type) {
-      RtcEncodingVideoCapturer* capturer =
-          new RtcEncodingVideoCapturer(encoded_video_source_, type);
-      encoder_set_.insert(capturer);
-      return capturer;
-    }
-  }
-  return NULL;
-}
-
-void RtcEncodingVideoCapturerFactory::DestroyVideoEncoder(
-    webrtc::VideoEncoder* encoder) {
-  EncoderSet::iterator it = encoder_set_.find(encoder);
-  if (it != encoder_set_.end()) {
-      delete encoder;
-      encoder_set_.erase(it);
-  }
-}
-
-void RtcEncodingVideoCapturerFactory::AddObserver(
-    WebRtcVideoEncoderFactory::Observer* observer) {
-  observers_.AddObserver(observer);
-}
-
-void RtcEncodingVideoCapturerFactory::RemoveObserver(
-    WebRtcVideoEncoderFactory::Observer* observer) {
-  observers_.RemoveObserver(observer);
-}
-
-const std::vector<cricket::WebRtcVideoEncoderFactory::VideoCodec>&
-RtcEncodingVideoCapturerFactory::codecs() const {
-  return codecs_;
-}
-
-void RtcEncodingVideoCapturerFactory::OnCapabilitiesAvailable(
-    const media::VideoEncodingCapabilities& caps) {
-  codecs_.clear();
-
-  for (size_t i = 0; i < caps.size(); ++i) {
-    webrtc::VideoCodecType webrtc_codec_type = webrtc::kVideoCodecGeneric;
-    switch (caps[i].codec_type) {
-      case media::kCodecVP8:
-        webrtc_codec_type = webrtc::kVideoCodecVP8;
-        break;
-      default:
-        break;
-    }
-    codecs_.push_back(cricket::WebRtcVideoEncoderFactory::VideoCodec(
-        webrtc_codec_type,
-        caps[i].codec_name,
-        caps[i].max_resolution.width(),
-        caps[i].max_resolution.height(),
-        caps[i].max_frames_per_second));
-  }
-
-  FOR_EACH_OBSERVER(WebRtcVideoEncoderFactory::Observer, observers_,
-                    OnCodecsAvailable());
-}
-
-}  // namespace content
diff --git a/content/renderer/media/rtc_encoding_video_capturer_factory.h b/content/renderer/media/rtc_encoding_video_capturer_factory.h
deleted file mode 100644
index 1fdf4f5..0000000
--- a/content/renderer/media/rtc_encoding_video_capturer_factory.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_MEDIA_RTC_ENCODING_VIDEO_CAPTURER_FACTORY_H_
-#define CONTENT_RENDERER_MEDIA_RTC_ENCODING_VIDEO_CAPTURER_FACTORY_H_
-
-#include "base/memory/weak_ptr.h"
-#include "base/observer_list.h"
-#include "media/video/encoded_video_source.h"
-#include "media/video/video_encode_types.h"
-#include "third_party/libjingle/source/talk/media/webrtc/webrtcvideoencoderfactory.h"
-
-namespace content {
-
-class RtcEncodingVideoCapturer;
-
-class RtcEncodingVideoCapturerFactory :
-      public cricket::WebRtcVideoEncoderFactory,
-      public base::SupportsWeakPtr<RtcEncodingVideoCapturerFactory> {
- public:
-  RtcEncodingVideoCapturerFactory();
-
-  // WebRtcVideoEncoderFactory interface.
-  virtual webrtc::VideoEncoder* CreateVideoEncoder(
-      webrtc::VideoCodecType type) OVERRIDE;
-  virtual void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) OVERRIDE;
-
-  virtual const std::vector<VideoCodec>& codecs() const OVERRIDE;
-
-  virtual void AddObserver(
-      WebRtcVideoEncoderFactory::Observer* observer) OVERRIDE;
-  virtual void RemoveObserver(
-      WebRtcVideoEncoderFactory::Observer* observer) OVERRIDE;
-
-  // Callback for RequestCapabilities().
-  void OnCapabilitiesAvailable(const media::VideoEncodingCapabilities& caps);
-
-  // Invoked when an EncodedVideoSource is added/removed.
-  void OnEncodedVideoSourceAdded(media::EncodedVideoSource* source);
-  void OnEncodedVideoSourceRemoved(media::EncodedVideoSource* source);
-
-private:
-  virtual ~RtcEncodingVideoCapturerFactory();
-
-  // Set of registered encoding capable video capturers.
-  typedef std::set<webrtc::VideoEncoder*> EncoderSet;
-
-  media::EncodedVideoSource* encoded_video_source_;
-  std::vector<VideoCodec> codecs_;
-
-  EncoderSet encoder_set_;
-
-  ObserverList<WebRtcVideoEncoderFactory::Observer, true> observers_;
-
-  DISALLOW_COPY_AND_ASSIGN(RtcEncodingVideoCapturerFactory);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_MEDIA_RTC_ENCODING_VIDEO_CAPTURER_FACTORY_H_
diff --git a/content/renderer/media/rtc_peer_connection_handler_unittest.cc b/content/renderer/media/rtc_peer_connection_handler_unittest.cc
index 72e9cfd..4f048fa 100644
--- a/content/renderer/media/rtc_peer_connection_handler_unittest.cc
+++ b/content/renderer/media/rtc_peer_connection_handler_unittest.cc
@@ -15,6 +15,7 @@
 #include "content/renderer/media/peer_connection_tracker.h"
 #include "content/renderer/media/rtc_media_constraints.h"
 #include "content/renderer/media/rtc_peer_connection_handler.h"
+#include "content/renderer/media/webrtc_audio_capturer.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/WebKit/public/platform/WebMediaConstraints.h"
@@ -248,8 +249,10 @@
 
     local_stream.audioTracks(audio_tracks);
     const std::string audio_track_id = UTF16ToUTF8(audio_tracks[0].id());
+    scoped_refptr<WebRtcAudioCapturer> capturer;
     scoped_refptr<webrtc::AudioTrackInterface> audio_track(
         mock_dependency_factory_->CreateLocalAudioTrack(audio_track_id,
+                                                        capturer,
                                                         NULL));
     native_stream->AddTrack(audio_track.get());
 
@@ -282,8 +285,10 @@
       stream->AddTrack(video_track.get());
     }
     if (!audio_track_label.empty()) {
+      scoped_refptr<WebRtcAudioCapturer> capturer;
       scoped_refptr<webrtc::AudioTrackInterface> audio_track(
           mock_dependency_factory_->CreateLocalAudioTrack(audio_track_label,
+                                                          capturer,
                                                           NULL));
       stream->AddTrack(audio_track.get());
     }
diff --git a/content/renderer/media/video_capture_impl.cc b/content/renderer/media/video_capture_impl.cc
index 4fc186b..032cd7f 100644
--- a/content/renderer/media/video_capture_impl.cc
+++ b/content/renderer/media/video_capture_impl.cc
@@ -5,10 +5,8 @@
 #include "content/renderer/media/video_capture_impl.h"
 
 #include "base/bind.h"
-#include "base/callback_helpers.h"
 #include "base/stl_util.h"
 #include "content/child/child_process.h"
-#include "content/common/media/encoded_video_capture_messages.h"
 #include "content/common/media/video_capture_messages.h"
 #include "media/base/limits.h"
 
@@ -60,9 +58,7 @@
       video_type_(media::VideoCaptureCapability::kI420),
       device_info_available_(false),
       suspended_(false),
-      state_(VIDEO_CAPTURE_STATE_STOPPED),
-      encoded_video_source_client_(NULL),
-      bitstream_open_(false) {
+      state_(VIDEO_CAPTURE_STATE_STOPPED) {
   DCHECK(filter);
   capture_format_.session_id = id;
 }
@@ -103,87 +99,6 @@
                  base::Unretained(this), handler));
 }
 
-void VideoCaptureImpl::RequestCapabilities(
-    const media::EncodedVideoSource::RequestCapabilitiesCallback& callback) {
-  capture_message_loop_proxy_->PostTask(FROM_HERE,
-      base::Bind(&VideoCaptureImpl::DoRequestCapabilitiesOnCaptureThread,
-                 base::Unretained(this), callback));
-}
-
-void VideoCaptureImpl::StartFetchCapabilities() {
-  Send(new EncodedVideoCaptureHostMsg_GetCapabilities(
-      device_id_, capture_format_.session_id));
-}
-
-void VideoCaptureImpl::OpenBitstream(
-    media::EncodedVideoSource::Client* client,
-    const media::VideoEncodingParameters& params) {
-  capture_message_loop_proxy_->PostTask(FROM_HERE,
-      base::Bind(&VideoCaptureImpl::DoOpenBitstreamOnCaptureThread,
-                 base::Unretained(this), client, params));
-}
-
-void VideoCaptureImpl::CloseBitstream() {
-  capture_message_loop_proxy_->PostTask(FROM_HERE,
-      base::Bind(&VideoCaptureImpl::DoCloseBitstreamOnCaptureThread,
-                 base::Unretained(this)));
-}
-
-void VideoCaptureImpl::ReturnBitstreamBuffer(
-    scoped_refptr<const media::EncodedBitstreamBuffer> buffer) {
-  Send(new EncodedVideoCaptureHostMsg_BitstreamBufferConsumed(
-      device_id_, buffer->buffer_id()));
-}
-
-void VideoCaptureImpl::TrySetBitstreamConfig(
-    const media::RuntimeVideoEncodingParameters& params) {
-  Send(new EncodedVideoCaptureHostMsg_TryConfigureBitstream(
-      device_id_, params));
-}
-
-void VideoCaptureImpl::RequestKeyFrame() {
-  Send(new EncodedVideoCaptureHostMsg_RequestKeyFrame(device_id_));
-}
-
-void VideoCaptureImpl::OnEncodingCapabilitiesAvailable(
-    const media::VideoEncodingCapabilities& capabilities) {
-  capture_message_loop_proxy_->PostTask(FROM_HERE, base::Bind(
-      &VideoCaptureImpl::DoNotifyCapabilitiesAvailableOnCaptureThread,
-      base::Unretained(this), capabilities));
-}
-
-void VideoCaptureImpl::OnEncodedBitstreamOpened(
-    const media::VideoEncodingParameters& params,
-    const std::vector<base::SharedMemoryHandle>& buffers,
-    uint32 buffer_size) {
-  capture_message_loop_proxy_->PostTask(FROM_HERE,
-      base::Bind(&VideoCaptureImpl::DoNotifyBitstreamOpenedOnCaptureThread,
-                 base::Unretained(this), params, buffers, buffer_size));
-}
-
-void VideoCaptureImpl::OnEncodedBitstreamClosed() {
-  capture_message_loop_proxy_->PostTask(FROM_HERE,
-      base::Bind(&VideoCaptureImpl::DoNotifyBitstreamClosedOnCaptureThread,
-                 base::Unretained(this)));
-}
-
-void VideoCaptureImpl::OnEncodingConfigChanged(
-      const media::RuntimeVideoEncodingParameters& params) {
-  capture_message_loop_proxy_->PostTask(FROM_HERE,
-      base::Bind(
-          &VideoCaptureImpl::DoNotifyBitstreamConfigChangedOnCaptureThread,
-          base::Unretained(this), params));
-}
-
-void VideoCaptureImpl::OnEncodedBufferReady(
-    int buffer_id,
-    uint32 size,
-    const media::BufferEncodingMetadata& metadata) {
-  capture_message_loop_proxy_->PostTask(FROM_HERE,
-      base::Bind(&VideoCaptureImpl::DoNotifyBitstreamBufferReadyOnCaptureThread,
-                 base::Unretained(this), buffer_id, size, metadata));
-}
-
 void VideoCaptureImpl::FeedBuffer(scoped_refptr<VideoFrameBuffer> buffer) {
   capture_message_loop_proxy_->PostTask(FROM_HERE,
       base::Bind(&VideoCaptureImpl::DoFeedBufferOnCaptureThread,
@@ -397,9 +312,6 @@
 
   switch (state) {
     case VIDEO_CAPTURE_STATE_STARTED:
-      if (!encoding_caps_callback_.is_null()) {
-        StartFetchCapabilities();
-      }
       break;
     case VIDEO_CAPTURE_STATE_STOPPED:
       state_ = VIDEO_CAPTURE_STATE_STOPPED;
@@ -483,118 +395,6 @@
   suspended_ = suspend;
 }
 
-void VideoCaptureImpl::DoRequestCapabilitiesOnCaptureThread(
-    const RequestCapabilitiesCallback& callback) {
-  DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
-  DCHECK(encoding_caps_callback_.is_null());
-  encoding_caps_callback_ = callback;
-
-  // Invoke callback immediately if capabilities are already available.
-  if (!encoding_caps_.empty())
-    base::ResetAndReturn(&encoding_caps_callback_).Run(encoding_caps_);
-}
-
-void VideoCaptureImpl::DoOpenBitstreamOnCaptureThread(
-    media::EncodedVideoSource::Client* client,
-    const media::VideoEncodingParameters& params) {
-  DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
-  DCHECK(!encoded_video_source_client_);
-  encoded_video_source_client_ = client;
-  Send(new EncodedVideoCaptureHostMsg_OpenBitstream(
-      device_id_, capture_format_.session_id, params));
-}
-
-void VideoCaptureImpl::DoCloseBitstreamOnCaptureThread() {
-  DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
-  DCHECK(bitstream_open_);
-
-  // Immediately clear EVS client pointer and release bitstream buffers if the
-  // client requests to close bitstream. Any further encoded capture messages
-  // from the browser process will be ignored.
-  bitstream_open_ = false;
-  for (size_t i = 0; i < bitstream_buffers_.size(); ++i) {
-    bitstream_buffers_[i]->Close();
-    delete bitstream_buffers_[i];
-  }
-  bitstream_buffers_.clear();
-  encoded_video_source_client_ = NULL;
-
-  Send(new EncodedVideoCaptureHostMsg_CloseBitstream(device_id_));
-}
-
-void VideoCaptureImpl::DoNotifyBitstreamOpenedOnCaptureThread(
-    const media::VideoEncodingParameters& params,
-    const std::vector<base::SharedMemoryHandle>& buffers,
-    uint32 buffer_size) {
-  DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
-  DCHECK(!bitstream_open_ && bitstream_buffers_.empty());
-  if (!encoded_video_source_client_)
-    return;
-  bitstream_open_ = true;
-  for (size_t i = 0; i < buffers.size(); ++i) {
-    base::SharedMemory* shm = new base::SharedMemory(buffers[i], true);
-    CHECK(shm->Map(buffer_size));
-    bitstream_buffers_.push_back(shm);
-  }
-  encoded_video_source_client_->OnOpened(params);
-}
-
-void VideoCaptureImpl::DoNotifyBitstreamClosedOnCaptureThread() {
-  DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
-
-  // Ignore the BitstreamClosed message if bitstream has already been closed
-  // by the EVS client.
-  if (!bitstream_open_)
-    return;
-
-  // The bitstream may still be open when we receive BitstreamClosed message
-  // if the request to close bitstream comes from the browser process.
-  bitstream_open_ = false;
-  for (size_t i = 0; i < bitstream_buffers_.size(); ++i) {
-    bitstream_buffers_[i]->Close();
-    delete bitstream_buffers_[i];
-  }
-  bitstream_buffers_.clear();
-  if (encoded_video_source_client_) {
-    encoded_video_source_client_->OnClosed();
-    encoded_video_source_client_ = NULL;
-  }
-}
-
-void VideoCaptureImpl::DoNotifyBitstreamConfigChangedOnCaptureThread(
-    const media::RuntimeVideoEncodingParameters& params) {
-  DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
-  if (!encoded_video_source_client_)
-    return;
-  encoded_video_source_client_->OnConfigChanged(params);
-}
-
-void VideoCaptureImpl::DoNotifyBitstreamBufferReadyOnCaptureThread(
-    int buffer_id,
-    uint32 size,
-    const media::BufferEncodingMetadata& metadata) {
-  DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
-  if (!encoded_video_source_client_)
-    return;
-  if (buffer_id >= 0 &&
-      static_cast<size_t>(buffer_id) < bitstream_buffers_.size()) {
-    base::SharedMemory* shm = bitstream_buffers_.at(buffer_id);
-    scoped_refptr<media::EncodedBitstreamBuffer> buffer =
-        new media::EncodedBitstreamBuffer(
-            buffer_id, (uint8*)shm->memory(), size, shm->handle(),
-            metadata, base::Bind(&base::DoNothing));
-    encoded_video_source_client_->OnBufferReady(buffer);
-  }
-}
-
-void VideoCaptureImpl::DoNotifyCapabilitiesAvailableOnCaptureThread(
-    const media::VideoEncodingCapabilities& capabilities) {
-  DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
-  encoding_caps_ = capabilities;
-  if (!encoding_caps_callback_.is_null())
-    base::ResetAndReturn(&encoding_caps_callback_).Run(encoding_caps_);
-}
-
 void VideoCaptureImpl::StopDevice() {
   DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
 
diff --git a/content/renderer/media/video_capture_impl.h b/content/renderer/media/video_capture_impl.h
index cd98d01..2ed7717 100644
--- a/content/renderer/media/video_capture_impl.h
+++ b/content/renderer/media/video_capture_impl.h
@@ -38,7 +38,6 @@
 #include "content/renderer/media/video_capture_message_filter.h"
 #include "media/video/capture/video_capture.h"
 #include "media/video/capture/video_capture_types.h"
-#include "media/video/encoded_video_source.h"
 
 namespace base {
 class MessageLoopProxy;
@@ -47,9 +46,7 @@
 namespace content {
 
 class CONTENT_EXPORT VideoCaptureImpl
-    : public media::VideoCapture,
-      public VideoCaptureMessageFilter::Delegate,
-      public media::EncodedVideoSource {
+    : public media::VideoCapture, public VideoCaptureMessageFilter::Delegate {
  public:
   // media::VideoCapture interface.
   virtual void StartCapture(
@@ -72,32 +69,6 @@
   virtual void OnDeviceInfoChanged(
       const media::VideoCaptureParams& device_info) OVERRIDE;
   virtual void OnDelegateAdded(int32 device_id) OVERRIDE;
-  virtual void OnEncodingCapabilitiesAvailable(
-          const media::VideoEncodingCapabilities& capabilities) OVERRIDE;
-  virtual void OnEncodedBitstreamOpened(
-      const media::VideoEncodingParameters& params,
-      const std::vector<base::SharedMemoryHandle>& buffers,
-      uint32 buffer_size) OVERRIDE;
-  virtual void OnEncodedBitstreamClosed() OVERRIDE;
-  virtual void OnEncodingConfigChanged(
-      const media::RuntimeVideoEncodingParameters& params) OVERRIDE;
-  virtual void OnEncodedBufferReady(
-      int buffer_id,
-      uint32 size,
-      const media::BufferEncodingMetadata& metadata) OVERRIDE;
-
-  // media::EncodedVideoSource interface.
-  virtual void RequestCapabilities(
-      const RequestCapabilitiesCallback& callback) OVERRIDE;
-  virtual void OpenBitstream(
-      media::EncodedVideoSource::Client* client,
-      const media::VideoEncodingParameters& params) OVERRIDE;
-  virtual void CloseBitstream() OVERRIDE;
-  virtual void ReturnBitstreamBuffer(
-      scoped_refptr<const media::EncodedBitstreamBuffer> buffer) OVERRIDE;
-  virtual void TrySetBitstreamConfig(
-      const media::RuntimeVideoEncodingParameters& params) OVERRIDE;
-  virtual void RequestKeyFrame() OVERRIDE;
 
   // Stop/resume delivering video frames to clients, based on flag |suspend|.
   virtual void SuspendCapture(bool suspend);
@@ -134,26 +105,6 @@
 
   void DoSuspendCaptureOnCaptureThread(bool suspend);
 
-  void StartFetchCapabilities();
-  void DoRequestCapabilitiesOnCaptureThread(
-      const RequestCapabilitiesCallback& callback);
-  void DoOpenBitstreamOnCaptureThread(
-      media::EncodedVideoSource::Client* client,
-      const media::VideoEncodingParameters& params);
-  void DoCloseBitstreamOnCaptureThread();
-  void DoNotifyBitstreamOpenedOnCaptureThread(
-      const media::VideoEncodingParameters& params,
-      const std::vector<base::SharedMemoryHandle>& buffers,
-      uint32 buffer_size);
-  void DoNotifyBitstreamClosedOnCaptureThread();
-  void DoNotifyBitstreamConfigChangedOnCaptureThread(
-      const media::RuntimeVideoEncodingParameters& params);
-  void DoNotifyBitstreamBufferReadyOnCaptureThread(
-      int buffer_id, uint32 size,
-      const media::BufferEncodingMetadata& metadata);
-  void DoNotifyCapabilitiesAvailableOnCaptureThread(
-      const media::VideoEncodingCapabilities& capabilities);
-
   void Init();
   void DeInit(base::Closure task);
   void DoDeInitOnCaptureThread(base::Closure task);
@@ -196,20 +147,6 @@
   bool suspended_;
   VideoCaptureState state_;
 
-  // Video encoding capabilities as reported by the device.
-  media::VideoEncodingCapabilities encoding_caps_;
-  // Callback for RequestCapabilities().
-  RequestCapabilitiesCallback encoding_caps_callback_;
-  // Pointer to the EVS client.
-  media::EncodedVideoSource::Client* encoded_video_source_client_;
-  // Bitstream buffers returned by the video capture device. Unowned.
-  std::vector<base::SharedMemory*> bitstream_buffers_;
-  // |bitstream_open_| is set to true when renderer receives BitstreamOpened
-  // message acknowledging an OpenBitstream request, and is set to false when
-  // the EVS client requests to close bitstream, or when renderer receives
-  // BitstreamClosed message from the browser procses.
-  bool bitstream_open_;
-
   DISALLOW_COPY_AND_ASSIGN(VideoCaptureImpl);
 };
 
diff --git a/content/renderer/media/video_capture_impl_manager.cc b/content/renderer/media/video_capture_impl_manager.cc
index 3a25378..672fbd4 100644
--- a/content/renderer/media/video_capture_impl_manager.cc
+++ b/content/renderer/media/video_capture_impl_manager.cc
@@ -9,10 +9,6 @@
 #include "content/renderer/media/video_capture_impl.h"
 #include "content/renderer/media/video_capture_message_filter.h"
 
-#if defined(ENABLE_WEBRTC)
-#include "content/renderer/media/rtc_encoding_video_capturer_factory.h"
-#endif
-
 namespace content {
 
 VideoCaptureImplManager::VideoCaptureImplManager()
@@ -34,12 +30,6 @@
         new VideoCaptureImpl(id, message_loop_proxy_.get(), filter_.get());
     devices_[id] = new Device(vc, handler);
     vc->Init();
-
-#if defined(ENABLE_WEBRTC)
-    if (encoding_capturer_factory_)
-      encoding_capturer_factory_->OnEncodedVideoSourceAdded(vc);
-#endif
-
     return vc;
   }
 
@@ -69,11 +59,6 @@
   if (size == it->second->clients.size() || size > 1)
     return;
 
-#if defined(ENABLE_WEBRTC)
-  if (encoding_capturer_factory_)
-    encoding_capturer_factory_->OnEncodedVideoSourceRemoved(devices_[id]->vc);
-#endif
-
   devices_[id]->vc->DeInit(base::Bind(&VideoCaptureImplManager::FreeDevice,
                                       this, devices_[id]->vc));
   delete devices_[id];
diff --git a/content/renderer/media/video_capture_impl_manager.h b/content/renderer/media/video_capture_impl_manager.h
index 9b26b20..e942201 100644
--- a/content/renderer/media/video_capture_impl_manager.h
+++ b/content/renderer/media/video_capture_impl_manager.h
@@ -13,17 +13,14 @@
 #include <list>
 #include <map>
 
-#include "base/memory/weak_ptr.h"
 #include "base/message_loop/message_loop_proxy.h"
 #include "base/threading/thread.h"
 #include "base/synchronization/lock.h"
 #include "content/common/content_export.h"
 #include "media/video/capture/video_capture.h"
-#include "media/video/encoded_video_source.h"
 
 namespace content {
 
-class RtcEncodingVideoCapturerFactory;
 class VideoCaptureImpl;
 class VideoCaptureMessageFilter;
 
@@ -53,11 +50,6 @@
     return filter_.get();
   }
 
-  void set_encoding_capturer_factory(base::WeakPtr<
-      RtcEncodingVideoCapturerFactory> encoding_capturer_factory) {
-    encoding_capturer_factory_ = encoding_capturer_factory;
-  }
-
  protected:
   virtual ~VideoCaptureImplManager();
 
@@ -82,12 +74,6 @@
   base::Thread thread_;
   scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
 
-  // The encoding capturer factory is created by MediaStreamDependencyFactory
-  // and owned by its PeerConnectionFactory. It is passed to the manager
-  // as a weak pointer at CreatePeerConnectionFactory time because the
-  // PeerConnectionFactory may be released earlier than the manager.
-  base::WeakPtr<RtcEncodingVideoCapturerFactory> encoding_capturer_factory_;
-
   DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManager);
 };
 
diff --git a/content/renderer/media/video_capture_impl_unittest.cc b/content/renderer/media/video_capture_impl_unittest.cc
index 440d330..7d347e5 100644
--- a/content/renderer/media/video_capture_impl_unittest.cc
+++ b/content/renderer/media/video_capture_impl_unittest.cc
@@ -4,7 +4,6 @@
 
 #include "base/message_loop/message_loop.h"
 #include "content/child/child_process.h"
-#include "content/common/media/encoded_video_capture_messages.h"
 #include "content/common/media/video_capture_messages.h"
 #include "content/renderer/media/video_capture_impl.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -75,18 +74,6 @@
         IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Stop, DeviceStopCapture)
         IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_BufferReady,
                             DeviceReceiveEmptyBuffer)
-        IPC_MESSAGE_HANDLER(EncodedVideoCaptureHostMsg_GetCapabilities,
-                            DeviceGetEncodingCapabilities)
-        IPC_MESSAGE_HANDLER(EncodedVideoCaptureHostMsg_OpenBitstream,
-                            DeviceOpenEncodedBitstream)
-        IPC_MESSAGE_HANDLER(EncodedVideoCaptureHostMsg_CloseBitstream,
-                            DeviceCloseEncodedBitstream)
-        IPC_MESSAGE_HANDLER(EncodedVideoCaptureHostMsg_TryConfigureBitstream,
-                            DeviceSetEncodingConfig)
-        IPC_MESSAGE_HANDLER(EncodedVideoCaptureHostMsg_RequestKeyFrame,
-                            DeviceRequestKeyFrame)
-        IPC_MESSAGE_HANDLER(EncodedVideoCaptureHostMsg_BitstreamBufferConsumed,
-                            DeviceReturnEncodedBuffer)
         IPC_MESSAGE_UNHANDLED(handled = false)
       IPC_END_MESSAGE_MAP()
       EXPECT_TRUE(handled);
@@ -107,22 +94,6 @@
     }
 
     void DeviceReceiveEmptyBuffer(int device_id, int buffer_id) {}
-
-    void DeviceGetEncodingCapabilities(
-        int device_id, media::VideoCaptureSessionId session_id) {}
-
-    void DeviceOpenEncodedBitstream(int device_id,
-                                    media::VideoCaptureSessionId session_id,
-                                    media::VideoEncodingParameters params) {}
-
-    void DeviceCloseEncodedBitstream(int device_id) {}
-
-    void DeviceSetEncodingConfig(
-        int device_id, media::RuntimeVideoEncodingParameters params) {}
-
-    void DeviceRequestKeyFrame(int device_id) {}
-
-    void DeviceReturnEncodedBuffer(int device_id, int buffer_id) {}
   };
 
   VideoCaptureImplTest()
diff --git a/content/renderer/media/video_capture_message_filter.cc b/content/renderer/media/video_capture_message_filter.cc
index 04c79ab..0ef77fa 100644
--- a/content/renderer/media/video_capture_message_filter.cc
+++ b/content/renderer/media/video_capture_message_filter.cc
@@ -4,7 +4,6 @@
 
 #include "content/renderer/media/video_capture_message_filter.h"
 
-#include "content/common/media/encoded_video_capture_messages.h"
 #include "content/common/media/video_capture_messages.h"
 #include "content/common/view_messages.h"
 
@@ -62,18 +61,7 @@
     IPC_MESSAGE_HANDLER(VideoCaptureMsg_StateChanged, OnDeviceStateChanged)
     IPC_MESSAGE_HANDLER(VideoCaptureMsg_NewBuffer, OnBufferCreated)
     IPC_MESSAGE_HANDLER(VideoCaptureMsg_DeviceInfo, OnDeviceInfoReceived)
-    IPC_MESSAGE_HANDLER(VideoCaptureMsg_DeviceInfoChanged, OnDeviceInfoChanged)
-    IPC_MESSAGE_HANDLER(EncodedVideoCaptureMsg_CapabilitiesAvailable,
-                        OnCapabilitiesAvailable)
-    IPC_MESSAGE_HANDLER(EncodedVideoCaptureMsg_BitstreamOpened,
-                        OnBitstreamOpened)
-    IPC_MESSAGE_HANDLER(EncodedVideoCaptureMsg_BitstreamClosed,
-                        OnBitstreamClosed)
-    IPC_MESSAGE_HANDLER(EncodedVideoCaptureMsg_BitstreamConfigChanged,
-                        OnBitstreamConfigChanged)
-    IPC_MESSAGE_HANDLER(EncodedVideoCaptureMsg_BitstreamReady,
-                        OnBitstreamReady);
-  IPC_MESSAGE_UNHANDLED(handled = false)
+    IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
 }
@@ -170,76 +158,4 @@
   delegate->OnDeviceInfoReceived(params);
 }
 
-void VideoCaptureMessageFilter::OnDeviceInfoChanged(
-    int device_id,
-    const media::VideoCaptureParams& params) {
-  Delegate* delegate = find_delegate(device_id);
-  if (!delegate) {
-    DLOG(WARNING) << "OnDeviceInfoChanged: Got video capture event for a "
-        "non-existent or removed video capture.";
-    return;
-  }
-  delegate->OnDeviceInfoChanged(params);
-}
-
-void VideoCaptureMessageFilter::OnCapabilitiesAvailable(
-    int device_id,
-    media::VideoEncodingCapabilities capabilities) {
-  Delegate* delegate = find_delegate(device_id);
-  if (!delegate) {
-    DLOG(WARNING) << "OnCapabilitiesAvailable: Got video capture event for a "
-        "non-existent or removed video capture.";
-    return;
-  }
-  delegate->OnEncodingCapabilitiesAvailable(capabilities);
-}
-
-void VideoCaptureMessageFilter::OnBitstreamOpened(
-    int device_id,
-    media::VideoEncodingParameters params,
-    std::vector<base::SharedMemoryHandle> buffers,
-    uint32 buffer_size) {
-  Delegate* delegate = find_delegate(device_id);
-  if (!delegate) {
-    DLOG(WARNING) << "OnBitstreamOpened: Got video capture event for a "
-        "non-existent or removed video capture.";
-    return;
-  }
-  delegate->OnEncodedBitstreamOpened(params, buffers, buffer_size);
-}
-
-void VideoCaptureMessageFilter::OnBitstreamClosed(int device_id) {
-  Delegate* delegate = find_delegate(device_id);
-  if (!delegate) {
-    DLOG(WARNING) << "OnBitstreamClosed: Got video capture event for a "
-        "non-existent or removed video capture.";
-    return;
-  }
-  delegate->OnEncodedBitstreamClosed();
-}
-
-void VideoCaptureMessageFilter::OnBitstreamConfigChanged(
-    int device_id,
-    media::RuntimeVideoEncodingParameters params) {
-  Delegate* delegate = find_delegate(device_id);
-  if (!delegate) {
-    DLOG(WARNING) << "OnBitstreamConfigChanged: Got video capture event for a "
-        "non-existent or removed video capture.";
-    return;
-  }
-  delegate->OnEncodingConfigChanged(params);
-}
-
-void VideoCaptureMessageFilter::OnBitstreamReady(
-    int device_id, int buffer_id, uint32 size,
-    media::BufferEncodingMetadata metadata) {
-  Delegate* delegate = find_delegate(device_id);
-  if (!delegate) {
-    DLOG(WARNING) << "OnBitstreamReady: Got video capture event for a "
-        "non-existent or removed video capture.";
-    return;
-  }
-  delegate->OnEncodedBufferReady(buffer_id, size, metadata);
-}
-
 }  // namespace content
diff --git a/content/renderer/media/video_capture_message_filter.h b/content/renderer/media/video_capture_message_filter.h
index ede6ab6..013e2d0 100644
--- a/content/renderer/media/video_capture_message_filter.h
+++ b/content/renderer/media/video_capture_message_filter.h
@@ -18,7 +18,6 @@
 #include "content/common/media/video_capture.h"
 #include "ipc/ipc_channel_proxy.h"
 #include "media/video/capture/video_capture.h"
-#include "media/video/encoded_video_source.h"
 
 namespace content {
 
@@ -52,31 +51,6 @@
     // |device_id| is the device id for the delegate.
     virtual void OnDelegateAdded(int32 device_id) = 0;
 
-    // Called when the encoding capabilities is received from video capture
-    // device in the browser process.
-    virtual void OnEncodingCapabilitiesAvailable(
-        const media::VideoEncodingCapabilities& capabilities) = 0;
-
-    // Called when a bitstream is opened on a video capture device.
-    virtual void OnEncodedBitstreamOpened(
-        const media::VideoEncodingParameters& params,
-        const std::vector<base::SharedMemoryHandle>& buffers,
-        uint32 buffer_size) = 0;
-
-    // Called when a bitstream is closed on a video capture device.
-    virtual void OnEncodedBitstreamClosed() = 0;
-
-    // Called when encoding parameters has changed.
-    virtual void OnEncodingConfigChanged(
-        const media::RuntimeVideoEncodingParameters& params) = 0;
-
-    // Called when an encoded bitstream buffer is received from video capture
-    // device in the browser process.
-    virtual void OnEncodedBufferReady(
-        int buffer_id,
-        uint32 size,
-        const media::BufferEncodingMetadata& metadata) = 0;
-
    protected:
     virtual ~Delegate() {}
   };
@@ -123,31 +97,6 @@
   void OnDeviceInfoReceived(int device_id,
                             const media::VideoCaptureParams& params);
 
-  // Receive newly changed device info from browser process.
-  void OnDeviceInfoChanged(int device_id,
-                           const media::VideoCaptureParams& params);
-
-  // Receive encoding capabilities from browser process.
-  void OnCapabilitiesAvailable(int device_id,
-                               media::VideoEncodingCapabilities capabilities);
-
-  // Bitstream is opened on video capture device.
-  void OnBitstreamOpened(int device_id,
-                         media::VideoEncodingParameters params,
-                         std::vector<base::SharedMemoryHandle> buffers,
-                         uint32 buffer_size);
-
-  // Bitstream is closed on video capture device.
-  void OnBitstreamClosed(int device_id);
-
-  // Receive current encoding parameters from browser process.
-  void OnBitstreamConfigChanged(int device_id,
-                                media::RuntimeVideoEncodingParameters params);
-
-  // Receive an encoded bitstream buffer from browser process.
-  void OnBitstreamReady(int device_id, int buffer_id, uint32 size,
-                        media::BufferEncodingMetadata metadata);
-
   // Finds the delegate associated with |device_id|, NULL if not found.
   Delegate* find_delegate(int device_id) const;
 
diff --git a/content/renderer/media/video_capture_message_filter_unittest.cc b/content/renderer/media/video_capture_message_filter_unittest.cc
index 5b4c194..222600a 100644
--- a/content/renderer/media/video_capture_message_filter_unittest.cc
+++ b/content/renderer/media/video_capture_message_filter_unittest.cc
@@ -50,21 +50,6 @@
     device_id_ = device_id;
   }
 
-  // TODO(hshi): implement the following methods for encoded video capture.
-  virtual void OnEncodingCapabilitiesAvailable(
-      const media::VideoEncodingCapabilities& capabilities) OVERRIDE {}
-  virtual void OnEncodedBitstreamOpened(
-      const media::VideoEncodingParameters& params,
-      const std::vector<base::SharedMemoryHandle>& buffers,
-      uint32 buffer_size) OVERRIDE {}
-  virtual void OnEncodedBitstreamClosed() OVERRIDE {}
-  virtual void OnEncodingConfigChanged(
-      const media::RuntimeVideoEncodingParameters& params) OVERRIDE {}
-  virtual void OnEncodedBufferReady(
-      int buffer_id,
-      uint32 size,
-      const media::BufferEncodingMetadata& metadata) OVERRIDE {}
-
   void Reset() {
     buffer_created_ = false;
     handle_ = base::SharedMemory::NULLHandle();
diff --git a/content/renderer/media/webrtc_audio_capturer.cc b/content/renderer/media/webrtc_audio_capturer.cc
index 90e2482..238b2a2 100644
--- a/content/renderer/media/webrtc_audio_capturer.cc
+++ b/content/renderer/media/webrtc_audio_capturer.cc
@@ -10,29 +10,31 @@
 #include "base/strings/string_util.h"
 #include "content/child/child_process.h"
 #include "content/renderer/media/audio_device_factory.h"
-#include "content/renderer/media/webrtc_audio_capturer_sink_owner.h"
 #include "content/renderer/media/webrtc_audio_device_impl.h"
+#include "content/renderer/media/webrtc_local_audio_track.h"
 #include "media/audio/audio_util.h"
 #include "media/audio/sample_rates.h"
 
 namespace content {
 
+namespace {
+
 // Supported hardware sample rates for input and output sides.
 #if defined(OS_WIN) || defined(OS_MACOSX)
 // media::GetAudioInputHardwareSampleRate() asks the audio layer
 // for its current sample rate (set by the user) on Windows and Mac OS X.
 // The listed rates below adds restrictions and WebRtcAudioDeviceImpl::Init()
 // will fail if the user selects any rate outside these ranges.
-static int kValidInputRates[] = {96000, 48000, 44100, 32000, 16000, 8000};
+const int kValidInputRates[] = {96000, 48000, 44100, 32000, 16000, 8000};
 #elif defined(OS_LINUX) || defined(OS_OPENBSD)
-static int kValidInputRates[] = {48000, 44100};
+const int kValidInputRates[] = {48000, 44100};
 #elif defined(OS_ANDROID)
-static int kValidInputRates[] = {48000, 44100};
+const int kValidInputRates[] = {48000, 44100};
 #else
-static int kValidInputRates[] = {44100};
+const int kValidInputRates[] = {44100};
 #endif
 
-static int GetBufferSizeForSampleRate(int sample_rate) {
+int GetBufferSizeForSampleRate(int sample_rate) {
   int buffer_size = 0;
 #if defined(OS_WIN) || defined(OS_MACOSX)
   // Use a buffer size of 10ms.
@@ -49,6 +51,8 @@
   return buffer_size;
 }
 
+}  // namespace
+
 // This is a temporary audio buffer with parameters used to send data to
 // callbacks.
 class WebRtcAudioCapturer::ConfiguredBuffer :
@@ -87,6 +91,68 @@
   media::AudioParameters params_;
 };
 
+// Reference counted container of WebRtcLocalAudioTrack delegate.
+class WebRtcAudioCapturer::TrackOwner
+    : public base::RefCountedThreadSafe<WebRtcAudioCapturer::TrackOwner> {
+ public:
+  explicit TrackOwner(WebRtcLocalAudioTrack* track)
+      : delegate_(track) {}
+
+  void CaptureData(const int16* audio_data,
+                   int number_of_channels,
+                   int number_of_frames,
+                   int audio_delay_milliseconds,
+                   int volume) {
+    base::AutoLock lock(lock_);
+    if (delegate_) {
+      delegate_->CaptureData(audio_data,
+                             number_of_channels,
+                             number_of_frames,
+                             audio_delay_milliseconds,
+                             volume);
+    }
+  }
+
+  void SetCaptureFormat(const media::AudioParameters& params) {
+    base::AutoLock lock(lock_);
+    if (delegate_)
+      delegate_->SetCaptureFormat(params);
+  }
+
+  void Reset() {
+    base::AutoLock lock(lock_);
+    delegate_ = NULL;
+  }
+
+  // Wrapper which allows to use std::find_if() when adding and removing
+  // sinks to/from the list.
+  struct TrackWrapper {
+    TrackWrapper(WebRtcLocalAudioTrack* track) : track_(track) {}
+    bool operator()(
+        const scoped_refptr<WebRtcAudioCapturer::TrackOwner>& owner) {
+      return owner->IsEqual(track_);
+    }
+    WebRtcLocalAudioTrack* track_;
+  };
+
+ protected:
+  virtual ~TrackOwner() {}
+
+ private:
+  friend class base::RefCountedThreadSafe<WebRtcAudioCapturer::TrackOwner>;
+
+  bool IsEqual(const WebRtcLocalAudioTrack* other) const {
+    base::AutoLock lock(lock_);
+    return (other == delegate_);
+  }
+
+  // Do NOT reference count the |delegate_| to avoid cyclic reference counting.
+  WebRtcLocalAudioTrack* delegate_;
+  mutable base::Lock lock_;
+
+  DISALLOW_COPY_AND_ASSIGN(TrackOwner);
+};
+
 // static
 scoped_refptr<WebRtcAudioCapturer> WebRtcAudioCapturer::CreateCapturer() {
   scoped_refptr<WebRtcAudioCapturer> capturer = new WebRtcAudioCapturer();
@@ -118,7 +184,8 @@
 bool WebRtcAudioCapturer::Initialize(int render_view_id,
                                      media::ChannelLayout channel_layout,
                                      int sample_rate,
-                                     int session_id) {
+                                     int session_id,
+                                     const std::string& device_id) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DVLOG(1) << "WebRtcAudioCapturer::Initialize()";
 
@@ -127,6 +194,14 @@
                             channel_layout, media::CHANNEL_LAYOUT_MAX);
 
   session_id_ = session_id;
+  device_id_ = device_id;
+  if (render_view_id == -1) {
+    // This capturer is used by WebAudio, return true without creating a
+    // default capturing source. WebAudio will inject its own source via
+    // SetCapturerSource() at a later state.
+    DCHECK(device_id.empty());
+    return true;
+  }
 
   // Verify that the reported input channel configuration is supported.
   if (channel_layout != media::CHANNEL_LAYOUT_MONO &&
@@ -169,11 +244,11 @@
 }
 
 WebRtcAudioCapturer::WebRtcAudioCapturer()
-    : default_sink_(NULL),
-      source_(NULL),
+    : source_(NULL),
       running_(false),
       agc_is_enabled_(false),
-      session_id_(0) {
+      session_id_(0),
+      volume_(0) {
   DVLOG(1) << "WebRtcAudioCapturer::WebRtcAudioCapturer()";
 }
 
@@ -181,66 +256,39 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(tracks_.empty());
   DCHECK(!running_);
-  DCHECK(!default_sink_);
   DVLOG(1) << "WebRtcAudioCapturer::~WebRtcAudioCapturer()";
 }
 
-void WebRtcAudioCapturer::SetDefaultSink(WebRtcAudioCapturerSink* sink) {
-  DVLOG(1) << "WebRtcAudioCapturer::SetDefaultSink()";
-  if (sink) {
-    DCHECK(!default_sink_);
-    default_sink_ = sink;
-    AddSink(sink);
-  } else {
-    DCHECK(default_sink_);
-    RemoveSink(default_sink_);
-    default_sink_ = NULL;
-  }
-}
-
-void WebRtcAudioCapturer::AddSink(WebRtcAudioCapturerSink* track) {
+void WebRtcAudioCapturer::AddTrack(WebRtcLocalAudioTrack* track) {
   DCHECK(track);
-  DVLOG(1) << "WebRtcAudioCapturer::AddSink()";
+  DVLOG(1) << "WebRtcAudioCapturer::AddTrack()";
 
-  // Start the source if an audio track is connected to the capturer.
-  // |default_sink_| is not an audio track.
-  if (track != default_sink_)
-    Start();
+  // Start the source if the first audio track is connected to the capturer.
+  // Start() will do nothing if the capturer has already been started.
+  Start();
 
   base::AutoLock auto_lock(lock_);
   // Verify that |track| is not already added to the list.
-  DCHECK(std::find_if(
-      tracks_.begin(), tracks_.end(),
-      WebRtcAudioCapturerSinkOwner::WrapsSink(track)) == tracks_.end());
+  DCHECK(std::find_if(tracks_.begin(), tracks_.end(),
+                      TrackOwner::TrackWrapper(track)) == tracks_.end());
 
   if (buffer_.get()) {
     track->SetCaptureFormat(buffer_->params());
-  } else {
-    DLOG(WARNING) << "The format of the capturer has not been correctly "
-                  <<  "initialized";
   }
 
-  // Create (and add to the list) a new WebRtcAudioCapturerSinkOwner which owns
-  // the |track| and delagates all calls to the WebRtcAudioCapturerSink
-  // interface.
-  tracks_.push_back(new WebRtcAudioCapturerSinkOwner(track));
-  // TODO(xians): should we call SetCapturerFormat() to each track?
+  tracks_.push_back(new WebRtcAudioCapturer::TrackOwner(track));
 }
 
-void WebRtcAudioCapturer::RemoveSink(
-    WebRtcAudioCapturerSink* track) {
+void WebRtcAudioCapturer::RemoveTrack(WebRtcLocalAudioTrack* track) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  DVLOG(1) << "WebRtcAudioCapturer::RemoveSink()";
 
   bool stop_source = false;
   {
     base::AutoLock auto_lock(lock_);
-
     // Get iterator to the first element for which WrapsSink(track) returns
     // true.
     TrackList::iterator it = std::find_if(
-        tracks_.begin(), tracks_.end(),
-        WebRtcAudioCapturerSinkOwner::WrapsSink(track));
+        tracks_.begin(), tracks_.end(), TrackOwner::TrackWrapper(track));
     if (it != tracks_.end()) {
       // Clear the delegate to ensure that no more capture callbacks will
       // be sent to this sink. Also avoids a possible crash which can happen
@@ -250,16 +298,7 @@
     }
 
     // Stop the source if the last audio track is going away.
-    // The |tracks_| might contain the |default_sink_|, we need to stop the
-    // source if the only remaining element is |default_sink_|.
-    if (tracks_.size() == 1 && default_sink_ &&
-        (*tracks_.begin())->IsEqual(default_sink_)) {
-      stop_source = true;
-    } else {
-      // The source might have been stopped, but it is safe to call Stop()
-      // again to make sure the source is stopped correctly.
-      stop_source = tracks_.empty();
-    }
+    stop_source = tracks_.empty();
   }
 
   if (stop_source)
@@ -355,11 +394,22 @@
     source->Stop();
 }
 
-void WebRtcAudioCapturer::SetVolume(double volume) {
+void WebRtcAudioCapturer::SetVolume(int volume) {
   DVLOG(1) << "WebRtcAudioCapturer::SetVolume()";
+  DCHECK_LE(volume, MaxVolume());
+  double normalized_volume = static_cast<double>(volume) / MaxVolume();
   base::AutoLock auto_lock(lock_);
   if (source_.get())
-    source_->SetVolume(volume);
+    source_->SetVolume(normalized_volume);
+}
+
+int WebRtcAudioCapturer::Volume() const {
+  base::AutoLock auto_lock(lock_);
+  return volume_;
+}
+
+int WebRtcAudioCapturer::MaxVolume() const {
+  return WebRtcAudioDeviceImpl::kMaxVolumeLevel;
 }
 
 void WebRtcAudioCapturer::SetAutomaticGainControl(bool enable) {
@@ -378,6 +428,17 @@
   // This callback is driven by AudioInputDevice::AudioThreadCallback if
   // |source_| is AudioInputDevice, otherwise it is driven by client's
   // CaptureCallback.
+#if defined(OS_WIN) || defined(OS_MACOSX)
+  DCHECK_LE(volume, 1.0);
+#elif defined(OS_LINUX) || defined(OS_OPENBSD)
+  // We have a special situation on Linux where the microphone volume can be
+  // "higher than maximum". The input volume slider in the sound preference
+  // allows the user to set a scaling that is higher than 100%. It means that
+  // even if the reported maximum levels is N, the actual microphone level can
+  // go up to 1.5x*N and that corresponds to a normalized |volume| of 1.5x.
+  DCHECK_LE(volume, 1.6);
+#endif
+
   TrackList tracks;
   scoped_refptr<ConfiguredBuffer> buffer_ref_while_calling;
   {
@@ -385,6 +446,11 @@
     if (!running_)
       return;
 
+    // Map internal volume range of [0.0, 1.0] into [0, 255] used by the
+    // webrtc::VoiceEngine. webrtc::VoiceEngine will handle the case when the
+    // volume is higher than 255.
+    volume_ = static_cast<int>((volume * MaxVolume()) + 0.5);
+
     // Copy the stuff we will need to local variables. In particular, we grab
     // a reference to the buffer so we can ensure it stays alive even if the
     // buffer is reconfigured while we are calling back.
@@ -406,7 +472,7 @@
        ++it) {
     (*it)->CaptureData(buffer_ref_while_calling->buffer(),
                        audio_source->channels(), audio_source->frames(),
-                       audio_delay_milliseconds, volume);
+                       audio_delay_milliseconds, volume_);
   }
 }
 
diff --git a/content/renderer/media/webrtc_audio_capturer.h b/content/renderer/media/webrtc_audio_capturer.h
index dfadb56..e85ea04 100644
--- a/content/renderer/media/webrtc_audio_capturer.h
+++ b/content/renderer/media/webrtc_audio_capturer.h
@@ -22,9 +22,8 @@
 
 namespace content {
 
-class WebRtcAudioCapturerSink;
-class WebRtcAudioCapturerSinkOwner;
 class WebRtcLocalAudioRenderer;
+class WebRtcLocalAudioTrack;
 
 // This class manages the capture data flow by getting data from its
 // |source_|, and passing it to its |tracks_|.
@@ -46,31 +45,24 @@
   // Creates and configures the default audio capturing source using the
   // provided audio parameters.  |render_view_id| specifies the render view
   // consuming audio for capture.  |session_id| is passed to the browser to
-  // decide which device to use.  Called on the main render thread.
+  // decide which device to use.  |device_id| is used to identify which device
+  // the capturer is created for.  Called on the main render thread.
   bool Initialize(int render_view_id,
                   media::ChannelLayout channel_layout,
                   int sample_rate,
-                  int session_id);
-
-  // Called by the WebRtcAudioDeviceImpl to add the ADM as the default sink to
-  // the capturer. This function is needed since WebRTC supports only one ADM
-  // but multiple audio tracks, so the ADM can't be the sink of certain audio
-  // track now. And we also need to distinguish the WebRtcAudioDeviceImpl from
-  // the audio track in order to start/stop the source of the capturer
-  // correctly.
-  // TODO(xians): Remove this function after WebRtc supports multiple ADMs.
-  void SetDefaultSink(WebRtcAudioCapturerSink* sink);
+                  int session_id,
+                  const std::string& device_id);
 
   // Add a audio track to the sinks of the capturer.
   // WebRtcAudioDeviceImpl calls this method on the main render thread but
   // other clients may call it from other threads. The current implementation
   // does not support multi-thread calling.
   // Called on the main render thread or libjingle working thread.
-  void AddSink(WebRtcAudioCapturerSink* track);
+  void AddTrack(WebRtcLocalAudioTrack* track);
 
   // Remove a audio track from the sinks of the capturer.
   // Called on the main render thread or libjingle working thread.
-  void RemoveSink(WebRtcAudioCapturerSink* track);
+  void RemoveTrack(WebRtcLocalAudioTrack* track);
 
   // SetCapturerSource() is called if the client on the source side desires to
   // provide their own captured audio data. Client is responsible for calling
@@ -81,9 +73,11 @@
       media::ChannelLayout channel_layout,
       float sample_rate);
 
-  // Sets the microphone volume.
+  // Volume APIs used by WebRtcAudioDeviceImpl.
   // Called on the AudioInputDevice audio thread.
-  void SetVolume(double volume);
+  void SetVolume(int volume);
+  int Volume() const;
+  int MaxVolume() const;
 
   // Enables or disables the WebRtc AGC control.
   // Called from a Libjingle working thread.
@@ -99,13 +93,16 @@
   // of this accessor and if we can remove it.
   media::AudioParameters audio_parameters() const;
 
+  const std::string& device_id() const { return device_id_; }
+
  protected:
   friend class base::RefCountedThreadSafe<WebRtcAudioCapturer>;
   WebRtcAudioCapturer();
   virtual ~WebRtcAudioCapturer();
 
  private:
-  typedef std::list<scoped_refptr<WebRtcAudioCapturerSinkOwner> > TrackList;
+  class TrackOwner;
+  typedef std::list<scoped_refptr<TrackOwner> > TrackList;
 
   // AudioCapturerSource::CaptureCallback implementation.
   // Called on the AudioInputDevice audio thread.
@@ -139,10 +136,6 @@
   // A list of audio tracks that the audio data is fed to.
   TrackList tracks_;
 
-  // A pointer to WebRtcAudioDeviceImpl which is the default destination of
-  // all the audio tracks data flow.
-  WebRtcAudioCapturerSink* default_sink_;
-
   // The audio data source from the browser process.
   scoped_refptr<media::AudioCapturerSource> source_;
 
@@ -155,9 +148,17 @@
   // True when automatic gain control is enabled, false otherwise.
   bool agc_is_enabled_;
 
-  // The media session ID used to identify which input device to be started.
+  // The media session ID used to identify which input device to be started by
+  // the browser.
   int session_id_;
 
+  // The device this capturer is given permission to use.
+  std::string device_id_;
+
+  // Stores latest microphone volume received in a CaptureData() callback.
+  // Range is [0, 255].
+  int volume_;
+
   DISALLOW_COPY_AND_ASSIGN(WebRtcAudioCapturer);
 };
 
diff --git a/content/renderer/media/webrtc_audio_capturer_sink_owner.cc b/content/renderer/media/webrtc_audio_capturer_sink_owner.cc
index ab0c3d3..cb6a813 100644
--- a/content/renderer/media/webrtc_audio_capturer_sink_owner.cc
+++ b/content/renderer/media/webrtc_audio_capturer_sink_owner.cc
@@ -11,14 +11,23 @@
     : delegate_(sink) {
 }
 
-void WebRtcAudioCapturerSinkOwner::CaptureData(
-    const int16* audio_data, int number_of_channels, int number_of_frames,
-    int audio_delay_milliseconds, double volume) {
+int WebRtcAudioCapturerSinkOwner::CaptureData(const std::vector<int>& channels,
+                                              const int16* audio_data,
+                                              int sample_rate,
+                                              int number_of_channels,
+                                              int number_of_frames,
+                                              int audio_delay_milliseconds,
+                                              int current_volume,
+                                              bool need_audio_processing) {
   base::AutoLock lock(lock_);
   if (delegate_) {
-    delegate_->CaptureData(audio_data, number_of_channels, number_of_frames,
-                           audio_delay_milliseconds, volume);
+    return delegate_->CaptureData(channels, audio_data, sample_rate,
+                                  number_of_channels, number_of_frames,
+                                  audio_delay_milliseconds, current_volume,
+                                  need_audio_processing);
   }
+
+  return 0;
 }
 
 void WebRtcAudioCapturerSinkOwner::SetCaptureFormat(
diff --git a/content/renderer/media/webrtc_audio_capturer_sink_owner.h b/content/renderer/media/webrtc_audio_capturer_sink_owner.h
index dd6264f..a3641b8 100644
--- a/content/renderer/media/webrtc_audio_capturer_sink_owner.h
+++ b/content/renderer/media/webrtc_audio_capturer_sink_owner.h
@@ -5,7 +5,7 @@
 #ifndef CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_CAPTURER_SINK_OWNER_H_
 #define CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_CAPTURER_SINK_OWNER_H_
 
-#include <list>
+#include <vector>
 
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/lock.h"
@@ -24,11 +24,15 @@
   explicit WebRtcAudioCapturerSinkOwner(WebRtcAudioCapturerSink* sink);
 
   // WebRtcAudioCapturerSink implementation.
-  virtual void CaptureData(const int16* audio_data,
-                           int number_of_channels,
-                           int number_of_frames,
-                           int audio_delay_milliseconds,
-                           double volume) OVERRIDE;
+  virtual int CaptureData(const std::vector<int>& channels,
+                          const int16* audio_data,
+                          int sample_rate,
+                          int number_of_channels,
+                          int number_of_frames,
+                          int audio_delay_milliseconds,
+                          int current_volume,
+                          bool need_audio_processing) OVERRIDE;
+
   virtual void SetCaptureFormat(const media::AudioParameters& params) OVERRIDE;
 
   bool IsEqual(const WebRtcAudioCapturerSink* other) const;
diff --git a/content/renderer/media/webrtc_audio_device_impl.cc b/content/renderer/media/webrtc_audio_device_impl.cc
index 2672a27..c40e0a2 100644
--- a/content/renderer/media/webrtc_audio_device_impl.cc
+++ b/content/renderer/media/webrtc_audio_device_impl.cc
@@ -20,12 +20,6 @@
 
 namespace content {
 
-namespace {
-
-const double kMaxVolumeLevel = 255.0;
-
-}  // namespace
-
 WebRtcAudioDeviceImpl::WebRtcAudioDeviceImpl()
     : ref_count_(0),
       audio_transport_callback_(NULL),
@@ -58,98 +52,64 @@
   }
   return ret;
 }
-
-void WebRtcAudioDeviceImpl::CaptureData(const int16* audio_data,
-                                        int number_of_channels,
-                                        int number_of_frames,
-                                        int audio_delay_milliseconds,
-                                        double volume) {
-  DCHECK_LE(number_of_frames, input_buffer_size());
-#if defined(OS_WIN) || defined(OS_MACOSX)
-  DCHECK_LE(volume, 1.0);
-#elif defined(OS_LINUX) || defined(OS_OPENBSD)
-  // We have a special situation on Linux where the microphone volume can be
-  // "higher than maximum". The input volume slider in the sound preference
-  // allows the user to set a scaling that is higher than 100%. It means that
-  // even if the reported maximum levels is N, the actual microphone level can
-  // go up to 1.5x*N and that corresponds to a normalized |volume| of 1.5x.
-  DCHECK_LE(volume, 1.6);
-#endif
-
-  media::AudioParameters input_audio_parameters;
-  int output_delay_ms = 0;
+int WebRtcAudioDeviceImpl::CaptureData(const std::vector<int>& channels,
+                                       const int16* audio_data,
+                                       int sample_rate,
+                                       int number_of_channels,
+                                       int number_of_frames,
+                                       int audio_delay_milliseconds,
+                                       int current_volume,
+                                       bool need_audio_processing) {
+  int total_delay_ms = 0;
   {
     base::AutoLock auto_lock(lock_);
     if (!recording_)
-      return;
-
-    // Take a copy of the input parameters while we are under a lock.
-    input_audio_parameters = input_audio_parameters_;
+      return 0;
 
     // Store the reported audio delay locally.
     input_delay_ms_ = audio_delay_milliseconds;
-    output_delay_ms = output_delay_ms_;
+    total_delay_ms = input_delay_ms_ + output_delay_ms_;
     DVLOG(2) << "total delay: " << input_delay_ms_ + output_delay_ms_;
-
-    // Map internal volume range of [0.0, 1.0] into [0, 255] used by the
-    // webrtc::VoiceEngine.
-    microphone_volume_ = static_cast<uint32_t>(volume * kMaxVolumeLevel);
   }
 
-  const int channels = number_of_channels;
-  DCHECK_LE(channels, input_channels());
-  uint32_t new_mic_level = 0;
-
-  int samples_per_sec = input_sample_rate();
-  const int samples_per_10_msec = (samples_per_sec / 100);
-  int bytes_per_sample = input_audio_parameters.bits_per_sample() / 8;
-  const int bytes_per_10_msec =
-      channels * samples_per_10_msec * bytes_per_sample;
-  int accumulated_audio_samples = 0;
-
-  const uint8* audio_byte_buffer = reinterpret_cast<const uint8*>(audio_data);
-
   // Write audio samples in blocks of 10 milliseconds to the registered
   // webrtc::AudioTransport sink. Keep writing until our internal byte
   // buffer is empty.
   // TODO(niklase): Wire up the key press detection.
+  const int16* audio_buffer = audio_data;
+  const int samples_per_10_msec = (sample_rate / 100);
+  int accumulated_audio_samples = 0;
   bool key_pressed = false;
+  uint32_t new_volume = 0;
   while (accumulated_audio_samples < number_of_frames) {
     // Deliver 10ms of recorded 16-bit linear PCM audio.
-    audio_transport_callback_->RecordedDataIsAvailable(
-        audio_byte_buffer,
+    int new_mic_level = audio_transport_callback_->OnDataAvailable(
+        &channels[0],
+        channels.size(),
+        audio_buffer,
+        sample_rate,
+        number_of_channels,
         samples_per_10_msec,
-        bytes_per_sample,
-        channels,
-        samples_per_sec,
-        input_delay_ms_ + output_delay_ms,
-        0,  // TODO(henrika): |clock_drift| parameter is not utilized today.
-        microphone_volume_,
+        total_delay_ms,
+        current_volume,
         key_pressed,
-        new_mic_level);
+        need_audio_processing);
 
     accumulated_audio_samples += samples_per_10_msec;
-    audio_byte_buffer += bytes_per_10_msec;
+    audio_buffer += samples_per_10_msec * number_of_channels;
+
+    // The latest non-zero new microphone level will be returned.
+    if (new_mic_level)
+      new_volume = new_mic_level;
   }
 
-  // The AGC returns a non-zero microphone level if it has been decided
-  // that a new level should be set.
-  if (new_mic_level != 0) {
-    // Use IPC and set the new level. Note that, it will take some time
-    // before the new level is effective due to the IPC scheme.
-    // During this time, |current_mic_level| will contain "non-valid" values
-    // and it might reduce the AGC performance. Measurements on Windows 7 have
-    // shown that we might receive old volume levels for one or two callbacks.
-    SetMicrophoneVolume(new_mic_level);
-  }
+  return new_volume;
 }
 
 void WebRtcAudioDeviceImpl::SetCaptureFormat(
     const media::AudioParameters& params) {
   DVLOG(1) << "WebRtcAudioDeviceImpl::SetCaptureFormat()";
   DCHECK(thread_checker_.CalledOnValidThread());
-  base::AutoLock auto_lock(lock_);
-  input_audio_parameters_ = params;
 }
 
 void WebRtcAudioDeviceImpl::RenderData(uint8* audio_data,
@@ -217,19 +177,6 @@
   DVLOG(1) << "WebRtcAudioDeviceImpl::Init()";
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  if (initialized_)
-    return 0;
-
-  DCHECK(!capturer_.get());
-  capturer_ = WebRtcAudioCapturer::CreateCapturer();
-
-  // Add itself as an audio track to the |capturer_|. This is because WebRTC
-  // supports only one ADM but multiple audio tracks, so the ADM can't be the
-  // sink of certain audio track now.
-  // TODO(xians): Register the ADM as the sink of the audio track if WebRTC
-  // supports one ADM for each audio track. See http://crbug/247027.
-  capturer_->SetDefaultSink(this);
-
   // We need to return a success to continue the initialization of WebRtc VoE
   // because failure on the capturer_ initialization should not prevent WebRTC
   // from working. See issue http://crbug.com/144421 for details.
@@ -258,12 +205,7 @@
     DCHECK(!renderer_.get());
   }
 
-  if (capturer_.get()) {
-    // |capturer_| is stopped by the media stream, so do not need to
-    // call Stop() here.
-    capturer_->SetDefaultSink(NULL);
-    capturer_ = NULL;
-  }
+  capturers_.clear();
 
   initialized_ = false;
   return 0;
@@ -283,14 +225,14 @@
 }
 
 int32_t WebRtcAudioDeviceImpl::RecordingIsAvailable(bool* available) {
-  *available = (capturer_.get() != NULL);
+  *available = (!capturers_.empty());
   return 0;
 }
 
 bool WebRtcAudioDeviceImpl::RecordingIsInitialized() const {
   DVLOG(1) << "WebRtcAudioDeviceImpl::RecordingIsInitialized()";
   DCHECK(thread_checker_.CalledOnValidThread());
-  return (capturer_.get() != NULL);
+  return (!capturers_.empty());
 }
 
 int32_t WebRtcAudioDeviceImpl::StartPlayout() {
@@ -389,13 +331,17 @@
   if (enable == agc_is_enabled_)
     return 0;
 
+  // Set the AGC on all the capturers. It depends on the source of the
+  // capturer whether AGC is supported or not.
   // The current implementation does not support changing the AGC state while
   // recording. Using this approach simplifies the design and it is also
-  // inline with the  latest WebRTC standard.
-  if (!capturer_.get() || capturer_->is_recording())
-    return -1;
+  // inline with the latest WebRTC standard.
+  for (CapturerList::const_iterator iter = capturers_.begin();
+       iter != capturers_.end(); ++iter) {
+    if (!(*iter)->is_recording())
+      (*iter)->SetAutomaticGainControl(enable);
+  }
 
-  capturer_->SetAutomaticGainControl(enable);
   agc_is_enabled_ = enable;
   return 0;
 }
@@ -411,35 +357,33 @@
 int32_t WebRtcAudioDeviceImpl::SetMicrophoneVolume(uint32_t volume) {
   DVLOG(1) << "WebRtcAudioDeviceImpl::SetMicrophoneVolume(" << volume << ")";
   DCHECK(initialized_);
-  if (!capturer_.get())
+
+  // Only one microphone is supported at the moment, which is represented by
+  // the default capturer.
+  scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer());
+  if (!capturer.get())
     return -1;
 
-  if (volume > kMaxVolumeLevel)
-    return -1;
-
-  // WebRTC uses a range of [0, 255] to represent the level of the microphone
-  // volume. The IPC channel between the renderer and browser process works
-  // with doubles in the [0.0, 1.0] range and we have to compensate for that.
-  double normalized_volume = static_cast<double>(volume) / kMaxVolumeLevel;
-  capturer_->SetVolume(normalized_volume);
+  capturer->SetVolume(volume);
   return 0;
 }
 
 // TODO(henrika): sort out calling thread once we start using this API.
 int32_t WebRtcAudioDeviceImpl::MicrophoneVolume(uint32_t* volume) const {
   DVLOG(1) << "WebRtcAudioDeviceImpl::MicrophoneVolume()";
-  // The microphone level is fed to this class using the Capture() callback
-  // and cached in the same method, i.e. we don't ask the native audio layer
-  // for the actual micropone level here.
+  // We only support one microphone now, which is accessed via the default
+  // capturer.
   DCHECK(initialized_);
-  if (!capturer_.get())
+  scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer());
+  if (!capturer.get())
     return -1;
-  base::AutoLock auto_lock(lock_);
-  *volume = microphone_volume_;
+
+  *volume = static_cast<uint32_t>(capturer->Volume());
   return 0;
 }
 
 int32_t WebRtcAudioDeviceImpl::MaxMicrophoneVolume(uint32_t* max_volume) const {
+  DCHECK(initialized_);
   *max_volume = kMaxVolumeLevel;
   return 0;
 }
@@ -458,9 +402,13 @@
 int32_t WebRtcAudioDeviceImpl::StereoRecordingIsAvailable(
     bool* available) const {
   DCHECK(initialized_);
-  if (!capturer_.get())
+  // TODO(xians): These kind of hardware methods do not make much sense since we
+  // support multiple sources. Remove or figure out new APIs for such methods.
+  scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer());
+  if (!capturer.get())
     return -1;
-  *available = (input_channels() == 2);
+
+  *available = (capturer->audio_parameters().channels() == 2);
   return 0;
 }
 
@@ -478,7 +426,13 @@
 
 int32_t WebRtcAudioDeviceImpl::RecordingSampleRate(
     uint32_t* samples_per_sec) const {
-  *samples_per_sec = static_cast<uint32_t>(input_sample_rate());
+  // We use the default capturer as the recording sample rate.
+  scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer());
+  if (!capturer.get())
+    return -1;
+
+  *samples_per_sec = static_cast<uint32_t>(
+      capturer->audio_parameters().sample_rate());
   return 0;
 }
 
@@ -503,4 +457,33 @@
   return true;
 }
 
+void WebRtcAudioDeviceImpl::AddAudioCapturer(
+    const scoped_refptr<WebRtcAudioCapturer>& capturer) {
+  DVLOG(1) << "WebRtcAudioDeviceImpl::AddAudioCapturer()";
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(capturer.get());
+
+  // Enable/disable the AGC on the new capture.
+  DCHECK(!capturer->is_recording());
+  capturer->SetAutomaticGainControl(agc_is_enabled_);
+
+  // We only support one microphone today, which means the list can contain
+  // only one capturer with a valid device id.
+  DCHECK(capturer->device_id().empty() || !GetDefaultCapturer());
+  base::AutoLock auto_lock(lock_);
+  capturers_.push_back(capturer);
+}
+
+scoped_refptr<WebRtcAudioCapturer>
+WebRtcAudioDeviceImpl::GetDefaultCapturer() const {
+  base::AutoLock auto_lock(lock_);
+  for (CapturerList::const_iterator iter = capturers_.begin();
+       iter != capturers_.end(); ++iter) {
+    if (!(*iter)->device_id().empty())
+      return *iter;
+  }
+
+  return NULL;
+}
+
 }  // namespace content
diff --git a/content/renderer/media/webrtc_audio_device_impl.h b/content/renderer/media/webrtc_audio_device_impl.h
index 960d0d0..ef3cb7c 100644
--- a/content/renderer/media/webrtc_audio_device_impl.h
+++ b/content/renderer/media/webrtc_audio_device_impl.h
@@ -6,6 +6,7 @@
 #define CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_DEVICE_IMPL_H_
 
 #include <string>
+#include <vector>
 
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
@@ -204,11 +205,25 @@
 class WebRtcAudioCapturerSink {
  public:
   // Callback to deliver the captured interleaved data.
-  virtual void CaptureData(const int16* audio_data,
-                           int number_of_channels,
-                           int number_of_frames,
-                           int audio_delay_milliseconds,
-                           double volume) = 0;
+  // |channels| contains a vector of WebRtc VoE channels.
+  // |audio_data| is the pointer to the audio data.
+  // |sample_rate| is the sample frequency of audio data.
+  // |number_of_channels| is the number of channels reflecting the order of
+  // surround sound channels.
+  // |audio_delay_milliseconds| is recording delay value.
+  // |current_volume| is current microphone volume, in range of |0, 255].
+  // |need_audio_processing| indicates if the audio needs WebRtc AEC/NS/AGC
+  // audio processing.
+  // The return value is the new microphone volume, in the range of |0, 255].
+  // When the volume does not need to be updated, it returns 0.
+  virtual int CaptureData(const std::vector<int>& channels,
+                          const int16* audio_data,
+                          int sample_rate,
+                          int number_of_channels,
+                          int number_of_frames,
+                          int audio_delay_milliseconds,
+                          int current_volume,
+                          bool need_audio_processing) = 0;
 
   // Set the format for the capture audio parameters.
   virtual void SetCaptureFormat(const media::AudioParameters& params) = 0;
@@ -225,6 +240,9 @@
       NON_EXPORTED_BASE(public WebRtcAudioCapturerSink),
       NON_EXPORTED_BASE(public WebRtcAudioRendererSource) {
  public:
+  // The maximum volume value WebRtc uses.
+  static const int kMaxVolumeLevel = 255;
+
   // Instances of this object are created on the main render thread.
   WebRtcAudioDeviceImpl();
 
@@ -283,43 +301,45 @@
   // Called on the main renderer thread.
   bool SetAudioRenderer(WebRtcAudioRenderer* renderer);
 
-  const scoped_refptr<WebRtcAudioCapturer>& capturer() const {
-    return capturer_;
-  }
+  // Adds the capturer to the ADM.
+  void AddAudioCapturer(const scoped_refptr<WebRtcAudioCapturer>& capturer);
+
+  // Gets the default capturer, which is the capturer in the list with
+  // a valid |device_id|. Microphones are represented by capturers with a valid
+  // |device_id|, since only one microphone is supported today, only one
+  // capturer in the |capturers_| can have a valid |device_id|.
+  scoped_refptr<WebRtcAudioCapturer> GetDefaultCapturer() const;
+
   const scoped_refptr<WebRtcAudioRenderer>& renderer() const {
     return renderer_;
   }
-  int input_buffer_size() const {
-    return input_audio_parameters_.frames_per_buffer();
-  }
   int output_buffer_size() const {
     return output_audio_parameters_.frames_per_buffer();
   }
-  int input_channels() const {
-    return input_audio_parameters_.channels();
-  }
   int output_channels() const {
     return output_audio_parameters_.channels();
   }
-  int input_sample_rate() const {
-    return input_audio_parameters_.sample_rate();
-  }
   int output_sample_rate() const {
     return output_audio_parameters_.sample_rate();
   }
 
  private:
+  typedef std::list<scoped_refptr<WebRtcAudioCapturer> > CapturerList;
+
   // Make destructor private to ensure that we can only be deleted by Release().
   virtual ~WebRtcAudioDeviceImpl();
 
   // WebRtcAudioCapturerSink implementation.
 
   // Called on the AudioInputDevice worker thread.
-  virtual void CaptureData(const int16* audio_data,
-                           int number_of_channels,
-                           int number_of_frames,
-                           int audio_delay_milliseconds,
-                           double volume) OVERRIDE;
+  virtual int CaptureData(const std::vector<int>& channels,
+                          const int16* audio_data,
+                          int sample_rate,
+                          int number_of_channels,
+                          int number_of_frames,
+                          int audio_delay_milliseconds,
+                          int current_volume,
+                          bool need_audio_processing) OVERRIDE;
 
   // Called on the main render thread.
   virtual void SetCaptureFormat(const media::AudioParameters& params) OVERRIDE;
@@ -341,8 +361,9 @@
 
   int ref_count_;
 
-  // Provides access to the native audio input layer in the browser process.
-  scoped_refptr<WebRtcAudioCapturer> capturer_;
+  // List of captures which provides access to the native audio input layer
+  // in the browser process.
+  CapturerList capturers_;
 
   // Provides access to the audio renderer in the browser process.
   scoped_refptr<WebRtcAudioRenderer> renderer_;
@@ -352,8 +373,7 @@
   // RegisterAudioCallback().
   webrtc::AudioTransport* audio_transport_callback_;
 
-  // Cached values of utilized audio parameters. Platform dependent.
-  media::AudioParameters input_audio_parameters_;
+  // Cached values of used output audio parameters. Platform dependent.
   media::AudioParameters output_audio_parameters_;
 
   // Cached value of the current audio delay on the input/capture side.
diff --git a/content/renderer/media/webrtc_audio_device_unittest.cc b/content/renderer/media/webrtc_audio_device_unittest.cc
index ead1d70..6746ab6 100644
--- a/content/renderer/media/webrtc_audio_device_unittest.cc
+++ b/content/renderer/media/webrtc_audio_device_unittest.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <vector>
+
 #include "base/environment.h"
 #include "base/file_util.h"
 #include "base/files/file_path.h"
@@ -101,14 +103,13 @@
   return true;
 }
 
-// Utility method which initializes the audio capturer contained in the
-// WebRTC audio device. This method should be used in tests where
+// Utility method which creates and initializes the audio capturer and adds it
+// to WebRTC audio device. This method should be used in tests where
 // HardwareSampleRatesAreValid() has been called and returned true.
-bool InitializeCapturer(WebRtcAudioDeviceImpl* webrtc_audio_device) {
-  // Access the capturer owned and created by the audio device.
-  WebRtcAudioCapturer* capturer = webrtc_audio_device->capturer().get();
-  if (!capturer)
-    return false;
+bool CreateAndInitializeCapturer(WebRtcAudioDeviceImpl* webrtc_audio_device) {
+  DCHECK(webrtc_audio_device);
+  scoped_refptr<WebRtcAudioCapturer> capturer(
+      WebRtcAudioCapturer::CreateCapturer());
 
   media::AudioHardwareConfig* hardware_config =
       RenderThreadImpl::current()->GetAudioHardwareConfig();
@@ -118,12 +119,30 @@
   int sample_rate = hardware_config->GetInputSampleRate();
   media::ChannelLayout channel_layout =
       hardware_config->GetInputChannelLayout();
-  if (!capturer->Initialize(kRenderViewId, channel_layout, sample_rate, 1))
+  if (!capturer->Initialize(kRenderViewId, channel_layout, sample_rate, 1,
+                            media::AudioManagerBase::kDefaultDeviceId)) {
     return false;
+  }
+
+  // Add the capturer to the WebRtcAudioDeviceImpl.
+  webrtc_audio_device->AddAudioCapturer(capturer);
 
   return true;
 }
 
+// Create and start a local audio track. Starting the audio track will connect
+// the audio track to the capturer and also start the source of the capturer.
+// Also, connect the sink to the audio track.
+scoped_refptr<WebRtcLocalAudioTrack>
+CreateAndStartLocalAudioTrack(WebRtcAudioCapturer* capturer,
+                              WebRtcAudioCapturerSink* sink) {
+  scoped_refptr<WebRtcLocalAudioTrack> local_audio_track(
+      WebRtcLocalAudioTrack::Create(std::string(), capturer, NULL));
+  local_audio_track->AddSink(sink);
+  local_audio_track->Start();
+  return local_audio_track;
+}
+
 class WebRTCMediaProcessImpl : public webrtc::VoEMediaProcess {
  public:
   explicit WebRTCMediaProcessImpl(base::WaitableEvent* event)
@@ -195,13 +214,17 @@
   virtual ~MockWebRtcAudioCapturerSink() {}
 
   // WebRtcAudioCapturerSink implementation.
-  virtual void CaptureData(const int16* audio_data,
-                           int number_of_channels,
-                           int number_of_frames,
-                           int audio_delay_milliseconds,
-                           double volume) OVERRIDE {
+  virtual int CaptureData(const std::vector<int>& channels,
+                          const int16* audio_data,
+                          int sample_rate,
+                          int number_of_channels,
+                          int number_of_frames,
+                          int audio_delay_milliseconds,
+                          int current_volume,
+                          bool need_audio_processing) OVERRIDE {
     // Signal that a callback has been received.
     event_->Signal();
+    return 0;
   }
 
   // Set the format for the capture audio parameters.
@@ -312,7 +335,6 @@
       48000, 2, 480);
   WebRtcAudioCapturerSink* capturer_sink =
       static_cast<WebRtcAudioCapturerSink*>(webrtc_audio_device.get());
-  capturer_sink->SetCaptureFormat(params);
   WebRtcAudioRendererSource* renderer_source =
       static_cast<WebRtcAudioRendererSource*>(webrtc_audio_device.get());
   renderer_source->SetRenderFormat(params);
@@ -339,9 +361,8 @@
   EXPECT_EQ(0, base->StartSend(channel));
 
   // Read speech data from a speech test file.
-  const int num_input_channels = webrtc_audio_device->input_channels();
-  const int input_packet_size = webrtc_audio_device->input_buffer_size() * 2 *
-      num_input_channels;
+  const int input_packet_size =
+      params.frames_per_buffer() * 2 * params.channels();
   const int num_output_channels = webrtc_audio_device->output_channels();
   const int output_packet_size = webrtc_audio_device->output_buffer_size() * 2 *
       num_output_channels;
@@ -353,12 +374,15 @@
   scoped_ptr<uint8[]> buffer(new uint8[output_packet_size]);
   base::Time start_time = base::Time::Now();
   int delay = 0;
+  std::vector<int> voe_channels;
+  voe_channels.push_back(channel);
   for (int j = 0; j < kNumberOfPacketsForLoopbackTest; ++j) {
     // Sending fake capture data to WebRtc.
     capturer_sink->CaptureData(
+        voe_channels,
         reinterpret_cast<int16*>(capture_data.get() + input_packet_size * j),
-        num_input_channels, webrtc_audio_device->input_buffer_size(),
-        kHardwareLatencyInMs, 1.0);
+        params.sample_rate(), params.channels(), params.frames_per_buffer(),
+        kHardwareLatencyInMs, 1.0, enable_apm);
 
     // Receiving data from WebRtc.
     renderer_source->RenderData(
@@ -451,16 +475,12 @@
   scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
       new WebRtcAudioDeviceImpl());
 
-  // The capturer is not created until after the WebRtcAudioDeviceImpl has
-  // been initialized.
-  EXPECT_FALSE(InitializeCapturer(webrtc_audio_device.get()));
-
   WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
   ASSERT_TRUE(engine.valid());
 
   ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
   int err = base->Init(webrtc_audio_device.get());
-  EXPECT_TRUE(InitializeCapturer(webrtc_audio_device.get()));
+  EXPECT_TRUE(CreateAndInitializeCapturer(webrtc_audio_device.get()));
   EXPECT_EQ(0, err);
   EXPECT_EQ(0, base->Terminate());
 }
@@ -593,16 +613,6 @@
   int err = base->Init(webrtc_audio_device.get());
   ASSERT_EQ(0, err);
 
-  EXPECT_TRUE(InitializeCapturer(webrtc_audio_device.get()));
-
-  // Create and start a local audio track. Starting the audio track will connect
-  // the audio track to the capturer and also start the source of the capturer.
-  scoped_refptr<WebRtcLocalAudioTrack> local_audio_track(
-      WebRtcLocalAudioTrack::Create(std::string(),
-                                    webrtc_audio_device->capturer(),
-                                    NULL));
-  local_audio_track->Start();
-
   int ch = base->CreateChannel();
   EXPECT_NE(-1, ch);
 
@@ -624,6 +634,20 @@
   EXPECT_EQ(0, network->RegisterExternalTransport(ch, *transport.get()));
   EXPECT_EQ(0, base->StartSend(ch));
 
+  // Create and initialize the capturer which starts the source of the data
+  // flow.
+  EXPECT_TRUE(CreateAndInitializeCapturer(webrtc_audio_device.get()));
+
+  // Create and start a local audio track which is bridging the data flow
+  // between the capturer and WebRtcAudioDeviceImpl.
+  scoped_refptr<WebRtcLocalAudioTrack> local_audio_track(
+      CreateAndStartLocalAudioTrack(webrtc_audio_device->GetDefaultCapturer(),
+                                    webrtc_audio_device));
+  // connect the VoE voice channel to the audio track
+  static_cast<webrtc::AudioTrackInterface*>(local_audio_track.get())->
+      GetRenderer()->AddChannel(ch);
+
+  // Verify we get the data flow.
   EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout()));
   WaitForIOThreadCompletion();
 
@@ -722,7 +746,8 @@
 // TODO(henrika): improve quality by using a wideband codec, enabling noise-
 // suppressions etc.
 // FullDuplexAudioWithAGC is flaky on Android, disable it for now.
-#if defined(OS_ANDROID)
+// Also flakily hangs on Windows: crbug.com/269348.
+#if defined(OS_ANDROID) || defined(OS_WIN)
 #define MAYBE_FullDuplexAudioWithAGC DISABLED_FullDuplexAudioWithAGC
 #else
 #define MAYBE_FullDuplexAudioWithAGC FullDuplexAudioWithAGC
@@ -763,15 +788,6 @@
   int err = base->Init(webrtc_audio_device.get());
   ASSERT_EQ(0, err);
 
-  EXPECT_TRUE(InitializeCapturer(webrtc_audio_device.get()));
-  // Create and start a local audio track. Starting the audio track will connect
-  // the audio track to the capturer and also start the source of the capturer.
-  scoped_refptr<WebRtcLocalAudioTrack> local_audio_track(
-      WebRtcLocalAudioTrack::Create(std::string(),
-                                    webrtc_audio_device->capturer(),
-                                    NULL));
-  local_audio_track->Start();
-
   ScopedWebRTCPtr<webrtc::VoEAudioProcessing> audio_processing(engine.get());
   ASSERT_TRUE(audio_processing.valid());
 #if defined(OS_ANDROID)
@@ -791,6 +807,14 @@
   int ch = base->CreateChannel();
   EXPECT_NE(-1, ch);
 
+  EXPECT_TRUE(CreateAndInitializeCapturer(webrtc_audio_device.get()));
+  scoped_refptr<WebRtcLocalAudioTrack> local_audio_track(
+      CreateAndStartLocalAudioTrack(webrtc_audio_device->GetDefaultCapturer(),
+                                    webrtc_audio_device));
+  // connect the VoE voice channel to the audio track
+  static_cast<webrtc::AudioTrackInterface*>(local_audio_track.get())->
+      GetRenderer()->AddChannel(ch);
+
   ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get());
   ASSERT_TRUE(network.valid());
   scoped_ptr<WebRTCTransportImpl> transport(
@@ -840,23 +864,23 @@
   int err = base->Init(webrtc_audio_device.get());
   ASSERT_EQ(0, err);
 
-  EXPECT_TRUE(InitializeCapturer(webrtc_audio_device.get()));
+  int ch = base->CreateChannel();
+  EXPECT_NE(-1, ch);
+
+  EXPECT_TRUE(CreateAndInitializeCapturer(webrtc_audio_device.get()));
+  base::WaitableEvent event(false, false);
+  scoped_ptr<MockWebRtcAudioCapturerSink> sink(
+      new MockWebRtcAudioCapturerSink(&event));
+
   // Create and start a local audio track. Starting the audio track will connect
   // the audio track to the capturer and also start the source of the capturer.
   scoped_refptr<WebRtcLocalAudioTrack> local_audio_track(
-      WebRtcLocalAudioTrack::Create(std::string(),
-                                    webrtc_audio_device->capturer(),
-                                    NULL));
-  local_audio_track->Start();
+      CreateAndStartLocalAudioTrack(
+          webrtc_audio_device->GetDefaultCapturer().get(), sink.get()));
 
-  base::WaitableEvent event(false, false);
-  scoped_ptr<MockWebRtcAudioCapturerSink> capturer_sink(
-      new MockWebRtcAudioCapturerSink(&event));
-  WebRtcAudioCapturer* capturer = webrtc_audio_device->capturer().get();
-  capturer->AddSink(capturer_sink.get());
-
-  int ch = base->CreateChannel();
-  EXPECT_NE(-1, ch);
+  // connect the VoE voice channel to the audio track.
+  static_cast<webrtc::AudioTrackInterface*>(local_audio_track.get())->
+      GetRenderer()->AddChannel(ch);
 
   base::Time start_time = base::Time::Now();
   EXPECT_EQ(0, base->StartSend(ch));
@@ -865,7 +889,7 @@
   int delay = (base::Time::Now() - start_time).InMilliseconds();
   PrintPerfResultMs("webrtc_recording_setup_c", "t", delay);
 
-  capturer->RemoveSink(capturer_sink.get());
+  local_audio_track->RemoveSink(sink.get());
   local_audio_track->Stop();
   EXPECT_EQ(0, base->StopSend(ch));
   EXPECT_EQ(0, base->DeleteChannel(ch));
diff --git a/content/renderer/media/webrtc_local_audio_renderer.cc b/content/renderer/media/webrtc_local_audio_renderer.cc
index c5ca67b..11c125f 100644
--- a/content/renderer/media/webrtc_local_audio_renderer.cc
+++ b/content/renderer/media/webrtc_local_audio_renderer.cc
@@ -51,16 +51,19 @@
 }
 
 // content::WebRtcAudioCapturerSink implementation
-void WebRtcLocalAudioRenderer::CaptureData(const int16* audio_data,
+int WebRtcLocalAudioRenderer::CaptureData(const std::vector<int>& channels,
+                                           const int16* audio_data,
+                                           int sample_rate,
                                            int number_of_channels,
                                            int number_of_frames,
                                            int audio_delay_milliseconds,
-                                           double volume) {
+                                           int current_volume,
+                                           bool need_audio_processing) {
   TRACE_EVENT0("audio", "WebRtcLocalAudioRenderer::CaptureData");
   base::AutoLock auto_lock(thread_lock_);
 
   if (!playing_)
-    return;
+    return 0;
 
   // Push captured audio to FIFO so it can be read by a local sink.
   if (loopback_fifo_) {
@@ -80,6 +83,8 @@
       DVLOG(1) << "FIFO is full";
     }
   }
+
+  return 0;
 }
 
 void WebRtcLocalAudioRenderer::SetCaptureFormat(
diff --git a/content/renderer/media/webrtc_local_audio_renderer.h b/content/renderer/media/webrtc_local_audio_renderer.h
index c62fef1..2930393 100644
--- a/content/renderer/media/webrtc_local_audio_renderer.h
+++ b/content/renderer/media/webrtc_local_audio_renderer.h
@@ -5,6 +5,8 @@
 #ifndef CONTENT_RENDERER_MEDIA_WEBRTC_LOCAL_AUDIO_RENDERER_H_
 #define CONTENT_RENDERER_MEDIA_WEBRTC_LOCAL_AUDIO_RENDERER_H_
 
+#include <vector>
+
 #include "base/callback.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/lock.h"
@@ -69,11 +71,14 @@
   // WebRtcAudioCapturerSink implementation.
 
   // Called on the AudioInputDevice worker thread.
-  virtual void CaptureData(const int16* audio_data,
-                           int number_of_channels,
-                           int number_of_frames,
-                           int audio_delay_milliseconds,
-                           double volume) OVERRIDE;
+  virtual int CaptureData(const std::vector<int>& channels,
+                          const int16* audio_data,
+                          int sample_rate,
+                          int number_of_channels,
+                          int number_of_frames,
+                          int audio_delay_milliseconds,
+                          int current_volume,
+                          bool need_audio_processing) OVERRIDE;
 
   // Can be called on different user thread.
   virtual void SetCaptureFormat(const media::AudioParameters& params) OVERRIDE;
diff --git a/content/renderer/media/webrtc_local_audio_track.cc b/content/renderer/media/webrtc_local_audio_track.cc
index fc89468..de86a3c 100644
--- a/content/renderer/media/webrtc_local_audio_track.cc
+++ b/content/renderer/media/webrtc_local_audio_track.cc
@@ -28,27 +28,29 @@
     webrtc::AudioSourceInterface* track_source)
     : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(label),
       capturer_(capturer),
-      track_source_(track_source) {
+      track_source_(track_source),
+      need_audio_processing_(!capturer->device_id().empty()) {
+  // The capturer with a valid device id is using microphone as source,
+  // and APM (AudioProcessingModule) is turned on only for microphone data.
   DCHECK(capturer.get());
   DVLOG(1) << "WebRtcLocalAudioTrack::WebRtcLocalAudioTrack()";
 }
 
 WebRtcLocalAudioTrack::~WebRtcLocalAudioTrack() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(sinks_.empty());
   DVLOG(1) << "WebRtcLocalAudioTrack::~WebRtcLocalAudioTrack()";
-
   // Users might not call Stop() on the track.
-  if (capturer_.get())
-    Stop();
+  Stop();
 }
 
-// Content::WebRtcAudioCapturerSink implementation.
 void WebRtcLocalAudioTrack::CaptureData(const int16* audio_data,
                                         int number_of_channels,
                                         int number_of_frames,
                                         int audio_delay_milliseconds,
-                                        double volume) {
+                                        int volume) {
+  scoped_refptr<WebRtcAudioCapturer> capturer;
+  std::vector<int> voe_channels;
+  int sample_rate = 0;
   SinkList sinks;
   {
     base::AutoLock auto_lock(lock_);
@@ -58,15 +60,20 @@
     if (!enabled())
       return;
 
+    capturer = capturer_;
+    voe_channels = voe_channels_;
+    sample_rate = params_.sample_rate(),
     sinks = sinks_;
   }
 
   // Feed the data to the sinks.
-  for (SinkList::const_iterator it = sinks.begin();
-       it != sinks.end();
-       ++it) {
-    (*it)->CaptureData(audio_data, number_of_channels, number_of_frames,
-                       audio_delay_milliseconds, volume);
+  for (SinkList::const_iterator it = sinks.begin(); it != sinks.end(); ++it) {
+    int new_volume = (*it)->CaptureData(voe_channels, audio_data, sample_rate,
+                                        number_of_channels, number_of_frames,
+                                        audio_delay_milliseconds, volume,
+                                        need_audio_processing_);
+    if (new_volume != 0 && capturer.get())
+      capturer->SetVolume(new_volume);
   }
 }
 
@@ -81,11 +88,39 @@
     (*it)->SetCaptureFormat(params);
 }
 
+void WebRtcLocalAudioTrack::AddChannel(int channel_id) {
+  DVLOG(1) << "WebRtcLocalAudioTrack::AddChannel(channel_id="
+           << channel_id << ")";
+  base::AutoLock auto_lock(lock_);
+  if (std::find(voe_channels_.begin(), voe_channels_.end(), channel_id) !=
+      voe_channels_.end()) {
+    // We need to handle the case when the same channel is connected to the
+    // track more than once.
+    return;
+  }
+
+  voe_channels_.push_back(channel_id);
+}
+
+void WebRtcLocalAudioTrack::RemoveChannel(int channel_id) {
+  DVLOG(1) << "WebRtcLocalAudioTrack::RemoveChannel(channel_id="
+           << channel_id << ")";
+  base::AutoLock auto_lock(lock_);
+  std::vector<int>::iterator iter =
+      std::find(voe_channels_.begin(), voe_channels_.end(), channel_id);
+  DCHECK(iter != voe_channels_.end());
+  voe_channels_.erase(iter);
+}
+
 // webrtc::AudioTrackInterface implementation.
 webrtc::AudioSourceInterface* WebRtcLocalAudioTrack::GetSource() const {
   return track_source_;
 }
 
+cricket::AudioRenderer* WebRtcLocalAudioTrack::GetRenderer() {
+  return this;
+}
+
 std::string WebRtcLocalAudioTrack::kind() const {
   return kAudioTrackKind;
 }
@@ -113,7 +148,6 @@
   DVLOG(1) << "WebRtcLocalAudioTrack::RemoveSink()";
 
   base::AutoLock auto_lock(lock_);
-
   // Get iterator to the first element for which WrapsSink(sink) returns true.
   SinkList::iterator it = std::find_if(
       sinks_.begin(), sinks_.end(),
@@ -131,16 +165,28 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   DVLOG(1) << "WebRtcLocalAudioTrack::Start()";
   if (capturer_.get())
-    capturer_->AddSink(this);
+    capturer_->AddTrack(this);
 }
 
 void WebRtcLocalAudioTrack::Stop() {
   DCHECK(thread_checker_.CalledOnValidThread());
   DVLOG(1) << "WebRtcLocalAudioTrack::Stop()";
-  if (capturer_.get()) {
-    capturer_->RemoveSink(this);
+  if (!capturer_.get())
+    return;
+
+  capturer_->RemoveTrack(this);
+
+  // Protect the pointers using the lock when accessing |sinks_| and
+  // setting the |capturer_| to NULL.
+  SinkList sinks;
+  {
+    base::AutoLock auto_lock(lock_);
+    sinks = sinks_;
     capturer_ = NULL;
   }
+
+  for (SinkList::const_iterator it = sinks.begin(); it != sinks.end(); ++it)
+    (*it)->Reset();
 }
 
 }  // namespace content
diff --git a/content/renderer/media/webrtc_local_audio_track.h b/content/renderer/media/webrtc_local_audio_track.h
index 5881d8a..7cb8c85 100644
--- a/content/renderer/media/webrtc_local_audio_track.h
+++ b/content/renderer/media/webrtc_local_audio_track.h
@@ -13,6 +13,7 @@
 #include "content/renderer/media/webrtc_audio_device_impl.h"
 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
 #include "third_party/libjingle/source/talk/app/webrtc/mediastreamtrack.h"
+#include "third_party/libjingle/source/talk/media/base/audiorenderer.h"
 
 namespace cricket {
 class AudioRenderer;
@@ -29,7 +30,7 @@
 // WebRtcAudioCapturer to get the captured data, and forward the data to
 // its |sinks_|. The data flow can be stopped by disabling the audio track.
 class CONTENT_EXPORT WebRtcLocalAudioTrack
-    : NON_EXPORTED_BASE(public WebRtcAudioCapturerSink),
+    : NON_EXPORTED_BASE(public cricket::AudioRenderer),
       NON_EXPORTED_BASE(
           public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>) {
  public:
@@ -55,28 +56,34 @@
   // should be called only once when audio track going away.
   void Stop();
 
+  // Method called by the capturer to deliever the capture data.
+  void CaptureData(const int16* audio_data,
+                   int number_of_channels,
+                   int number_of_frames,
+                   int audio_delay_milliseconds,
+                   int volume);
+
+  // Method called by the capturer to set the audio parameters used by source
+  // of the capture data..
+  // Can be called on different user threads.
+  void SetCaptureFormat(const media::AudioParameters& params);
+
  protected:
   WebRtcLocalAudioTrack(const std::string& label,
                         const scoped_refptr<WebRtcAudioCapturer>& capturer,
-                        webrtc::AudioSourceInterface* stream_source);
+                        webrtc::AudioSourceInterface* track_source);
   virtual ~WebRtcLocalAudioTrack();
 
  private:
   typedef std::list<scoped_refptr<WebRtcAudioCapturerSinkOwner> > SinkList;
 
-  // content::WebRtcAudioCapturerSink implementation.
-  // Called on the AudioInputDevice worker thread.
-  virtual void CaptureData(const int16* audio_data,
-                           int number_of_channels,
-                           int number_of_frames,
-                           int audio_delay_milliseconds,
-                           double volume) OVERRIDE;
-
-  // Can be called on different user threads.
-  virtual void SetCaptureFormat(const media::AudioParameters& params) OVERRIDE;
+  // cricket::AudioCapturer implementation.
+  virtual void AddChannel(int channel_id) OVERRIDE;
+  virtual void RemoveChannel(int channel_id) OVERRIDE;
 
   // webrtc::AudioTrackInterface implementation.
   virtual webrtc::AudioSourceInterface* GetSource() const OVERRIDE;
+  virtual cricket::AudioRenderer* GetRenderer() OVERRIDE;
 
   // webrtc::MediaStreamTrack implementation.
   virtual std::string kind() const OVERRIDE;
@@ -101,6 +108,11 @@
   // Protects |params_| and |sinks_|.
   mutable base::Lock lock_;
 
+  // A vector of WebRtc VoE channels that the capturer sends datat to.
+  std::vector<int> voe_channels_;
+
+  bool need_audio_processing_;
+
   DISALLOW_COPY_AND_ASSIGN(WebRtcLocalAudioTrack);
 };
 
diff --git a/content/renderer/media/webrtc_local_audio_track_unittest.cc b/content/renderer/media/webrtc_local_audio_track_unittest.cc
index 1638feb..4720e45 100644
--- a/content/renderer/media/webrtc_local_audio_track_unittest.cc
+++ b/content/renderer/media/webrtc_local_audio_track_unittest.cc
@@ -11,6 +11,7 @@
 #include "media/base/audio_capturer_source.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
 
 using ::testing::_;
 using ::testing::AnyNumber;
@@ -95,11 +96,27 @@
  public:
   MockWebRtcAudioCapturerSink() {}
   ~MockWebRtcAudioCapturerSink() {}
-  MOCK_METHOD5(CaptureData, void(const int16* audio_data,
+  int CaptureData(const std::vector<int>& channels,
+                  const int16* audio_data,
+                  int sample_rate,
+                  int number_of_channels,
+                  int number_of_frames,
+                  int audio_delay_milliseconds,
+                  int current_volume,
+                  bool need_audio_processing) OVERRIDE {
+    CaptureData(channels.size(), sample_rate, number_of_channels,
+                number_of_frames, audio_delay_milliseconds, current_volume,
+                need_audio_processing);
+    return 0;
+  }
+  MOCK_METHOD7(CaptureData, void(int number_of_network_channels,
+                                 int sample_rate,
                                  int number_of_channels,
                                  int number_of_frames,
                                  int audio_delay_milliseconds,
-                                 double volume));
+                                 int current_volume,
+                                 bool need_audio_processing));
+
   MOCK_METHOD1(SetCaptureFormat, void(const media::AudioParameters& params));
 };
 
@@ -118,6 +135,8 @@
 
     EXPECT_CALL(*capturer_source_.get(), SetAutomaticGainControl(false))
         .WillOnce(Return());
+
+    // Start the audio thread used by the |capturer_source_|.
     audio_thread_.reset(new FakeAudioThread(capturer_));
     audio_thread_->Start();
   }
@@ -142,13 +161,21 @@
       WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL);
   track->Start();
   EXPECT_TRUE(track->enabled());
+
+  // Connect a number of network channels to the audio track.
+  static const int kNumberOfNetworkChannels = 4;
+  for (int i = 0; i < kNumberOfNetworkChannels; ++i) {
+    static_cast<webrtc::AudioTrackInterface*>(track.get())->
+        GetRenderer()->AddChannel(i);
+  }
   scoped_ptr<MockWebRtcAudioCapturerSink> sink(
       new MockWebRtcAudioCapturerSink());
   const media::AudioParameters params = capturer_->audio_parameters();
   base::WaitableEvent event(false, false);
   EXPECT_CALL(*sink, SetCaptureFormat(_)).WillOnce(Return());
   EXPECT_CALL(*sink, CaptureData(
-      _, params.channels(), params.frames_per_buffer(), 0, 0))
+      kNumberOfNetworkChannels, params.sample_rate(), params.channels(),
+      params.frames_per_buffer(), 0, 0, false))
       .Times(AtLeast(1)).WillRepeatedly(SignalEvent(&event));
   track->AddSink(sink.get());
 
@@ -171,6 +198,8 @@
   scoped_refptr<WebRtcLocalAudioTrack> track =
     WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL);
   track->Start();
+  static_cast<webrtc::AudioTrackInterface*>(track.get())->
+      GetRenderer()->AddChannel(0);
   EXPECT_TRUE(track->enabled());
   EXPECT_TRUE(track->set_enabled(false));
   scoped_ptr<MockWebRtcAudioCapturerSink> sink(
@@ -179,14 +208,16 @@
   base::WaitableEvent event(false, false);
   EXPECT_CALL(*sink, SetCaptureFormat(_)).WillOnce(Return());
   EXPECT_CALL(*sink, CaptureData(
-      _, params.channels(), params.frames_per_buffer(), 0, 0))
+      1, params.sample_rate(), params.channels(),
+      params.frames_per_buffer(), 0, 0, false))
       .Times(0);
   track->AddSink(sink.get());
   EXPECT_FALSE(event.TimedWait(TestTimeouts::tiny_timeout()));
 
   event.Reset();
   EXPECT_CALL(*sink, CaptureData(
-      _, params.channels(), params.frames_per_buffer(), 0, 0))
+      1, params.sample_rate(), params.channels(),
+      params.frames_per_buffer(), 0, 0, false))
       .Times(AtLeast(1)).WillRepeatedly(SignalEvent(&event));
   EXPECT_TRUE(track->set_enabled(true));
   EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout()));
@@ -204,6 +235,8 @@
   scoped_refptr<WebRtcLocalAudioTrack> track_1 =
     WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL);
   track_1->Start();
+  static_cast<webrtc::AudioTrackInterface*>(track_1.get())->
+      GetRenderer()->AddChannel(0);
   EXPECT_TRUE(track_1->enabled());
   scoped_ptr<MockWebRtcAudioCapturerSink> sink_1(
       new MockWebRtcAudioCapturerSink());
@@ -211,7 +244,8 @@
   base::WaitableEvent event_1(false, false);
   EXPECT_CALL(*sink_1, SetCaptureFormat(_)).WillOnce(Return());
   EXPECT_CALL(*sink_1, CaptureData(
-      _, params.channels(), params.frames_per_buffer(), 0, 0))
+      1, params.sample_rate(), params.channels(),
+      params.frames_per_buffer(), 0, 0, false))
       .Times(AtLeast(1)).WillRepeatedly(SignalEvent(&event_1));
   track_1->AddSink(sink_1.get());
   EXPECT_TRUE(event_1.TimedWait(TestTimeouts::tiny_timeout()));
@@ -219,6 +253,8 @@
   scoped_refptr<WebRtcLocalAudioTrack> track_2 =
     WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL);
   track_2->Start();
+  static_cast<webrtc::AudioTrackInterface*>(track_2.get())->
+      GetRenderer()->AddChannel(1);
   EXPECT_TRUE(track_2->enabled());
 
   // Verify both |sink_1| and |sink_2| get data.
@@ -229,10 +265,12 @@
         new MockWebRtcAudioCapturerSink());
   EXPECT_CALL(*sink_2, SetCaptureFormat(_)).WillOnce(Return());
   EXPECT_CALL(*sink_1, CaptureData(
-      _, params.channels(), params.frames_per_buffer(), 0, 0))
+      1, params.sample_rate(), params.channels(),
+      params.frames_per_buffer(), 0, 0, false))
       .Times(AtLeast(1)).WillRepeatedly(SignalEvent(&event_1));
   EXPECT_CALL(*sink_2, CaptureData(
-      _, params.channels(), params.frames_per_buffer(), 0, 0))
+      1, params.sample_rate(), params.channels(),
+      params.frames_per_buffer(), 0, 0, false))
       .Times(AtLeast(1)).WillRepeatedly(SignalEvent(&event_2));
   track_2->AddSink(sink_2.get());
   EXPECT_TRUE(event_1.TimedWait(TestTimeouts::tiny_timeout()));
@@ -260,55 +298,63 @@
   // When the track goes away, it will automatically stop the
   // |capturer_source_|.
   EXPECT_CALL(*capturer_source_.get(), Stop());
+  track->Stop();
   track = NULL;
 }
 
 // Start/Stop tracks and verify the capturer is correctly starting/stopping
 // its source.
 TEST_F(WebRtcLocalAudioTrackTest, StartAndStopAudioTracks) {
-  // SetDefaultSink() should not trigger the Start() on |capturer_source_|.
-  base::WaitableEvent event(false, false);
-  scoped_ptr<MockWebRtcAudioCapturerSink> default_sink(
-      new MockWebRtcAudioCapturerSink());
-  EXPECT_CALL(*default_sink, SetCaptureFormat(_)).WillOnce(Return());
-  EXPECT_CALL(*default_sink, CaptureData(_, _, _, 0, 0))
-      .Times(AnyNumber()).WillRepeatedly(Return());
-  capturer_->SetDefaultSink(default_sink.get());
-  EXPECT_CALL(*capturer_source_.get(), Start()).Times(0);
-  EXPECT_FALSE(event.TimedWait(TestTimeouts::tiny_timeout()));
-
   // Starting the first audio track will start the |capturer_source_|.
-  event.Reset();
+  base::WaitableEvent event(false, false);
   EXPECT_CALL(*capturer_source_.get(), Start()).WillOnce(SignalEvent(&event));
   scoped_refptr<WebRtcLocalAudioTrack> track_1 =
       WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL);
+  static_cast<webrtc::AudioTrackInterface*>(track_1.get())->
+      GetRenderer()->AddChannel(0);
   track_1->Start();
   EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout()));
 
+  // Verify the data flow by connecting the sink to |track_1|.
+  scoped_ptr<MockWebRtcAudioCapturerSink> sink(
+      new MockWebRtcAudioCapturerSink());
+  event.Reset();
+  EXPECT_CALL(*sink, CaptureData(_, _, _, _, 0, 0, false))
+      .Times(AnyNumber()).WillRepeatedly(Return());
+  EXPECT_CALL(*sink, SetCaptureFormat(_)).Times(1);
+  track_1->AddSink(sink.get());
+
   // Start the second audio track will not start the |capturer_source_|
   // since it has been started.
   EXPECT_CALL(*capturer_source_.get(), Start()).Times(0);
   scoped_refptr<WebRtcLocalAudioTrack> track_2 =
       WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL);
   track_2->Start();
+  static_cast<webrtc::AudioTrackInterface*>(track_2.get())->
+      GetRenderer()->AddChannel(1);
 
   // Stop the first audio track will not stop the |capturer_source_|.
   EXPECT_CALL(*capturer_source_.get(), Stop()).Times(0);
+  track_1->RemoveSink(sink.get());
   track_1->Stop();
   track_1 = NULL;
 
+  EXPECT_CALL(*sink, CaptureData(_, _, _, _, 0, 0, false))
+      .Times(AnyNumber()).WillRepeatedly(Return());
+  EXPECT_CALL(*sink, SetCaptureFormat(_)).Times(1);
+  track_2->AddSink(sink.get());
+
   // Stop the last audio track will stop the |capturer_source_|.
   event.Reset();
   EXPECT_CALL(*capturer_source_.get(), Stop())
       .Times(1).WillOnce(SignalEvent(&event));
   track_2->Stop();
+  track_2->RemoveSink(sink.get());
   track_2 = NULL;
   EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout()));
-
-  capturer_->SetDefaultSink(NULL);
 }
 
-// Set new source to the capturer.
+// Set new source to the existing capturer.
 TEST_F(WebRtcLocalAudioTrackTest, SetNewSourceForCapturerAfterStartTrack) {
   // Setup the audio track and start the track.
   EXPECT_CALL(*capturer_source_.get(), Start()).Times(1);
@@ -333,4 +379,80 @@
   track = NULL;
 }
 
+// Create a new capturer with new source, connect it to a new audio track.
+TEST_F(WebRtcLocalAudioTrackTest, ConnectTracksToDifferentCapturers) {
+  // Setup the first audio track and start it.
+  EXPECT_CALL(*capturer_source_.get(), Start()).Times(1);
+  scoped_refptr<WebRtcLocalAudioTrack> track_1 =
+      WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL);
+  track_1->Start();
+
+  // Connect a number of network channels to the |track_1|.
+  static const int kNumberOfNetworkChannelsForTrack1 = 2;
+  for (int i = 0; i < kNumberOfNetworkChannelsForTrack1; ++i) {
+    static_cast<webrtc::AudioTrackInterface*>(track_1.get())->
+        GetRenderer()->AddChannel(i);
+  }
+  // Verify the data flow by connecting the |sink_1| to |track_1|.
+  scoped_ptr<MockWebRtcAudioCapturerSink> sink_1(
+      new MockWebRtcAudioCapturerSink());
+  EXPECT_CALL(*sink_1.get(), CaptureData(kNumberOfNetworkChannelsForTrack1,
+                                         48000, 2, _, 0, 0, false))
+      .Times(AnyNumber()).WillRepeatedly(Return());
+  EXPECT_CALL(*sink_1.get(), SetCaptureFormat(_)).Times(1);
+  track_1->AddSink(sink_1.get());
+
+  // Create a new capturer with new source with different audio format.
+  scoped_refptr<WebRtcAudioCapturer> new_capturer(
+      WebRtcAudioCapturer::CreateCapturer());
+  scoped_refptr<MockCapturerSource> new_source(new MockCapturerSource());
+  EXPECT_CALL(*new_source.get(), Initialize(_, new_capturer.get(), 0))
+      .WillOnce(Return());
+  EXPECT_CALL(*new_source.get(), SetAutomaticGainControl(false))
+      .WillOnce(Return());
+  new_capturer->SetCapturerSource(new_source,
+                                  media::CHANNEL_LAYOUT_MONO,
+                                  44100);
+
+  // Start the audio thread used by the new source.
+  scoped_ptr<FakeAudioThread> audio_thread(new FakeAudioThread(new_capturer));
+  audio_thread->Start();
+
+  // Setup the second audio track, connect it to the new capturer and start it.
+  EXPECT_CALL(*new_source.get(), Start()).Times(1);
+  scoped_refptr<WebRtcLocalAudioTrack> track_2 =
+      WebRtcLocalAudioTrack::Create(std::string(), new_capturer, NULL);
+  track_2->Start();
+
+  // Connect a number of network channels to the |track_2|.
+  static const int kNumberOfNetworkChannelsForTrack2 = 3;
+  for (int i = 0; i < kNumberOfNetworkChannelsForTrack2; ++i) {
+    static_cast<webrtc::AudioTrackInterface*>(track_2.get())->
+        GetRenderer()->AddChannel(i);
+  }
+  // Verify the data flow by connecting the |sink_2| to |track_2|.
+  scoped_ptr<MockWebRtcAudioCapturerSink> sink_2(
+      new MockWebRtcAudioCapturerSink());
+  EXPECT_CALL(*sink_2, CaptureData(kNumberOfNetworkChannelsForTrack2,
+                                     44100, 1, _, 0, 0, false))
+      .Times(AnyNumber()).WillRepeatedly(Return());
+  EXPECT_CALL(*sink_2, SetCaptureFormat(_)).Times(1);
+  track_2->AddSink(sink_2.get());
+
+  // Stop the second audio track will stop the new source.
+  base::WaitableEvent event(false, false);
+  EXPECT_CALL(*new_source.get(), Stop()).Times(1).WillOnce(SignalEvent(&event));
+  track_2->Stop();
+  track_2->RemoveSink(sink_2.get());
+  track_2 = NULL;
+  EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout()));
+  audio_thread->Stop();
+  audio_thread.reset();
+
+  // Stop the first audio track.
+  EXPECT_CALL(*capturer_source_.get(), Stop());
+  track_1->Stop();
+  track_1 = NULL;
+}
+
 }  // namespace content
diff --git a/content/renderer/plugin_channel_host.cc b/content/renderer/npapi/plugin_channel_host.cc
similarity index 98%
rename from content/renderer/plugin_channel_host.cc
rename to content/renderer/npapi/plugin_channel_host.cc
index b3005bb..c276d33 100644
--- a/content/renderer/plugin_channel_host.cc
+++ b/content/renderer/npapi/plugin_channel_host.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/plugin_channel_host.h"
+#include "content/renderer/npapi/plugin_channel_host.h"
 
 #include "base/metrics/histogram.h"
 #include "base/time/time.h"
diff --git a/content/renderer/plugin_channel_host.h b/content/renderer/npapi/plugin_channel_host.h
similarity index 92%
rename from content/renderer/plugin_channel_host.h
rename to content/renderer/npapi/plugin_channel_host.h
index 2cc901c..6e61346 100644
--- a/content/renderer/plugin_channel_host.h
+++ b/content/renderer/npapi/plugin_channel_host.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_RENDERER_PLUGIN_CHANNEL_HOST_H_
-#define CONTENT_RENDERER_PLUGIN_CHANNEL_HOST_H_
+#ifndef CONTENT_RENDERER_NPAPI_PLUGIN_CHANNEL_HOST_H_
+#define CONTENT_RENDERER_NPAPI_PLUGIN_CHANNEL_HOST_H_
 
 #include "base/containers/hash_tables.h"
 #include "content/child/npapi/np_channel_base.h"
@@ -72,4 +72,4 @@
 
 }  // namespace content
 
-#endif  // CONTENT_RENDERER_PLUGIN_CHANNEL_HOST_H_
+#endif  // CONTENT_RENDERER_NPAPI_PLUGIN_CHANNEL_HOST_H_
diff --git a/content/renderer/webplugin_delegate_proxy.cc b/content/renderer/npapi/webplugin_delegate_proxy.cc
similarity index 99%
rename from content/renderer/webplugin_delegate_proxy.cc
rename to content/renderer/npapi/webplugin_delegate_proxy.cc
index 7ed03fc..f1da1d8 100644
--- a/content/renderer/webplugin_delegate_proxy.cc
+++ b/content/renderer/npapi/webplugin_delegate_proxy.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/webplugin_delegate_proxy.h"
+#include "content/renderer/npapi/webplugin_delegate_proxy.h"
 
 #if defined(TOOLKIT_GTK)
 #include <gtk/gtk.h>
@@ -32,7 +32,7 @@
 #include "content/child/plugin_messages.h"
 #include "content/common/view_messages.h"
 #include "content/public/renderer/content_renderer_client.h"
-#include "content/renderer/plugin_channel_host.h"
+#include "content/renderer/npapi/plugin_channel_host.h"
 #include "content/renderer/render_thread_impl.h"
 #include "content/renderer/render_view_impl.h"
 #include "ipc/ipc_channel_handle.h"
diff --git a/content/renderer/webplugin_delegate_proxy.h b/content/renderer/npapi/webplugin_delegate_proxy.h
similarity index 98%
rename from content/renderer/webplugin_delegate_proxy.h
rename to content/renderer/npapi/webplugin_delegate_proxy.h
index 46bf027..7c7b0ae 100644
--- a/content/renderer/webplugin_delegate_proxy.h
+++ b/content/renderer/npapi/webplugin_delegate_proxy.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_RENDERER_WEBPLUGIN_DELEGATE_PROXY_H_
-#define CONTENT_RENDERER_WEBPLUGIN_DELEGATE_PROXY_H_
+#ifndef CONTENT_RENDERER_NPAPI_WEBPLUGIN_DELEGATE_PROXY_H_
+#define CONTENT_RENDERER_NPAPI_WEBPLUGIN_DELEGATE_PROXY_H_
 
 #include <string>
 #include <vector>
@@ -296,4 +296,4 @@
 
 }  // namespace content
 
-#endif  // CONTENT_RENDERER_WEBPLUGIN_DELEGATE_PROXY_H_
+#endif  // CONTENT_RENDERER_NPAPI_WEBPLUGIN_DELEGATE_PROXY_H_
diff --git a/content/renderer/webplugin_impl.cc b/content/renderer/npapi/webplugin_impl.cc
similarity index 99%
rename from content/renderer/webplugin_impl.cc
rename to content/renderer/npapi/webplugin_impl.cc
index 9c9b0b0..ae71c44 100644
--- a/content/renderer/webplugin_impl.cc
+++ b/content/renderer/npapi/webplugin_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/webplugin_impl.h"
+#include "content/renderer/npapi/webplugin_impl.h"
 
 #include "base/bind.h"
 #include "base/debug/crash_logging.h"
@@ -18,9 +18,9 @@
 #include "content/child/npapi/webplugin_delegate_impl.h"
 #include "content/common/view_messages.h"
 #include "content/public/renderer/content_renderer_client.h"
+#include "content/renderer/npapi/webplugin_delegate_proxy.h"
 #include "content/renderer/render_process.h"
 #include "content/renderer/render_view_impl.h"
-#include "content/renderer/webplugin_delegate_proxy.h"
 #include "net/base/escape.h"
 #include "net/base/net_errors.h"
 #include "net/http/http_response_headers.h"
diff --git a/content/renderer/webplugin_impl.h b/content/renderer/npapi/webplugin_impl.h
similarity index 98%
rename from content/renderer/webplugin_impl.h
rename to content/renderer/npapi/webplugin_impl.h
index aa66169..63f85fb 100644
--- a/content/renderer/webplugin_impl.h
+++ b/content/renderer/npapi/webplugin_impl.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_RENDERER_WEBPLUGIN_IMPL_H_
-#define CONTENT_RENDERER_WEBPLUGIN_IMPL_H_
+#ifndef CONTENT_RENDERER_NPAPI_WEBPLUGIN_IMPL_H_
+#define CONTENT_RENDERER_NPAPI_WEBPLUGIN_IMPL_H_
 
 #include <map>
 #include <string>
@@ -339,4 +339,4 @@
 
 }  // namespace content
 
-#endif  // CONTENT_RENDERER_WEBPLUGIN_IMPL_H_
+#endif  // CONTENT_RENDERER_NPAPI_WEBPLUGIN_IMPL_H_
diff --git a/content/renderer/webplugin_impl_unittest.cc b/content/renderer/npapi/webplugin_impl_unittest.cc
similarity index 99%
rename from content/renderer/webplugin_impl_unittest.cc
rename to content/renderer/npapi/webplugin_impl_unittest.cc
index 98d0f7b..df1371c 100644
--- a/content/renderer/webplugin_impl_unittest.cc
+++ b/content/renderer/npapi/webplugin_impl_unittest.cc
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/strings/string_util.h"
-#include "content/renderer/webplugin_impl.h"
+#include "content/renderer/npapi/webplugin_impl.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/WebKit/public/platform/WebCString.h"
 #include "third_party/WebKit/public/platform/WebString.h"
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index c90f888..fdc0df6 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -26,7 +26,6 @@
 #include "content/renderer/render_thread_impl.h"
 #include "content/renderer/render_view_impl.h"
 #include "content/renderer/renderer_webapplicationcachehost_impl.h"
-#include "content/renderer/webplugin_impl.h"
 #include "content/renderer/websharedworker_proxy.h"
 #include "net/base/net_errors.h"
 #include "net/http/http_util.h"
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index e341e5d..fd86944 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -40,7 +40,7 @@
 #include "content/common/child_process_messages.h"
 #include "content/common/content_constants_internal.h"
 #include "content/common/database_messages.h"
-#include "content/common/dom_storage_messages.h"
+#include "content/common/dom_storage/dom_storage_messages.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
 #include "content/common/gpu/client/gpu_channel_host.h"
 #include "content/common/gpu/gpu_messages.h"
@@ -75,7 +75,6 @@
 #include "content/renderer/media/webrtc_identity_service.h"
 #include "content/renderer/memory_benchmarking_extension.h"
 #include "content/renderer/p2p/socket_dispatcher.h"
-#include "content/renderer/plugin_channel_host.h"
 #include "content/renderer/render_process_impl.h"
 #include "content/renderer/render_process_visibility_manager.h"
 #include "content/renderer/render_view_impl.h"
@@ -131,6 +130,10 @@
 #include "content/renderer/android/synchronous_compositor_factory.h"
 #endif
 
+#if defined(ENABLE_PLUGINS)
+#include "content/renderer/npapi/plugin_channel_host.h"
+#endif
+
 using base::ThreadRestrictions;
 using WebKit::WebDocument;
 using WebKit::WebFrame;
@@ -509,7 +512,9 @@
   bool notify_webkit_of_modal_loop = true;  // default value
   std::swap(notify_webkit_of_modal_loop, notify_webkit_of_modal_loop_);
 
+#if defined(ENABLE_PLUGINS)
   int render_view_id = MSG_ROUTING_NONE;
+#endif
 
   if (pumping_events) {
     if (suspend_webkit_shared_timer)
@@ -517,7 +522,7 @@
 
     if (notify_webkit_of_modal_loop)
       WebView::willEnterModalLoop();
-
+#if defined(ENABLE_PLUGINS)
     RenderViewImpl* render_view =
         RenderViewImpl::FromRoutingID(msg->routing_id());
     if (render_view) {
@@ -525,15 +530,18 @@
       PluginChannelHost::Broadcast(
           new PluginMsg_SignalModalDialogEvent(render_view_id));
     }
+#endif
   }
 
   bool rv = ChildThread::Send(msg);
 
   if (pumping_events) {
+#if defined(ENABLE_PLUGINS)
     if (render_view_id != MSG_ROUTING_NONE) {
       PluginChannelHost::Broadcast(
           new PluginMsg_ResetModalDialogEvent(render_view_id));
     }
+#endif
 
     if (notify_webkit_of_modal_loop)
       WebView::didExitModalLoop();
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 0117924..5299bdd 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -39,6 +39,7 @@
 #include "content/child/webmessageportchannel_impl.h"
 #include "content/common/clipboard_messages.h"
 #include "content/common/database_messages.h"
+#include "content/common/dom_storage/dom_storage_types.h"
 #include "content/common/drag_messages.h"
 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/common/input_messages.h"
@@ -124,8 +125,6 @@
 #include "content/renderer/v8_value_converter_impl.h"
 #include "content/renderer/web_ui_extension.h"
 #include "content/renderer/web_ui_extension_data.h"
-#include "content/renderer/webplugin_delegate_proxy.h"
-#include "content/renderer/webplugin_impl.h"
 #include "content/renderer/websharedworker_proxy.h"
 #include "media/audio/audio_output_device.h"
 #include "media/base/audio_renderer_mixer_input.h"
@@ -206,7 +205,6 @@
 #include "ui/shell_dialogs/selected_file_info.h"
 #include "v8/include/v8.h"
 #include "webkit/child/weburlresponse_extradata_impl.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
 #include "webkit/renderer/appcache/web_application_cache_host_impl.h"
 #include "webkit/renderer/webpreferences_renderer.h"
 
@@ -245,6 +243,8 @@
 #endif
 
 #if defined(ENABLE_PLUGINS)
+#include "content/renderer/npapi/webplugin_delegate_proxy.h"
+#include "content/renderer/npapi/webplugin_impl.h"
 #include "content/renderer/pepper/pepper_browser_connection.h"
 #include "content/renderer/pepper/pepper_plugin_instance_impl.h"
 #include "content/renderer/pepper/pepper_plugin_registry.h"
@@ -842,8 +842,7 @@
       handling_select_range_(false),
       next_snapshot_id_(0),
       allow_partial_swap_(params->allow_partial_swap),
-      context_menu_source_type_(ui::MENU_SOURCE_MOUSE),
-      inflight_console_message_count_(0) {
+      context_menu_source_type_(ui::MENU_SOURCE_MOUSE) {
 }
 
 void RenderViewImpl::Initialize(RenderViewImplParams* params) {
@@ -1008,12 +1007,6 @@
     file_chooser_completions_.pop_front();
   }
 
-  // There may be unsent console log messages, but it is OK.
-  while (!deferred_console_messages_.empty()) {
-    delete deferred_console_messages_.front();
-    deferred_console_messages_.pop_front();
-  }
-
 #if defined(OS_ANDROID)
   // The date/time picker client is both a scoped_ptr member of this class and
   // a RenderViewObserver. Reset it to prevent double deletion.
@@ -1236,8 +1229,6 @@
   return focused_pepper_plugin_->IsPluginAcceptingCompositionEvents();
 }
 
-#endif  // ENABLE_PLUGINS
-
 void RenderViewImpl::PluginCrashed(const base::FilePath& plugin_path,
                                    base::ProcessId plugin_pid) {
   Send(new ViewHostMsg_CrashedPlugin(routing_id_, plugin_path, plugin_pid));
@@ -1276,6 +1267,45 @@
   return found;
 }
 
+void RenderViewImpl::SimulateImeSetComposition(
+    const string16& text,
+    const std::vector<WebKit::WebCompositionUnderline>& underlines,
+    int selection_start,
+    int selection_end) {
+  OnImeSetComposition(text, underlines, selection_start, selection_end);
+}
+
+void RenderViewImpl::SimulateImeConfirmComposition(
+    const string16& text,
+    const ui::Range& replacement_range) {
+  OnImeConfirmComposition(text, replacement_range, false);
+}
+
+#if defined(OS_WIN)
+void RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) {
+  if (focused)
+    focused_plugin_id_ = plugin_id;
+  else
+    focused_plugin_id_ = -1;
+}
+#endif
+
+#if defined(OS_MACOSX)
+void RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) {
+  Send(new ViewHostMsg_PluginFocusChanged(routing_id(), focused, plugin_id));
+}
+
+void RenderViewImpl::StartPluginIme() {
+  IPC::Message* msg = new ViewHostMsg_StartPluginIme(routing_id());
+  // This message can be sent during event-handling, and needs to be delivered
+  // within that context.
+  msg->set_unblock(true);
+  Send(msg);
+}
+#endif  // defined(OS_MACOSX)
+
+#endif  // ENABLE_PLUGINS
+
 void RenderViewImpl::TransferActiveWheelFlingAnimation(
     const WebKit::WebActiveWheelFlingParameters& params) {
   if (webview())
@@ -1419,8 +1449,6 @@
                         OnReleaseDisambiguationPopupDIB)
     IPC_MESSAGE_HANDLER(ViewMsg_WindowSnapshotCompleted,
                         OnWindowSnapshotCompleted)
-    IPC_MESSAGE_HANDLER(ViewMsg_AddMessageToConsole_ACK,
-                        OnConsoleMessageAck)
 
     // Have the super handle all other messages.
     IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message))
@@ -1679,16 +1707,6 @@
   target_url_status_ = TARGET_NONE;
 }
 
-void RenderViewImpl::OnConsoleMessageAck() {
-  if (!deferred_console_messages_.empty()) {
-    Send(deferred_console_messages_.front());
-    deferred_console_messages_.pop_front();
-    return;
-  }
-  --inflight_console_message_count_;
-  DCHECK(inflight_console_message_count_ >= 0);
-}
-
 void RenderViewImpl::OnCopy() {
   if (!webview())
     return;
@@ -2366,15 +2384,13 @@
 }
 
 WebStorageNamespace* RenderViewImpl::createSessionStorageNamespace() {
-  CHECK(session_storage_namespace_id_ !=
-        dom_storage::kInvalidSessionStorageNamespaceId);
+  CHECK(session_storage_namespace_id_ != kInvalidSessionStorageNamespaceId);
   return new WebStorageNamespaceImpl(session_storage_namespace_id_);
 }
 
 void RenderViewImpl::didAddMessageToConsole(
     const WebConsoleMessage& message, const WebString& source_name,
     unsigned source_line) {
-  static const int kMaximumInflightConsoleMessages = 10;
   logging::LogSeverity log_severity = logging::LOG_VERBOSE;
   switch (message.level) {
     case WebConsoleMessage::LevelDebug:
@@ -2393,19 +2409,11 @@
       NOTREACHED();
   }
 
-  IPC::Message* msg = new ViewHostMsg_AddMessageToConsole(
-      routing_id_, static_cast<int32>(log_severity), message.text,
-      static_cast<int32>(source_line), source_name);
-
-  if (RenderThreadImpl::current() &&
-      !RenderThreadImpl::current()->layout_test_mode() &&
-      inflight_console_message_count_ >= kMaximumInflightConsoleMessages) {
-    deferred_console_messages_.push_back(msg);
-    return;
-  }
-
-  Send(msg);
-  ++inflight_console_message_count_;
+  Send(new ViewHostMsg_AddMessageToConsole(routing_id_,
+                                           static_cast<int32>(log_severity),
+                                           message.text,
+                                           static_cast<int32>(source_line),
+                                           source_name));
 }
 
 void RenderViewImpl::printPage(WebFrame* frame) {
@@ -5635,7 +5643,7 @@
   if (webview())
     webview()->setIsActive(active);
 
-#if defined(OS_MACOSX)
+#if defined(ENABLE_PLUGINS) && defined(OS_MACOSX)
   std::set<WebPluginDelegateProxy*>::iterator plugin_it;
   for (plugin_it = plugin_delegates_.begin();
        plugin_it != plugin_delegates_.end(); ++plugin_it) {
@@ -5646,22 +5654,26 @@
 
 #if defined(OS_MACOSX)
 void RenderViewImpl::OnSetWindowVisibility(bool visible) {
+#if defined(ENABLE_PLUGINS)
   // Inform plugins that their container has changed visibility.
   std::set<WebPluginDelegateProxy*>::iterator plugin_it;
   for (plugin_it = plugin_delegates_.begin();
        plugin_it != plugin_delegates_.end(); ++plugin_it) {
     (*plugin_it)->SetContainerVisibility(visible);
   }
+#endif
 }
 
 void RenderViewImpl::OnWindowFrameChanged(const gfx::Rect& window_frame,
                                           const gfx::Rect& view_frame) {
+#if defined(ENABLE_PLUGINS)
   // Inform plugins that their window's frame has changed.
   std::set<WebPluginDelegateProxy*>::iterator plugin_it;
   for (plugin_it = plugin_delegates_.begin();
        plugin_it != plugin_delegates_.end(); ++plugin_it) {
     (*plugin_it)->WindowFrameChanged(window_frame, view_frame);
   }
+#endif
 }
 
 void RenderViewImpl::OnPluginImeCompositionCompleted(const string16& text,
@@ -5765,7 +5777,6 @@
   for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
        i != active_pepper_instances_.end(); ++i)
     (*i)->PageVisibilityChanged(false);
-#endif
 
 #if defined(OS_MACOSX)
   // Inform NPAPI plugins that their container is no longer visible.
@@ -5775,6 +5786,7 @@
     (*plugin_it)->SetContainerVisibility(false);
   }
 #endif  // OS_MACOSX
+#endif // ENABLE_PLUGINS
 }
 
 void RenderViewImpl::OnWasShown(bool needs_repainting) {
@@ -5793,7 +5805,6 @@
   for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
        i != active_pepper_instances_.end(); ++i)
     (*i)->PageVisibilityChanged(true);
-#endif
 
 #if defined(OS_MACOSX)
   // Inform NPAPI plugins that their container is now visible.
@@ -5803,6 +5814,7 @@
     (*plugin_it)->SetContainerVisibility(true);
   }
 #endif  // OS_MACOSX
+#endif  // ENABLE_PLUGINS
 }
 
 GURL RenderViewImpl::GetURLForGraphicsContext3D() {
@@ -5820,6 +5832,7 @@
 void RenderViewImpl::OnSetFocus(bool enable) {
   RenderWidget::OnSetFocus(enable);
 
+#if defined(ENABLE_PLUGINS)
   if (webview() && webview()->isActive()) {
     // Notify all NPAPI plugins.
     std::set<WebPluginDelegateProxy*>::iterator plugin_it;
@@ -5834,7 +5847,6 @@
       (*plugin_it)->SetContentAreaFocus(enable);
     }
   }
-#if defined(ENABLE_PLUGINS)
   // Notify all Pepper plugins.
   for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
        i != active_pepper_instances_.end(); ++i)
@@ -5845,20 +5857,6 @@
     browser_plugin_manager_->UpdateFocusState();
 }
 
-void RenderViewImpl::SimulateImeSetComposition(
-    const string16& text,
-    const std::vector<WebKit::WebCompositionUnderline>& underlines,
-    int selection_start,
-    int selection_end) {
-  OnImeSetComposition(text, underlines, selection_start, selection_end);
-}
-
-void RenderViewImpl::SimulateImeConfirmComposition(
-    const string16& text,
-    const ui::Range& replacement_range) {
-  OnImeConfirmComposition(text, replacement_range, false);
-}
-
 void RenderViewImpl::OnImeSetComposition(
     const string16& text,
     const std::vector<WebKit::WebCompositionUnderline>& underlines,
@@ -5891,7 +5889,6 @@
     }
     return;
   }
-#endif
 
 #if defined(OS_WIN)
   // When a plug-in has focus, we create platform-specific IME data used by
@@ -5917,7 +5914,8 @@
     }
     return;
   }
-#endif
+#endif  // OS_WIN
+#endif  // ENABLE_PLUGINS
   RenderWidget::OnImeSetComposition(text,
                                     underlines,
                                     selection_start,
@@ -5962,7 +5960,6 @@
     pepper_composition_text_.clear();
     return;
   }
-#endif
 #if defined(OS_WIN)
   // Same as OnImeSetComposition(), we send the text from IMEs directly to
   // plug-ins. When we send IME text directly to plug-ins, we should not send
@@ -5976,7 +5973,8 @@
     }
     return;
   }
-#endif
+#endif  // OS_WIN
+#endif  // ENABLE_PLUGINS
   if (replacement_range.IsValid() && webview()) {
     // Select the text in |replacement_range|, it will then be replaced by
     // text added by the call to RenderWidget::OnImeConfirmComposition().
@@ -6129,29 +6127,6 @@
   return allow_partial_swap_;
 }
 
-#if defined(OS_WIN)
-void RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) {
-  if (focused)
-    focused_plugin_id_ = plugin_id;
-  else
-    focused_plugin_id_ = -1;
-}
-#endif
-
-#if defined(OS_MACOSX)
-void RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) {
-  Send(new ViewHostMsg_PluginFocusChanged(routing_id(), focused, plugin_id));
-}
-
-void RenderViewImpl::StartPluginIme() {
-  IPC::Message* msg = new ViewHostMsg_StartPluginIme(routing_id());
-  // This message can be sent during event-handling, and needs to be delivered
-  // within that context.
-  msg->set_unblock(true);
-  Send(msg);
-}
-#endif  // defined(OS_MACOSX)
-
 bool RenderViewImpl::ScheduleFileChooser(
     const FileChooserParams& params,
     WebFileChooserCompletion* completion) {
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 46d9fe8..c57c03a 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -330,7 +330,6 @@
   bool GetPepperCaretBounds(gfx::Rect* rect);
 
   bool IsPepperAcceptingCompositionEvents() const;
-#endif
 
   // Notification that the given plugin has crashed.
   void PluginCrashed(const base::FilePath& plugin_path,
@@ -369,6 +368,8 @@
                      WebPluginInfo* plugin_info,
                      std::string* actual_mime_type);
 
+#endif  // ENABLE_PLUGINS
+
   void TransferActiveWheelFlingAnimation(
       const WebKit::WebActiveWheelFlingParameters& params);
 
@@ -932,7 +933,6 @@
   // The documentation for these functions should be in
   // content/common/*_messages.h for the message that the function is handling.
 
-  void OnConsoleMessageAck();
   void OnCopy();
   void OnCut();
   void OnDelete();
@@ -1565,12 +1565,6 @@
   ui::MenuSourceType context_menu_source_type_;
   gfx::Point touch_editing_context_menu_location_;
 
-  // Console log message throttling. Ensures that the memory bloat from
-  // runaway logging occurs in the renderer, evenutaly crashing it, rather
-  // than in the browser.
-  int inflight_console_message_count_;
-  std::deque<IPC::Message*> deferred_console_messages_;
-
   // ---------------------------------------------------------------------------
   // ADDING NEW DATA? Please see if it fits appropriately in one of the above
   // sections rather than throwing it randomly at the end. If you're adding a
diff --git a/content/renderer/text_input_client_observer.cc b/content/renderer/text_input_client_observer.cc
index ceeb023..1494ebb 100644
--- a/content/renderer/text_input_client_observer.cc
+++ b/content/renderer/text_input_client_observer.cc
@@ -56,18 +56,24 @@
 #endif
   {
     WebKit::WebFrame* frame = webview()->focusedFrame();
-    WebKit::WebRect web_rect;
-    frame->firstRectForCharacterRange(range.start(), range.length(), web_rect);
-    rect = web_rect;
+    if (frame) {
+      WebKit::WebRect web_rect;
+      frame->firstRectForCharacterRange(range.start(), range.length(),
+                                        web_rect);
+      rect = web_rect;
+    }
   }
   Send(new TextInputClientReplyMsg_GotFirstRectForRange(routing_id(), rect));
 }
 
 void TextInputClientObserver::OnStringForRange(ui::Range range) {
 #if defined(OS_MACOSX)
-  NSAttributedString* string =
-      WebKit::WebSubstringUtil::attributedSubstringInRange(
-          webview()->focusedFrame(), range.start(), range.length());
+  NSAttributedString* string = nil;
+  WebKit::WebFrame* frame = webview()->focusedFrame();
+  if (frame) {
+    string = WebKit::WebSubstringUtil::attributedSubstringInRange(
+        frame, range.start(), range.length());
+  }
   scoped_ptr<const mac::AttributedStringCoder::EncodedString> encoded(
       mac::AttributedStringCoder::Encode(string));
   Send(new TextInputClientReplyMsg_GotStringForRange(routing_id(),
diff --git a/webkit/renderer/cpp_binding_example.cc b/content/test/cpp_binding_example.cc
similarity index 92%
rename from webkit/renderer/cpp_binding_example.cc
rename to content/test/cpp_binding_example.cc
index 43b4ede..3c7630d 100644
--- a/webkit/renderer/cpp_binding_example.cc
+++ b/content/test/cpp_binding_example.cc
@@ -1,18 +1,19 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// This file contains the definition for CppBindingExample, which is used in
-// cpp_bound_class_unittest.
-
-#include "cpp_binding_example.h"
+#include "content/test/cpp_binding_example.h"
 
 #include <stdio.h>
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 
-namespace webkit_glue {
+using webkit_glue::CppArgumentList;
+using webkit_glue::CppBoundClass;
+using webkit_glue::CppVariant;
+
+namespace content {
 
 namespace {
 
@@ -32,7 +33,7 @@
   CppVariant value_;
 };
 
-}
+}  // namespace
 
 CppBindingExample::CppBindingExample() {
   // Map properties.  It's recommended, but not required, that the JavaScript
@@ -134,4 +135,4 @@
   printf("Error: unknown JavaScript method invoked.\n");
 }
 
-}  // namespace webkit_glue
+}  // namespace content
diff --git a/webkit/renderer/cpp_binding_example.h b/content/test/cpp_binding_example.h
similarity index 73%
rename from webkit/renderer/cpp_binding_example.h
rename to content/test/cpp_binding_example.h
index ee8568d..f594ae7 100644
--- a/webkit/renderer/cpp_binding_example.h
+++ b/content/test/cpp_binding_example.h
@@ -1,7 +1,10 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#ifndef CONTENT_TEST_CPP_BINDING_EXAMPLE_H_
+#define CONTENT_TEST_CPP_BINDING_EXAMPLE_H_
+
 /*
   CppBindingExample class:
   This provides an example of how to use the CppBoundClass to create methods
@@ -30,14 +33,11 @@
   </script>
 */
 
-#ifndef CPP_BINDING_EXAMPLE_H__
-#define CPP_BINDING_EXAMPLE_H__
-
 #include "webkit/renderer/cpp_bound_class.h"
 
-namespace webkit_glue {
+namespace content {
 
-class CppBindingExample : public CppBoundClass {
+class CppBindingExample : public webkit_glue::CppBoundClass {
  public:
   // The default constructor initializes the property and method lists needed
   // to bind this class to a JS object.
@@ -55,28 +55,32 @@
   //
 
   // Returns the value that was passed in as its first (only) argument.
-  void echoValue(const CppArgumentList& args, CppVariant* result);
+  void echoValue(const webkit_glue::CppArgumentList& args,
+                 webkit_glue::CppVariant* result);
 
   // Returns a hard-coded value of the same type (bool, number (double),
   // string, or null) that was passed in as an argument.
-  void echoType(const CppArgumentList& args, CppVariant* result);
+  void echoType(const webkit_glue::CppArgumentList& args,
+                webkit_glue::CppVariant* result);
 
   // Returns the sum of the (first) two arguments as a double, if they are both
   // numbers (integers or doubles).  Otherwise returns null.
-  void plus(const CppArgumentList& args, CppVariant* result);
+  void plus(const webkit_glue::CppArgumentList& args,
+            webkit_glue::CppVariant* result);
 
   // Always returns the same value -- an example of a read-only property.
-  void same(CppVariant* result);
+  void same(webkit_glue::CppVariant* result);
 
   // Invoked when a nonexistent method is called on this example object, this
   // prints an error message.
-  void fallbackMethod(const CppArgumentList& args, CppVariant* result);
+  void fallbackMethod(const webkit_glue::CppArgumentList& args,
+                      webkit_glue::CppVariant* result);
 
   // These properties will also be exposed to JavaScript.
-  CppVariant my_value;
-  CppVariant my_other_value;
+  webkit_glue::CppVariant my_value;
+  webkit_glue::CppVariant my_other_value;
 };
 
-}  // namespace webkit_glue
+}  // namespace content
 
-#endif  // CPP_BINDING_EXAMPLE_H__
+#endif  // CONTENT_TEST_CPP_BINDING_EXAMPLE_H_
diff --git a/content/test/data/media/peerconnection-call.html b/content/test/data/media/peerconnection-call.html
index 6a9219d..f979006 100644
--- a/content/test/data/media/peerconnection-call.html
+++ b/content/test/data/media/peerconnection-call.html
@@ -234,6 +234,14 @@
     }
   }
 
+  // Test call with a stream that has been created by getUserMedia, clone
+  // the stream to a cloned stream, send them via the same peer connection.
+  function addTwoMediaStreamsToOneConnection() {
+    createConnections(null);
+    navigator.webkitGetUserMedia({audio:true, video:true},
+        CloneStreamAndAddTwoStreamstoOneConnection, printGetUserMediaError);
+  }
+
   function onToneChange(tone) {
     gSentTones += tone.tone;
     document.title = gSentTones;
@@ -281,6 +289,45 @@
     negotiate();
   }
 
+  function verifyHasOneAudioAndVideoTrack(stream) {    
+    expectEquals(1, stream.getAudioTracks().length);
+    expectEquals(1, stream.getVideoTracks().length);
+  }
+
+  // Called if getUserMedia succeeds, then clone the stream, send two streams
+  // from one peer connection.
+  function CloneStreamAndAddTwoStreamstoOneConnection(localStream) {
+    displayAndRemember(localStream);
+    var clonedStream = new webkitMediaStream();
+    clonedStream.addTrack(localStream.getVideoTracks()[0]);
+    clonedStream.addTrack(localStream.getAudioTracks()[0]);
+    gFirstConnection.addStream(localStream);
+    gFirstConnection.addStream(clonedStream);
+
+    // Verify the local streams are correct.
+    expectEquals(2, gFirstConnection.getLocalStreams().length);
+    verifyHasOneAudioAndVideoTrack(gFirstConnection.getLocalStreams()[0]);
+    verifyHasOneAudioAndVideoTrack(gFirstConnection.getLocalStreams()[1]);
+
+    // The remote side should receive two streams. After that, verify the
+    // remote side has the correct number of streams and tracks.
+    addExpectedEvent();
+    addExpectedEvent();
+    gSecondConnection.onaddstream = function(event) {
+      eventOccured();
+    }
+    setAllEventsOccuredHandler(function() {
+      // Negotiation complete, verify remote streams on the receiving side.
+      expectEquals(2, gSecondConnection.getRemoteStreams().length);
+      verifyHasOneAudioAndVideoTrack(gSecondConnection.getRemoteStreams()[0]);
+      verifyHasOneAudioAndVideoTrack(gSecondConnection.getRemoteStreams()[1]);
+
+      document.title = "OK";
+    });
+
+    negotiate();
+  }
+
   // Called if getUserMedia succeeds when we want to send a modified
   // MediaStream. A new MediaStream is created and the video track from
   // |localStream| is added.
@@ -389,7 +436,7 @@
       <!-- Canvases are named after their corresponding video elements. -->
       <td><canvas width="320" height="240" id="remote-view-1-canvas"
           style="display:none"></canvas></td>
-      <td><canvas width="320" height="240" id="remote-view-2-canvas">
+      <td><canvas width="320" height="240" id="remote-view-2-canvas"
           style="display:none"></canvas></td>
     </tr>
   </table>
diff --git a/crypto/nss_util.cc b/crypto/nss_util.cc
index 2fb6cff..069d5b6 100644
--- a/crypto/nss_util.cc
+++ b/crypto/nss_util.cc
@@ -384,23 +384,17 @@
     base::TimeTicks start_time = base::TimeTicks::Now();
     EnsureNSPRInit();
 
-    // We *must* have NSS >= 3.12.3.  See bug 26448.
+    // We *must* have NSS >= 3.14.3.
     COMPILE_ASSERT(
-        (NSS_VMAJOR == 3 && NSS_VMINOR == 12 && NSS_VPATCH >= 3) ||
-        (NSS_VMAJOR == 3 && NSS_VMINOR > 12) ||
+        (NSS_VMAJOR == 3 && NSS_VMINOR == 14 && NSS_VPATCH >= 3) ||
+        (NSS_VMAJOR == 3 && NSS_VMINOR > 14) ||
         (NSS_VMAJOR > 3),
         nss_version_check_failed);
     // Also check the run-time NSS version.
     // NSS_VersionCheck is a >= check, not strict equality.
-    if (!NSS_VersionCheck("3.12.3")) {
-      // It turns out many people have misconfigured NSS setups, where
-      // their run-time NSPR doesn't match the one their NSS was compiled
-      // against.  So rather than aborting, complain loudly.
-      LOG(ERROR) << "NSS_VersionCheck(\"3.12.3\") failed.  "
-                    "We depend on NSS >= 3.12.3, and this error is not fatal "
-                    "only because many people have busted NSS setups (for "
-                    "example, using the wrong version of NSPR). "
-                    "Please upgrade to the latest NSS and NSPR, and if you "
+    if (!NSS_VersionCheck("3.14.3")) {
+      LOG(FATAL) << "NSS_VersionCheck(\"3.14.3\") failed. NSS >= 3.14.3 is "
+                    "required. Please upgrade to the latest NSS, and if you "
                     "still get this error, contact your distribution "
                     "maintainer.";
     }
diff --git a/crypto/signature_creator_nss.cc b/crypto/signature_creator_nss.cc
index 5a9ad2e..bc8dc44 100644
--- a/crypto/signature_creator_nss.cc
+++ b/crypto/signature_creator_nss.cc
@@ -67,11 +67,7 @@
 }
 
 bool SignatureCreator::Update(const uint8* data_part, int data_part_len) {
-  // TODO(wtc): Remove this const_cast when we require NSS 3.12.5.
-  // See NSS bug https://bugzilla.mozilla.org/show_bug.cgi?id=518255
-  SECStatus rv = SGN_Update(sign_context_,
-                            const_cast<unsigned char*>(data_part),
-                            data_part_len);
+  SECStatus rv = SGN_Update(sign_context_, data_part, data_part_len);
   if (rv != SECSuccess) {
     NOTREACHED();
     return false;
diff --git a/extensions/OWNERS b/extensions/OWNERS
index 16f17f1..a6cd87d 100644
--- a/extensions/OWNERS
+++ b/extensions/OWNERS
@@ -5,6 +5,7 @@
 jyasskin@chromium.org
 kalman@chromium.org
 koz@chromium.org
+mek@chromium.org
 miket@chromium.org
 mpcomplete@chromium.org
 yoz@chromium.org
diff --git a/gpu/command_buffer/client/gl_in_process_context.cc b/gpu/command_buffer/client/gl_in_process_context.cc
index 97f1715..cdbfc9f 100644
--- a/gpu/command_buffer/client/gl_in_process_context.cc
+++ b/gpu/command_buffer/client/gl_in_process_context.cc
@@ -53,16 +53,17 @@
   explicit GLInProcessContextImpl();
   virtual ~GLInProcessContextImpl();
 
-  bool Initialize(bool is_offscreen,
+  bool Initialize(scoped_refptr<gfx::GLSurface> surface,
+                  bool is_offscreen,
                   bool share_resources,
                   gfx::AcceleratedWidget window,
                   const gfx::Size& size,
                   const char* allowed_extensions,
-                  const int32* attrib_list,
-                  gfx::GpuPreference gpu_preference,
-                  const base::Closure& context_lost_callback);
+                  const GLInProcessContextAttribs& attribs,
+                  gfx::GpuPreference gpu_preference);
 
   // GLInProcessContext implementation:
+  virtual void SetContextLostCallback(const base::Closure& callback) OVERRIDE;
   virtual void SignalSyncPoint(unsigned sync_point,
                                const base::Closure& callback) OVERRIDE;
   virtual void SignalQuery(unsigned query, const base::Closure& callback)
@@ -79,7 +80,7 @@
   void Destroy();
   void PollQueryCallbacks();
   void CallQueryCallback(size_t index);
-  void OnContextLost(const base::Closure& callback);
+  void OnContextLost();
   void OnSignalSyncPoint(const base::Closure& callback);
 
   scoped_ptr<gles2::GLES2CmdHelper> gles2_helper_;
@@ -92,6 +93,7 @@
 
   unsigned int share_group_id_;
   bool context_lost_;
+  base::Closure context_lost_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(GLInProcessContextImpl);
 };
@@ -147,9 +149,16 @@
   return gles2_implementation_.get();
 }
 
-void GLInProcessContextImpl::OnContextLost(const base::Closure& callback) {
+void GLInProcessContextImpl::SetContextLostCallback(
+    const base::Closure& callback) {
+  context_lost_callback_ = callback;
+}
+
+void GLInProcessContextImpl::OnContextLost() {
   context_lost_ = true;
-  callback.Run();
+  if (!context_lost_callback_.is_null()) {
+    context_lost_callback_.Run();
+  }
 }
 
 void GLInProcessContextImpl::OnSignalSyncPoint(const base::Closure& callback) {
@@ -159,47 +168,63 @@
 }
 
 bool GLInProcessContextImpl::Initialize(
+    scoped_refptr<gfx::GLSurface> surface,
     bool is_offscreen,
     bool share_resources,
     gfx::AcceleratedWidget window,
     const gfx::Size& size,
     const char* allowed_extensions,
-    const int32* attrib_list,
-    gfx::GpuPreference gpu_preference,
-    const base::Closure& context_lost_callback) {
+    const GLInProcessContextAttribs& attribs,
+    gfx::GpuPreference gpu_preference) {
   DCHECK(size.width() >= 0 && size.height() >= 0);
 
-  std::vector<int32> attribs;
-  while (attrib_list) {
-    int32 attrib = *attrib_list++;
-    switch (attrib) {
-      // Known attributes
-      case ALPHA_SIZE:
-      case BLUE_SIZE:
-      case GREEN_SIZE:
-      case RED_SIZE:
-      case DEPTH_SIZE:
-      case STENCIL_SIZE:
-      case SAMPLES:
-      case SAMPLE_BUFFERS:
-        attribs.push_back(attrib);
-        attribs.push_back(*attrib_list++);
-        break;
-      case NONE:
-        attribs.push_back(attrib);
-        attrib_list = NULL;
-        break;
-      default:
-        attribs.push_back(NONE);
-        attrib_list = NULL;
-        break;
-    }
+  const int32 ALPHA_SIZE     = 0x3021;
+  const int32 BLUE_SIZE      = 0x3022;
+  const int32 GREEN_SIZE     = 0x3023;
+  const int32 RED_SIZE       = 0x3024;
+  const int32 DEPTH_SIZE     = 0x3025;
+  const int32 STENCIL_SIZE   = 0x3026;
+  const int32 SAMPLES        = 0x3031;
+  const int32 SAMPLE_BUFFERS = 0x3032;
+  const int32 NONE           = 0x3038;
+
+  std::vector<int32> attrib_vector;
+  if (attribs.alpha_size >= 0) {
+    attrib_vector.push_back(ALPHA_SIZE);
+    attrib_vector.push_back(attribs.alpha_size);
   }
+  if (attribs.blue_size >= 0) {
+    attrib_vector.push_back(BLUE_SIZE);
+    attrib_vector.push_back(attribs.blue_size);
+  }
+  if (attribs.green_size >= 0) {
+    attrib_vector.push_back(GREEN_SIZE);
+    attrib_vector.push_back(attribs.green_size);
+  }
+  if (attribs.red_size >= 0) {
+    attrib_vector.push_back(RED_SIZE);
+    attrib_vector.push_back(attribs.red_size);
+  }
+  if (attribs.depth_size >= 0) {
+    attrib_vector.push_back(DEPTH_SIZE);
+    attrib_vector.push_back(attribs.depth_size);
+  }
+  if (attribs.stencil_size >= 0) {
+    attrib_vector.push_back(STENCIL_SIZE);
+    attrib_vector.push_back(attribs.stencil_size);
+  }
+  if (attribs.samples >= 0) {
+    attrib_vector.push_back(SAMPLES);
+    attrib_vector.push_back(attribs.samples);
+  }
+  if (attribs.sample_buffers >= 0) {
+    attrib_vector.push_back(SAMPLE_BUFFERS);
+    attrib_vector.push_back(attribs.sample_buffers);
+  }
+  attrib_vector.push_back(NONE);
 
   base::Closure wrapped_callback =
-      base::Bind(&GLInProcessContextImpl::OnContextLost,
-                 AsWeakPtr(),
-                 context_lost_callback);
+      base::Bind(&GLInProcessContextImpl::OnContextLost, AsWeakPtr());
   command_buffer_.reset(new InProcessCommandBuffer());
 
   scoped_ptr<base::AutoLock> scoped_shared_context_lock;
@@ -223,15 +248,16 @@
     if (!share_group && !++share_group_id_)
         ++share_group_id_;
   }
-  if (!command_buffer_->Initialize(is_offscreen,
-                              share_resources,
-                              window,
-                              size,
-                              allowed_extensions,
-                              attribs,
-                              gpu_preference,
-                              wrapped_callback,
-                              share_group_id_)) {
+  if (!command_buffer_->Initialize(surface,
+                                   is_offscreen,
+                                   share_resources,
+                                   window,
+                                   size,
+                                   allowed_extensions,
+                                   attrib_vector,
+                                   gpu_preference,
+                                   wrapped_callback,
+                                   share_group_id_)) {
     LOG(INFO) << "Failed to initialize InProcessCommmandBuffer";
     return false;
   }
@@ -337,6 +363,16 @@
 
 }  // anonymous namespace
 
+GLInProcessContextAttribs::GLInProcessContextAttribs()
+    : alpha_size(-1),
+      blue_size(-1),
+      green_size(-1),
+      red_size(-1),
+      depth_size(-1),
+      stencil_size(-1),
+      samples(-1),
+      sample_buffers(-1) {}
+
 // static
 GLInProcessContext* GLInProcessContext::CreateContext(
     bool is_offscreen,
@@ -344,20 +380,42 @@
     const gfx::Size& size,
     bool share_resources,
     const char* allowed_extensions,
-    const int32* attrib_list,
-    gfx::GpuPreference gpu_preference,
-    const base::Closure& callback) {
+    const GLInProcessContextAttribs& attribs,
+    gfx::GpuPreference gpu_preference) {
   scoped_ptr<GLInProcessContextImpl> context(
       new GLInProcessContextImpl());
   if (!context->Initialize(
+      NULL /* surface */,
       is_offscreen,
       share_resources,
       window,
       size,
       allowed_extensions,
-      attrib_list,
-      gpu_preference,
-      callback))
+      attribs,
+      gpu_preference))
+    return NULL;
+
+  return context.release();
+}
+
+// static
+GLInProcessContext* GLInProcessContext::CreateWithSurface(
+    scoped_refptr<gfx::GLSurface> surface,
+    bool share_resources,
+    const char* allowed_extensions,
+    const GLInProcessContextAttribs& attribs,
+    gfx::GpuPreference gpu_preference) {
+  scoped_ptr<GLInProcessContextImpl> context(
+      new GLInProcessContextImpl());
+  if (!context->Initialize(
+      surface,
+      surface->IsOffscreen(),
+      share_resources,
+      gfx::kNullAcceleratedWidget,
+      surface->GetSize(),
+      allowed_extensions,
+      attribs,
+      gpu_preference))
     return NULL;
 
   return context.release();
diff --git a/gpu/command_buffer/client/gl_in_process_context.h b/gpu/command_buffer/client/gl_in_process_context.h
index 2d0754b..09f8140 100644
--- a/gpu/command_buffer/client/gl_in_process_context.h
+++ b/gpu/command_buffer/client/gl_in_process_context.h
@@ -9,6 +9,7 @@
 #include "base/compiler_specific.h"
 #include "gles2_impl_export.h"
 #include "ui/gfx/native_widget_types.h"
+#include "ui/gl/gl_surface.h"
 #include "ui/gl/gpu_preference.h"
 
 namespace gfx {
@@ -23,6 +24,20 @@
 
 class GpuMemoryBufferFactory;
 
+// The default uninitialized value is -1.
+struct GLES2_IMPL_EXPORT GLInProcessContextAttribs {
+  GLInProcessContextAttribs();
+
+  int32 alpha_size;
+  int32 blue_size;
+  int32 green_size;
+  int32 red_size;
+  int32 depth_size;
+  int32 stencil_size;
+  int32 samples;
+  int32 sample_buffers;
+};
+
 class GLES2_IMPL_EXPORT GLInProcessContext {
  public:
   virtual ~GLInProcessContext() {}
@@ -30,20 +45,6 @@
   // Must be called before any GLInProcessContext instances are created.
   static void SetGpuMemoryBufferFactory(GpuMemoryBufferFactory* factory);
 
-  // GLInProcessContext configuration attributes. These are the same as used by
-  // EGL. Attributes are matched using a closest fit algorithm.
-  enum Attribute {
-    ALPHA_SIZE     = 0x3021,
-    BLUE_SIZE      = 0x3022,
-    GREEN_SIZE     = 0x3023,
-    RED_SIZE       = 0x3024,
-    DEPTH_SIZE     = 0x3025,
-    STENCIL_SIZE   = 0x3026,
-    SAMPLES        = 0x3031,
-    SAMPLE_BUFFERS = 0x3032,
-    NONE           = 0x3038  // Attrib list = terminator
-  };
-
   // Create a GLInProcessContext, if |is_offscreen| is true, renders to an
   // offscreen context. |attrib_list| must be NULL or a NONE-terminated list
   // of attribute/value pairs.
@@ -53,9 +54,21 @@
       const gfx::Size& size,
       bool share_resources,
       const char* allowed_extensions,
-      const int32* attrib_list,
-      gfx::GpuPreference gpu_preference,
-      const base::Closure& callback);
+      const GLInProcessContextAttribs& attribs,
+      gfx::GpuPreference gpu_preference);
+
+  // Create context with the provided GLSurface. All other arguments match
+  // CreateContext factory above. Can only be called if the command buffer
+  // service runs on the same thread as this client because GLSurface is not
+  // thread safe.
+  static GLInProcessContext* CreateWithSurface(
+      scoped_refptr<gfx::GLSurface> surface,
+      bool share_resources,
+      const char* allowed_extensions,
+      const GLInProcessContextAttribs& attribs,
+      gfx::GpuPreference gpu_preference);
+
+  virtual void SetContextLostCallback(const base::Closure& callback) = 0;
 
   virtual void SignalSyncPoint(unsigned sync_point,
                                const base::Closure& callback) = 0;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 4f63037..a9b1f1e 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1584,8 +1584,6 @@
   void ProcessPendingReadPixels();
   void FinishReadPixels(const cmds::ReadPixels& c, GLuint buffer);
 
-  void ForceCompileShaderIfPending(Shader* shader);
-
   // Generate a member function prototype for each command in an automated and
   // typesafe way.
   #define GLES2_CMD_OP(name) \
@@ -5652,23 +5650,6 @@
                      std::string("PERFORMANCE WARNING: ") + msg);
 }
 
-void GLES2DecoderImpl::ForceCompileShaderIfPending(Shader* shader) {
-  if (shader->compilation_status() ==
-      Shader::PENDING_DEFERRED_COMPILE) {
-    ShaderTranslator* translator = NULL;
-    if (use_shader_translator_) {
-      translator = shader->shader_type() == GL_VERTEX_SHADER ?
-          vertex_translator_.get() : fragment_translator_.get();
-    }
-    // We know there will be no errors, because we only defer compilation on
-    // shaders that were previously compiled successfully.
-    program_manager()->ForceCompileShader(shader->deferred_compilation_source(),
-                                          shader,
-                                          translator,
-                                          feature_info_.get());
-  }
-}
-
 void GLES2DecoderImpl::UpdateStreamTextureIfNeeded(Texture* texture) {
   if (texture && texture->IsStreamTexture()) {
     DCHECK(stream_texture_manager());
@@ -6366,7 +6347,6 @@
       *params = shader->log_info() ? shader->log_info()->size() + 1 : 0;
       return;
     case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
-      ForceCompileShaderIfPending(shader);
       *params = shader->translated_source() ?
           shader->translated_source()->size() + 1 : 0;
       return;
@@ -6402,7 +6382,6 @@
     bucket->SetSize(0);
     return error::kNoError;
   }
-  ForceCompileShaderIfPending(shader);
 
   bucket->SetFromString(shader->translated_source() ?
       shader->translated_source()->c_str() : NULL);
diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc
index 766a7e0..ccbfb32 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.cc
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc
@@ -20,6 +20,7 @@
 #include "base/logging.h"
 #include "base/memory/weak_ptr.h"
 #include "base/message_loop/message_loop_proxy.h"
+#include "base/sequence_checker.h"
 #include "base/threading/thread.h"
 #include "gpu/command_buffer/common/id_allocator.h"
 #include "gpu/command_buffer/service/command_buffer_service.h"
@@ -32,7 +33,6 @@
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_image.h"
 #include "ui/gl/gl_share_group.h"
-#include "ui/gl/gl_surface.h"
 
 namespace gpu {
 
@@ -244,6 +244,7 @@
 }
 
 bool InProcessCommandBuffer::IsContextLost() {
+  CheckSequencedThread();
   if (context_lost_ || !command_buffer_) {
     return true;
   }
@@ -252,11 +253,13 @@
 }
 
 void InProcessCommandBuffer::OnResizeView(gfx::Size size, float scale_factor) {
+  CheckSequencedThread();
   DCHECK(!surface_->IsOffscreen());
   surface_->Resize(size);
 }
 
 bool InProcessCommandBuffer::MakeCurrent() {
+  CheckSequencedThread();
   command_buffer_lock_.AssertAcquired();
 
   if (!context_lost_ && decoder_->MakeCurrent())
@@ -268,6 +271,7 @@
 }
 
 void InProcessCommandBuffer::PumpCommands() {
+  CheckSequencedThread();
   command_buffer_lock_.AssertAcquired();
 
   if (!MakeCurrent())
@@ -277,12 +281,14 @@
 }
 
 bool InProcessCommandBuffer::GetBufferChanged(int32 transfer_buffer_id) {
+  CheckSequencedThread();
   command_buffer_lock_.AssertAcquired();
   command_buffer_->SetGetBuffer(transfer_buffer_id);
   return true;
 }
 
 bool InProcessCommandBuffer::Initialize(
+    scoped_refptr<gfx::GLSurface> surface,
     bool is_offscreen,
     bool share_resources,
     gfx::AcceleratedWidget window,
@@ -297,8 +303,13 @@
   context_lost_callback_ = WrapCallback(context_lost_callback);
   share_group_id_ = share_group_id;
 
-  base::WaitableEvent completion(true, false);
-  bool result = false;
+  if (surface) {
+    // GPU thread must be the same as client thread due to GLSurface not being
+    // thread safe.
+    sequence_checker_.reset(new base::SequenceChecker);
+    surface_ = surface;
+  }
+
   base::Callback<bool(void)> init_task =
       base::Bind(&InProcessCommandBuffer::InitializeOnGpuThread,
                  base::Unretained(this),
@@ -308,6 +319,9 @@
                  allowed_extensions,
                  attribs,
                  gpu_preference);
+
+  base::WaitableEvent completion(true, false);
+  bool result = false;
   QueueTask(
       base::Bind(&RunTaskWithResult<bool>, init_task, &result, &completion));
   completion.Wait();
@@ -321,6 +335,7 @@
     const char* allowed_extensions,
     const std::vector<int32>& attribs,
     gfx::GpuPreference gpu_preference) {
+  CheckSequencedThread();
   // Use one share group for all contexts.
   CR_DEFINE_STATIC_LOCAL(scoped_refptr<gfx::GLShareGroup>, share_group,
                          (new gfx::GLShareGroup));
@@ -377,10 +392,12 @@
 
   decoder_->set_engine(gpu_scheduler_.get());
 
-  if (is_offscreen)
-    surface_ = gfx::GLSurface::CreateOffscreenGLSurface(size);
-  else
-    surface_ = gfx::GLSurface::CreateViewGLSurface(window);
+  if (!surface_) {
+    if (is_offscreen)
+      surface_ = gfx::GLSurface::CreateOffscreenGLSurface(size);
+    else
+      surface_ = gfx::GLSurface::CreateViewGLSurface(window);
+  }
 
   if (!surface_.get()) {
     LOG(ERROR) << "Could not create GLSurface.";
@@ -448,6 +465,7 @@
 }
 
 void InProcessCommandBuffer::Destroy() {
+  CheckSequencedThread();
   base::WaitableEvent completion(true, false);
   bool result = false;
   base::Callback<bool(void)> destroy_task = base::Bind(
@@ -458,6 +476,7 @@
 }
 
 bool InProcessCommandBuffer::DestroyOnGpuThread() {
+  CheckSequencedThread();
   command_buffer_.reset();
   // Clean up GL resources if possible.
   bool have_context = context_ && context_->MakeCurrent(surface_);
@@ -472,9 +491,15 @@
   return true;
 }
 
+void InProcessCommandBuffer::CheckSequencedThread() {
+  DCHECK(!sequence_checker_ ||
+         sequence_checker_->CalledOnValidSequencedThread());
+}
+
 unsigned int InProcessCommandBuffer::CreateImageForGpuMemoryBuffer(
     gfx::GpuMemoryBufferHandle buffer,
     gfx::Size size) {
+  CheckSequencedThread();
   unsigned int image_id;
   {
     // TODO: ID allocation should go through CommandBuffer
@@ -494,12 +519,14 @@
     gfx::GpuMemoryBufferHandle buffer,
     gfx::Size size,
     unsigned int image_id) {
+  CheckSequencedThread();
   scoped_refptr<gfx::GLImage> gl_image =
       gfx::GLImage::CreateGLImageForGpuMemoryBuffer(buffer, size);
    decoder_->GetContextGroup()->image_manager()->AddImage(gl_image, image_id);
 }
 
 void InProcessCommandBuffer::RemoveImage(unsigned int image_id) {
+  CheckSequencedThread();
   {
     // TODO: ID allocation should go through CommandBuffer
     base::AutoLock lock(command_buffer_lock_);
@@ -514,10 +541,12 @@
 }
 
 void InProcessCommandBuffer::RemoveImageOnGpuThread(unsigned int image_id) {
+  CheckSequencedThread();
   decoder_->GetContextGroup()->image_manager()->RemoveImage(image_id);
 }
 
 void InProcessCommandBuffer::OnContextLost() {
+  CheckSequencedThread();
   if (!context_lost_callback_.is_null()) {
     context_lost_callback_.Run();
     context_lost_callback_.Reset();
@@ -535,6 +564,7 @@
 }
 
 CommandBuffer::State InProcessCommandBuffer::GetStateFast() {
+  CheckSequencedThread();
   base::AutoLock lock(state_after_last_flush_lock_);
   if (state_after_last_flush_.generation - last_state_.generation < 0x80000000U)
     last_state_ = state_after_last_flush_;
@@ -542,19 +572,23 @@
 }
 
 CommandBuffer::State InProcessCommandBuffer::GetState() {
+  CheckSequencedThread();
   return GetStateFast();
 }
 
 CommandBuffer::State InProcessCommandBuffer::GetLastState() {
+  CheckSequencedThread();
   return last_state_;
 }
 
 int32 InProcessCommandBuffer::GetLastToken() {
+  CheckSequencedThread();
   GetStateFast();
   return last_state_.token;
 }
 
 void InProcessCommandBuffer::FlushOnGpuThread(int32 put_offset) {
+  CheckSequencedThread();
   ScopedEvent handle_flush(&flush_event_);
   base::AutoLock lock(command_buffer_lock_);
   command_buffer_->Flush(put_offset);
@@ -568,6 +602,7 @@
 }
 
 void InProcessCommandBuffer::Flush(int32 put_offset) {
+  CheckSequencedThread();
   if (last_state_.error != gpu::error::kNoError)
     return;
 
@@ -583,6 +618,7 @@
 
 CommandBuffer::State InProcessCommandBuffer::FlushSync(int32 put_offset,
                                                        int32 last_known_get) {
+  CheckSequencedThread();
   if (put_offset == last_known_get || last_state_.error != gpu::error::kNoError)
     return last_state_;
 
@@ -598,6 +634,7 @@
 }
 
 void InProcessCommandBuffer::SetGetBuffer(int32 shm_id) {
+  CheckSequencedThread();
   if (last_state_.error != gpu::error::kNoError)
     return;
 
@@ -614,11 +651,13 @@
 
 gpu::Buffer InProcessCommandBuffer::CreateTransferBuffer(size_t size,
                                                          int32* id) {
+  CheckSequencedThread();
   base::AutoLock lock(command_buffer_lock_);
   return command_buffer_->CreateTransferBuffer(size, id);
 }
 
 void InProcessCommandBuffer::DestroyTransferBuffer(int32 id) {
+  CheckSequencedThread();
   base::Closure task = base::Bind(&CommandBuffer::DestroyTransferBuffer,
                                   base::Unretained(command_buffer_.get()),
                                   id);
@@ -637,10 +676,12 @@
 }
 void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point,
                                              const base::Closure& callback) {
+  CheckSequencedThread();
   QueueTask(WrapCallback(callback));
 }
 
 gpu::error::Error InProcessCommandBuffer::GetLastError() {
+  CheckSequencedThread();
   return last_state_.error;
 }
 
diff --git a/gpu/command_buffer/service/in_process_command_buffer.h b/gpu/command_buffer/service/in_process_command_buffer.h
index d2e103a..9bdbd49 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.h
+++ b/gpu/command_buffer/service/in_process_command_buffer.h
@@ -17,8 +17,13 @@
 #include "gpu/gpu_export.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/native_widget_types.h"
+#include "ui/gl/gl_surface.h"
 #include "ui/gl/gpu_preference.h"
 
+namespace base {
+class SequenceChecker;
+}
+
 namespace gfx {
 class GLContext;
 class GLImage;
@@ -57,7 +62,11 @@
 
   static void EnableVirtualizedContext();
 
-  bool Initialize(bool is_offscreen,
+  // If |surface| is not NULL, use it directly; in this case, the command
+  // buffer gpu thread must be the same as the client thread. Otherwise create
+  // a new GLSurface.
+  bool Initialize(scoped_refptr<gfx::GLSurface> surface,
+                  bool is_offscreen,
                   bool share_resources,
                   gfx::AcceleratedWidget window,
                   const gfx::Size& size,
@@ -118,6 +127,7 @@
   base::Closure WrapCallback(const base::Closure& callback);
   State GetStateFast();
   void QueueTask(const base::Closure& task) { queue_->QueueTask(task); }
+  void CheckSequencedThread();
 
   // Callbacks:
   void OnContextLost();
@@ -149,6 +159,10 @@
   State state_after_last_flush_;
   base::Lock state_after_last_flush_lock_;
 
+  // Only used with explicit scheduling and the gpu thread is the same as
+  // the client thread.
+  scoped_ptr<base::SequenceChecker> sequence_checker_;
+
   DISALLOW_COPY_AND_ASSIGN(InProcessCommandBuffer);
 };
 
diff --git a/gpu/command_buffer/service/memory_program_cache.cc b/gpu/command_buffer/service/memory_program_cache.cc
index 3207f7c..e09d132 100644
--- a/gpu/command_buffer/service/memory_program_cache.cc
+++ b/gpu/command_buffer/service/memory_program_cache.cc
@@ -117,10 +117,12 @@
     const ShaderCacheCallback& shader_callback) {
   char a_sha[kHashLength];
   char b_sha[kHashLength];
+  DCHECK(shader_a && shader_a->signature_source() &&
+         shader_b && shader_b->signature_source());
   ComputeShaderHash(
-      *shader_a->deferred_compilation_source(), translator_a, a_sha);
+      *shader_a->signature_source(), translator_a, a_sha);
   ComputeShaderHash(
-      *shader_b->deferred_compilation_source(), translator_b, b_sha);
+      *shader_b->signature_source(), translator_b, b_sha);
 
   char sha[kHashLength];
   ComputeProgramHash(a_sha,
@@ -189,10 +191,12 @@
 
   char a_sha[kHashLength];
   char b_sha[kHashLength];
+  DCHECK(shader_a && shader_a->signature_source() &&
+         shader_b && shader_b->signature_source());
   ComputeShaderHash(
-      *shader_a->deferred_compilation_source(), translator_a, a_sha);
+      *shader_a->signature_source(), translator_a, a_sha);
   ComputeShaderHash(
-      *shader_b->deferred_compilation_source(), translator_b, b_sha);
+      *shader_b->signature_source(), translator_b, b_sha);
 
   char sha[kHashLength];
   ComputeProgramHash(a_sha,
@@ -243,7 +247,7 @@
                                    this));
 
   UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.MemorySizeAfterKb",
-                         curr_size_bytes_ / 1024);
+                       curr_size_bytes_ / 1024);
 }
 
 void MemoryProgramCache::LoadProgram(const std::string& program) {
@@ -289,10 +293,6 @@
                                      fragment_uniforms,
                                      this));
 
-    ShaderCompilationSucceededSha(proto->sha());
-    ShaderCompilationSucceededSha(proto->vertex_shader().sha());
-    ShaderCompilationSucceededSha(proto->fragment_shader().sha());
-
     UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.MemorySizeAfterKb",
                          curr_size_bytes_ / 1024);
   } else {
@@ -324,14 +324,12 @@
       uniform_map_1_(uniform_map_1),
       program_cache_(program_cache) {
   program_cache_->curr_size_bytes_ += length_;
-  program_cache_->LinkedProgramCacheSuccess(program_hash,
-                                            shader_0_hash_,
-                                            shader_1_hash_);
+  program_cache_->LinkedProgramCacheSuccess(program_hash);
 }
 
 MemoryProgramCache::ProgramCacheValue::~ProgramCacheValue() {
   program_cache_->curr_size_bytes_ -= length_;
-  program_cache_->Evict(program_hash_, shader_0_hash_, shader_1_hash_);
+  program_cache_->Evict(program_hash_);
 }
 
 }  // namespace gles2
diff --git a/gpu/command_buffer/service/memory_program_cache_unittest.cc b/gpu/command_buffer/service/memory_program_cache_unittest.cc
index 603c21e..83fc12a 100644
--- a/gpu/command_buffer/service/memory_program_cache_unittest.cc
+++ b/gpu/command_buffer/service/memory_program_cache_unittest.cc
@@ -124,8 +124,6 @@
 
     vertex_shader_->UpdateSource("bbbalsldkdkdkd");
     fragment_shader_->UpdateSource("bbbal   sldkdkdkas 134 ad");
-    vertex_shader_->FlagSourceAsCompiled(true);
-    fragment_shader_->FlagSourceAsCompiled(true);
 
     vertex_shader_->SetStatus(true, NULL, NULL);
     fragment_shader_->SetStatus(true, NULL, NULL);
@@ -202,9 +200,9 @@
                                        base::Unretained(this)));
 
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
-      *vertex_shader_->deferred_compilation_source(),
+      *vertex_shader_->signature_source(),
       NULL,
-      *fragment_shader_->deferred_compilation_source(),
+      *fragment_shader_->signature_source(),
       NULL,
       NULL));
   EXPECT_EQ(1, shader_cache_count());
@@ -227,9 +225,9 @@
                                        base::Unretained(this)));
 
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
-      *vertex_shader_->deferred_compilation_source(),
+      *vertex_shader_->signature_source(),
       NULL,
-      *fragment_shader_->deferred_compilation_source(),
+      *fragment_shader_->signature_source(),
       NULL,
       NULL));
   EXPECT_EQ(1, shader_cache_count());
@@ -238,9 +236,9 @@
 
   cache_->LoadProgram(shader_cache_shader());
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
-      *vertex_shader_->deferred_compilation_source(),
+      *vertex_shader_->signature_source(),
       NULL,
-      *fragment_shader_->deferred_compilation_source(),
+      *fragment_shader_->signature_source(),
       NULL,
       NULL));
 }
@@ -391,9 +389,9 @@
                                        base::Unretained(this)));
 
   const std::string vertex_orig_source =
-      *vertex_shader_->deferred_compilation_source();
+      *vertex_shader_->signature_source();
   vertex_shader_->UpdateSource("different!");
-  vertex_shader_->FlagSourceAsCompiled(true);
+  vertex_shader_->SetStatus(true, NULL, NULL);
   EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram(
       kProgramId,
       vertex_shader_,
@@ -405,9 +403,9 @@
                  base::Unretained(this))));
 
   vertex_shader_->UpdateSource(vertex_orig_source.c_str());
-  vertex_shader_->FlagSourceAsCompiled(true);
+  vertex_shader_->SetStatus(true, NULL, NULL);
   fragment_shader_->UpdateSource("different!");
-  fragment_shader_->FlagSourceAsCompiled(true);
+  fragment_shader_->SetStatus(true, NULL, NULL);
   EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram(
       kProgramId,
       vertex_shader_,
@@ -485,9 +483,9 @@
 
   // save old source and modify for new program
   const std::string old_source =
-      *fragment_shader_->deferred_compilation_source();
+      *fragment_shader_->signature_source();
   fragment_shader_->UpdateSource("al sdfkjdk");
-  fragment_shader_->FlagSourceAsCompiled(true);
+  fragment_shader_->SetStatus(true, NULL, NULL);
 
   scoped_ptr<char[]> bigTestBinary =
       scoped_ptr<char[]>(new char[kEvictingBinaryLength]);
@@ -509,15 +507,15 @@
                                        base::Unretained(this)));
 
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
-      *vertex_shader_->deferred_compilation_source(),
+      *vertex_shader_->signature_source(),
       NULL,
-      *fragment_shader_->deferred_compilation_source(),
+      *fragment_shader_->signature_source(),
       NULL,
       NULL));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN, cache_->GetLinkedProgramStatus(
       old_source,
       NULL,
-      *fragment_shader_->deferred_compilation_source(),
+      *fragment_shader_->signature_source(),
       NULL,
       NULL));
 }
@@ -540,9 +538,9 @@
                                        base::Unretained(this)));
 
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
-      *vertex_shader_->deferred_compilation_source(),
+      *vertex_shader_->signature_source(),
       NULL,
-      *fragment_shader_->deferred_compilation_source(),
+      *fragment_shader_->signature_source(),
       NULL,
       NULL));
 }
@@ -564,9 +562,9 @@
                                        base::Unretained(this)));
 
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
-      *vertex_shader_->deferred_compilation_source(),
+      *vertex_shader_->signature_source(),
       NULL,
-      *fragment_shader_->deferred_compilation_source(),
+      *fragment_shader_->signature_source(),
       NULL,
       NULL));
 
diff --git a/gpu/command_buffer/service/program_cache.cc b/gpu/command_buffer/service/program_cache.cc
index f0adf6e..6599d4a 100644
--- a/gpu/command_buffer/service/program_cache.cc
+++ b/gpu/command_buffer/service/program_cache.cc
@@ -16,45 +16,9 @@
 
 void ProgramCache::Clear() {
   ClearBackend();
-  shader_status_.clear();
   link_status_.clear();
 }
 
-ProgramCache::CompiledShaderStatus ProgramCache::GetShaderCompilationStatus(
-    const std::string& shader_src,
-    const ShaderTranslatorInterface* translator) const {
-  char sha[kHashLength];
-  ComputeShaderHash(shader_src, translator, sha);
-  const std::string sha_string(sha, kHashLength);
-
-  CompileStatusMap::const_iterator found = shader_status_.find(sha_string);
-
-  if (found == shader_status_.end()) {
-    return ProgramCache::COMPILATION_UNKNOWN;
-  } else {
-    return found->second.status;
-  }
-}
-
-void ProgramCache::ShaderCompilationSucceeded(
-    const std::string& shader_src,
-    const ShaderTranslatorInterface* translator) {
-  char sha[kHashLength];
-  ComputeShaderHash(shader_src, translator, sha);
-  const std::string sha_string(sha, kHashLength);
-  ShaderCompilationSucceededSha(sha_string);
-}
-
-void ProgramCache::ShaderCompilationSucceededSha(
-    const std::string& sha_string) {
-  CompileStatusMap::iterator it = shader_status_.find(sha_string);
-  if (it == shader_status_.end()) {
-    shader_status_[sha_string] = CompiledShaderInfo(COMPILATION_SUCCEEDED);
-  } else {
-    it->second.status = COMPILATION_SUCCEEDED;
-  }
-}
-
 ProgramCache::LinkedProgramStatus ProgramCache::GetLinkedProgramStatus(
     const std::string& untranslated_a,
     const ShaderTranslatorInterface* translator_a,
@@ -98,17 +62,11 @@
                      sha);
   const std::string sha_string(sha, kHashLength);
 
-  LinkedProgramCacheSuccess(sha_string,
-                            std::string(a_sha, kHashLength),
-                            std::string(b_sha, kHashLength));
+  LinkedProgramCacheSuccess(sha_string);
 }
 
-void ProgramCache::LinkedProgramCacheSuccess(const std::string& program_hash,
-                                             const std::string& shader_a_hash,
-                                             const std::string& shader_b_hash) {
+void ProgramCache::LinkedProgramCacheSuccess(const std::string& program_hash) {
   link_status_[program_hash] = LINK_SUCCEEDED;
-  shader_status_[shader_a_hash].ref_count++;
-  shader_status_[shader_b_hash].ref_count++;
 }
 
 void ProgramCache::ComputeShaderHash(
@@ -122,21 +80,7 @@
                       s.length(), reinterpret_cast<unsigned char*>(result));
 }
 
-void ProgramCache::Evict(const std::string& program_hash,
-                         const std::string& shader_0_hash,
-                         const std::string& shader_1_hash) {
-  CompileStatusMap::iterator info0 = shader_status_.find(shader_0_hash);
-  CompileStatusMap::iterator info1 = shader_status_.find(shader_1_hash);
-  DCHECK(info0 != shader_status_.end());
-  DCHECK(info1 != shader_status_.end());
-  DCHECK(info0->second.ref_count > 0);
-  DCHECK(info1->second.ref_count > 0);
-  if (--info0->second.ref_count <= 0) {
-    shader_status_.erase(shader_0_hash);
-  }
-  if (--info1->second.ref_count <= 0) {
-    shader_status_.erase(shader_1_hash);
-  }
+void ProgramCache::Evict(const std::string& program_hash) {
   link_status_.erase(program_hash);
 }
 
diff --git a/gpu/command_buffer/service/program_cache.h b/gpu/command_buffer/service/program_cache.h
index a8b9f91..3fb5687 100644
--- a/gpu/command_buffer/service/program_cache.h
+++ b/gpu/command_buffer/service/program_cache.h
@@ -27,11 +27,6 @@
 
   typedef std::map<std::string, GLint> LocationMap;
 
-  enum CompiledShaderStatus {
-    COMPILATION_UNKNOWN,
-    COMPILATION_SUCCEEDED
-  };
-
   enum LinkedProgramStatus {
     LINK_UNKNOWN,
     LINK_SUCCEEDED
@@ -45,13 +40,6 @@
   ProgramCache();
   virtual ~ProgramCache();
 
-  CompiledShaderStatus GetShaderCompilationStatus(
-      const std::string& shader_src,
-      const ShaderTranslatorInterface* translator) const;
-  void ShaderCompilationSucceeded(const std::string& shader_src,
-                                  const ShaderTranslatorInterface* translator);
-  void ShaderCompilationSucceededSha(const std::string& sha_string);
-
   LinkedProgramStatus GetLinkedProgramStatus(
       const std::string& untranslated_shader_a,
       const ShaderTranslatorInterface* translator_a,
@@ -95,9 +83,7 @@
 
  protected:
   // called by implementing class after a shader was successfully cached
-  void LinkedProgramCacheSuccess(const std::string& program_hash,
-                                 const std::string& shader_a_hash,
-                                 const std::string& shader_b_hash);
+  void LinkedProgramCacheSuccess(const std::string& program_hash);
 
   // result is not null terminated
   void ComputeShaderHash(const std::string& shader,
@@ -112,30 +98,15 @@
       const LocationMap* bind_attrib_location_map,
       char* result) const;
 
-  void Evict(const std::string& program_hash,
-             const std::string& shader_0_hash,
-             const std::string& shader_1_hash);
+  void Evict(const std::string& program_hash);
 
  private:
-  struct CompiledShaderInfo {
-    CompiledShaderInfo() : status(COMPILATION_UNKNOWN), ref_count(0) { }
-    explicit CompiledShaderInfo(CompiledShaderStatus status_)
-        : status(status_),
-          ref_count(0) { }
-
-    CompiledShaderStatus status;
-    size_t ref_count;
-  };
-
-  typedef base::hash_map<std::string,
-                         CompiledShaderInfo> CompileStatusMap;
   typedef base::hash_map<std::string,
                          LinkedProgramStatus> LinkStatusMap;
 
   // called to clear the backend cache
   virtual void ClearBackend() = 0;
 
-  CompileStatusMap shader_status_;
   LinkStatusMap link_status_;
 
   DISALLOW_COPY_AND_ASSIGN(ProgramCache);
diff --git a/gpu/command_buffer/service/program_cache_unittest.cc b/gpu/command_buffer/service/program_cache_unittest.cc
index 9ff6da9..4e2abc3 100644
--- a/gpu/command_buffer/service/program_cache_unittest.cc
+++ b/gpu/command_buffer/service/program_cache_unittest.cc
@@ -55,9 +55,7 @@
                        sha);
     const std::string shaString(sha, kHashLength);
 
-    LinkedProgramCacheSuccess(shaString,
-                              std::string(a_sha, kHashLength),
-                              std::string(b_sha, kHashLength));
+    LinkedProgramCacheSuccess(shaString);
   }
 
   void ComputeShaderHash(const std::string& shader,
@@ -76,10 +74,8 @@
                                      result);
   }
 
-  void Evict(const std::string& program_hash,
-             const std::string& shader_0_hash,
-             const std::string& shader_1_hash) {
-    ProgramCache::Evict(program_hash, shader_0_hash, shader_1_hash);
+  void Evict(const std::string& program_hash) {
+    ProgramCache::Evict(program_hash);
   }
 };
 
@@ -92,54 +88,6 @@
   scoped_ptr<NoBackendProgramCache> cache_;
 };
 
-TEST_F(ProgramCacheTest, CompilationStatusSave) {
-  const std::string shader1 = "abcd1234";
-  {
-    std::string shader = shader1;
-    EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-              cache_->GetShaderCompilationStatus(shader, NULL));
-    cache_->ShaderCompilationSucceeded(shader, NULL);
-    shader.clear();
-  }
-  // make sure it was copied
-  EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED,
-            cache_->GetShaderCompilationStatus(shader1, NULL));
-}
-
-TEST_F(ProgramCacheTest, CompilationStatusTranslatorOptionDependent) {
-  MockShaderTranslator translator;
-
-  EXPECT_CALL(translator, GetStringForOptionsThatWouldEffectCompilation())
-      .WillOnce(Return("foo"))   // GetShaderCompilationStatus
-      .WillOnce(Return("foo"))   // ShaderCompilationSucceeded
-      .WillOnce(Return("foo"))   // GetShaderCompilationStatus
-      .WillOnce(Return("bar"));  // GetShaderCompilationStatus
-
-  const std::string shader1 = "abcd1234";
-  {
-    std::string shader = shader1;
-    EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-              cache_->GetShaderCompilationStatus(shader, &translator));
-    cache_->ShaderCompilationSucceeded(shader, &translator);
-    shader.clear();
-  }
-  // make sure it was copied
-  EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED,
-            cache_->GetShaderCompilationStatus(shader1, &translator));
-  // make sure if the options change it's not copied.
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(shader1, &translator));
-}
-
-TEST_F(ProgramCacheTest, CompilationUnknownOnSourceChange) {
-  std::string shader1 = "abcd1234";
-  cache_->ShaderCompilationSucceeded(shader1, NULL);
-
-  shader1 = "different!";
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(shader1, NULL));
-}
-
 TEST_F(ProgramCacheTest, LinkStatusSave) {
   const std::string shader1 = "abcd1234";
   const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
@@ -183,8 +131,6 @@
 TEST_F(ProgramCacheTest, StatusEviction) {
   const std::string shader1 = "abcd1234";
   const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
-  cache_->ShaderCompilationSucceeded(shader1, NULL);
-  cache_->ShaderCompilationSucceeded(shader2, NULL);
   cache_->SaySuccessfullyCached(shader1, NULL, shader2, NULL, NULL);
   char a_sha[ProgramCache::kHashLength];
   char b_sha[ProgramCache::kHashLength];
@@ -196,13 +142,7 @@
                              b_sha,
                              NULL,
                              sha);
-  cache_->Evict(std::string(sha, ProgramCache::kHashLength),
-                std::string(a_sha, ProgramCache::kHashLength),
-                std::string(b_sha, ProgramCache::kHashLength));
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(shader1, NULL));
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(shader2, NULL));
+  cache_->Evict(std::string(sha, ProgramCache::kHashLength));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
             cache_->GetLinkedProgramStatus(shader1, NULL, shader2, NULL, NULL));
 }
@@ -211,11 +151,7 @@
   const std::string shader1 = "abcd1234";
   const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
   const std::string shader3 = "asbjbbjj239a";
-  cache_->ShaderCompilationSucceeded(shader1, NULL);
-  cache_->ShaderCompilationSucceeded(shader2, NULL);
   cache_->SaySuccessfullyCached(shader1, NULL, shader2, NULL, NULL);
-  cache_->ShaderCompilationSucceeded(shader1, NULL);
-  cache_->ShaderCompilationSucceeded(shader3, NULL);
   cache_->SaySuccessfullyCached(shader1, NULL, shader3, NULL, NULL);
 
   char a_sha[ProgramCache::kHashLength];
@@ -230,15 +166,7 @@
                              b_sha,
                              NULL,
                              sha);
-  cache_->Evict(std::string(sha, ProgramCache::kHashLength),
-                std::string(a_sha, ProgramCache::kHashLength),
-                std::string(b_sha, ProgramCache::kHashLength));
-  EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED,
-            cache_->GetShaderCompilationStatus(shader1, NULL));
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(shader2, NULL));
-  EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED,
-            cache_->GetShaderCompilationStatus(shader3, NULL));
+  cache_->Evict(std::string(sha, ProgramCache::kHashLength));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
             cache_->GetLinkedProgramStatus(shader1, NULL, shader2, NULL, NULL));
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED,
@@ -249,15 +177,7 @@
                              c_sha,
                              NULL,
                              sha);
-  cache_->Evict(std::string(sha, ProgramCache::kHashLength),
-                std::string(a_sha, ProgramCache::kHashLength),
-                std::string(c_sha, ProgramCache::kHashLength));
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(shader1, NULL));
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(shader2, NULL));
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(shader3, NULL));
+  cache_->Evict(std::string(sha, ProgramCache::kHashLength));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
             cache_->GetLinkedProgramStatus(shader1, NULL, shader2, NULL, NULL));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
@@ -268,18 +188,9 @@
   const std::string shader1 = "abcd1234";
   const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
   const std::string shader3 = "asbjbbjj239a";
-  cache_->ShaderCompilationSucceeded(shader1, NULL);
-  cache_->ShaderCompilationSucceeded(shader2, NULL);
   cache_->SaySuccessfullyCached(shader1, NULL, shader2, NULL, NULL);
-  cache_->ShaderCompilationSucceeded(shader3, NULL);
   cache_->SaySuccessfullyCached(shader1, NULL, shader3, NULL, NULL);
   cache_->Clear();
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(shader1, NULL));
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(shader2, NULL));
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(shader3, NULL));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
             cache_->GetLinkedProgramStatus(shader1, NULL, shader2, NULL, NULL));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc
index d7ced0a..8b1eede 100644
--- a/gpu/command_buffer/service/program_manager.cc
+++ b/gpu/command_buffer/service/program_manager.cc
@@ -443,38 +443,9 @@
 void ProgramManager::DoCompileShader(Shader* shader,
                                      ShaderTranslator* translator,
                                      FeatureInfo* feature_info) {
-  TimeTicks before = TimeTicks::HighResNow();
-  if (program_cache_ &&
-      program_cache_->GetShaderCompilationStatus(
-          shader->source() ? *shader->source() : std::string(),
-          translator) == ProgramCache::COMPILATION_SUCCEEDED) {
-    shader->SetStatus(true, "", translator);
-    shader->FlagSourceAsCompiled(false);
-    UMA_HISTOGRAM_CUSTOM_COUNTS(
-        "GPU.ProgramCache.CompilationCacheHitTime",
-        (TimeTicks::HighResNow() - before).InMicroseconds(),
-        0,
-        TimeDelta::FromSeconds(1).InMicroseconds(),
-        50);
-    return;
-  }
-  ForceCompileShader(shader->source(), shader, translator, feature_info);
-  UMA_HISTOGRAM_CUSTOM_COUNTS(
-      "GPU.ProgramCache.CompilationCacheMissTime",
-      (TimeTicks::HighResNow() - before).InMicroseconds(),
-      0,
-      TimeDelta::FromSeconds(1).InMicroseconds(),
-      50);
-}
-
-void ProgramManager::ForceCompileShader(const std::string* source,
-                                        Shader* shader,
-                                        ShaderTranslator* translator,
-                                        FeatureInfo* feature_info) {
-  shader->FlagSourceAsCompiled(true);
-
   // Translate GL ES 2.0 shader to Desktop GL shader and pass that to
   // glShaderSource and then glCompileShader.
+  const std::string* source = shader->source();
   const char* shader_src = source ? source->c_str() : "";
   if (translator) {
     if (!translator->Translate(shader_src)) {
@@ -506,11 +477,6 @@
   glGetShaderiv(shader->service_id(), GL_COMPILE_STATUS, &status);
   if (status) {
     shader->SetStatus(true, "", translator);
-    if (program_cache_) {
-      const char* untranslated_source = source ? source->c_str() : "";
-      program_cache_->ShaderCompilationSucceeded(
-          untranslated_source, translator);
-    }
   } else {
     // We cannot reach here if we are using the shader translator.
     // All invalid shaders must be rejected by the translator.
@@ -551,10 +517,12 @@
   bool link = true;
   ProgramCache* cache = manager_->program_cache_;
   if (cache) {
+    DCHECK(attached_shaders_[0]->signature_source() &&
+           attached_shaders_[1]->signature_source());
     ProgramCache::LinkedProgramStatus status = cache->GetLinkedProgramStatus(
-        *attached_shaders_[0]->deferred_compilation_source(),
+        *attached_shaders_[0]->signature_source(),
         vertex_translator,
-        *attached_shaders_[1]->deferred_compilation_source(),
+        *attached_shaders_[1]->signature_source(),
         fragment_translator,
         &bind_attrib_location_map_);
 
@@ -570,26 +538,6 @@
       link = success != ProgramCache::PROGRAM_LOAD_SUCCESS;
       UMA_HISTOGRAM_BOOLEAN("GPU.ProgramCache.LoadBinarySuccess", !link);
     }
-
-    if (link) {
-      // compile our shaders if they're pending
-      const int kShaders = Program::kMaxAttachedShaders;
-      for (int i = 0; i < kShaders; ++i) {
-        Shader* shader = attached_shaders_[i].get();
-        if (shader->compilation_status() ==
-            Shader::PENDING_DEFERRED_COMPILE) {
-          ShaderTranslator* translator = ShaderIndexToTranslator(
-              i,
-              vertex_translator,
-              fragment_translator);
-          manager_->ForceCompileShader(shader->deferred_compilation_source(),
-                                       attached_shaders_[i].get(),
-                                       translator,
-                                       feature_info);
-          DCHECK(shader->IsValid());
-        }
-      }
-    }
   }
 
   if (link) {
diff --git a/gpu/command_buffer/service/program_manager.h b/gpu/command_buffer/service/program_manager.h
index 16dd97d..dca232b 100644
--- a/gpu/command_buffer/service/program_manager.h
+++ b/gpu/command_buffer/service/program_manager.h
@@ -358,18 +358,10 @@
 
   static int32 MakeFakeLocation(int32 index, int32 element);
 
-  // Cache-aware shader compiling.  If no cache or if the shader wasn't
-  // previously compiled, ForceCompileShader is called
   void DoCompileShader(Shader* shader,
                        ShaderTranslator* translator,
                        FeatureInfo* feature_info);
 
-  // Actually compiles the shader
-  void ForceCompileShader(const std::string* source,
-                          Shader* shader,
-                          ShaderTranslator* translator,
-                          FeatureInfo* feature_info);
-
  private:
   friend class Program;
 
diff --git a/gpu/command_buffer/service/program_manager_unittest.cc b/gpu/command_buffer/service/program_manager_unittest.cc
index f7598c8..90ce0af 100644
--- a/gpu/command_buffer/service/program_manager_unittest.cc
+++ b/gpu/command_buffer/service/program_manager_unittest.cc
@@ -1192,18 +1192,8 @@
   }
 
   void SetShadersCompiled() {
-    cache_->ShaderCompilationSucceeded(*vertex_shader_->source(), NULL);
-    cache_->ShaderCompilationSucceeded(*fragment_shader_->source(), NULL);
     vertex_shader_->SetStatus(true, NULL, NULL);
     fragment_shader_->SetStatus(true, NULL, NULL);
-    vertex_shader_->FlagSourceAsCompiled(true);
-    fragment_shader_->FlagSourceAsCompiled(true);
-  }
-
-  void SetShadersNotCompiledButCached() {
-    SetShadersCompiled();
-    vertex_shader_->FlagSourceAsCompiled(false);
-    fragment_shader_->FlagSourceAsCompiled(false);
   }
 
   void SetProgramCached() {
@@ -1363,31 +1353,6 @@
 const GLuint ProgramManagerWithCacheTest::kFragmentShaderServiceId;
 #endif
 
-TEST_F(ProgramManagerWithCacheTest, CacheSuccessAfterShaderCompile) {
-  SetExpectationsForSuccessCompile(vertex_shader_);
-  scoped_refptr<FeatureInfo> info(new FeatureInfo());
-  manager_.DoCompileShader(vertex_shader_, NULL, info.get());
-  EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED,
-            cache_->GetShaderCompilationStatus(
-                *vertex_shader_->source(), NULL));
-}
-
-TEST_F(ProgramManagerWithCacheTest, CacheUnknownAfterShaderError) {
-  SetExpectationsForErrorCompile(vertex_shader_);
-  scoped_refptr<FeatureInfo> info(new FeatureInfo());
-  manager_.DoCompileShader(vertex_shader_, NULL, info.get());
-  EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN,
-            cache_->GetShaderCompilationStatus(
-                *vertex_shader_->source(), NULL));
-}
-
-TEST_F(ProgramManagerWithCacheTest, NoCompileWhenShaderCached) {
-  cache_->ShaderCompilationSucceeded(vertex_shader_->source()->c_str(), NULL);
-  SetExpectationsForNoCompile(vertex_shader_);
-  scoped_refptr<FeatureInfo> info(new FeatureInfo());
-  manager_.DoCompileShader(vertex_shader_, NULL, info.get());
-}
-
 TEST_F(ProgramManagerWithCacheTest, CacheProgramOnSuccessfulLink) {
   SetShadersCompiled();
   SetExpectationsForProgramLink();
@@ -1396,21 +1361,8 @@
                              base::Bind(&ShaderCacheCb)));
 }
 
-TEST_F(ProgramManagerWithCacheTest, CompileShaderOnLinkCacheMiss) {
-  SetShadersCompiled();
-  vertex_shader_->FlagSourceAsCompiled(false);
-
-  scoped_refptr<FeatureInfo> info(new FeatureInfo());
-
-  SetExpectationsForSuccessCompile(vertex_shader_);
-  SetExpectationsForProgramLink();
-  SetExpectationsForProgramCached();
-  EXPECT_TRUE(program_->Link(&shader_manager_, NULL, NULL,
-                             info.get(), base::Bind(&ShaderCacheCb)));
-}
-
 TEST_F(ProgramManagerWithCacheTest, LoadProgramOnProgramCacheHit) {
-  SetShadersNotCompiledButCached();
+  SetShadersCompiled();
   SetProgramCached();
 
   SetExpectationsForNoCompile(vertex_shader_);
@@ -1423,126 +1375,5 @@
                              base::Bind(&ShaderCacheCb)));
 }
 
-TEST_F(ProgramManagerWithCacheTest, CompileAndLinkOnProgramCacheError) {
-  SetShadersNotCompiledButCached();
-  SetProgramCached();
-
-  SetExpectationsForSuccessCompile(vertex_shader_);
-  SetExpectationsForSuccessCompile(fragment_shader_);
-  SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_FAILURE);
-  SetExpectationsForProgramLink();
-  SetExpectationsForProgramCached();
-
-  scoped_refptr<FeatureInfo> info(new FeatureInfo());
-  EXPECT_TRUE(program_->Link(&shader_manager_, NULL, NULL, info.get(),
-                             base::Bind(&ShaderCacheCb)));
-}
-
-TEST_F(ProgramManagerWithCacheTest, CorrectCompileOnSourceChangeNoCompile) {
-  SetShadersNotCompiledButCached();
-  SetProgramCached();
-
-  const GLuint kNewShaderClientId = 4;
-  const GLuint kNewShaderServiceId = 40;
-  const GLuint kNewProgramClientId = 5;
-  const GLuint kNewProgramServiceId = 50;
-
-  Shader* new_vertex_shader =
-      shader_manager_.CreateShader(kNewShaderClientId,
-                                       kNewShaderServiceId,
-                                       GL_VERTEX_SHADER);
-
-  const std::string original_source = *vertex_shader_->source();
-  new_vertex_shader->UpdateSource(original_source.c_str());
-
-  Program* program = manager_.CreateProgram(
-      kNewProgramClientId, kNewProgramServiceId);
-  ASSERT_TRUE(program != NULL);
-  program->AttachShader(&shader_manager_, new_vertex_shader);
-  program->AttachShader(&shader_manager_, fragment_shader_);
-
-  SetExpectationsForNoCompile(new_vertex_shader);
-
-  manager_.DoCompileShader(new_vertex_shader, NULL, NULL);
-  EXPECT_EQ(Shader::PENDING_DEFERRED_COMPILE,
-            new_vertex_shader->compilation_status());
-
-  new_vertex_shader->UpdateSource("different!");
-  EXPECT_EQ(original_source,
-            *new_vertex_shader->deferred_compilation_source());
-
-  EXPECT_EQ(Shader::PENDING_DEFERRED_COMPILE,
-            new_vertex_shader->compilation_status());
-  EXPECT_EQ(Shader::PENDING_DEFERRED_COMPILE,
-            fragment_shader_->compilation_status());
-
-  SetExpectationsForNoCompile(fragment_shader_);
-  SetExpectationsForNotCachingProgram(program,
-                                      new_vertex_shader,
-                                      fragment_shader_);
-  SetExpectationsForProgramLoad(kNewProgramServiceId,
-                                program,
-                                new_vertex_shader,
-                                fragment_shader_,
-                                ProgramCache::PROGRAM_LOAD_SUCCESS);
-  SetExpectationsForProgramLoadSuccess(kNewProgramServiceId);
-
-  scoped_refptr<FeatureInfo> info(new FeatureInfo());
-  EXPECT_TRUE(program->Link(&shader_manager_, NULL, NULL, info.get(),
-                            base::Bind(&ShaderCacheCb)));
-}
-
-TEST_F(ProgramManagerWithCacheTest, CorrectCompileOnSourceChangeWithCompile) {
-  SetShadersNotCompiledButCached();
-  SetProgramCached();
-
-  const GLuint kNewShaderClientId = 4;
-  const GLuint kNewShaderServiceId = 40;
-  const GLuint kNewProgramClientId = 5;
-  const GLuint kNewProgramServiceId = 50;
-
-  Shader* new_vertex_shader =
-      shader_manager_.CreateShader(kNewShaderClientId,
-                                       kNewShaderServiceId,
-                                       GL_VERTEX_SHADER);
-
-  new_vertex_shader->UpdateSource(vertex_shader_->source()->c_str());
-
-  Program* program = manager_.CreateProgram(
-      kNewProgramClientId, kNewProgramServiceId);
-  ASSERT_TRUE(program != NULL);
-  program->AttachShader(&shader_manager_, new_vertex_shader);
-  program->AttachShader(&shader_manager_, fragment_shader_);
-
-  SetExpectationsForNoCompile(new_vertex_shader);
-
-  manager_.DoCompileShader(new_vertex_shader, NULL, NULL);
-
-  const std::string differentSource = "different!";
-  new_vertex_shader->UpdateSource(differentSource.c_str());
-  SetExpectationsForSuccessCompile(new_vertex_shader);
-
-  scoped_refptr<FeatureInfo> info(new FeatureInfo());
-  manager_.DoCompileShader(new_vertex_shader, NULL, info.get());
-  EXPECT_EQ(differentSource,
-            *new_vertex_shader->deferred_compilation_source());
-
-  EXPECT_EQ(Shader::COMPILED,
-            new_vertex_shader->compilation_status());
-  EXPECT_EQ(Shader::PENDING_DEFERRED_COMPILE,
-            fragment_shader_->compilation_status());
-
-  // so we don't recompile because we were pending originally
-  SetExpectationsForNoCompile(new_vertex_shader);
-  SetExpectationsForSuccessCompile(fragment_shader_);
-  SetExpectationsForProgramCached(program,
-                                  new_vertex_shader,
-                                  fragment_shader_);
-  SetExpectationsForProgramLink(kNewProgramServiceId);
-
-  EXPECT_TRUE(program->Link(&shader_manager_, NULL, NULL,
-                            info.get(), base::Bind(&ShaderCacheCb)));
-}
-
 }  // namespace gles2
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/shader_manager.cc b/gpu/command_buffer/service/shader_manager.cc
index 590b3a2..a95b04c 100644
--- a/gpu/command_buffer/service/shader_manager.cc
+++ b/gpu/command_buffer/service/shader_manager.cc
@@ -16,8 +16,7 @@
       : use_count_(0),
         service_id_(service_id),
         shader_type_(shader_type),
-        valid_(false),
-        compilation_status_(NOT_COMPILED) {
+        valid_(false) {
 }
 
 Shader::~Shader() {
@@ -50,6 +49,11 @@
     uniform_map_.clear();
     name_map_.clear();
   }
+  if (valid && source_.get()) {
+    signature_source_.reset(new std::string(source_->c_str()));
+  } else {
+    signature_source_.reset();
+  }
 }
 
 const Shader::VariableInfo*
diff --git a/gpu/command_buffer/service/shader_manager.h b/gpu/command_buffer/service/shader_manager.h
index 31d5572..bc68868 100644
--- a/gpu/command_buffer/service/shader_manager.h
+++ b/gpu/command_buffer/service/shader_manager.h
@@ -26,19 +26,7 @@
  public:
   typedef ShaderTranslator::VariableInfo VariableInfo;
 
-  enum CompilationStatus {
-    NOT_COMPILED,
-    // We're pending compilation for a cache hit with the program cache.
-    PENDING_DEFERRED_COMPILE,
-    COMPILED
-  };
-
   void UpdateSource(const char* source) {
-    // If the source is flagged as compiled, then store our previous source
-    // for deferred compile and caching.
-    if (!deferred_compilation_source_.get()) {
-      deferred_compilation_source_.reset(source_.release());
-    }
     source_.reset(source ? new std::string(source) : NULL);
   }
 
@@ -63,31 +51,14 @@
     return translated_source_.get();
   }
 
+  const std::string* signature_source() const {
+    return signature_source_.get();
+  }
+
   void SetStatus(
       bool valid, const char* log,
       ShaderTranslatorInterface* translator);
 
-  CompilationStatus compilation_status() const {
-    return compilation_status_;
-  }
-
-  // The source that was used when the user called CompileShader.
-  // This is used for a deferred compile and in the program cache
-  const std::string* deferred_compilation_source() const {
-    return deferred_compilation_source_.get() != NULL ?
-        deferred_compilation_source_.get() :
-        source_.get();
-  }
-
-  // Resets our deferred compilation source and stores if the source was
-  // actually compiled, or if we're expecting a cache hit
-  void FlagSourceAsCompiled(bool actually_compiled) {
-    compilation_status_ = actually_compiled ?
-        COMPILED :
-        PENDING_DEFERRED_COMPILE;
-    deferred_compilation_source_.reset();
-  }
-
   const VariableInfo* GetAttribInfo(const std::string& name) const;
   const VariableInfo* GetUniformInfo(const std::string& name) const;
 
@@ -165,6 +136,9 @@
   // The shader source as passed to glShaderSource.
   scoped_ptr<std::string> source_;
 
+  // The source the last compile used.
+  scoped_ptr<std::string> signature_source_;
+
   // The translated shader source.
   scoped_ptr<std::string> translated_source_;
 
@@ -177,12 +151,6 @@
 
   // The name hashing info when the shader was last compiled.
   NameMap name_map_;
-
-  // The current compilation status of the shader
-  CompilationStatus compilation_status_;
-
-  // Holds on to the source for a deferred compile.
-  scoped_ptr<std::string> deferred_compilation_source_;
 };
 
 // Tracks the Shaders.
diff --git a/gpu/command_buffer/service/shader_manager_unittest.cc b/gpu/command_buffer/service/shader_manager_unittest.cc
index 0971bf1..a225a3c 100644
--- a/gpu/command_buffer/service/shader_manager_unittest.cc
+++ b/gpu/command_buffer/service/shader_manager_unittest.cc
@@ -248,45 +248,5 @@
   EXPECT_TRUE(shader2 == NULL);
 }
 
-TEST_F(ShaderManagerTest, ShaderInfoStoreCompilationStatus) {
-  const GLuint kClientId = 1;
-  const GLuint kServiceId = 11;
-  const GLenum kShaderType = GL_VERTEX_SHADER;
-  Shader* shader = manager_.CreateShader(
-      kClientId, kServiceId, kShaderType);
-  ASSERT_TRUE(shader != NULL);
-
-  EXPECT_EQ(Shader::NOT_COMPILED,
-            shader->compilation_status());
-  shader->UpdateSource("original source");
-  EXPECT_EQ(Shader::NOT_COMPILED,
-            shader->compilation_status());
-  shader->FlagSourceAsCompiled(false);
-  EXPECT_EQ(Shader::PENDING_DEFERRED_COMPILE,
-            shader->compilation_status());
-  shader->FlagSourceAsCompiled(true);
-  EXPECT_EQ(Shader::COMPILED,
-            shader->compilation_status());
-}
-
-TEST_F(ShaderManagerTest, ShaderInfoStoreDeferredSource) {
-  const GLuint kClientId = 1;
-  const GLuint kServiceId = 11;
-  const GLenum kShaderType = GL_VERTEX_SHADER;
-  Shader* shader = manager_.CreateShader(
-      kClientId, kServiceId, kShaderType);
-  ASSERT_TRUE(shader != NULL);
-
-  shader->UpdateSource("original source");
-  shader->FlagSourceAsCompiled(false);
-
-  EXPECT_EQ("original source", *shader->deferred_compilation_source());
-  shader->UpdateSource("different!");
-  EXPECT_EQ("original source", *shader->deferred_compilation_source());
-
-  shader->FlagSourceAsCompiled(true);
-  EXPECT_EQ("different!", *shader->deferred_compilation_source());
-}
-
 }  // namespace gles2
 }  // namespace gpu
diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h
index 745acb0..f583301 100644
--- a/ipc/ipc_message_start.h
+++ b/ipc/ipc_message_start.h
@@ -86,7 +86,6 @@
   WebSocketMsgStart,
   NaClHostMsgStart,
   WebRTCIdentityMsgStart,
-  EncodedVideoCaptureMsgStart,
   LocalDiscoveryMsgStart,
   PowerMonitorMsgStart,
   LastIPCMsgStart      // Must come last.
diff --git a/media/base/encoded_bitstream_buffer.cc b/media/base/encoded_bitstream_buffer.cc
deleted file mode 100644
index 3689015..0000000
--- a/media/base/encoded_bitstream_buffer.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "media/base/encoded_bitstream_buffer.h"
-
-#include "base/logging.h"
-
-namespace media {
-
-EncodedBitstreamBuffer::EncodedBitstreamBuffer(
-    int buffer_id,
-    uint8* buffer,
-    uint32 size,
-    base::SharedMemoryHandle handle,
-    const media::BufferEncodingMetadata& metadata,
-    const base::Closure& destroy_cb)
-    : buffer_id_(buffer_id),
-      buffer_(buffer),
-      size_(size),
-      shared_memory_handle_(handle),
-      metadata_(metadata),
-      destroy_cb_(destroy_cb) {
-}
-
-EncodedBitstreamBuffer::~EncodedBitstreamBuffer() {
-  destroy_cb_.Run();
-}
-
-int EncodedBitstreamBuffer::buffer_id() const {
-  return buffer_id_;
-}
-
-const uint8* EncodedBitstreamBuffer::buffer() const {
-  return buffer_;
-}
-
-uint32 EncodedBitstreamBuffer::size() const {
-  return size_;
-}
-
-base::SharedMemoryHandle EncodedBitstreamBuffer::shared_memory_handle() const {
-  return shared_memory_handle_;
-}
-
-const media::BufferEncodingMetadata& EncodedBitstreamBuffer::metadata() const {
-  return metadata_;
-}
-
-}  // namespace media
diff --git a/media/base/encoded_bitstream_buffer.h b/media/base/encoded_bitstream_buffer.h
deleted file mode 100644
index bfefbe5..0000000
--- a/media/base/encoded_bitstream_buffer.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MEDIA_BASE_ENCODED_BITSTREAM_BUFFER_H_
-#define MEDIA_BASE_ENCODED_BITSTREAM_BUFFER_H_
-
-#include "base/callback_forward.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/shared_memory.h"
-#include "base/time/time.h"
-#include "media/base/media_export.h"
-#include "media/video/video_encode_types.h"
-
-namespace media {
-
-// General encoded video bitstream buffer.
-class MEDIA_EXPORT EncodedBitstreamBuffer :
-    public base::RefCountedThreadSafe<EncodedBitstreamBuffer> {
- public:
-  EncodedBitstreamBuffer(int buffer_id,
-                         uint8* buffer,
-                         uint32 size,
-                         base::SharedMemoryHandle handle,
-                         const media::BufferEncodingMetadata& metadata,
-                         const base::Closure& destroy_cb);
-  // Accessors for properties.
-  int buffer_id() const;
-  const uint8* buffer() const;
-  uint32 size() const;
-  base::SharedMemoryHandle shared_memory_handle() const;
-  const media::BufferEncodingMetadata& metadata() const;
-
- protected:
-  // Destructor that deallocates the buffers.
-  virtual ~EncodedBitstreamBuffer();
-  friend class base::RefCountedThreadSafe<EncodedBitstreamBuffer>;
-
- private:
-  int buffer_id_;
-  uint8* buffer_;
-  uint32 size_;
-  const base::SharedMemoryHandle shared_memory_handle_;
-  media::BufferEncodingMetadata metadata_;
-  const base::Closure destroy_cb_;
-
-  DISALLOW_COPY_AND_ASSIGN(EncodedBitstreamBuffer);
-};
-
-}  // namespace media
-
-#endif  // MEDIA_BASE_ENCODED_BITSTREAM_BUFFER_H_
diff --git a/media/media.gyp b/media/media.gyp
index cb77036..b2bde3d 100644
--- a/media/media.gyp
+++ b/media/media.gyp
@@ -257,8 +257,6 @@
         'base/demuxer_stream.h',
         'base/djb2.cc',
         'base/djb2.h',
-        'base/encoded_bitstream_buffer.cc',
-        'base/encoded_bitstream_buffer.h',
         'base/filter_collection.cc',
         'base/filter_collection.h',
         'base/media.cc',
@@ -412,12 +410,10 @@
         'video/capture/win/video_capture_device_mf_win.h',
         'video/capture/win/video_capture_device_win.cc',
         'video/capture/win/video_capture_device_win.h',
-        'video/encoded_video_source.h',
         'video/picture.cc',
         'video/picture.h',
         'video/video_decode_accelerator.cc',
         'video/video_decode_accelerator.h',
-        'video/video_encode_types.h',
         'webm/webm_audio_client.cc',
         'webm/webm_audio_client.h',
         'webm/webm_cluster_parser.cc',
diff --git a/media/media.target.darwin-arm.mk b/media/media.target.darwin-arm.mk
index f27ae0b..9a453af 100644
--- a/media/media.target.darwin-arm.mk
+++ b/media/media.target.darwin-arm.mk
@@ -89,7 +89,6 @@
 	media/base/demuxer.cc \
 	media/base/demuxer_stream.cc \
 	media/base/djb2.cc \
-	media/base/encoded_bitstream_buffer.cc \
 	media/base/filter_collection.cc \
 	media/base/media.cc \
 	media/base/media_keys.cc \
diff --git a/media/media.target.darwin-mips.mk b/media/media.target.darwin-mips.mk
index 236c0f3..0df3761 100644
--- a/media/media.target.darwin-mips.mk
+++ b/media/media.target.darwin-mips.mk
@@ -89,7 +89,6 @@
 	media/base/demuxer.cc \
 	media/base/demuxer_stream.cc \
 	media/base/djb2.cc \
-	media/base/encoded_bitstream_buffer.cc \
 	media/base/filter_collection.cc \
 	media/base/media.cc \
 	media/base/media_keys.cc \
diff --git a/media/media.target.darwin-x86.mk b/media/media.target.darwin-x86.mk
index ec84b75..665877b 100644
--- a/media/media.target.darwin-x86.mk
+++ b/media/media.target.darwin-x86.mk
@@ -89,7 +89,6 @@
 	media/base/demuxer.cc \
 	media/base/demuxer_stream.cc \
 	media/base/djb2.cc \
-	media/base/encoded_bitstream_buffer.cc \
 	media/base/filter_collection.cc \
 	media/base/media.cc \
 	media/base/media_keys.cc \
diff --git a/media/media.target.linux-arm.mk b/media/media.target.linux-arm.mk
index f27ae0b..9a453af 100644
--- a/media/media.target.linux-arm.mk
+++ b/media/media.target.linux-arm.mk
@@ -89,7 +89,6 @@
 	media/base/demuxer.cc \
 	media/base/demuxer_stream.cc \
 	media/base/djb2.cc \
-	media/base/encoded_bitstream_buffer.cc \
 	media/base/filter_collection.cc \
 	media/base/media.cc \
 	media/base/media_keys.cc \
diff --git a/media/media.target.linux-mips.mk b/media/media.target.linux-mips.mk
index 236c0f3..0df3761 100644
--- a/media/media.target.linux-mips.mk
+++ b/media/media.target.linux-mips.mk
@@ -89,7 +89,6 @@
 	media/base/demuxer.cc \
 	media/base/demuxer_stream.cc \
 	media/base/djb2.cc \
-	media/base/encoded_bitstream_buffer.cc \
 	media/base/filter_collection.cc \
 	media/base/media.cc \
 	media/base/media_keys.cc \
diff --git a/media/media.target.linux-x86.mk b/media/media.target.linux-x86.mk
index ec84b75..665877b 100644
--- a/media/media.target.linux-x86.mk
+++ b/media/media.target.linux-x86.mk
@@ -89,7 +89,6 @@
 	media/base/demuxer.cc \
 	media/base/demuxer_stream.cc \
 	media/base/djb2.cc \
-	media/base/encoded_bitstream_buffer.cc \
 	media/base/filter_collection.cc \
 	media/base/media.cc \
 	media/base/media_keys.cc \
diff --git a/media/video/encoded_video_source.h b/media/video/encoded_video_source.h
deleted file mode 100644
index f0c9a13..0000000
--- a/media/video/encoded_video_source.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MEDIA_VIDEO_ENCODED_VIDEO_SOURCE_H_
-#define MEDIA_VIDEO_ENCODED_VIDEO_SOURCE_H_
-
-#include "base/memory/ref_counted.h"
-#include "media/base/encoded_bitstream_buffer.h"
-#include "media/video/video_encode_types.h"
-
-namespace media {
-
-// Class to represent any encoded video source. Anything that provides encoded
-// video can be an EncodedVideoSource. Notable examples of this can be video
-// encoder and webcam that has encoding capabilities.
-// TODO(hshi): merge this with VEA interface. http://crbug.com/248334.
-class EncodedVideoSource {
- public:
-  class Client {
-   public:
-    // Notifies client that bitstream is opened successfully. The |params|
-    // contains the actual encoding parameters chosen by the browser process.
-    // It may be different from the params requested in OpenBitstream().
-    virtual void OnOpened(const VideoEncodingParameters& params) = 0;
-
-    // Notifies client that bitstream is closed. After this call it is
-    // guaranteed that client will not receive further calls.
-    virtual void OnClosed() = 0;
-
-    // Delivers an encoded bitstream buffer to the client.
-    virtual void OnBufferReady(
-        scoped_refptr<const EncodedBitstreamBuffer> buffer) = 0;
-
-    // Notifies client that encoding parameters has changed. The |params|
-    // contains the current encoding parameters chosen by the browser process.
-    // It may be different from the params requested in TrySetBitstreamConfig().
-    virtual void OnConfigChanged(
-        const RuntimeVideoEncodingParameters& params) = 0;
-  };
-
-  // Callback is invoked once RequestCapabilities() is complete.
-  typedef base::Callback<void(const VideoEncodingCapabilities& capabilities)>
-      RequestCapabilitiesCallback;
-
-  // RequestCapabilities initiates an asynchronous query for the types of
-  // encoded bitstream supported by the encoder. This call should be invoked
-  // only once. EncodedVideoSource will invoke |callback| when capabilities
-  // become available.
-  virtual void RequestCapabilities(
-      const RequestCapabilitiesCallback& callback) = 0;
-
-  // OpenBitstream opens the bitstream on the encoded video source. Only one
-  // bitstream can be opened for an encoded video source.
-  virtual void OpenBitstream(Client* client,
-                             const VideoEncodingParameters& params) = 0;
-
-  // CloseBitstream closes the bitstream.
-  virtual void CloseBitstream() = 0;
-
-  // ReturnBitstreamBuffer notifies that the data within the buffer has been
-  // processed and it can be reused to encode upcoming bitstream.
-  virtual void ReturnBitstreamBuffer(
-      scoped_refptr<const media::EncodedBitstreamBuffer> buffer) = 0;
-
-  // TrySetBitstreamConfig requests to change encoding parameters. Old config
-  // must be considered valid until OnConfigChanged is invoked on the client
-  // signaling successful change.
-  virtual void TrySetBitstreamConfig(
-      const RuntimeVideoEncodingParameters& params) = 0;
-
-  // RequestKeyFrame requests a key frame.
-  virtual void RequestKeyFrame() = 0;
-};
-
-}  // namespace media
-
-#endif  // MEDIA_VIDEO_ENCODED_VIDEO_SOURCE_H_
-
diff --git a/media/video/video_encode_types.h b/media/video/video_encode_types.h
deleted file mode 100644
index 15effab..0000000
--- a/media/video/video_encode_types.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#ifndef MEDIA_VIDEO_VIDEO_ENCODE_TYPES_H_
-#define MEDIA_VIDEO_VIDEO_ENCODE_TYPES_H_
-
-#include <map>
-#include <ostream>
-#include <vector>
-
-#include "base/time/time.h"
-#include "media/base/video_decoder_config.h"
-#include "ui/gfx/size.h"
-
-namespace media {
-
-// Data to represent limitations for a particular encoder config.
-// The |max_bitrate| value is in bits per second.
-struct VideoEncodingConfig {
-  VideoCodec codec_type;
-  std::string codec_name;
-  gfx::Size max_resolution;
-  uint32 max_frames_per_second;
-  uint32 max_bitrate;
-};
-
-typedef std::vector<VideoEncodingConfig> VideoEncodingCapabilities;
-
-// Encoding parameters that can be configured during streaming without removing
-// the bitstream first. The |target_bitrate| and |max_bitrate| values are in
-// bits per second.
-struct RuntimeVideoEncodingParameters {
-  uint32 target_bitrate;
-  uint32 max_bitrate;
-  uint32 frames_per_second;
-};
-
-// Generic video encoding parameters to be configured during initialization
-// time.
-struct VideoEncodingParameters {
-  std::string codec_name;
-  gfx::Size resolution;
-  RuntimeVideoEncodingParameters runtime_params;
-};
-
-struct BufferEncodingMetadata {
-  base::Time timestamp;
-  bool key_frame;
-};
-
-}  // namespace media
-
-#endif  // MEDIA_VIDEO_VIDEO_ENCODE_TYPES_H_
diff --git a/native_client_sdk/src/build_tools/sdk_files.list b/native_client_sdk/src/build_tools/sdk_files.list
index c3fd830..f4e890a 100644
--- a/native_client_sdk/src/build_tools/sdk_files.list
+++ b/native_client_sdk/src/build_tools/sdk_files.list
@@ -314,6 +314,8 @@
 include/nacl_io/error.h
 include/nacl_io/event_emitter.h
 include/nacl_io/event_listener.h
+include/nacl_io/error.h
+include/nacl_io/host_resolver.h
 include/nacl_io/inode_pool.h
 include/nacl_io/ioctl.h
 include/nacl_io/kernel_handle.h
@@ -340,6 +342,7 @@
 include/nacl_io/osmman.h
 include/nacl_io/ossocket.h
 include/nacl_io/osstat.h
+include/nacl_io/ostermios.h
 include/nacl_io/ostime.h
 include/nacl_io/ostypes.h
 include/nacl_io/osunistd.h
@@ -358,6 +361,7 @@
 include/newlib/poll.h
 include/newlib/sys/select.h
 include/newlib/sys/socket.h
+include/newlib/sys/termios.h
 include/newlib/sys/utsname.h
 include/pnacl/arpa/inet.h
 include/pnacl/netdb.h
@@ -366,6 +370,7 @@
 include/pnacl/poll.h
 include/pnacl/sys/select.h
 include/pnacl/sys/socket.h
+include/pnacl/sys/termios.h
 include/pnacl/sys/utsname.h
 include/ppapi/c/dev/deprecated_bool.h
 include/ppapi/c/dev/pp_cursor_type_dev.h
@@ -832,7 +837,8 @@
 src/Makefile
 src/nacl_io/event_emitter.cc
 src/nacl_io/event_listener.cc
-src/nacl_io/inet_ntoa.cc
+src/nacl_io/h_errno.cc
+src/nacl_io/host_resolver.cc
 src/nacl_io/kernel_handle.cc
 src/nacl_io/kernel_intercept.cc
 src/nacl_io/kernel_object.cc
@@ -867,6 +873,8 @@
 src/nacl_io/syscalls/getcwd.c
 src/nacl_io/syscalls/getdents.c
 src/nacl_io/syscalls/getwd.c
+src/nacl_io/syscalls/inet_ntoa.cc
+src/nacl_io/syscalls/inet_ntop.cc
 src/nacl_io/syscalls/ioctl.c
 src/nacl_io/syscalls/isatty.c
 src/nacl_io/syscalls/lchown.c
@@ -877,6 +885,9 @@
 src/nacl_io/syscalls/remove.c
 src/nacl_io/syscalls/rmdir.c
 src/nacl_io/syscalls/select.c
+src/nacl_io/syscalls/tcflush.c
+src/nacl_io/syscalls/tcgetattr.c
+src/nacl_io/syscalls/tcsetattr.c
 src/nacl_io/syscalls/umount.c
 src/nacl_io/syscalls/uname.c
 src/nacl_io/syscalls/unlink.c
diff --git a/native_client_sdk/src/examples/demo/nacl_io/example.dsc b/native_client_sdk/src/examples/demo/nacl_io/example.dsc
index 104c1dd..4d1cf02 100644
--- a/native_client_sdk/src/examples/demo/nacl_io/example.dsc
+++ b/native_client_sdk/src/examples/demo/nacl_io/example.dsc
@@ -25,5 +25,8 @@
   'GROUP': 'Demo',
   'PERMISSIONS': [
     'unlimitedStorage'
+  ],
+  'SOCKET_PERMISSIONS': [
+    'resolve-host'
   ]
 }
diff --git a/native_client_sdk/src/examples/demo/nacl_io/example.js b/native_client_sdk/src/examples/demo/nacl_io/example.js
index ef69aa6..87eedd5 100644
--- a/native_client_sdk/src/examples/demo/nacl_io/example.js
+++ b/native_client_sdk/src/examples/demo/nacl_io/example.js
@@ -194,6 +194,22 @@
   common.logMessage('Directory ' + dirname + ' created successfully.');
 }
 
+function gethostbyname(e) {
+  var name = document.getElementById('gethostbynameName').value;
+  nacl_module.postMessage(makeCall('gethostbyname', name));
+}
+
+
+function gethostbynameResult(name, addr_type) {
+  common.logMessage('gethostbyname returned successfully\n');
+  common.logMessage('h_name = ' + name + '.\n');
+  common.logMessage('h_addr_type = ' + addr_type + '.\n');
+  for (var i = 2; i < arguments.length; i++) {
+    common.logMessage('Address number ' + (i-1) + ' = ' + arguments[i] + '.\n');
+  }
+  common.logMessage('\n');
+}
+
 /**
  * Return true when |s| starts with the string |prefix|.
  *
diff --git a/native_client_sdk/src/examples/demo/nacl_io/handlers.c b/native_client_sdk/src/examples/demo/nacl_io/handlers.c
index 9182676..2ec6559 100644
--- a/native_client_sdk/src/examples/demo/nacl_io/handlers.c
+++ b/native_client_sdk/src/examples/demo/nacl_io/handlers.c
@@ -5,13 +5,17 @@
 
 #include "handlers.h"
 
+#include <arpa/inet.h>
 #include <assert.h>
 #include <errno.h>
+#include <netdb.h>
+#include <netinet/in.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include <sys/types.h>
+#include <sys/socket.h>
 #include <sys/stat.h>
 
 #include "nacl_io/osdirent.h"
@@ -641,3 +645,82 @@
   *output = PrintfToNewString("mkdir\1%s", dirname);
   return 0;
 }
+
+/**
+ * Handle a call to gethostbyname() made by JavaScript.
+ *
+ * gethostbyname expects 1 parameter:
+ *   0: The name of the host to look up.
+ * on success, gethostbyname returns a result in |output| separated by \1:
+ *   0: "gethostbyname"
+ *   1: Host name
+ *   2: Address type (either "AF_INET" or "AF_INET6")
+ *   3. The first address.
+ *   4+ The second, third, etc. addresses.
+ * on failure, gethostbyname returns an error string in |output|.
+ *
+ * @param[in] num_params The number of params in |params|.
+ * @param[in] params An array of strings, parameters to this function.
+ * @param[out] output A string to write informational function output to.
+ * @return An errorcode; 0 means success, anything else is a failure. */
+int HandleGethostbyname(int num_params, char** params, char** output) {
+  struct hostent* info;
+  struct in_addr **addr_list;
+  const char* addr_type;
+  const char* name;
+  char inet6_addr_str[INET6_ADDRSTRLEN];
+  int non_variable_len, output_len;
+  int current_pos;
+  int i;
+
+  if (num_params != 1) {
+    *output = PrintfToNewString("Error: gethostbyname takes 1 parameter.");
+    return 1;
+  }
+
+  name = params[0];
+
+  info = gethostbyname(name);
+  if (!info) {
+    *output = PrintfToNewString("Error: gethostbyname failed, error is \"%s\"",
+                                hstrerror(h_errno));
+    return 2;
+  }
+
+  addr_type = info->h_addrtype == AF_INET ? "AF_INET" : "AF_INET6";
+
+  non_variable_len = strlen("gethostbyname") + 1
+    + strlen(info->h_name) + 1 + strlen(addr_type);
+  output_len = non_variable_len;
+
+  addr_list = (struct in_addr **)info->h_addr_list;
+  for (i = 0; addr_list[i] != NULL; i++) {
+    output_len += 1; // for the divider
+    if (info->h_addrtype == AF_INET) {
+      output_len += strlen(inet_ntoa(*addr_list[i]));
+    } else { // IPv6
+      inet_ntop(AF_INET6, addr_list[i], inet6_addr_str, INET6_ADDRSTRLEN);
+      output_len += strlen(inet6_addr_str);
+    }
+  }
+
+  *output = (char*) calloc(output_len + 1, 1);
+  if (!*output) {
+    *output = PrintfToNewString("Error: out of memory.");
+    return 3;
+  }
+  snprintf(*output, non_variable_len + 1, "gethostbyname\1%s\1%s",
+           info->h_name, addr_type);
+
+  current_pos = non_variable_len;
+  for (i = 0; addr_list[i] != NULL; i++) {
+    if (info->h_addrtype == AF_INET) {
+      current_pos += sprintf(*output + current_pos,
+                             "\1%s", inet_ntoa(*addr_list[i]));
+    } else { // IPv6
+      inet_ntop(AF_INET6, addr_list[i], inet6_addr_str, INET6_ADDRSTRLEN);
+      sprintf(*output + current_pos, "\1%s", inet6_addr_str);
+    }
+  }
+  return 0;
+}
diff --git a/native_client_sdk/src/examples/demo/nacl_io/handlers.h b/native_client_sdk/src/examples/demo/nacl_io/handlers.h
index 0698707..595f96a 100644
--- a/native_client_sdk/src/examples/demo/nacl_io/handlers.h
+++ b/native_client_sdk/src/examples/demo/nacl_io/handlers.h
@@ -20,5 +20,6 @@
 int HandleReaddir(int num_params, char** params, char** output);
 int HandleClosedir(int num_params, char** params, char** output);
 int HandleMkdir(int num_params, char** params, char** output);
+int HandleGethostbyname(int num_params, char** params, char** output);
 
 #endif /* HANDLERS_H_ */
diff --git a/native_client_sdk/src/examples/demo/nacl_io/index.html b/native_client_sdk/src/examples/demo/nacl_io/index.html
index 42bc1e7..1b132c1 100644
--- a/native_client_sdk/src/examples/demo/nacl_io/index.html
+++ b/native_client_sdk/src/examples/demo/nacl_io/index.html
@@ -16,8 +16,8 @@
   <h1>{{title}}</h1>
   <h2>Status: <code id="statusField">NO-STATUS</code></h2>
   <p>
-    This example shows how you can use standard C library file operation
-    functions in Native Client using a library called nacl_io.
+    This example shows how you can use standard C library file and socket
+    operation functions in Native Client using a library called nacl_io.
   </p>
   <p>
     nacl_io provides a virtual filesystem. The filesystem can be "mounted"
@@ -37,18 +37,25 @@
           /dev/zero, etc.</li>
     </ol>
   </p>
+  <p>
+    nacl_io also provides a (currently incomplete) posix socket api. Like the
+    virtual filesystem, it is an abstraction layer on top of ppapi. To use this
+    API, an app must be a packaged app with the appropriate socket permissions
+    specified in the manifest file.
+  <hr>
+  <p><b>File Operations:</b></p>
   <div>
     <span>
-      <input type="radio" id="radiofopen" name="group" checked="checked">fopen
-      <input type="radio" id="radiofclose" name="group">fclose
-      <input type="radio" id="radiofread" name="group">fread
-      <input type="radio" id="radiofwrite" name="group">fwrite
-      <input type="radio" id="radiofseek" name="group">fseek
-      <input type="radio" id="radiostat" name="group">stat
-      <input type="radio" id="radioopendir" name="group">opendir
-      <input type="radio" id="radioreaddir" name="group">readdir
-      <input type="radio" id="radioclosedir" name="group">closedir
-      <input type="radio" id="radiomkdir" name="group">mkdir
+      <input type="radio" id="radiofopen" name="filegroup" checked="checked">fopen
+      <input type="radio" id="radiofclose" name="filegroup">fclose
+      <input type="radio" id="radiofread" name="filegroup">fread
+      <input type="radio" id="radiofwrite" name="filegroup">fwrite
+      <input type="radio" id="radiofseek" name="filegroup">fseek
+      <input type="radio" id="radiostat" name="filegroup">stat
+      <input type="radio" id="radioopendir" name="filegroup">opendir
+      <input type="radio" id="radioreaddir" name="filegroup">readdir
+      <input type="radio" id="radioclosedir" name="filegroup">closedir
+      <input type="radio" id="radiomkdir" name="filegroup">mkdir
     </span>
   </div>
   <div class="function" id="fopen">
@@ -137,6 +144,23 @@
       <button>mkdir</button>
     </span>
   </div>
+  <hr>
+  <p><b>Socket Operations:</b></p>
+  <div>
+    <span>
+      <input type="radio" id="radiogethostbyname" name="socketgroup" checked="checked">gethostbyname
+    </span>
+  </div>
+  <div class="function" id="gethostbyname">
+    <span>
+      Name:
+      <input type="text" id="gethostbynameName">
+      <button>gethostbyname</button>
+    </span>
+  </div>
+
+  <hr>
+  <p><b>Log:</b></p>
   <pre id="log" style="font-weight: bold"></pre>
   <!-- The NaCl plugin will be embedded inside the element with id "listener".
       See common.js.-->
diff --git a/native_client_sdk/src/examples/demo/nacl_io/nacl_io_demo.c b/native_client_sdk/src/examples/demo/nacl_io/nacl_io_demo.c
index e809e7a..9a1babd 100644
--- a/native_client_sdk/src/examples/demo/nacl_io/nacl_io_demo.c
+++ b/native_client_sdk/src/examples/demo/nacl_io/nacl_io_demo.c
@@ -52,6 +52,7 @@
   {"readdir", HandleReaddir},
   {"closedir", HandleClosedir},
   {"mkdir", HandleMkdir},
+  {"gethostbyname", HandleGethostbyname},
   {NULL, NULL},
 };
 
diff --git a/native_client_sdk/src/libraries/nacl_io/h_errno.cc b/native_client_sdk/src/libraries/nacl_io/h_errno.cc
new file mode 100644
index 0000000..5f328ed
--- /dev/null
+++ b/native_client_sdk/src/libraries/nacl_io/h_errno.cc
@@ -0,0 +1,15 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "nacl_io/ossocket.h"
+
+#if defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__)
+
+static __thread int __h_errno__;
+
+extern "C" int *__h_errno_location() {
+  return &__h_errno__;
+}
+
+#endif  // defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__)
diff --git a/native_client_sdk/src/libraries/nacl_io/host_resolver.cc b/native_client_sdk/src/libraries/nacl_io/host_resolver.cc
new file mode 100644
index 0000000..f059f9a
--- /dev/null
+++ b/native_client_sdk/src/libraries/nacl_io/host_resolver.cc
@@ -0,0 +1,226 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "nacl_io/host_resolver.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sstream>
+#include <string>
+
+#include "nacl_io/kernel_proxy.h"
+#include "nacl_io/ossocket.h"
+#include "nacl_io/pepper_interface.h"
+
+#ifdef PROVIDES_SOCKET_API
+
+namespace nacl_io {
+
+HostResolver::HostResolver() : hostent_(), ppapi_(NULL) {
+}
+
+HostResolver::~HostResolver() {
+  hostent_cleanup();
+}
+
+void HostResolver::Init(PepperInterface* ppapi) {
+  ppapi_ = ppapi;
+}
+
+struct hostent* HostResolver::gethostbyname(const char* name) {
+  h_errno = NETDB_INTERNAL;
+
+  if (NULL == ppapi_)
+    return NULL;
+
+  HostResolverInterface* resolver_interface =
+    ppapi_->GetHostResolverInterface();
+  ScopedResource resolver(ppapi_,
+                          resolver_interface->Create(ppapi_->GetInstance()));
+
+  struct PP_CompletionCallback callback;
+  callback.func = NULL;
+  struct PP_HostResolver_Hint hint;
+  hint.family = PP_NETADDRESS_FAMILY_IPV4;
+  hint.flags = PP_HOSTRESOLVER_FLAG_CANONNAME;
+
+  int err = resolver_interface->Resolve(resolver.pp_resource(),
+                                        name, 0, &hint, callback);
+  if (err) {
+    switch (err) {
+    case PP_ERROR_NOACCESS:
+      h_errno = NO_RECOVERY;
+      break;
+    case PP_ERROR_NAME_NOT_RESOLVED:
+      h_errno = HOST_NOT_FOUND;
+      break;
+    default:
+      h_errno = NETDB_INTERNAL;
+      break;
+    }
+    return NULL;
+  }
+
+  // We use a single hostent struct for all calls to to gethostbyname
+  // (as explicitly permitted by the spec - gethostbyname is NOT supposed to
+  // be threadsafe!), so the first thing we do is free all the malloced data
+  // left over from the last call.
+  hostent_cleanup();
+
+  PP_Var name_var =
+    resolver_interface->GetCanonicalName(resolver.pp_resource());
+  if (PP_VARTYPE_STRING != name_var.type)
+    return NULL;
+
+  uint32_t len;
+  const char* name_ptr = ppapi_->GetVarInterface()->VarToUtf8(name_var, &len);
+  if (NULL == name_ptr)
+    return NULL;
+  if (0 == len) {
+    // Sometimes GetCanonicalName gives up more easily than gethostbyname should
+    // (for example, it returns "" when asked to resolve "localhost"), so if we
+    // get an empty string we copy over the input string instead.
+    len = strlen(name);
+    name_ptr = name;
+  }
+  hostent_.h_name = static_cast<char*>(malloc(len + 1));
+  if (NULL == hostent_.h_name)
+    return NULL;
+  memcpy(hostent_.h_name, name_ptr, len);
+  hostent_.h_name[len] = '\0';
+
+  // Aliases aren't supported at the moment, so we just make an empty list.
+  hostent_.h_aliases = static_cast<char**>(malloc(sizeof(char*)));
+  if (NULL == hostent_.h_aliases)
+    return NULL;
+  hostent_.h_aliases[0] = NULL;
+
+  NetAddressInterface* netaddr_interface = ppapi_->GetNetAddressInterface();
+  PP_Resource addr =
+      resolver_interface->GetNetAddress(resolver.pp_resource(), 0);
+  if (!PP_ToBool(netaddr_interface->IsNetAddress(addr)))
+    return NULL;
+
+  switch (netaddr_interface->GetFamily(addr)) {
+    case PP_NETADDRESS_FAMILY_IPV4:
+      hostent_.h_addrtype = AF_INET;
+      hostent_.h_length = 4;
+      break;
+    case PP_NETADDRESS_FAMILY_IPV6:
+      hostent_.h_addrtype = AF_INET6;
+      hostent_.h_length = 16;
+      break;
+    default:
+      return NULL;
+  }
+
+  const uint32_t num_addresses =
+    resolver_interface->GetNetAddressCount(resolver.pp_resource());
+  if (0 == num_addresses)
+    return NULL;
+  hostent_.h_addr_list =
+    static_cast<char**>(calloc(num_addresses + 1, sizeof(char*)));
+  if (NULL == hostent_.h_addr_list)
+    return NULL;
+
+  for (uint32_t i = 0; i < num_addresses; i++) {
+    PP_Resource addr =
+      resolver_interface->GetNetAddress(resolver.pp_resource(), i);
+    if (!PP_ToBool(netaddr_interface->IsNetAddress(addr)))
+      return NULL;
+    if (AF_INET == hostent_.h_addrtype) {
+      struct PP_NetAddress_IPv4 addr_struct;
+      if (!netaddr_interface->DescribeAsIPv4Address(addr, &addr_struct)) {
+        return NULL;
+      }
+      hostent_.h_addr_list[i] = static_cast<char*>(malloc(hostent_.h_length));
+      if (NULL == hostent_.h_addr_list[i])
+        return NULL;
+      memcpy(hostent_.h_addr_list[i], addr_struct.addr, hostent_.h_length);
+    } else { // IPv6
+      struct PP_NetAddress_IPv6 addr_struct;
+      if (!netaddr_interface->DescribeAsIPv6Address(addr, &addr_struct))
+        return NULL;
+      hostent_.h_addr_list[i] = static_cast<char*>(malloc(hostent_.h_length));
+      if (NULL == hostent_.h_addr_list[i])
+        return NULL;
+      memcpy(hostent_.h_addr_list[i], addr_struct.addr, hostent_.h_length);
+    }
+  }
+  return &hostent_;
+}
+
+// Frees all of the deep pointers in a hostent struct. Called between uses of
+// gethostbyname, and when the kernel_proxy object is destroyed.
+void HostResolver::hostent_cleanup() {
+  if (NULL != hostent_.h_name) {
+    free(hostent_.h_name);
+  }
+  if (NULL != hostent_.h_aliases) {
+    for (int i = 0;  NULL != hostent_.h_aliases[i]; i++) {
+      free(hostent_.h_aliases[i]);
+    }
+    free(hostent_.h_aliases);
+  }
+  if (NULL != hostent_.h_addr_list) {
+    for (int i = 0;  NULL != hostent_.h_addr_list[i]; i++) {
+      free(hostent_.h_addr_list[i]);
+    }
+    free(hostent_.h_addr_list);
+  }
+  hostent_.h_name = NULL;
+  hostent_.h_aliases = NULL;
+  hostent_.h_addr_list = NULL;
+}
+
+void HostResolver::herror(const char* s) {
+  if (s) {
+    fprintf(stderr, "%s: ", s);
+  }
+
+  fprintf(stderr, "%s\n", hstrerror(h_errno));
+}
+
+const char* HostResolver::hstrerror(int err) {
+  // These error message texts are taken straight from the man page
+  const char* host_not_found_msg =
+    "The specified host is unknown.";
+  const char* no_address_msg =
+    "The requested name is valid but does not have an IP address.";
+  const char* no_recovery_msg =
+    "A nonrecoverable name server error occurred.";
+  const char* try_again_msg =
+    "A temporary error occurred on an authoritative name server. "
+    "Try again later.";
+  const char* internal_msg =
+    "Internal error in gethostbyname.";
+  const char* unknown_msg_base =
+    "Unknown error in gethostbyname: ";
+
+  switch (err) {
+    case HOST_NOT_FOUND:
+      return host_not_found_msg;
+    case NO_ADDRESS:
+      return no_address_msg;
+    case NO_RECOVERY:
+      return no_recovery_msg;
+    case TRY_AGAIN:
+      return try_again_msg;
+    case NETDB_INTERNAL:
+      return internal_msg;
+    default:
+      std::stringstream msg;
+      msg << unknown_msg_base << err << ".";
+
+      static std::string unknown_msg;
+      unknown_msg.assign(msg.str());
+      return unknown_msg.c_str();
+  }
+}
+
+}  // namespace nacl_io
+
+#endif  // PROVIDES_SOCKET_API
diff --git a/native_client_sdk/src/libraries/nacl_io/host_resolver.h b/native_client_sdk/src/libraries/nacl_io/host_resolver.h
new file mode 100644
index 0000000..0a942bd
--- /dev/null
+++ b/native_client_sdk/src/libraries/nacl_io/host_resolver.h
@@ -0,0 +1,37 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LIBRARIES_NACL_IO_HOST_RESOLVER_H_
+#define LIBRARIES_NACL_IO_HOST_RESOLVER_H_
+
+#include "nacl_io/ossocket.h"
+#include "nacl_io/pepper_interface.h"
+
+#ifdef PROVIDES_SOCKET_API
+
+namespace nacl_io {
+
+class HostResolver {
+ public:
+  HostResolver();
+  ~HostResolver();
+
+  void Init(PepperInterface* ppapi);
+
+  struct hostent* gethostbyname(const char* name);
+  static void herror(const char* s);
+  static const char* hstrerror(int err);
+
+ private:
+  void hostent_initialize();
+  void hostent_cleanup();
+
+  struct hostent hostent_;
+  PepperInterface *ppapi_;
+};
+
+}  // namespace nacl_io
+
+#endif  // PROVIDES_SOCKET_API
+#endif  // LIBRARIES_NACL_IO_HOST_RESOLVER_H_
diff --git a/native_client_sdk/src/libraries/nacl_io/include/sys/termios.h b/native_client_sdk/src/libraries/nacl_io/include/sys/termios.h
new file mode 100644
index 0000000..8eabbd9
--- /dev/null
+++ b/native_client_sdk/src/libraries/nacl_io/include/sys/termios.h
@@ -0,0 +1,129 @@
+/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+#ifndef SYS_TERMIOS_H_
+#define SYS_TERMIOS_H_
+
+#define IGNBRK  0000001
+#define BRKINT  0000002
+#define IGNPAR  0000004
+#define PARMRK  0000010
+#define INPCK   0000020
+#define ISTRIP  0000040
+#define INLCR   0000100
+#define IGNCR   0000200
+#define ICRNL   0000400
+#define IUCLC   0001000
+#define IXON    0002000
+#define IXANY   0004000
+#define IXOFF   0010000
+#define IMAXBEL 0020000
+#define IUTF8   0040000
+
+#define OPOST   000001
+#define OCRNL   000004
+#define ONLCR   000010
+#define ONOCR   000020
+#define ONLRET  000040
+#define TAB3    014000
+
+#define CLOCAL  004000
+#define CREAD   000200
+#define PARODD  001000
+#define CSIZE   000060
+#define CS5     0
+#define CS6     020
+#define CS7     040
+#define CS8     060
+#define CSTOPB  000100
+#define HUPCL   002000
+#define PARENB  000400
+#define PAODD   001000
+
+#define ECHO    0000010
+#define ECHOE   0000020
+#define ECHOK   0000040
+#define ECHONL  0000100
+#define ICANON  0000002
+#define IEXTEN  0100000
+#define ISIG    0000001
+#define NOFLSH  0000200
+#define TOSTOP  0000400
+#define ECHOCTL 0001000
+#define ECHOPRT 0002000
+#define ECHOKE  0004000
+#define FLUSHO  0010000
+#define PENDIN  0040000
+
+#define VINTR     0
+#define VQUIT     1
+#define VERASE    2
+#define VKILL     3
+#define VEOF      4
+#define VTIME     5
+#define VMIN      6
+#define VSWTC     7
+#define VSTART    8
+#define VSTOP     9
+#define VSUSP    10
+#define VEOL     11
+#define VREPRINT 12
+#define VDISCARD 13
+#define VWERASE  14
+#define VLNEXT   15
+#define VEOL2    16
+
+#define B0      000000
+#define B50     000001
+#define B75     000002
+#define B110    000003
+#define B134    000004
+#define B150    000005
+#define B200    000006
+#define B300    000007
+#define B600    000010
+#define B1200   000011
+#define B1800   000012
+#define B2400   000013
+#define B4800   000014
+#define B9600   000015
+#define B19200  000016
+#define B38400  000017
+
+#define TCIFLUSH  0
+#define TCOFLUSH  1
+#define TCIOFLUSH 2
+
+#define TCSANOW   0
+#define TCSADRAIN 1
+#define TCSAFLUSH 2
+
+typedef unsigned char cc_t;
+typedef unsigned short tcflag_t;
+typedef char speed_t;
+
+#define NCCS 32
+struct termios {
+  tcflag_t c_iflag;
+  tcflag_t c_oflag;
+  tcflag_t c_cflag;
+  tcflag_t c_lflag;
+  char c_line;
+  cc_t c_cc[NCCS];
+  speed_t c_ispeed;
+  speed_t c_ospeed;
+};
+
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+
+int tcflush(int fd, int queue_selector);
+int tcgetattr(int fd, struct termios *termios_p);
+int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
+
+__END_DECLS
+
+#endif  /* SYS_TERMIOS_H_ */
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_intercept.cc b/native_client_sdk/src/libraries/nacl_io/kernel_intercept.cc
index a479f9c..912fd18 100644
--- a/native_client_sdk/src/libraries/nacl_io/kernel_intercept.cc
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_intercept.cc
@@ -242,6 +242,22 @@
   return s_kp->select(nfds, readfds, writefds, exceptfds, timeout);
 }
 
+int ki_tcflush(int fd, int queue_selector) {
+  ON_NOSYS_RETURN(-1);
+  return s_kp->tcflush(fd, queue_selector);
+}
+
+int ki_tcgetattr(int fd, struct termios* termios_p) {
+  ON_NOSYS_RETURN(-1);
+  return s_kp->tcgetattr(fd, termios_p);
+}
+
+int ki_tcsetattr(int fd, int optional_actions,
+                 const struct termios *termios_p) {
+  ON_NOSYS_RETURN(-1);
+  return s_kp->tcsetattr(fd, optional_actions, termios_p);
+}
+
 #ifdef PROVIDES_SOCKET_API
 // Socket Functions
 int ki_accept(int fd, struct sockaddr* addr, socklen_t* len) {
@@ -256,6 +272,10 @@
   return s_kp->connect(fd, addr, len);
 }
 
+struct hostent* ki_gethostbyname(const char* name) {
+  return s_kp->gethostbyname(name);
+}
+
 int ki_getpeername(int fd, struct sockaddr* addr, socklen_t* len) {
   return s_kp->getpeername(fd, addr, len);
 }
@@ -267,6 +287,14 @@
   return s_kp->getsockopt(fd, lvl, optname, optval, len);
 }
 
+void ki_herror(const char *s) {
+  return s_kp->herror(s);
+}
+
+const char *ki_hstrerror(int err) {
+  return s_kp->hstrerror(err);
+}
+
 int ki_listen(int fd, int backlog) {
   return s_kp->listen(fd, backlog);
 }
@@ -313,4 +341,4 @@
 int ki_socketpair(int domain, int type, int protocol, int* sv) {
   return s_kp->socketpair(domain, type, protocol, sv);
 }
-#endif // PROVIDES_SOCKET_API
+#endif  // PROVIDES_SOCKET_API
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_intercept.h b/native_client_sdk/src/libraries/nacl_io/kernel_intercept.h
index 90fecf9..b570c8f 100644
--- a/native_client_sdk/src/libraries/nacl_io/kernel_intercept.h
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_intercept.h
@@ -10,6 +10,7 @@
 
 #include "nacl_io/ossocket.h"
 #include "nacl_io/osstat.h"
+#include "nacl_io/ostermios.h"
 #include "nacl_io/ostypes.h"
 #include "nacl_io/osutime.h"
 #include "sdk_util/macros.h"
@@ -70,14 +71,22 @@
 int ki_select(int nfds, fd_set* readfds, fd_set* writefds,
               fd_set* exceptfds, struct timeval* timeout);
 
+int ki_tcflush(int fd, int queue_selector);
+int ki_tcgetattr(int fd, struct termios* termios_p);
+int ki_tcsetattr(int fd, int optional_actions,
+                 const struct termios *termios_p);
+
 #ifdef PROVIDES_SOCKET_API
 // Socket Functions
 int ki_accept(int fd, struct sockaddr* addr, socklen_t* len);
 int ki_bind(int fd, const struct sockaddr* addr, socklen_t len);
 int ki_connect(int fd, const struct sockaddr* addr, socklen_t len);
+struct hostent* ki_gethostbyname(const char* name);
 int ki_getpeername(int fd, struct sockaddr* addr, socklen_t* len);
 int ki_getsockname(int fd, struct sockaddr* addr, socklen_t* len);
 int ki_getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len);
+void ki_herror(const char *s);
+const char *ki_hstrerror(int err);
 int ki_listen(int fd, int backlog);
 ssize_t ki_recv(int fd, void* buf, size_t len, int flags);
 ssize_t ki_recvfrom(int fd, void* buf, size_t len, int flags,
@@ -92,7 +101,7 @@
 int ki_shutdown(int fd, int how);
 int ki_socket(int domain, int type, int protocol);
 int ki_socketpair(int domain, int type, int protocl, int* sv);
-#endif // PROVIDES_SOCKET_API
+#endif  // PROVIDES_SOCKET_API
 
 EXTERN_C_END
 
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc b/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc
index 1e6ae64..a64a800 100644
--- a/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc
@@ -18,6 +18,7 @@
 #include <iterator>
 #include <string>
 
+#include "nacl_io/host_resolver.h"
 #include "nacl_io/kernel_handle.h"
 #include "nacl_io/kernel_wrap_real.h"
 #include "nacl_io/mount.h"
@@ -77,6 +78,10 @@
   open("/dev/stdin", O_RDONLY);
   open("/dev/stdout", O_WRONLY);
   open("/dev/stderr", O_WRONLY);
+
+#ifdef PROVIDES_SOCKET_API
+  host_resolver_.Init(ppapi_);
+#endif
 }
 
 int KernelProxy::open_resource(const char* path) {
@@ -471,9 +476,9 @@
   return 0;
 }
 
-int KernelProxy::ioctl(int d, int request, char* argp) {
+int KernelProxy::ioctl(int fd, int request, char* argp) {
   ScopedKernelHandle handle;
-  Error error = AcquireHandle(d, &handle);
+  Error error = AcquireHandle(fd, &handle);
   if (error) {
     errno = error;
     return -1;
@@ -647,6 +652,58 @@
   return 0;
 }
 
+int KernelProxy::tcflush(int fd, int queue_selector) {
+  ScopedKernelHandle handle;
+  Error error = AcquireHandle(fd, &handle);
+  if (error) {
+    errno = error;
+    return -1;
+  }
+
+  error = handle->node()->Tcflush(queue_selector);
+  if (error) {
+    errno = error;
+    return -1;
+  }
+
+  return 0;
+}
+
+int KernelProxy::tcgetattr(int fd, struct termios* termios_p) {
+  ScopedKernelHandle handle;
+  Error error = AcquireHandle(fd, &handle);
+  if (error) {
+    errno = error;
+    return -1;
+  }
+
+  error = handle->node()->Tcgetattr(termios_p);
+  if (error) {
+    errno = error;
+    return -1;
+  }
+
+  return 0;
+}
+
+int KernelProxy::tcsetattr(int fd, int optional_actions,
+                           const struct termios *termios_p) {
+  ScopedKernelHandle handle;
+  Error error = AcquireHandle(fd, &handle);
+  if (error) {
+    errno = error;
+    return -1;
+  }
+
+  error = handle->node()->Tcsetattr(optional_actions, termios_p);
+  if (error) {
+    errno = error;
+    return -1;
+  }
+
+  return 0;
+}
+
 #ifdef PROVIDES_SOCKET_API
 
 int KernelProxy::select(int nfds, fd_set* readfds, fd_set* writefds,
@@ -868,6 +925,10 @@
   return -1;
 }
 
+struct hostent* KernelProxy::gethostbyname(const char* name) {
+  return host_resolver_.gethostbyname(name);
+}
+
 int KernelProxy::getpeername(int fd, struct sockaddr* addr, socklen_t* len) {
   if (NULL == addr || NULL == len) {
     errno = EFAULT;
@@ -914,6 +975,14 @@
   return -1;
 }
 
+void KernelProxy::herror(const char* s) {
+  return host_resolver_.herror(s);
+}
+
+const char* KernelProxy::hstrerror(int err) {
+  return host_resolver_.hstrerror(err);
+}
+
 int KernelProxy::listen(int fd, int backlog) {
   ScopedKernelHandle handle;
   if (AcquireSocketHandle(fd, &handle) == -1)
@@ -1111,6 +1180,6 @@
   return 0;
 }
 
-#endif // PROVIDES_SOCKET_API
+#endif  // PROVIDES_SOCKET_API
 
-} // namespace_nacl_io
+}  // namespace_nacl_io
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_proxy.h b/native_client_sdk/src/libraries/nacl_io/kernel_proxy.h
index e0dff69..47b6f77 100644
--- a/native_client_sdk/src/libraries/nacl_io/kernel_proxy.h
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_proxy.h
@@ -8,6 +8,7 @@
 #include <map>
 #include <string>
 
+#include "nacl_io/host_resolver.h"
 #include "nacl_io/kernel_object.h"
 #include "nacl_io/mount_factory.h"
 #include "nacl_io/ossocket.h"
@@ -118,6 +119,10 @@
                      int fd,
                      size_t offset);
   virtual int munmap(void* addr, size_t length);
+  virtual int tcflush(int fd, int queue_selector);
+  virtual int tcgetattr(int fd, struct termios* termios_p);
+  virtual int tcsetattr(int fd, int optional_actions,
+                           const struct termios *termios_p);
 
 #ifdef PROVIDES_SOCKET_API
   virtual int select(int nfds, fd_set* readfds, fd_set* writefds,
@@ -129,6 +134,7 @@
   virtual int accept(int fd, struct sockaddr* addr, socklen_t* len);
   virtual int bind(int fd, const struct sockaddr* addr, socklen_t len);
   virtual int connect(int fd, const struct sockaddr* addr, socklen_t len);
+  virtual struct hostent* gethostbyname(const char* name);
   virtual int getpeername(int fd, struct sockaddr* addr, socklen_t* len);
   virtual int getsockname(int fd, struct sockaddr* addr, socklen_t* len);
   virtual int getsockopt(int fd,
@@ -136,6 +142,8 @@
                          int optname,
                          void* optval,
                          socklen_t* len);
+  virtual void herror(const char* s);
+  virtual const char* hstrerror(int err);
   virtual int listen(int fd, int backlog);
   virtual ssize_t recv(int fd,
                        void* buf,
@@ -164,13 +172,16 @@
   virtual int shutdown(int fd, int how);
   virtual int socket(int domain, int type, int protocol);
   virtual int socketpair(int domain, int type, int protocol, int* sv);
-#endif // PROVIDES_SOCKET_API
+#endif  // PROVIDES_SOCKET_API
 
  protected:
   MountFactoryMap_t factories_;
   int dev_;
   PepperInterface* ppapi_;
   static KernelProxy *s_instance_;
+#ifdef PROVIDES_SOCKET_API
+  HostResolver host_resolver_;
+#endif
 
 #ifdef PROVIDES_SOCKET_API
   virtual int AcquireSocketHandle(int fd, ScopedKernelHandle* handle);
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_wrap.h b/native_client_sdk/src/libraries/nacl_io/kernel_wrap.h
index 1a0886c..6b79d4f 100644
--- a/native_client_sdk/src/libraries/nacl_io/kernel_wrap.h
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_wrap.h
@@ -102,9 +102,12 @@
 int accept(int fd, struct sockaddr* addr, socklen_t* len);
 int bind(int fd, const struct sockaddr* addr, socklen_t len);
 int connect(int fd, const struct sockaddr* addr, socklen_t len);
+struct hostent* gethostbyname(const char* name);
 int getpeername(int fd, struct sockaddr* addr, socklen_t* len);
 int getsockname(int fd, struct sockaddr* addr, socklen_t* len);
 int getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len);
+void herror(const char *s);
+const char *hstrerror(int err);
 int listen(int fd, int backlog);
 ssize_t recv(int fd, void* buf, size_t len, int flags);
 ssize_t recvfrom(int fd, void* buf, size_t len, int flags,
@@ -119,7 +122,7 @@
 int shutdown(int fd, int how);
 int socket(int domain, int type, int protocol);
 int socketpair(int domain, int type, int protocl, int* sv);
-#endif // PROVIDES_SOCKET_API
+#endif  // PROVIDES_SOCKET_API
 
 EXTERN_C_END
 
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc
index b4e80e9..7c52f4d 100644
--- a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc
@@ -292,6 +292,10 @@
   return ki_connect(fd, addr, len);
 }
 
+struct hostent* gethostbyname(const char* name) {
+  return ki_gethostbyname(name);
+}
+
 int getpeername(int fd, struct sockaddr* addr, socklen_t* len) {
   return ki_getpeername(fd, addr, len);
 }
@@ -299,10 +303,19 @@
 int getsockname(int fd, struct sockaddr* addr, socklen_t* len) {
   return ki_getsockname(fd, addr, len);
 }
+
 int getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len) {
   return ki_getsockopt(fd, lvl, optname, optval, len);
 }
 
+void herror(const char *s) {
+  return ki_herror(s);
+}
+
+const char *hstrerror(int err) {
+  return ki_hstrerror(err);
+}
+
 int listen(int fd, int backlog) {
   return ki_listen(fd, backlog);
 }
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_newlib.cc b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_newlib.cc
index c2f91a1..e218301 100644
--- a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_newlib.cc
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_newlib.cc
@@ -144,6 +144,10 @@
   return ki_connect(fd, addr, len);
 }
 
+struct hostent* gethostbyname(const char* name) {
+  return ki_gethostbyname(name);
+}
+
 int getpeername(int fd, struct sockaddr* addr, socklen_t* len) {
   return ki_getpeername(fd, addr, len);
 }
@@ -151,10 +155,19 @@
 int getsockname(int fd, struct sockaddr* addr, socklen_t* len) {
   return ki_getsockname(fd, addr, len);
 }
+
 int getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len) {
   return ki_getsockopt(fd, lvl, optname, optval, len);
 }
 
+void herror(const char* s) {
+  return ki_herror(s);
+}
+
+const char* hstrerror(int err) {
+  return ki_hstrerror(err);
+}
+
 int listen(int fd, int backlog) {
   return ki_listen(fd, backlog);
 }
diff --git a/native_client_sdk/src/libraries/nacl_io/library.dsc b/native_client_sdk/src/libraries/nacl_io/library.dsc
index 8b4ed00..011a9c6 100644
--- a/native_client_sdk/src/libraries/nacl_io/library.dsc
+++ b/native_client_sdk/src/libraries/nacl_io/library.dsc
@@ -13,7 +13,8 @@
       'SOURCES' : [
         "event_emitter.cc",
         "event_listener.cc",
-        "inet_ntoa.cc",
+        "h_errno.cc",
+        "host_resolver.cc",
         "kernel_handle.cc",
         "kernel_intercept.cc",
         "kernel_object.cc",
@@ -46,6 +47,8 @@
         "syscalls/getdents.c",
         "syscalls/getwd.c",
         "syscalls/getcwd.c",
+        "syscalls/inet_ntoa.cc",
+        "syscalls/inet_ntop.cc",
         "syscalls/ioctl.c",
         "syscalls/isatty.c",
         "syscalls/link.c",
@@ -56,6 +59,9 @@
         "syscalls/remove.c",
         "syscalls/rmdir.c",
         "syscalls/select.c",
+        "syscalls/tcflush.c",
+        "syscalls/tcgetattr.c",
+        "syscalls/tcsetattr.c",
         "syscalls/unlink.c",
         "syscalls/umount.c",
         "syscalls/uname.c",
@@ -69,6 +75,7 @@
         "event_emitter.h",
         "event_listener.h",
         "error.h",
+        "host_resolver.h",
         "inode_pool.h",
         "ioctl.h",
         "kernel_handle.h",
@@ -99,6 +106,7 @@
         "ostypes.h",
         "osunistd.h",
         "osutime.h",
+        "ostermios.h",
         "path.h",
         "pepper_interface.h",
         "real_pepper_interface.h",
@@ -115,6 +123,7 @@
         "poll.h",
         "sys/select.h",
         "sys/socket.h",
+        "sys/termios.h",
         "sys/utsname.h",
       ],
       'DEST': 'include/newlib',
@@ -128,6 +137,7 @@
         "poll.h",
         "sys/select.h",
         "sys/socket.h",
+        "sys/termios.h",
         "sys/utsname.h",
       ],
       'DEST': 'include/pnacl',
diff --git a/native_client_sdk/src/libraries/nacl_io/mount_node.cc b/native_client_sdk/src/libraries/nacl_io/mount_node.cc
index 3e423da..0116745 100644
--- a/native_client_sdk/src/libraries/nacl_io/mount_node.cc
+++ b/native_client_sdk/src/libraries/nacl_io/mount_node.cc
@@ -125,6 +125,19 @@
   return 0;
 }
 
+Error MountNode::Tcflush(int queue_selector) {
+  return EINVAL;
+}
+
+Error MountNode::Tcgetattr(struct termios* termios_p) {
+  return EINVAL;
+}
+
+Error MountNode::Tcsetattr(int optional_actions,
+                           const struct termios *termios_p) {
+  return EINVAL;
+}
+
 int MountNode::GetLinks() { return stat_.st_nlink; }
 
 int MountNode::GetMode() { return stat_.st_mode & ~S_IFMT; }
diff --git a/native_client_sdk/src/libraries/nacl_io/mount_node.h b/native_client_sdk/src/libraries/nacl_io/mount_node.h
index bf9534e..2afc88b 100644
--- a/native_client_sdk/src/libraries/nacl_io/mount_node.h
+++ b/native_client_sdk/src/libraries/nacl_io/mount_node.h
@@ -11,6 +11,7 @@
 #include "nacl_io/event_listener.h"
 #include "nacl_io/osdirent.h"
 #include "nacl_io/osstat.h"
+#include "nacl_io/ostermios.h"
 
 #include "sdk_util/ref_object.h"
 #include "sdk_util/scoped_ref.h"
@@ -69,6 +70,10 @@
                      int flags,
                      size_t offset,
                      void** out_addr);
+  virtual Error Tcflush(int queue_selector);
+  virtual Error Tcgetattr(struct termios* termios_p);
+  virtual Error Tcsetattr(int optional_actions,
+                          const struct termios *termios_p);
 
   virtual int GetLinks();
   virtual int GetMode();
@@ -79,6 +84,7 @@
   virtual bool IsaFile();
   virtual bool IsaTTY();
 
+
   // Number of children for this node (directory)
   virtual int ChildCount();
 
diff --git a/native_client_sdk/src/libraries/nacl_io/ossocket.h b/native_client_sdk/src/libraries/nacl_io/ossocket.h
index 784086a..936509b 100644
--- a/native_client_sdk/src/libraries/nacl_io/ossocket.h
+++ b/native_client_sdk/src/libraries/nacl_io/ossocket.h
@@ -5,6 +5,8 @@
 #ifndef LIBRARIES_NACL_IO_OSSOCKET_H_
 #define LIBRARIES_NACL_IO_OSSOCKET_H_
 
+#include <sys/types.h>
+
 #if defined(__native_client__)
 #include <arpa/inet.h>
 #include <netdb.h>
diff --git a/native_client_sdk/src/libraries/nacl_io/ostermios.h b/native_client_sdk/src/libraries/nacl_io/ostermios.h
new file mode 100644
index 0000000..03c4b6c
--- /dev/null
+++ b/native_client_sdk/src/libraries/nacl_io/ostermios.h
@@ -0,0 +1,42 @@
+/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+#ifndef LIBRARIES_NACL_IO_OSTERMIOS_H
+#define LIBRARIES_NACL_IO_OSTERMIOS_H
+
+#if defined(__native_client__)
+
+#include <termios.h>
+
+#else
+
+#include "sdk_util/macros.h"
+
+typedef unsigned char cc_t;
+typedef unsigned short tcflag_t;
+typedef char speed_t;
+
+#define NCCS 32
+struct termios {
+  tcflag_t c_iflag;
+  tcflag_t c_oflag;
+  tcflag_t c_cflag;
+  tcflag_t c_lflag;
+  char c_line;
+  cc_t c_cc[NCCS];
+  speed_t c_ispeed;
+  speed_t c_ospeed;
+};
+
+
+EXTERN_C_BEGIN
+
+int tcgetattr(int fd,struct termios *termios_p);
+int tcsetattr(int fd,int optional_actions,const struct termios *termios_p);
+
+EXTERN_C_END
+
+#endif
+
+#endif  /* LIBRARIES_NACL_IO_OSTERMIOS_H */
diff --git a/native_client_sdk/src/libraries/nacl_io/pepper/all_interfaces.h b/native_client_sdk/src/libraries/nacl_io/pepper/all_interfaces.h
index dbf1daf..cb75d73 100644
--- a/native_client_sdk/src/libraries/nacl_io/pepper/all_interfaces.h
+++ b/native_client_sdk/src/libraries/nacl_io/pepper/all_interfaces.h
@@ -68,6 +68,28 @@
   METHOD2(VarInterface, const char*, VarToUtf8, PP_Var, uint32_t*)
 END_INTERFACE(VarInterface, PPB_Var)
 
+BEGIN_INTERFACE(HostResolverInterface, PPB_HostResolver,
+                PPB_HOSTRESOLVER_INTERFACE_1_0)
+  METHOD1(HostResolverInterface, PP_Resource, Create, PP_Instance)
+  METHOD5(HostResolverInterface, int32_t, Resolve, PP_Resource, const char*,
+          uint16_t, const struct PP_HostResolver_Hint*,
+          struct PP_CompletionCallback)
+  METHOD1(HostResolverInterface, PP_Var, GetCanonicalName, PP_Resource)
+  METHOD1(HostResolverInterface, uint32_t, GetNetAddressCount, PP_Resource)
+  METHOD2(HostResolverInterface, PP_Resource, GetNetAddress,
+          PP_Resource, uint32_t)
+END_INTERFACE(HostResolverInterface, PPB_HostResolver)
+
+BEGIN_INTERFACE(NetAddressInterface, PPB_NetAddress,
+                PPB_NETADDRESS_INTERFACE_1_0)
+  METHOD1(NetAddressInterface, PP_Bool, IsNetAddress, PP_Resource)
+  METHOD1(NetAddressInterface, PP_NetAddress_Family, GetFamily, PP_Resource)
+  METHOD2(NetAddressInterface, PP_Bool, DescribeAsIPv4Address, PP_Resource,
+          struct PP_NetAddress_IPv4*)
+  METHOD2(NetAddressInterface, PP_Bool, DescribeAsIPv6Address, PP_Resource,
+          struct PP_NetAddress_IPv6*)
+END_INTERFACE(NetAddressInterface, PPB_NetAddress)
+
 BEGIN_INTERFACE(URLLoaderInterface, PPB_URLLoader, PPB_URLLOADER_INTERFACE_1_0)
   METHOD1(URLLoaderInterface, PP_Resource, Create, PP_Instance)
   METHOD3(URLLoaderInterface, int32_t, Open, PP_Resource, PP_Resource,
diff --git a/native_client_sdk/src/libraries/nacl_io/pepper_interface.h b/native_client_sdk/src/libraries/nacl_io/pepper_interface.h
index 9eaec00..6ffe1e6 100644
--- a/native_client_sdk/src/libraries/nacl_io/pepper_interface.h
+++ b/native_client_sdk/src/libraries/nacl_io/pepper_interface.h
@@ -5,7 +5,9 @@
 #ifndef LIBRARIES_NACL_IO_PEPPER_INTERFACE_H_
 #define LIBRARIES_NACL_IO_PEPPER_INTERFACE_H_
 
+#include <ppapi/c/pp_bool.h>
 #include <ppapi/c/pp_completion_callback.h>
+#include <ppapi/c/pp_errors.h>
 #include <ppapi/c/pp_file_info.h>
 #include <ppapi/c/pp_instance.h>
 #include <ppapi/c/pp_resource.h>
@@ -14,8 +16,10 @@
 #include <ppapi/c/ppb_file_io.h>
 #include <ppapi/c/ppb_file_ref.h>
 #include <ppapi/c/ppb_file_system.h>
+#include <ppapi/c/ppb_host_resolver.h>
 #include <ppapi/c/ppb_messaging.h>
 #include <ppapi/c/ppb_messaging.h>
+#include <ppapi/c/ppb_net_address.h>
 #include <ppapi/c/ppb_url_loader.h>
 #include <ppapi/c/ppb_url_request_info.h>
 #include <ppapi/c/ppb_url_response_info.h>
diff --git a/native_client_sdk/src/libraries/nacl_io/syscalls/inet_ntoa.cc b/native_client_sdk/src/libraries/nacl_io/syscalls/inet_ntoa.cc
new file mode 100644
index 0000000..93825e7
--- /dev/null
+++ b/native_client_sdk/src/libraries/nacl_io/syscalls/inet_ntoa.cc
@@ -0,0 +1,28 @@
+/* Copyright 2013 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+#include "nacl_io/ossocket.h"
+#if defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__)
+
+#include <string.h>
+#include "sdk_util/macros.h"
+
+static uint8_t GetByte(const void* addr, int byte) {
+  const char* buf = static_cast<const char*>(addr);
+  return static_cast<uint8_t>(buf[byte]);
+}
+
+EXTERN_C_BEGIN
+
+char* inet_ntoa(struct in_addr in) {
+  static char addr[INET_ADDRSTRLEN];
+  snprintf(addr, INET_ADDRSTRLEN, "%u.%u.%u.%u",
+           GetByte(&in, 0), GetByte(&in, 1),
+           GetByte(&in, 2), GetByte(&in, 3));
+  return addr;
+}
+
+EXTERN_C_END
+
+#endif  // defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__)
diff --git a/native_client_sdk/src/libraries/nacl_io/inet_ntoa.cc b/native_client_sdk/src/libraries/nacl_io/syscalls/inet_ntop.cc
similarity index 61%
rename from native_client_sdk/src/libraries/nacl_io/inet_ntoa.cc
rename to native_client_sdk/src/libraries/nacl_io/syscalls/inet_ntop.cc
index fdeae08..807bdfe 100644
--- a/native_client_sdk/src/libraries/nacl_io/inet_ntoa.cc
+++ b/native_client_sdk/src/libraries/nacl_io/syscalls/inet_ntop.cc
@@ -1,31 +1,21 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
+/* Copyright 2013 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
 
 #include "nacl_io/ossocket.h"
-
-#ifdef PROVIDES_SOCKET_API
+#if defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__)
 
 #include <errno.h>
-#include <stdio.h>
 #include <string.h>
 
 #include <iostream>
 #include <sstream>
 #include <string>
 
-static inline uint8_t get_byte(const void* addr, int byte) {
-  const char* buf = static_cast<const char*>(addr);
-  return static_cast<uint8_t>(buf[byte]);
-}
+#include "sdk_util/macros.h"
 
-char* inet_ntoa(struct in_addr in) {
-  static char addr[INET_ADDRSTRLEN];
-  snprintf(addr, INET_ADDRSTRLEN, "%u.%u.%u.%u",
-           get_byte(&in, 0), get_byte(&in, 1),
-           get_byte(&in, 2), get_byte(&in, 3));
-  return addr;
-}
+
+EXTERN_C_BEGIN
 
 const char* inet_ntop(int af, const void* src, char* dst, socklen_t size) {
   if (AF_INET == af) {
@@ -62,4 +52,7 @@
   return NULL;
 }
 
-#endif // PROVIDES_SOCKET_API
+EXTERN_C_END
+
+#endif  // defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__)
+
diff --git a/native_client_sdk/src/libraries/nacl_io/syscalls/tcflush.c b/native_client_sdk/src/libraries/nacl_io/syscalls/tcflush.c
new file mode 100644
index 0000000..5a59b8b
--- /dev/null
+++ b/native_client_sdk/src/libraries/nacl_io/syscalls/tcflush.c
@@ -0,0 +1,11 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "nacl_io/kernel_intercept.h"
+#include "nacl_io/ostermios.h"
+
+int tcflush(int fd, int queue_selector) {
+  return ki_tcflush(fd, queue_selector);
+}
+
diff --git a/native_client_sdk/src/libraries/nacl_io/syscalls/tcgetattr.c b/native_client_sdk/src/libraries/nacl_io/syscalls/tcgetattr.c
new file mode 100644
index 0000000..0715f45
--- /dev/null
+++ b/native_client_sdk/src/libraries/nacl_io/syscalls/tcgetattr.c
@@ -0,0 +1,10 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "nacl_io/kernel_intercept.h"
+#include "nacl_io/ostermios.h"
+
+int tcgetattr(int fd, struct termios* termios_p) {
+  return ki_tcgetattr(fd, termios_p);
+}
diff --git a/native_client_sdk/src/libraries/nacl_io/syscalls/tcsetattr.c b/native_client_sdk/src/libraries/nacl_io/syscalls/tcsetattr.c
new file mode 100644
index 0000000..bb44397
--- /dev/null
+++ b/native_client_sdk/src/libraries/nacl_io/syscalls/tcsetattr.c
@@ -0,0 +1,10 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "nacl_io/kernel_intercept.h"
+#include "nacl_io/ostermios.h"
+
+int tcsetattr(int fd, int optional_actions, const struct termios* termios_p) {
+  return ki_tcsetattr(fd, optional_actions, termios_p);
+}
diff --git a/native_client_sdk/src/libraries/nacl_io_test/kernel_proxy_mock.h b/native_client_sdk/src/libraries/nacl_io_test/kernel_proxy_mock.h
index eeaf104..c082856 100644
--- a/native_client_sdk/src/libraries/nacl_io_test/kernel_proxy_mock.h
+++ b/native_client_sdk/src/libraries/nacl_io_test/kernel_proxy_mock.h
@@ -11,6 +11,7 @@
 
 #include "nacl_io/kernel_proxy.h"
 #include "nacl_io/ossocket.h"
+#include "nacl_io/ostermios.h"
 
 class KernelProxyMock : public nacl_io::KernelProxy {
  public:
@@ -43,6 +44,8 @@
   MOCK_METHOD1(remove, int(const char*));
   MOCK_METHOD1(rmdir, int(const char*));
   MOCK_METHOD2(stat, int(const char*, struct stat*));
+  MOCK_METHOD2(tcgetattr, int(int, struct termios*));
+  MOCK_METHOD3(tcsetattr, int(int, int, const struct termios*));
   MOCK_METHOD1(umount, int(const char*));
   MOCK_METHOD1(unlink, int(const char*));
   MOCK_METHOD2(utime, int(const char*, const struct utimbuf*));
@@ -60,9 +63,12 @@
   MOCK_METHOD3(accept, int(int, struct sockaddr*, socklen_t*));
   MOCK_METHOD3(bind, int(int, const struct sockaddr*, socklen_t));
   MOCK_METHOD3(connect, int(int, const struct sockaddr*, socklen_t));
+  MOCK_METHOD1(gethostbyname, struct hostent*(const char*));
   MOCK_METHOD3(getpeername, int(int, struct sockaddr*, socklen_t*));
   MOCK_METHOD3(getsockname, int(int, struct sockaddr*, socklen_t*));
   MOCK_METHOD5(getsockopt, int(int, int, int, void*, socklen_t*));
+  MOCK_METHOD1(herror, void(const char*));
+  MOCK_METHOD1(hstrerror, const char*(int));
   MOCK_METHOD2(listen, int(int, int));
   MOCK_METHOD4(recv, ssize_t(int, void*, size_t, int));
   MOCK_METHOD6(recvfrom, ssize_t(int, void*, size_t, int,
diff --git a/native_client_sdk/src/libraries/nacl_io_test/kernel_proxy_test.cc b/native_client_sdk/src/libraries/nacl_io_test/kernel_proxy_test.cc
index 7b19f4a..1eabdd0 100644
--- a/native_client_sdk/src/libraries/nacl_io_test/kernel_proxy_test.cc
+++ b/native_client_sdk/src/libraries/nacl_io_test/kernel_proxy_test.cc
@@ -5,6 +5,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <pthread.h>
+#include <stdio.h>
 #include <sys/stat.h>
 
 #include <map>
@@ -520,3 +521,4 @@
   // propagate through.
   EXPECT_EQ(1234, errno);
 }
+
diff --git a/native_client_sdk/src/libraries/nacl_io_test/kernel_wrap_test.cc b/native_client_sdk/src/libraries/nacl_io_test/kernel_wrap_test.cc
index 92577e0..6b48c88 100644
--- a/native_client_sdk/src/libraries/nacl_io_test/kernel_wrap_test.cc
+++ b/native_client_sdk/src/libraries/nacl_io_test/kernel_wrap_test.cc
@@ -7,10 +7,10 @@
 
 #include "gtest/gtest.h"
 #include "kernel_proxy_mock.h"
-#include "nacl_io/kernel_proxy.h"
 #include "nacl_io/kernel_intercept.h"
 #include "nacl_io/kernel_wrap.h"
 #include "nacl_io/ossocket.h"
+#include "nacl_io/ostermios.h"
 
 using namespace nacl_io;
 
@@ -20,6 +20,8 @@
 
 namespace {
 
+static const int DUMMY_FD = 5678;
+
 #define COMPARE_FIELD(f) \
   if (arg->f != statbuf->f) { \
     *result_listener << "mismatch of field \""#f"\". " \
@@ -133,30 +135,30 @@
 }
 
 TEST_F(KernelWrapTest, dup) {
-  EXPECT_CALL(mock, dup(123)).Times(1);
-  dup(123);
+  EXPECT_CALL(mock, dup(DUMMY_FD)).Times(1);
+  dup(DUMMY_FD);
 }
 
 TEST_F(KernelWrapTest, dup2) {
-  EXPECT_CALL(mock, dup2(123, 234)).Times(1);
-  dup2(123, 234);
+  EXPECT_CALL(mock, dup2(DUMMY_FD, 234)).Times(1);
+  dup2(DUMMY_FD, 234);
 }
 
 TEST_F(KernelWrapTest, fchown) {
   uid_t uid = kDummyUid;
   gid_t gid = kDummyGid;
-  EXPECT_CALL(mock, fchown(123, uid, gid)).Times(1);
-  fchown(123, uid, gid);
+  EXPECT_CALL(mock, fchown(DUMMY_FD, uid, gid)).Times(1);
+  fchown(DUMMY_FD, uid, gid);
 }
 
 TEST_F(KernelWrapTest, fstat) {
   struct stat in_statbuf;
   MakeDummyStatbuf(&in_statbuf);
-  EXPECT_CALL(mock, fstat(234, _))
+  EXPECT_CALL(mock, fstat(DUMMY_FD, _))
       .Times(1)
       .WillOnce(SetStat(&in_statbuf));
   struct stat out_statbuf;
-  fstat(234, &out_statbuf);
+  fstat(DUMMY_FD, &out_statbuf);
   EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
 }
 
@@ -265,6 +267,18 @@
   EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
 }
 
+TEST_F(KernelWrapTest, tcgetattr) {
+  struct termios term;
+  EXPECT_CALL(mock, tcgetattr(DUMMY_FD, &term)).Times(1);
+  tcgetattr(DUMMY_FD, &term);
+}
+
+TEST_F(KernelWrapTest, tcsetattr) {
+  struct termios term;
+  EXPECT_CALL(mock, tcsetattr(DUMMY_FD, 0, &term)).Times(1);
+  tcsetattr(DUMMY_FD, 0, &term);
+}
+
 TEST_F(KernelWrapTest, umount) {
   EXPECT_CALL(mock, umount(StrEq("umount"))).Times(1);
   umount("umount");
@@ -299,88 +313,103 @@
 
 // Socket Functions
 TEST_F(KernelWrapTest, accept) {
-  EXPECT_CALL(mock, accept(123, NULL, NULL)).Times(1);
-  accept(123, NULL, NULL);
+  EXPECT_CALL(mock, accept(DUMMY_FD, NULL, NULL)).Times(1);
+  accept(DUMMY_FD, NULL, NULL);
 }
 
 TEST_F(KernelWrapTest, bind) {
-  EXPECT_CALL(mock, bind(123, NULL, 456)).Times(1);
-  bind(123, NULL, 456);
+  EXPECT_CALL(mock, bind(DUMMY_FD, NULL, 456)).Times(1);
+  bind(DUMMY_FD, NULL, 456);
 }
 
 TEST_F(KernelWrapTest, connect) {
-  EXPECT_CALL(mock, connect(123, NULL, 456)).Times(1);
-  connect(123, NULL, 456);
+  EXPECT_CALL(mock, connect(DUMMY_FD, NULL, 456)).Times(1);
+  connect(DUMMY_FD, NULL, 456);
+}
+
+TEST_F(KernelWrapTest, gethostbyname) {
+  EXPECT_CALL(mock, gethostbyname(NULL)).Times(1);
+  gethostbyname(NULL);
 }
 
 TEST_F(KernelWrapTest, getpeername) {
-  EXPECT_CALL(mock, getpeername(123, NULL, NULL)).Times(1);
-  getpeername(123, NULL, NULL);
+  EXPECT_CALL(mock, getpeername(DUMMY_FD, NULL, NULL)).Times(1);
+  getpeername(DUMMY_FD, NULL, NULL);
 }
 
 TEST_F(KernelWrapTest, getsockname) {
-  EXPECT_CALL(mock, getsockname(123, NULL, NULL)).Times(1);
-  getsockname(123, NULL, NULL);
+  EXPECT_CALL(mock, getsockname(DUMMY_FD, NULL, NULL)).Times(1);
+  getsockname(DUMMY_FD, NULL, NULL);
 }
 
 TEST_F(KernelWrapTest, getsockopt) {
-  EXPECT_CALL(mock, getsockopt(123, 456, 789, NULL, NULL)).Times(1);
-  getsockopt(123, 456, 789, NULL, NULL);
+  EXPECT_CALL(mock, getsockopt(DUMMY_FD, 456, 789, NULL, NULL)).Times(1);
+  getsockopt(DUMMY_FD, 456, 789, NULL, NULL);
+}
+
+TEST_F(KernelWrapTest, herror) {
+  EXPECT_CALL(mock, herror(NULL)).Times(1);
+  herror(NULL);
+}
+
+TEST_F(KernelWrapTest, hstrerror) {
+  EXPECT_CALL(mock, hstrerror(123)).Times(1);
+  hstrerror(123);
 }
 
 TEST_F(KernelWrapTest, listen) {
-  EXPECT_CALL(mock, listen(123, 456)).Times(1);
-  listen(123, 456);
+  EXPECT_CALL(mock, listen(DUMMY_FD, 456)).Times(1);
+  listen(DUMMY_FD, 456);
 }
 
 TEST_F(KernelWrapTest, recv) {
-  EXPECT_CALL(mock, recv(123, NULL, 456, 789)).Times(1);
-  recv(123, NULL, 456, 789);
+  EXPECT_CALL(mock, recv(DUMMY_FD, NULL, 456, 789)).Times(1);
+  recv(DUMMY_FD, NULL, 456, 789);
 }
 
 TEST_F(KernelWrapTest, recvfrom) {
-  EXPECT_CALL(mock, recvfrom(123, NULL, 456, 789, NULL, NULL)).Times(1);
-  recvfrom(123, NULL, 456, 789, NULL, NULL);
+  EXPECT_CALL(mock, recvfrom(DUMMY_FD, NULL, 456, 789, NULL, NULL)).Times(1);
+  recvfrom(DUMMY_FD, NULL, 456, 789, NULL, NULL);
 }
 
 TEST_F(KernelWrapTest, recvmsg) {
-  EXPECT_CALL(mock, recvmsg(123, NULL, 456)).Times(1);
-  recvmsg(123, NULL, 456);
+  EXPECT_CALL(mock, recvmsg(DUMMY_FD, NULL, 456)).Times(1);
+  recvmsg(DUMMY_FD, NULL, 456);
 }
 
 TEST_F(KernelWrapTest, send) {
-  EXPECT_CALL(mock, send(123, NULL, 456, 789)).Times(1);
-  send(123, NULL, 456, 789);
+  EXPECT_CALL(mock, send(DUMMY_FD, NULL, 456, 789)).Times(1);
+  send(DUMMY_FD, NULL, 456, 789);
 }
 
 TEST_F(KernelWrapTest, sendto) {
-  EXPECT_CALL(mock, sendto(123, NULL, 456, 789, NULL, 314)).Times(1);
-  sendto(123, NULL, 456, 789, NULL, 314);
+  EXPECT_CALL(mock, sendto(DUMMY_FD, NULL, 456, 789, NULL, 314)).Times(1);
+  sendto(DUMMY_FD, NULL, 456, 789, NULL, 314);
 }
 
 TEST_F(KernelWrapTest, sendmsg) {
-  EXPECT_CALL(mock, sendmsg(123, NULL, 456)).Times(1);
-  sendmsg(123, NULL, 456);
+  EXPECT_CALL(mock, sendmsg(DUMMY_FD, NULL, 456)).Times(1);
+  sendmsg(DUMMY_FD, NULL, 456);
 }
 
 TEST_F(KernelWrapTest, setsockopt) {
-  EXPECT_CALL(mock, setsockopt(123, 456, 789, NULL, 314)).Times(1);
-  setsockopt(123, 456, 789, NULL, 314);
+  EXPECT_CALL(mock, setsockopt(DUMMY_FD, 456, 789, NULL, 314)).Times(1);
+  setsockopt(DUMMY_FD, 456, 789, NULL, 314);
 }
 
 TEST_F(KernelWrapTest, shutdown) {
-  EXPECT_CALL(mock, shutdown(123, 456)).Times(1);
-  shutdown(123, 456);
+  EXPECT_CALL(mock, shutdown(DUMMY_FD, 456)).Times(1);
+  shutdown(DUMMY_FD, 456);
 }
 
 TEST_F(KernelWrapTest, socket) {
-  EXPECT_CALL(mock, socket(123, 456, 789)).Times(1);
-  socket(123, 456, 789);
+  EXPECT_CALL(mock, socket(DUMMY_FD, 456, 789)).Times(1);
+  socket(DUMMY_FD, 456, 789);
 }
 
 TEST_F(KernelWrapTest, socketpair) {
-  EXPECT_CALL(mock, socketpair(123,456, 789, NULL)).Times(1);
-  socketpair(123,456, 789, NULL);
+  EXPECT_CALL(mock, socketpair(DUMMY_FD, 456, 789, NULL)).Times(1);
+  socketpair(DUMMY_FD, 456, 789, NULL);
 }
 
 #endif // PROVIDES_SOCKET_API
diff --git a/native_client_sdk/src/libraries/nacl_io_test/socket_test.cc b/native_client_sdk/src/libraries/nacl_io_test/socket_test.cc
index 9768c13..ec45185 100644
--- a/native_client_sdk/src/libraries/nacl_io_test/socket_test.cc
+++ b/native_client_sdk/src/libraries/nacl_io_test/socket_test.cc
@@ -38,7 +38,7 @@
   KernelProxy* kp_;
 };
 
-} // namespace
+}  // namespace
 
 TEST_F(SocketTest, Accept) {
   struct sockaddr addr = {};
@@ -128,6 +128,11 @@
   EXPECT_EQ(errno, ENOTSOCK);
 }
 
+TEST_F(SocketTest, Hstrerror) {
+  EXPECT_STREQ(ki_hstrerror(2718),
+               "Unknown error in gethostbyname: 2718.");
+}
+
 TEST_F(SocketTest, Listen) {
   EXPECT_LT(ki_listen(-1, 123), 0);
   EXPECT_EQ(errno, EBADF);
@@ -259,8 +264,9 @@
   EXPECT_EQ(errno, EPROTONOSUPPORT);
 }
 
-// These functions don't go through KernelProxy, so they don't require a test
-// fixture
+// These utility functions are only used for newlib (glibc provides its own
+// implementations of these functions).
+#if !defined(__GLIBC__)
 
 static struct in_addr generate_ipv4_addr(int tuple1, int tuple2,
                                          int tuple3, int tuple4) {
@@ -366,4 +372,5 @@
   EXPECT_EQ(errno, ENOSPC);
 }
 
-#endif // PROVIDES_SOCKETPAIR_API
+#endif  // !defined(__GLIBC__)
+#endif  // PROVIDES_SOCKETPAIR_API
diff --git a/native_client_sdk/src/web/manifest.html b/native_client_sdk/src/web/manifest.html
index 49574b4..7da5a3f 100644
--- a/native_client_sdk/src/web/manifest.html
+++ b/native_client_sdk/src/web/manifest.html
@@ -54,14 +54,17 @@
       <tbody id="rows">
       </tbody>
     </table>
+    <h2>Most recent upload log:</h2>
+    <pre id="log">
+    </pre>
     <script type="application/javascript">
-      function loadJson(url, callback) {
+      function loadText(url, callback) {
         var xhr = new XMLHttpRequest();
         xhr.open('GET', url, true);
         xhr.onreadystatechange = function (e) {
           if (xhr.readyState == 4) {
             if (xhr.status == 200) {
-              callback(JSON.parse(xhr.responseText));
+              callback(xhr.responseText);
             } else {
               alert("Failed to load: error " + xhr.status);
             }
@@ -70,6 +73,12 @@
         xhr.send(null);
       }
 
+      function loadJson(url, callback) {
+        loadText(url, function (text) {
+          callback(JSON.parse(text));
+        });
+      }
+
       function removeAllChildren(elm) {
         while (elm.childNodes.length) {
           elm.removeChild(elm.firstChild);
@@ -128,7 +137,12 @@
         }
       }
 
+      function displayLog(text) {
+        document.getElementById('log').textContent = text;
+      }
+
       loadJson('naclsdk_manifest2.json', display);
+      loadText('naclsdk_manifest2.json.log', displayLog);
     </script>
   </body>
 </html>
diff --git a/net/cert/cert_verify_proc_nss.cc b/net/cert/cert_verify_proc_nss.cc
index 120f091..f63297e 100644
--- a/net/cert/cert_verify_proc_nss.cc
+++ b/net/cert/cert_verify_proc_nss.cc
@@ -162,10 +162,6 @@
 void GetCertChainInfo(CERTCertList* cert_list,
                       CERTCertificate* root_cert,
                       CertVerifyResult* verify_result) {
-  // NOTE: Using a NSS library before 3.12.3.1 will crash below.  To see the
-  // NSS version currently in use:
-  // 1. use ldd on the chrome executable for NSS's location (ie. libnss3.so*)
-  // 2. use ident libnss3.so* for the library's version
   DCHECK(cert_list);
 
   CERTCertificate* verified_cert = NULL;
@@ -367,31 +363,6 @@
   bool use_crl = check_revocation;
   bool use_ocsp = check_revocation;
 
-  // These CAs have multiple keys, which trigger two bugs in NSS's CRL code.
-  // 1. NSS may use one key to verify a CRL signed with another key,
-  //    incorrectly concluding that the CRL's signature is invalid.
-  //    Hopefully this bug will be fixed in NSS 3.12.9.
-  // 2. NSS considers all certificates issued by the CA as revoked when it
-  //    receives a CRL with an invalid signature.  This overly strict policy
-  //    has been relaxed in NSS 3.12.7.  See
-  //    https://bugzilla.mozilla.org/show_bug.cgi?id=562542.
-  // So we have to turn off CRL checking for these CAs.  See
-  // http://crbug.com/55695.
-  static const char* const kMultipleKeyCA[] = {
-    "CN=Microsoft Secure Server Authority,"
-    "DC=redmond,DC=corp,DC=microsoft,DC=com",
-    "CN=Microsoft Secure Server Authority",
-  };
-
-  if (!NSS_VersionCheck("3.12.7")) {
-    for (size_t i = 0; i < arraysize(kMultipleKeyCA); ++i) {
-      if (strcmp(cert_handle->issuerName, kMultipleKeyCA[i]) == 0) {
-        use_crl = false;
-        break;
-      }
-    }
-  }
-
   PRUint64 revocation_method_flags =
       CERT_REV_M_DO_NOT_TEST_USING_THIS_METHOD |
       CERT_REV_M_ALLOW_NETWORK_FETCHING |
diff --git a/net/cert/jwk_serializer.h b/net/cert/jwk_serializer.h
new file mode 100644
index 0000000..7a12a36
--- /dev/null
+++ b/net/cert/jwk_serializer.h
@@ -0,0 +1,30 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_CERT_JWK_SERIALIZER_H_
+#define NET_CERT_JWK_SERIALIZER_H_
+
+#include "base/strings/string_piece.h"
+#include "net/base/net_export.h"
+
+namespace base {
+class DictionaryValue;
+}
+
+namespace net {
+
+namespace JwkSerializer {
+
+// Converts a subject public key info from DER to JWK.
+// See http://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-13 for
+// the output format.
+NET_EXPORT_PRIVATE bool ConvertSpkiFromDerToJwk(
+    const base::StringPiece& spki_der,
+    base::DictionaryValue* public_key_jwk);
+
+} // namespace JwkSerializer
+
+} // namespace net
+
+#endif  // NET_CERT_JWK_SERIALIZER_H_
diff --git a/net/cert/jwk_serializer_nss.cc b/net/cert/jwk_serializer_nss.cc
new file mode 100644
index 0000000..0259c5c
--- /dev/null
+++ b/net/cert/jwk_serializer_nss.cc
@@ -0,0 +1,118 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/cert/jwk_serializer.h"
+
+#include <cert.h>
+#include <keyhi.h>
+#include <nss.h>
+
+#include "base/base64.h"
+#include "base/values.h"
+#include "crypto/nss_util.h"
+#include "crypto/scoped_nss_types.h"
+
+namespace net {
+
+namespace JwkSerializer {
+
+namespace {
+
+bool ConvertEcPrime256v1PublicKeyInfoToJwk(
+    CERTSubjectPublicKeyInfo* spki,
+    base::DictionaryValue* public_key_jwk) {
+  static const int kPrime256v1EncodingType = 4;
+  static const int kPrime256v1PublicKeyLength = 64;
+  // The public key value is encoded as 0x04 + 64 bytes of public key.
+  // NSS gives the length as the bit length.
+  if (spki->subjectPublicKey.len != (kPrime256v1PublicKeyLength + 1) * 8 ||
+      spki->subjectPublicKey.data[0] != kPrime256v1EncodingType)
+    return false;
+
+  public_key_jwk->SetString("alg", "EC");
+  public_key_jwk->SetString("crv", "P-256");
+
+  base::StringPiece x(
+      reinterpret_cast<char*>(spki->subjectPublicKey.data + 1),
+      kPrime256v1PublicKeyLength / 2);
+  std::string x_b64;
+  base::Base64Encode(x, &x_b64);
+  public_key_jwk->SetString("x", x_b64);
+
+  base::StringPiece y(
+      reinterpret_cast<char*>(spki->subjectPublicKey.data + 1 +
+                              kPrime256v1PublicKeyLength / 2),
+      kPrime256v1PublicKeyLength / 2);
+  std::string y_b64;
+  base::Base64Encode(y, &y_b64);
+  public_key_jwk->SetString("y", y_b64);
+  return true;
+}
+
+bool ConvertEcPublicKeyInfoToJwk(
+    CERTSubjectPublicKeyInfo* spki,
+    base::DictionaryValue* public_key_jwk) {
+  // 1.2.840.10045.3.1.7
+  // (iso.member-body.us.ansi-x9-62.ellipticCurve.primeCurve.prime256v1)
+  // (This includes the DER-encoded type (OID) and length: parameters can be
+  // anything, so the DER type isn't implied, and NSS includes it.)
+  static const unsigned char kPrime256v1[] = {
+    0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07
+  };
+  if (spki->algorithm.parameters.len == sizeof(kPrime256v1) &&
+      !memcmp(spki->algorithm.parameters.data, kPrime256v1,
+              sizeof(kPrime256v1))) {
+    return ConvertEcPrime256v1PublicKeyInfoToJwk(spki, public_key_jwk);
+  }
+  // TODO(juanlang): other curves
+  return false;
+}
+
+typedef scoped_ptr_malloc<
+    CERTSubjectPublicKeyInfo,
+    crypto::NSSDestroyer<CERTSubjectPublicKeyInfo,
+                         SECKEY_DestroySubjectPublicKeyInfo> >
+    ScopedCERTSubjectPublicKeyInfo;
+
+}  // namespace
+
+bool ConvertSpkiFromDerToJwk(
+    const base::StringPiece& spki_der,
+    base::DictionaryValue* public_key_jwk) {
+  public_key_jwk->Clear();
+
+  crypto::EnsureNSSInit();
+
+  if (!NSS_IsInitialized())
+    return false;
+
+  SECItem sec_item;
+  sec_item.data = const_cast<unsigned char*>(
+      reinterpret_cast<const unsigned char*>(spki_der.data()));
+  sec_item.len = spki_der.size();
+  ScopedCERTSubjectPublicKeyInfo spki(
+      SECKEY_DecodeDERSubjectPublicKeyInfo(&sec_item));
+  if (!spki)
+    return false;
+
+  // 1.2.840.10045.2
+  // (iso.member-body.us.ansi-x9-62.id-ecPublicKey)
+  // (This omits the ASN.1 encoding of the type (OID) and length: the fact that
+  // this is an OID is already clear, and NSS omits it here.)
+  static const unsigned char kIdEcPublicKey[] = {
+    0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01
+  };
+  bool rv = false;
+  if (spki->algorithm.algorithm.len == sizeof(kIdEcPublicKey) &&
+      !memcmp(spki->algorithm.algorithm.data, kIdEcPublicKey,
+              sizeof(kIdEcPublicKey))) {
+    rv = ConvertEcPublicKeyInfoToJwk(spki.get(), public_key_jwk);
+  }
+  // TODO(juanlang): other algorithms
+  return rv;
+}
+
+}  // namespace JwkSerializer
+
+}  // namespace net
diff --git a/net/cert/jwk_serializer_openssl.cc b/net/cert/jwk_serializer_openssl.cc
new file mode 100644
index 0000000..ef15b4b
--- /dev/null
+++ b/net/cert/jwk_serializer_openssl.cc
@@ -0,0 +1,22 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/logging.h"
+#include "net/cert/jwk_serializer.h"
+
+namespace net {
+
+namespace JwkSerializer {
+
+bool ConvertSpkiFromDerToJwk(
+    const base::StringPiece& spki_der,
+    base::DictionaryValue* public_key_jwk) {
+  // TODO(juanlang): implement
+  NOTIMPLEMENTED();
+  return false;
+}
+
+}  // namespace JwkSerializer
+
+}  // namespace net
diff --git a/net/cert/jwk_serializer_unittest.cc b/net/cert/jwk_serializer_unittest.cc
new file mode 100644
index 0000000..37b8002
--- /dev/null
+++ b/net/cert/jwk_serializer_unittest.cc
@@ -0,0 +1,148 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/cert/jwk_serializer.h"
+
+#include "base/base64.h"
+#include "base/values.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace net {
+
+// This is the ASN.1 prefix for a P-256 public key. Specifically it's:
+// SEQUENCE
+//   SEQUENCE
+//     OID id-ecPublicKey
+//     OID prime256v1
+//   BIT STRING, length 66, 0 trailing bits: 0x04
+//
+// The 0x04 in the BIT STRING is the prefix for an uncompressed, X9.62
+// public key. Following that are the two field elements as 32-byte,
+// big-endian numbers, as required by the Channel ID.
+static const unsigned char kP256SpkiPrefix[] = {
+    0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86,
+    0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
+    0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
+    0x42, 0x00, 0x04
+};
+static const unsigned int kEcPointSize = 32U;
+
+// This is a valid P-256 public key.
+static const unsigned char kSpkiEc[] = {
+    0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86,
+    0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
+    0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
+    0x42, 0x00, 0x04,
+    0x29, 0x5d, 0x6e, 0xfe, 0x33, 0x77, 0x26, 0xea,
+    0x5b, 0xa4, 0xe6, 0x1b, 0x34, 0x6e, 0x7b, 0xa0,
+    0xa3, 0x8f, 0x33, 0x49, 0xa0, 0x9c, 0xae, 0x98,
+    0xbd, 0x46, 0x0d, 0xf6, 0xd4, 0x5a, 0xdc, 0x8a,
+    0x1f, 0x8a, 0xb2, 0x20, 0x51, 0xb7, 0xd2, 0x87,
+    0x0d, 0x53, 0x7e, 0x5d, 0x94, 0xa3, 0xe0, 0x34,
+    0x16, 0xa1, 0xcc, 0x10, 0x48, 0xcd, 0x70, 0x9c,
+    0x05, 0xd3, 0xd2, 0xca, 0xdf, 0x44, 0x2f, 0xf4
+};
+
+// This is a P-256 public key with 0 X and Y values.
+static const unsigned char kSpkiEcWithZeroXY[] = {
+    0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86,
+    0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
+    0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
+    0x42, 0x00, 0x04,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+#if !defined(USE_OPENSSL)
+
+TEST(JwkSerializerNSSTest, ConvertSpkiFromDerToJwkEc) {
+  base::StringPiece spki;
+  base::DictionaryValue public_key_jwk;
+
+  EXPECT_FALSE(JwkSerializer::ConvertSpkiFromDerToJwk(spki, &public_key_jwk));
+  EXPECT_TRUE(public_key_jwk.empty());
+
+  // Test the result of a "normal" point on this curve.
+  spki.set(reinterpret_cast<const char*>(kSpkiEc), sizeof(kSpkiEc));
+  EXPECT_TRUE(JwkSerializer::ConvertSpkiFromDerToJwk(spki, &public_key_jwk));
+
+  std::string string_value;
+  EXPECT_TRUE(public_key_jwk.GetString("alg", &string_value));
+  EXPECT_STREQ("EC", string_value.c_str());
+  EXPECT_TRUE(public_key_jwk.GetString("crv", &string_value));
+  EXPECT_STREQ("P-256", string_value.c_str());
+
+  EXPECT_TRUE(public_key_jwk.GetString("x", &string_value));
+  std::string decoded_coordinate;
+  EXPECT_TRUE(base::Base64Decode(string_value, &decoded_coordinate));
+  EXPECT_EQ(kEcPointSize, decoded_coordinate.size());
+  EXPECT_EQ(0,
+            memcmp(decoded_coordinate.data(),
+                   kSpkiEc + sizeof(kP256SpkiPrefix),
+                   kEcPointSize));
+
+  EXPECT_TRUE(public_key_jwk.GetString("y", &string_value));
+  EXPECT_TRUE(base::Base64Decode(string_value, &decoded_coordinate));
+  EXPECT_EQ(kEcPointSize, decoded_coordinate.size());
+  EXPECT_EQ(0,
+            memcmp(decoded_coordinate.data(),
+                  kSpkiEc + sizeof(kP256SpkiPrefix) + kEcPointSize,
+                  kEcPointSize));
+
+  // Test the result of a corner case: leading 0s in the x, y coordinates are
+  // not trimmed, but the point is fixed-length encoded.
+  spki.set(reinterpret_cast<const char*>(kSpkiEcWithZeroXY),
+           sizeof(kSpkiEcWithZeroXY));
+  EXPECT_TRUE(JwkSerializer::ConvertSpkiFromDerToJwk(spki, &public_key_jwk));
+
+  EXPECT_TRUE(public_key_jwk.GetString("alg", &string_value));
+  EXPECT_STREQ("EC", string_value.c_str());
+  EXPECT_TRUE(public_key_jwk.GetString("crv", &string_value));
+  EXPECT_STREQ("P-256", string_value.c_str());
+
+  EXPECT_TRUE(public_key_jwk.GetString("x", &string_value));
+  EXPECT_TRUE(base::Base64Decode(string_value, &decoded_coordinate));
+  EXPECT_EQ(kEcPointSize, decoded_coordinate.size());
+  EXPECT_EQ(0,
+            memcmp(decoded_coordinate.data(),
+                   kSpkiEcWithZeroXY + sizeof(kP256SpkiPrefix),
+                   kEcPointSize));
+
+  EXPECT_TRUE(public_key_jwk.GetString("y", &string_value));
+  EXPECT_TRUE(base::Base64Decode(string_value, &decoded_coordinate));
+  EXPECT_EQ(kEcPointSize, decoded_coordinate.size());
+  EXPECT_EQ(0,
+            memcmp(decoded_coordinate.data(),
+                   kSpkiEcWithZeroXY + sizeof(kP256SpkiPrefix) + kEcPointSize,
+                   kEcPointSize));
+}
+
+#else
+
+// For OpenSSL, JwkSerializer::ConvertSpkiFromDerToJwk() is not yet implemented
+// and should return false.  This unit test ensures that a stub implementation
+// is present.
+TEST(JwkSerializerOpenSSLTest, ConvertSpkiFromDerToJwkNotImplemented) {
+  base::StringPiece spki;
+  base::DictionaryValue public_key_jwk;
+
+  // The empty SPKI is trivially non-convertible...
+  EXPECT_FALSE(JwkSerializer::ConvertSpkiFromDerToJwk(spki, &public_key_jwk));
+  EXPECT_TRUE(public_key_jwk.empty());
+  // but even a valid SPKI is non-convertible via the stub OpenSSL
+  // implementation.
+  spki.set(reinterpret_cast<const char*>(kSpkiEc), sizeof(kSpkiEc));
+  EXPECT_FALSE(JwkSerializer::ConvertSpkiFromDerToJwk(spki, &public_key_jwk));
+  EXPECT_TRUE(public_key_jwk.empty());
+}
+
+#endif  // !defined(USE_OPENSSL)
+
+}  // namespace net
diff --git a/net/disk_cache/simple/simple_entry_impl.cc b/net/disk_cache/simple/simple_entry_impl.cc
index 7bef5f0..3c3ec7d 100644
--- a/net/disk_cache/simple/simple_entry_impl.cc
+++ b/net/disk_cache/simple/simple_entry_impl.cc
@@ -125,14 +125,6 @@
                              g_open_entry_count);
 }
 
-bool OperationsConflict(int index1, int offset1, int length1, bool truncate1,
-                        int index2, int offset2, int length2, bool truncate2) {
-  int end1 = truncate1 ? INT_MAX : offset1 + length1;
-  int end2 = truncate2 ? INT_MAX : offset2 + length2;
-  bool ranges_intersect = (offset1 < end2 && offset2 < end1);
-  return (index1 == index2 && ranges_intersect);
-}
-
 }  // namespace
 
 namespace disk_cache {
@@ -220,11 +212,8 @@
     return net::ERR_FAILED;
   }
 
-  EnqueueOperation(base::Bind(&SimpleEntryImpl::OpenEntryInternal,
-                              this,
-                              have_index,
-                              callback,
-                              out_entry));
+  pending_operations_.push(SimpleEntryOperation::OpenOperation(
+      this, have_index, callback, out_entry));
   RunNextOperationIfNeeded();
   return net::ERR_IO_PENDING;
 }
@@ -243,18 +232,12 @@
     net_log_.AddEvent(net::NetLog::TYPE_SIMPLE_CACHE_ENTRY_CREATE_OPTIMISTIC);
 
     ReturnEntryToCaller(out_entry);
-    EnqueueOperation(base::Bind(&SimpleEntryImpl::CreateEntryInternal,
-                                this,
-                                have_index,
-                                CompletionCallback(),
-                                static_cast<Entry**>(NULL)));
+    pending_operations_.push(SimpleEntryOperation::CreateOperation(
+        this, have_index, CompletionCallback(), static_cast<Entry**>(NULL)));
     ret_value = net::OK;
   } else {
-    EnqueueOperation(base::Bind(&SimpleEntryImpl::CreateEntryInternal,
-                                this,
-                                have_index,
-                                callback,
-                                out_entry));
+    pending_operations_.push(SimpleEntryOperation::CreateOperation(
+        this, have_index, callback, out_entry));
     ret_value = net::ERR_IO_PENDING;
   }
 
@@ -305,7 +288,7 @@
     return;
   }
 
-  EnqueueOperation(base::Bind(&SimpleEntryImpl::CloseInternal, this));
+  pending_operations_.push(SimpleEntryOperation::CloseOperation(this));
   DCHECK(!HasOneRef());
   Release();  // Balanced in ReturnEntryToCaller().
   RunNextOperationIfNeeded();
@@ -368,16 +351,10 @@
 
   // TODO(felipeg): Optimization: Add support for truly parallel read
   // operations.
-  EnqueueReadOperation(base::Bind(&SimpleEntryImpl::ReadDataInternal,
-                                  this,
-                                  stream_index,
-                                  offset,
-                                  make_scoped_refptr(buf),
-                                  buf_len,
-                                  callback),
-                       stream_index,
-                       offset,
-                       buf_len);
+  bool alone_in_queue =
+      pending_operations_.size() == 0 && state_ == STATE_READY;
+  pending_operations_.push(SimpleEntryOperation::ReadOperation(
+      this, stream_index, offset, buf_len, buf, callback, alone_in_queue));
   RunNextOperationIfNeeded();
   return net::ERR_IO_PENDING;
 }
@@ -462,13 +439,14 @@
     }
   }
 
-  EnqueueWriteOperation(optimistic,
-                        stream_index,
-                        offset,
-                        op_buf.get(),
-                        buf_len,
-                        truncate,
-                        op_callback);
+  pending_operations_.push(SimpleEntryOperation::WriteOperation(this,
+                                                                stream_index,
+                                                                offset,
+                                                                buf_len,
+                                                                op_buf.get(),
+                                                                truncate,
+                                                                optimistic,
+                                                                op_callback));
   return ret_value;
 }
 
@@ -521,9 +499,6 @@
   return net::ERR_FAILED;
 }
 
-SimpleEntryImpl::LastQueuedOpInfo::LastQueuedOpInfo()
-    : is_optimistic_write(false), is_write(false), is_read(false) {}
-
 SimpleEntryImpl::~SimpleEntryImpl() {
   DCHECK(io_thread_checker_.CalledOnValidThread());
   DCHECK_EQ(0U, pending_operations_.size());
@@ -570,98 +545,51 @@
   UMA_HISTOGRAM_CUSTOM_COUNTS("SimpleCache.EntryOperationsPending",
                               pending_operations_.size(), 0, 100, 20);
   if (!pending_operations_.empty() && state_ != STATE_IO_PENDING) {
-    base::Closure operation = pending_operations_.front();
+    scoped_ptr<SimpleEntryOperation> operation(
+        new SimpleEntryOperation(pending_operations_.front()));
     pending_operations_.pop();
-    operation.Run();
+    switch (operation->type()) {
+      case SimpleEntryOperation::TYPE_OPEN:
+        OpenEntryInternal(operation->have_index(),
+                          operation->callback(),
+                          operation->out_entry());
+        break;
+      case SimpleEntryOperation::TYPE_CREATE:
+        CreateEntryInternal(operation->have_index(),
+                            operation->callback(),
+                            operation->out_entry());
+        break;
+      case SimpleEntryOperation::TYPE_CLOSE:
+        CloseInternal();
+        break;
+      case SimpleEntryOperation::TYPE_READ:
+        RecordReadIsParallelizable(*operation);
+        ReadDataInternal(operation->index(),
+                         operation->offset(),
+                         operation->buf(),
+                         operation->length(),
+                         operation->callback());
+        break;
+      case SimpleEntryOperation::TYPE_WRITE:
+        RecordWriteDependencyType(*operation);
+        WriteDataInternal(operation->index(),
+                          operation->offset(),
+                          operation->buf(),
+                          operation->length(),
+                          operation->callback(),
+                          operation->truncate());
+        break;
+      default:
+        NOTREACHED();
+    }
+    // The operation is kept for histograms. Makes sure it does not leak
+    // resources.
+    executing_operation_.swap(operation);
+    executing_operation_->ReleaseReferences();
     // |this| may have been deleted.
   }
 }
 
-void SimpleEntryImpl::EnqueueOperation(const base::Closure& operation) {
-  last_op_info_.is_read = false;
-  last_op_info_.is_write = false;
-  last_op_info_.is_optimistic_write = false;
-  pending_operations_.push(operation);
-}
-
-void SimpleEntryImpl::EnqueueReadOperation(const base::Closure& operation,
-                                           int index,
-                                           int offset,
-                                           int length) {
-  bool parallelizable_read = last_op_info_.is_read &&
-      (!pending_operations_.empty() || state_ == STATE_IO_PENDING);
-  UMA_HISTOGRAM_BOOLEAN("SimpleCache.ReadIsParallelizable",
-                        parallelizable_read);
-  last_op_info_.is_read = true;
-  last_op_info_.is_write = false;
-  last_op_info_.is_optimistic_write = false;
-  last_op_info_.io_index = index;
-  last_op_info_.io_offset = offset;
-  last_op_info_.io_length = length;
-  pending_operations_.push(operation);
-}
-
-void SimpleEntryImpl::EnqueueWriteOperation(
-    bool optimistic,
-    int index,
-    int offset,
-    net::IOBuffer* buf,
-    int length,
-    bool truncate,
-    const CompletionCallback& callback) {
-  // Used in histograms, please only add entries at the end.
-  enum WriteDependencyType {
-    WRITE_OPTIMISTIC = 0,
-    WRITE_FOLLOWS_CONFLICTING_OPTIMISTIC = 1,
-    WRITE_FOLLOWS_NON_CONFLICTING_OPTIMISTIC = 2,
-    WRITE_FOLLOWS_CONFLICTING_WRITE = 3,
-    WRITE_FOLLOWS_NON_CONFLICTING_WRITE = 4,
-    WRITE_FOLLOWS_CONFLICTING_READ = 5,
-    WRITE_FOLLOWS_NON_CONFLICTING_READ = 6,
-    WRITE_FOLLOWS_OTHER = 7,
-    WRITE_DEPENDENCY_TYPE_MAX = 8,
-  };
-
-  WriteDependencyType type = WRITE_FOLLOWS_OTHER;
-  if (optimistic) {
-    type = WRITE_OPTIMISTIC;
-  } else if (last_op_info_.is_read || last_op_info_.is_write) {
-    bool conflicting = OperationsConflict(
-        index, offset, length, truncate,
-        last_op_info_.io_index,
-        last_op_info_.io_offset, last_op_info_.io_length,
-        last_op_info_.truncate && last_op_info_.is_write);
-
-    if (last_op_info_.is_optimistic_write) {
-      type = conflicting ? WRITE_FOLLOWS_CONFLICTING_OPTIMISTIC
-                         : WRITE_FOLLOWS_NON_CONFLICTING_OPTIMISTIC;
-    } else if (last_op_info_.is_read) {
-      type = conflicting ? WRITE_FOLLOWS_CONFLICTING_READ
-                         : WRITE_FOLLOWS_NON_CONFLICTING_READ;
-    } else {
-      type = conflicting ? WRITE_FOLLOWS_CONFLICTING_WRITE
-                         : WRITE_FOLLOWS_NON_CONFLICTING_WRITE;
-    }
-  }
-  UMA_HISTOGRAM_ENUMERATION(
-      "SimpleCache.WriteDependencyType", type, WRITE_DEPENDENCY_TYPE_MAX);
-  last_op_info_.is_read = false;
-  last_op_info_.is_write = true;
-  last_op_info_.is_optimistic_write = optimistic;
-  last_op_info_.io_index = index;
-  last_op_info_.io_offset = offset;
-  last_op_info_.io_length = length;
-  last_op_info_.truncate = truncate;
-  pending_operations_.push(base::Bind(&SimpleEntryImpl::WriteDataInternal,
-                                      this,
-                                      index,
-                                      offset,
-                                      make_scoped_refptr(buf),
-                                      length,
-                                      callback,
-                                      truncate));
-}
-
 void SimpleEntryImpl::OpenEntryInternal(bool have_index,
                                         const CompletionCallback& callback,
                                         Entry** out_entry) {
@@ -1204,4 +1132,56 @@
   return file_size;
 }
 
+void SimpleEntryImpl::RecordReadIsParallelizable(
+    const SimpleEntryOperation& operation) const {
+  if (!executing_operation_)
+    return;
+  // TODO(clamy): The values of this histogram should be changed to something
+  // more useful.
+  bool parallelizable_read =
+      !operation.alone_in_queue() &&
+      executing_operation_->type() == SimpleEntryOperation::TYPE_READ;
+  UMA_HISTOGRAM_BOOLEAN("SimpleCache.ReadIsParallelizable",
+                        parallelizable_read);
+}
+
+void SimpleEntryImpl::RecordWriteDependencyType(
+    const SimpleEntryOperation& operation) const {
+  if (!executing_operation_)
+    return;
+  // Used in histograms, please only add entries at the end.
+  enum WriteDependencyType {
+    WRITE_OPTIMISTIC = 0,
+    WRITE_FOLLOWS_CONFLICTING_OPTIMISTIC = 1,
+    WRITE_FOLLOWS_NON_CONFLICTING_OPTIMISTIC = 2,
+    WRITE_FOLLOWS_CONFLICTING_WRITE = 3,
+    WRITE_FOLLOWS_NON_CONFLICTING_WRITE = 4,
+    WRITE_FOLLOWS_CONFLICTING_READ = 5,
+    WRITE_FOLLOWS_NON_CONFLICTING_READ = 6,
+    WRITE_FOLLOWS_OTHER = 7,
+    WRITE_DEPENDENCY_TYPE_MAX = 8,
+  };
+
+  WriteDependencyType type = WRITE_FOLLOWS_OTHER;
+  if (operation.optimistic()) {
+    type = WRITE_OPTIMISTIC;
+  } else if (executing_operation_->type() == SimpleEntryOperation::TYPE_READ ||
+             executing_operation_->type() == SimpleEntryOperation::TYPE_WRITE) {
+    bool conflicting = executing_operation_->ConflictsWith(operation);
+
+    if (executing_operation_->type() == SimpleEntryOperation::TYPE_READ) {
+      type = conflicting ? WRITE_FOLLOWS_CONFLICTING_READ
+                         : WRITE_FOLLOWS_NON_CONFLICTING_READ;
+    } else if (executing_operation_->optimistic()) {
+      type = conflicting ? WRITE_FOLLOWS_CONFLICTING_OPTIMISTIC
+                         : WRITE_FOLLOWS_NON_CONFLICTING_OPTIMISTIC;
+    } else {
+      type = conflicting ? WRITE_FOLLOWS_CONFLICTING_WRITE
+                         : WRITE_FOLLOWS_NON_CONFLICTING_WRITE;
+    }
+  }
+  UMA_HISTOGRAM_ENUMERATION(
+      "SimpleCache.WriteDependencyType", type, WRITE_DEPENDENCY_TYPE_MAX);
+}
+
 }  // namespace disk_cache
diff --git a/net/disk_cache/simple/simple_entry_impl.h b/net/disk_cache/simple/simple_entry_impl.h
index be28fb8..7eb8914 100644
--- a/net/disk_cache/simple/simple_entry_impl.h
+++ b/net/disk_cache/simple/simple_entry_impl.h
@@ -16,6 +16,7 @@
 #include "net/base/net_log.h"
 #include "net/disk_cache/disk_cache.h"
 #include "net/disk_cache/simple/simple_entry_format.h"
+#include "net/disk_cache/simple/simple_entry_operation.h"
 
 namespace base {
 class TaskRunner;
@@ -129,22 +130,6 @@
     CRC_CHECK_MAX = 4,
   };
 
-  // Used in histograms.
-  struct LastQueuedOpInfo {
-    LastQueuedOpInfo();
-
-    // Used for SimpleCache.WriteDependencyType.
-    int io_index;
-    int io_offset;
-    int io_length;
-    bool is_optimistic_write;
-    bool is_write;
-    bool truncate;
-
-    // Used for SimpleCache.ReadIsParallelizable histogram.
-    bool is_read;
-  };
-
   virtual ~SimpleEntryImpl();
 
   // Sets entry to STATE_UNINITIALIZED.
@@ -169,24 +154,6 @@
   // the last reference.
   void RunNextOperationIfNeeded();
 
-  // Adds a non read operation to the queue of operations.
-  void EnqueueOperation(const base::Closure& operation);
-
-  // Adds a read operation to the queue of operations.
-  void EnqueueReadOperation(const base::Closure& operation,
-                            int index,
-                            int offset,
-                            int length);
-
-  // Adds a write operation to the queue of operations.
-  void EnqueueWriteOperation(bool optimistic,
-                             int index,
-                             int offset,
-                             net::IOBuffer* buf,
-                             int length,
-                             bool truncate,
-                             const CompletionCallback& callback);
-
   void OpenEntryInternal(bool have_index,
                          const CompletionCallback& callback,
                          Entry** out_entry);
@@ -263,6 +230,10 @@
 
   int64 GetDiskUsage() const;
 
+  // Used to report histograms.
+  void RecordReadIsParallelizable(const SimpleEntryOperation& operation) const;
+  void RecordWriteDependencyType(const SimpleEntryOperation& operation) const;
+
   // All nonstatic SimpleEntryImpl methods should always be called on the IO
   // thread, in all cases. |io_thread_checker_| documents and enforces this.
   base::ThreadChecker io_thread_checker_;
@@ -307,11 +278,11 @@
   // is false (i.e. when an operation is not pending on the worker pool).
   SimpleSynchronousEntry* synchronous_entry_;
 
-  std::queue<base::Closure> pending_operations_;
+  std::queue<SimpleEntryOperation> pending_operations_;
 
   net::BoundNetLog net_log_;
 
-  LastQueuedOpInfo last_op_info_;
+  scoped_ptr<SimpleEntryOperation> executing_operation_;
 };
 
 }  // namespace disk_cache
diff --git a/net/disk_cache/simple/simple_entry_operation.cc b/net/disk_cache/simple/simple_entry_operation.cc
new file mode 100644
index 0000000..81d5f7c
--- /dev/null
+++ b/net/disk_cache/simple/simple_entry_operation.cc
@@ -0,0 +1,184 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/disk_cache/simple/simple_entry_operation.h"
+
+#include "base/logging.h"
+#include "net/base/io_buffer.h"
+#include "net/disk_cache/disk_cache.h"
+#include "net/disk_cache/simple/simple_entry_impl.h"
+
+namespace disk_cache {
+
+SimpleEntryOperation::SimpleEntryOperation(const SimpleEntryOperation& other)
+    : entry_(other.entry_.get()),
+      buf_(other.buf_),
+      callback_(other.callback_),
+      out_entry_(other.out_entry_),
+      offset_(other.offset_),
+      length_(other.length_),
+      type_(other.type_),
+      have_index_(other.have_index_),
+      index_(other.index_),
+      truncate_(other.truncate_),
+      optimistic_(other.optimistic_),
+      alone_in_queue_(other.alone_in_queue_) {
+}
+
+SimpleEntryOperation::~SimpleEntryOperation() {}
+
+// Static.
+SimpleEntryOperation SimpleEntryOperation::OpenOperation(
+    SimpleEntryImpl* entry,
+    bool have_index,
+    const CompletionCallback& callback,
+    Entry** out_entry) {
+  return SimpleEntryOperation(entry,
+                              NULL,
+                              callback,
+                              out_entry,
+                              0,
+                              0,
+                              TYPE_OPEN,
+                              have_index,
+                              0,
+                              false,
+                              false,
+                              false);
+}
+
+// Static.
+SimpleEntryOperation SimpleEntryOperation::CreateOperation(
+    SimpleEntryImpl* entry,
+    bool have_index,
+    const CompletionCallback& callback,
+    Entry** out_entry) {
+  return SimpleEntryOperation(entry,
+                              NULL,
+                              callback,
+                              out_entry,
+                              0,
+                              0,
+                              TYPE_CREATE,
+                              have_index,
+                              0,
+                              false,
+                              false,
+                              false);
+}
+
+// Static.
+SimpleEntryOperation SimpleEntryOperation::CloseOperation(
+    SimpleEntryImpl* entry) {
+  return SimpleEntryOperation(entry,
+                              NULL,
+                              CompletionCallback(),
+                              NULL,
+                              0,
+                              0,
+                              TYPE_CLOSE,
+                              false,
+                              0,
+                              false,
+                              false,
+                              false);
+}
+
+// Static.
+SimpleEntryOperation SimpleEntryOperation::ReadOperation(
+    SimpleEntryImpl* entry,
+    int index,
+    int offset,
+    int length,
+    net::IOBuffer* buf,
+    const CompletionCallback& callback,
+    bool alone_in_queue) {
+  return SimpleEntryOperation(entry,
+                              buf,
+                              callback,
+                              NULL,
+                              offset,
+                              length,
+                              TYPE_READ,
+                              false,
+                              index,
+                              false,
+                              false,
+                              alone_in_queue);
+}
+
+// Static.
+SimpleEntryOperation SimpleEntryOperation::WriteOperation(
+    SimpleEntryImpl* entry,
+    int index,
+    int offset,
+    int length,
+    net::IOBuffer* buf,
+    bool truncate,
+    bool optimistic,
+    const CompletionCallback& callback) {
+  return SimpleEntryOperation(entry,
+                              buf,
+                              callback,
+                              NULL,
+                              offset,
+                              length,
+                              TYPE_WRITE,
+                              false,
+                              index,
+                              truncate,
+                              optimistic,
+                              false);
+}
+
+bool SimpleEntryOperation::ConflictsWith(
+    const SimpleEntryOperation& other_op) const {
+  if (type_ != TYPE_READ && type_ != TYPE_WRITE)
+    return true;
+  if (other_op.type() != TYPE_READ && other_op.type() != TYPE_WRITE)
+    return true;
+  if (type() == TYPE_READ && other_op.type() == TYPE_READ)
+    return false;
+  if (index_ != other_op.index_)
+    return false;
+  int end = (type_ == TYPE_WRITE && truncate_) ? INT_MAX : offset_ + length_;
+  int other_op_end = (other_op.type() == TYPE_WRITE && other_op.truncate())
+                         ? INT_MAX
+                         : other_op.offset() + other_op.length();
+  return (offset_ < other_op_end && other_op.offset() < end);
+}
+
+void SimpleEntryOperation::ReleaseReferences() {
+  callback_ = CompletionCallback();
+  buf_ = NULL;
+  entry_ = NULL;
+}
+
+SimpleEntryOperation::SimpleEntryOperation(SimpleEntryImpl* entry,
+                                           net::IOBuffer* buf,
+                                           const CompletionCallback& callback,
+                                           Entry** out_entry,
+                                           int offset,
+                                           int length,
+                                           EntryOperationType type,
+                                           bool have_index,
+                                           int index,
+                                           bool truncate,
+                                           bool optimistic,
+                                           bool alone_in_queue)
+    : entry_(entry),
+      buf_(buf),
+      callback_(callback),
+      out_entry_(out_entry),
+      offset_(offset),
+      length_(length),
+      type_(type),
+      have_index_(have_index),
+      index_(index),
+      truncate_(truncate),
+      optimistic_(optimistic),
+      alone_in_queue_(alone_in_queue) {
+}
+
+}  // namespace disk_cache
diff --git a/net/disk_cache/simple/simple_entry_operation.h b/net/disk_cache/simple/simple_entry_operation.h
new file mode 100644
index 0000000..acdd60a
--- /dev/null
+++ b/net/disk_cache/simple/simple_entry_operation.h
@@ -0,0 +1,125 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_DISK_CACHE_SIMPLE_SIMPLE_ENTRY_OPERATION_H_
+#define NET_DISK_CACHE_SIMPLE_SIMPLE_ENTRY_OPERATION_H_
+
+#include "base/memory/ref_counted.h"
+#include "net/base/completion_callback.h"
+#include "net/base/net_log.h"
+
+namespace net {
+class IOBuffer;
+}
+
+namespace disk_cache {
+
+class Entry;
+class SimpleEntryImpl;
+
+// SimpleEntryOperation stores the information regarding operations in
+// SimpleEntryImpl, between the moment they are issued by users of the backend,
+// and the moment when they are executed.
+class SimpleEntryOperation {
+ public:
+  typedef net::CompletionCallback CompletionCallback;
+
+  enum EntryOperationType {
+    TYPE_OPEN = 0,
+    TYPE_CREATE = 1,
+    TYPE_CLOSE = 2,
+    TYPE_READ = 3,
+    TYPE_WRITE = 4,
+  };
+
+  SimpleEntryOperation(const SimpleEntryOperation& other);
+  ~SimpleEntryOperation();
+
+  static SimpleEntryOperation OpenOperation(SimpleEntryImpl* entry,
+                                            bool have_index,
+                                            const CompletionCallback& callback,
+                                            Entry** out_entry);
+  static SimpleEntryOperation CreateOperation(
+      SimpleEntryImpl* entry,
+      bool have_index,
+      const CompletionCallback& callback,
+      Entry** out_entry);
+  static SimpleEntryOperation CloseOperation(SimpleEntryImpl* entry);
+  static SimpleEntryOperation ReadOperation(SimpleEntryImpl* entry,
+                                            int index,
+                                            int offset,
+                                            int length,
+                                            net::IOBuffer* buf,
+                                            const CompletionCallback& callback,
+                                            bool alone_in_queue);
+  static SimpleEntryOperation WriteOperation(
+      SimpleEntryImpl* entry,
+      int index,
+      int offset,
+      int length,
+      net::IOBuffer* buf,
+      bool truncate,
+      bool optimistic,
+      const CompletionCallback& callback);
+
+  bool ConflictsWith(const SimpleEntryOperation& other_op) const;
+  // Releases all references. After calling this operation, SimpleEntryOperation
+  // will only hold POD members.
+  void ReleaseReferences();
+
+  EntryOperationType type() const {
+    return static_cast<EntryOperationType>(type_);
+  }
+  const CompletionCallback& callback() const { return callback_; }
+  Entry** out_entry() { return out_entry_; }
+  bool have_index() const { return have_index_; }
+  int index() const { return index_; }
+  int offset() const { return offset_; }
+  int length() const { return length_; }
+  net::IOBuffer* buf() { return buf_.get(); }
+  bool truncate() const { return truncate_; }
+  bool optimistic() const { return optimistic_; }
+  bool alone_in_queue() const { return alone_in_queue_; }
+
+ private:
+  SimpleEntryOperation(SimpleEntryImpl* entry,
+                       net::IOBuffer* buf,
+                       const CompletionCallback& callback,
+                       Entry** out_entry,
+                       int offset,
+                       int length,
+                       EntryOperationType type,
+                       bool have_index,
+                       int index,
+                       bool truncate,
+                       bool optimistic,
+                       bool alone_in_queue);
+
+  // This ensures entry will not be deleted until the operation has ran.
+  scoped_refptr<SimpleEntryImpl> entry_;
+  scoped_refptr<net::IOBuffer> buf_;
+  CompletionCallback callback_;
+
+  // Used in open and create operations.
+  Entry** out_entry_;
+
+  // Used in write and read operations.
+  const int offset_;
+  const int length_;
+
+  const unsigned int type_ : 3;           /* 3 */
+  // Used in open and create operations.
+  const unsigned int have_index_ : 1;     /* 4 */
+  // Used in write and read operations.
+  const unsigned int index_ : 2;          /* 6 */
+  // Used only in write operations.
+  const unsigned int truncate_ : 1;       /* 7 */
+  const unsigned int optimistic_ : 1;     /* 8 */
+  // Used only in SimpleCache.ReadIsParallelizable histogram.
+  const unsigned int alone_in_queue_ : 1; /* 9 */
+};
+
+}  // namespace disk_cache
+
+#endif  // NET_DISK_CACHE_SIMPLE_SIMPLE_ENTRY_OPERATION_H_
diff --git a/net/dns/mdns_client_impl.cc b/net/dns/mdns_client_impl.cc
index 089a51a..8f79edf 100644
--- a/net/dns/mdns_client_impl.cc
+++ b/net/dns/mdns_client_impl.cc
@@ -622,8 +622,7 @@
     client_->core()->QueryCache(rrtype_, name_, &records);
     for (std::vector<const RecordParsed*>::iterator i = records.begin();
          i != records.end() && weak_this; ++i) {
-      weak_this->TriggerCallback(MDnsTransaction::RESULT_RECORD,
-                                 records.front());
+      weak_this->TriggerCallback(MDnsTransaction::RESULT_RECORD, *i);
     }
 
 #if defined(ENABLE_NSEC)
diff --git a/net/net.gyp b/net/net.gyp
index 8942367..0165031 100644
--- a/net/net.gyp
+++ b/net/net.gyp
@@ -271,6 +271,9 @@
         'cert/crl_set.h',
         'cert/ev_root_ca_metadata.cc',
         'cert/ev_root_ca_metadata.h',
+        'cert/jwk_serializer_nss.cc',
+        'cert/jwk_serializer_openssl.cc',
+        'cert/jwk_serializer.h',
         'cert/multi_threaded_cert_verifier.cc',
         'cert/multi_threaded_cert_verifier.h',
         'cert/nss_cert_database.cc',
@@ -390,6 +393,8 @@
         'disk_cache/simple/simple_entry_format.h',
         'disk_cache/simple/simple_entry_impl.cc',
         'disk_cache/simple/simple_entry_impl.h',
+        'disk_cache/simple/simple_entry_operation.cc',
+        'disk_cache/simple/simple_entry_operation.h',
         'disk_cache/simple/simple_index.cc',
         'disk_cache/simple/simple_index.h',
         'disk_cache/simple/simple_index_file.cc',
@@ -1199,6 +1204,7 @@
               'cert/cert_database_nss.cc',
               'cert/cert_verify_proc_nss.cc',
               'cert/cert_verify_proc_nss.h',
+              'cert/jwk_serializer_nss.cc',
               'cert/nss_cert_database.cc',
               'cert/nss_cert_database.h',
               'cert/test_root_certs_nss.cc',
@@ -1236,6 +1242,7 @@
               'cert/cert_database_openssl.cc',
               'cert/cert_verify_proc_openssl.cc',
               'cert/cert_verify_proc_openssl.h',
+              'cert/jwk_serializer_openssl.cc',
               'cert/test_root_certs_openssl.cc',
               'cert/x509_certificate_openssl.cc',
               'cert/x509_util_openssl.cc',
@@ -1524,6 +1531,7 @@
         'cert/cert_verify_proc_unittest.cc',
         'cert/crl_set_unittest.cc',
         'cert/ev_root_ca_metadata_unittest.cc',
+        'cert/jwk_serializer_unittest.cc',
         'cert/multi_threaded_cert_verifier_unittest.cc',
         'cert/nss_cert_database_unittest.cc',
         'cert/pem_tokenizer_unittest.cc',
@@ -1869,11 +1877,14 @@
             'tools/quic/quic_in_memory_cache_test.cc',
             'tools/quic/quic_reliable_client_stream_test.cc',
             'tools/quic/quic_reliable_server_stream_test.cc',
+            'tools/quic/quic_server_test.cc',
             'tools/quic/quic_spdy_server_stream_test.cc',
             'tools/quic/test_tools/http_message_test_utils.cc',
             'tools/quic/test_tools/http_message_test_utils.h',
             'tools/quic/test_tools/mock_epoll_server.cc',
             'tools/quic/test_tools/mock_epoll_server.h',
+            'tools/quic/test_tools/mock_quic_dispatcher.cc',
+            'tools/quic/test_tools/mock_quic_dispatcher.h',
             'tools/quic/test_tools/quic_client_peer.cc',
             'tools/quic/test_tools/quic_client_peer.h',
             'tools/quic/test_tools/quic_epoll_connection_helper_peer.cc',
diff --git a/net/net.target.darwin-arm.mk b/net/net.target.darwin-arm.mk
index 32a09e6..88d78fc 100644
--- a/net/net.target.darwin-arm.mk
+++ b/net/net.target.darwin-arm.mk
@@ -103,6 +103,7 @@
 	net/cert/cert_verify_result.cc \
 	net/cert/crl_set.cc \
 	net/cert/ev_root_ca_metadata.cc \
+	net/cert/jwk_serializer_openssl.cc \
 	net/cert/multi_threaded_cert_verifier.cc \
 	net/cert/pem_tokenizer.cc \
 	net/cert/single_request_cert_verifier.cc \
@@ -149,6 +150,7 @@
 	net/disk_cache/simple/simple_backend_impl.cc \
 	net/disk_cache/simple/simple_entry_format.cc \
 	net/disk_cache/simple/simple_entry_impl.cc \
+	net/disk_cache/simple/simple_entry_operation.cc \
 	net/disk_cache/simple/simple_index.cc \
 	net/disk_cache/simple/simple_index_file.cc \
 	net/disk_cache/simple/simple_net_log_parameters.cc \
diff --git a/net/net.target.darwin-mips.mk b/net/net.target.darwin-mips.mk
index 47c7546..6fedabc 100644
--- a/net/net.target.darwin-mips.mk
+++ b/net/net.target.darwin-mips.mk
@@ -103,6 +103,7 @@
 	net/cert/cert_verify_result.cc \
 	net/cert/crl_set.cc \
 	net/cert/ev_root_ca_metadata.cc \
+	net/cert/jwk_serializer_openssl.cc \
 	net/cert/multi_threaded_cert_verifier.cc \
 	net/cert/pem_tokenizer.cc \
 	net/cert/single_request_cert_verifier.cc \
@@ -149,6 +150,7 @@
 	net/disk_cache/simple/simple_backend_impl.cc \
 	net/disk_cache/simple/simple_entry_format.cc \
 	net/disk_cache/simple/simple_entry_impl.cc \
+	net/disk_cache/simple/simple_entry_operation.cc \
 	net/disk_cache/simple/simple_index.cc \
 	net/disk_cache/simple/simple_index_file.cc \
 	net/disk_cache/simple/simple_net_log_parameters.cc \
diff --git a/net/net.target.darwin-x86.mk b/net/net.target.darwin-x86.mk
index 24f1ffd..4479a95 100644
--- a/net/net.target.darwin-x86.mk
+++ b/net/net.target.darwin-x86.mk
@@ -103,6 +103,7 @@
 	net/cert/cert_verify_result.cc \
 	net/cert/crl_set.cc \
 	net/cert/ev_root_ca_metadata.cc \
+	net/cert/jwk_serializer_openssl.cc \
 	net/cert/multi_threaded_cert_verifier.cc \
 	net/cert/pem_tokenizer.cc \
 	net/cert/single_request_cert_verifier.cc \
@@ -149,6 +150,7 @@
 	net/disk_cache/simple/simple_backend_impl.cc \
 	net/disk_cache/simple/simple_entry_format.cc \
 	net/disk_cache/simple/simple_entry_impl.cc \
+	net/disk_cache/simple/simple_entry_operation.cc \
 	net/disk_cache/simple/simple_index.cc \
 	net/disk_cache/simple/simple_index_file.cc \
 	net/disk_cache/simple/simple_net_log_parameters.cc \
diff --git a/net/net.target.linux-arm.mk b/net/net.target.linux-arm.mk
index 32a09e6..88d78fc 100644
--- a/net/net.target.linux-arm.mk
+++ b/net/net.target.linux-arm.mk
@@ -103,6 +103,7 @@
 	net/cert/cert_verify_result.cc \
 	net/cert/crl_set.cc \
 	net/cert/ev_root_ca_metadata.cc \
+	net/cert/jwk_serializer_openssl.cc \
 	net/cert/multi_threaded_cert_verifier.cc \
 	net/cert/pem_tokenizer.cc \
 	net/cert/single_request_cert_verifier.cc \
@@ -149,6 +150,7 @@
 	net/disk_cache/simple/simple_backend_impl.cc \
 	net/disk_cache/simple/simple_entry_format.cc \
 	net/disk_cache/simple/simple_entry_impl.cc \
+	net/disk_cache/simple/simple_entry_operation.cc \
 	net/disk_cache/simple/simple_index.cc \
 	net/disk_cache/simple/simple_index_file.cc \
 	net/disk_cache/simple/simple_net_log_parameters.cc \
diff --git a/net/net.target.linux-mips.mk b/net/net.target.linux-mips.mk
index 47c7546..6fedabc 100644
--- a/net/net.target.linux-mips.mk
+++ b/net/net.target.linux-mips.mk
@@ -103,6 +103,7 @@
 	net/cert/cert_verify_result.cc \
 	net/cert/crl_set.cc \
 	net/cert/ev_root_ca_metadata.cc \
+	net/cert/jwk_serializer_openssl.cc \
 	net/cert/multi_threaded_cert_verifier.cc \
 	net/cert/pem_tokenizer.cc \
 	net/cert/single_request_cert_verifier.cc \
@@ -149,6 +150,7 @@
 	net/disk_cache/simple/simple_backend_impl.cc \
 	net/disk_cache/simple/simple_entry_format.cc \
 	net/disk_cache/simple/simple_entry_impl.cc \
+	net/disk_cache/simple/simple_entry_operation.cc \
 	net/disk_cache/simple/simple_index.cc \
 	net/disk_cache/simple/simple_index_file.cc \
 	net/disk_cache/simple/simple_net_log_parameters.cc \
diff --git a/net/net.target.linux-x86.mk b/net/net.target.linux-x86.mk
index 24f1ffd..4479a95 100644
--- a/net/net.target.linux-x86.mk
+++ b/net/net.target.linux-x86.mk
@@ -103,6 +103,7 @@
 	net/cert/cert_verify_result.cc \
 	net/cert/crl_set.cc \
 	net/cert/ev_root_ca_metadata.cc \
+	net/cert/jwk_serializer_openssl.cc \
 	net/cert/multi_threaded_cert_verifier.cc \
 	net/cert/pem_tokenizer.cc \
 	net/cert/single_request_cert_verifier.cc \
@@ -149,6 +150,7 @@
 	net/disk_cache/simple/simple_backend_impl.cc \
 	net/disk_cache/simple/simple_entry_format.cc \
 	net/disk_cache/simple/simple_entry_impl.cc \
+	net/disk_cache/simple/simple_entry_operation.cc \
 	net/disk_cache/simple/simple_index.cc \
 	net/disk_cache/simple/simple_index_file.cc \
 	net/disk_cache/simple/simple_net_log_parameters.cc \
diff --git a/net/quic/crypto/crypto_server_config.h b/net/quic/crypto/crypto_server_config.h
index 651e928..1a99136 100644
--- a/net/quic/crypto/crypto_server_config.h
+++ b/net/quic/crypto/crypto_server_config.h
@@ -198,8 +198,10 @@
    public:
     Config();
 
-    // serialized contains the bytes of this server config, suitable for sending
-    // on the wire.
+    // TODO(rtenneti): since this is a class, we should probably do
+    // getters/setters here.
+    // |serialized| contains the bytes of this server config, suitable for
+    // sending on the wire.
     std::string serialized;
     // id contains the SCID of this server config.
     std::string id;
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc
index ea738af..30f822c 100644
--- a/net/quic/quic_connection.cc
+++ b/net/quic/quic_connection.cc
@@ -877,8 +877,6 @@
   RetransmissionInfo retransmission_info(serialized_packet.sequence_number);
   retransmission_info.number_retransmissions =
       retransmission_it->second.number_retransmissions + 1;
-  retransmission_map_.insert(make_pair(serialized_packet.sequence_number,
-                                       retransmission_info));
   // Remove info with old sequence number.
   unacked_packets_.erase(unacked_it);
   retransmission_map_.erase(retransmission_it);
@@ -888,6 +886,8 @@
          unacked_packets_.rbegin()->first < serialized_packet.sequence_number);
   unacked_packets_.insert(make_pair(serialized_packet.sequence_number,
                                     unacked));
+  retransmission_map_.insert(make_pair(serialized_packet.sequence_number,
+                                       retransmission_info));
   SendOrQueuePacket(unacked->encryption_level(),
                     serialized_packet.sequence_number,
                     serialized_packet.packet,
diff --git a/net/quic/quic_packet_creator.cc b/net/quic/quic_packet_creator.cc
index 19e58c3..6d69676 100644
--- a/net/quic/quic_packet_creator.cc
+++ b/net/quic/quic_packet_creator.cc
@@ -111,16 +111,23 @@
   size_t bytes_consumed = 0;
 
   if (data.size() != 0) {
-    size_t min_last_stream_frame_size =
-        QuicFramer::GetMinStreamFrameSize(framer_->version(), id, offset, true);
-    // Comparing against the last stream frame size including the frame length
-    // guarantees that all the bytes will fit.  Otherwise there is a
-    // discontinuity where the packet goes one byte over due to the length data.
-    if (data.size() + min_last_stream_frame_size + kQuicStreamPayloadLengthSize
-        >= free_bytes) {
-      // Its the last frame, put as much data as possible in.
+    // When a STREAM frame is the last frame in a packet, it consumes two fewer
+    // bytes of framing overhead.
+    // Anytime more data is available than fits in with the extra two bytes,
+    // the frame will be the last, and up to two extra bytes are consumed.
+    // TODO(ianswett): If QUIC pads, the 1 byte PADDING frame does not fit when
+    // 1 byte is available, because then the STREAM frame isn't the last.
+
+    // The minimum frame size(0 bytes of data) if it's not the last frame.
+    size_t min_frame_size = QuicFramer::GetMinStreamFrameSize(
+        framer_->version(), id, offset, false);
+    // Check if it's the last frame in the packet.
+    if (data.size() + min_frame_size > free_bytes) {
+      // The minimum frame size(0 bytes of data) if it is the last frame.
+      size_t min_last_frame_size = QuicFramer::GetMinStreamFrameSize(
+          framer_->version(), id, offset, true);
       bytes_consumed =
-          min<size_t>(free_bytes - min_last_stream_frame_size, data.size());
+          min<size_t>(free_bytes - min_last_frame_size, data.size());
     } else {
       DCHECK_LT(data.size(), BytesFree());
       bytes_consumed = data.size();
diff --git a/net/quic/quic_received_packet_manager.cc b/net/quic/quic_received_packet_manager.cc
index f6f94cc..3ade8fb 100644
--- a/net/quic/quic_received_packet_manager.cc
+++ b/net/quic/quic_received_packet_manager.cc
@@ -99,6 +99,8 @@
       packets_entropy_.upper_bound(sequence_number);
   // When this map is empty we should only query entropy for
   // |largest_received_sequence_number_|.
+  // TODO(rtenneti): add support for LOG_IF_EVERY_N_SEC to chromium.
+  // LOG_IF_EVERY_N_SEC(WARNING, it != packets_entropy_.end(), 10)
   LOG_IF(WARNING, it != packets_entropy_.end())
       << "largest_received: " << received_info_.largest_observed
       << " sequence_number: " << sequence_number;
diff --git a/net/quic/quic_utils.h b/net/quic/quic_utils.h
index fca3904..6650dbf 100644
--- a/net/quic/quic_utils.h
+++ b/net/quic/quic_utils.h
@@ -70,6 +70,10 @@
   // "0x0010:  001c fb98 4000 4001 7e18 d8ef 2301 455d  ....@.@.~...#.E]\n"
   // "0x0020:  7fe2 0800 6bcb 0bc6 806e                 ....k....n\n"
   static std::string StringToHexASCIIDump(base::StringPiece in_buffer);
+
+  static char* AsChars(unsigned char* data) {
+    return reinterpret_cast<char*>(data);
+  }
 };
 
 }  // namespace net
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
index a5645b9..d1f2832 100644
--- a/net/socket/ssl_client_socket_nss.cc
+++ b/net/socket/ssl_client_socket_nss.cc
@@ -771,8 +771,7 @@
   ////////////////////////////////////////////////////////////////////////////
   int DoBufferRecv(IOBuffer* buffer, int len);
   int DoBufferSend(IOBuffer* buffer, int len);
-  int DoGetDomainBoundCert(const std::string& host,
-                           const std::vector<uint8>& requested_cert_types);
+  int DoGetDomainBoundCert(const std::string& host);
 
   void OnGetDomainBoundCertComplete(int result);
   void OnHandshakeStateUpdated(const HandshakeState& state);
@@ -903,7 +902,6 @@
   // prior to invoking OnHandshakeIOComplete.
   // Read on the NSS task runner when once OnHandshakeIOComplete is invoked
   // on the NSS task runner.
-  SSLClientCertType domain_bound_cert_type_;
   std::string domain_bound_private_key_;
   std::string domain_bound_cert_;
 
@@ -944,8 +942,7 @@
       user_write_buf_len_(0),
       network_task_runner_(network_task_runner),
       nss_task_runner_(nss_task_runner),
-      weak_net_log_(weak_net_log_factory_.GetWeakPtr()),
-      domain_bound_cert_type_(CLIENT_CERT_INVALID_TYPE) {
+      weak_net_log_(weak_net_log_factory_.GetWeakPtr()) {
 }
 
 SSLClientSocketNSS::Core::~Core() {
@@ -1274,7 +1271,6 @@
     PRFileDesc* socket,
     PRBool checksig,
     PRBool is_server) {
-#ifdef SSL_ENABLE_FALSE_START
   Core* core = reinterpret_cast<Core*>(arg);
   if (!core->handshake_callback_called_) {
     // Only need to turn off False Start in the initial handshake. Also, it is
@@ -1296,7 +1292,6 @@
       SSL_OptionSet(socket, SSL_ENABLE_FALSE_START, PR_FALSE);
     }
   }
-#endif
 
   // Tell NSS to not verify the certificate.
   return SECSuccess;
@@ -2318,17 +2313,15 @@
   // We have negotiated the TLS channel ID extension.
   core->channel_id_xtn_negotiated_ = true;
   std::string host = core->host_and_port_.host();
-  std::vector<uint8> requested_cert_types;
-  requested_cert_types.push_back(CLIENT_CERT_ECDSA_SIGN);
   int error = ERR_UNEXPECTED;
   if (core->OnNetworkTaskRunner()) {
-    error = core->DoGetDomainBoundCert(host, requested_cert_types);
+    error = core->DoGetDomainBoundCert(host);
   } else {
     bool posted = core->network_task_runner_->PostTask(
         FROM_HERE,
         base::Bind(
             IgnoreResult(&Core::DoGetDomainBoundCert),
-            core, host, requested_cert_types));
+            core, host));
     error = posted ? ERR_IO_PENDING : ERR_ABORTED;
   }
 
@@ -2372,9 +2365,7 @@
     return MapNSSError(PORT_GetError());
 
   // Set the private key.
-  switch (domain_bound_cert_type_) {
-    case CLIENT_CERT_ECDSA_SIGN: {
-      if (!crypto::ECPrivateKey::ImportFromEncryptedPrivateKeyInfo(
+  if (!crypto::ECPrivateKey::ImportFromEncryptedPrivateKeyInfo(
           ServerBoundCertService::kEPKIPassword,
           reinterpret_cast<const unsigned char*>(
               domain_bound_private_key_.data()),
@@ -2384,15 +2375,8 @@
           false,
           key,
           public_key)) {
-        int error = MapNSSError(PORT_GetError());
-        return error;
-      }
-      break;
-    }
-
-    default:
-      NOTREACHED();
-      return ERR_INVALID_ARGUMENT;
+    int error = MapNSSError(PORT_GetError());
+    return error;
   }
 
   return OK;
@@ -2433,8 +2417,8 @@
          SSL_CONNECTION_COMPRESSION_MASK) <<
         SSL_CONNECTION_COMPRESSION_SHIFT;
 
-    // NSS 3.12.x doesn't have version macros for TLS 1.1 and 1.2 (because NSS
-    // doesn't support them yet), so we use 0x0302 and 0x0303 directly.
+    // NSS 3.14.x doesn't have a version macro for TLS 1.2 (because NSS didn't
+    // support it yet), so use 0x0303 directly.
     int version = SSL_CONNECTION_VERSION_UNKNOWN;
     if (channel_info.protocolVersion < SSL_LIBRARY_VERSION_3_0) {
       // All versions less than SSL_LIBRARY_VERSION_3_0 are treated as SSL
@@ -2444,7 +2428,7 @@
       version = SSL_CONNECTION_VERSION_SSL3;
     } else if (channel_info.protocolVersion == SSL_LIBRARY_VERSION_3_1_TLS) {
       version = SSL_CONNECTION_VERSION_TLS1;
-    } else if (channel_info.protocolVersion == 0x0302) {
+    } else if (channel_info.protocolVersion == SSL_LIBRARY_VERSION_TLS_1_1) {
       version = SSL_CONNECTION_VERSION_TLS1_1;
     } else if (channel_info.protocolVersion == 0x0303) {
       version = SSL_CONNECTION_VERSION_TLS1_2;
@@ -2454,10 +2438,6 @@
         SSL_CONNECTION_VERSION_SHIFT;
   }
 
-  // SSL_HandshakeNegotiatedExtension was added in NSS 3.12.6.
-  // Since SSL_MAX_EXTENSIONS was added at the same time, we can test
-  // SSL_MAX_EXTENSIONS for the presence of SSL_HandshakeNegotiatedExtension.
-#if defined(SSL_MAX_EXTENSIONS)
   PRBool peer_supports_renego_ext;
   ok = SSL_HandshakeNegotiatedExtension(nss_fd_, ssl_renegotiation_info_xtn,
                                         &peer_supports_renego_ext);
@@ -2491,7 +2471,6 @@
                             peer_supports_renego_ext == PR_TRUE);
     }
   }
-#endif
 
   if (ssl_config_.version_fallback) {
     nss_handshake_state_.ssl_connection_status |=
@@ -2620,9 +2599,7 @@
   return rv;
 }
 
-int SSLClientSocketNSS::Core::DoGetDomainBoundCert(
-    const std::string& host,
-    const std::vector<uint8>& requested_cert_types) {
+int SSLClientSocketNSS::Core::DoGetDomainBoundCert(const std::string& host) {
   DCHECK(OnNetworkTaskRunner());
 
   if (detached_)
@@ -2632,8 +2609,6 @@
 
   int rv = server_bound_cert_service_->GetDomainBoundCert(
       host,
-      requested_cert_types,
-      &domain_bound_cert_type_,
       &domain_bound_private_key_,
       &domain_bound_cert_,
       base::Bind(&Core::OnGetDomainBoundCertComplete, base::Unretained(this)),
@@ -3168,25 +3143,18 @@
     SSL_CipherPrefSet(nss_fd_, *it, PR_FALSE);
   }
 
-#ifdef SSL_ENABLE_SESSION_TICKETS
   // Support RFC 5077
   rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_SESSION_TICKETS, PR_TRUE);
   if (rv != SECSuccess) {
     LogFailedNSSFunction(
         net_log_, "SSL_OptionSet", "SSL_ENABLE_SESSION_TICKETS");
   }
-#else
-  #error "You need to install NSS-3.12 or later to build chromium"
-#endif
 
-#ifdef SSL_ENABLE_FALSE_START
   rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_FALSE_START,
                      ssl_config_.false_start_enabled);
   if (rv != SECSuccess)
     LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_ENABLE_FALSE_START");
-#endif
 
-#ifdef SSL_ENABLE_RENEGOTIATION
   // We allow servers to request renegotiation. Since we're a client,
   // prohibiting this is rather a waste of time. Only servers are in a
   // position to prevent renegotiation attacks.
@@ -3198,14 +3166,12 @@
     LogFailedNSSFunction(
         net_log_, "SSL_OptionSet", "SSL_ENABLE_RENEGOTIATION");
   }
-#endif  // SSL_ENABLE_RENEGOTIATION
 
-#ifdef SSL_CBC_RANDOM_IV
   rv = SSL_OptionSet(nss_fd_, SSL_CBC_RANDOM_IV, PR_TRUE);
   if (rv != SECSuccess)
     LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_CBC_RANDOM_IV");
-#endif
 
+// Added in NSS 3.15
 #ifdef SSL_ENABLE_OCSP_STAPLING
   if (IsOCSPStaplingSupported()) {
     rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_OCSP_STAPLING, PR_TRUE);
@@ -3216,6 +3182,7 @@
   }
 #endif
 
+// Chromium patch to libssl
 #ifdef SSL_ENABLE_CACHED_INFO
   rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_CACHED_INFO,
                      ssl_config_.cached_info_enabled);
diff --git a/net/spdy/spdy_credential_builder.cc b/net/spdy/spdy_credential_builder.cc
index 1742aff..79567b6 100644
--- a/net/spdy/spdy_credential_builder.cc
+++ b/net/spdy/spdy_credential_builder.cc
@@ -26,14 +26,10 @@
 
 // static
 int SpdyCredentialBuilder::Build(const std::string& tls_unique,
-                                 SSLClientCertType type,
                                  const std::string& key,
                                  const std::string& cert,
                                  size_t slot,
                                  SpdyCredential* credential) {
-  if (type != CLIENT_CERT_ECDSA_SIGN)
-    return ERR_BAD_SSL_CLIENT_AUTH_CERT;
-
   std::string secret = SpdyCredentialBuilder::GetCredentialSecret(tls_unique);
 
   // Extract the SubjectPublicKeyInfo from the certificate.
diff --git a/net/spdy/spdy_credential_builder.h b/net/spdy/spdy_credential_builder.h
index d74b600..3bdc0a1 100644
--- a/net/spdy/spdy_credential_builder.h
+++ b/net/spdy/spdy_credential_builder.h
@@ -8,7 +8,6 @@
 #include <string>
 
 #include "net/base/net_export.h"
-#include "net/ssl/ssl_client_cert_type.h"
 
 namespace net {
 
@@ -20,7 +19,6 @@
 class NET_EXPORT_PRIVATE SpdyCredentialBuilder {
  public:
   static int Build(const std::string& tls_unique,
-                   SSLClientCertType type,
                    const std::string& key,
                    const std::string& cert,
                    size_t slot,
diff --git a/net/spdy/spdy_credential_builder_unittest.cc b/net/spdy/spdy_credential_builder_unittest.cc
index 89332d5..bc67cc5 100644
--- a/net/spdy/spdy_credential_builder_unittest.cc
+++ b/net/spdy/spdy_credential_builder_unittest.cc
@@ -30,16 +30,12 @@
                                  sequenced_worker_pool));
 
   TestCompletionCallback callback;
-  std::vector<uint8> requested_cert_types;
-  requested_cert_types.push_back(CLIENT_CERT_ECDSA_SIGN);
-  SSLClientCertType cert_type;
   ServerBoundCertService::RequestHandle request_handle;
   int rv = server_bound_cert_service->GetDomainBoundCert(
-      "www.google.com", requested_cert_types, &cert_type, key, cert,
+      "www.google.com", key, cert,
       callback.callback(), &request_handle);
   EXPECT_EQ(ERR_IO_PENDING, rv);
   EXPECT_EQ(OK, callback.WaitForResult());
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, cert_type);
 
   sequenced_worker_pool->Shutdown();
 }
@@ -53,13 +49,9 @@
   }
 
  protected:
-  int BuildWithType(SSLClientCertType type) {
-    return SpdyCredentialBuilder::Build(
-        MockClientSocket::kTlsUnique, type, key_, cert_, kSlot, &credential_);
-  }
-
   int Build() {
-    return BuildWithType(CLIENT_CERT_ECDSA_SIGN);
+    return SpdyCredentialBuilder::Build(
+        MockClientSocket::kTlsUnique, key_, cert_, kSlot, &credential_);
   }
 
   std::string GetCredentialSecret() {
@@ -89,35 +81,13 @@
 }
 
 #if defined(USE_OPENSSL)
-#define MAYBE_SucceedsWithECDSACert DISABLED_SucceedsWithECDSACert
+#define MAYBE_Succeeds DISABLED_Succeeds
 #else
-#define MAYBE_SucceedsWithECDSACert SucceedsWithECDSACert
+#define MAYBE_Succeeds Succeeds
 #endif
 
-TEST_F(SpdyCredentialBuilderTest, MAYBE_SucceedsWithECDSACert) {
-  EXPECT_EQ(OK, BuildWithType(CLIENT_CERT_ECDSA_SIGN));
-}
-
-#if defined(USE_OPENSSL)
-#define MAYBE_FailsWithRSACert DISABLED_FailsWithRSACert
-#else
-#define MAYBE_FailsWithRSACert FailsWithRSACert
-#endif
-
-TEST_F(SpdyCredentialBuilderTest, MAYBE_FailsWithRSACert) {
-  EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
-            BuildWithType(CLIENT_CERT_RSA_SIGN));
-}
-
-#if defined(USE_OPENSSL)
-#define MAYBE_FailsWithDSACert DISABLED_FailsWithDSACert
-#else
-#define MAYBE_FailsWithDSACert FailsWithDSACert
-#endif
-
-TEST_F(SpdyCredentialBuilderTest, MAYBE_FailsWithDSACert) {
-  EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
-            BuildWithType(CLIENT_CERT_DSS_SIGN));
+TEST_F(SpdyCredentialBuilderTest, MAYBE_Succeeds) {
+  EXPECT_EQ(OK, Build());
 }
 
 #if defined(USE_OPENSSL)
diff --git a/net/spdy/spdy_http_stream_unittest.cc b/net/spdy/spdy_http_stream_unittest.cc
index 04a8eca..55387cf 100644
--- a/net/spdy/spdy_http_stream_unittest.cc
+++ b/net/spdy/spdy_http_stream_unittest.cc
@@ -540,23 +540,18 @@
     std::string* cert,
     std::string* proof) {
   TestCompletionCallback callback;
-  std::vector<uint8> requested_cert_types;
-  requested_cert_types.push_back(CLIENT_CERT_ECDSA_SIGN);
-  SSLClientCertType cert_type;
   std::string key;
   ServerBoundCertService::RequestHandle request_handle;
   int rv = server_bound_cert_service->GetDomainBoundCert(
-      host, requested_cert_types, &cert_type, &key, cert, callback.callback(),
+      host, &key, cert, callback.callback(),
       &request_handle);
   EXPECT_EQ(ERR_IO_PENDING, rv);
   EXPECT_EQ(OK, callback.WaitForResult());
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, cert_type);
 
   SpdyCredential credential;
   EXPECT_EQ(OK,
             SpdyCredentialBuilder::Build(
-                MockClientSocket::kTlsUnique, cert_type, key,
-                *cert, 2, &credential));
+                MockClientSocket::kTlsUnique, key, *cert, 2, &credential));
 
   ASSERT_FALSE(credential.certs.empty());
   cert->assign(credential.certs[0]);
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index 8a730ce..db47549 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -793,7 +793,6 @@
 
 int SpdySession::CreateCredentialFrame(
     const std::string& origin,
-    SSLClientCertType type,
     const std::string& key,
     const std::string& cert,
     RequestPriority priority,
@@ -807,7 +806,7 @@
   std::string tls_unique;
   ssl_socket->GetTLSUniqueChannelBinding(&tls_unique);
   size_t slot = credential_state_.SetHasCredential(GURL(origin));
-  int rv = SpdyCredentialBuilder::Build(tls_unique, type, key, cert, slot,
+  int rv = SpdyCredentialBuilder::Build(tls_unique, key, cert, slot,
                                         &credential);
   DCHECK_NE(rv, ERR_IO_PENDING);
   if (rv != OK)
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h
index c6a22e6..819db11 100644
--- a/net/spdy/spdy_session.h
+++ b/net/spdy/spdy_session.h
@@ -35,7 +35,6 @@
 #include "net/spdy/spdy_session_pool.h"
 #include "net/spdy/spdy_stream.h"
 #include "net/spdy/spdy_write_queue.h"
-#include "net/ssl/ssl_client_cert_type.h"
 #include "net/ssl/ssl_config_service.h"
 #include "url/gurl.h"
 
@@ -299,7 +298,6 @@
   // |credential_frame| and returns OK. Returns the error (guaranteed
   // to not be ERR_IO_PENDING) otherwise.
   int CreateCredentialFrame(const std::string& origin,
-                            SSLClientCertType type,
                             const std::string& key,
                             const std::string& cert,
                             RequestPriority priority,
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc
index db085cf..18d20e8 100644
--- a/net/spdy/spdy_stream.cc
+++ b/net/spdy/spdy_stream.cc
@@ -108,7 +108,6 @@
       net_log_(net_log),
       send_bytes_(0),
       recv_bytes_(0),
-      domain_bound_cert_type_(CLIENT_CERT_INVALID_TYPE),
       just_completed_frame_type_(DATA),
       just_completed_frame_size_(0) {
   CHECK(type_ == SPDY_BIDIRECTIONAL_STREAM ||
@@ -741,11 +740,10 @@
   io_state_ = STATE_GET_DOMAIN_BOUND_CERT_COMPLETE;
   ServerBoundCertService* sbc_service = session_->GetServerBoundCertService();
   DCHECK(sbc_service != NULL);
-  std::vector<uint8> requested_cert_types;
-  requested_cert_types.push_back(CLIENT_CERT_ECDSA_SIGN);
   int rv = sbc_service->GetDomainBoundCert(
-      url.GetOrigin().host(), requested_cert_types,
-      &domain_bound_cert_type_, &domain_bound_private_key_, &domain_bound_cert_,
+      url.GetOrigin().host(),
+      &domain_bound_private_key_,
+      &domain_bound_cert_,
       base::Bind(&SpdyStream::OnGetDomainBoundCertComplete, GetWeakPtr()),
       &domain_bound_cert_request_handle_);
   return rv;
@@ -771,8 +769,11 @@
   origin.erase(origin.length() - 1);  // Trim trailing slash.
   scoped_ptr<SpdyFrame> frame;
   int rv = session_->CreateCredentialFrame(
-      origin, domain_bound_cert_type_, domain_bound_private_key_,
-      domain_bound_cert_, priority_, &frame);
+      origin,
+      domain_bound_private_key_,
+      domain_bound_cert_,
+      priority_,
+      &frame);
   if (rv != OK) {
     DCHECK_NE(rv, ERR_IO_PENDING);
     return rv;
diff --git a/net/spdy/spdy_stream.h b/net/spdy/spdy_stream.h
index 06209a1..4d18e3e 100644
--- a/net/spdy/spdy_stream.h
+++ b/net/spdy/spdy_stream.h
@@ -541,7 +541,6 @@
   // Data received before delegate is attached.
   ScopedVector<SpdyBuffer> pending_buffers_;
 
-  SSLClientCertType domain_bound_cert_type_;
   std::string domain_bound_private_key_;
   std::string domain_bound_cert_;
   ServerBoundCertService::RequestHandle domain_bound_cert_request_handle_;
diff --git a/net/ssl/default_server_bound_cert_store.cc b/net/ssl/default_server_bound_cert_store.cc
index b189661..6fb9180 100644
--- a/net/ssl/default_server_bound_cert_store.cc
+++ b/net/ssl/default_server_bound_cert_store.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/histogram.h"
+#include "net/base/net_errors.h"
 
 namespace net {
 
@@ -60,16 +61,15 @@
 
 void DefaultServerBoundCertStore::GetServerBoundCertTask::Run(
     DefaultServerBoundCertStore* store) {
-  SSLClientCertType type = CLIENT_CERT_INVALID_TYPE;
   base::Time expiration_time;
   std::string private_key_result;
   std::string cert_result;
-  bool was_sync = store->GetServerBoundCert(
-      server_identifier_, &type, &expiration_time, &private_key_result,
+  int err = store->GetServerBoundCert(
+      server_identifier_, &expiration_time, &private_key_result,
       &cert_result, GetCertCallback());
-  DCHECK(was_sync);
+  DCHECK(err != ERR_IO_PENDING);
 
-  InvokeCallback(base::Bind(callback_, server_identifier_, type,
+  InvokeCallback(base::Bind(callback_, err, server_identifier_,
                             expiration_time, private_key_result, cert_result));
 }
 
@@ -79,7 +79,6 @@
     : public DefaultServerBoundCertStore::Task {
  public:
   SetServerBoundCertTask(const std::string& server_identifier,
-                         SSLClientCertType type,
                          base::Time creation_time,
                          base::Time expiration_time,
                          const std::string& private_key,
@@ -89,7 +88,6 @@
 
  private:
   std::string server_identifier_;
-  SSLClientCertType type_;
   base::Time creation_time_;
   base::Time expiration_time_;
   std::string private_key_;
@@ -98,13 +96,11 @@
 
 DefaultServerBoundCertStore::SetServerBoundCertTask::SetServerBoundCertTask(
     const std::string& server_identifier,
-    SSLClientCertType type,
     base::Time creation_time,
     base::Time expiration_time,
     const std::string& private_key,
     const std::string& cert)
     : server_identifier_(server_identifier),
-      type_(type),
       creation_time_(creation_time),
       expiration_time_(expiration_time),
       private_key_(private_key),
@@ -116,7 +112,7 @@
 
 void DefaultServerBoundCertStore::SetServerBoundCertTask::Run(
     DefaultServerBoundCertStore* store) {
-  store->SyncSetServerBoundCert(server_identifier_, type_, creation_time_,
+  store->SyncSetServerBoundCert(server_identifier_, creation_time_,
                                 expiration_time_, private_key_, cert_);
 }
 
@@ -236,9 +232,8 @@
       store_(store),
       weak_ptr_factory_(this) {}
 
-bool DefaultServerBoundCertStore::GetServerBoundCert(
+int DefaultServerBoundCertStore::GetServerBoundCert(
     const std::string& server_identifier,
-    SSLClientCertType* type,
     base::Time* expiration_time,
     std::string* private_key_result,
     std::string* cert_result,
@@ -249,34 +244,30 @@
   if (!loaded_) {
     EnqueueTask(scoped_ptr<Task>(
         new GetServerBoundCertTask(server_identifier, callback)));
-    return false;
+    return ERR_IO_PENDING;
   }
 
   ServerBoundCertMap::iterator it = server_bound_certs_.find(server_identifier);
 
-  if (it == server_bound_certs_.end()) {
-    *type = CLIENT_CERT_INVALID_TYPE;
-    return true;
-  }
+  if (it == server_bound_certs_.end())
+    return ERR_FILE_NOT_FOUND;
 
   ServerBoundCert* cert = it->second;
-  *type = cert->type();
   *expiration_time = cert->expiration_time();
   *private_key_result = cert->private_key();
   *cert_result = cert->cert();
 
-  return true;
+  return OK;
 }
 
 void DefaultServerBoundCertStore::SetServerBoundCert(
     const std::string& server_identifier,
-    SSLClientCertType type,
     base::Time creation_time,
     base::Time expiration_time,
     const std::string& private_key,
     const std::string& cert) {
   RunOrEnqueueTask(scoped_ptr<Task>(new SetServerBoundCertTask(
-      server_identifier, type, creation_time, expiration_time, private_key,
+      server_identifier, creation_time, expiration_time, private_key,
       cert)));
 }
 
@@ -377,7 +368,6 @@
 
 void DefaultServerBoundCertStore::SyncSetServerBoundCert(
     const std::string& server_identifier,
-    SSLClientCertType type,
     base::Time creation_time,
     base::Time expiration_time,
     const std::string& private_key,
@@ -389,7 +379,7 @@
   InternalInsertServerBoundCert(
       server_identifier,
       new ServerBoundCert(
-          server_identifier, type, creation_time, expiration_time, private_key,
+          server_identifier, creation_time, expiration_time, private_key,
           cert));
 }
 
diff --git a/net/ssl/default_server_bound_cert_store.h b/net/ssl/default_server_bound_cert_store.h
index 8ec6805..6128218 100644
--- a/net/ssl/default_server_bound_cert_store.h
+++ b/net/ssl/default_server_bound_cert_store.h
@@ -43,16 +43,14 @@
   virtual ~DefaultServerBoundCertStore();
 
   // ServerBoundCertStore implementation.
-  virtual bool GetServerBoundCert(
+  virtual int GetServerBoundCert(
       const std::string& server_identifier,
-      SSLClientCertType* type,
       base::Time* expiration_time,
       std::string* private_key_result,
       std::string* cert_result,
       const GetCertCallback& callback) OVERRIDE;
   virtual void SetServerBoundCert(
       const std::string& server_identifier,
-      SSLClientCertType type,
       base::Time creation_time,
       base::Time expiration_time,
       const std::string& private_key,
@@ -110,7 +108,6 @@
   // initialization is complete.
   void SyncSetServerBoundCert(
       const std::string& server_identifier,
-      SSLClientCertType type,
       base::Time creation_time,
       base::Time expiration_time,
       const std::string& private_key,
diff --git a/net/ssl/default_server_bound_cert_store_unittest.cc b/net/ssl/default_server_bound_cert_store_unittest.cc
index 8673916..c3f8452 100644
--- a/net/ssl/default_server_bound_cert_store_unittest.cc
+++ b/net/ssl/default_server_bound_cert_store_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/message_loop/message_loop.h"
+#include "net/base/net_errors.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace net {
@@ -27,8 +28,8 @@
   ADD_FAILURE() << "Unexpected callback execution.";
 }
 
-void GetCertCallbackNotCalled(const std::string& server_identifier,
-                              SSLClientCertType type,
+void GetCertCallbackNotCalled(int err,
+                              const std::string& server_identifier,
                               base::Time expiration_time,
                               const std::string& private_key_result,
                               const std::string& cert_result) {
@@ -39,21 +40,21 @@
  public:
   AsyncGetCertHelper() : called_(false) {}
 
-  void Callback(const std::string& server_identifier,
-                SSLClientCertType type,
+  void Callback(int err,
+                const std::string& server_identifier,
                 base::Time expiration_time,
                 const std::string& private_key_result,
                 const std::string& cert_result) {
+    err_ = err;
     server_identifier_ = server_identifier;
-    type_ = type;
     expiration_time_ = expiration_time;
     private_key_ = private_key_result;
     cert_ = cert_result;
     called_ = true;
   }
 
+  int err_;
   std::string server_identifier_;
-  SSLClientCertType type_;
   base::Time expiration_time_;
   std::string private_key_;
   std::string cert_;
@@ -127,14 +128,12 @@
   persistent_store->AddServerBoundCert(
       DefaultServerBoundCertStore::ServerBoundCert(
           "google.com",
-          CLIENT_CERT_RSA_SIGN,
           base::Time(),
           base::Time(),
           "a", "b"));
   persistent_store->AddServerBoundCert(
       DefaultServerBoundCertStore::ServerBoundCert(
           "verisign.com",
-          CLIENT_CERT_ECDSA_SIGN,
           base::Time(),
           base::Time(),
           "c", "d"));
@@ -145,7 +144,6 @@
   EXPECT_EQ(0, store.GetCertCount());
   store.SetServerBoundCert(
       "verisign.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "e", "f");
@@ -154,7 +152,6 @@
   EXPECT_EQ(2, store.GetCertCount());
   store.SetServerBoundCert(
       "twitter.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "g", "h");
@@ -166,32 +163,28 @@
 TEST(DefaultServerBoundCertStoreTest, TestSettingAndGetting) {
   // No persistent store, all calls will be synchronous.
   DefaultServerBoundCertStore store(NULL);
-  SSLClientCertType type;
   base::Time expiration_time;
   std::string private_key, cert;
   EXPECT_EQ(0, store.GetCertCount());
-  EXPECT_TRUE(store.GetServerBoundCert("verisign.com",
-                                       &type,
-                                       &expiration_time,
-                                       &private_key,
-                                       &cert,
-                                       base::Bind(&GetCertCallbackNotCalled)));
-  EXPECT_EQ(CLIENT_CERT_INVALID_TYPE, type);
+  EXPECT_EQ(ERR_FILE_NOT_FOUND,
+            store.GetServerBoundCert("verisign.com",
+                                     &expiration_time,
+                                     &private_key,
+                                     &cert,
+                                     base::Bind(&GetCertCallbackNotCalled)));
   EXPECT_TRUE(private_key.empty());
   EXPECT_TRUE(cert.empty());
   store.SetServerBoundCert(
       "verisign.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time::FromInternalValue(123),
       base::Time::FromInternalValue(456),
       "i", "j");
-  EXPECT_TRUE(store.GetServerBoundCert("verisign.com",
-                                       &type,
-                                       &expiration_time,
-                                       &private_key,
-                                       &cert,
-                                       base::Bind(&GetCertCallbackNotCalled)));
-  EXPECT_EQ(CLIENT_CERT_RSA_SIGN, type);
+  EXPECT_EQ(OK,
+            store.GetServerBoundCert("verisign.com",
+                                     &expiration_time,
+                                     &private_key,
+                                     &cert,
+                                     base::Bind(&GetCertCallbackNotCalled)));
   EXPECT_EQ(456, expiration_time.ToInternalValue());
   EXPECT_EQ("i", private_key);
   EXPECT_EQ("j", cert);
@@ -201,19 +194,16 @@
   scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore);
   DefaultServerBoundCertStore store(persistent_store.get());
 
-  SSLClientCertType type;
   base::Time expiration_time;
   std::string private_key, cert;
   EXPECT_EQ(0, store.GetCertCount());
   store.SetServerBoundCert(
       "verisign.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time::FromInternalValue(123),
       base::Time::FromInternalValue(1234),
       "a", "b");
   store.SetServerBoundCert(
       "verisign.com",
-      CLIENT_CERT_ECDSA_SIGN,
       base::Time::FromInternalValue(456),
       base::Time::FromInternalValue(4567),
       "c", "d");
@@ -221,13 +211,12 @@
   // Wait for load & queued set tasks.
   base::MessageLoop::current()->RunUntilIdle();
   EXPECT_EQ(1, store.GetCertCount());
-  EXPECT_TRUE(store.GetServerBoundCert("verisign.com",
-                                       &type,
-                                       &expiration_time,
-                                       &private_key,
-                                       &cert,
-                                       base::Bind(&GetCertCallbackNotCalled)));
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type);
+  EXPECT_EQ(OK,
+            store.GetServerBoundCert("verisign.com",
+                                     &expiration_time,
+                                     &private_key,
+                                     &cert,
+                                     base::Bind(&GetCertCallbackNotCalled)));
   EXPECT_EQ(4567, expiration_time.ToInternalValue());
   EXPECT_EQ("c", private_key);
   EXPECT_EQ("d", cert);
@@ -237,29 +226,31 @@
   scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore);
   persistent_store->AddServerBoundCert(ServerBoundCertStore::ServerBoundCert(
       "verisign.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time::FromInternalValue(123),
       base::Time::FromInternalValue(1234),
       "a", "b"));
 
   DefaultServerBoundCertStore store(persistent_store.get());
   AsyncGetCertHelper helper;
-  SSLClientCertType type;
   base::Time expiration_time;
   std::string private_key;
   std::string cert = "not set";
   EXPECT_EQ(0, store.GetCertCount());
-  EXPECT_FALSE(store.GetServerBoundCert(
-      "verisign.com", &type, &expiration_time, &private_key, &cert,
-      base::Bind(&AsyncGetCertHelper::Callback, base::Unretained(&helper))));
+  EXPECT_EQ(ERR_IO_PENDING,
+            store.GetServerBoundCert("verisign.com",
+                                     &expiration_time,
+                                     &private_key,
+                                     &cert,
+                                     base::Bind(&AsyncGetCertHelper::Callback,
+                                                base::Unretained(&helper))));
 
   // Wait for load & queued get tasks.
   base::MessageLoop::current()->RunUntilIdle();
   EXPECT_EQ(1, store.GetCertCount());
   EXPECT_EQ("not set", cert);
   EXPECT_TRUE(helper.called_);
+  EXPECT_EQ(OK, helper.err_);
   EXPECT_EQ("verisign.com", helper.server_identifier_);
-  EXPECT_EQ(CLIENT_CERT_RSA_SIGN, helper.type_);
   EXPECT_EQ(1234, helper.expiration_time_.ToInternalValue());
   EXPECT_EQ("a", helper.private_key_);
   EXPECT_EQ("b", helper.cert_);
@@ -271,19 +262,16 @@
 
   store.SetServerBoundCert(
       "verisign.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "a", "b");
   store.SetServerBoundCert(
       "google.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "c", "d");
   store.SetServerBoundCert(
       "harvard.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "e", "f");
@@ -301,13 +289,11 @@
   scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore);
   persistent_store->AddServerBoundCert(ServerBoundCertStore::ServerBoundCert(
       "verisign.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "a", "b"));
   persistent_store->AddServerBoundCert(ServerBoundCertStore::ServerBoundCert(
       "google.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "c", "d"));
@@ -333,13 +319,11 @@
   scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore);
   DefaultServerBoundCertStore store(persistent_store.get());
 
-  SSLClientCertType type;
   base::Time expiration_time;
   std::string private_key, cert;
   EXPECT_EQ(0, store.GetCertCount());
   store.SetServerBoundCert(
       "verisign.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "a", "b");
@@ -348,7 +332,6 @@
 
   store.SetServerBoundCert(
       "google.com",
-      CLIENT_CERT_ECDSA_SIGN,
       base::Time(),
       base::Time(),
       "c", "d");
@@ -359,45 +342,40 @@
                               base::Bind(&CallCounter, &delete_finished));
   ASSERT_EQ(1, delete_finished);
   EXPECT_EQ(1, store.GetCertCount());
-  EXPECT_TRUE(store.GetServerBoundCert("verisign.com",
-                                       &type,
-                                       &expiration_time,
-                                       &private_key,
-                                       &cert,
-                                       base::Bind(&GetCertCallbackNotCalled)));
-  EXPECT_EQ(CLIENT_CERT_INVALID_TYPE, type);
-  EXPECT_TRUE(store.GetServerBoundCert("google.com",
-                                       &type,
-                                       &expiration_time,
-                                       &private_key,
-                                       &cert,
-                                       base::Bind(&GetCertCallbackNotCalled)));
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type);
+  EXPECT_EQ(ERR_FILE_NOT_FOUND,
+            store.GetServerBoundCert("verisign.com",
+                                     &expiration_time,
+                                     &private_key,
+                                     &cert,
+                                     base::Bind(&GetCertCallbackNotCalled)));
+  EXPECT_EQ(OK,
+            store.GetServerBoundCert("google.com",
+                                     &expiration_time,
+                                     &private_key,
+                                     &cert,
+                                     base::Bind(&GetCertCallbackNotCalled)));
   int delete2_finished = 0;
   store.DeleteServerBoundCert("google.com",
                               base::Bind(&CallCounter, &delete2_finished));
   ASSERT_EQ(1, delete2_finished);
   EXPECT_EQ(0, store.GetCertCount());
-  EXPECT_TRUE(store.GetServerBoundCert("google.com",
-                                       &type,
-                                       &expiration_time,
-                                       &private_key,
-                                       &cert,
-                                       base::Bind(&GetCertCallbackNotCalled)));
-  EXPECT_EQ(CLIENT_CERT_INVALID_TYPE, type);
+  EXPECT_EQ(ERR_FILE_NOT_FOUND,
+            store.GetServerBoundCert("google.com",
+                                     &expiration_time,
+                                     &private_key,
+                                     &cert,
+                                     base::Bind(&GetCertCallbackNotCalled)));
 }
 
 TEST(DefaultServerBoundCertStoreTest, TestAsyncDelete) {
   scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore);
   persistent_store->AddServerBoundCert(ServerBoundCertStore::ServerBoundCert(
       "a.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time::FromInternalValue(1),
       base::Time::FromInternalValue(2),
       "a", "b"));
   persistent_store->AddServerBoundCert(ServerBoundCertStore::ServerBoundCert(
       "b.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time::FromInternalValue(3),
       base::Time::FromInternalValue(4),
       "c", "d"));
@@ -408,17 +386,20 @@
 
   AsyncGetCertHelper a_helper;
   AsyncGetCertHelper b_helper;
-  SSLClientCertType type;
   base::Time expiration_time;
   std::string private_key;
   std::string cert = "not set";
   EXPECT_EQ(0, store.GetCertCount());
-  EXPECT_FALSE(store.GetServerBoundCert(
-      "a.com", &type, &expiration_time, &private_key, &cert,
-      base::Bind(&AsyncGetCertHelper::Callback, base::Unretained(&a_helper))));
-  EXPECT_FALSE(store.GetServerBoundCert(
-      "b.com", &type, &expiration_time, &private_key, &cert,
-      base::Bind(&AsyncGetCertHelper::Callback, base::Unretained(&b_helper))));
+  EXPECT_EQ(ERR_IO_PENDING,
+      store.GetServerBoundCert(
+          "a.com", &expiration_time, &private_key, &cert,
+          base::Bind(&AsyncGetCertHelper::Callback,
+                     base::Unretained(&a_helper))));
+  EXPECT_EQ(ERR_IO_PENDING,
+      store.GetServerBoundCert(
+          "b.com", &expiration_time, &private_key, &cert,
+          base::Bind(&AsyncGetCertHelper::Callback,
+                     base::Unretained(&b_helper))));
 
   EXPECT_EQ(0, delete_finished);
   EXPECT_FALSE(a_helper.called_);
@@ -429,14 +410,14 @@
   EXPECT_EQ(1, store.GetCertCount());
   EXPECT_EQ("not set", cert);
   EXPECT_TRUE(a_helper.called_);
+  EXPECT_EQ(ERR_FILE_NOT_FOUND, a_helper.err_);
   EXPECT_EQ("a.com", a_helper.server_identifier_);
-  EXPECT_EQ(CLIENT_CERT_INVALID_TYPE, a_helper.type_);
   EXPECT_EQ(0, a_helper.expiration_time_.ToInternalValue());
   EXPECT_EQ("", a_helper.private_key_);
   EXPECT_EQ("", a_helper.cert_);
   EXPECT_TRUE(b_helper.called_);
+  EXPECT_EQ(OK, b_helper.err_);
   EXPECT_EQ("b.com", b_helper.server_identifier_);
-  EXPECT_EQ(CLIENT_CERT_RSA_SIGN, b_helper.type_);
   EXPECT_EQ(4, b_helper.expiration_time_.ToInternalValue());
   EXPECT_EQ("c", b_helper.private_key_);
   EXPECT_EQ("d", b_helper.cert_);
@@ -449,25 +430,21 @@
   EXPECT_EQ(0, store.GetCertCount());
   store.SetServerBoundCert(
       "verisign.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "a", "b");
   store.SetServerBoundCert(
       "google.com",
-      CLIENT_CERT_ECDSA_SIGN,
       base::Time(),
       base::Time(),
       "c", "d");
   store.SetServerBoundCert(
       "harvard.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "e", "f");
   store.SetServerBoundCert(
       "mit.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "g", "h");
@@ -486,13 +463,11 @@
 
   store.SetServerBoundCert(
       "preexisting.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "a", "b");
   store.SetServerBoundCert(
       "both.com",
-      CLIENT_CERT_ECDSA_SIGN,
       base::Time(),
       base::Time(),
       "c", "d");
@@ -503,14 +478,12 @@
   ServerBoundCertStore::ServerBoundCertList source_certs;
   source_certs.push_back(ServerBoundCertStore::ServerBoundCert(
       "both.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       // Key differs from above to test that existing entries are overwritten.
       "e", "f"));
   source_certs.push_back(ServerBoundCertStore::ServerBoundCert(
       "copied.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "g", "h"));
@@ -538,13 +511,11 @@
   scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore);
   persistent_store->AddServerBoundCert(ServerBoundCertStore::ServerBoundCert(
       "preexisting.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "a", "b"));
   persistent_store->AddServerBoundCert(ServerBoundCertStore::ServerBoundCert(
       "both.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "c", "d"));
@@ -553,14 +524,12 @@
   ServerBoundCertStore::ServerBoundCertList source_certs;
   source_certs.push_back(ServerBoundCertStore::ServerBoundCert(
       "both.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       // Key differs from above to test that existing entries are overwritten.
       "e", "f"));
   source_certs.push_back(ServerBoundCertStore::ServerBoundCert(
       "copied.com",
-      CLIENT_CERT_RSA_SIGN,
       base::Time(),
       base::Time(),
       "g", "h"));
diff --git a/net/ssl/server_bound_cert_service.cc b/net/ssl/server_bound_cert_service.cc
index 3740469..4bc82ed 100644
--- a/net/ssl/server_bound_cert_service.cc
+++ b/net/ssl/server_bound_cert_service.cc
@@ -42,15 +42,6 @@
 // while.
 const int kSystemTimeValidityBufferInDays = 90;
 
-bool IsSupportedCertType(uint8 type) {
-  switch(type) {
-    case CLIENT_CERT_ECDSA_SIGN:
-      return true;
-    default:
-      return false;
-  }
-}
-
 // Used by the GetDomainBoundCertResult histogram to record the final
 // outcome of each GetDomainBoundCert call.  Do not re-use values.
 enum GetCertResult {
@@ -96,7 +87,6 @@
 // unjoined thread, due to relying on a non-leaked LazyInstance
 scoped_ptr<ServerBoundCertStore::ServerBoundCert> GenerateCert(
     const std::string& server_identifier,
-    SSLClientCertType type,
     uint32 serial_number,
     int* error) {
   scoped_ptr<ServerBoundCertStore::ServerBoundCert> result;
@@ -107,34 +97,25 @@
       not_valid_before + base::TimeDelta::FromDays(kValidityPeriodInDays);
   std::string der_cert;
   std::vector<uint8> private_key_info;
-  switch (type) {
-    case CLIENT_CERT_ECDSA_SIGN: {
-      scoped_ptr<crypto::ECPrivateKey> key(crypto::ECPrivateKey::Create());
-      if (!key.get()) {
-        DLOG(ERROR) << "Unable to create key pair for client";
-        *error = ERR_KEY_GENERATION_FAILED;
-        return result.Pass();
-      }
-      if (!x509_util::CreateDomainBoundCertEC(key.get(), server_identifier,
-                                              serial_number, not_valid_before,
-                                              not_valid_after, &der_cert)) {
-        DLOG(ERROR) << "Unable to create x509 cert for client";
-        *error = ERR_ORIGIN_BOUND_CERT_GENERATION_FAILED;
-        return result.Pass();
-      }
+  scoped_ptr<crypto::ECPrivateKey> key(crypto::ECPrivateKey::Create());
+  if (!key.get()) {
+    DLOG(ERROR) << "Unable to create key pair for client";
+    *error = ERR_KEY_GENERATION_FAILED;
+    return result.Pass();
+  }
+  if (!x509_util::CreateDomainBoundCertEC(key.get(), server_identifier,
+                                          serial_number, not_valid_before,
+                                          not_valid_after, &der_cert)) {
+    DLOG(ERROR) << "Unable to create x509 cert for client";
+    *error = ERR_ORIGIN_BOUND_CERT_GENERATION_FAILED;
+    return result.Pass();
+  }
 
-      if (!key->ExportEncryptedPrivateKey(ServerBoundCertService::kEPKIPassword,
-                                          1, &private_key_info)) {
-        DLOG(ERROR) << "Unable to export private key";
-        *error = ERR_PRIVATE_KEY_EXPORT_FAILED;
-        return result.Pass();
-      }
-      break;
-    }
-    default:
-      NOTREACHED();
-      *error = ERR_INVALID_ARGUMENT;
-      return result.Pass();
+  if (!key->ExportEncryptedPrivateKey(ServerBoundCertService::kEPKIPassword,
+                                      1, &private_key_info)) {
+    DLOG(ERROR) << "Unable to export private key";
+    *error = ERR_PRIVATE_KEY_EXPORT_FAILED;
+    return result.Pass();
   }
 
   // TODO(rkn): Perhaps ExportPrivateKey should be changed to output a
@@ -142,7 +123,10 @@
   std::string key_out(private_key_info.begin(), private_key_info.end());
 
   result.reset(new ServerBoundCertStore::ServerBoundCert(
-      server_identifier, type, not_valid_before, not_valid_after, key_out,
+      server_identifier,
+      not_valid_before,
+      not_valid_after,
+      key_out,
       der_cert));
   UMA_HISTOGRAM_CUSTOM_TIMES("DomainBoundCerts.GenerateCertTime",
                              base::TimeTicks::Now() - start,
@@ -160,12 +144,10 @@
  public:
   ServerBoundCertServiceRequest(base::TimeTicks request_start,
                                 const CompletionCallback& callback,
-                                SSLClientCertType* type,
                                 std::string* private_key,
                                 std::string* cert)
       : request_start_(request_start),
         callback_(callback),
-        type_(type),
         private_key_(private_key),
         cert_(cert) {
   }
@@ -174,7 +156,6 @@
   void Cancel() {
     RecordGetDomainBoundCertResult(ASYNC_CANCELLED);
     callback_.Reset();
-    type_ = NULL;
     private_key_ = NULL;
     cert_ = NULL;
   }
@@ -182,7 +163,6 @@
   // Copies the contents of |private_key| and |cert| to the caller's output
   // arguments and calls the callback.
   void Post(int error,
-            SSLClientCertType type,
             const std::string& private_key,
             const std::string& cert) {
     switch (error) {
@@ -214,7 +194,6 @@
         break;
     }
     if (!callback_.is_null()) {
-      *type_ = type;
       *private_key_ = private_key;
       *cert_ = cert;
       callback_.Run(error);
@@ -227,7 +206,6 @@
  private:
   base::TimeTicks request_start_;
   CompletionCallback callback_;
-  SSLClientCertType* type_;
   std::string* private_key_;
   std::string* cert_;
 };
@@ -244,10 +222,8 @@
 
   ServerBoundCertServiceWorker(
       const std::string& server_identifier,
-      SSLClientCertType type,
       const WorkerDoneCallback& callback)
       : server_identifier_(server_identifier),
-        type_(type),
         serial_number_(base::RandInt(0, std::numeric_limits<int>::max())),
         origin_loop_(base::MessageLoopProxy::current()),
         callback_(callback) {
@@ -269,9 +245,8 @@
     // Runs on a worker thread.
     int error = ERR_FAILED;
     scoped_ptr<ServerBoundCertStore::ServerBoundCert> cert =
-        GenerateCert(server_identifier_, type_, serial_number_, &error);
-    DVLOG(1) << "GenerateCert " << server_identifier_ << " " << type_
-             << " returned " << error;
+        GenerateCert(server_identifier_, serial_number_, &error);
+    DVLOG(1) << "GenerateCert " << server_identifier_ << " returned " << error;
 #if defined(USE_NSS)
     // Detach the thread from NSPR.
     // Calling NSS functions attaches the thread to NSPR, which stores
@@ -288,7 +263,6 @@
   }
 
   const std::string server_identifier_;
-  const SSLClientCertType type_;
   // Note that serial_number_ must be initialized on a non-worker thread
   // (see documentation for GenerateCert).
   uint32 serial_number_;
@@ -303,31 +277,25 @@
 // origin message loop.
 class ServerBoundCertServiceJob {
  public:
-  ServerBoundCertServiceJob(SSLClientCertType type)
-      : type_(type) {
-  }
+  ServerBoundCertServiceJob() { }
 
   ~ServerBoundCertServiceJob() {
     if (!requests_.empty())
       DeleteAllCanceled();
   }
 
-  SSLClientCertType type() const { return type_; }
-
   void AddRequest(ServerBoundCertServiceRequest* request) {
     requests_.push_back(request);
   }
 
   void HandleResult(int error,
-                    SSLClientCertType type,
                     const std::string& private_key,
                     const std::string& cert) {
-    PostAll(error, type, private_key, cert);
+    PostAll(error, private_key, cert);
   }
 
  private:
   void PostAll(int error,
-               SSLClientCertType type,
                const std::string& private_key,
                const std::string& cert) {
     std::vector<ServerBoundCertServiceRequest*> requests;
@@ -335,7 +303,7 @@
 
     for (std::vector<ServerBoundCertServiceRequest*>::iterator
          i = requests.begin(); i != requests.end(); i++) {
-      (*i)->Post(error, type, private_key, cert);
+      (*i)->Post(error, private_key, cert);
       // Post() causes the ServerBoundCertServiceRequest to delete itself.
     }
   }
@@ -352,7 +320,6 @@
   }
 
   std::vector<ServerBoundCertServiceRequest*> requests_;
-  SSLClientCertType type_;
 };
 
 // static
@@ -399,7 +366,8 @@
       weak_ptr_factory_(this),
       requests_(0),
       cert_store_hits_(0),
-      inflight_joins_(0) {
+      inflight_joins_(0),
+      workers_created_(0) {
   base::Time start = base::Time::Now();
   base::Time end = start + base::TimeDelta::FromDays(
       kValidityPeriodInDays + kSystemTimeValidityBufferInDays);
@@ -422,20 +390,15 @@
 
 int ServerBoundCertService::GetDomainBoundCert(
     const std::string& host,
-    const std::vector<uint8>& requested_types,
-    SSLClientCertType* type,
     std::string* private_key,
     std::string* cert,
     const CompletionCallback& callback,
     RequestHandle* out_req) {
-  DVLOG(1) << __FUNCTION__ << " " << host << " "
-           << (requested_types.empty() ? -1 : requested_types[0])
-           << (requested_types.size() > 1 ? "..." : "");
+  DVLOG(1) << __FUNCTION__ << " " << host;
   DCHECK(CalledOnValidThread());
   base::TimeTicks request_start = base::TimeTicks::Now();
 
-  if (callback.is_null() || !private_key || !cert || host.empty() ||
-      requested_types.empty()) {
+  if (callback.is_null() || !private_key || !cert || host.empty()) {
     RecordGetDomainBoundCertResult(INVALID_ARGUMENT);
     return ERR_INVALID_ARGUMENT;
   }
@@ -446,19 +409,6 @@
     return ERR_INVALID_ARGUMENT;
   }
 
-  SSLClientCertType preferred_type = CLIENT_CERT_INVALID_TYPE;
-  for (size_t i = 0; i < requested_types.size(); ++i) {
-    if (IsSupportedCertType(requested_types[i])) {
-      preferred_type = static_cast<SSLClientCertType>(requested_types[i]);
-      break;
-    }
-  }
-  if (preferred_type == CLIENT_CERT_INVALID_TYPE) {
-    RecordGetDomainBoundCertResult(UNSUPPORTED_TYPE);
-    // None of the requested types are supported.
-    return ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED;
-  }
-
   requests_++;
 
   // See if an identical request is currently in flight.
@@ -469,26 +419,13 @@
     // An identical request is in flight already. We'll just attach our
     // callback.
     job = j->second;
-    // Check that the job is for an acceptable type of cert.
-    if (std::find(requested_types.begin(), requested_types.end(), job->type())
-        == requested_types.end()) {
-      DVLOG(1) << "Found inflight job of wrong type " << job->type()
-               << " for " << domain;
-      // If we get here, the server is asking for different types of certs in
-      // short succession.  This probably means the server is broken or
-      // misconfigured.  Since we only store one type of cert per domain, we
-      // are unable to handle this well.  Just return an error and let the first
-      // job finish.
-      RecordGetDomainBoundCertResult(TYPE_MISMATCH);
-      return ERR_ORIGIN_BOUND_CERT_GENERATION_TYPE_MISMATCH;
-    }
     inflight_joins_++;
 
     ServerBoundCertServiceRequest* request = new ServerBoundCertServiceRequest(
         request_start,
         base::Bind(&RequestHandle::OnRequestComplete,
                    base::Unretained(out_req)),
-        type, private_key, cert);
+        private_key, cert);
     job->AddRequest(request);
     out_req->RequestStarted(this, request, callback);
     return ERR_IO_PENDING;
@@ -498,30 +435,30 @@
   // domain. Note that |expiration_time| is ignored, and expired certs are
   // considered valid.
   base::Time expiration_time;
-  if (server_bound_cert_store_->GetServerBoundCert(
-          domain,
-          type,
-          &expiration_time /* ignored */,
-          private_key,
-          cert,
-          base::Bind(&ServerBoundCertService::GotServerBoundCert,
-                     weak_ptr_factory_.GetWeakPtr()))) {
-    if (IsSupportedCertType(*type)) {
-      // Sync lookup found a valid cert.
-      DVLOG(1) << "Cert store had valid cert for " << domain
-               << " of type " << *type;
-      cert_store_hits_++;
-      RecordGetDomainBoundCertResult(SYNC_SUCCESS);
-      base::TimeDelta request_time = base::TimeTicks::Now() - request_start;
-      UMA_HISTOGRAM_TIMES("DomainBoundCerts.GetCertTimeSync", request_time);
-      RecordGetCertTime(request_time);
-      return OK;
-    }
+  int err = server_bound_cert_store_->GetServerBoundCert(
+      domain,
+      &expiration_time  /* ignored */,
+      private_key,
+      cert,
+      base::Bind(&ServerBoundCertService::GotServerBoundCert,
+                 weak_ptr_factory_.GetWeakPtr()));
 
+  if (err == OK) {
+    // Sync lookup found a valid cert.
+    DVLOG(1) << "Cert store had valid cert for " << domain;
+    cert_store_hits_++;
+    RecordGetDomainBoundCertResult(SYNC_SUCCESS);
+    base::TimeDelta request_time = base::TimeTicks::Now() - request_start;
+    UMA_HISTOGRAM_TIMES("DomainBoundCerts.GetCertTimeSync", request_time);
+    RecordGetCertTime(request_time);
+    return OK;
+  }
+
+  if (err == ERR_FILE_NOT_FOUND) {
     // Sync lookup did not find a valid cert.  Start generating a new one.
+    workers_created_++;
     ServerBoundCertServiceWorker* worker = new ServerBoundCertServiceWorker(
         domain,
-        preferred_type,
         base::Bind(&ServerBoundCertService::GeneratedServerBoundCert,
                    weak_ptr_factory_.GetWeakPtr()));
     if (!worker->Start(task_runner_)) {
@@ -532,23 +469,28 @@
     }
   }
 
-  // We are either waiting for async DB lookup, or waiting for cert generation.
-  // Create a job & request to track it.
-  job = new ServerBoundCertServiceJob(preferred_type);
-  inflight_[domain] = job;
+  if (err == ERR_IO_PENDING || err == ERR_FILE_NOT_FOUND) {
+    // We are either waiting for async DB lookup, or waiting for cert
+    // generation.  Create a job & request to track it.
+    job = new ServerBoundCertServiceJob();
+    inflight_[domain] = job;
 
-  ServerBoundCertServiceRequest* request = new ServerBoundCertServiceRequest(
-      request_start,
-      base::Bind(&RequestHandle::OnRequestComplete, base::Unretained(out_req)),
-      type, private_key, cert);
-  job->AddRequest(request);
-  out_req->RequestStarted(this, request, callback);
-  return ERR_IO_PENDING;
+    ServerBoundCertServiceRequest* request = new ServerBoundCertServiceRequest(
+        request_start,
+        base::Bind(&RequestHandle::OnRequestComplete,
+                   base::Unretained(out_req)),
+        private_key, cert);
+    job->AddRequest(request);
+    out_req->RequestStarted(this, request, callback);
+    return ERR_IO_PENDING;
+  }
+
+  return err;
 }
 
 void ServerBoundCertService::GotServerBoundCert(
+    int err,
     const std::string& server_identifier,
-    SSLClientCertType type,
     base::Time expiration_time,
     const std::string& key,
     const std::string& cert) {
@@ -560,22 +502,19 @@
     NOTREACHED();
     return;
   }
-  ServerBoundCertServiceJob* job = j->second;
 
-  if (IsSupportedCertType(type)) {
+  if (err == OK) {
     // Async DB lookup found a valid cert.
-    DVLOG(1) << "Cert store had valid cert for " << server_identifier
-             << " of type " << type;
+    DVLOG(1) << "Cert store had valid cert for " << server_identifier;
     cert_store_hits_++;
     // ServerBoundCertServiceRequest::Post will do the histograms and stuff.
-    HandleResult(OK, server_identifier, type, key, cert);
+    HandleResult(OK, server_identifier, key, cert);
     return;
   }
-
   // Async lookup did not find a valid cert. Start generating a new one.
+  workers_created_++;
   ServerBoundCertServiceWorker* worker = new ServerBoundCertServiceWorker(
       server_identifier,
-      job->type(),
       base::Bind(&ServerBoundCertService::GeneratedServerBoundCert,
                  weak_ptr_factory_.GetWeakPtr()));
   if (!worker->Start(task_runner_)) {
@@ -583,7 +522,6 @@
     LOG(ERROR) << "ServerBoundCertServiceWorker couldn't be started.";
     HandleResult(ERR_INSUFFICIENT_RESOURCES,
                  server_identifier,
-                 CLIENT_CERT_INVALID_TYPE,
                  std::string(),
                  std::string());
     return;
@@ -609,24 +547,21 @@
     // TODO(mattm): we should just Pass() the cert object to
     // SetServerBoundCert().
     server_bound_cert_store_->SetServerBoundCert(
-        cert->server_identifier(), cert->type(), cert->creation_time(),
-        cert->expiration_time(), cert->private_key(), cert->cert());
+        cert->server_identifier(),
+        cert->creation_time(),
+        cert->expiration_time(),
+        cert->private_key(),
+        cert->cert());
 
-    HandleResult(error, server_identifier, cert->type(), cert->private_key(),
-                 cert->cert());
+    HandleResult(error, server_identifier, cert->private_key(), cert->cert());
   } else {
-    HandleResult(error,
-                 server_identifier,
-                 CLIENT_CERT_INVALID_TYPE,
-                 std::string(),
-                 std::string());
+    HandleResult(error, server_identifier, std::string(), std::string());
   }
 }
 
 void ServerBoundCertService::HandleResult(
     int error,
     const std::string& server_identifier,
-    SSLClientCertType type,
     const std::string& private_key,
     const std::string& cert) {
   DCHECK(CalledOnValidThread());
@@ -640,7 +575,7 @@
   ServerBoundCertServiceJob* job = j->second;
   inflight_.erase(j);
 
-  job->HandleResult(error, type, private_key, cert);
+  job->HandleResult(error, private_key, cert);
   delete job;
 }
 
diff --git a/net/ssl/server_bound_cert_service.h b/net/ssl/server_bound_cert_service.h
index dd50590..d931ec8 100644
--- a/net/ssl/server_bound_cert_service.h
+++ b/net/ssl/server_bound_cert_service.h
@@ -17,7 +17,6 @@
 #include "net/base/completion_callback.h"
 #include "net/base/net_export.h"
 #include "net/ssl/server_bound_cert_store.h"
-#include "net/ssl/ssl_client_cert_type.h"
 
 namespace base {
 class TaskRunner;
@@ -92,17 +91,13 @@
   // longer hold.
   bool IsSystemTimeValid() const { return is_system_time_valid_; }
 
-  // Fetches the domain bound cert for the specified host of the specified
-  // type if one exists and creates one otherwise. Returns OK if successful or
-  // an error code upon failure.
-  //
-  // |requested_types| is a list of the TLS ClientCertificateTypes the site will
-  // accept, ordered from most preferred to least preferred.  Types we don't
-  // support will be ignored. See ssl_client_cert_type.h.
+  // Fetches the domain bound cert for the specified host if one exists and
+  // creates one otherwise. Returns OK if successful or an error code upon
+  // failure.
   //
   // On successful completion, |private_key| stores a DER-encoded
-  // PrivateKeyInfo struct, and |cert| stores a DER-encoded certificate, and
-  // |type| specifies the type of certificate that was returned.
+  // PrivateKeyInfo struct, and |cert| stores a DER-encoded certificate.
+  // The PrivateKeyInfo is always an ECDSA private key.
   //
   // |callback| must not be null. ERR_IO_PENDING is returned if the operation
   // could not be completed immediately, in which case the result code will
@@ -113,8 +108,6 @@
   // ServerBoundCertService is destroyed.
   int GetDomainBoundCert(
       const std::string& host,
-      const std::vector<uint8>& requested_types,
-      SSLClientCertType* type,
       std::string* private_key,
       std::string* cert,
       const CompletionCallback& callback,
@@ -128,6 +121,7 @@
   uint64 requests() const { return requests_; }
   uint64 cert_store_hits() const { return cert_store_hits_; }
   uint64 inflight_joins() const { return inflight_joins_; }
+  uint64 workers_created() const { return workers_created_; }
 
  private:
   // Cancels the specified request. |req| is the handle stored by
@@ -135,8 +129,8 @@
   // callback will not be called.
   void CancelRequest(ServerBoundCertServiceRequest* req);
 
-  void GotServerBoundCert(const std::string& server_identifier,
-                          SSLClientCertType type,
+  void GotServerBoundCert(int err,
+                          const std::string& server_identifier,
                           base::Time expiration_time,
                           const std::string& key,
                           const std::string& cert);
@@ -146,7 +140,6 @@
       scoped_ptr<ServerBoundCertStore::ServerBoundCert> cert);
   void HandleResult(int error,
                     const std::string& server_identifier,
-                    SSLClientCertType type,
                     const std::string& private_key,
                     const std::string& cert);
 
@@ -161,6 +154,7 @@
   uint64 requests_;
   uint64 cert_store_hits_;
   uint64 inflight_joins_;
+  uint64 workers_created_;
 
   bool is_system_time_valid_;
 
diff --git a/net/ssl/server_bound_cert_service_unittest.cc b/net/ssl/server_bound_cert_service_unittest.cc
index 37a86a4..0063f49 100644
--- a/net/ssl/server_bound_cert_service_unittest.cc
+++ b/net/ssl/server_bound_cert_service_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/message_loop/message_loop.h"
+#include "base/task_runner.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "crypto/ec_private_key.h"
 #include "net/base/net_errors.h"
@@ -47,6 +48,66 @@
   scoped_ptr<ServerBoundCertService> service_;
 };
 
+class MockServerBoundCertStoreWithAsyncGet
+    : public DefaultServerBoundCertStore {
+ public:
+  MockServerBoundCertStoreWithAsyncGet()
+      : DefaultServerBoundCertStore(NULL), cert_count_(0) {}
+
+  virtual int GetServerBoundCert(const std::string& server_identifier,
+                                 base::Time* expiration_time,
+                                 std::string* private_key_result,
+                                 std::string* cert_result,
+                                 const GetCertCallback& callback) OVERRIDE;
+
+  virtual void SetServerBoundCert(const std::string& server_identifier,
+                                  base::Time creation_time,
+                                  base::Time expiration_time,
+                                  const std::string& private_key,
+                                  const std::string& cert) OVERRIDE {
+    cert_count_ = 1;
+  }
+
+  virtual int GetCertCount() OVERRIDE { return cert_count_; }
+
+  void CallGetServerBoundCertCallbackWithResult(int err,
+                                                base::Time expiration_time,
+                                                const std::string& private_key,
+                                                const std::string& cert);
+
+ private:
+  GetCertCallback callback_;
+  std::string server_identifier_;
+  int cert_count_;
+};
+
+int MockServerBoundCertStoreWithAsyncGet::GetServerBoundCert(
+    const std::string& server_identifier,
+    base::Time* expiration_time,
+    std::string* private_key_result,
+    std::string* cert_result,
+    const GetCertCallback& callback) {
+  server_identifier_ = server_identifier;
+  callback_ = callback;
+  // Reset the cert count, it'll get incremented in either SetServerBoundCert or
+  // CallGetServerBoundCertCallbackWithResult.
+  cert_count_ = 0;
+  // Do nothing else: the results to be provided will be specified through
+  // CallGetServerBoundCertCallbackWithResult.
+  return ERR_IO_PENDING;
+}
+
+void
+MockServerBoundCertStoreWithAsyncGet::CallGetServerBoundCertCallbackWithResult(
+    int err,
+    base::Time expiration_time,
+    const std::string& private_key,
+    const std::string& cert) {
+  if (err == OK)
+    cert_count_ = 1;
+  callback_.Run(err, server_identifier_, expiration_time, private_key, cert);
+}
+
 TEST_F(ServerBoundCertServiceTest, GetDomainForHost) {
   EXPECT_EQ("google.com",
             ServerBoundCertService::GetDomainForHost("google.com"));
@@ -73,38 +134,32 @@
   std::string host("encrypted.google.com");
 
   int error;
-  std::vector<uint8> types;
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
   TestCompletionCallback callback;
   ServerBoundCertService::RequestHandle request_handle;
 
   // Asynchronous completion.
-  SSLClientCertType type1;
   std::string private_key_info1, der_cert1;
   EXPECT_EQ(0, service_->cert_count());
   error = service_->GetDomainBoundCert(
-      host, types, &type1, &private_key_info1, &der_cert1,
+      host, &private_key_info1, &der_cert1,
       callback.callback(), &request_handle);
   EXPECT_EQ(ERR_IO_PENDING, error);
   EXPECT_TRUE(request_handle.is_active());
   error = callback.WaitForResult();
   EXPECT_EQ(OK, error);
   EXPECT_EQ(1, service_->cert_count());
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1);
   EXPECT_FALSE(private_key_info1.empty());
   EXPECT_FALSE(der_cert1.empty());
   EXPECT_FALSE(request_handle.is_active());
 
   // Synchronous completion.
-  SSLClientCertType type2;
   std::string private_key_info2, der_cert2;
   error = service_->GetDomainBoundCert(
-      host, types, &type2, &private_key_info2, &der_cert2,
+      host, &private_key_info2, &der_cert2,
       callback.callback(), &request_handle);
   EXPECT_FALSE(request_handle.is_active());
   EXPECT_EQ(OK, error);
   EXPECT_EQ(1, service_->cert_count());
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2);
   EXPECT_EQ(private_key_info1, private_key_info2);
   EXPECT_EQ(der_cert1, der_cert2);
 
@@ -113,97 +168,16 @@
   EXPECT_EQ(0u, service_->inflight_joins());
 }
 
-TEST_F(ServerBoundCertServiceTest, UnsupportedTypes) {
-  std::string host("encrypted.google.com");
-
-  int error;
-  std::vector<uint8> types;
-  TestCompletionCallback callback;
-  ServerBoundCertService::RequestHandle request_handle;
-
-  // Empty requested_types.
-  SSLClientCertType type1;
-  std::string private_key_info1, der_cert1;
-  error = service_->GetDomainBoundCert(
-      host, types, &type1, &private_key_info1, &der_cert1,
-      callback.callback(), &request_handle);
-  EXPECT_EQ(ERR_INVALID_ARGUMENT, error);
-  EXPECT_FALSE(request_handle.is_active());
-
-  // No supported types in requested_types.
-  types.push_back(CLIENT_CERT_RSA_SIGN);
-  types.push_back(2);
-  types.push_back(3);
-  error = service_->GetDomainBoundCert(
-      host, types, &type1, &private_key_info1, &der_cert1,
-      callback.callback(), &request_handle);
-  EXPECT_EQ(ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, error);
-  EXPECT_FALSE(request_handle.is_active());
-
-  // Supported types after unsupported ones in requested_types.
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
-  // Asynchronous completion.
-  EXPECT_EQ(0, service_->cert_count());
-  error = service_->GetDomainBoundCert(
-      host, types, &type1, &private_key_info1, &der_cert1,
-      callback.callback(), &request_handle);
-  EXPECT_EQ(ERR_IO_PENDING, error);
-  EXPECT_TRUE(request_handle.is_active());
-  error = callback.WaitForResult();
-  EXPECT_EQ(OK, error);
-  EXPECT_EQ(1, service_->cert_count());
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1);
-  EXPECT_FALSE(private_key_info1.empty());
-  EXPECT_FALSE(der_cert1.empty());
-
-  // Now that the cert is created, doing requests for unsupported types
-  // shouldn't affect the created cert.
-  // Empty requested_types.
-  types.clear();
-  SSLClientCertType type2;
-  std::string private_key_info2, der_cert2;
-  error = service_->GetDomainBoundCert(
-      host, types, &type2, &private_key_info2, &der_cert2,
-      callback.callback(), &request_handle);
-  EXPECT_EQ(ERR_INVALID_ARGUMENT, error);
-  EXPECT_FALSE(request_handle.is_active());
-
-  // No supported types in requested_types.
-  types.push_back(CLIENT_CERT_RSA_SIGN);
-  types.push_back(2);
-  types.push_back(3);
-  error = service_->GetDomainBoundCert(
-      host, types, &type2, &private_key_info2, &der_cert2,
-      callback.callback(), &request_handle);
-  EXPECT_EQ(ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, error);
-  EXPECT_FALSE(request_handle.is_active());
-
-  // If we request EC, the cert we created before should still be there.
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
-  error = service_->GetDomainBoundCert(
-      host, types, &type2, &private_key_info2, &der_cert2,
-      callback.callback(), &request_handle);
-  EXPECT_FALSE(request_handle.is_active());
-  EXPECT_EQ(OK, error);
-  EXPECT_EQ(1, service_->cert_count());
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2);
-  EXPECT_EQ(private_key_info1, private_key_info2);
-  EXPECT_EQ(der_cert1, der_cert2);
-}
-
 TEST_F(ServerBoundCertServiceTest, StoreCerts) {
   int error;
-  std::vector<uint8> types;
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
   TestCompletionCallback callback;
   ServerBoundCertService::RequestHandle request_handle;
 
   std::string host1("encrypted.google.com");
-  SSLClientCertType type1;
   std::string private_key_info1, der_cert1;
   EXPECT_EQ(0, service_->cert_count());
   error = service_->GetDomainBoundCert(
-      host1, types, &type1, &private_key_info1, &der_cert1,
+      host1, &private_key_info1, &der_cert1,
       callback.callback(), &request_handle);
   EXPECT_EQ(ERR_IO_PENDING, error);
   EXPECT_TRUE(request_handle.is_active());
@@ -212,10 +186,9 @@
   EXPECT_EQ(1, service_->cert_count());
 
   std::string host2("www.verisign.com");
-  SSLClientCertType type2;
   std::string private_key_info2, der_cert2;
   error = service_->GetDomainBoundCert(
-      host2, types, &type2, &private_key_info2, &der_cert2,
+      host2, &private_key_info2, &der_cert2,
       callback.callback(), &request_handle);
   EXPECT_EQ(ERR_IO_PENDING, error);
   EXPECT_TRUE(request_handle.is_active());
@@ -224,10 +197,9 @@
   EXPECT_EQ(2, service_->cert_count());
 
   std::string host3("www.twitter.com");
-  SSLClientCertType type3;
   std::string private_key_info3, der_cert3;
   error = service_->GetDomainBoundCert(
-      host3, types, &type3, &private_key_info3, &der_cert3,
+      host3, &private_key_info3, &der_cert3,
       callback.callback(), &request_handle);
   EXPECT_EQ(ERR_IO_PENDING, error);
   EXPECT_TRUE(request_handle.is_active());
@@ -241,38 +213,29 @@
   EXPECT_NE(der_cert1, der_cert3);
   EXPECT_NE(private_key_info2, private_key_info3);
   EXPECT_NE(der_cert2, der_cert3);
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1);
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2);
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type3);
 }
 
 // Tests an inflight join.
 TEST_F(ServerBoundCertServiceTest, InflightJoin) {
   std::string host("encrypted.google.com");
   int error;
-  std::vector<uint8> types;
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
 
-  SSLClientCertType type1;
   std::string private_key_info1, der_cert1;
   TestCompletionCallback callback1;
   ServerBoundCertService::RequestHandle request_handle1;
 
-  SSLClientCertType type2;
   std::string private_key_info2, der_cert2;
   TestCompletionCallback callback2;
   ServerBoundCertService::RequestHandle request_handle2;
 
   error = service_->GetDomainBoundCert(
-      host, types, &type1, &private_key_info1, &der_cert1,
+      host, &private_key_info1, &der_cert1,
       callback1.callback(), &request_handle1);
   EXPECT_EQ(ERR_IO_PENDING, error);
   EXPECT_TRUE(request_handle1.is_active());
-  // If we request RSA and EC in the 2nd request, should still join with the
-  // original request.
-  types.insert(types.begin(), CLIENT_CERT_RSA_SIGN);
+  // Should join with the original request.
   error = service_->GetDomainBoundCert(
-      host, types, &type2, &private_key_info2, &der_cert2,
+      host, &private_key_info2, &der_cert2,
       callback2.callback(), &request_handle2);
   EXPECT_EQ(ERR_IO_PENDING, error);
   EXPECT_TRUE(request_handle2.is_active());
@@ -282,8 +245,6 @@
   error = callback2.WaitForResult();
   EXPECT_EQ(OK, error);
 
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1);
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2);
   EXPECT_EQ(2u, service_->requests());
   EXPECT_EQ(0u, service_->cert_store_hits());
   EXPECT_EQ(1u, service_->inflight_joins());
@@ -291,16 +252,13 @@
 
 TEST_F(ServerBoundCertServiceTest, ExtractValuesFromBytesEC) {
   std::string host("encrypted.google.com");
-  SSLClientCertType type;
   std::string private_key_info, der_cert;
   int error;
-  std::vector<uint8> types;
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
   TestCompletionCallback callback;
   ServerBoundCertService::RequestHandle request_handle;
 
   error = service_->GetDomainBoundCert(
-      host, types, &type, &private_key_info, &der_cert, callback.callback(),
+      host, &private_key_info, &der_cert, callback.callback(),
       &request_handle);
   EXPECT_EQ(ERR_IO_PENDING, error);
   EXPECT_TRUE(request_handle.is_active());
@@ -329,16 +287,11 @@
 // Tests that the callback of a canceled request is never made.
 TEST_F(ServerBoundCertServiceTest, CancelRequest) {
   std::string host("encrypted.google.com");
-  SSLClientCertType type;
   std::string private_key_info, der_cert;
   int error;
-  std::vector<uint8> types;
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
   ServerBoundCertService::RequestHandle request_handle;
 
   error = service_->GetDomainBoundCert(host,
-                                      types,
-                                      &type,
                                       &private_key_info,
                                       &der_cert,
                                       base::Bind(&FailTest),
@@ -362,17 +315,12 @@
 // Tests that destructing the RequestHandle cancels the request.
 TEST_F(ServerBoundCertServiceTest, CancelRequestByHandleDestruction) {
   std::string host("encrypted.google.com");
-  SSLClientCertType type;
   std::string private_key_info, der_cert;
   int error;
-  std::vector<uint8> types;
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
   {
     ServerBoundCertService::RequestHandle request_handle;
 
     error = service_->GetDomainBoundCert(host,
-                                         types,
-                                         &type,
                                          &private_key_info,
                                          &der_cert,
                                          base::Bind(&FailTest),
@@ -394,16 +342,11 @@
 
 TEST_F(ServerBoundCertServiceTest, DestructionWithPendingRequest) {
   std::string host("encrypted.google.com");
-  SSLClientCertType type;
   std::string private_key_info, der_cert;
   int error;
-  std::vector<uint8> types;
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
   ServerBoundCertService::RequestHandle request_handle;
 
   error = service_->GetDomainBoundCert(host,
-                                       types,
-                                       &type,
                                        &private_key_info,
                                        &der_cert,
                                        base::Bind(&FailTest),
@@ -438,16 +381,11 @@
 
   // Make a request that will force synchronous completion.
   std::string host("encrypted.google.com");
-  SSLClientCertType type;
   std::string private_key_info, der_cert;
   int error;
-  std::vector<uint8> types;
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
   ServerBoundCertService::RequestHandle request_handle;
 
   error = service_->GetDomainBoundCert(host,
-                                       types,
-                                       &type,
                                        &private_key_info,
                                        &der_cert,
                                        base::Bind(&FailTest),
@@ -460,30 +398,23 @@
 // Tests that simultaneous creation of different certs works.
 TEST_F(ServerBoundCertServiceTest, SimultaneousCreation) {
   int error;
-  std::vector<uint8> types;
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
 
   std::string host1("encrypted.google.com");
-  SSLClientCertType type1;
   std::string private_key_info1, der_cert1;
   TestCompletionCallback callback1;
   ServerBoundCertService::RequestHandle request_handle1;
 
   std::string host2("foo.com");
-  SSLClientCertType type2;
   std::string private_key_info2, der_cert2;
   TestCompletionCallback callback2;
   ServerBoundCertService::RequestHandle request_handle2;
 
   std::string host3("bar.com");
-  SSLClientCertType type3;
   std::string private_key_info3, der_cert3;
   TestCompletionCallback callback3;
   ServerBoundCertService::RequestHandle request_handle3;
 
   error = service_->GetDomainBoundCert(host1,
-                                       types,
-                                       &type1,
                                        &private_key_info1,
                                        &der_cert1,
                                        callback1.callback(),
@@ -492,8 +423,6 @@
   EXPECT_TRUE(request_handle1.is_active());
 
   error = service_->GetDomainBoundCert(host2,
-                                       types,
-                                       &type2,
                                        &private_key_info2,
                                        &der_cert2,
                                        callback2.callback(),
@@ -502,8 +431,6 @@
   EXPECT_TRUE(request_handle2.is_active());
 
   error = service_->GetDomainBoundCert(host3,
-                                       types,
-                                       &type3,
                                        &private_key_info3,
                                        &der_cert3,
                                        callback3.callback(),
@@ -513,19 +440,16 @@
 
   error = callback1.WaitForResult();
   EXPECT_EQ(OK, error);
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1);
   EXPECT_FALSE(private_key_info1.empty());
   EXPECT_FALSE(der_cert1.empty());
 
   error = callback2.WaitForResult();
   EXPECT_EQ(OK, error);
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2);
   EXPECT_FALSE(private_key_info2.empty());
   EXPECT_FALSE(der_cert2.empty());
 
   error = callback3.WaitForResult();
   EXPECT_EQ(OK, error);
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type3);
   EXPECT_FALSE(private_key_info3.empty());
   EXPECT_FALSE(der_cert3.empty());
 
@@ -545,13 +469,11 @@
   ServerBoundCertStore* store = service_->GetCertStore();
   base::Time now = base::Time::Now();
   store->SetServerBoundCert("good",
-                            CLIENT_CERT_ECDSA_SIGN,
                             now,
                             now + base::TimeDelta::FromDays(1),
                             "a",
                             "b");
   store->SetServerBoundCert("expired",
-                            CLIENT_CERT_ECDSA_SIGN,
                             now - base::TimeDelta::FromDays(2),
                             now - base::TimeDelta::FromDays(1),
                             "c",
@@ -559,38 +481,99 @@
   EXPECT_EQ(2, service_->cert_count());
 
   int error;
-  std::vector<uint8> types;
-  types.push_back(CLIENT_CERT_ECDSA_SIGN);
   TestCompletionCallback callback;
   ServerBoundCertService::RequestHandle request_handle;
 
   // Cert is valid - synchronous completion.
-  SSLClientCertType type1;
   std::string private_key_info1, der_cert1;
   error = service_->GetDomainBoundCert(
-      "good", types, &type1, &private_key_info1, &der_cert1,
+      "good", &private_key_info1, &der_cert1,
       callback.callback(), &request_handle);
   EXPECT_EQ(OK, error);
   EXPECT_FALSE(request_handle.is_active());
   EXPECT_EQ(2, service_->cert_count());
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1);
   EXPECT_STREQ("a", private_key_info1.c_str());
   EXPECT_STREQ("b", der_cert1.c_str());
 
   // Expired cert is valid as well - synchronous completion.
-  SSLClientCertType type2;
   std::string private_key_info2, der_cert2;
   error = service_->GetDomainBoundCert(
-      "expired", types, &type2, &private_key_info2, &der_cert2,
+      "expired", &private_key_info2, &der_cert2,
       callback.callback(), &request_handle);
   EXPECT_EQ(OK, error);
   EXPECT_FALSE(request_handle.is_active());
   EXPECT_EQ(2, service_->cert_count());
-  EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2);
   EXPECT_STREQ("c", private_key_info2.c_str());
   EXPECT_STREQ("d", der_cert2.c_str());
 }
 
+TEST_F(ServerBoundCertServiceTest, AsyncStoreGetNoCertsInStore) {
+  MockServerBoundCertStoreWithAsyncGet* mock_store =
+      new MockServerBoundCertStoreWithAsyncGet();
+  service_ = scoped_ptr<ServerBoundCertService>(
+      new ServerBoundCertService(mock_store, sequenced_worker_pool_));
+
+  std::string host("encrypted.google.com");
+
+  int error;
+  TestCompletionCallback callback;
+  ServerBoundCertService::RequestHandle request_handle;
+
+  // Asynchronous completion with no certs in the store.
+  std::string private_key_info, der_cert;
+  EXPECT_EQ(0, service_->cert_count());
+  error = service_->GetDomainBoundCert(
+      host, &private_key_info, &der_cert, callback.callback(), &request_handle);
+  EXPECT_EQ(ERR_IO_PENDING, error);
+  EXPECT_TRUE(request_handle.is_active());
+
+  mock_store->CallGetServerBoundCertCallbackWithResult(
+      ERR_FILE_NOT_FOUND, base::Time(), std::string(), std::string());
+
+  error = callback.WaitForResult();
+  EXPECT_EQ(OK, error);
+  EXPECT_EQ(1, service_->cert_count());
+  EXPECT_FALSE(private_key_info.empty());
+  EXPECT_FALSE(der_cert.empty());
+  EXPECT_FALSE(request_handle.is_active());
+}
+
+TEST_F(ServerBoundCertServiceTest, AsyncStoreGetOneCertInStore) {
+  MockServerBoundCertStoreWithAsyncGet* mock_store =
+      new MockServerBoundCertStoreWithAsyncGet();
+  service_ = scoped_ptr<ServerBoundCertService>(
+      new ServerBoundCertService(mock_store, sequenced_worker_pool_));
+
+  std::string host("encrypted.google.com");
+
+  int error;
+  TestCompletionCallback callback;
+  ServerBoundCertService::RequestHandle request_handle;
+
+  // Asynchronous completion with a cert in the store.
+  std::string private_key_info, der_cert;
+  EXPECT_EQ(0, service_->cert_count());
+  error = service_->GetDomainBoundCert(
+      host, &private_key_info, &der_cert, callback.callback(), &request_handle);
+  EXPECT_EQ(ERR_IO_PENDING, error);
+  EXPECT_TRUE(request_handle.is_active());
+
+  mock_store->CallGetServerBoundCertCallbackWithResult(
+      OK, base::Time(), "ab", "cd");
+
+  error = callback.WaitForResult();
+  EXPECT_EQ(OK, error);
+  EXPECT_EQ(1, service_->cert_count());
+  EXPECT_EQ(1u, service_->requests());
+  EXPECT_EQ(1u, service_->cert_store_hits());
+  // Because the cert was found in the store, no new workers should have been
+  // created.
+  EXPECT_EQ(0u, service_->workers_created());
+  EXPECT_STREQ("ab", private_key_info.c_str());
+  EXPECT_STREQ("cd", der_cert.c_str());
+  EXPECT_FALSE(request_handle.is_active());
+}
+
 #endif  // !defined(USE_OPENSSL)
 
 }  // namespace
diff --git a/net/ssl/server_bound_cert_store.cc b/net/ssl/server_bound_cert_store.cc
index d0d520d..e778362 100644
--- a/net/ssl/server_bound_cert_store.cc
+++ b/net/ssl/server_bound_cert_store.cc
@@ -6,19 +6,16 @@
 
 namespace net {
 
-ServerBoundCertStore::ServerBoundCert::ServerBoundCert()
-    : type_(CLIENT_CERT_INVALID_TYPE) {
+ServerBoundCertStore::ServerBoundCert::ServerBoundCert() {
 }
 
 ServerBoundCertStore::ServerBoundCert::ServerBoundCert(
     const std::string& server_identifier,
-    SSLClientCertType type,
     base::Time creation_time,
     base::Time expiration_time,
     const std::string& private_key,
     const std::string& cert)
     : server_identifier_(server_identifier),
-      type_(type),
       creation_time_(creation_time),
       expiration_time_(expiration_time),
       private_key_(private_key),
@@ -29,7 +26,7 @@
 void ServerBoundCertStore::InitializeFrom(const ServerBoundCertList& list) {
   for (ServerBoundCertList::const_iterator i = list.begin(); i != list.end();
       ++i) {
-    SetServerBoundCert(i->server_identifier(), i->type(), i->creation_time(),
+    SetServerBoundCert(i->server_identifier(), i->creation_time(),
                        i->expiration_time(), i->private_key(), i->cert());
   }
 }
diff --git a/net/ssl/server_bound_cert_store.h b/net/ssl/server_bound_cert_store.h
index ad0ecb0..0de0f3e 100644
--- a/net/ssl/server_bound_cert_store.h
+++ b/net/ssl/server_bound_cert_store.h
@@ -12,7 +12,6 @@
 #include "base/threading/non_thread_safe.h"
 #include "base/time/time.h"
 #include "net/base/net_export.h"
-#include "net/ssl/ssl_client_cert_type.h"
 
 namespace net {
 
@@ -27,12 +26,11 @@
     : NON_EXPORTED_BASE(public base::NonThreadSafe) {
  public:
   // The ServerBoundCert class contains a private key in addition to the server
-  // cert, and cert type.
+  // cert.
   class NET_EXPORT ServerBoundCert {
    public:
     ServerBoundCert();
     ServerBoundCert(const std::string& server_identifier,
-                    SSLClientCertType type,
                     base::Time creation_time,
                     base::Time expiration_time,
                     const std::string& private_key,
@@ -41,8 +39,6 @@
 
     // Server identifier.  For domain bound certs, for instance "verisign.com".
     const std::string& server_identifier() const { return server_identifier_; }
-    // TLS ClientCertificateType.
-    SSLClientCertType type() const { return type_; }
     // The time the certificate was created, also the start of the certificate
     // validity period.
     base::Time creation_time() const { return creation_time_; }
@@ -57,7 +53,6 @@
 
    private:
     std::string server_identifier_;
-    SSLClientCertType type_;
     base::Time creation_time_;
     base::Time expiration_time_;
     std::string private_key_;
@@ -67,8 +62,8 @@
   typedef std::list<ServerBoundCert> ServerBoundCertList;
 
   typedef base::Callback<void(
+      int,
       const std::string&,
-      SSLClientCertType,
       base::Time,
       const std::string&,
       const std::string&)> GetCertCallback;
@@ -77,14 +72,13 @@
   virtual ~ServerBoundCertStore() {}
 
   // GetServerBoundCert may return the result synchronously through the
-  // output parameters, in which case it will return true.  Otherwise it will
-  // return false and the callback will be called with the result
+  // output parameters, in which case it will return either OK if a cert is
+  // found in the store, or ERR_FILE_NOT_FOUND if none is found.  If the
+  // result cannot be returned synchronously, GetServerBoundCert will
+  // return ERR_IO_PENDING and the callback will be called with the result
   // asynchronously.
-  // In either case, the type will be CLIENT_CERT_INVALID_TYPE if no cert
-  // existed for the given |server_identifier|.
-  virtual bool GetServerBoundCert(
+  virtual int GetServerBoundCert(
       const std::string& server_identifier,
-      SSLClientCertType* type,
       base::Time* expiration_time,
       std::string* private_key_result,
       std::string* cert_result,
@@ -93,7 +87,6 @@
   // Adds a server bound cert and the corresponding private key to the store.
   virtual void SetServerBoundCert(
       const std::string& server_identifier,
-      SSLClientCertType type,
       base::Time creation_time,
       base::Time expiration_time,
       const std::string& private_key,
diff --git a/net/third_party/nss/README.chromium b/net/third_party/nss/README.chromium
index d183ca8..ae77651 100644
--- a/net/third_party/nss/README.chromium
+++ b/net/third_party/nss/README.chromium
@@ -75,10 +75,6 @@
     patches/cbc.patch
     https://code.google.com/p/chromium/issues/detail?id=172658#c12
 
-  * Define AES_256_KEY_LENGTH if the system blapit.h header doesn't define it.
-    Remove this patch when all system NSS packages are NSS 3.12.10 or later.
-    patches/aes256keylength.patch
-
   * Change ssl3_SuiteBOnly to always return PR_TRUE. The softoken in NSS
     versions older than 3.15 report an EC key size range of 112 bits to 571
     bits, even when it is compiled to support only the NIST P-256, P-384, and
diff --git a/net/third_party/nss/patches/aes256keylength.patch b/net/third_party/nss/patches/aes256keylength.patch
deleted file mode 100644
index 2fc2506..0000000
--- a/net/third_party/nss/patches/aes256keylength.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-diff -pu a/nss/lib/ssl/sslsnce.c b/nss/lib/ssl/sslsnce.c
---- a/nss/lib/ssl/sslsnce.c	2013-07-31 12:07:10.974699609 -0700
-+++ b/nss/lib/ssl/sslsnce.c	2013-07-31 14:12:33.185058439 -0700
-@@ -86,6 +86,11 @@
- #include "nspr.h"
- #include "sslmutex.h"
- 
-+/* AES_256_KEY_LENGTH was added to blapit.h in NSS 3.12.10. */
-+#ifndef AES_256_KEY_LENGTH
-+#define AES_256_KEY_LENGTH      32  /* bytes */
-+#endif
-+
- /*
- ** Format of a cache entry in the shared memory.
- */ 
diff --git a/net/third_party/nss/patches/applypatches.sh b/net/third_party/nss/patches/applypatches.sh
index 86444a2..81192a4 100755
--- a/net/third_party/nss/patches/applypatches.sh
+++ b/net/third_party/nss/patches/applypatches.sh
@@ -38,8 +38,6 @@
 
 patch -p4 < $patches_dir/cbc.patch
 
-patch -p4 < $patches_dir/aes256keylength.patch
-
 patch -p4 < $patches_dir/suitebonly.patch
 
 patch -p4 < $patches_dir/secitemarray.patch
diff --git a/net/third_party/nss/ssl.gyp b/net/third_party/nss/ssl.gyp
index 49cfbd8..fc52673 100644
--- a/net/third_party/nss/ssl.gyp
+++ b/net/third_party/nss/ssl.gyp
@@ -68,7 +68,6 @@
         'ssl/win32err.c',
         'ssl/win32err.h',
         'ssl/bodge/secitem_array.c',
-        'ssl/bodge/secure_memcmp.c',
       ],
       'sources!': [
         'ssl/os2_err.c',
diff --git a/net/third_party/nss/ssl/bodge/secure_memcmp.c b/net/third_party/nss/ssl/bodge/secure_memcmp.c
deleted file mode 100644
index b18579c..0000000
--- a/net/third_party/nss/ssl/bodge/secure_memcmp.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the Netscape security libraries.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1994-2000
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-// This file exists to provide the secure memcmp function. This was added in
-// NSS 3.12.5.
-
-#include <stdlib.h>
-
-/*
- * Perform a constant-time compare of two memory regions. The return value is
- * 0 if the memory regions are equal and non-zero otherwise.
- */
-int
-NSS_SecureMemcmp(const void *ia, const void *ib, size_t n)
-{
-    const unsigned char *a = (const unsigned char*) ia;
-    const unsigned char *b = (const unsigned char*) ib;
-    size_t i;
-    unsigned char r = 0;
-
-    for (i = 0; i < n; ++i) {
-        r |= *a++ ^ *b++;
-    }
-
-    return r;
-}
diff --git a/net/third_party/nss/ssl/sslsnce.c b/net/third_party/nss/ssl/sslsnce.c
index 4b8825a..b0446ad 100644
--- a/net/third_party/nss/ssl/sslsnce.c
+++ b/net/third_party/nss/ssl/sslsnce.c
@@ -86,11 +86,6 @@
 #include "nspr.h"
 #include "sslmutex.h"
 
-/* AES_256_KEY_LENGTH was added to blapit.h in NSS 3.12.10. */
-#ifndef AES_256_KEY_LENGTH
-#define AES_256_KEY_LENGTH      32  /* bytes */
-#endif
-
 /*
 ** Format of a cache entry in the shared memory.
 */ 
diff --git a/net/tools/quic/quic_server.cc b/net/tools/quic/quic_server.cc
index 36a9d4b..d18525f 100644
--- a/net/tools/quic/quic_server.cc
+++ b/net/tools/quic/quic_server.cc
@@ -179,6 +179,19 @@
   }
 }
 
+/* static */
+void QuicServer::MaybeDispatchPacket(QuicDispatcher* dispatcher,
+                                     const QuicEncryptedPacket& packet,
+                                     const IPEndPoint& server_address,
+                                     const IPEndPoint& client_address) {
+  QuicGuid guid;
+  if (!QuicFramer::ReadGuidFromPacket(packet, &guid)) {
+    return;
+  }
+
+  dispatcher->ProcessPacket(server_address, client_address, guid, packet);
+}
+
 bool QuicServer::ReadAndDispatchSinglePacket(int fd,
                                              int port,
                                              QuicDispatcher* dispatcher,
@@ -199,19 +212,9 @@
   }
 
   QuicEncryptedPacket packet(buf, bytes_read, false);
-  QuicGuid guid;
-  QuicDataReader reader(packet.data(), packet.length());
-  uint8 public_flags;
-  if (!reader.ReadBytes(&public_flags, 1)) {
-    LOG(DFATAL) << "Unable to read public flags.";
-    return false;
-  }
-  if (!reader.ReadUInt64(&guid)) {
-    return true;  // We read, we just didn't like the results.
-  }
 
   IPEndPoint server_address(server_ip, port);
-  dispatcher->ProcessPacket(server_address, client_address, guid, packet);
+  MaybeDispatchPacket(dispatcher, packet, server_address, client_address);
 
   return true;
 }
diff --git a/net/tools/quic/quic_server.h b/net/tools/quic/quic_server.h
index 6399566..142d1d1 100644
--- a/net/tools/quic/quic_server.h
+++ b/net/tools/quic/quic_server.h
@@ -59,6 +59,14 @@
 
   virtual void OnShutdown(EpollServer* eps, int fd) OVERRIDE {}
 
+  // Dispatches the given packet only if it looks like a valid QUIC packet.
+  // TODO(rjshade): Return a status describing why a packet was dropped, and log
+  //                somehow.  Maybe expose as a varz.
+  static void MaybeDispatchPacket(QuicDispatcher* dispatcher,
+                                  const QuicEncryptedPacket& packet,
+                                  const IPEndPoint& server_address,
+                                  const IPEndPoint& client_address);
+
   bool overflow_supported() { return overflow_supported_; }
 
   int packets_dropped() { return packets_dropped_; }
diff --git a/net/tools/quic/quic_server_test.cc b/net/tools/quic/quic_server_test.cc
new file mode 100644
index 0000000..7d1d669
--- /dev/null
+++ b/net/tools/quic/quic_server_test.cc
@@ -0,0 +1,74 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/tools/quic/quic_server.h"
+
+#include "net/quic/crypto/quic_random.h"
+#include "net/quic/quic_utils.h"
+#include "net/tools/quic/test_tools/mock_quic_dispatcher.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::_;
+
+namespace net {
+namespace tools {
+namespace test {
+
+namespace {
+
+class QuicServerDispatchPacketTest : public ::testing::Test {
+ public:
+  QuicServerDispatchPacketTest()
+      : crypto_config_("blah", QuicRandom::GetInstance()),
+        dispatcher_(config_, crypto_config_, 1234, &eps_) {}
+
+
+  void MaybeDispatchPacket(const QuicEncryptedPacket& packet) {
+    IPEndPoint client_addr, server_addr;
+    QuicServer::MaybeDispatchPacket(&dispatcher_, packet,
+                                    client_addr, server_addr);
+  }
+
+ protected:
+  QuicConfig config_;
+  QuicCryptoServerConfig crypto_config_;
+  EpollServer eps_;
+  MockQuicDispatcher dispatcher_;
+};
+
+TEST_F(QuicServerDispatchPacketTest, DoNotDispatchPacketWithoutGUID) {
+  // Packet too short to be considered valid.
+  unsigned char invalid_packet[] = { 0x00 };
+  QuicEncryptedPacket encrypted_invalid_packet(
+      QuicUtils::AsChars(invalid_packet), arraysize(invalid_packet), false);
+
+  // We expect the invalid packet to be dropped, and ProcessPacket should never
+  // be called.
+  EXPECT_CALL(dispatcher_, ProcessPacket(_, _, _, _)).Times(0);
+  MaybeDispatchPacket(encrypted_invalid_packet);
+}
+
+TEST_F(QuicServerDispatchPacketTest, DispatchValidPacket) {
+  unsigned char valid_packet[] = {
+    // public flags (8 byte guid)
+    0x3C,
+    // guid
+    0x10, 0x32, 0x54, 0x76,
+    0x98, 0xBA, 0xDC, 0xFE,
+    // packet sequence number
+    0xBC, 0x9A, 0x78, 0x56,
+    0x34, 0x12,
+    // private flags
+    0x00 };
+  QuicEncryptedPacket encrypted_valid_packet(QuicUtils::AsChars(valid_packet),
+                                             arraysize(valid_packet), false);
+
+  EXPECT_CALL(dispatcher_, ProcessPacket(_, _, _, _)).Times(1);
+  MaybeDispatchPacket(encrypted_valid_packet);
+}
+
+}  // namespace
+}  // namespace test
+}  // namespace tools
+}  // namespace net
diff --git a/net/tools/quic/test_tools/mock_quic_dispatcher.cc b/net/tools/quic/test_tools/mock_quic_dispatcher.cc
new file mode 100644
index 0000000..3a2b1d9
--- /dev/null
+++ b/net/tools/quic/test_tools/mock_quic_dispatcher.cc
@@ -0,0 +1,21 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/tools/quic/test_tools/mock_quic_dispatcher.h"
+
+namespace net {
+namespace tools {
+namespace test {
+
+MockQuicDispatcher::MockQuicDispatcher(
+    const QuicConfig& config,
+    const QuicCryptoServerConfig& crypto_config,
+    QuicGuid guid,
+    EpollServer* eps)
+    : QuicDispatcher(config, crypto_config, guid, eps) { }
+MockQuicDispatcher::~MockQuicDispatcher() {}
+
+}  // namespace test
+}  // namespace tools
+}  // namespace net
diff --git a/net/tools/quic/test_tools/mock_quic_dispatcher.h b/net/tools/quic/test_tools/mock_quic_dispatcher.h
new file mode 100644
index 0000000..563ab0d
--- /dev/null
+++ b/net/tools/quic/test_tools/mock_quic_dispatcher.h
@@ -0,0 +1,38 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_TOOLS_QUIC_TEST_TOOLS_MOCK_QUIC_DISPATCHER_H_
+#define NET_TOOLS_QUIC_TEST_TOOLS_MOCK_QUIC_DISPATCHER_H_
+
+#include "net/base/ip_endpoint.h"
+#include "net/quic/crypto/crypto_server_config.h"
+#include "net/quic/quic_config.h"
+#include "net/quic/quic_protocol.h"
+#include "net/tools/flip_server/epoll_server.h"
+#include "net/tools/quic/quic_dispatcher.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace net {
+namespace tools {
+namespace test {
+
+class MockQuicDispatcher : public QuicDispatcher {
+ public:
+  MockQuicDispatcher(const QuicConfig& config,
+                     const QuicCryptoServerConfig& crypto_config,
+                     QuicGuid guid,
+                     EpollServer* eps);
+  virtual ~MockQuicDispatcher();
+
+  MOCK_METHOD4(ProcessPacket, void(const IPEndPoint& server_address,
+                                   const IPEndPoint& client_address,
+                                   QuicGuid guid,
+                                   const QuicEncryptedPacket& packet));
+};
+
+}  // namespace test
+}  // namespace tools
+}  // namespace net
+
+#endif  // NET_TOOLS_QUIC_TEST_TOOLS_MOCK_QUIC_DISPATCHER_H_
diff --git a/ppapi/api/dev/ppb_text_input_dev.idl b/ppapi/api/dev/ppb_text_input_dev.idl
index 27704b0..7ea4901 100644
--- a/ppapi/api/dev/ppb_text_input_dev.idl
+++ b/ppapi/api/dev/ppb_text_input_dev.idl
@@ -17,25 +17,25 @@
  * text input.
  */
 [assert_size(4)]
-enum PP_TextInput_Type {
+enum PP_TextInput_Type_Dev {
   /**
    * Input caret is not in an editable mode, no input method shall be used.
    */
-  PP_TEXTINPUT_TYPE_NONE = 0,
+  PP_TEXTINPUT_TYPE_DEV_NONE = 0,
   /**
    * Input caret is in a normal editable mode, any input method can be used.
    */
-  PP_TEXTINPUT_TYPE_TEXT = 1,
+  PP_TEXTINPUT_TYPE_DEV_TEXT = 1,
   /**
    * Input caret is in a password box, an input method may be used only if
    * it's suitable for password input.
    */
-  PP_TEXTINPUT_TYPE_PASSWORD = 2,
-  PP_TEXTINPUT_TYPE_SEARCH = 3,
-  PP_TEXTINPUT_TYPE_EMAIL = 4,
-  PP_TEXTINPUT_TYPE_NUMBER = 5,
-  PP_TEXTINPUT_TYPE_TELEPHONE = 6,
-  PP_TEXTINPUT_TYPE_URL = 7
+  PP_TEXTINPUT_TYPE_DEV_PASSWORD = 2,
+  PP_TEXTINPUT_TYPE_DEV_SEARCH = 3,
+  PP_TEXTINPUT_TYPE_DEV_EMAIL = 4,
+  PP_TEXTINPUT_TYPE_DEV_NUMBER = 5,
+  PP_TEXTINPUT_TYPE_DEV_TELEPHONE = 6,
+  PP_TEXTINPUT_TYPE_DEV_URL = 7
 };
 
 /**
@@ -52,7 +52,7 @@
    * used for composing East Asian characters).
    */
   void SetTextInputType([in] PP_Instance instance,
-                        [in] PP_TextInput_Type type);
+                        [in] PP_TextInput_Type_Dev type);
 
   /**
    * Informs the browser about the coordinates of the text input caret and the
diff --git a/ppapi/api/private/ppb_nacl_private.idl b/ppapi/api/private/ppb_nacl_private.idl
index 1054723..bf2918b 100644
--- a/ppapi/api/private/ppb_nacl_private.idl
+++ b/ppapi/api/private/ppb_nacl_private.idl
@@ -122,13 +122,16 @@
                     [in] PP_CompletionCallback callback);
 
   /* Report to the browser that translation of the pexe for |instance|
-   * has finished. The browser may then store the translation in the
-   * cache. The renderer must first have called GetNexeFd for the same
-   * instance. (It is not guaranteed to, however; if there is an error
-   * or the file is too big for the cache, or the browser is in incognito
-   * mode, no notification will be delivered to the plugin.)
+   * has finished, or aborted with an error. If |success| is true, the
+   * browser may then store the translation in the cache. The renderer
+   * must first have called GetNexeFd for the same instance. (The browser is
+   * not guaranteed to store the nexe even if |success| is true; if there is
+   * an error on the browser side, or the file is too big for the cache, or
+   * the browser is in incognito mode, no notification will be delivered to
+   * the plugin.)
    */
-  void ReportTranslationFinished([in] PP_Instance instance);
+  void ReportTranslationFinished([in] PP_Instance instance,
+                                 [in] PP_Bool success);
 
   /* Return true if we are off the record.
    */
diff --git a/ppapi/c/dev/ppb_text_input_dev.h b/ppapi/c/dev/ppb_text_input_dev.h
index 8b7df44..516f20f 100644
--- a/ppapi/c/dev/ppb_text_input_dev.h
+++ b/ppapi/c/dev/ppb_text_input_dev.h
@@ -3,7 +3,7 @@
  * found in the LICENSE file.
  */
 
-/* From dev/ppb_text_input_dev.idl modified Thu Mar 28 10:54:47 2013. */
+/* From dev/ppb_text_input_dev.idl modified Tue Aug  6 10:37:25 2013. */
 
 #ifndef PPAPI_C_DEV_PPB_TEXT_INPUT_DEV_H_
 #define PPAPI_C_DEV_PPB_TEXT_INPUT_DEV_H_
@@ -37,23 +37,23 @@
   /**
    * Input caret is not in an editable mode, no input method shall be used.
    */
-  PP_TEXTINPUT_TYPE_NONE = 0,
+  PP_TEXTINPUT_TYPE_DEV_NONE = 0,
   /**
    * Input caret is in a normal editable mode, any input method can be used.
    */
-  PP_TEXTINPUT_TYPE_TEXT = 1,
+  PP_TEXTINPUT_TYPE_DEV_TEXT = 1,
   /**
    * Input caret is in a password box, an input method may be used only if
    * it's suitable for password input.
    */
-  PP_TEXTINPUT_TYPE_PASSWORD = 2,
-  PP_TEXTINPUT_TYPE_SEARCH = 3,
-  PP_TEXTINPUT_TYPE_EMAIL = 4,
-  PP_TEXTINPUT_TYPE_NUMBER = 5,
-  PP_TEXTINPUT_TYPE_TELEPHONE = 6,
-  PP_TEXTINPUT_TYPE_URL = 7
-} PP_TextInput_Type;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_TextInput_Type, 4);
+  PP_TEXTINPUT_TYPE_DEV_PASSWORD = 2,
+  PP_TEXTINPUT_TYPE_DEV_SEARCH = 3,
+  PP_TEXTINPUT_TYPE_DEV_EMAIL = 4,
+  PP_TEXTINPUT_TYPE_DEV_NUMBER = 5,
+  PP_TEXTINPUT_TYPE_DEV_TELEPHONE = 6,
+  PP_TEXTINPUT_TYPE_DEV_URL = 7
+} PP_TextInput_Type_Dev;
+PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_TextInput_Type_Dev, 4);
 /**
  * @}
  */
@@ -75,7 +75,7 @@
    * keyboards in touch screen based devices, or input method editors often
    * used for composing East Asian characters).
    */
-  void (*SetTextInputType)(PP_Instance instance, PP_TextInput_Type type);
+  void (*SetTextInputType)(PP_Instance instance, PP_TextInput_Type_Dev type);
   /**
    * Informs the browser about the coordinates of the text input caret and the
    * bounding box of the text input area. Typical use of this information in
@@ -128,7 +128,7 @@
 typedef struct PPB_TextInput_Dev_0_2 PPB_TextInput_Dev;
 
 struct PPB_TextInput_Dev_0_1 {
-  void (*SetTextInputType)(PP_Instance instance, PP_TextInput_Type type);
+  void (*SetTextInputType)(PP_Instance instance, PP_TextInput_Type_Dev type);
   void (*UpdateCaretPosition)(PP_Instance instance,
                               const struct PP_Rect* caret,
                               const struct PP_Rect* bounding_box);
diff --git a/ppapi/c/ppb_text_input_controller.h b/ppapi/c/ppb_text_input_controller.h
index bc7cdb8..43b88ac 100644
--- a/ppapi/c/ppb_text_input_controller.h
+++ b/ppapi/c/ppb_text_input_controller.h
@@ -3,12 +3,11 @@
  * found in the LICENSE file.
  */
 
-/* From ppb_text_input_controller.idl modified Sat Jul 27 00:04:53 2013. */
+/* From ppb_text_input_controller.idl modified Thu Aug  1 09:30:48 2013. */
 
 #ifndef PPAPI_C_PPB_TEXT_INPUT_CONTROLLER_H_
 #define PPAPI_C_PPB_TEXT_INPUT_CONTROLLER_H_
 
-#include "ppapi/c/dev/ppb_text_input_dev.h"
 #include "ppapi/c/pp_bool.h"
 #include "ppapi/c/pp_instance.h"
 #include "ppapi/c/pp_macros.h"
@@ -28,6 +27,39 @@
 
 
 /**
+ * @addtogroup Enums
+ * @{
+ */
+/**
+ * PP_TextInput_Type is used to indicate the status of a plugin in regard to
+ * text input.
+ */
+typedef enum {
+  /**
+   * Input caret is not in an editable mode, no input method shall be used.
+   */
+  PP_TEXTINPUT_TYPE_NONE = 0,
+  /**
+   * Input caret is in a normal editable mode, any input method can be used.
+   */
+  PP_TEXTINPUT_TYPE_TEXT = 1,
+  /**
+   * Input caret is in a password box, an input method may be used only if
+   * it's suitable for password input.
+   */
+  PP_TEXTINPUT_TYPE_PASSWORD = 2,
+  PP_TEXTINPUT_TYPE_SEARCH = 3,
+  PP_TEXTINPUT_TYPE_EMAIL = 4,
+  PP_TEXTINPUT_TYPE_NUMBER = 5,
+  PP_TEXTINPUT_TYPE_TELEPHONE = 6,
+  PP_TEXTINPUT_TYPE_URL = 7
+} PP_TextInput_Type;
+PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_TextInput_Type, 4);
+/**
+ * @}
+ */
+
+/**
  * @addtogroup Interfaces
  * @{
  */
diff --git a/ppapi/c/private/ppb_nacl_private.h b/ppapi/c/private/ppb_nacl_private.h
index d89ed5b..8be2829 100644
--- a/ppapi/c/private/ppb_nacl_private.h
+++ b/ppapi/c/private/ppb_nacl_private.h
@@ -3,7 +3,7 @@
  * found in the LICENSE file.
  */
 
-/* From private/ppb_nacl_private.idl modified Mon Jul 29 16:44:58 2013. */
+/* From private/ppb_nacl_private.idl modified Tue Aug  6 11:51:26 2013. */
 
 #ifndef PPAPI_C_PRIVATE_PPB_NACL_PRIVATE_H_
 #define PPAPI_C_PRIVATE_PPB_NACL_PRIVATE_H_
@@ -141,13 +141,15 @@
                        PP_FileHandle* nexe_handle,
                        struct PP_CompletionCallback callback);
   /* Report to the browser that translation of the pexe for |instance|
-   * has finished. The browser may then store the translation in the
-   * cache. The renderer must first have called GetNexeFd for the same
-   * instance. (It is not guaranteed to, however; if there is an error
-   * or the file is too big for the cache, or the browser is in incognito
-   * mode, no notification will be delivered to the plugin.)
+   * has finished, or aborted with an error. If |success| is true, the
+   * browser may then store the translation in the cache. The renderer
+   * must first have called GetNexeFd for the same instance. (The browser is
+   * not guaranteed to store the nexe even if |success| is true; if there is
+   * an error on the browser side, or the file is too big for the cache, or
+   * the browser is in incognito mode, no notification will be delivered to
+   * the plugin.)
    */
-  void (*ReportTranslationFinished)(PP_Instance instance);
+  void (*ReportTranslationFinished)(PP_Instance instance, PP_Bool success);
   /* Return true if we are off the record.
    */
   PP_Bool (*IsOffTheRecord)(void);
diff --git a/ppapi/cpp/dev/text_input_dev.cc b/ppapi/cpp/dev/text_input_dev.cc
index 657a0b3..b0fff8a 100644
--- a/ppapi/cpp/dev/text_input_dev.cc
+++ b/ppapi/cpp/dev/text_input_dev.cc
@@ -57,7 +57,7 @@
   UpdateSurroundingText(std::string(), 0, 0);
 }
 
-void TextInput_Dev::SetTextInputType(PP_TextInput_Type type) {
+void TextInput_Dev::SetTextInputType(PP_TextInput_Type_Dev type) {
   if (has_interface<PPB_TextInput_Dev_0_2>()) {
     get_interface<PPB_TextInput_Dev_0_2>()->SetTextInputType(
         instance_.pp_instance(), type);
diff --git a/ppapi/cpp/dev/text_input_dev.h b/ppapi/cpp/dev/text_input_dev.h
index ea75597..fca8728 100644
--- a/ppapi/cpp/dev/text_input_dev.h
+++ b/ppapi/cpp/dev/text_input_dev.h
@@ -45,7 +45,7 @@
 
   virtual void RequestSurroundingText(uint32_t desired_number_of_characters);
 
-  void SetTextInputType(PP_TextInput_Type type);
+  void SetTextInputType(PP_TextInput_Type_Dev type);
   void UpdateCaretPosition(const Rect& caret, const Rect& bounding_box);
   void CancelCompositionText();
   void SelectionChanged();
diff --git a/ppapi/native_client/src/trusted/plugin/plugin.cc b/ppapi/native_client/src/trusted/plugin/plugin.cc
index 701fe01..5cbb9d7 100644
--- a/ppapi/native_client/src/trusted/plugin/plugin.cc
+++ b/ppapi/native_client/src/trusted/plugin/plugin.cc
@@ -44,7 +44,6 @@
 #include "ppapi/cpp/dev/find_dev.h"
 #include "ppapi/cpp/dev/printing_dev.h"
 #include "ppapi/cpp/dev/selection_dev.h"
-#include "ppapi/cpp/dev/text_input_dev.h"
 #include "ppapi/cpp/dev/url_util_dev.h"
 #include "ppapi/cpp/dev/zoom_dev.h"
 #include "ppapi/cpp/image_data.h"
@@ -52,6 +51,7 @@
 #include "ppapi/cpp/module.h"
 #include "ppapi/cpp/mouse_lock.h"
 #include "ppapi/cpp/rect.h"
+#include "ppapi/cpp/text_input_controller.h"
 
 #include "ppapi/native_client/src/trusted/plugin/file_utils.h"
 #include "ppapi/native_client/src/trusted/plugin/json_manifest.h"
@@ -318,7 +318,7 @@
   // This makes discrepancy among platforms and therefore we should remove
   // this hack when IME API is made available.
   // The default for non-Mac platforms is still off-the-spot IME mode.
-  pp::TextInput_Dev(this).SetTextInputType(PP_TEXTINPUT_TYPE_NONE);
+  pp::TextInputController(this).SetTextInputType(PP_TEXTINPUT_TYPE_NONE);
 #endif
 
   // Remember the embed/object argn/argv pairs.
diff --git a/ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc b/ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc
index e5649f3..18b4fae 100644
--- a/ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc
+++ b/ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc
@@ -336,13 +336,14 @@
 void PnaclCoordinator::TranslateFinished(int32_t pp_error) {
   PLUGIN_PRINTF(("PnaclCoordinator::TranslateFinished (pp_error=%"
                  NACL_PRId32 ")\n", pp_error));
-  // Bail out if there was an earlier error (e.g., pexe load failure).
-  if (translate_finish_error_ != PP_OK) {
-    ExitWithError();
-    return;
-  }
-  // Bail out if there is an error from the translation thread.
-  if (pp_error != PP_OK) {
+  // Bail out if there was an earlier error (e.g., pexe load failure),
+  // or if there is an error from the translation thread.
+  if (translate_finish_error_ != PP_OK || pp_error != PP_OK) {
+    if (use_new_cache_) {
+      plugin_->nacl_interface()->ReportTranslationFinished(
+          plugin_->pp_instance(),
+          PP_FALSE);
+    }
     ExitWithError();
     return;
   }
@@ -395,7 +396,7 @@
     // Report to the browser that translation finished. The browser will take
     // care of caching.
     plugin_->nacl_interface()->ReportTranslationFinished(
-        plugin_->pp_instance());
+        plugin_->pp_instance(), PP_TRUE);
     NexeReadDidOpen(PP_OK);
     return;
   }
@@ -977,6 +978,11 @@
       ss << "PnaclCoordinator: pexe load failed (pp_error=" << pp_error << ").";
       error_info_.SetReport(ERROR_PNACL_PEXE_FETCH_OTHER, ss.str());
     }
+    if (use_new_cache_) {
+      plugin_->nacl_interface()->ReportTranslationFinished(
+          plugin_->pp_instance(),
+          PP_FALSE);
+    }
     translate_thread_->AbortSubprocesses();
   } else {
     // Compare download completion pct (100% now), to compile completion pct.
@@ -1051,6 +1057,11 @@
     ReportPpapiError(ERROR_PNACL_CREATE_TEMP,
                      pp_error,
                      "Failed to open scratch object file.");
+    if (use_new_cache_) {
+      plugin_->nacl_interface()->ReportTranslationFinished(
+          plugin_->pp_instance(),
+          PP_FALSE);
+    }
     return;
   }
   // Open the nexe file for connecting ld and sel_ldr.
diff --git a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c
index 9eabc69..aa68044 100644
--- a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c
+++ b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c
@@ -1978,8 +1978,6 @@
 
 /* Not generating wrapper methods for PPB_TextInput_Dev_0_2 */
 
-/* Not generating wrapper methods for PPB_TextInput_Dev_None */
-
 /* Not generating wrapper methods for PPB_Trace_Event_Dev_0_1 */
 
 /* Not generating wrapper methods for PPB_Trace_Event_Dev_0_2 */
@@ -2858,9 +2856,9 @@
   return iface->GetNexeFd(instance, pexe_url, abi_version, opt_level, last_modified, etag, is_hit, nexe_handle, *callback);
 }
 
-static void Pnacl_M13_PPB_NaCl_Private_ReportTranslationFinished(PP_Instance instance) {
+static void Pnacl_M13_PPB_NaCl_Private_ReportTranslationFinished(PP_Instance instance, PP_Bool success) {
   const struct PPB_NaCl_Private_1_0 *iface = Pnacl_WrapperInfo_PPB_NaCl_Private_1_0.real_iface;
-  iface->ReportTranslationFinished(instance);
+  iface->ReportTranslationFinished(instance, success);
 }
 
 static PP_Bool Pnacl_M13_PPB_NaCl_Private_IsOffTheRecord(void) {
@@ -4410,8 +4408,6 @@
 
 /* Not generating wrapper interface for PPB_TextInput_Dev_0_2 */
 
-/* Not generating wrapper interface for PPB_TextInput_Dev_None */
-
 /* Not generating wrapper interface for PPB_Trace_Event_Dev_0_1 */
 
 /* Not generating wrapper interface for PPB_Trace_Event_Dev_0_2 */
@@ -4672,7 +4668,7 @@
     .GetReadonlyPnaclFd = (PP_FileHandle (*)(const char* filename))&Pnacl_M13_PPB_NaCl_Private_GetReadonlyPnaclFd,
     .CreateTemporaryFile = (PP_FileHandle (*)(PP_Instance instance))&Pnacl_M13_PPB_NaCl_Private_CreateTemporaryFile,
     .GetNexeFd = (int32_t (*)(PP_Instance instance, const char* pexe_url, uint32_t abi_version, uint32_t opt_level, const char* last_modified, const char* etag, PP_Bool* is_hit, PP_FileHandle* nexe_handle, struct PP_CompletionCallback callback))&Pnacl_M13_PPB_NaCl_Private_GetNexeFd,
-    .ReportTranslationFinished = (void (*)(PP_Instance instance))&Pnacl_M13_PPB_NaCl_Private_ReportTranslationFinished,
+    .ReportTranslationFinished = (void (*)(PP_Instance instance, PP_Bool success))&Pnacl_M13_PPB_NaCl_Private_ReportTranslationFinished,
     .IsOffTheRecord = (PP_Bool (*)(void))&Pnacl_M13_PPB_NaCl_Private_IsOffTheRecord,
     .IsPnaclEnabled = (PP_Bool (*)(void))&Pnacl_M13_PPB_NaCl_Private_IsPnaclEnabled,
     .ReportNaClError = (PP_ExternalPluginResult (*)(PP_Instance instance, PP_NaClError message_id))&Pnacl_M13_PPB_NaCl_Private_ReportNaClError,
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h
index 6f73e25..7ee568f 100644
--- a/ppapi/proxy/ppapi_messages.h
+++ b/ppapi/proxy/ppapi_messages.h
@@ -21,7 +21,6 @@
 #include "ipc/ipc_platform_file.h"
 #include "ppapi/c/dev/pp_video_capture_dev.h"
 #include "ppapi/c/dev/pp_video_dev.h"
-#include "ppapi/c/dev/ppb_text_input_dev.h"
 #include "ppapi/c/dev/ppb_truetype_font_dev.h"
 #include "ppapi/c/dev/ppb_url_util_dev.h"
 #include "ppapi/c/dev/ppp_printing_dev.h"
@@ -37,6 +36,7 @@
 #include "ppapi/c/ppb_audio_config.h"
 #include "ppapi/c/ppb_image_data.h"
 #include "ppapi/c/ppb_tcp_socket.h"
+#include "ppapi/c/ppb_text_input_controller.h"
 #include "ppapi/c/ppb_udp_socket.h"
 #include "ppapi/c/private/pp_content_decryptor.h"
 #include "ppapi/c/private/pp_private_font_charset.h"
diff --git a/ppapi/shared_impl/tracked_callback.h b/ppapi/shared_impl/tracked_callback.h
index 4917990..c4bf5cf 100644
--- a/ppapi/shared_impl/tracked_callback.h
+++ b/ppapi/shared_impl/tracked_callback.h
@@ -98,6 +98,11 @@
   // completion.
   bool aborted() const { return aborted_; }
 
+  // Returns true if this is a blocking callback.
+  bool is_blocking() {
+    return !callback_.func;
+  }
+
   // Determines if the given callback is pending. A callback is pending if it
   // has not completed and has not been aborted. When receiving a plugin call,
   // use this to detect if |callback| represents an operation in progress. When
@@ -113,10 +118,6 @@
   static bool IsScheduledToRun(const scoped_refptr<TrackedCallback>& callback);
 
  protected:
-  bool is_blocking() {
-    return !callback_.func;
-  }
-
   bool is_required() {
     return (callback_.func &&
             !(callback_.flags & PP_COMPLETIONCALLBACK_FLAG_OPTIONAL));
diff --git a/ppapi/thunk/ppb_instance_api.h b/ppapi/thunk/ppb_instance_api.h
index 3fa2edf..c1d024e 100644
--- a/ppapi/thunk/ppb_instance_api.h
+++ b/ppapi/thunk/ppb_instance_api.h
@@ -7,7 +7,6 @@
 
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
-#include "ppapi/c/dev/ppb_text_input_dev.h"
 #include "ppapi/c/dev/ppb_url_util_dev.h"
 #include "ppapi/c/pp_bool.h"
 #include "ppapi/c/pp_completion_callback.h"
@@ -17,6 +16,7 @@
 #include "ppapi/c/ppb_gamepad.h"
 #include "ppapi/c/ppb_instance.h"
 #include "ppapi/c/ppb_mouse_cursor.h"
+#include "ppapi/c/ppb_text_input_controller.h"
 #include "ppapi/c/private/pp_content_decryptor.h"
 #include "ppapi/c/private/ppb_instance_private.h"
 #include "ppapi/shared_impl/api_id.h"
diff --git a/ppapi/thunk/ppb_text_input_thunk.cc b/ppapi/thunk/ppb_text_input_thunk.cc
index 55fb4c9..a59146b 100644
--- a/ppapi/thunk/ppb_text_input_thunk.cc
+++ b/ppapi/thunk/ppb_text_input_thunk.cc
@@ -2,8 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/basictypes.h"
+#include "ppapi/c/dev/ppb_text_input_dev.h"
 #include "ppapi/c/ppb_text_input_controller.h"
-
 #include "ppapi/shared_impl/var.h"
 #include "ppapi/thunk/enter.h"
 #include "ppapi/thunk/ppb_instance_api.h"
@@ -14,12 +15,40 @@
 
 namespace {
 
+COMPILE_ASSERT(int(PP_TEXTINPUT_TYPE_DEV_NONE) == int(PP_TEXTINPUT_TYPE_NONE),
+               mismatching_enums);
+COMPILE_ASSERT(int(PP_TEXTINPUT_TYPE_DEV_TEXT) == int(PP_TEXTINPUT_TYPE_TEXT),
+               mismatching_enums);
+COMPILE_ASSERT(
+    int(PP_TEXTINPUT_TYPE_DEV_PASSWORD) == int(PP_TEXTINPUT_TYPE_PASSWORD),
+    mismatching_enums);
+COMPILE_ASSERT(
+    int(PP_TEXTINPUT_TYPE_DEV_SEARCH) == int(PP_TEXTINPUT_TYPE_SEARCH),
+    mismatching_enums);
+COMPILE_ASSERT(int(PP_TEXTINPUT_TYPE_DEV_EMAIL) == int(PP_TEXTINPUT_TYPE_EMAIL),
+               mismatching_enums);
+COMPILE_ASSERT(
+    int(PP_TEXTINPUT_TYPE_DEV_NUMBER) == int(PP_TEXTINPUT_TYPE_NUMBER),
+    mismatching_enums);
+COMPILE_ASSERT(
+    int(PP_TEXTINPUT_TYPE_DEV_TELEPHONE) == int(PP_TEXTINPUT_TYPE_TELEPHONE),
+    mismatching_enums);
+COMPILE_ASSERT(int(PP_TEXTINPUT_TYPE_DEV_URL) == int(PP_TEXTINPUT_TYPE_URL),
+               mismatching_enums);
+
 void SetTextInputType(PP_Instance instance, PP_TextInput_Type type) {
   EnterInstance enter(instance);
   if (enter.succeeded())
     enter.functions()->SetTextInputType(instance, type);
 }
 
+void SetTextInputType_0_2(PP_Instance instance, PP_TextInput_Type_Dev type) {
+  EnterInstance enter(instance);
+  if (enter.succeeded())
+    enter.functions()->SetTextInputType(instance,
+                                        static_cast<PP_TextInput_Type>(type));
+}
+
 void UpdateCaretPosition_0_2(PP_Instance instance,
                          const PP_Rect* caret,
                          const PP_Rect* bounding_box) {
@@ -66,13 +95,13 @@
 }
 
 const PPB_TextInput_Dev_0_1 g_ppb_textinput_0_1_thunk = {
-  &SetTextInputType,
+  &SetTextInputType_0_2,
   &UpdateCaretPosition_0_2,
   &CancelCompositionText,
 };
 
 const PPB_TextInput_Dev_0_2 g_ppb_textinput_0_2_thunk = {
-  &SetTextInputType,
+  &SetTextInputType_0_2,
   &UpdateCaretPosition_0_2,
   &CancelCompositionText,
   &UpdateSurroundingText_0_2,
diff --git a/remoting/android/java/AndroidManifest.xml b/remoting/android/java/AndroidManifest.xml
index 51889e8..ff27b57 100644
--- a/remoting/android/java/AndroidManifest.xml
+++ b/remoting/android/java/AndroidManifest.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="org.chromium.chromoting"
-        android:versionCode="8"
-        android:versionName="0.08">
+        android:versionCode="9"
+        android:versionName="0.09">
     <uses-sdk android:minSdkVersion="14"
             android:targetSdkVersion="14"/>
     <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
diff --git a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
index 60c6b95..cfcbf49 100644
--- a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
+++ b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
@@ -201,7 +201,7 @@
                     mAccount = new Account(accountName, accountType);
                     mToken = authToken;
                     getPreferences(MODE_PRIVATE).edit().putString("account_name", accountName).
-                            putString("account_type", accountType).commit();
+                            putString("account_type", accountType).apply();
                 }
 
                 // Send our HTTP request to the directory server.
diff --git a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
index 4806252..1e18f91 100644
--- a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
+++ b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
@@ -266,7 +266,9 @@
     }
 
     /** Called when a mouse action is made. */
-    private void handleMouseMovement(float[] coordinates, int button, boolean pressed) {
+    private void handleMouseMovement(float x, float y, int button, boolean pressed) {
+        float[] coordinates = {x, y};
+
         // Coordinates are relative to the canvas, but we need image coordinates.
         Matrix canvasToImage = new Matrix();
         mTransform.invert(canvasToImage);
@@ -289,7 +291,8 @@
         boolean handled = mScroller.onTouchEvent(event) || mZoomer.onTouchEvent(event);
 
         if (event.getPointerCount() == 1) {
-            float[] coordinates = {event.getRawX(), event.getY()};
+            float x = event.getRawX();
+            float y = event.getY();
 
             switch (event.getActionMasked()) {
                 case MotionEvent.ACTION_DOWN:
@@ -312,8 +315,7 @@
                     if (mMouseButton == BUTTON_UNDEFINED) {
                         // The user pressed and released without moving: do left click and release.
                         Log.i("mouse", "\tStarting and finishing left click");
-                        handleMouseMovement(new float[] {coordinates[0], coordinates[1]},
-                                BUTTON_LEFT, true);
+                        handleMouseMovement(x, y, BUTTON_LEFT, true);
                         mMouseButton = BUTTON_LEFT;
                         mMousePressed = false;
                     }
@@ -329,7 +331,7 @@
                 default:
                     return handled;
             }
-            handleMouseMovement(coordinates, mMouseButton, mMousePressed);
+            handleMouseMovement(x, y, mMouseButton, mMousePressed);
 
             return true;
         }
@@ -404,18 +406,19 @@
                 return;
             }
 
-            float[] coordinates = new float[] {e.getRawX(), e.getY()};
+            float x = e.getRawX();
+            float y = e.getY();
 
             Log.i("mouse", "Finger held down");
             if (mMousePressed) {
                 Log.i("mouse", "\tReleasing the currently-pressed button");
-                handleMouseMovement(coordinates, mMouseButton, false);
+                handleMouseMovement(x, y, mMouseButton, false);
             }
 
             Log.i("mouse", "\tStarting right click");
             mMouseButton = BUTTON_RIGHT;
             mMousePressed = true;
-            handleMouseMovement(coordinates, mMouseButton, mMousePressed);
+            handleMouseMovement(x, y, mMouseButton, mMousePressed);
         }
     }
 }
diff --git a/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java b/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
index f791d1e..039bcb9 100644
--- a/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
+++ b/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
@@ -9,13 +9,15 @@
 import android.app.ProgressDialog;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.SharedPreferences;
 import android.graphics.Bitmap;
 import android.os.Looper;
 import android.text.InputType;
 import android.util.Log;
 import android.view.KeyEvent;
+import android.view.View;
 import android.view.inputmethod.EditorInfo;
-import android.widget.EditText;
+import android.widget.CheckBox;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -92,7 +94,9 @@
         }
 
         sSuccessCallback = successCallback;
-        connectNative(username, authToken, hostJid, hostId, hostPubkey);
+        SharedPreferences prefs = sContext.getPreferences(Activity.MODE_PRIVATE);
+        connectNative(username, authToken, hostJid, hostId, hostPubkey,
+                prefs.getString(hostId + "_id", ""), prefs.getString(hostId + "_secret", ""));
         sConnected = true;
     }
 
@@ -113,8 +117,8 @@
     }
 
     /** Performs the native portion of the connection. */
-    private static native void connectNative(
-            String username, String authToken, String hostJid, String hostId, String hostPubkey);
+    private static native void connectNative(String username, String authToken, String hostJid,
+            String hostId, String hostPubkey, String pairId, String pairSecret);
 
     /** Performs the native portion of the cleanup. */
     private static native void disconnectNative();
@@ -188,10 +192,7 @@
         pinPrompt.setMessage(sContext.getString(R.string.pin_entry_message));
         pinPrompt.setIcon(android.R.drawable.ic_lock_lock);
 
-        final EditText pinEntry = new EditText(sContext);
-        pinEntry.setInputType(
-                InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
-        pinEntry.setImeOptions(EditorInfo.IME_ACTION_DONE);
+        final View pinEntry = sContext.getLayoutInflater().inflate(R.layout.pin_dialog, null);
         pinPrompt.setView(pinEntry);
 
         pinPrompt.setPositiveButton(
@@ -199,7 +200,11 @@
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         Log.i("jniiface", "User provided a PIN code");
-                        authenticationResponse(String.valueOf(pinEntry.getText()));
+                        authenticationResponse(String.valueOf(
+                                ((TextView)
+                                        pinEntry.findViewById(R.id.pin_dialog_text)).getText()),
+                                ((CheckBox)
+                                        pinEntry.findViewById(R.id.pin_dialog_check)).isChecked());
                     }
                 });
 
@@ -217,7 +222,7 @@
 
         final AlertDialog pinDialog = pinPrompt.create();
 
-        pinEntry.setOnEditorActionListener(
+        ((TextView)pinEntry.findViewById(R.id.pin_dialog_text)).setOnEditorActionListener(
                 new TextView.OnEditorActionListener() {
                     @Override
                     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
@@ -240,6 +245,16 @@
         pinDialog.show();
     }
 
+    /** Saves newly-received pairing credentials to permanent storage. */
+    private static void commitPairingCredentials(String host, byte[] id, byte[] secret) {
+        synchronized (sContext) {
+            sContext.getPreferences(Activity.MODE_PRIVATE).edit().
+                    putString(host + "_id", new String(id)).
+                    putString(host + "_secret", new String(secret)).
+                    apply();
+        }
+    }
+
     /**
      * Sets the redraw callback to the provided functor. Provide a value of null whenever the
      * window is no longer visible so that we don't continue to draw onto it.
@@ -304,7 +319,7 @@
     }
 
     /** Performs the native response to the user's PIN. */
-    private static native void authenticationResponse(String pin);
+    private static native void authenticationResponse(String pin, boolean createPair);
 
     /** Schedules a redraw on the native graphics thread. */
     private static native void scheduleRedrawNative();
diff --git a/remoting/base/resources_unittest.cc b/remoting/base/resources_unittest.cc
index d2b2d23..d1bc851 100644
--- a/remoting/base/resources_unittest.cc
+++ b/remoting/base/resources_unittest.cc
@@ -26,14 +26,9 @@
   bool resources_available_;
 };
 
-// TODO(alexeypa): Reenable the test once http://crbug.com/269143 is fixed.
-#if !defined(OS_CHROMEOS)
-#define MAYBE_ProductName ProductName
-#else
-#define MAYBE_ProductName DISABLED_ProductName
-#endif
-
-TEST_F(ResourcesTest, MAYBE_ProductName) {
+// TODO(alexeypa): Reenable the test once http://crbug.com/269143 (ChromeOS) and
+// http://crbug.com/268043 (MacOS) are fixed.
+TEST_F(ResourcesTest, DISABLED_ProductName) {
 #if defined(GOOGLE_CHROME_BUILD)
   std::string expected_product_name = "Chrome Remote Desktop";
 #else  // defined(GOOGLE_CHROME_BUILD)
diff --git a/remoting/client/jni/chromoting_jni_instance.cc b/remoting/client/jni/chromoting_jni_instance.cc
index b2790b8..3e11b2f 100644
--- a/remoting/client/jni/chromoting_jni_instance.cc
+++ b/remoting/client/jni/chromoting_jni_instance.cc
@@ -9,6 +9,7 @@
 #include "remoting/client/audio_player.h"
 #include "remoting/client/jni/android_keymap.h"
 #include "remoting/client/jni/chromoting_jni_runtime.h"
+#include "remoting/protocol/host_stub.h"
 #include "remoting/protocol/libjingle_transport_factory.h"
 
 // TODO(solb) Move into location shared with client plugin.
@@ -23,13 +24,18 @@
                                              const char* auth_token,
                                              const char* host_jid,
                                              const char* host_id,
-                                             const char* host_pubkey)
+                                             const char* host_pubkey,
+                                             const char* pairing_id,
+                                             const char* pairing_secret)
     : jni_runtime_(jni_runtime),
       username_(username),
       auth_token_(auth_token),
       host_jid_(host_jid),
       host_id_(host_id),
-      host_pubkey_(host_pubkey) {
+      host_pubkey_(host_pubkey),
+      pairing_id_(pairing_id),
+      pairing_secret_(pairing_secret),
+      create_pairing_(false) {
   DCHECK(jni_runtime_->ui_task_runner()->BelongsToCurrentThread());
 
   jni_runtime_->display_task_runner()->PostTask(
@@ -60,10 +66,13 @@
                  this));
 }
 
-void ChromotingJniInstance::ProvideSecret(const std::string& pin) {
+void ChromotingJniInstance::ProvideSecret(const std::string& pin,
+                                          bool create_pairing) {
   DCHECK(jni_runtime_->ui_task_runner()->BelongsToCurrentThread());
   DCHECK(!pin_callback_.is_null());
 
+  create_pairing_ = create_pairing;
+
   jni_runtime_->network_task_runner()->PostTask(FROM_HERE,
                                                 base::Bind(pin_callback_, pin));
 }
@@ -132,28 +141,40 @@
 void ChromotingJniInstance::OnConnectionState(
     protocol::ConnectionToHost::State state,
     protocol::ErrorCode error) {
-  if (!jni_runtime_->ui_task_runner()->BelongsToCurrentThread()) {
-    jni_runtime_->ui_task_runner()->PostTask(
-            FROM_HERE,
-            base::Bind(&ChromotingJniInstance::OnConnectionState,
-                       this,
-                       state,
-                       error));
-    return;
+  DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread());
+
+  if (create_pairing_ && state == protocol::ConnectionToHost::CONNECTED) {
+    LOG(INFO) << "Attempting to pair with host";
+    protocol::PairingRequest request;
+    request.set_client_name("Android");
+    connection_->host_stub()->RequestPairing(request);
   }
 
-  jni_runtime_->ReportConnectionStatus(state, error);
+  jni_runtime_->ui_task_runner()->PostTask(
+      FROM_HERE,
+      base::Bind(&ChromotingJniRuntime::ReportConnectionStatus,
+                 base::Unretained(jni_runtime_),
+                 state,
+                 error));
 }
 
 void ChromotingJniInstance::OnConnectionReady(bool ready) {
-  // We ignore this message, since OnConnectionState() tells us the same thing.
+  // We ignore this message, since OnConnectoinState tells us the same thing.
 }
 
 void ChromotingJniInstance::SetCapabilities(const std::string& capabilities) {}
 
 void ChromotingJniInstance::SetPairingResponse(
     const protocol::PairingResponse& response) {
-  NOTIMPLEMENTED();
+  LOG(INFO) << "Successfully established pairing with host";
+
+  jni_runtime_->ui_task_runner()->PostTask(
+      FROM_HERE,
+      base::Bind(&ChromotingJniRuntime::CommitPairingCredentials,
+                 base::Unretained(jni_runtime_),
+                 host_id_,
+                 response.client_id(),
+                 response.shared_secret()));
 }
 
 protocol::ClipboardStub* ChromotingJniInstance::GetClipboardStub() {
@@ -207,6 +228,13 @@
       this);
   client_config_->authentication_tag = host_id_;
 
+  if (!pairing_id_.empty() && !pairing_secret_.empty()) {
+    client_config_->client_pairing_id = pairing_id_;
+    client_config_->client_paired_secret = pairing_secret_;
+    client_config_->authentication_methods.push_back(
+        protocol::AuthenticationMethod::FromString("spake2_pair"));
+  }
+
   client_config_->authentication_methods.push_back(
       protocol::AuthenticationMethod::FromString("spake2_hmac"));
   client_config_->authentication_methods.push_back(
@@ -275,6 +303,13 @@
     return;
   }
 
+  if (!pairing_id_.empty() || !pairing_secret_.empty()) {
+    // We attempted to connect using an existing pairing that was rejected.
+    // Unless we forget about the stale credentials, we'll continue trying them.
+    LOG(INFO) << "Deleting rejected pairing credentials";
+    jni_runtime_->CommitPairingCredentials(host_id_, "", "");
+  }
+
   pin_callback_ = callback;
   jni_runtime_->DisplayAuthenticationPrompt();
 }
diff --git a/remoting/client/jni/chromoting_jni_instance.h b/remoting/client/jni/chromoting_jni_instance.h
index d6c7dbc..a8684bf 100644
--- a/remoting/client/jni/chromoting_jni_instance.h
+++ b/remoting/client/jni/chromoting_jni_instance.h
@@ -37,13 +37,16 @@
     public base::RefCountedThreadSafe<ChromotingJniInstance> {
  public:
   // Initiates a connection with the specified host. Call from the UI thread.
-  // The instance does not take ownership of |jni_runtime|.
+  // The instance does not take ownership of |jni_runtime|. To connect with an
+  // unpaired host, pass in |pairing_id| and |pairing_secret| as empty strings.
   ChromotingJniInstance(ChromotingJniRuntime* jni_runtime,
                         const char* username,
                         const char* auth_token,
                         const char* host_jid,
                         const char* host_id,
-                        const char* host_pubkey);
+                        const char* host_pubkey,
+                        const char* pairing_id,
+                        const char* pairing_secret);
 
   // Terminates the current connection (if it hasn't already failed) and cleans
   // up. Must be called before destruction.
@@ -52,7 +55,7 @@
   // Provides the user's PIN and resumes the host authentication attempt. Call
   // on the UI thread once the user has finished entering this PIN into the UI,
   // but only after the UI has been asked to provide a PIN (via FetchSecret()).
-  void ProvideSecret(const std::string& pin);
+  void ProvideSecret(const std::string& pin, bool create_pair);
 
   // Schedules a redraw on the display thread. May be called from any thread.
   void RedrawDesktop();
@@ -131,6 +134,14 @@
   std::string host_jid_;
   std::string host_id_;
   std::string host_pubkey_;
+  std::string pairing_id_;
+  std::string pairing_secret_;
+
+  // Indicates whether to establish a new pairing with this host. This is
+  // modified in ProvideSecret(), but thereafter to be used only from the
+  // network thread. (This is safe because ProvideSecret() is invoked at most
+  // once per run, and always before any reference to this flag.)
+  bool create_pairing_;
 
   friend class base::RefCountedThreadSafe<ChromotingJniInstance>;
 
diff --git a/remoting/client/jni/chromoting_jni_runtime.cc b/remoting/client/jni/chromoting_jni_runtime.cc
index 4913594..8fa9018 100644
--- a/remoting/client/jni/chromoting_jni_runtime.cc
+++ b/remoting/client/jni/chromoting_jni_runtime.cc
@@ -76,7 +76,9 @@
                                   const char* auth_token,
                                   const char* host_jid,
                                   const char* host_id,
-                                  const char* host_pubkey) {
+                                  const char* host_pubkey,
+                                  const char* pairing_id,
+                                  const char* pairing_secret) {
   DCHECK(ui_task_runner_->BelongsToCurrentThread());
   DCHECK(!session_);
   session_ = new ChromotingJniInstance(this,
@@ -84,7 +86,9 @@
                                        auth_token,
                                        host_jid,
                                        host_id,
-                                       host_pubkey);
+                                       host_pubkey,
+                                       pairing_id,
+                                       pairing_secret);
 }
 
 void ChromotingJniRuntime::DisconnectFromHost() {
@@ -117,6 +121,34 @@
       env->GetStaticMethodID(class_, "displayAuthenticationPrompt", "()V"));
 }
 
+void ChromotingJniRuntime::CommitPairingCredentials(const std::string& host,
+                                                    const std::string& id,
+                                                    const std::string& secret) {
+  DCHECK(ui_task_runner_->BelongsToCurrentThread());
+
+  JNIEnv* env = base::android::AttachCurrentThread();
+  jstring host_jstr = env->NewStringUTF(host.c_str());
+  jbyteArray id_arr = env->NewByteArray(id.size());
+  env->SetByteArrayRegion(id_arr, 0, id.size(),
+      reinterpret_cast<const jbyte*>(id.c_str()));
+  jbyteArray secret_arr = env->NewByteArray(secret.size());
+  env->SetByteArrayRegion(secret_arr, 0, secret.size(),
+      reinterpret_cast<const jbyte*>(secret.c_str()));
+
+  env->CallStaticVoidMethod(
+      class_,
+      env->GetStaticMethodID(
+          class_,
+          "commitPairingCredentials",
+          "(Ljava/lang/String;[B[B)V"),
+      host_jstr,
+      id_arr,
+      secret_arr);
+
+  // Because we passed them as arguments, their corresponding Java objects were
+  // GCd as soon as the managed method returned, so we mustn't release it here.
+}
+
 void ChromotingJniRuntime::UpdateImageBuffer(int width,
                                              int height,
                                              jobject buffer) {
diff --git a/remoting/client/jni/chromoting_jni_runtime.h b/remoting/client/jni/chromoting_jni_runtime.h
index ec85d7c..1a6952b 100644
--- a/remoting/client/jni/chromoting_jni_runtime.h
+++ b/remoting/client/jni/chromoting_jni_runtime.h
@@ -45,12 +45,15 @@
 
   // Initiates a connection with the specified host. Only call when a host
   // connection is active (i.e. between a call to Connect() and the
-  // corresponding call to Disconnect()).
+  // corresponding call to Disconnect()). To skip the attempt at pair-based
+  // authentication, leave |pairing_id| and |pairing_secret| as empty strings.
   void ConnectToHost(const char* username,
                      const char* auth_token,
                      const char* host_jid,
                      const char* host_id,
-                     const char* host_pubkey);
+                     const char* host_pubkey,
+                     const char* pairing_id,
+                     const char* pairing_secret);
 
   // Terminates any ongoing connection attempt and cleans up by nullifying
   // |session_|. This is a no-op unless |session| is currently non-null.
@@ -63,13 +66,18 @@
     return session_;
   }
 
-  // Notifies the user that the connection status has changed.
+  // Notifies the user of the current connection status. Call on UI thread.
   void ReportConnectionStatus(protocol::ConnectionToHost::State state,
                               protocol::ErrorCode error);
 
-  // Pops up a dialog box asking the user to enter a PIN.
+  // Pops up a dialog box asking the user to enter a PIN. Call on UI thread.
   void DisplayAuthenticationPrompt();
 
+  // Saves new pairing credentials to permanent storage. Call on UI thread.
+  void CommitPairingCredentials(const std::string& host,
+                                const std::string& id,
+                                const std::string& secret);
+
   // Updates image dimensions and canvas memory space. Call on display thread.
   void UpdateImageBuffer(int width, int height, jobject buffer);
 
diff --git a/remoting/client/jni/jni_interface.cc b/remoting/client/jni/jni_interface.cc
index 088ac82..5180558 100644
--- a/remoting/client/jni/jni_interface.cc
+++ b/remoting/client/jni/jni_interface.cc
@@ -69,25 +69,33 @@
     jstring auth_token_jstr,
     jstring host_jid_jstr,
     jstring host_id_jstr,
-    jstring host_pubkey_jstr) {
+    jstring host_pubkey_jstr,
+    jstring pair_id_jstr,
+    jstring pair_secret_jstr) {
   const char* username_cstr = env->GetStringUTFChars(username_jstr, NULL);
   const char* auth_token_cstr = env->GetStringUTFChars(auth_token_jstr, NULL);
   const char* host_jid_cstr = env->GetStringUTFChars(host_jid_jstr, NULL);
   const char* host_id_cstr = env->GetStringUTFChars(host_id_jstr, NULL);
   const char* host_pubkey_cstr = env->GetStringUTFChars(host_pubkey_jstr, NULL);
+  const char* pair_id_cstr = env->GetStringUTFChars(pair_id_jstr, NULL);
+  const char* pair_secret_cstr = env->GetStringUTFChars(pair_secret_jstr, NULL);
 
   remoting::ChromotingJniRuntime::GetInstance()->ConnectToHost(
       username_cstr,
       auth_token_cstr,
       host_jid_cstr,
       host_id_cstr,
-      host_pubkey_cstr);
+      host_pubkey_cstr,
+      pair_id_cstr,
+      pair_secret_cstr);
 
   env->ReleaseStringUTFChars(username_jstr, username_cstr);
   env->ReleaseStringUTFChars(auth_token_jstr, auth_token_cstr);
   env->ReleaseStringUTFChars(host_jid_jstr, host_jid_cstr);
   env->ReleaseStringUTFChars(host_id_jstr, host_id_cstr);
   env->ReleaseStringUTFChars(host_pubkey_jstr, host_pubkey_cstr);
+  env->ReleaseStringUTFChars(pair_id_jstr, pair_id_cstr);
+  env->ReleaseStringUTFChars(pair_secret_jstr, pair_secret_cstr);
 }
 
 JNIEXPORT void JNICALL JNI_IMPLEMENTATION(disconnectNative)(JNIEnv* env,
@@ -98,11 +106,12 @@
 JNIEXPORT void JNICALL JNI_IMPLEMENTATION(authenticationResponse)(
     JNIEnv* env,
     jobject that,
-    jstring pin_jstr) {
+    jstring pin_jstr,
+    jboolean create_pair) {
   const char* pin_cstr = env->GetStringUTFChars(pin_jstr, NULL);
 
   remoting::ChromotingJniRuntime::GetInstance()->
-      session()->ProvideSecret(pin_cstr);
+      session()->ProvideSecret(pin_cstr, create_pair);
 
   env->ReleaseStringUTFChars(pin_jstr, pin_cstr);
 }
diff --git a/remoting/host/installer/linux/debian/control b/remoting/host/installer/linux/debian/control
index a3fb4f5..1b2ba92 100644
--- a/remoting/host/installer/linux/debian/control
+++ b/remoting/host/installer/linux/debian/control
@@ -12,7 +12,7 @@
 
 Package: chrome-remote-desktop
 Architecture: any
-Depends: xvfb-randr | xvfb, python (>= 2.6), python-psutil, ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}
+Depends: xvfb-randr | xvfb, gksu, python (>= 2.6), python-psutil, ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}
 Recommends: xvfb-randr
 Suggests: google-chrome-stable | google-chrome-beta | google-chrome-unstable
 Description: Access your computer securely over the Internet.
diff --git a/remoting/remoting.gyp b/remoting/remoting.gyp
index 5675799..48bcf44 100644
--- a/remoting/remoting.gyp
+++ b/remoting/remoting.gyp
@@ -1844,6 +1844,7 @@
               'files': [
                 'resources/layout/main.xml',
                 'resources/layout/host.xml',
+                'resources/layout/pin_dialog.xml',
               ],
             },
             {
@@ -2825,20 +2826,6 @@
             ],
           },
         }],
-        ['OS=="mac"', {
-          'mac_bundle': 1,
-          'xcode_settings': {
-            'INFOPLIST_FILE': 'unittests-Info.plist',
-            'INFOPLIST_PREPROCESS': 'YES',
-          },
-          'mac_bundle_resources': [
-            'unittests-Info.plist',
-            '<!@pymod_do_main(remoting_copy_locales -o -p <(OS) -x <(PRODUCT_DIR) <(remoting_locales))',
-          ],
-          'mac_bundle_resources!': [
-            'unittests-Info.plist',
-          ],
-        }],  # OS=="mac"
         ['OS=="mac" or (OS=="linux" and chromeos==0)', {
           # Javascript unittests are disabled on CrOS because they cause
           # valgrind and test errors.
diff --git a/remoting/resources/layout/pin_dialog.xml b/remoting/resources/layout/pin_dialog.xml
new file mode 100644
index 0000000..b8bd552
--- /dev/null
+++ b/remoting/resources/layout/pin_dialog.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_height="wrap_content"
+        android:layout_width="fill_parent">
+    <EditText android:id="@+id/pin_dialog_text"
+            android:inputType="numberPassword"
+            android:imeOptions="actionDone"
+            android:layout_height="wrap_content"
+            android:layout_width="fill_parent"/>
+    <CheckBox android:id="@+id/pin_dialog_check"
+            android:text="@string/pin_entry_pair"
+            android:layout_height="wrap_content"
+            android:layout_width="fill_parent"/>
+</LinearLayout>
diff --git a/remoting/resources/strings.xml b/remoting/resources/strings.xml
index 84a57a8..949a2aa 100644
--- a/remoting/resources/strings.xml
+++ b/remoting/resources/strings.xml
@@ -13,6 +13,7 @@
     <string name="progress_title">Starting remote desktop session</string>
     <string name="pin_entry_title">Authenticate to host</string>
     <string name="pin_entry_message">Enter the host\'s PIN</string>
+    <string name="pin_entry_pair">Don\'t ask in the future</string>
     <string name="pin_entry_connect">Connect</string>
     <string name="pin_entry_cancel">Cancel</string>
 
diff --git a/remoting/unittests-Info.plist b/remoting/unittests-Info.plist
deleted file mode 100644
index fcb8ee6..0000000
--- a/remoting/unittests-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleExecutable</key>
-	<string>${EXECUTABLE_NAME}</string>
-	<key>CFBundleIdentifier</key>
-	<string>org.chromium.chromoting.remoting_unittests</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundlePackageType</key>
-	<string>BRPL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.0.0.0</string>
-	<key>CFBundleVersion</key>
-	<string>1.0.0.0</string>
-	<key>CFBundleSignature</key>
-	<string>${CHROMIUM_CREATOR}</string>
-	<key>LSMinimumSystemVersion</key>
-	<string>10.5.0</string>
-</dict>
-</plist>
diff --git a/skia/ext/convolver_unittest.cc b/skia/ext/convolver_unittest.cc
index f99bf78..8d0c852 100644
--- a/skia/ext/convolver_unittest.cc
+++ b/skia/ext/convolver_unittest.cc
@@ -212,7 +212,13 @@
   ASSERT_EQ(0, filter_length);
 }
 
-TEST(Convolver, SIMDVerification) {
+#if defined(THREAD_SANITIZER)
+// Times out under ThreadSanitizer, http://crbug.com/134400.
+#define MAYBE_SIMDVerification DISABLED_SIMDVerification
+#else
+#define MAYBE_SIMDVerification SIMDVerification
+#endif
+TEST(Convolver, MAYBE_SIMDVerification) {
   int source_sizes[][2] = {
     {1,1}, {1,2}, {1,3}, {1,4}, {1,5},
     {2,1}, {2,2}, {2,3}, {2,4}, {2,5},
diff --git a/skia/skia_library.gypi b/skia/skia_library.gypi
index e91bfcb..2dca283 100644
--- a/skia/skia_library.gypi
+++ b/skia/skia_library.gypi
@@ -127,6 +127,8 @@
     '../third_party/skia/src/ports/SkTLS_pthread.cpp',
     '../third_party/skia/src/ports/SkTLS_win.cpp',
 
+    '../third_party/skia/src/sfnt/SkOTTable_name.cpp',
+    '../third_party/skia/src/sfnt/SkOTTable_name.h',
     '../third_party/skia/src/sfnt/SkOTUtils.cpp',
     '../third_party/skia/src/sfnt/SkOTUtils.h',
 
diff --git a/skia/skia_library.target.darwin-arm.mk b/skia/skia_library.target.darwin-arm.mk
index 52cf5d4..7d2cb16 100644
--- a/skia/skia_library.target.darwin-arm.mk
+++ b/skia/skia_library.target.darwin-arm.mk
@@ -39,6 +39,7 @@
 	third_party/skia/src/ports/SkThread_pthread.cpp \
 	third_party/skia/src/ports/SkTime_Unix.cpp \
 	third_party/skia/src/ports/SkTLS_pthread.cpp \
+	third_party/skia/src/sfnt/SkOTTable_name.cpp \
 	third_party/skia/src/sfnt/SkOTUtils.cpp \
 	third_party/skia/src/utils/debugger/SkDebugCanvas.cpp \
 	third_party/skia/src/utils/debugger/SkDrawCommand.cpp \
@@ -240,6 +241,7 @@
 	third_party/skia/src/effects/SkColorFilterImageFilter.cpp \
 	third_party/skia/src/effects/SkColorMatrix.cpp \
 	third_party/skia/src/effects/SkColorMatrixFilter.cpp \
+	third_party/skia/src/effects/SkComposeImageFilter.cpp \
 	third_party/skia/src/effects/SkCornerPathEffect.cpp \
 	third_party/skia/src/effects/SkDashPathEffect.cpp \
 	third_party/skia/src/effects/SkDiscretePathEffect.cpp \
diff --git a/skia/skia_library.target.darwin-mips.mk b/skia/skia_library.target.darwin-mips.mk
index 115fb00..34fe628 100644
--- a/skia/skia_library.target.darwin-mips.mk
+++ b/skia/skia_library.target.darwin-mips.mk
@@ -39,6 +39,7 @@
 	third_party/skia/src/ports/SkThread_pthread.cpp \
 	third_party/skia/src/ports/SkTime_Unix.cpp \
 	third_party/skia/src/ports/SkTLS_pthread.cpp \
+	third_party/skia/src/sfnt/SkOTTable_name.cpp \
 	third_party/skia/src/sfnt/SkOTUtils.cpp \
 	third_party/skia/src/utils/debugger/SkDebugCanvas.cpp \
 	third_party/skia/src/utils/debugger/SkDrawCommand.cpp \
@@ -240,6 +241,7 @@
 	third_party/skia/src/effects/SkColorFilterImageFilter.cpp \
 	third_party/skia/src/effects/SkColorMatrix.cpp \
 	third_party/skia/src/effects/SkColorMatrixFilter.cpp \
+	third_party/skia/src/effects/SkComposeImageFilter.cpp \
 	third_party/skia/src/effects/SkCornerPathEffect.cpp \
 	third_party/skia/src/effects/SkDashPathEffect.cpp \
 	third_party/skia/src/effects/SkDiscretePathEffect.cpp \
diff --git a/skia/skia_library.target.darwin-x86.mk b/skia/skia_library.target.darwin-x86.mk
index bf9b65e..69b4e75 100644
--- a/skia/skia_library.target.darwin-x86.mk
+++ b/skia/skia_library.target.darwin-x86.mk
@@ -40,6 +40,7 @@
 	third_party/skia/src/ports/SkThread_pthread.cpp \
 	third_party/skia/src/ports/SkTime_Unix.cpp \
 	third_party/skia/src/ports/SkTLS_pthread.cpp \
+	third_party/skia/src/sfnt/SkOTTable_name.cpp \
 	third_party/skia/src/sfnt/SkOTUtils.cpp \
 	third_party/skia/src/utils/debugger/SkDebugCanvas.cpp \
 	third_party/skia/src/utils/debugger/SkDrawCommand.cpp \
@@ -241,6 +242,7 @@
 	third_party/skia/src/effects/SkColorFilterImageFilter.cpp \
 	third_party/skia/src/effects/SkColorMatrix.cpp \
 	third_party/skia/src/effects/SkColorMatrixFilter.cpp \
+	third_party/skia/src/effects/SkComposeImageFilter.cpp \
 	third_party/skia/src/effects/SkCornerPathEffect.cpp \
 	third_party/skia/src/effects/SkDashPathEffect.cpp \
 	third_party/skia/src/effects/SkDiscretePathEffect.cpp \
diff --git a/skia/skia_library.target.linux-arm.mk b/skia/skia_library.target.linux-arm.mk
index 52cf5d4..7d2cb16 100644
--- a/skia/skia_library.target.linux-arm.mk
+++ b/skia/skia_library.target.linux-arm.mk
@@ -39,6 +39,7 @@
 	third_party/skia/src/ports/SkThread_pthread.cpp \
 	third_party/skia/src/ports/SkTime_Unix.cpp \
 	third_party/skia/src/ports/SkTLS_pthread.cpp \
+	third_party/skia/src/sfnt/SkOTTable_name.cpp \
 	third_party/skia/src/sfnt/SkOTUtils.cpp \
 	third_party/skia/src/utils/debugger/SkDebugCanvas.cpp \
 	third_party/skia/src/utils/debugger/SkDrawCommand.cpp \
@@ -240,6 +241,7 @@
 	third_party/skia/src/effects/SkColorFilterImageFilter.cpp \
 	third_party/skia/src/effects/SkColorMatrix.cpp \
 	third_party/skia/src/effects/SkColorMatrixFilter.cpp \
+	third_party/skia/src/effects/SkComposeImageFilter.cpp \
 	third_party/skia/src/effects/SkCornerPathEffect.cpp \
 	third_party/skia/src/effects/SkDashPathEffect.cpp \
 	third_party/skia/src/effects/SkDiscretePathEffect.cpp \
diff --git a/skia/skia_library.target.linux-mips.mk b/skia/skia_library.target.linux-mips.mk
index 115fb00..34fe628 100644
--- a/skia/skia_library.target.linux-mips.mk
+++ b/skia/skia_library.target.linux-mips.mk
@@ -39,6 +39,7 @@
 	third_party/skia/src/ports/SkThread_pthread.cpp \
 	third_party/skia/src/ports/SkTime_Unix.cpp \
 	third_party/skia/src/ports/SkTLS_pthread.cpp \
+	third_party/skia/src/sfnt/SkOTTable_name.cpp \
 	third_party/skia/src/sfnt/SkOTUtils.cpp \
 	third_party/skia/src/utils/debugger/SkDebugCanvas.cpp \
 	third_party/skia/src/utils/debugger/SkDrawCommand.cpp \
@@ -240,6 +241,7 @@
 	third_party/skia/src/effects/SkColorFilterImageFilter.cpp \
 	third_party/skia/src/effects/SkColorMatrix.cpp \
 	third_party/skia/src/effects/SkColorMatrixFilter.cpp \
+	third_party/skia/src/effects/SkComposeImageFilter.cpp \
 	third_party/skia/src/effects/SkCornerPathEffect.cpp \
 	third_party/skia/src/effects/SkDashPathEffect.cpp \
 	third_party/skia/src/effects/SkDiscretePathEffect.cpp \
diff --git a/skia/skia_library.target.linux-x86.mk b/skia/skia_library.target.linux-x86.mk
index bf9b65e..69b4e75 100644
--- a/skia/skia_library.target.linux-x86.mk
+++ b/skia/skia_library.target.linux-x86.mk
@@ -40,6 +40,7 @@
 	third_party/skia/src/ports/SkThread_pthread.cpp \
 	third_party/skia/src/ports/SkTime_Unix.cpp \
 	third_party/skia/src/ports/SkTLS_pthread.cpp \
+	third_party/skia/src/sfnt/SkOTTable_name.cpp \
 	third_party/skia/src/sfnt/SkOTUtils.cpp \
 	third_party/skia/src/utils/debugger/SkDebugCanvas.cpp \
 	third_party/skia/src/utils/debugger/SkDrawCommand.cpp \
@@ -241,6 +242,7 @@
 	third_party/skia/src/effects/SkColorFilterImageFilter.cpp \
 	third_party/skia/src/effects/SkColorMatrix.cpp \
 	third_party/skia/src/effects/SkColorMatrixFilter.cpp \
+	third_party/skia/src/effects/SkComposeImageFilter.cpp \
 	third_party/skia/src/effects/SkCornerPathEffect.cpp \
 	third_party/skia/src/effects/SkDashPathEffect.cpp \
 	third_party/skia/src/effects/SkDiscretePathEffect.cpp \
diff --git a/testing/gtest_ios/run-unittest.sh b/testing/gtest_ios/run-unittest.sh
index a19c18f..1598630 100755
--- a/testing/gtest_ios/run-unittest.sh
+++ b/testing/gtest_ios/run-unittest.sh
@@ -52,7 +52,7 @@
   fi
 
   for device in 'iPhone' 'iPad'; do
-    iosVersion="5.1"
+    iosVersion="6.1"
     KillSimulator
     local command=(
       "${SimExecutable}" "-d${device}" "-s${iosVersion}" "${appPath}"
diff --git a/third_party/android_testrunner/run_command.py b/third_party/android_testrunner/run_command.py
index 6b84156..5c82c61 100644
--- a/third_party/android_testrunner/run_command.py
+++ b/third_party/android_testrunner/run_command.py
@@ -22,6 +22,7 @@
 import tempfile
 import threading
 import time
+import sys
 
 # local imports
 import errors
@@ -93,12 +94,15 @@
     stdin_dest = subprocess.PIPE
   else:
     stdin_dest = None
+  stderr_dest = subprocess.STDOUT
+  if os.environ.get('ADB_TRACE'):
+    stderr_dest = sys.stdout
   pipe = subprocess.Popen(
       cmd,
       executable='/bin/bash',
       stdin=stdin_dest,
       stdout=output_dest,
-      stderr=subprocess.STDOUT,
+      stderr=stderr_dest,
       shell=True, close_fds=True,
       preexec_fn=lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL))
 
diff --git a/third_party/cld/OWNERS b/third_party/cld/OWNERS
index 2dc9123..a214ab1 100644
--- a/third_party/cld/OWNERS
+++ b/third_party/cld/OWNERS
@@ -1,2 +1,3 @@
+hajimehoshi@chromium.org
 mad@chromium.org
 toyoshim@chromium.org
diff --git a/third_party/protobuf/README.chromium b/third_party/protobuf/README.chromium
index 6e82e82..e15fcae 100644
--- a/third_party/protobuf/README.chromium
+++ b/third_party/protobuf/README.chromium
@@ -26,7 +26,7 @@
 targets that depend on it can be componentized. See http://crbug.com/172800 for
 details, and r179806 for the patch.
 
-Revisions r427, r430, r475 and r476 were cherry-picked from upstream.
+Revisions r427, r430, r475, r476 and 504 were cherry-picked from upstream.
 Patch from http://code.google.com/p/protobuf/issues/detail?id=425 was
 cherry-picked from upstream.
 
diff --git a/third_party/protobuf/src/google/protobuf/stubs/atomicops.h b/third_party/protobuf/src/google/protobuf/stubs/atomicops.h
index 89045cd..9b795ee 100644
--- a/third_party/protobuf/src/google/protobuf/stubs/atomicops.h
+++ b/third_party/protobuf/src/google/protobuf/stubs/atomicops.h
@@ -160,8 +160,11 @@
 #define GOOGLE_PROTOBUF_ATOMICOPS_ERROR \
 #error "Atomic operations are not supported on your platform"
 
+// ThreadSanitizer, http://clang.llvm.org/docs/ThreadSanitizer.html.
+#if defined(THREAD_SANITIZER)
+#include <google/protobuf/stubs/atomicops_internals_tsan.h>
 // MSVC.
-#if defined(_MSC_VER)
+#elif defined(_MSC_VER)
 #if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64)
 #include <google/protobuf/stubs/atomicops_internals_x86_msvc.h>
 #else
diff --git a/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h b/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h
new file mode 100644
index 0000000..ca492b0
--- /dev/null
+++ b/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h
@@ -0,0 +1,392 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2013 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is an internal atomic implementation for compiler-based
+// ThreadSanitizer (http://clang.llvm.org/docs/ThreadSanitizer.html).
+// Use atomicops.h instead.
+
+#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_TSAN_H_
+#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_TSAN_H_
+
+#define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory")
+
+namespace google {
+namespace protobuf {
+namespace internal {
+
+#ifndef TSAN_INTERFACE_ATOMIC_H
+#define TSAN_INTERFACE_ATOMIC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef char  __tsan_atomic8;
+typedef short __tsan_atomic16;  // NOLINT
+typedef int   __tsan_atomic32;
+typedef long  __tsan_atomic64;  // NOLINT
+
+#if defined(__SIZEOF_INT128__) \
+    || (__clang_major__ * 100 + __clang_minor__ >= 302)
+typedef __int128 __tsan_atomic128;
+#define __TSAN_HAS_INT128 1
+#else
+typedef char     __tsan_atomic128;
+#define __TSAN_HAS_INT128 0
+#endif
+
+typedef enum {
+  __tsan_memory_order_relaxed,
+  __tsan_memory_order_consume,
+  __tsan_memory_order_acquire,
+  __tsan_memory_order_release,
+  __tsan_memory_order_acq_rel,
+  __tsan_memory_order_seq_cst,
+} __tsan_memory_order;
+
+__tsan_atomic8 __tsan_atomic8_load(const volatile __tsan_atomic8 *a,
+    __tsan_memory_order mo);
+__tsan_atomic16 __tsan_atomic16_load(const volatile __tsan_atomic16 *a,
+    __tsan_memory_order mo);
+__tsan_atomic32 __tsan_atomic32_load(const volatile __tsan_atomic32 *a,
+    __tsan_memory_order mo);
+__tsan_atomic64 __tsan_atomic64_load(const volatile __tsan_atomic64 *a,
+    __tsan_memory_order mo);
+__tsan_atomic128 __tsan_atomic128_load(const volatile __tsan_atomic128 *a,
+    __tsan_memory_order mo);
+
+void __tsan_atomic8_store(volatile __tsan_atomic8 *a, __tsan_atomic8 v,
+    __tsan_memory_order mo);
+void __tsan_atomic16_store(volatile __tsan_atomic16 *a, __tsan_atomic16 v,
+    __tsan_memory_order mo);
+void __tsan_atomic32_store(volatile __tsan_atomic32 *a, __tsan_atomic32 v,
+    __tsan_memory_order mo);
+void __tsan_atomic64_store(volatile __tsan_atomic64 *a, __tsan_atomic64 v,
+    __tsan_memory_order mo);
+void __tsan_atomic128_store(volatile __tsan_atomic128 *a, __tsan_atomic128 v,
+    __tsan_memory_order mo);
+
+__tsan_atomic8 __tsan_atomic8_exchange(volatile __tsan_atomic8 *a,
+    __tsan_atomic8 v, __tsan_memory_order mo);
+__tsan_atomic16 __tsan_atomic16_exchange(volatile __tsan_atomic16 *a,
+    __tsan_atomic16 v, __tsan_memory_order mo);
+__tsan_atomic32 __tsan_atomic32_exchange(volatile __tsan_atomic32 *a,
+    __tsan_atomic32 v, __tsan_memory_order mo);
+__tsan_atomic64 __tsan_atomic64_exchange(volatile __tsan_atomic64 *a,
+    __tsan_atomic64 v, __tsan_memory_order mo);
+__tsan_atomic128 __tsan_atomic128_exchange(volatile __tsan_atomic128 *a,
+    __tsan_atomic128 v, __tsan_memory_order mo);
+
+__tsan_atomic8 __tsan_atomic8_fetch_add(volatile __tsan_atomic8 *a,
+    __tsan_atomic8 v, __tsan_memory_order mo);
+__tsan_atomic16 __tsan_atomic16_fetch_add(volatile __tsan_atomic16 *a,
+    __tsan_atomic16 v, __tsan_memory_order mo);
+__tsan_atomic32 __tsan_atomic32_fetch_add(volatile __tsan_atomic32 *a,
+    __tsan_atomic32 v, __tsan_memory_order mo);
+__tsan_atomic64 __tsan_atomic64_fetch_add(volatile __tsan_atomic64 *a,
+    __tsan_atomic64 v, __tsan_memory_order mo);
+__tsan_atomic128 __tsan_atomic128_fetch_add(volatile __tsan_atomic128 *a,
+    __tsan_atomic128 v, __tsan_memory_order mo);
+
+__tsan_atomic8 __tsan_atomic8_fetch_and(volatile __tsan_atomic8 *a,
+    __tsan_atomic8 v, __tsan_memory_order mo);
+__tsan_atomic16 __tsan_atomic16_fetch_and(volatile __tsan_atomic16 *a,
+    __tsan_atomic16 v, __tsan_memory_order mo);
+__tsan_atomic32 __tsan_atomic32_fetch_and(volatile __tsan_atomic32 *a,
+    __tsan_atomic32 v, __tsan_memory_order mo);
+__tsan_atomic64 __tsan_atomic64_fetch_and(volatile __tsan_atomic64 *a,
+    __tsan_atomic64 v, __tsan_memory_order mo);
+__tsan_atomic128 __tsan_atomic128_fetch_and(volatile __tsan_atomic128 *a,
+    __tsan_atomic128 v, __tsan_memory_order mo);
+
+__tsan_atomic8 __tsan_atomic8_fetch_or(volatile __tsan_atomic8 *a,
+    __tsan_atomic8 v, __tsan_memory_order mo);
+__tsan_atomic16 __tsan_atomic16_fetch_or(volatile __tsan_atomic16 *a,
+    __tsan_atomic16 v, __tsan_memory_order mo);
+__tsan_atomic32 __tsan_atomic32_fetch_or(volatile __tsan_atomic32 *a,
+    __tsan_atomic32 v, __tsan_memory_order mo);
+__tsan_atomic64 __tsan_atomic64_fetch_or(volatile __tsan_atomic64 *a,
+    __tsan_atomic64 v, __tsan_memory_order mo);
+__tsan_atomic128 __tsan_atomic128_fetch_or(volatile __tsan_atomic128 *a,
+    __tsan_atomic128 v, __tsan_memory_order mo);
+
+__tsan_atomic8 __tsan_atomic8_fetch_xor(volatile __tsan_atomic8 *a,
+    __tsan_atomic8 v, __tsan_memory_order mo);
+__tsan_atomic16 __tsan_atomic16_fetch_xor(volatile __tsan_atomic16 *a,
+    __tsan_atomic16 v, __tsan_memory_order mo);
+__tsan_atomic32 __tsan_atomic32_fetch_xor(volatile __tsan_atomic32 *a,
+    __tsan_atomic32 v, __tsan_memory_order mo);
+__tsan_atomic64 __tsan_atomic64_fetch_xor(volatile __tsan_atomic64 *a,
+    __tsan_atomic64 v, __tsan_memory_order mo);
+__tsan_atomic128 __tsan_atomic128_fetch_xor(volatile __tsan_atomic128 *a,
+    __tsan_atomic128 v, __tsan_memory_order mo);
+
+__tsan_atomic8 __tsan_atomic8_fetch_nand(volatile __tsan_atomic8 *a,
+    __tsan_atomic8 v, __tsan_memory_order mo);
+__tsan_atomic16 __tsan_atomic16_fetch_nand(volatile __tsan_atomic16 *a,
+    __tsan_atomic16 v, __tsan_memory_order mo);
+__tsan_atomic32 __tsan_atomic32_fetch_nand(volatile __tsan_atomic32 *a,
+    __tsan_atomic32 v, __tsan_memory_order mo);
+__tsan_atomic64 __tsan_atomic64_fetch_nand(volatile __tsan_atomic64 *a,
+    __tsan_atomic64 v, __tsan_memory_order mo);
+__tsan_atomic128 __tsan_atomic128_fetch_nand(volatile __tsan_atomic128 *a,
+    __tsan_atomic128 v, __tsan_memory_order mo);
+
+int __tsan_atomic8_compare_exchange_weak(volatile __tsan_atomic8 *a,
+    __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
+    __tsan_memory_order fail_mo);
+int __tsan_atomic16_compare_exchange_weak(volatile __tsan_atomic16 *a,
+    __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
+    __tsan_memory_order fail_mo);
+int __tsan_atomic32_compare_exchange_weak(volatile __tsan_atomic32 *a,
+    __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
+    __tsan_memory_order fail_mo);
+int __tsan_atomic64_compare_exchange_weak(volatile __tsan_atomic64 *a,
+    __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
+    __tsan_memory_order fail_mo);
+int __tsan_atomic128_compare_exchange_weak(volatile __tsan_atomic128 *a,
+    __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
+    __tsan_memory_order fail_mo);
+
+int __tsan_atomic8_compare_exchange_strong(volatile __tsan_atomic8 *a,
+    __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
+    __tsan_memory_order fail_mo);
+int __tsan_atomic16_compare_exchange_strong(volatile __tsan_atomic16 *a,
+    __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
+    __tsan_memory_order fail_mo);
+int __tsan_atomic32_compare_exchange_strong(volatile __tsan_atomic32 *a,
+    __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
+    __tsan_memory_order fail_mo);
+int __tsan_atomic64_compare_exchange_strong(volatile __tsan_atomic64 *a,
+    __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
+    __tsan_memory_order fail_mo);
+int __tsan_atomic128_compare_exchange_strong(volatile __tsan_atomic128 *a,
+    __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
+    __tsan_memory_order fail_mo);
+
+__tsan_atomic8 __tsan_atomic8_compare_exchange_val(
+    volatile __tsan_atomic8 *a, __tsan_atomic8 c, __tsan_atomic8 v,
+    __tsan_memory_order mo, __tsan_memory_order fail_mo);
+__tsan_atomic16 __tsan_atomic16_compare_exchange_val(
+    volatile __tsan_atomic16 *a, __tsan_atomic16 c, __tsan_atomic16 v,
+    __tsan_memory_order mo, __tsan_memory_order fail_mo);
+__tsan_atomic32 __tsan_atomic32_compare_exchange_val(
+    volatile __tsan_atomic32 *a, __tsan_atomic32 c, __tsan_atomic32 v,
+    __tsan_memory_order mo, __tsan_memory_order fail_mo);
+__tsan_atomic64 __tsan_atomic64_compare_exchange_val(
+    volatile __tsan_atomic64 *a, __tsan_atomic64 c, __tsan_atomic64 v,
+    __tsan_memory_order mo, __tsan_memory_order fail_mo);
+__tsan_atomic128 __tsan_atomic128_compare_exchange_val(
+    volatile __tsan_atomic128 *a, __tsan_atomic128 c, __tsan_atomic128 v,
+    __tsan_memory_order mo, __tsan_memory_order fail_mo);
+
+void __tsan_atomic_thread_fence(__tsan_memory_order mo);
+void __tsan_atomic_signal_fence(__tsan_memory_order mo);
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+#endif  // #ifndef TSAN_INTERFACE_ATOMIC_H
+
+inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32 *ptr,
+                                         Atomic32 old_value,
+                                         Atomic32 new_value) {
+  Atomic32 cmp = old_value;
+  __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value,
+      __tsan_memory_order_relaxed, __tsan_memory_order_relaxed);
+  return cmp;
+}
+
+inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32 *ptr,
+                                         Atomic32 new_value) {
+  return __tsan_atomic32_exchange(ptr, new_value,
+      __tsan_memory_order_relaxed);
+}
+
+inline Atomic32 Acquire_AtomicExchange(volatile Atomic32 *ptr,
+                                       Atomic32 new_value) {
+  return __tsan_atomic32_exchange(ptr, new_value,
+      __tsan_memory_order_acquire);
+}
+
+inline Atomic32 Release_AtomicExchange(volatile Atomic32 *ptr,
+                                       Atomic32 new_value) {
+  return __tsan_atomic32_exchange(ptr, new_value,
+      __tsan_memory_order_release);
+}
+
+inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32 *ptr,
+                                          Atomic32 increment) {
+  return increment + __tsan_atomic32_fetch_add(ptr, increment,
+      __tsan_memory_order_relaxed);
+}
+
+inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32 *ptr,
+                                        Atomic32 increment) {
+  return increment + __tsan_atomic32_fetch_add(ptr, increment,
+      __tsan_memory_order_acq_rel);
+}
+
+inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32 *ptr,
+                                       Atomic32 old_value,
+                                       Atomic32 new_value) {
+  Atomic32 cmp = old_value;
+  __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value,
+      __tsan_memory_order_acquire, __tsan_memory_order_acquire);
+  return cmp;
+}
+
+inline Atomic32 Release_CompareAndSwap(volatile Atomic32 *ptr,
+                                       Atomic32 old_value,
+                                       Atomic32 new_value) {
+  Atomic32 cmp = old_value;
+  __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value,
+      __tsan_memory_order_release, __tsan_memory_order_relaxed);
+  return cmp;
+}
+
+inline void NoBarrier_Store(volatile Atomic32 *ptr, Atomic32 value) {
+  __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed);
+}
+
+inline void Acquire_Store(volatile Atomic32 *ptr, Atomic32 value) {
+  __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed);
+  __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
+}
+
+inline void Release_Store(volatile Atomic32 *ptr, Atomic32 value) {
+  __tsan_atomic32_store(ptr, value, __tsan_memory_order_release);
+}
+
+inline Atomic32 NoBarrier_Load(volatile const Atomic32 *ptr) {
+  return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed);
+}
+
+inline Atomic32 Acquire_Load(volatile const Atomic32 *ptr) {
+  return __tsan_atomic32_load(ptr, __tsan_memory_order_acquire);
+}
+
+inline Atomic32 Release_Load(volatile const Atomic32 *ptr) {
+  __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
+  return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed);
+}
+
+inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64 *ptr,
+                                         Atomic64 old_value,
+                                         Atomic64 new_value) {
+  Atomic64 cmp = old_value;
+  __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value,
+      __tsan_memory_order_relaxed, __tsan_memory_order_relaxed);
+  return cmp;
+}
+
+inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64 *ptr,
+                                         Atomic64 new_value) {
+  return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_relaxed);
+}
+
+inline Atomic64 Acquire_AtomicExchange(volatile Atomic64 *ptr,
+                                       Atomic64 new_value) {
+  return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_acquire);
+}
+
+inline Atomic64 Release_AtomicExchange(volatile Atomic64 *ptr,
+                                       Atomic64 new_value) {
+  return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_release);
+}
+
+inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64 *ptr,
+                                          Atomic64 increment) {
+  return increment + __tsan_atomic64_fetch_add(ptr, increment,
+      __tsan_memory_order_relaxed);
+}
+
+inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64 *ptr,
+                                        Atomic64 increment) {
+  return increment + __tsan_atomic64_fetch_add(ptr, increment,
+      __tsan_memory_order_acq_rel);
+}
+
+inline void NoBarrier_Store(volatile Atomic64 *ptr, Atomic64 value) {
+  __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed);
+}
+
+inline void Acquire_Store(volatile Atomic64 *ptr, Atomic64 value) {
+  __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed);
+  __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
+}
+
+inline void Release_Store(volatile Atomic64 *ptr, Atomic64 value) {
+  __tsan_atomic64_store(ptr, value, __tsan_memory_order_release);
+}
+
+inline Atomic64 NoBarrier_Load(volatile const Atomic64 *ptr) {
+  return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed);
+}
+
+inline Atomic64 Acquire_Load(volatile const Atomic64 *ptr) {
+  return __tsan_atomic64_load(ptr, __tsan_memory_order_acquire);
+}
+
+inline Atomic64 Release_Load(volatile const Atomic64 *ptr) {
+  __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
+  return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed);
+}
+
+inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64 *ptr,
+                                       Atomic64 old_value,
+                                       Atomic64 new_value) {
+  Atomic64 cmp = old_value;
+  __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value,
+      __tsan_memory_order_acquire, __tsan_memory_order_acquire);
+  return cmp;
+}
+
+inline Atomic64 Release_CompareAndSwap(volatile Atomic64 *ptr,
+                                       Atomic64 old_value,
+                                       Atomic64 new_value) {
+  Atomic64 cmp = old_value;
+  __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value,
+      __tsan_memory_order_release, __tsan_memory_order_relaxed);
+  return cmp;
+}
+
+inline void MemoryBarrier() {
+  __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
+}
+
+}  // namespace internal
+}  // namespace protobuf
+}  // namespace google
+
+#undef ATOMICOPS_COMPILER_BARRIER
+
+#endif  // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_TSAN_H_
diff --git a/tools/heapcheck/suppressions.txt b/tools/heapcheck/suppressions.txt
index 994ad65..5f767c1 100644
--- a/tools/heapcheck/suppressions.txt
+++ b/tools/heapcheck/suppressions.txt
@@ -493,7 +493,7 @@
    bug_157885
    Heapcheck:Leak
    ...
-   fun:dom_storage::DomStorageContext::CreateSessionNamespace
+   fun:content::DOMStorageContextImpl::CreateSessionNamespace
 }
 {
    bug_159191
@@ -558,47 +558,6 @@
    fun:ash::Shell::Init
 }
 {
-   bug_169185_a
-   Heapcheck:Leak
-   fun:v8::internal::SlotsBufferAllocator::AllocateBuffer
-   fun:v8::internal::SlotsBuffer::AddTo
-   fun:v8::internal::MarkCompactCollector::Record*
-   ...
-   fun:v8::internal::StaticMarkingVisitor::IterateBody
-   fun:v8::internal::IncrementalMarking::VisitObject
-   fun:v8::internal::IncrementalMarking::ProcessMarkingDeque
-   fun:v8::internal::IncrementalMarking::Step
-   ...
-   fun:v8::internal::*Space::AllocateRaw
-}
-{
-   bug_169678_b
-   Heapcheck:Leak
-   fun:v8::internal::SlotsBufferAllocator::AllocateBuffer
-   fun:v8::internal::SlotsBuffer::AddTo
-   fun:v8::internal::MarkCompactCollector::RecordCodeEntrySlot
-   fun:v8::internal::StaticMarkingVisitor::VisitCodeEntry
-   ...
-   fun:v8::internal::IncrementalMarking::VisitObject
-   ...
-   fun:v8::internal::IncrementalMarking::OldSpaceStep
-   fun:v8::internal::FreeList::Allocate
-}
-{
-   bug_169678_c
-   Heapcheck:Leak
-   fun:v8::internal::SlotsBufferAllocator::AllocateBuffer
-   fun:v8::internal::SlotsBuffer::AddTo
-   fun:v8::internal::MarkCompactCollector::Record*
-   ...
-   fun:v8::internal::Heap::DoScavenge*
-   fun:v8::internal::Heap::Scavenge*
-   ...
-   fun:v8::internal::Heap::PerformGarbageCollection
-   fun:v8::internal::Heap::CollectGarbage
-   fun:v8::internal::Heap::CollectGarbage
-}
-{
    bug_171547_b
    Heapcheck:Leak
    ...
@@ -875,3 +834,24 @@
    fun:GetWeakPtr
    fun:base::WeakPtrTest_MoveOwnershipAfterInvalidate_Test::TestBody
 }
+{
+   bug_269716a
+   Heapcheck:Leak
+   fun:PL_ArenaAllocate
+   fun:net::NSSCertDatabase::DeleteCertAndKey
+   fun:chromeos::NetworkCertMigratorTest::CleanupTestCert
+}
+{
+   bug_269716b
+   Heapcheck:Leak
+   fun:PR_NewLock
+   fun:net::NSSCertDatabase::DeleteCertAndKey
+   fun:chromeos::NetworkCertMigratorTest::CleanupTestCert
+}
+{
+   bug_269716c
+   Heapcheck:Leak
+   fun:nss_ZAlloc
+   fun:net::NSSCertDatabase::DeleteCertAndKey
+   fun:chromeos::NetworkCertMigratorTest::CleanupTestCert
+}
diff --git a/tools/json_to_struct/element_generator.py b/tools/json_to_struct/element_generator.py
index 3a592d8..20d3069 100644
--- a/tools/json_to_struct/element_generator.py
+++ b/tools/json_to_struct/element_generator.py
@@ -42,7 +42,7 @@
     # json.dumps quotes the string and escape characters as required.
     lines.append('  L%s,' % _JSONToCString16(json.dumps(content)))
 
-def _GenerateArray(field_info, content, lines):
+def _GenerateArray(element_name, field_info, content, lines):
   """Generates an array to be included in a static structure initializer. If
   content is not specified, uses NULL. The array is assigned to a temporary
   variable which is initialized before the structure.
@@ -55,7 +55,7 @@
   # Create a new array variable and use it in the structure initializer.
   # This prohibits nested arrays. Add a clash detection and renaming mechanism
   # to solve the problem.
-  var = 'array_%s' % field_info['field'];
+  var = 'array_%s_%s' % (element_name, field_info['field']);
   lines.append('  %s,' % var)
   lines.append('  %s,' % len(content))  # Size of the array.
   # Generate the array content.
@@ -64,7 +64,8 @@
   array_lines.append(struct_generator.GenerateField(
                      field_info['contents']) + '[] = {')
   for subcontent in content:
-    GenerateFieldContent(field_info['contents'], subcontent, array_lines)
+    GenerateFieldContent(element_name, field_info['contents'], subcontent,
+                         array_lines)
   array_lines.append('};')
   # Prepend the generated array so it is initialized before the structure.
   lines.reverse()
@@ -72,7 +73,7 @@
   lines.extend(array_lines)
   lines.reverse()
 
-def GenerateFieldContent(field_info, content, lines):
+def GenerateFieldContent(element_name, field_info, content, lines):
   """Generate the content of a field to be included in the static structure
   initializer. If the field's content is not specified, uses the default value
   if one exists.
@@ -87,7 +88,7 @@
   elif type == 'string16':
     _GenerateString16(content, lines)
   elif type == 'array':
-    _GenerateArray(field_info, content, lines)
+    _GenerateArray(element_name, field_info, content, lines)
   else:
     raise RuntimeError('Unknown field type "%s"' % type)
 
@@ -101,7 +102,7 @@
     if (content == None and not field_info.get('optional', False)):
       raise RuntimeError('Mandatory field "%s" omitted in element "%s".' %
                          (field_info['field'], element_name))
-    GenerateFieldContent(field_info, content, lines)
+    GenerateFieldContent(element_name, field_info, content, lines)
   lines.append('};')
   return '\n'.join(lines)
 
diff --git a/tools/json_to_struct/element_generator_test.py b/tools/json_to_struct/element_generator_test.py
index 484e83f..67459a1 100755
--- a/tools/json_to_struct/element_generator_test.py
+++ b/tools/json_to_struct/element_generator_test.py
@@ -10,70 +10,72 @@
 class ElementGeneratorTest(unittest.TestCase):
   def testGenerateIntFieldContent(self):
     lines = [];
-    GenerateFieldContent({'type': 'int', 'default': 5}, None, lines)
+    GenerateFieldContent('', {'type': 'int', 'default': 5}, None, lines)
     self.assertEquals(['  5,'], lines)
     lines = [];
-    GenerateFieldContent({'type': 'int', 'default': 5}, 12, lines)
+    GenerateFieldContent('', {'type': 'int', 'default': 5}, 12, lines)
     self.assertEquals(['  12,'], lines)
     lines = [];
-    GenerateFieldContent({'type': 'int'}, -3, lines)
+    GenerateFieldContent('', {'type': 'int'}, -3, lines)
     self.assertEquals(['  -3,'], lines)
 
   def testGenerateStringFieldContent(self):
     lines = [];
-    GenerateFieldContent({'type': 'string', 'default': 'foo_bar'}, None, lines)
+    GenerateFieldContent('', {'type': 'string', 'default': 'foo_bar'}, None,
+                         lines)
     self.assertEquals(['  "foo_bar",'], lines)
     lines = [];
-    GenerateFieldContent({'type': 'string', 'default': 'foo'}, 'bar\n', lines)
+    GenerateFieldContent('', {'type': 'string', 'default': 'foo'}, 'bar\n',
+                         lines)
     self.assertEquals(['  "bar\\n",'], lines)
     lines = [];
-    GenerateFieldContent({'type': 'string'}, None, lines)
+    GenerateFieldContent('', {'type': 'string'}, None, lines)
     self.assertEquals(['  NULL,'], lines)
     lines = [];
-    GenerateFieldContent({'type': 'string'}, 'foo', lines)
+    GenerateFieldContent('', {'type': 'string'}, 'foo', lines)
     self.assertEquals(['  "foo",'], lines)
 
   def testGenerateString16FieldContent(self):
     lines = [];
-    GenerateFieldContent({'type': 'string16', 'default': u'f\u00d8\u00d81a'},
-                         None, lines)
+    GenerateFieldContent('', {'type': 'string16',
+                              'default': u'f\u00d8\u00d81a'}, None, lines)
     self.assertEquals(['  L"f\\x00d8" L"\\x00d8" L"1a",'], lines)
     lines = [];
-    GenerateFieldContent({'type': 'string16', 'default': 'foo'}, u'b\uc3a5r',
-                         lines)
+    GenerateFieldContent('', {'type': 'string16', 'default': 'foo'},
+                         u'b\uc3a5r', lines)
     self.assertEquals(['  L"b\\xc3a5" L"r",'], lines)
     lines = [];
-    GenerateFieldContent({'type': 'string16'}, None, lines)
+    GenerateFieldContent('', {'type': 'string16'}, None, lines)
     self.assertEquals(['  NULL,'], lines)
     lines = [];
-    GenerateFieldContent({'type': 'string16'}, u'foo\\u1234', lines)
+    GenerateFieldContent('', {'type': 'string16'}, u'foo\\u1234', lines)
     self.assertEquals(['  L"foo\\\\u1234",'], lines)
 
   def testGenerateEnumFieldContent(self):
     lines = [];
-    GenerateFieldContent({'type': 'enum', 'default': 'RED'}, None, lines)
+    GenerateFieldContent('', {'type': 'enum', 'default': 'RED'}, None, lines)
     self.assertEquals(['  RED,'], lines)
     lines = [];
-    GenerateFieldContent({'type': 'enum', 'default': 'RED'}, 'BLACK', lines)
+    GenerateFieldContent('', {'type': 'enum', 'default': 'RED'}, 'BLACK', lines)
     self.assertEquals(['  BLACK,'], lines)
     lines = [];
-    GenerateFieldContent({'type': 'enum'}, 'BLUE', lines)
+    GenerateFieldContent('', {'type': 'enum'}, 'BLUE', lines)
     self.assertEquals(['  BLUE,'], lines)
 
   def testGenerateArrayFieldContent(self):
     lines = ['STRUCT BEGINS'];
-    GenerateFieldContent({'type': 'array', 'contents': {'type': 'int'}},
+    GenerateFieldContent('test', {'type': 'array', 'contents': {'type': 'int'}},
                          None, lines)
     self.assertEquals(['STRUCT BEGINS', '  NULL,', '  0,'], lines)
     lines = ['STRUCT BEGINS'];
-    GenerateFieldContent({'field': 'my_array', 'type': 'array',
-                          'contents': {'type': 'int'}}, [3, 4], lines)
-    self.assertEquals('const int array_my_array[] = {\n' +
+    GenerateFieldContent('test', {'field': 'my_array', 'type': 'array',
+                                  'contents': {'type': 'int'}}, [3, 4], lines)
+    self.assertEquals('const int array_test_my_array[] = {\n' +
       '  3,\n' +
       '  4,\n' +
       '};\n' +
       'STRUCT BEGINS\n' +
-      '  array_my_array,\n' +
+      '  array_test_my_array,\n' +
       '  2,', '\n'.join(lines))
 
   def testGenerateElements(self):
@@ -115,7 +117,7 @@
                '  NULL,\n' +
                '  0,\n'
                '};\n',
-      'elem2': 'const wchar_t* const array_f3[] = {\n' +
+      'elem2': 'const wchar_t* const array_elem2_f3[] = {\n' +
                '  L"bar",\n' +
                '  L"foo",\n' +
                '};\n' +
@@ -123,7 +125,7 @@
                '  1000,\n' +
                '  "foo_bar",\n' +
                '  MAYBE,\n' +
-               '  array_f3,\n' +
+               '  array_elem2_f3,\n' +
                '  2,\n'
                '};\n'
     }
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index f1069c1..3e7fe9d 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -5977,6 +5977,66 @@
   </summary>
 </histogram>
 
+<histogram name="Net.DailyHttpContentLengthViaDataReductionProxy" units="KB">
+  <summary>
+    Total size in KB of all response bodies in the previous calendar day that
+    were received through the data reduction proxy.
+  </summary>
+</histogram>
+
+<histogram name="Net.DailyHttpContentLengthWithDataReductionProxyEnabled"
+    units="KB">
+  <summary>
+    Total size in KB of all response bodies in the previous calendar day that
+    were received when the data reduction proxy was enabled.
+  </summary>
+</histogram>
+
+<histogram name="Net.DailyHttpContentSavings" units="Percent">
+  <summary>
+    The percentage of data saving in the previous calendar day. A negative
+    saving will be shown as zero.
+  </summary>
+</histogram>
+
+<histogram name="Net.DailyHttpContentSavings_DataReductionProxy"
+    units="Percent">
+  <summary>
+    The percentage of data saving in the previous calendar day when the data
+    reduction proxy was enabled for at least some responses during the day. A
+    negative saving will be shown as zero.
+  </summary>
+</histogram>
+
+<histogram name="Net.DailyHttpOriginalContentLength" units="KB">
+  <summary>
+    Total size in KB specified in the X-Original-Content-Length headers of all
+    responses in the previous calendar day. If the header is not present in a
+    response, the size of the response body is used.
+  </summary>
+</histogram>
+
+<histogram name="Net.DailyHttpReceivedContentLength" units="KB">
+  <summary>
+    Total size in KB of all response bodies in the previous calendar day.
+  </summary>
+</histogram>
+
+<histogram name="Net.DailyReceivedContentViaDataReductionProxy" units="Percent">
+  <summary>
+    The percentage of Net.DailyHttpContentLengthViaDataReductionProxy in
+    Net.DailyHttpReceivedContentLength.
+  </summary>
+</histogram>
+
+<histogram name="Net.DailyReceivedContentWithDataReductionProxyEnabled"
+    units="Percent">
+  <summary>
+    The percentage of Net.DailyHttpContentLengthWithDataReductionProxyEnabled in
+    Net.DailyHttpReceivedContentLength.
+  </summary>
+</histogram>
+
 <histogram name="Net.DhcpWpadCancelTime" units="milliseconds">
   <summary>
     Measures time from initiating a fetch of a PAC file from DHCP WPAD to
@@ -21918,6 +21978,8 @@
   <int value="9" label="DONT_PROCEED_AUTHORITY"/>
   <int value="10" label="MORE"/>
   <int value="11" label="SHOW_UNDERSTAND"/>
+  <int value="12" label="SHOW_INTERNAL_HOSTNAME"/>
+  <int value="13" label="PROCEED_INTERNAL_HOSTNAME"/>
 </enum>
 
 <enum name="SuspendStatus" type="int">
diff --git a/tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py b/tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py
index 13bb286..50ca98b 100644
--- a/tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py
+++ b/tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py
@@ -177,6 +177,14 @@
       raise exceptions.BrowserConnectionGoneException()
 
   @property
+  def browser_directory(self):
+    raise NotImplementedError()
+
+  @property
+  def profile_directory(self):
+    raise NotImplementedError()
+
+  @property
   def chrome_branch_number(self):
     return self._chrome_branch_number
 
diff --git a/tools/telemetry/telemetry/core/browser.py b/tools/telemetry/telemetry/core/browser.py
index f8dbb39..a04b058 100644
--- a/tools/telemetry/telemetry/core/browser.py
+++ b/tools/telemetry/telemetry/core/browser.py
@@ -232,6 +232,16 @@
     return self._browser_backend.GetTraceResultAndReset()
 
   def Start(self):
+    options = self._browser_backend.options
+    if options.clear_sytem_cache_for_browser_and_profile_on_start:
+      if self._platform.CanFlushIndividualFilesFromSystemCache():
+        self._platform.FlushSystemCacheForDirectory(
+            self._browser_backend.profile_directory)
+        self._platform.FlushSystemCacheForDirectory(
+            self._browser_backend.browser_directory)
+      else:
+        self._platform.FlushEntireSystemCache()
+
     self._browser_backend.Start()
     self._browser_backend.SetBrowser(self)
 
diff --git a/tools/telemetry/telemetry/core/browser_options.py b/tools/telemetry/telemetry/core/browser_options.py
index 2daf439..c27d158 100644
--- a/tools/telemetry/telemetry/core/browser_options.py
+++ b/tools/telemetry/telemetry/core/browser_options.py
@@ -37,6 +37,7 @@
     self.extra_wpr_args = []
     self.show_stdout = False
     self.extensions_to_load = []
+    self.clear_sytem_cache_for_browser_and_profile_on_start = False
 
     self.cros_remote = None
     self.wpr_mode = wpr_modes.WPR_OFF
diff --git a/tools/telemetry/telemetry/core/chrome/android_browser_backend.py b/tools/telemetry/telemetry/core/chrome/android_browser_backend.py
index ec6b133..34aa933 100644
--- a/tools/telemetry/telemetry/core/chrome/android_browser_backend.py
+++ b/tools/telemetry/telemetry/core/chrome/android_browser_backend.py
@@ -28,7 +28,7 @@
 
   def RemoveProfile(self):
     self.adb.RunShellCommand(
-        'su -c rm -r "%s"' % self._profile_dir)
+        'su -c rm -r "%s"' % self.profile_dir)
 
   def PushProfile(self, _):
     logging.critical('Profiles cannot be overriden with current configuration')
@@ -39,7 +39,7 @@
     return False
 
   @property
-  def _profile_dir(self):
+  def profile_dir(self):
     raise NotImplementedError()
 
 
@@ -59,10 +59,10 @@
     return 'localabstract:chrome_devtools_remote'
 
   def PushProfile(self, new_profile_dir):
-    self.adb.Push(new_profile_dir, self._profile_dir)
+    self.adb.Push(new_profile_dir, self.profile_dir)
 
   @property
-  def _profile_dir(self):
+  def profile_dir(self):
     return '/data/data/%s/app_chrome/' % self.package
 
 
@@ -83,7 +83,7 @@
     return True
 
   @property
-  def _profile_dir(self):
+  def profile_dir(self):
     return '/data/data/%s/app_content_shell/' % self.package
 
 
@@ -104,7 +104,7 @@
     return True
 
   @property
-  def _profile_dir(self):
+  def profile_dir(self):
     return '/data/data/%s/app_chromiumtestshell/' % self.package
 
 
@@ -139,7 +139,7 @@
     return 'localabstract:webview_devtools_remote_%s' % str(pid)
 
   @property
-  def _profile_dir(self):
+  def profile_dir(self):
     return '/data/data/%s/app_webview/' % self.package
 
 
@@ -244,6 +244,14 @@
   def pid(self):
     return int(self._adb.ExtractPid(self._backend_settings.package)[0])
 
+  @property
+  def browser_directory(self):
+    return None
+
+  @property
+  def profile_directory(self):
+    return self._backend_settings.profile_dir
+
   def __del__(self):
     self.Close()
 
diff --git a/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py b/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py
index a3daeee..bad383c 100644
--- a/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py
+++ b/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py
@@ -18,8 +18,9 @@
                   '/usr/local/opt/google/chrome/chrome ']
 
   def __init__(self, browser_type, options, cri, is_guest):
-    super(CrOSBrowserBackend, self).__init__(is_content_shell=False,
-        supports_extensions=not is_guest, options=options)
+    super(CrOSBrowserBackend, self).__init__(
+        is_content_shell=False, supports_extensions=not is_guest,
+        options=options)
     # Initialize fields so that an explosion during init doesn't break in Close.
     self._browser_type = browser_type
     self._options = options
@@ -84,6 +85,8 @@
             '--disable-default-apps',
             # Jump to the login screen, skipping network selection, eula, etc.
             '--login-screen=login',
+            # Skip user image selection screen, and post login screens.
+            '--oobe-skip-postlogin',
             # Allow devtools to connect to chrome.
             '--remote-debugging-port=%i' % self._remote_debugging_port,
             # Open a maximized window.
@@ -110,9 +113,8 @@
         return pid
     return None
 
-  @property
-  def pid(self):
-    """Locates the pid of the main chrome browser process.
+  def _GetChromeProcess(self):
+    """Locates the the main chrome browser process.
 
     Chrome on cros is usually in /opt/google/chrome, but could be in
     /usr/local/ for developer workflows - debug chrome is too large to fit on
@@ -134,10 +136,28 @@
         continue
       for path in self.CHROME_PATHS:
         if process.startswith(path):
-          return pid
+          return {'pid': pid, 'path': path}
     return None
 
   @property
+  def pid(self):
+    result = self._GetChromeProcess()
+    if 'pid' in result:
+      return result['pid']
+    return None
+
+  @property
+  def browser_directory(self):
+    result = self._GetChromeProcess()
+    if 'path' in result:
+      return result['path']
+    return None
+
+  @property
+  def profile_directory(self):
+    return '/home/chronos/Default'
+
+  @property
   def hwid(self):
     return self._cri.RunCmdOnDevice(['/usr/bin/crossystem', 'hwid'])[0]
 
@@ -268,8 +288,8 @@
 
   def _HandleUserImageSelectionScreen(self):
     """If we're stuck on the user image selection screen, we click the ok
-    button. TODO(achuith): Figure out a better way to bypass user image
-    selection. crbug.com/249182."""
+    button.
+    """
     oobe = self.oobe
     if oobe:
       try:
@@ -285,7 +305,8 @@
   def _IsLoggedIn(self):
     """Returns True if we're logged in (cryptohome has mounted), and the oobe
     has been dismissed."""
-    self._HandleUserImageSelectionScreen()
+    if self.chrome_branch_number <= 1547:
+      self._HandleUserImageSelectionScreen()
     return self._IsCryptohomeMounted() and not self.oobe
 
   def _StartupWindow(self):
diff --git a/tools/telemetry/telemetry/core/chrome/desktop_browser_backend.py b/tools/telemetry/telemetry/core/chrome/desktop_browser_backend.py
index 0e90658..834278d 100644
--- a/tools/telemetry/telemetry/core/chrome/desktop_browser_backend.py
+++ b/tools/telemetry/telemetry/core/chrome/desktop_browser_backend.py
@@ -17,7 +17,7 @@
   Mac or Windows.
   """
   def __init__(self, options, executable, flash_path, is_content_shell,
-               delete_profile_dir_after_run=True):
+               browser_directory, delete_profile_dir_after_run=True):
     super(DesktopBrowserBackend, self).__init__(
         is_content_shell=is_content_shell,
         supports_extensions=not is_content_shell,
@@ -43,6 +43,7 @@
       raise browser_backend.ExtensionsNotSupportedException(
           'Content shell does not support extensions.')
 
+    self._browser_directory = browser_directory
     self._port = util.GetAvailableLocalPort()
     self._profile_dir = None
     self._supports_net_benchmarking = True
@@ -120,6 +121,10 @@
     return None
 
   @property
+  def browser_directory(self):
+    return self._browser_directory
+
+  @property
   def profile_directory(self):
     return self._tmpdir
 
diff --git a/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py b/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py
index c2f625e..8ef4d6d 100644
--- a/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py
+++ b/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py
@@ -33,11 +33,12 @@
   """A desktop browser that can be controlled."""
 
   def __init__(self, browser_type, options, executable, flash_path,
-               is_content_shell, is_local_build=False):
+               is_content_shell, browser_directory, is_local_build=False):
     super(PossibleDesktopBrowser, self).__init__(browser_type, options)
     self._local_executable = executable
     self._flash_path = flash_path
     self._is_content_shell = is_content_shell
+    self._browser_directory = browser_directory
     self.is_local_build = is_local_build
 
   def __repr__(self):
@@ -48,7 +49,7 @@
   def _CreateBrowserInternal(self, delete_profile_dir_after_run):
     backend = desktop_browser_backend.DesktopBrowserBackend(
         self._options, self._local_executable, self._flash_path,
-        self._is_content_shell,
+        self._is_content_shell, self._browser_directory,
         delete_profile_dir_after_run=delete_profile_dir_after_run)
     b = browser.Browser(backend,
                         core_platform.CreatePlatformBackendForCurrentOS())
@@ -153,18 +154,21 @@
   if options.browser_executable:
     normalized_executable = os.path.expanduser(options.browser_executable)
     if os.path.exists(normalized_executable):
+      browser_directory = os.path.dirname(options.browser_executable)
       browsers.append(PossibleDesktopBrowser('exact', options,
                                              normalized_executable, flash_path,
-                                             False))
+                                             False, browser_directory))
     else:
       logging.warning('%s specified by browser_executable does not exist',
                       normalized_executable)
 
   def AddIfFound(browser_type, build_dir, type_dir, app_name, content_shell):
-    app = os.path.join(chrome_root, build_dir, type_dir, app_name)
+    browser_directory = os.path.join(chrome_root, build_dir, type_dir)
+    app = os.path.join(browser_directory, app_name)
     if os.path.exists(app):
       browsers.append(PossibleDesktopBrowser(browser_type, options,
                                              app, flash_path, content_shell,
+                                             browser_directory,
                                              is_local_build=True))
       return True
     return False
@@ -178,16 +182,19 @@
 
   # Mac-specific options.
   if sys.platform == 'darwin':
-    mac_canary = ('/Applications/Google Chrome Canary.app/'
-                 'Contents/MacOS/Google Chrome Canary')
-    mac_system = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
+    mac_canary_root = '/Applications/Google Chrome Canary.app/'
+    mac_canary = mac_canary_root + 'Contents/MacOS/Google Chrome Canary'
+    mac_system_root = '/Applications/Google Chrome.app'
+    mac_system = mac_system_root + '/Contents/MacOS/Google Chrome'
     if os.path.exists(mac_canary):
       browsers.append(PossibleDesktopBrowser('canary', options,
-                                             mac_canary, None, False))
+                                             mac_canary, None, False,
+                                             mac_canary_root))
 
     if os.path.exists(mac_system):
       browsers.append(PossibleDesktopBrowser('system', options,
-                                             mac_system, None, False))
+                                             mac_system, None, False,
+                                             mac_system_root))
 
   # Linux specific options.
   if sys.platform.startswith('linux'):
@@ -201,7 +208,8 @@
       pass
     if found:
       browsers.append(PossibleDesktopBrowser('system', options,
-                                             'google-chrome', None, False))
+                                             'google-chrome', None, False,
+                                             '/opt/google/chrome'))
 
   # Win32-specific options.
   if sys.platform.startswith('win'):
@@ -213,10 +221,12 @@
                         os.getenv('LOCALAPPDATA')]
 
     def AddIfFoundWin(browser_name, app_path):
-      app = os.path.join(path, app_path, chromium_app_name)
+      browser_directory = os.path.join(path, app_path)
+      app = os.path.join(browser_directory, chromium_app_name)
       if os.path.exists(app):
         browsers.append(PossibleDesktopBrowser(browser_name, options,
-                                               app, flash_path, False))
+                                               app, flash_path, False,
+                                               browser_directory))
         return True
       return False
 
diff --git a/tools/valgrind/memcheck/suppressions.txt b/tools/valgrind/memcheck/suppressions.txt
index 0464b0f..6d773b7 100644
--- a/tools/valgrind/memcheck/suppressions.txt
+++ b/tools/valgrind/memcheck/suppressions.txt
@@ -1197,6 +1197,25 @@
    fun:_ZN7WebCore16HTMLScriptRunner36executePendingScriptAndDispatchEventERNS_13PendingScriptE
 }
 
+# http://crbug.com/269278 causes really widespread, flaky leaks in
+# value objects that own some memory.  These suppressions will cover
+# all such objects, even though it's possible to get real leaks that
+# look the same way (e.g. by allocating such an object in an arena).
+{
+   bug_269278a
+   Memcheck:Leak
+   fun:_Znw*
+   fun:_ZN4base4Bind*Callback*BindState*
+}
+{
+   bug_269278b
+   Memcheck:Leak
+   fun:_Znw*
+   fun:_ZN9__gnu_cxx13new_allocator*allocate*
+   fun:_ZNSt12_Vector_base*_M_allocate*
+}
+
+
 #-----------------------------------------------------------------------
 # 3. Suppressions for real chromium bugs that are not yet fixed.
 # These should all be in chromium's bug tracking system (but a few aren't yet).
@@ -5764,19 +5783,6 @@
    fun:_ZN11dom_storage17DomStorageContext18DeleteLocalStorageERK4GURL
 }
 {
-   bug_166485
-   Memcheck:Leak
-   fun:_Znw*
-   fun:_ZN9__gnu_cxx13new_allocator*FilePath*allocate*
-   fun:_ZNSt12_Vector_base*FilePath*_M_allocate*
-   fun:_ZNSt6vector*FilePath*_M_insert_aux*
-   fun:_ZNSt6vector*FilePath*push_back*
-   fun:_ZN9file_util26CreateDirectoryAndGetError*
-   fun:_ZN9file_util15CreateDirectory*
-   fun:_ZN11dom_storage17DomStorageContext19GetStorageNamespaceEl
-   fun:_ZN11dom_storage17DomStorageContext18DeleteLocalStorageERK4GURL
-}
-{
    bug_166709
    Memcheck:Leak
    fun:_Znw*
@@ -7216,3 +7222,12 @@
   fun:_ZN7content10PluginList17ReadWebPluginInfoERKN4base8FilePathEPNS_13WebPluginInfoE
   fun:_ZN7content10PluginList14ReadPluginInfoERKN4base8FilePathEPNS_13WebPluginInfoE
 }
+{
+   bug_269201
+   Memcheck:Unaddressable
+   ...
+   fun:_ZN4base8internal17IncomingTaskQueue18AddToIncomingQueueERKN15tracked_objects8LocationERKNS_8CallbackIFvvEEENS_9TimeDeltaEb
+   fun:_ZN4base11MessageLoop8PostTaskERKN15tracked_objects8LocationERKNS_8CallbackIFvvEEE
+   fun:_ZN8printing8PrintJob21UpdatePrintedDocumentEPNS_15PrintedDocumentE
+   fun:_ZN8printing8PrintJob4StopEv
+ }
diff --git a/tools/valgrind/tsan/suppressions.txt b/tools/valgrind/tsan/suppressions.txt
index fcd4803..b0de50b 100644
--- a/tools/valgrind/tsan/suppressions.txt
+++ b/tools/valgrind/tsan/suppressions.txt
@@ -134,12 +134,11 @@
   fun:uprv_malloc_46
 }
 
+# http://bugs.icu-project.org/trac/ticket/10295
 {
-  Two writes, same value (ICU gLibCleanupFunctions[UCLN_UPLUG])
+  Two writes, same value (ICU gLibCleanupFunctions[*])
   ThreadSanitizer:Race
   fun:ucln_registerCleanup_46
-  fun:uplug_init_46
-  fun:u_init_46
 }
 
 # Reading a pointer to a mutex being initialized in a concurrent thread.
@@ -1128,3 +1127,12 @@
   fun:base::MessagePumpLibevent::FileDescriptorWatcher::OnFileCanReadWithoutBlocking
   fun:base::MessagePumpLibevent::OnLibeventNotification
 }
+{
+  bug_268924
+  ThreadSanitizer:Race
+  fun:base::PowerMonitor::PowerMonitor
+  fun:content::ChildThread::Init
+  fun:content::ChildThread::ChildThread
+  fun:content::UtilityThreadImpl::UtilityThreadImpl
+  fun:content::UtilityMainThread::InitInternal
+}
diff --git a/ui/android/java/src/org/chromium/ui/SelectFileDialog.java b/ui/android/java/src/org/chromium/ui/SelectFileDialog.java
index 9aa11e4..91533b5 100644
--- a/ui/android/java/src/org/chromium/ui/SelectFileDialog.java
+++ b/ui/android/java/src/org/chromium/ui/SelectFileDialog.java
@@ -64,17 +64,16 @@
         Intent camcorder = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
         Intent soundRecorder = new Intent(
                 MediaStore.Audio.Media.RECORD_SOUND_ACTION);
-        String lowMemoryError = window.getContext().getString(R.string.low_memory_error);
 
         // Quick check - if the |capture| parameter is set and |fileTypes| has the appropriate MIME
         // type, we should just launch the appropriate intent. Otherwise build up a chooser based on
         // the accept type and then display that to the user.
         if (captureCamera()) {
-            if (window.showIntent(camera, this, lowMemoryError)) return;
+            if (window.showIntent(camera, this, R.string.low_memory_error)) return;
         } else if (captureCamcorder()) {
-            if (window.showIntent(camcorder, this, lowMemoryError)) return;
+            if (window.showIntent(camcorder, this, R.string.low_memory_error)) return;
         } else if (captureMicrophone()) {
-            if (window.showIntent(soundRecorder, this, lowMemoryError)) return;
+            if (window.showIntent(soundRecorder, this, R.string.low_memory_error)) return;
         }
 
         Intent getContentIntent = new Intent(Intent.ACTION_GET_CONTENT);
@@ -109,7 +108,9 @@
 
         chooser.putExtra(Intent.EXTRA_INTENT, getContentIntent);
 
-        if (!window.showIntent(chooser, this, lowMemoryError)) onFileNotSelected();
+        if (!window.showIntent(chooser, this, R.string.low_memory_error)) {
+            onFileNotSelected();
+        }
     }
 
     /**
diff --git a/ui/android/java/src/org/chromium/ui/WindowAndroid.java b/ui/android/java/src/org/chromium/ui/WindowAndroid.java
index 477e5e6..316690b 100644
--- a/ui/android/java/src/org/chromium/ui/WindowAndroid.java
+++ b/ui/android/java/src/org/chromium/ui/WindowAndroid.java
@@ -52,10 +52,11 @@
      * Shows an intent and returns the results to the callback object.
      * @param intent The intent that needs to be showed.
      * @param callback The object that will receive the results for the intent.
-     * @param error The error string to be show if activity is paused before intent results.
+     * @param errorId The ID of error string to be show if activity is paused before intent
+     *        results.
      * @return Whether the intent was shown.
      */
-    public boolean showIntent(Intent intent, IntentCallback callback, String error) {
+    public boolean showIntent(Intent intent, IntentCallback callback, int errorId) {
         int requestCode = REQUEST_CODE_PREFIX + mNextRequestCode;
         mNextRequestCode = (mNextRequestCode + 1) % REQUEST_CODE_RANGE_SIZE;
 
@@ -66,7 +67,7 @@
         }
 
         mOutstandingIntents.put(requestCode, callback);
-        if (error != null) mIntentErrors.put(requestCode, error);
+        mIntentErrors.put(requestCode, mActivity.getString(errorId));
 
         return true;
     }
diff --git a/ui/app_list/cocoa/apps_grid_controller.mm b/ui/app_list/cocoa/apps_grid_controller.mm
index c2873c4..d32a791 100644
--- a/ui/app_list/cocoa/apps_grid_controller.mm
+++ b/ui/app_list/cocoa/apps_grid_controller.mm
@@ -22,7 +22,7 @@
 
 // Padding space in pixels for fixed layout.
 const CGFloat kGridTopPadding = 1;
-const CGFloat kLeftRightPadding = 16;
+const CGFloat kLeftRightPadding = 21;
 const CGFloat kScrollerPadding = 16;
 
 // Preferred tile size when showing in fixed layout. These should be even
diff --git a/ui/app_list/cocoa/apps_grid_view_item.mm b/ui/app_list/cocoa/apps_grid_view_item.mm
index 908bb87..34fe975 100644
--- a/ui/app_list/cocoa/apps_grid_view_item.mm
+++ b/ui/app_list/cocoa/apps_grid_view_item.mm
@@ -30,6 +30,10 @@
 const CGFloat kProgressBarHorizontalPadding = 8;
 const CGFloat kProgressBarVerticalPadding = 13;
 
+// On Mac, fonts of the same enum from ResourceBundle are larger. The smallest
+// enum is already used, so it needs to be reduced further to match Windows.
+const int kMacFontSizeDelta = -1;
+
 }  // namespace
 
 @class AppsGridItemBackgroundView;
@@ -238,8 +242,10 @@
   [paragraphStyle setAlignment:NSCenterTextAlignment];
   NSDictionary* titleAttributes = @{
     NSParagraphStyleAttributeName : paragraphStyle,
-    NSFontAttributeName : ui::ResourceBundle::GetSharedInstance().GetFont(
-        app_list::kItemTextFontStyle).GetNativeFont(),
+    NSFontAttributeName : ui::ResourceBundle::GetSharedInstance()
+        .GetFont(app_list::kItemTextFontStyle)
+        .DeriveFont(kMacFontSizeDelta)
+        .GetNativeFont(),
     NSForegroundColorAttributeName : [self isSelected] ?
         gfx::SkColorToSRGBNSColor(app_list::kGridTitleHoverColor) :
         gfx::SkColorToSRGBNSColor(app_list::kGridTitleColor)
diff --git a/ui/base/default_theme_provider.h b/ui/base/default_theme_provider.h
index 6487b42..2594dfb 100644
--- a/ui/base/default_theme_provider.h
+++ b/ui/base/default_theme_provider.h
@@ -34,11 +34,10 @@
       ui::ScaleFactor scale_factor) const OVERRIDE;
 
 #if defined(OS_MACOSX) && !defined(TOOLKIT_VIEWS)
-  virtual NSImage* GetNSImageNamed(int id, bool allow_default) const OVERRIDE;
-  virtual NSColor* GetNSImageColorNamed(int id,
-                                        bool allow_default) const OVERRIDE;
-  virtual NSColor* GetNSColor(int id, bool allow_default) const OVERRIDE;
-  virtual NSColor* GetNSColorTint(int id, bool allow_default) const OVERRIDE;
+  virtual NSImage* GetNSImageNamed(int id) const OVERRIDE;
+  virtual NSColor* GetNSImageColorNamed(int id) const OVERRIDE;
+  virtual NSColor* GetNSColor(int id) const OVERRIDE;
+  virtual NSColor* GetNSColorTint(int id) const OVERRIDE;
   virtual NSGradient* GetNSGradient(int id) const OVERRIDE;
 #elif defined(OS_POSIX) && !defined(TOOLKIT_VIEWS) && !defined(OS_ANDROID)
   virtual GdkPixbuf* GetRTLEnabledPixbufNamed(int id) const OVERRIDE;
diff --git a/ui/base/default_theme_provider_mac.mm b/ui/base/default_theme_provider_mac.mm
index 08725c2..cc33728 100644
--- a/ui/base/default_theme_provider_mac.mm
+++ b/ui/base/default_theme_provider_mac.mm
@@ -11,25 +11,21 @@
 namespace ui {
 
 #if !defined(TOOLKIT_VIEWS)
-NSImage* DefaultThemeProvider::GetNSImageNamed(int id,
-                                               bool allow_default) const {
+NSImage* DefaultThemeProvider::GetNSImageNamed(int id) const {
  return ResourceBundle::GetSharedInstance().
      GetNativeImageNamed(id).ToNSImage();
 }
 
-NSColor* DefaultThemeProvider::GetNSImageColorNamed(int id,
-                                                    bool allow_default) const {
-  NSImage* image = GetNSImageNamed(id, allow_default);
+NSColor* DefaultThemeProvider::GetNSImageColorNamed(int id) const {
+  NSImage* image = GetNSImageNamed(id);
   return [NSColor colorWithPatternImage:image];
 }
 
-NSColor* DefaultThemeProvider::GetNSColor(int id,
-                                          bool allow_default) const {
+NSColor* DefaultThemeProvider::GetNSColor(int id) const {
   return [NSColor redColor];
 }
 
-NSColor* DefaultThemeProvider::GetNSColorTint(int id,
-                                              bool allow_default) const {
+NSColor* DefaultThemeProvider::GetNSColorTint(int id) const {
   return [NSColor redColor];
 }
 
diff --git a/ui/base/ime/character_composer.cc b/ui/base/ime/character_composer.cc
index 9ffb288..0402be2 100644
--- a/ui/base/ime/character_composer.cc
+++ b/ui/base/ime/character_composer.cc
@@ -38,8 +38,10 @@
   uint32 output_char;  // the character to be inserted if the filter is matched.
   bool consume;  // true if the original key event will be consumed.
 } kBlackListedDeadKeys[] = {
+  { GDK_KEY_dead_acute, GDK_KEY_m, GDK_KEY_apostrophe, false },
   { GDK_KEY_dead_acute, GDK_KEY_s, GDK_KEY_apostrophe, false },
   { GDK_KEY_dead_acute, GDK_KEY_t, GDK_KEY_apostrophe, false },
+  { GDK_KEY_dead_acute, GDK_KEY_v, GDK_KEY_apostrophe, false },
   { GDK_KEY_dead_acute, GDK_KEY_dead_acute, GDK_KEY_apostrophe, true },
 };
 
diff --git a/chrome/common/time_format.cc b/ui/base/l10n/time_format.cc
similarity index 98%
rename from chrome/common/time_format.cc
rename to ui/base/l10n/time_format.cc
index 8e19e66..5ba606c 100644
--- a/chrome/common/time_format.cc
+++ b/ui/base/l10n/time_format.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/common/time_format.h"
+#include "ui/base/l10n/time_format.h"
 
 #include <vector>
 
@@ -14,7 +14,7 @@
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
-#include "grit/generated_resources.h"
+#include "grit/ui_strings.h"
 #include "third_party/icu/source/common/unicode/locid.h"
 #include "third_party/icu/source/i18n/unicode/datefmt.h"
 #include "third_party/icu/source/i18n/unicode/plurfmt.h"
@@ -158,8 +158,6 @@
   FORMAT_ELAPSED,
 };
 
-}  // namespace
-
 class TimeFormatter {
   public:
     const std::vector<icu::PluralFormat*>& formatter(FormatType format_type) {
@@ -311,7 +309,7 @@
   return format;
 }
 
-static string16 FormatTimeImpl(const TimeDelta& delta, FormatType format_type) {
+string16 FormatTimeImpl(const TimeDelta& delta, FormatType format_type) {
   if (delta.ToInternalValue() < 0) {
     NOTREACHED() << "Negative duration";
     return string16();
@@ -360,6 +358,10 @@
   return result;
 }
 
+}  // namespace
+
+namespace ui {
+
 // static
 string16 TimeFormat::TimeElapsed(const TimeDelta& delta) {
   return FormatTimeImpl(delta, FORMAT_ELAPSED);
@@ -402,3 +404,5 @@
     return l10n_util::GetStringUTF16(IDS_PAST_TIME_YESTERDAY);
   return string16();
 }
+
+}  // namespace ui
diff --git a/chrome/common/time_format.h b/ui/base/l10n/time_format.h
similarity index 91%
rename from chrome/common/time_format.h
rename to ui/base/l10n/time_format.h
index 93ec595..075b698 100644
--- a/chrome/common/time_format.h
+++ b/ui/base/l10n/time_format.h
@@ -2,19 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_COMMON_TIME_FORMAT_H_
-#define CHROME_COMMON_TIME_FORMAT_H_
+#ifndef UI_BASE_L10N_TIME_FORMAT_H_
+#define UI_BASE_L10N_TIME_FORMAT_H_
 
 #include "base/basictypes.h"
 #include "base/strings/string16.h"
+#include "ui/base/ui_export.h"
 
 namespace base {
 class Time;
 class TimeDelta;
 }
 
+namespace ui {
+
 // Methods to format time values as strings.
-class TimeFormat {
+class UI_EXPORT TimeFormat {
  public:
   // TimeElapsed, TimeRemaining and TimeRemainingShort functions:
   // These functions return a localized string of approximate time duration. The
@@ -59,4 +62,6 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(TimeFormat);
 };
 
-#endif  // CHROME_COMMON_TIME_FORMAT_H_
+}  // namespace ui
+
+#endif  // UI_BASE_L10N_TIME_FORMAT_H_
diff --git a/chrome/common/time_format_unittest.cc b/ui/base/l10n/time_format_unittest.cc
similarity index 95%
rename from chrome/common/time_format_unittest.cc
rename to ui/base/l10n/time_format_unittest.cc
index 60c84e7..eaee957 100644
--- a/chrome/common/time_format_unittest.cc
+++ b/ui/base/l10n/time_format_unittest.cc
@@ -2,13 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/common/time_format.h"
+#include "ui/base/l10n/time_format.h"
 
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/resource/resource_bundle.h"
 
+namespace ui {
 namespace {
 
 using base::TimeDelta;
@@ -68,3 +70,4 @@
 }
 
 }  // namespace
+}  // namespace ui
diff --git a/ui/base/ozone/surface_factory_ozone.cc b/ui/base/ozone/surface_factory_ozone.cc
index a617efe..f082e7d 100644
--- a/ui/base/ozone/surface_factory_ozone.cc
+++ b/ui/base/ozone/surface_factory_ozone.cc
@@ -29,10 +29,6 @@
       const gfx::Rect& bounds) OVERRIDE {
     return false;
   }
-  virtual bool AcceleratedWidgetCanBeResized(
-      gfx::AcceleratedWidget w) OVERRIDE {
-    return false;
-  }
   virtual gfx::VSyncProvider* GetVSyncProvider(
       gfx::AcceleratedWidget w) OVERRIDE {
     return NULL;
diff --git a/ui/base/ozone/surface_factory_ozone.h b/ui/base/ozone/surface_factory_ozone.h
index d98882d..50a9b4b 100644
--- a/ui/base/ozone/surface_factory_ozone.h
+++ b/ui/base/ozone/surface_factory_ozone.h
@@ -60,11 +60,6 @@
       gfx::AcceleratedWidget w,
       const gfx::Rect& bounds) = 0;
 
-  // TODO(rjkroege): keeping the old API for downstream compat asked by
-  // rjkroege; he promised to remove as soon as his implementation gets fixed,
-  // but we should take this function API as deprecated for now.
-  virtual bool AcceleratedWidgetCanBeResized(gfx::AcceleratedWidget w) = 0;
-
   // Returns a gfx::VsyncProvider for the provided AcceleratedWidget. Note
   // that this may be called after we have entered the sandbox so if there are
   // operations (e.g. opening a file descriptor providing vsync events) that
diff --git a/ui/base/strings/ui_strings.grd b/ui/base/strings/ui_strings.grd
index 21d7001..1a243e5 100644
--- a/ui/base/strings/ui_strings.grd
+++ b/ui/base/strings/ui_strings.grd
@@ -206,6 +206,1072 @@
   <release seq="1" allow_pseudo="false">
     <messages fallback_to_english="true">
 
+      <!-- time format -->
+      <message name="IDS_TIME_SECS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> secs
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_SEC_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_SEC_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_SECS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> secs
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_SECS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_SECS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> secs
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_SECS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_SECS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> secs
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_SECS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_SECS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> secs
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_SECS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <message name="IDS_TIME_MINS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> mins
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_MIN_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> min
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_MIN_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_MINS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> mins
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_MINS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_MINS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> mins
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_MINS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_MINS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> mins
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_MINS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_MINS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> mins
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_MINS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+
+      <message name="IDS_TIME_HOURS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> hours
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_HOUR_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_HOUR_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_HOURS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> hours
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_HOURS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_HOURS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> hours
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_HOURS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_HOURS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> hours
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_HOURS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_HOURS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> hours
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_HOURS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+
+      <message name="IDS_TIME_DAYS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> days
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_DAY_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> day
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_DAY_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_DAYS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> days
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_DAYS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_DAYS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> days
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_DAYS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_DAYS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> days
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_DAYS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_DAYS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> days
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_DAYS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+
+      <message name="IDS_TIME_REMAINING_SECS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> secs left
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_REMAINING_SEC_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec left
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_REMAINING_SEC_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_REMAINING_SECS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> secs left
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_REMAINING_SECS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_REMAINING_SECS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> secs left
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_REMAINING_SECS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_REMAINING_SECS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> secs left
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_REMAINING_SECS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_REMAINING_SECS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> secs left
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_REMAINING_SECS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+
+      <message name="IDS_TIME_REMAINING_MINS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> mins left
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_REMAINING_MIN_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> min left
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_REMAINING_MIN_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_REMAINING_MINS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> mins left
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_REMAINING_MINS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_REMAINING_MINS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> mins left
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_REMAINING_MINS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_REMAINING_MINS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> mins left
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_REMAINING_MINS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_REMAINING_MINS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> mins left
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_REMAINING_MINS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <message name="IDS_TIME_REMAINING_LONG_MINS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> minutes left
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_REMAINING_LONG_MIN_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute left
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_REMAINING_LONG_MIN_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_REMAINING_LONG_MINS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> minutes left
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_REMAINING_LONG_MINS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_REMAINING_LONG_MINS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> minutes left
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_REMAINING_LONG_MINS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_REMAINING_LONG_MINS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> minutes left
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_REMAINING_LONG_MINS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_REMAINING_LONG_MINS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> minutes left
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_REMAINING_LONG_MINS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <message name="IDS_TIME_REMAINING_HOURS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> hours left
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_REMAINING_HOUR_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour left
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_REMAINING_HOUR_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_REMAINING_HOURS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> hours left
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_REMAINING_HOURS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_REMAINING_HOURS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> hours left
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_REMAINING_HOURS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_REMAINING_HOURS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> hours left
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_REMAINING_HOURS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_REMAINING_HOURS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> hours left
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_REMAINING_HOURS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+
+      <message name="IDS_TIME_REMAINING_DAYS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> days left
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_REMAINING_DAY_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> day left
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_REMAINING_DAY_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_REMAINING_DAYS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> days left
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_REMAINING_DAYS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_REMAINING_DAYS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> days left
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_REMAINING_DAYS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_REMAINING_DAYS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> days left
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_REMAINING_DAYS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_REMAINING_DAYS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> days left
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_REMAINING_DAYS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <message name="IDS_TIME_DURATION_LONG_SECS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> seconds
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_DURATION_LONG_SEC_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> second
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_DURATION_LONG_SEC_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_DURATION_LONG_SECS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> seconds
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_DURATION_LONG_SECS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_DURATION_LONG_SECS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> seconds
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_DURATION_LONG_SECS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_DURATION_LONG_SECS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> seconds
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_DURATION_LONG_SECS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_DURATION_LONG_SECS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> seconds
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_DURATION_LONG_SECS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <message name="IDS_TIME_DURATION_LONG_MINS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> minutes
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_DURATION_LONG_MIN_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_DURATION_LONG_MIN_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_DURATION_LONG_MINS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> minutes
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_DURATION_LONG_MINS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_DURATION_LONG_MINS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> minutes
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_DURATION_LONG_MINS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_DURATION_LONG_MINS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> minutes
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_DURATION_LONG_MINS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_DURATION_LONG_MINS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> minutes
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_DURATION_LONG_MINS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <message name="IDS_TIME_ELAPSED_SECS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> secs ago
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_ELAPSED_SEC_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec ago
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_SEC_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_ELAPSED_SECS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> secs ago
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_SECS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_ELAPSED_SECS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> secs ago
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_SECS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_ELAPSED_SECS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> secs ago
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_SECS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_ELAPSED_SECS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> secs ago
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_ELAPSED_SECS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+
+      <message name="IDS_TIME_ELAPSED_MINS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> mins ago
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_ELAPSED_MIN_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> min ago
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_MIN_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_ELAPSED_MINS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> mins ago
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_MINS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_ELAPSED_MINS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> mins ago
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_MINS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_ELAPSED_MINS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> mins ago
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_MINS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_ELAPSED_MINS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> mins ago
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_ELAPSED_MINS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+
+      <message name="IDS_TIME_ELAPSED_HOURS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> hours ago
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_ELAPSED_HOUR_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour ago
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_HOUR_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_ELAPSED_HOURS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> hours ago
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_HOURS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_ELAPSED_HOURS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> hours ago
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_HOURS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_ELAPSED_HOURS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> hours ago
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_HOURS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_ELAPSED_HOURS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> hours ago
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_ELAPSED_HOURS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+
+      <message name="IDS_TIME_ELAPSED_DAYS_DEFAULT"
+               desc="This is necessary for every language. This is the default for all the numbers NOT covered by special cases (singular, dual/two, few, many) some languages need. For CJK, Vietnamese, Turkish and Kannada, this is the only string necessary. For languages with singular-plural distinction, this is the generic plural. For Lithuanian, NUMBER_DEFAULT is 11 .. 19.">
+        <ph name="NUMBER_DEFAULT"><ex>37</ex>#</ph> days ago
+      </message>
+
+      <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message name="IDS_TIME_ELAPSED_DAY_SINGULAR"
+               desc="NUMBER_ONE is one or one-like numbers : 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1,21,31, .. (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, .. (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada">
+        <ph name="NUMBER_ONE"><ex>1</ex>#</ph> day ago
+      </message>
+      </if>
+      <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_DAY_SINGULAR"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ar', 'ro', 'lv']">
+      <message name="IDS_TIME_ELAPSED_DAYS_ZERO"
+               desc="NUMBER_ZERO is 0 (Arabic, Latvian) or 0, 2..19, 101..119, ... (Romanian). For other languages, do NOT translate.">
+        <ph name="NUMBER_ZERO"><ex>0</ex>#</ph> days ago
+      </message>
+      </if>
+      <if expr="lang not in ['ar', 'ro', 'lv']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_DAYS_ZERO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang in ['ga', 'sl', 'ar']">
+      <message name="IDS_TIME_ELAPSED_DAYS_TWO"
+               desc="NUMBER_TWO is two or two-like/dual numbers :  2 (Arabic and Irish) or  2, 102, 202 ... (Slovenian). For other languages, do NOT translated.">
+        <ph name="NUMBER_TWO"><ex>2</ex>#</ph> days ago
+      </message>
+      </if>
+      <if expr="lang not in ['ga', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_DAYS_TWO"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang  in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message name="IDS_TIME_ELAPSED_DAYS_FEW"
+               desc="NUMBER_FEW is few or few-like numbers in Arabic, Russian, Polish, Croatian, Serbian, Ukrainian, Czech, Slovak, Slovenian, Latvian. For other languages, do NOT translate.">
+        <ph name="NUMBER_FEW"><ex>3</ex>#</ph> days ago
+      </message>
+      </if>
+      <if expr="lang not in ['ru', 'lt', 'hr', 'uk', 'cs', 'sk', 'pl', 'sl', 'ar']">
+      <message translateable="false" name="IDS_TIME_ELAPSED_DAYS_FEW"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <if expr="lang == 'ar'">
+      <message name="IDS_TIME_ELAPSED_DAYS_MANY"
+               desc="NUMBER_MANY is 11 through 99 in Arabic. For all other languages, do NOT translate.">
+        <ph name="NUMBER_MANY"><ex>23</ex>#</ph> days ago
+      </message>
+      </if>
+      <if expr="lang != 'ar'">
+      <message translateable="false" name="IDS_TIME_ELAPSED_DAYS_MANY"
+               desc="">
+        NA
+      </message>
+      </if>
+
+      <message name="IDS_PAST_TIME_TODAY" desc="Relative day today">
+        Today
+      </message>
+      <message name="IDS_PAST_TIME_YESTERDAY" desc="Relative day yesterday">
+        Yesterday
+      </message>
+
       <!-- Menus -->
       <message name="IDS_APP_MENU_EMPTY_SUBMENU" desc="Used when a submenu has no entries">
         (empty)
@@ -464,9 +1530,16 @@
       <message name="IDS_MESSAGE_CENTER_SETTINGS_GO_BACK_BUTTON_TOOLTIP" desc="The tooltip on back button that returns from settings to the notification list.">
         Go back to notifications
       </message>
-      <message name="IDS_MESSAGE_CENTER_SETTINGS_DIALOG_DESCRIPTION" desc="The label to describe the settings dialog.">
-        Allow notifications from the following:
-      </message>
+      <if expr="is_macosx">
+        <message name="IDS_MESSAGE_CENTER_SETTINGS_DIALOG_DESCRIPTION" desc="The label to describe the settings dialog.">
+          Allow notifications from the following:
+        </message>
+      </if>
+      <if expr="not is_macosx">
+        <message name="IDS_MESSAGE_CENTER_SETTINGS_DIALOG_DESCRIPTION" desc="The label to describe the settings dialog.">
+          Manage notifications per profile:
+        </message>
+      </if>
       <message name="IDS_MESSAGE_CENTER_SETTINGS" desc="The menu entry or button for visiting the appropriate settings page.">
         Settings...
       </message>
diff --git a/ui/base/theme_provider.h b/ui/base/theme_provider.h
index 007094f..22f70a0 100644
--- a/ui/base/theme_provider.h
+++ b/ui/base/theme_provider.h
@@ -78,29 +78,17 @@
 
 #if defined(OS_MACOSX) && !defined(TOOLKIT_VIEWS)
   // Gets the NSImage with the specified |id|.
-  //
-  // The bitmap is not assumed to exist. If a theme does not provide an image,
-  // if |allow_default| is true, then the default image will be returned, else
-  // this function will return nil.
-  virtual NSImage* GetNSImageNamed(int id, bool allow_default) const = 0;
+  virtual NSImage* GetNSImageNamed(int id) const = 0;
 
   // Gets the NSImage that GetNSImageNamed (above) would return, but returns it
   // as a pattern color.
-  virtual NSColor* GetNSImageColorNamed(int id, bool allow_default) const = 0;
+  virtual NSColor* GetNSImageColorNamed(int id) const = 0;
 
   // Gets the NSColor with the specified |id|.
-  //
-  // The color is not assumed to exist. If a theme does not provide an color, if
-  // |allow_default| is true, then the default color will be returned, else this
-  // function will return nil.
-  virtual NSColor* GetNSColor(int id, bool allow_default) const = 0;
+  virtual NSColor* GetNSColor(int id) const = 0;
 
   // Gets the NSColor for tinting with the specified |id|.
-  //
-  // The tint is not assumed to exist. If a theme does not provide a tint with
-  // that id, if |allow_default| is true, then the default tint will be
-  // returned, else this function will return nil.
-  virtual NSColor* GetNSColorTint(int id, bool allow_default) const = 0;
+  virtual NSColor* GetNSColorTint(int id) const = 0;
 
   // Gets the NSGradient with the specified |id|.
   virtual NSGradient* GetNSGradient(int id) const = 0;
diff --git a/ui/gl/android/surface_texture_bridge.cc b/ui/gl/android/surface_texture_bridge.cc
index 19ce2a7..c4206a9 100644
--- a/ui/gl/android/surface_texture_bridge.cc
+++ b/ui/gl/android/surface_texture_bridge.cc
@@ -43,8 +43,7 @@
 
 namespace gfx {
 
-SurfaceTextureBridge::SurfaceTextureBridge(int texture_id)
-    : texture_id_(texture_id) {
+SurfaceTextureBridge::SurfaceTextureBridge(int texture_id) {
   JNIEnv* env = AttachCurrentThread();
   CHECK(env);
   RegisterNativesIfNeeded(env);
diff --git a/ui/gl/android/surface_texture_bridge.h b/ui/gl/android/surface_texture_bridge.h
index f3f3bcf..fc7fb54 100644
--- a/ui/gl/android/surface_texture_bridge.h
+++ b/ui/gl/android/surface_texture_bridge.h
@@ -53,10 +53,6 @@
   // by calling ANativeWindow_release().
   ANativeWindow* CreateSurface();
 
-  int texture_id() const {
-    return texture_id_;
-  }
-
   const base::android::JavaRef<jobject>& j_surface_texture() const {
     return j_surface_texture_;
   }
@@ -65,8 +61,6 @@
   friend class base::RefCountedThreadSafe<SurfaceTextureBridge>;
   ~SurfaceTextureBridge();
 
-  const int texture_id_;
-
   // Java SurfaceTexture instance.
   base::android::ScopedJavaGlobalRef<jobject> j_surface_texture_;
 
diff --git a/ui/message_center/cocoa/settings_controller.h b/ui/message_center/cocoa/settings_controller.h
index d81b99b..380ae14 100644
--- a/ui/message_center/cocoa/settings_controller.h
+++ b/ui/message_center/cocoa/settings_controller.h
@@ -26,6 +26,7 @@
   // Overridden from NotifierSettingsObserver:
   virtual void UpdateIconImage(const NotifierId& notifier_id,
                                const gfx::Image& icon) OVERRIDE;
+  virtual void NotifierGroupChanged() OVERRIDE;
 
  private:
   MCSettingsController* settings_controller_;  // weak, owns this
diff --git a/ui/message_center/cocoa/settings_controller.mm b/ui/message_center/cocoa/settings_controller.mm
index 45c66ea..f34f9f0 100644
--- a/ui/message_center/cocoa/settings_controller.mm
+++ b/ui/message_center/cocoa/settings_controller.mm
@@ -110,6 +110,8 @@
   [settings_controller_ setIcon:icon.AsNSImage() forNotifierId:notifier_id];
 }
 
+void NotifierSettingsObserverMac::NotifierGroupChanged() {}
+
 }  // namespace message_center
 
 @implementation MCSettingsController
diff --git a/ui/message_center/fake_notifier_settings_provider.cc b/ui/message_center/fake_notifier_settings_provider.cc
index 0695d08..66b193b 100644
--- a/ui/message_center/fake_notifier_settings_provider.cc
+++ b/ui/message_center/fake_notifier_settings_provider.cc
@@ -4,14 +4,36 @@
 
 #include "ui/message_center/fake_notifier_settings_provider.h"
 
+#include "base/strings/utf_string_conversions.h"
+#include "ui/gfx/image/image.h"
+
 namespace message_center {
 
 FakeNotifierSettingsProvider::FakeNotifierSettingsProvider(
     const std::vector<Notifier*>& notifiers)
-    : notifiers_(notifiers), closed_called_count_(0) {}
+    : notifiers_(notifiers),
+      notifier_group_(gfx::Image(),
+                      UTF8ToUTF16("Fake name"),
+                      UTF8ToUTF16("fake@email.com"),
+                      true),
+      closed_called_count_(0) {}
 
 FakeNotifierSettingsProvider::~FakeNotifierSettingsProvider() {}
 
+size_t FakeNotifierSettingsProvider::GetNotifierGroupCount() const { return 1; }
+
+const message_center::NotifierGroup&
+FakeNotifierSettingsProvider::GetNotifierGroupAt(size_t index) const {
+  return notifier_group_;
+}
+
+void FakeNotifierSettingsProvider::SwitchToNotifierGroup(size_t index) {}
+
+const message_center::NotifierGroup&
+FakeNotifierSettingsProvider::GetActiveNotifierGroup() const {
+  return notifier_group_;
+}
+
 void FakeNotifierSettingsProvider::GetNotifierList(
     std::vector<Notifier*>* notifiers) {
   notifiers->clear();
diff --git a/ui/message_center/fake_notifier_settings_provider.h b/ui/message_center/fake_notifier_settings_provider.h
index 47a3549..f2c5cd7 100644
--- a/ui/message_center/fake_notifier_settings_provider.h
+++ b/ui/message_center/fake_notifier_settings_provider.h
@@ -14,7 +14,14 @@
 class FakeNotifierSettingsProvider : public NotifierSettingsProvider {
  public:
   FakeNotifierSettingsProvider(const std::vector<Notifier*>& notifiers);
-  ~FakeNotifierSettingsProvider();
+  virtual ~FakeNotifierSettingsProvider();
+
+  virtual size_t GetNotifierGroupCount() const OVERRIDE;
+  virtual const message_center::NotifierGroup& GetNotifierGroupAt(
+      size_t index) const OVERRIDE;
+  virtual void SwitchToNotifierGroup(size_t index) OVERRIDE;
+  virtual const message_center::NotifierGroup& GetActiveNotifierGroup() const
+      OVERRIDE;
 
   virtual void GetNotifierList(std::vector<Notifier*>* notifiers) OVERRIDE;
 
@@ -31,6 +38,7 @@
  private:
   std::vector<Notifier*> notifiers_;
   std::map<const Notifier*, bool> enabled_;
+  const NotifierGroup notifier_group_;
   int closed_called_count_;
 };
 
diff --git a/ui/message_center/message_center.gyp b/ui/message_center/message_center.gyp
index eac6938..dc1f1ab 100644
--- a/ui/message_center/message_center.gyp
+++ b/ui/message_center/message_center.gyp
@@ -70,6 +70,8 @@
         'views/message_bubble_base.h',
         'views/message_center_bubble.cc',
         'views/message_center_bubble.h',
+        'views/message_center_button_bar.cc',
+        'views/message_center_button_bar.h',
         'views/message_center_view.cc',
         'views/message_center_view.h',
         'views/message_popup_collection.cc',
diff --git a/ui/message_center/notifier_settings.cc b/ui/message_center/notifier_settings.cc
index 85c6097..4355b94 100644
--- a/ui/message_center/notifier_settings.cc
+++ b/ui/message_center/notifier_settings.cc
@@ -50,8 +50,15 @@
 Notifier::~Notifier() {
 }
 
-std::string ToString(
-    NotifierId::SystemComponentNotifierType type) {
+NotifierGroup::NotifierGroup(const gfx::Image& icon,
+                             const string16& name,
+                             const string16& login_info,
+                             size_t index)
+    : icon(icon), name(name), login_info(login_info), index(index) {}
+
+NotifierGroup::~NotifierGroup() {}
+
+std::string ToString(NotifierId::SystemComponentNotifierType type) {
   switch (type) {
     case NotifierId::SCREENSHOT:
       return "screenshot";
diff --git a/ui/message_center/notifier_settings.h b/ui/message_center/notifier_settings.h
index c494048..05fc7fe 100644
--- a/ui/message_center/notifier_settings.h
+++ b/ui/message_center/notifier_settings.h
@@ -84,6 +84,30 @@
   DISALLOW_COPY_AND_ASSIGN(Notifier);
 };
 
+struct MESSAGE_CENTER_EXPORT NotifierGroup {
+  NotifierGroup(const gfx::Image& icon,
+                const string16& name,
+                const string16& login_info,
+                size_t index);
+  ~NotifierGroup();
+
+  // Icon of a notifier group.
+  const gfx::Image icon;
+
+  // Display name of a notifier group.
+  const string16 name;
+
+  // More display information about the notifier group.
+  string16 login_info;
+
+  // Unique identifier for the notifier group so that they can be selected in
+  // the UI.
+  const size_t index;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(NotifierGroup);
+};
+
 MESSAGE_CENTER_EXPORT std::string ToString(
     NotifierId::SystemComponentNotifierType type);
 MESSAGE_CENTER_EXPORT NotifierId::SystemComponentNotifierType
@@ -96,16 +120,36 @@
   // Called when an icon in the controller has been updated.
   virtual void UpdateIconImage(const NotifierId& notifier_id,
                                const gfx::Image& icon) = 0;
+
+  // Called when any change happens to the set of notifier groups.
+  virtual void NotifierGroupChanged() = 0;
 };
 
 // A class used by NotifierSettingsView to integrate with a setting system
 // for the clients of this module.
 class MESSAGE_CENTER_EXPORT NotifierSettingsProvider {
  public:
+  virtual ~NotifierSettingsProvider() {};
+
   // Sets the delegate.
   virtual void AddObserver(NotifierSettingsObserver* observer) = 0;
   virtual void RemoveObserver(NotifierSettingsObserver* observer) = 0;
 
+  // Returns the number of notifier groups available.
+  virtual size_t GetNotifierGroupCount() const = 0;
+
+  // Requests the model for a particular notifier group.
+  virtual const message_center::NotifierGroup& GetNotifierGroupAt(
+      size_t index) const = 0;
+
+  // Informs the settings provider that further requests to GetNotifierList
+  // should return notifiers for the specified notifier group.
+  virtual void SwitchToNotifierGroup(size_t index) = 0;
+
+  // Requests the currently active notifier group.
+  virtual const message_center::NotifierGroup& GetActiveNotifierGroup()
+      const = 0;
+
   // Collects the current notifier list and fills to |notifiers|. Caller takes
   // the ownership of the elements of |notifiers|.
   virtual void GetNotifierList(std::vector<Notifier*>* notifiers) = 0;
diff --git a/ui/message_center/views/message_center_button_bar.cc b/ui/message_center/views/message_center_button_bar.cc
new file mode 100644
index 0000000..b436bf3
--- /dev/null
+++ b/ui/message_center/views/message_center_button_bar.cc
@@ -0,0 +1,210 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/message_center/views/message_center_button_bar.h"
+
+#include "grit/ui_resources.h"
+#include "grit/ui_strings.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/models/simple_menu_model.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/text_constants.h"
+#include "ui/message_center/message_center.h"
+#include "ui/message_center/message_center_style.h"
+#include "ui/message_center/notifier_settings.h"
+#include "ui/message_center/views/message_center_view.h"
+#include "ui/views/controls/button/button.h"
+#include "ui/views/controls/button/image_button.h"
+#include "ui/views/controls/button/label_button.h"
+#include "ui/views/controls/button/menu_button.h"
+#include "ui/views/controls/button/menu_button_listener.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/controls/menu/menu_runner.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/grid_layout.h"
+
+namespace message_center {
+
+namespace {
+const int kButtonSize = 40;
+const int kChevronMargin = 4;
+const int kFooterLeftMargin = 17;
+const int kFooterRightMargin = 14;
+}  // namespace
+
+// NotificationCenterButton ////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+class NotificationCenterButton : public views::ToggleImageButton {
+ public:
+  NotificationCenterButton(views::ButtonListener* listener,
+                           int normal_id,
+                           int hover_id,
+                           int pressed_id,
+                           int text_id);
+
+ protected:
+  // Overridden from views::View:
+  virtual gfx::Size GetPreferredSize() OVERRIDE;
+  virtual void OnPaintFocusBorder(gfx::Canvas* canvas) OVERRIDE;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(NotificationCenterButton);
+};
+
+NotificationCenterButton::NotificationCenterButton(
+    views::ButtonListener* listener,
+    int normal_id,
+    int hover_id,
+    int pressed_id,
+    int text_id)
+    : views::ToggleImageButton(listener) {
+  ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();
+  SetImage(STATE_NORMAL, resource_bundle.GetImageSkiaNamed(normal_id));
+  SetImage(STATE_HOVERED, resource_bundle.GetImageSkiaNamed(hover_id));
+  SetImage(STATE_PRESSED, resource_bundle.GetImageSkiaNamed(pressed_id));
+  SetImageAlignment(views::ImageButton::ALIGN_CENTER,
+                    views::ImageButton::ALIGN_MIDDLE);
+  SetTooltipText(resource_bundle.GetLocalizedString(text_id));
+  set_focusable(true);
+  set_request_focus_on_press(false);
+}
+
+gfx::Size NotificationCenterButton::GetPreferredSize() {
+  return gfx::Size(kButtonSize, kButtonSize);
+}
+
+void NotificationCenterButton::OnPaintFocusBorder(gfx::Canvas* canvas) {
+  if (HasFocus() && (focusable() || IsAccessibilityFocusable())) {
+    canvas->DrawRect(gfx::Rect(2, 1, width() - 4, height() - 3),
+                     kFocusBorderColor);
+  }
+}
+
+// MessageCenterButtonBar /////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+MessageCenterButtonBar::MessageCenterButtonBar(
+    MessageCenterView* message_center_view,
+    MessageCenter* message_center,
+    NotifierSettingsProvider* notifier_settings_provider,
+    bool settings_initially_visible)
+    : message_center_view_(message_center_view),
+      message_center_(message_center),
+      close_all_button_(NULL),
+      quiet_mode_button_(NULL) {
+  if (get_use_acceleration_when_possible())
+    SetPaintToLayer(true);
+  set_background(
+      views::Background::CreateSolidBackground(kMessageCenterBackgroundColor));
+
+  views::Label* notification_label = new views::Label(
+      l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_FOOTER_TITLE));
+  notification_label->SetAutoColorReadabilityEnabled(false);
+  notification_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  notification_label->SetEnabledColor(kRegularTextColor);
+  AddChildView(notification_label);
+
+  views::View* button_container = new views::View;
+  button_container->SetLayoutManager(
+      new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
+  quiet_mode_button_ = new NotificationCenterButton(
+      this,
+      IDR_NOTIFICATION_DO_NOT_DISTURB,
+      IDR_NOTIFICATION_DO_NOT_DISTURB_HOVER,
+      IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED,
+      IDS_MESSAGE_CENTER_QUIET_MODE_BUTTON_TOOLTIP);
+  ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();
+  quiet_mode_button_->SetToggledImage(
+      views::Button::STATE_NORMAL,
+      resource_bundle.GetImageSkiaNamed(
+          IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
+  quiet_mode_button_->SetToggledImage(
+      views::Button::STATE_HOVERED,
+      resource_bundle.GetImageSkiaNamed(
+          IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
+  quiet_mode_button_->SetToggledImage(
+      views::Button::STATE_PRESSED,
+      resource_bundle.GetImageSkiaNamed(
+          IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
+  quiet_mode_button_->SetToggled(message_center->IsQuietMode());
+  button_container->AddChildView(quiet_mode_button_);
+
+  close_all_button_ =
+      new NotificationCenterButton(this,
+                                   IDR_NOTIFICATION_CLEAR_ALL,
+                                   IDR_NOTIFICATION_CLEAR_ALL_HOVER,
+                                   IDR_NOTIFICATION_CLEAR_ALL_PRESSED,
+                                   IDS_MESSAGE_CENTER_CLEAR_ALL);
+  button_container->AddChildView(close_all_button_);
+  settings_button_ =
+      new NotificationCenterButton(this,
+                                   IDR_NOTIFICATION_SETTINGS,
+                                   IDR_NOTIFICATION_SETTINGS_HOVER,
+                                   IDR_NOTIFICATION_SETTINGS_PRESSED,
+                                   IDS_MESSAGE_CENTER_SETTINGS_BUTTON_LABEL);
+  button_container->AddChildView(settings_button_);
+
+  gfx::ImageSkia* settings_image =
+      ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+          IDR_NOTIFICATION_SETTINGS);
+  int image_margin = std::max(0, (kButtonSize - settings_image->width()) / 2);
+  views::GridLayout* layout = new views::GridLayout(this);
+  SetLayoutManager(layout);
+  layout->SetInsets(
+      0, kFooterLeftMargin, 0, std::max(0, kFooterRightMargin - image_margin));
+  views::ColumnSet* column = layout->AddColumnSet(0);
+  column->AddColumn(views::GridLayout::FILL,
+                    views::GridLayout::FILL,
+                    1.0f,
+                    views::GridLayout::USE_PREF,
+                    0,
+                    0);
+  column->AddColumn(views::GridLayout::LEADING,
+                    views::GridLayout::FILL,
+                    0,
+                    views::GridLayout::USE_PREF,
+                    0,
+                    0);
+  layout->StartRow(0, 0);
+  layout->AddView(notification_label);
+  layout->AddView(button_container);
+}
+
+MessageCenterButtonBar::~MessageCenterButtonBar() {}
+
+void MessageCenterButtonBar::SetAllButtonsEnabled(bool enabled) {
+  if (close_all_button_)
+    close_all_button_->SetEnabled(enabled);
+  settings_button_->SetEnabled(enabled);
+  quiet_mode_button_->SetEnabled(enabled);
+}
+
+void MessageCenterButtonBar::SetCloseAllButtonVisible(bool visible) {
+  if (close_all_button_)
+    close_all_button_->SetVisible(visible);
+}
+
+void MessageCenterButtonBar::ChildVisibilityChanged(views::View* child) {
+  InvalidateLayout();
+}
+
+void MessageCenterButtonBar::ButtonPressed(views::Button* sender,
+                                           const ui::Event& event) {
+  if (sender == close_all_button_) {
+    message_center_view()->ClearAllNotifications();
+  } else if (sender == settings_button_) {
+    MessageCenterView* center_view = message_center_view();
+    center_view->SetSettingsVisible(!center_view->settings_visible());
+  } else if (sender == quiet_mode_button_) {
+    if (message_center()->IsQuietMode())
+      message_center()->SetQuietMode(false);
+    else
+      message_center()->EnterQuietModeWithExpire(base::TimeDelta::FromDays(1));
+    quiet_mode_button_->SetToggled(message_center()->IsQuietMode());
+  } else {
+    NOTREACHED();
+  }
+}
+
+}  // namespace message_center
diff --git a/ui/message_center/views/message_center_button_bar.h b/ui/message_center/views/message_center_button_bar.h
new file mode 100644
index 0000000..72b30c9
--- /dev/null
+++ b/ui/message_center/views/message_center_button_bar.h
@@ -0,0 +1,68 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_MESSAGE_CENTER_VIEWS_MESSAGE_CENTER_BUTTON_BAR_H_
+#define UI_MESSAGE_CENTER_VIEWS_MESSAGE_CENTER_BUTTON_BAR_H_
+
+#include "ui/views/controls/button/button.h"
+#include "ui/views/view.h"
+
+namespace views {
+class Label;
+}
+
+namespace message_center {
+
+class ButtonBarSettingsLabel;
+class MessageCenter;
+class MessageCenterTray;
+class MessageCenterView;
+class NotificationCenterButton;
+class NotifierSettingsProvider;
+
+// MessageCenterButtonBar is the class that shows the content outside the main
+// notification area - the label (or NotifierGroup switcher) and the buttons.
+class MessageCenterButtonBar : public views::View,
+                               public views::ButtonListener {
+ public:
+  MessageCenterButtonBar(MessageCenterView* message_center_view,
+                         MessageCenter* message_center,
+                         NotifierSettingsProvider* notifier_settings_provider,
+                         bool settings_initially_visible);
+  virtual ~MessageCenterButtonBar();
+
+  // Enables or disables all of the buttons in the center.  This is used to
+  // prevent user clicks during the close-all animation.
+  virtual void SetAllButtonsEnabled(bool enabled);
+
+  // Sometimes we shouldn't see the close-all button.
+  void SetCloseAllButtonVisible(bool visible);
+
+ private:
+  // Overridden from views::View:
+  virtual void ChildVisibilityChanged(views::View* child) OVERRIDE;
+
+  // Overridden from views::ButtonListener:
+  virtual void ButtonPressed(views::Button* sender,
+                             const ui::Event& event) OVERRIDE;
+
+  MessageCenterView* message_center_view() const {
+    return message_center_view_;
+  }
+  MessageCenter* message_center() const { return message_center_; }
+
+  MessageCenterView* message_center_view_;  // Weak reference.
+  MessageCenter* message_center_;           // Weak reference.
+
+  // Sub-views of the button bar.
+  views::Button* close_all_button_;
+  NotificationCenterButton* settings_button_;
+  NotificationCenterButton* quiet_mode_button_;
+
+  DISALLOW_COPY_AND_ASSIGN(MessageCenterButtonBar);
+};
+
+}  // namespace message_center
+
+#endif  // UI_MESSAGE_CENTER_VIEWS_MESSAGE_CENTER_BUTTON_BAR_H_
diff --git a/ui/message_center/views/message_center_view.cc b/ui/message_center/views/message_center_view.cc
index ee7ac74..9f0d2fd 100644
--- a/ui/message_center/views/message_center_view.cc
+++ b/ui/message_center/views/message_center_view.cc
@@ -10,22 +10,17 @@
 #include "base/memory/weak_ptr.h"
 #include "base/message_loop/message_loop.h"
 #include "base/stl_util.h"
-#include "grit/ui_resources.h"
 #include "grit/ui_strings.h"
 #include "ui/base/animation/multi_animation.h"
 #include "ui/base/animation/slide_animation.h"
 #include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/insets.h"
-#include "ui/gfx/point.h"
 #include "ui/gfx/rect.h"
 #include "ui/gfx/size.h"
-#include "ui/gfx/text_constants.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/message_center_style.h"
-#include "ui/message_center/message_center_tray.h"
-#include "ui/message_center/message_center_util.h"
+#include "ui/message_center/views/message_center_button_bar.h"
 #include "ui/message_center/views/message_view.h"
 #include "ui/message_center/views/notification_view.h"
 #include "ui/message_center/views/notifier_settings_view.h"
@@ -34,238 +29,30 @@
 #include "ui/views/background.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/button/button.h"
-#include "ui/views/controls/button/label_button.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/scroll_view.h"
 #include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
 #include "ui/views/layout/box_layout.h"
-#include "ui/views/layout/grid_layout.h"
-#include "ui/views/painter.h"
 #include "ui/views/widget/widget.h"
 
 namespace message_center {
 
 namespace {
 
-const int kMinScrollViewHeight = 100;
-const int kFooterLeftMargin = 17;
-const int kFooterRightMargin = 14;
-const int kButtonSize = 40;
-const SkColor kNoNotificationsTextColor = SkColorSetRGB(0xb4, 0xb4, 0xb4);
 const SkColor kBorderDarkColor = SkColorSetRGB(0xaa, 0xaa, 0xaa);
-const SkColor kTransparentColor = SkColorSetARGB(0, 0, 0, 0);
 const SkColor kButtonTextHighlightColor = SkColorSetRGB(0x2a, 0x2a, 0x2a);
 const SkColor kButtonTextHoverColor = SkColorSetRGB(0x2a, 0x2a, 0x2a);
+const SkColor kNoNotificationsTextColor = SkColorSetRGB(0xb4, 0xb4, 0xb4);
+const SkColor kTransparentColor = SkColorSetARGB(0, 0, 0, 0);
 const int kAnimateClearingNextNotificationDelayMS = 40;
+const int kButtonBarBorderThickness = 1;
+const int kMinScrollViewHeight = 100;
 
-static const int kDefaultFrameRateHz = 60;
 static const int kDefaultAnimationDurationMs = 120;
+static const int kDefaultFrameRateHz = 60;
 
 }  // namespace
 
-// NotificationCenterButton ////////////////////////////////////////////////////
-
-class NotificationCenterButton : public views::ToggleImageButton {
- public:
-  NotificationCenterButton(views::ButtonListener* listener,
-                           int normal_id,
-                           int hover_id,
-                           int pressed_id,
-                           int text_id);
-
- protected:
-  // Overridden from views::View:
-  virtual gfx::Size GetPreferredSize() OVERRIDE;
-  virtual void OnPaintFocusBorder(gfx::Canvas* canvas) OVERRIDE;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(NotificationCenterButton);
-};
-
-NotificationCenterButton::NotificationCenterButton(
-    views::ButtonListener* listener,
-    int normal_id,
-    int hover_id,
-    int pressed_id,
-    int text_id)
-    : views::ToggleImageButton(listener) {
-  ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();
-  SetImage(STATE_NORMAL, resource_bundle.GetImageSkiaNamed(normal_id));
-  SetImage(STATE_HOVERED, resource_bundle.GetImageSkiaNamed(hover_id));
-  SetImage(STATE_PRESSED, resource_bundle.GetImageSkiaNamed(pressed_id));
-  SetImageAlignment(views::ImageButton::ALIGN_CENTER,
-                    views::ImageButton::ALIGN_MIDDLE);
-  SetTooltipText(resource_bundle.GetLocalizedString(text_id));
-  set_focusable(true);
-  set_request_focus_on_press(false);
-}
-
-gfx::Size NotificationCenterButton::GetPreferredSize() {
-  return gfx::Size(kButtonSize, kButtonSize);
-}
-
-void NotificationCenterButton::OnPaintFocusBorder(gfx::Canvas* canvas) {
-  if (HasFocus() && (focusable() || IsAccessibilityFocusable())) {
-    canvas->DrawRect(gfx::Rect(2, 1, width() - 4, height() - 3),
-                     kFocusBorderColor);
-  }
-}
-
-// MessageCenterButtonBar //////////////////////////////////////////////////
-
-class MessageCenterButtonBar : public views::View,
-                               public views::ButtonListener {
- public:
-  MessageCenterButtonBar(MessageCenterView* message_center_view,
-                         MessageCenter* message_center);
-  virtual ~MessageCenterButtonBar();
-
-  virtual void SetAllButtonsEnabled(bool enabled);
-  void SetCloseAllVisible(bool visible);
-
- private:
-  // Overridden from views::View:
-  virtual void ChildVisibilityChanged(views::View* child) OVERRIDE;
-
-  // Overridden from views::ButtonListener:
-  virtual void ButtonPressed(views::Button* sender, const ui::Event& event)
-      OVERRIDE;
-
-  MessageCenterView* message_center_view() const {
-    return message_center_view_;
-  }
-  MessageCenter* message_center() const { return message_center_; }
-  MessageCenterTray* tray() const { return tray_; }
-  views::Button* close_all_button() const { return close_all_button_; }
-  void set_close_all_button(views::Button* button) {
-    close_all_button_ = button;
-  }
-
-  MessageCenterView* message_center_view_;  // Weak reference.
-  MessageCenter* message_center_;  // Weak reference.
-  MessageCenterTray* tray_;  // Weak reference.
-  views::Button* close_all_button_;
-  NotificationCenterButton* settings_button_;
-  NotificationCenterButton* quiet_mode_button_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageCenterButtonBar);
-};
-
-MessageCenterButtonBar::MessageCenterButtonBar(
-    MessageCenterView* message_center_view,
-    MessageCenter* message_center)
-    : message_center_view_(message_center_view),
-      message_center_(message_center),
-      close_all_button_(NULL) {
-  if (get_use_acceleration_when_possible())
-    SetPaintToLayer(true);
-  set_background(views::Background::CreateSolidBackground(
-      kMessageCenterBackgroundColor));
-
-  views::Label* notification_label = new views::Label(l10n_util::GetStringUTF16(
-      IDS_MESSAGE_CENTER_FOOTER_TITLE));
-  notification_label->SetAutoColorReadabilityEnabled(false);
-  notification_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  notification_label->SetEnabledColor(kRegularTextColor);
-  AddChildView(notification_label);
-
-  views::View* button_container = new views::View;
-  button_container->SetLayoutManager(
-      new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
-  quiet_mode_button_ = new NotificationCenterButton(
-      this,
-      IDR_NOTIFICATION_DO_NOT_DISTURB,
-      IDR_NOTIFICATION_DO_NOT_DISTURB_HOVER,
-      IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED,
-      IDS_MESSAGE_CENTER_QUIET_MODE_BUTTON_TOOLTIP);
-  ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();
-  quiet_mode_button_->SetToggledImage(
-      views::Button::STATE_NORMAL,
-      resource_bundle.GetImageSkiaNamed(
-          IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
-  quiet_mode_button_->SetToggledImage(
-      views::Button::STATE_HOVERED,
-      resource_bundle.GetImageSkiaNamed(
-          IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
-  quiet_mode_button_->SetToggledImage(
-      views::Button::STATE_PRESSED,
-      resource_bundle.GetImageSkiaNamed(
-          IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
-  quiet_mode_button_->SetToggled(message_center->IsQuietMode());
-  button_container->AddChildView(quiet_mode_button_);
-
-  NotificationCenterButton* close_all_button = new NotificationCenterButton(
-      this,
-      IDR_NOTIFICATION_CLEAR_ALL,
-      IDR_NOTIFICATION_CLEAR_ALL_HOVER,
-      IDR_NOTIFICATION_CLEAR_ALL_PRESSED,
-      IDS_MESSAGE_CENTER_CLEAR_ALL);
-  button_container->AddChildView(close_all_button);
-  set_close_all_button(close_all_button);
-  settings_button_ = new NotificationCenterButton(
-      this,
-      IDR_NOTIFICATION_SETTINGS,
-      IDR_NOTIFICATION_SETTINGS_HOVER,
-      IDR_NOTIFICATION_SETTINGS_PRESSED,
-      IDS_MESSAGE_CENTER_SETTINGS_BUTTON_LABEL);
-  button_container->AddChildView(settings_button_);
-
-  gfx::ImageSkia* settings_image =
-      ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
-          IDR_NOTIFICATION_SETTINGS);
-  int image_margin = std::max(0, (kButtonSize - settings_image->width()) / 2);
-  views::GridLayout* layout = new views::GridLayout(this);
-  SetLayoutManager(layout);
-  layout->SetInsets(
-      0, kFooterLeftMargin, 0, std::max(0, kFooterRightMargin - image_margin));
-  views::ColumnSet* column = layout->AddColumnSet(0);
-  column->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
-                    1.0f, views::GridLayout::USE_PREF, 0, 0);
-  column->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL,
-                    0, views::GridLayout::USE_PREF, 0, 0);
-  layout->StartRow(0, 0);
-  layout->AddView(notification_label);
-  layout->AddView(button_container);
-}
-
-MessageCenterButtonBar::~MessageCenterButtonBar() {}
-
-void MessageCenterButtonBar::SetAllButtonsEnabled(bool enabled) {
-  if (close_all_button_)
-    close_all_button_->SetEnabled(enabled);
-  settings_button_->SetEnabled(enabled);
-  quiet_mode_button_->SetEnabled(enabled);
-}
-
-void MessageCenterButtonBar::SetCloseAllVisible(bool visible) {
-  if (close_all_button_)
-    close_all_button_->SetVisible(visible);
-}
-
-// Overridden from views::View:
-void MessageCenterButtonBar::ChildVisibilityChanged(views::View* child) {
-  InvalidateLayout();
-}
-
-// Overridden from views::ButtonListener:
-void MessageCenterButtonBar::ButtonPressed(views::Button* sender,
-                                           const ui::Event& event) {
-  if (sender == close_all_button()) {
-    message_center_view()->ClearAllNotifications();
-  } else if (sender == settings_button_) {
-    MessageCenterView* center_view = static_cast<MessageCenterView*>(parent());
-    center_view->SetSettingsVisible(!center_view->settings_visible());
-  } else if (sender == quiet_mode_button_) {
-    if (message_center()->IsQuietMode())
-      message_center()->SetQuietMode(false);
-    else
-      message_center()->EnterQuietModeWithExpire(base::TimeDelta::FromDays(1));
-    quiet_mode_button_->SetToggled(message_center()->IsQuietMode());
-  } else {
-    NOTREACHED();
-  }
-}
-
 // BoundedScrollView ///////////////////////////////////////////////////////////
 
 // A custom scroll view whose height has a minimum and maximum value and whose
@@ -806,17 +593,33 @@
       tray_(tray),
       top_down_(top_down),
       settings_visible_(initially_settings_visible),
+      source_view_(NULL),
+      source_height_(0),
+      target_view_(NULL),
+      target_height_(0),
       is_closing_(false) {
   message_center_->AddObserver(this);
   set_notify_enter_exit_on_child(true);
   set_background(views::Background::CreateSolidBackground(
       kMessageCenterBackgroundColor));
 
-  button_bar_ = new MessageCenterButtonBar(this, message_center);
+  NotifierSettingsProvider* notifier_settings_provider =
+      message_center_->GetNotifierSettingsProvider();
+  button_bar_ = new MessageCenterButtonBar(this,
+                                           message_center,
+                                           notifier_settings_provider,
+                                           initially_settings_visible);
 
   const int button_height = button_bar_->GetPreferredSize().height();
-  scroller_ = new BoundedScrollView(kMinScrollViewHeight,
-                                    max_height - button_height);
+  button_bar_->set_border(views::Border::CreateSolidSidedBorder(
+      top_down_ ? 0 : kButtonBarBorderThickness,
+      0,
+      top_down_ ? kButtonBarBorderThickness : 0,
+      0,
+      kFooterDelimiterColor));
+
+  scroller_ =
+      new BoundedScrollView(kMinScrollViewHeight, max_height - button_height);
 
   if (get_use_acceleration_when_possible()) {
     scroller_->SetPaintToLayer(true);
@@ -832,8 +635,7 @@
   message_list_view_->AddChildView(no_notifications_message_view_);
   scroller_->SetContents(message_list_view_);
 
-  settings_view_ = new NotifierSettingsView(
-      message_center_->GetNotifierSettingsProvider());
+  settings_view_ = new NotifierSettingsView(notifier_settings_provider);
 
   if (initially_settings_visible)
     scroller_->SetVisible(false);
@@ -915,13 +717,6 @@
   settings_transition_animation_->Start();
 }
 
-void MessageCenterView::SetIsClosing(bool is_closing) {
-  is_closing_ = is_closing;
-  if (is_closing)
-    message_center_->RemoveObserver(this);
-  else
-    message_center_->AddObserver(this);
-}
 
 void MessageCenterView::ClearAllNotifications() {
   if (is_closing_)
@@ -942,11 +737,26 @@
   return message_list_view_->child_count();
 }
 
+void MessageCenterView::OnSettingsChanged() {
+  scroller_->InvalidateLayout();
+  PreferredSizeChanged();
+  Layout();
+}
+
+void MessageCenterView::SetIsClosing(bool is_closing) {
+  is_closing_ = is_closing;
+  if (is_closing)
+    message_center_->RemoveObserver(this);
+  else
+    message_center_->AddObserver(this);
+}
+
 void MessageCenterView::Layout() {
   if (is_closing_)
     return;
 
-  int button_height = button_bar_->GetHeightForWidth(width());
+  int button_height = button_bar_->GetHeightForWidth(width()) +
+                      button_bar_->GetInsets().height();
   // Skip unnecessary re-layout of contents during the resize animation.
   if (settings_transition_animation_ &&
       settings_transition_animation_->is_animating() &&
@@ -966,27 +776,6 @@
                             width(),
                             height() - button_height);
 
-  bool is_scrollable = false;
-  if (scroller_->visible())
-    is_scrollable = scroller_->height() < message_list_view_->height();
-  else
-    is_scrollable = settings_view_->IsScrollable();
-
-  if (is_scrollable && !button_bar_->border()) {
-    // Draw separator line on the top of the button bar if it is on the bottom
-    // or draw it at the bottom if the bar is on the top.
-    button_bar_->set_border(views::Border::CreateSolidSidedBorder(
-        top_down_ ? 0 : 1,
-        0,
-        top_down_ ? 1 : 0,
-        0,
-        kFooterDelimiterColor));
-    button_bar_->SchedulePaint();
-  } else if (!is_scrollable && button_bar_->border()) {
-    button_bar_->set_border(NULL);
-    button_bar_->SchedulePaint();
-  }
-
   button_bar_->SetBounds(0,
                          top_down_ ? 0 : height() - button_height,
                          width(),
@@ -1030,7 +819,8 @@
     content_height += scroller_->GetHeightForWidth(width);
   else
     content_height += settings_view_->GetHeightForWidth(width);
-  return button_bar_->GetHeightForWidth(width) + content_height;
+  return button_bar_->GetHeightForWidth(width) +
+         button_bar_->GetInsets().height() + content_height;
 }
 
 bool MessageCenterView::OnMouseWheel(const ui::MouseWheelEvent& event) {
@@ -1178,15 +968,12 @@
 }
 
 void MessageCenterView::NotificationsChanged() {
-  if (!message_views_.empty()) {
-    no_notifications_message_view_->SetVisible(false);
-    button_bar_->SetCloseAllVisible(true);
-    scroller_->set_focusable(true);
-  } else {
-    no_notifications_message_view_->SetVisible(true);
-    button_bar_->SetCloseAllVisible(false);
-    scroller_->set_focusable(false);
-  }
+  bool no_message_views = message_views_.empty();
+
+  no_notifications_message_view_->SetVisible(no_message_views);
+  button_bar_->SetCloseAllButtonVisible(!no_message_views);
+  scroller_->set_focusable(!no_message_views);
+
   scroller_->InvalidateLayout();
   PreferredSizeChanged();
   Layout();
diff --git a/ui/message_center/views/message_center_view.h b/ui/message_center/views/message_center_view.h
index 506a3a4..d53910c 100644
--- a/ui/message_center/views/message_center_view.h
+++ b/ui/message_center/views/message_center_view.h
@@ -54,6 +54,7 @@
   size_t NumMessageViewsForTest() const;
 
   void SetSettingsVisible(bool visible);
+  void OnSettingsChanged();
   bool settings_visible() const { return settings_visible_; }
 
   void SetIsClosing(bool is_closing);
@@ -86,7 +87,9 @@
 
   MessageCenter* message_center_;  // Weak reference.
   MessageCenterTray* tray_;  // Weak reference.
-  std::vector<MessageView*> message_views_;
+  std::vector<MessageView*> message_views_;  // Weak references.
+
+  // Child views.
   views::ScrollView* scroller_;
   MessageListView* message_list_view_;
   NotifierSettingsView* settings_view_;
@@ -96,12 +99,18 @@
 
   // Data for transition animation between settings view and message list.
   bool settings_visible_;
-  views::View* source_view_;
-  views::View* target_view_;
-  int source_height_;
-  int target_height_;
+
+  // Animation managing transition between message center and settings (and vice
+  // versa).
   scoped_ptr<ui::MultiAnimation> settings_transition_animation_;
 
+  // Helper data to keep track of the transition between settings and
+  // message center views.
+  views::View* source_view_;
+  int source_height_;
+  views::View* target_view_;
+  int target_height_;
+
   // True when the widget is closing so that further operations should be
   // ignored.
   bool is_closing_;
diff --git a/ui/message_center/views/notifier_settings_view.cc b/ui/message_center/views/notifier_settings_view.cc
index 5673070..b97bc84 100644
--- a/ui/message_center/views/notifier_settings_view.cc
+++ b/ui/message_center/views/notifier_settings_view.cc
@@ -8,14 +8,18 @@
 #include <string>
 
 #include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
 #include "grit/ui_resources.h"
 #include "grit/ui_strings.h"
+#include "skia/ext/image_operations.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/base/keycodes/keyboard_codes.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/models/simple_menu_model.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/image/image.h"
+#include "ui/gfx/image/image_skia_operations.h"
 #include "ui/gfx/size.h"
 #include "ui/message_center/message_center_style.h"
 #include "ui/message_center/views/message_center_view.h"
@@ -23,8 +27,10 @@
 #include "ui/views/border.h"
 #include "ui/views/controls/button/checkbox.h"
 #include "ui/views/controls/button/custom_button.h"
+#include "ui/views/controls/button/menu_button.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/label.h"
+#include "ui/views/controls/menu/menu_runner.h"
 #include "ui/views/controls/scroll_view.h"
 #include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
 #include "ui/views/layout/box_layout.h"
@@ -114,6 +120,78 @@
 
 }  // namespace
 
+// NotifierGroupMenuModel //////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+class NotifierGroupMenuModel : public ui::SimpleMenuModel,
+                               public ui::SimpleMenuModel::Delegate {
+ public:
+  NotifierGroupMenuModel(NotifierSettingsProvider* notifier_settings_provider);
+  virtual ~NotifierGroupMenuModel();
+
+  // Overridden from ui::SimpleMenuModel::Delegate:
+  virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
+  virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
+  virtual bool GetAcceleratorForCommandId(
+      int command_id,
+      ui::Accelerator* accelerator) OVERRIDE;
+  virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
+
+ private:
+  NotifierSettingsProvider* notifier_settings_provider_;
+};
+
+NotifierGroupMenuModel::NotifierGroupMenuModel(
+    NotifierSettingsProvider* notifier_settings_provider)
+    : ui::SimpleMenuModel(this),
+      notifier_settings_provider_(notifier_settings_provider) {
+  if (!notifier_settings_provider_)
+    return;
+
+  size_t num_menu_items = notifier_settings_provider_->GetNotifierGroupCount();
+  for (size_t i = 0; i < num_menu_items; ++i) {
+    const NotifierGroup& group =
+        notifier_settings_provider_->GetNotifierGroupAt(i);
+
+    AddItem(i, group.login_info.empty() ? group.name : group.login_info);
+
+    gfx::ImageSkia resized_icon = gfx::ImageSkiaOperations::CreateResizedImage(
+        *group.icon.ToImageSkia(),
+        skia::ImageOperations::RESIZE_BETTER,
+        gfx::Size(kSettingsIconSize, kSettingsIconSize));
+
+    SetIcon(i, gfx::Image(resized_icon));
+  }
+}
+
+NotifierGroupMenuModel::~NotifierGroupMenuModel() {}
+
+bool NotifierGroupMenuModel::IsCommandIdChecked(int command_id) const {
+  return false;
+}
+
+bool NotifierGroupMenuModel::IsCommandIdEnabled(int command_id) const {
+  return true;
+}
+
+bool NotifierGroupMenuModel::GetAcceleratorForCommandId(
+    int command_id,
+    ui::Accelerator* accelerator) {
+  return false;
+}
+
+void NotifierGroupMenuModel::ExecuteCommand(int command_id, int event_flags) {
+  if (!notifier_settings_provider_)
+    return;
+
+  size_t notifier_group_index = static_cast<size_t>(command_id);
+  size_t num_notifier_groups =
+      notifier_settings_provider_->GetNotifierGroupCount();
+  if (notifier_group_index >= num_notifier_groups)
+    return;
+
+  notifier_settings_provider_->SwitchToNotifierGroup(notifier_group_index);
+}
+
 // We do not use views::Checkbox class directly because it doesn't support
 // showing 'icon'.
 class NotifierSettingsView::NotifierButton : public views::CustomButton,
@@ -240,30 +318,11 @@
   scroller_->SetVerticalScrollBar(new views::OverlayScrollBar(false));
   AddChildView(scroller_);
 
-  views::View* contents_view = new views::View();
-  contents_view->SetLayoutManager(new views::BoxLayout(
-      views::BoxLayout::kVertical, 0, 0, 0));
-
-  views::Label* top_label = new views::Label(l10n_util::GetStringUTF16(
-      IDS_MESSAGE_CENTER_SETTINGS_DIALOG_DESCRIPTION));
-  top_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  top_label->SetMultiLine(true);
-  top_label->SizeToFit(kMinimumWindowWidth - kMarginWidth * 2);
-  contents_view->AddChildView(new EntryView(top_label));
-
   std::vector<Notifier*> notifiers;
   if (provider_)
     provider_->GetNotifierList(&notifiers);
-  for (size_t i = 0; i < notifiers.size(); ++i) {
-    NotifierButton* button = new NotifierButton(notifiers[i], this);
-    EntryView* entry = new EntryView(button);
-    entry->set_focusable(true);
-    contents_view->AddChildView(entry);
-    buttons_.insert(button);
-  }
-  scroller_->SetContents(contents_view);
 
-  contents_view->SetBoundsRect(gfx::Rect(contents_view->GetPreferredSize()));
+  UpdateContentsView(notifiers);
 }
 
 NotifierSettingsView::~NotifierSettingsView() {
@@ -287,6 +346,57 @@
   }
 }
 
+void NotifierSettingsView::NotifierGroupChanged() {
+  std::vector<Notifier*> notifiers;
+  if (provider_)
+    provider_->GetNotifierList(&notifiers);
+
+  UpdateContentsView(notifiers);
+}
+
+void NotifierSettingsView::UpdateContentsView(
+    const std::vector<Notifier*>& notifiers) {
+  buttons_.clear();
+
+  views::View* contents_view = new views::View();
+  contents_view->SetLayoutManager(
+      new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0));
+
+  views::View* contents_title_view = new views::View();
+  contents_title_view->SetLayoutManager(
+      new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 5));
+  views::Label* top_label = new views::Label(l10n_util::GetStringUTF16(
+      IDS_MESSAGE_CENTER_SETTINGS_DIALOG_DESCRIPTION));
+  top_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  top_label->SetMultiLine(true);
+  contents_title_view->AddChildView(top_label);
+
+  string16 notifier_group_text;
+  if (provider_) {
+    const NotifierGroup& active_group = provider_->GetActiveNotifierGroup();
+    notifier_group_text = active_group.login_info.empty()
+                              ? active_group.name
+                              : active_group.login_info;
+  }
+
+  views::View* notifier_group_selector =
+      new views::MenuButton(NULL, notifier_group_text, this, true);
+  contents_title_view->AddChildView(notifier_group_selector);
+  contents_view->AddChildView(new EntryView(contents_title_view));
+
+  for (size_t i = 0; i < notifiers.size(); ++i) {
+    NotifierButton* button = new NotifierButton(notifiers[i], this);
+    EntryView* entry = new EntryView(button);
+    entry->set_focusable(true);
+    contents_view->AddChildView(entry);
+    buttons_.insert(button);
+  }
+  scroller_->SetContents(contents_view);
+
+  contents_view->SetBoundsRect(gfx::Rect(contents_view->GetPreferredSize()));
+  InvalidateLayout();
+}
+
 void NotifierSettingsView::Layout() {
   int title_height = title_entry_->GetHeightForWidth(width());
   title_entry_->SetBounds(0, 0, width(), title_height);
@@ -343,11 +453,30 @@
 
   std::set<NotifierButton*>::iterator iter = buttons_.find(
       static_cast<NotifierButton*>(sender));
-  DCHECK(iter != buttons_.end());
+
+  if (iter == buttons_.end())
+    return;
 
   (*iter)->SetChecked(!(*iter)->checked());
   if (provider_)
     provider_->SetNotifierEnabled((*iter)->notifier(), (*iter)->checked());
 }
 
+void NotifierSettingsView::OnMenuButtonClicked(views::View* source,
+                                               const gfx::Point& point) {
+  notifier_group_menu_model_.reset(new NotifierGroupMenuModel(provider_));
+  notifier_group_menu_runner_.reset(
+      new views::MenuRunner(notifier_group_menu_model_.get()));
+  if (views::MenuRunner::MENU_DELETED ==
+      notifier_group_menu_runner_->RunMenuAt(GetWidget(),
+                                             NULL,
+                                             source->GetBoundsInScreen(),
+                                             views::MenuItemView::BUBBLE_ABOVE,
+                                             ui::MENU_SOURCE_MOUSE,
+                                             views::MenuRunner::CONTEXT_MENU))
+    return;
+  MessageCenterView* center_view = static_cast<MessageCenterView*>(parent());
+  center_view->OnSettingsChanged();
+}
+
 }  // namespace message_center
diff --git a/ui/message_center/views/notifier_settings_view.h b/ui/message_center/views/notifier_settings_view.h
index 303eff4..6fc5b58 100644
--- a/ui/message_center/views/notifier_settings_view.h
+++ b/ui/message_center/views/notifier_settings_view.h
@@ -5,20 +5,30 @@
 #ifndef UI_MESSAGE_CENTER_VIEWS_NOTIFIER_SETTINGS_VIEW_H_
 #define UI_MESSAGE_CENTER_VIEWS_NOTIFIER_SETTINGS_VIEW_H_
 
+#include <set>
+
+#include "base/memory/scoped_ptr.h"
 #include "ui/message_center/message_center_export.h"
 #include "ui/message_center/notifier_settings.h"
 #include "ui/message_center/views/message_bubble_base.h"
 #include "ui/views/controls/button/image_button.h"
+#include "ui/views/controls/button/menu_button_listener.h"
 #include "ui/views/view.h"
 
+namespace views {
+class MenuRunner;
+}
+
 namespace message_center {
+class NotifierGroupMenuModel;
 
 // A class to show the list of notifier extensions / URL patterns and allow
 // users to customize the settings.
 class MESSAGE_CENTER_EXPORT NotifierSettingsView
     : public NotifierSettingsObserver,
       public views::View,
-      public views::ButtonListener {
+      public views::ButtonListener,
+      public views::MenuButtonListener {
  public:
   explicit NotifierSettingsView(NotifierSettingsProvider* provider);
   virtual ~NotifierSettingsView();
@@ -28,6 +38,7 @@
   // Overridden from NotifierSettingsDelegate:
   virtual void UpdateIconImage(const NotifierId& notifier_id,
                                const gfx::Image& icon) OVERRIDE;
+  virtual void NotifierGroupChanged() OVERRIDE;
 
   void set_provider(NotifierSettingsProvider* new_provider) {
     provider_ = new_provider;
@@ -36,6 +47,9 @@
  private:
   class NotifierButton;
 
+  // Given a new list of notifiers, updates the view to reflect it.
+  void UpdateContentsView(const std::vector<Notifier*>& notifiers);
+
   // Overridden from views::View:
   virtual void Layout() OVERRIDE;
   virtual gfx::Size GetMinimumSize() OVERRIDE;
@@ -46,12 +60,16 @@
   // Overridden from views::ButtonListener:
   virtual void ButtonPressed(views::Button* sender,
                              const ui::Event& event) OVERRIDE;
+  virtual void OnMenuButtonClicked(views::View* source,
+                                   const gfx::Point& point) OVERRIDE;
 
   views::ImageButton* title_arrow_;
   views::View* title_entry_;
   views::ScrollView* scroller_;
   NotifierSettingsProvider* provider_;
   std::set<NotifierButton*> buttons_;
+  scoped_ptr<NotifierGroupMenuModel> notifier_group_menu_model_;
+  scoped_ptr<views::MenuRunner> notifier_group_menu_runner_;
 
   DISALLOW_COPY_AND_ASSIGN(NotifierSettingsView);
 };
diff --git a/ui/surface/accelerated_surface_win.cc b/ui/surface/accelerated_surface_win.cc
index cc144ef..3b86db0 100644
--- a/ui/surface/accelerated_surface_win.cc
+++ b/ui/surface/accelerated_surface_win.cc
@@ -728,7 +728,6 @@
     return;
   }
 
-#if !defined(USE_AURA)
   // If the window is a different size than the swap chain that is being
   // presented then drop the frame.
   gfx::Size window_size = GetWindowSize();
@@ -751,7 +750,6 @@
                  "windowheight", window_size.height());
     return;
   }
-#endif
 
   // Round up size so the swap chain is not continuously resized with the
   // surface, which could lead to memory fragmentation.
diff --git a/ui/ui.gyp b/ui/ui.gyp
index 0cd6abd..e17d242 100644
--- a/ui/ui.gyp
+++ b/ui/ui.gyp
@@ -259,6 +259,8 @@
         'base/l10n/l10n_util_posix.cc',
         'base/l10n/l10n_util_win.cc',
         'base/l10n/l10n_util_win.h',
+        'base/l10n/time_format.cc',
+        'base/l10n/time_format.h',
         'base/layout.cc',
         'base/layout.h',
         'base/layout_mac.mm',
diff --git a/ui/ui.target.darwin-arm.mk b/ui/ui.target.darwin-arm.mk
index 602d86c..f3e940a 100644
--- a/ui/ui.target.darwin-arm.mk
+++ b/ui/ui.target.darwin-arm.mk
@@ -59,6 +59,7 @@
 	ui/base/l10n/l10n_util.cc \
 	ui/base/l10n/l10n_util_android.cc \
 	ui/base/l10n/l10n_util_posix.cc \
+	ui/base/l10n/time_format.cc \
 	ui/base/layout.cc \
 	ui/base/models/button_menu_item_model.cc \
 	ui/base/models/combobox_model.cc \
diff --git a/ui/ui.target.darwin-mips.mk b/ui/ui.target.darwin-mips.mk
index 5b22a3c..7a521ee 100644
--- a/ui/ui.target.darwin-mips.mk
+++ b/ui/ui.target.darwin-mips.mk
@@ -59,6 +59,7 @@
 	ui/base/l10n/l10n_util.cc \
 	ui/base/l10n/l10n_util_android.cc \
 	ui/base/l10n/l10n_util_posix.cc \
+	ui/base/l10n/time_format.cc \
 	ui/base/layout.cc \
 	ui/base/models/button_menu_item_model.cc \
 	ui/base/models/combobox_model.cc \
diff --git a/ui/ui.target.darwin-x86.mk b/ui/ui.target.darwin-x86.mk
index f2a0f18..9c93235 100644
--- a/ui/ui.target.darwin-x86.mk
+++ b/ui/ui.target.darwin-x86.mk
@@ -59,6 +59,7 @@
 	ui/base/l10n/l10n_util.cc \
 	ui/base/l10n/l10n_util_android.cc \
 	ui/base/l10n/l10n_util_posix.cc \
+	ui/base/l10n/time_format.cc \
 	ui/base/layout.cc \
 	ui/base/models/button_menu_item_model.cc \
 	ui/base/models/combobox_model.cc \
diff --git a/ui/ui.target.linux-arm.mk b/ui/ui.target.linux-arm.mk
index 602d86c..f3e940a 100644
--- a/ui/ui.target.linux-arm.mk
+++ b/ui/ui.target.linux-arm.mk
@@ -59,6 +59,7 @@
 	ui/base/l10n/l10n_util.cc \
 	ui/base/l10n/l10n_util_android.cc \
 	ui/base/l10n/l10n_util_posix.cc \
+	ui/base/l10n/time_format.cc \
 	ui/base/layout.cc \
 	ui/base/models/button_menu_item_model.cc \
 	ui/base/models/combobox_model.cc \
diff --git a/ui/ui.target.linux-mips.mk b/ui/ui.target.linux-mips.mk
index 5b22a3c..7a521ee 100644
--- a/ui/ui.target.linux-mips.mk
+++ b/ui/ui.target.linux-mips.mk
@@ -59,6 +59,7 @@
 	ui/base/l10n/l10n_util.cc \
 	ui/base/l10n/l10n_util_android.cc \
 	ui/base/l10n/l10n_util_posix.cc \
+	ui/base/l10n/time_format.cc \
 	ui/base/layout.cc \
 	ui/base/models/button_menu_item_model.cc \
 	ui/base/models/combobox_model.cc \
diff --git a/ui/ui.target.linux-x86.mk b/ui/ui.target.linux-x86.mk
index f2a0f18..9c93235 100644
--- a/ui/ui.target.linux-x86.mk
+++ b/ui/ui.target.linux-x86.mk
@@ -59,6 +59,7 @@
 	ui/base/l10n/l10n_util.cc \
 	ui/base/l10n/l10n_util_android.cc \
 	ui/base/l10n/l10n_util_posix.cc \
+	ui/base/l10n/time_format.cc \
 	ui/base/layout.cc \
 	ui/base/models/button_menu_item_model.cc \
 	ui/base/models/combobox_model.cc \
diff --git a/ui/ui_unittests.gypi b/ui/ui_unittests.gypi
index d5db0d5..dc46a55 100644
--- a/ui/ui_unittests.gypi
+++ b/ui/ui_unittests.gypi
@@ -99,6 +99,7 @@
         'base/l10n/l10n_util_mac_unittest.mm',
         'base/l10n/l10n_util_unittest.cc',
         'base/l10n/l10n_util_win_unittest.cc',
+        'base/l10n/time_format_unittest.cc',
         'base/models/tree_node_iterator_unittest.cc',
         'base/range/range_mac_unittest.mm',
         'base/range/range_unittest.cc',
diff --git a/ui/views/ime/input_method_win.cc b/ui/views/ime/input_method_win.cc
deleted file mode 100644
index 5ec7c72..0000000
--- a/ui/views/ime/input_method_win.cc
+++ /dev/null
@@ -1,509 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/views/ime/input_method_win.h"
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "ui/base/events/event.h"
-#include "ui/base/events/event_constants.h"
-#include "ui/base/events/event_utils.h"
-#include "ui/base/ime/composition_text.h"
-#include "ui/base/ime/input_method.h"
-#include "ui/base/ime/text_input_client.h"
-#include "ui/base/keycodes/keyboard_codes.h"
-#include "ui/base/win/hwnd_util.h"
-
-// Extra number of chars before and after selection (or composition) range which
-// is returned to IME for improving conversion accuracy.
-static const size_t kExtraNumberOfChars = 20;
-
-namespace views {
-
-InputMethodWin::InputMethodWin(internal::InputMethodDelegate* delegate,
-                               HWND hwnd,
-                               ui::InputMethod* host)
-    : hwnd_(hwnd),
-      active_(false),
-      is_candidate_popup_open_(false),
-      direction_(base::i18n::UNKNOWN_DIRECTION),
-      pending_requested_direction_(base::i18n::UNKNOWN_DIRECTION),
-      host_(host) {
-  SetDelegate(delegate);
-}
-
-InputMethodWin::~InputMethodWin() {
-  if (widget())
-    imm32_manager_.DisableIME(hwnd_);
-}
-
-void InputMethodWin::Init(Widget* widget) {
-  InputMethodBase::Init(widget);
-
-  // Gets the initial input locale and text direction information.
-  OnInputLocaleChanged();
-}
-
-void InputMethodWin::OnFocus() {
-  UpdateIMEState();
-}
-
-void InputMethodWin::OnBlur() {
-  ConfirmCompositionText();
-}
-
-bool InputMethodWin::OnUntranslatedIMEMessage(const base::NativeEvent& event,
-                                              NativeEventResult* result) {
-  LRESULT original_result = 0;
-  BOOL handled = FALSE;
-  switch (event.message) {
-    case WM_IME_SETCONTEXT:
-      original_result = OnImeSetContext(
-          event.message, event.wParam, event.lParam, &handled);
-      break;
-    case WM_IME_STARTCOMPOSITION:
-      original_result = OnImeStartComposition(
-          event.message, event.wParam, event.lParam, &handled);
-      break;
-    case WM_IME_COMPOSITION:
-      original_result = OnImeComposition(
-          event.message, event.wParam, event.lParam, &handled);
-      break;
-    case WM_IME_ENDCOMPOSITION:
-      original_result = OnImeEndComposition(
-          event.message, event.wParam, event.lParam, &handled);
-      break;
-    case WM_IME_REQUEST:
-      original_result = OnImeRequest(
-          event.message, event.wParam, event.lParam, &handled);
-      break;
-    case WM_IME_NOTIFY:
-      original_result = OnImeNotify(
-          event.message, event.wParam, event.lParam, &handled);
-      break;
-    case WM_CHAR:
-    case WM_SYSCHAR:
-      original_result = OnChar(
-          event.message, event.wParam, event.lParam, &handled);
-      break;
-    case WM_DEADCHAR:
-    case WM_SYSDEADCHAR:
-      original_result = OnDeadChar(
-          event.message, event.wParam, event.lParam, &handled);
-      break;
-    default:
-      NOTREACHED() << "Unknown IME message:" << event.message;
-      break;
-  }
-  if (result)
-    *result = original_result;
-  return !!handled;
-}
-
-void InputMethodWin::DispatchKeyEvent(const ui::KeyEvent& key) {
-  // Handles ctrl-shift key to change text direction and layout alignment.
-  if (ui::IMM32Manager::IsRTLKeyboardLayoutInstalled() &&
-      !IsTextInputTypeNone()) {
-    ui::KeyboardCode code = key.key_code();
-    if (key.type() == ui::ET_KEY_PRESSED) {
-      if (code == ui::VKEY_SHIFT) {
-        base::i18n::TextDirection dir;
-        if (ui::IMM32Manager::IsCtrlShiftPressed(&dir))
-          pending_requested_direction_ = dir;
-      } else if (code != ui::VKEY_CONTROL) {
-        pending_requested_direction_ = base::i18n::UNKNOWN_DIRECTION;
-      }
-    } else if (key.type() == ui::ET_KEY_RELEASED &&
-               (code == ui::VKEY_SHIFT || code == ui::VKEY_CONTROL) &&
-               pending_requested_direction_ != base::i18n::UNKNOWN_DIRECTION) {
-      GetTextInputClient()->ChangeTextDirectionAndLayoutAlignment(
-          pending_requested_direction_);
-      pending_requested_direction_ = base::i18n::UNKNOWN_DIRECTION;
-    }
-  }
-
-  DispatchKeyEventPostIME(key);
-}
-
-void InputMethodWin::OnTextInputTypeChanged(View* view) {
-  if (IsViewFocused(view)) {
-    imm32_manager_.CancelIME(hwnd_);
-    UpdateIMEState();
-  }
-  InputMethodBase::OnTextInputTypeChanged(view);
-}
-
-void InputMethodWin::OnCaretBoundsChanged(View* view) {
-  gfx::Rect rect;
-  if (!IsViewFocused(view) || !GetCaretBoundsInWidget(&rect))
-    return;
-  imm32_manager_.UpdateCaretRect(hwnd_, rect);
-}
-
-void InputMethodWin::CancelComposition(View* view) {
-  if (IsViewFocused(view))
-    imm32_manager_.CancelIME(hwnd_);
-}
-
-void InputMethodWin::OnInputLocaleChanged() {
-  active_ = imm32_manager_.SetInputLanguage();
-  locale_ = imm32_manager_.GetInputLanguageName();
-  direction_ = imm32_manager_.GetTextDirection();
-  OnInputMethodChanged();
-}
-
-std::string InputMethodWin::GetInputLocale() {
-  return locale_;
-}
-
-base::i18n::TextDirection InputMethodWin::GetInputTextDirection() {
-  return direction_;
-}
-
-bool InputMethodWin::IsActive() {
-  return active_;
-}
-
-ui::TextInputClient* InputMethodWin::GetTextInputClient() const {
-  if (InputMethodBase::GetTextInputClient())
-    return InputMethodBase::GetTextInputClient();
-
-  return host_ ? host_->GetTextInputClient() : NULL;
-}
-
-bool InputMethodWin::IsCandidatePopupOpen() const {
-  return is_candidate_popup_open_;
-}
-
-void InputMethodWin::OnWillChangeFocus(View* focused_before, View* focused) {
-  ConfirmCompositionText();
-}
-
-void InputMethodWin::OnDidChangeFocus(View* focused_before, View* focused) {
-  UpdateIMEState();
-}
-
-LRESULT InputMethodWin::OnImeSetContext(
-    UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled) {
-  active_ = (wparam == TRUE);
-  if (active_)
-    imm32_manager_.CreateImeWindow(hwnd_);
-
-  OnInputMethodChanged();
-  return imm32_manager_.SetImeWindowStyle(hwnd_, message, wparam, lparam,
-                                          handled);
-}
-
-LRESULT InputMethodWin::OnImeStartComposition(
-    UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled) {
-  // We have to prevent WTL from calling ::DefWindowProc() because the function
-  // calls ::ImmSetCompositionWindow() and ::ImmSetCandidateWindow() to
-  // over-write the position of IME windows.
-  *handled = TRUE;
-
-  if (IsTextInputTypeNone())
-    return 0;
-
-  // Reset the composition status and create IME windows.
-  imm32_manager_.CreateImeWindow(hwnd_);
-  imm32_manager_.ResetComposition(hwnd_);
-  return 0;
-}
-
-LRESULT InputMethodWin::OnImeComposition(
-    UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled) {
-  // We have to prevent WTL from calling ::DefWindowProc() because we do not
-  // want for the IMM (Input Method Manager) to send WM_IME_CHAR messages.
-  *handled = TRUE;
-
-  if (IsTextInputTypeNone())
-    return 0;
-
-  // At first, update the position of the IME window.
-  imm32_manager_.UpdateImeWindow(hwnd_);
-
-  // Retrieve the result string and its attributes of the ongoing composition
-  // and send it to a renderer process.
-  ui::CompositionText composition;
-  if (imm32_manager_.GetResult(hwnd_, lparam, &composition.text)) {
-    GetTextInputClient()->InsertText(composition.text);
-    imm32_manager_.ResetComposition(hwnd_);
-    // Fall though and try reading the composition string.
-    // Japanese IMEs send a message containing both GCS_RESULTSTR and
-    // GCS_COMPSTR, which means an ongoing composition has been finished
-    // by the start of another composition.
-  }
-  // Retrieve the composition string and its attributes of the ongoing
-  // composition and send it to a renderer process.
-  if (imm32_manager_.GetComposition(hwnd_, lparam, &composition))
-    GetTextInputClient()->SetCompositionText(composition);
-
-  return 0;
-}
-
-LRESULT InputMethodWin::OnImeEndComposition(
-    UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled) {
-  // Let WTL call ::DefWindowProc() and release its resources.
-  *handled = FALSE;
-
-  if (IsTextInputTypeNone())
-    return 0;
-
-  if (GetTextInputClient()->HasCompositionText())
-    GetTextInputClient()->ClearCompositionText();
-
-  imm32_manager_.ResetComposition(hwnd_);
-  imm32_manager_.DestroyImeWindow(hwnd_);
-  return 0;
-}
-
-LRESULT InputMethodWin::OnImeRequest(
-    UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled) {
-  *handled = FALSE;
-
-  // Should not receive WM_IME_REQUEST message, if IME is disabled.
-  const ui::TextInputType type = GetTextInputType();
-  if (type == ui::TEXT_INPUT_TYPE_NONE ||
-      type == ui::TEXT_INPUT_TYPE_PASSWORD) {
-    return 0;
-  }
-
-  switch (wparam) {
-    case IMR_RECONVERTSTRING:
-      *handled = TRUE;
-      return OnReconvertString(reinterpret_cast<RECONVERTSTRING*>(lparam));
-    case IMR_DOCUMENTFEED:
-      *handled = TRUE;
-      return OnDocumentFeed(reinterpret_cast<RECONVERTSTRING*>(lparam));
-    case IMR_QUERYCHARPOSITION:
-      *handled = TRUE;
-      return OnQueryCharPosition(reinterpret_cast<IMECHARPOSITION*>(lparam));
-    default:
-      return 0;
-  }
-}
-
-LRESULT InputMethodWin::OnImeNotify(
-    UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled) {
-  *handled = FALSE;
-
-  // Update |is_candidate_popup_open_|, whether a candidate window is open.
-  switch (wparam) {
-  case IMN_OPENCANDIDATE:
-    is_candidate_popup_open_ = true;
-    break;
-  case IMN_CLOSECANDIDATE:
-    is_candidate_popup_open_ = false;
-    break;
-  }
-
-  return 0;
-}
-
-LRESULT InputMethodWin::OnChar(
-    UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled) {
-  *handled = TRUE;
-
-  // We need to send character events to the focused text input client event if
-  // its text input type is ui::TEXT_INPUT_TYPE_NONE.
-  if (GetTextInputClient()) {
-    GetTextInputClient()->InsertChar(static_cast<char16>(wparam),
-                                     ui::GetModifiersFromKeyState());
-  }
-
-  // Explicitly show the system menu at a good location on [Alt]+[Space].
-  // Note: Setting |handled| to FALSE for DefWindowProc triggering of the system
-  //       menu causes unsdesirable titlebar artifacts in the classic theme.
-  if (message == WM_SYSCHAR && wparam == VK_SPACE)
-    ui::ShowSystemMenu(hwnd_);
-
-  return 0;
-}
-
-LRESULT InputMethodWin::OnDeadChar(
-    UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled) {
-  *handled = TRUE;
-
-  if (IsTextInputTypeNone())
-    return 0;
-
-  if (!GetTextInputClient())
-    return 0;
-
-  // Shows the dead character as a composition text, so that the user can know
-  // what dead key was pressed.
-  ui::CompositionText composition;
-  composition.text.assign(1, static_cast<char16>(wparam));
-  composition.selection = ui::Range(0, 1);
-  composition.underlines.push_back(
-      ui::CompositionUnderline(0, 1, SK_ColorBLACK, false));
-  GetTextInputClient()->SetCompositionText(composition);
-  return 0;
-}
-
-LRESULT InputMethodWin::OnDocumentFeed(RECONVERTSTRING* reconv) {
-  ui::TextInputClient* client = GetTextInputClient();
-  if (!client)
-    return 0;
-
-  ui::Range text_range;
-  if (!client->GetTextRange(&text_range) || text_range.is_empty())
-    return 0;
-
-  bool result = false;
-  ui::Range target_range;
-  if (client->HasCompositionText())
-    result = client->GetCompositionTextRange(&target_range);
-
-  if (!result || target_range.is_empty()) {
-    if (!client->GetSelectionRange(&target_range) ||
-        !target_range.IsValid()) {
-      return 0;
-    }
-  }
-
-  if (!text_range.Contains(target_range))
-    return 0;
-
-  if (target_range.GetMin() - text_range.start() > kExtraNumberOfChars)
-    text_range.set_start(target_range.GetMin() - kExtraNumberOfChars);
-
-  if (text_range.end() - target_range.GetMax() > kExtraNumberOfChars)
-    text_range.set_end(target_range.GetMax() + kExtraNumberOfChars);
-
-  size_t len = text_range.length();
-  size_t need_size = sizeof(RECONVERTSTRING) + len * sizeof(WCHAR);
-
-  if (!reconv)
-    return need_size;
-
-  if (reconv->dwSize < need_size)
-    return 0;
-
-  string16 text;
-  if (!GetTextInputClient()->GetTextFromRange(text_range, &text))
-    return 0;
-  DCHECK_EQ(text_range.length(), text.length());
-
-  reconv->dwVersion = 0;
-  reconv->dwStrLen = len;
-  reconv->dwStrOffset = sizeof(RECONVERTSTRING);
-  reconv->dwCompStrLen =
-      client->HasCompositionText() ? target_range.length() : 0;
-  reconv->dwCompStrOffset =
-      (target_range.GetMin() - text_range.start()) * sizeof(WCHAR);
-  reconv->dwTargetStrLen = target_range.length();
-  reconv->dwTargetStrOffset = reconv->dwCompStrOffset;
-
-  memcpy((char*)reconv + sizeof(RECONVERTSTRING),
-         text.c_str(), len * sizeof(WCHAR));
-
-  // According to Microsft API document, IMR_RECONVERTSTRING and
-  // IMR_DOCUMENTFEED should return reconv, but some applications return
-  // need_size.
-  return reinterpret_cast<LRESULT>(reconv);
-}
-
-LRESULT InputMethodWin::OnReconvertString(RECONVERTSTRING* reconv) {
-  ui::TextInputClient* client = GetTextInputClient();
-  if (!client)
-    return 0;
-
-  // If there is a composition string already, we don't allow reconversion.
-  if (client->HasCompositionText())
-    return 0;
-
-  ui::Range text_range;
-  if (!client->GetTextRange(&text_range) || text_range.is_empty())
-    return 0;
-
-  ui::Range selection_range;
-  if (!client->GetSelectionRange(&selection_range) ||
-      selection_range.is_empty()) {
-    return 0;
-  }
-
-  DCHECK(text_range.Contains(selection_range));
-
-  size_t len = selection_range.length();
-  size_t need_size = sizeof(RECONVERTSTRING) + len * sizeof(WCHAR);
-
-  if (!reconv)
-    return need_size;
-
-  if (reconv->dwSize < need_size)
-    return 0;
-
-  // TODO(penghuang): Return some extra context to help improve IME's
-  // reconversion accuracy.
-  string16 text;
-  if (!GetTextInputClient()->GetTextFromRange(selection_range, &text))
-    return 0;
-  DCHECK_EQ(selection_range.length(), text.length());
-
-  reconv->dwVersion = 0;
-  reconv->dwStrLen = len;
-  reconv->dwStrOffset = sizeof(RECONVERTSTRING);
-  reconv->dwCompStrLen = len;
-  reconv->dwCompStrOffset = 0;
-  reconv->dwTargetStrLen = len;
-  reconv->dwTargetStrOffset = 0;
-
-  memcpy(reinterpret_cast<char*>(reconv) + sizeof(RECONVERTSTRING),
-         text.c_str(), len * sizeof(WCHAR));
-
-  // According to Microsft API document, IMR_RECONVERTSTRING and
-  // IMR_DOCUMENTFEED should return reconv, but some applications return
-  // need_size.
-  return reinterpret_cast<LRESULT>(reconv);
-}
-
-LRESULT InputMethodWin::OnQueryCharPosition(IMECHARPOSITION *char_positon) {
-  if (!char_positon)
-    return 0;
-
-  if (char_positon->dwSize < sizeof(IMECHARPOSITION))
-    return 0;
-
-  ui::TextInputClient* client = GetTextInputClient();
-  if (!client)
-    return 0;
-
-  gfx::Rect rect;
-  if (!client->GetCompositionCharacterBounds(char_positon->dwCharPos, &rect))
-    return 0;
-
-  char_positon->pt.x = rect.x();
-  char_positon->pt.y = rect.y();
-  char_positon->cLineHeight = rect.height();
-  return 1;  // returns non-zero value when succeeded.
-}
-
-void InputMethodWin::ConfirmCompositionText() {
-  if (!IsTextInputTypeNone()) {
-    imm32_manager_.CleanupComposition(hwnd_);
-    // Though above line should confirm the client's composition text by sending
-    // a result text to us, in case the input method and the client are in
-    // inconsistent states, we check the client's composition state again.
-    if (GetTextInputClient()->HasCompositionText())
-      GetTextInputClient()->ConfirmCompositionText();
-  }
-}
-
-void InputMethodWin::UpdateIMEState() {
-  // Use switch here in case we are going to add more text input types.
-  // We disable input method in password field.
-  switch (GetTextInputType()) {
-    case ui::TEXT_INPUT_TYPE_NONE:
-    case ui::TEXT_INPUT_TYPE_PASSWORD:
-      imm32_manager_.DisableIME(hwnd_);
-      break;
-    default:
-      imm32_manager_.EnableIME(hwnd_);
-      break;
-  }
-}
-
-}  // namespace views
diff --git a/ui/views/ime/input_method_win.h b/ui/views/ime/input_method_win.h
deleted file mode 100644
index 5668e8f3..0000000
--- a/ui/views/ime/input_method_win.h
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_VIEWS_IME_INPUT_METHOD_WIN_H_
-#define UI_VIEWS_IME_INPUT_METHOD_WIN_H_
-
-#include <windows.h>
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "ui/base/ime/win/imm32_manager.h"
-#include "ui/views/ime/input_method_base.h"
-#include "ui/views/view.h"
-#include "ui/views/widget/widget.h"
-
-namespace ui {
-class InputMethod;
-}  // namespace ui
-
-namespace views {
-
-// An InputMethod implementation based on Windows IMM32 API.
-class InputMethodWin : public InputMethodBase {
- public:
-  InputMethodWin(internal::InputMethodDelegate* delegate,
-                 HWND hwnd,
-                 ui::InputMethod* host);
-  virtual ~InputMethodWin();
-
-  // Overridden from InputMethod:
-  virtual void Init(Widget* widget) OVERRIDE;
-  virtual void OnFocus() OVERRIDE;
-  virtual void OnBlur() OVERRIDE;
-  virtual bool OnUntranslatedIMEMessage(const base::NativeEvent& event,
-                                        NativeEventResult* result) OVERRIDE;
-  virtual void DispatchKeyEvent(const ui::KeyEvent& key) OVERRIDE;
-  virtual void OnTextInputTypeChanged(View* view) OVERRIDE;
-  virtual void OnCaretBoundsChanged(View* view) OVERRIDE;
-  virtual void CancelComposition(View* view) OVERRIDE;
-  virtual void OnInputLocaleChanged() OVERRIDE;
-  virtual std::string GetInputLocale() OVERRIDE;
-  virtual base::i18n::TextDirection GetInputTextDirection() OVERRIDE;
-  virtual bool IsActive() OVERRIDE;
-  virtual bool IsCandidatePopupOpen() const OVERRIDE;
-
-  // Overridden from InputMethodBase.
-  virtual ui::TextInputClient* GetTextInputClient() const OVERRIDE;
-
- private:
-  LRESULT OnImeSetContext(
-      UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled);
-  LRESULT OnImeStartComposition(
-      UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled);
-  LRESULT OnImeComposition(
-      UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled);
-  LRESULT OnImeEndComposition(
-      UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled);
-  LRESULT OnImeRequest(
-      UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled);
-  LRESULT OnImeNotify(
-      UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled);
-  // For both WM_CHAR and WM_SYSCHAR
-  LRESULT OnChar(
-      UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled);
-  // For both WM_DEADCHAR and WM_SYSDEADCHAR
-  LRESULT OnDeadChar(
-      UINT message, WPARAM wparam, LPARAM lparam, BOOL* handled);
-
-  LRESULT OnDocumentFeed(RECONVERTSTRING *reconv);
-  LRESULT OnReconvertString(RECONVERTSTRING *reconv);
-  LRESULT OnQueryCharPosition(IMECHARPOSITION *char_positon);
-
-  // Overridden from InputMethodBase.
-  virtual void OnWillChangeFocus(View* focused_before, View* focused) OVERRIDE;
-  virtual void OnDidChangeFocus(View* focused_before, View* focused) OVERRIDE;
-
-  // Asks the client to confirm current composition text.
-  void ConfirmCompositionText();
-
-  // Enables or disables the IME according to the current text input type.
-  void UpdateIMEState();
-
-  // The HWND this InputMethod is bound to.
-  HWND hwnd_;
-
-  // Indicates if the current input locale has an IME.
-  bool active_;
-
-  // True if we know for sure that a candidate window is open.
-  bool is_candidate_popup_open_;
-
-  // Name of the current input locale.
-  std::string locale_;
-
-  // The current input text direction.
-  base::i18n::TextDirection direction_;
-
-  // The new text direction and layout alignment requested by the user by
-  // pressing ctrl-shift. It'll be sent to the text input client when the key
-  // is released.
-  base::i18n::TextDirection pending_requested_direction_;
-
-  // Windows IMM32 wrapper.
-  // (See "ui/base/ime/win/ime_input.h" for its details.)
-  ui::IMM32Manager imm32_manager_;
-
-  ui::InputMethod* const host_;
-
-  DISALLOW_COPY_AND_ASSIGN(InputMethodWin);
-};
-
-}  // namespace views
-
-#endif  // UI_VIEWS_IME_INPUT_METHOD_WIN_H_
diff --git a/ui/views/touchui/touch_selection_controller_impl.cc b/ui/views/touchui/touch_selection_controller_impl.cc
index b309483..8b6b351 100644
--- a/ui/views/touchui/touch_selection_controller_impl.cc
+++ b/ui/views/touchui/touch_selection_controller_impl.cc
@@ -25,14 +25,39 @@
 const SkColor kSelectionHandleLineColor =
     SkColorSetRGB(0x42, 0x81, 0xf4);
 
+// When a handle is dragged, the drag position reported to the client view is
+// offset vertically to represent the cursor position. This constant specifies
+// the offset in  pixels above the "O" (see pic below). This is required because
+// say if this is zero, that means the drag position we report is the point
+// right above the "O" or the bottom most point of the cursor "|". In that case,
+// a vertical movement of even one pixel will make the handle jump to the line
+// below it. So when the user just starts dragging, the handle will jump to the
+// next line if the user makes any vertical movement. It is correct but
+// looks/feels weird. So we have this non-zero offset to prevent this jumping.
+//
+// Editing handle widget showing the difference between the position of the
+// ET_GESTURE_SCROLL_UPDATE event and the drag position reported to the client:
+//                                  _____
+//                                 |  |<-|---- Drag position reported to client
+//                              _  |  O  |
+//          Vertical Padding __|   |   <-|---- ET_GESTURE_SCROLL_UPDATE position
+//                             |_  |_____|<--- Editing handle widget
+//
+//                                 | |
+//                                  T
+//                          Horizontal Padding
+//
+const int kSelectionHandleVerticalDragOffset = 5;
+
 // Padding around the selection handle defining the area that will be included
-// in the touch target to make dragging the handle easier.
-const int kSelectionHandlePadding = 10;
+// in the touch target to make dragging the handle easier (see pic above).
+const int kSelectionHandleHorizPadding = 10;
+const int kSelectionHandleVertPadding = 20;
 
 // The minimum selection size to trigger selection controller.
 // TODO(varunjain): Figure out if this is really required and get rid of it if
 // it isnt.
-const int kMinSelectionSize = 2;
+const int kMinSelectionSize = 1;
 
 const int kContextMenuTimoutMs = 200;
 
@@ -107,7 +132,9 @@
  public:
   explicit EditingHandleView(TouchSelectionControllerImpl* controller,
                              gfx::NativeView context)
-      : controller_(controller) {
+      : controller_(controller),
+        drag_offset_(0),
+        draw_invisible_(false) {
     widget_.reset(CreateTouchSelectionPopupWidget(context, this));
     widget_->SetContentsView(this);
     widget_->SetAlwaysOnTop(true);
@@ -132,9 +159,9 @@
   virtual void GetWidgetHitTestMask(gfx::Path* mask) const OVERRIDE {
     gfx::Size image_size = GetHandleImageSize();
     mask->addRect(SkIntToScalar(0), SkIntToScalar(cursor_height()),
-        SkIntToScalar(image_size.width()) + 2 * kSelectionHandlePadding,
+        SkIntToScalar(image_size.width()) + 2 * kSelectionHandleHorizPadding,
         SkIntToScalar(cursor_height() + image_size.height() +
-            kSelectionHandlePadding));
+            kSelectionHandleVertPadding));
   }
 
   virtual void DeleteDelegate() OVERRIDE {
@@ -143,9 +170,11 @@
 
   // Overridden from views::View:
   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
+    if (draw_invisible_)
+      return;
     gfx::Size image_size = GetHandleImageSize();
     int cursor_pos_x = image_size.width() / 2 - kSelectionHandleLineWidth +
-        kSelectionHandlePadding;
+        kSelectionHandleHorizPadding;
 
     // Draw the cursor line.
     canvas->FillRect(
@@ -155,7 +184,7 @@
 
     // Draw the handle image.
     canvas->DrawImageInt(*GetHandleImage()->ToImageSkia(),
-        kSelectionHandlePadding, cursor_height());
+        kSelectionHandleHorizPadding, cursor_height());
   }
 
   virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
@@ -164,10 +193,15 @@
       case ui::ET_GESTURE_SCROLL_BEGIN:
         widget_->SetCapture(this);
         controller_->SetDraggingHandle(this);
+        drag_offset_ = event->y() - cursor_height() -
+            kSelectionHandleVerticalDragOffset;
         break;
-      case ui::ET_GESTURE_SCROLL_UPDATE:
-        controller_->SelectionHandleDragged(event->location());
+      case ui::ET_GESTURE_SCROLL_UPDATE: {
+        gfx::Point drag_pos(event->location().x(),
+            event->location().y() - drag_offset_);
+        controller_->SelectionHandleDragged(drag_pos);
         break;
+      }
       case ui::ET_GESTURE_SCROLL_END:
       case ui::ET_SCROLL_FLING_START:
         widget_->ReleaseCapture();
@@ -191,8 +225,8 @@
 
   virtual gfx::Size GetPreferredSize() OVERRIDE {
     gfx::Size image_size = GetHandleImageSize();
-    return gfx::Size(image_size.width() + 2 * kSelectionHandlePadding,
-        image_size.height() + cursor_height() + kSelectionHandlePadding);
+    return gfx::Size(image_size.width() + 2 * kSelectionHandleHorizPadding,
+        image_size.height() + cursor_height() + kSelectionHandleVertPadding);
   }
 
   bool IsWidgetVisible() const {
@@ -203,10 +237,10 @@
     gfx::Size image_size = GetHandleImageSize();
     selection_rect_ = rect;
     gfx::Rect widget_bounds(
-        rect.x() - image_size.width() / 2 - kSelectionHandlePadding,
+        rect.x() - image_size.width() / 2 - kSelectionHandleHorizPadding,
         rect.y(),
-        image_size.width() + 2 * kSelectionHandlePadding,
-        rect.height() + image_size.height() + kSelectionHandlePadding);
+        image_size.width() + 2 * kSelectionHandleHorizPadding,
+        rect.height() + image_size.height() + kSelectionHandleVertPadding);
     widget_->SetBounds(widget_bounds);
   }
 
@@ -214,10 +248,24 @@
     return widget_->GetClientAreaBoundsInScreen().origin();
   }
 
+  void SetDrawInvisible(bool draw_invisible) {
+    if (draw_invisible_ == draw_invisible)
+      return;
+    draw_invisible_ = draw_invisible;
+    SchedulePaint();
+  }
+
  private:
   scoped_ptr<Widget> widget_;
   TouchSelectionControllerImpl* controller_;
   gfx::Rect selection_rect_;
+  int drag_offset_;
+
+  // If set to true, the handle will not draw anything, hence providing an empty
+  // widget. We need this because we may want to stop showing the handle while
+  // it is being dragged. Since it is being dragged, we cannot destroy the
+  // handle.
+  bool draw_invisible_;
 
   DISALLOW_COPY_AND_ASSIGN(EditingHandleView);
 };
@@ -273,6 +321,13 @@
     // the start.
     dragging_handle_->SetSelectionRectInScreen(screen_rect_2);
 
+    // Temporary fix for selection handle going outside a window. On a webpage,
+    // the page should scroll if the selection handle is dragged outside the
+    // window. That does not happen currently. So we just hide the handle for
+    // now.
+    // TODO(varunjain): Fix this: crbug.com/269003
+    dragging_handle_->SetDrawInvisible(!client_view_->GetBounds().Contains(r2));
+
     if (dragging_handle_ != cursor_handle_.get()) {
       // The non-dragging-handle might have recently become visible.
       EditingHandleView* non_dragging_handle =
@@ -321,13 +376,11 @@
   HideContextMenu();
 
   DCHECK(dragging_handle_);
+  gfx::Point drag_pos_in_client = drag_pos;
+  ConvertPointToClientView(dragging_handle_, &drag_pos_in_client);
 
-  gfx::Size image_size = GetHandleImageSize();
-  gfx::Point offset_drag_pos(drag_pos.x(),
-      drag_pos.y() - image_size.height() - kSelectionHandlePadding - 1);
-  ConvertPointToClientView(dragging_handle_, &offset_drag_pos);
   if (dragging_handle_ == cursor_handle_.get()) {
-    client_view_->MoveCaretTo(offset_drag_pos);
+    client_view_->MoveCaretTo(drag_pos_in_client);
     return;
   }
 
@@ -344,7 +397,7 @@
   // Instruct client_view to select the region between p1 and p2. The position
   // of |fixed_handle| is the start and that of |dragging_handle| is the end
   // of selection.
-  client_view_->SelectRect(p2, offset_drag_pos);
+  client_view_->SelectRect(p2, drag_pos_in_client);
 }
 
 void TouchSelectionControllerImpl::ConvertPointToClientView(
diff --git a/ui/views/views.gyp b/ui/views/views.gyp
index ea0285b..ff3ab0a 100644
--- a/ui/views/views.gyp
+++ b/ui/views/views.gyp
@@ -297,8 +297,6 @@
         'ime/input_method_bridge.h',
         'ime/input_method_delegate.h',
         'ime/input_method.h',
-        'ime/input_method_win.cc',
-        'ime/input_method_win.h',
         'ime/mock_input_method.cc',
         'ime/mock_input_method.h',
         'layout/box_layout.cc',
diff --git a/ui/views/widget/desktop_aura/desktop_screen_position_client.cc b/ui/views/widget/desktop_aura/desktop_screen_position_client.cc
index 12be4cc..2ca556c 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_position_client.cc
+++ b/ui/views/widget/desktop_aura/desktop_screen_position_client.cc
@@ -68,19 +68,16 @@
     const gfx::Rect& bounds,
     const gfx::Display& display) {
   // TODO: Use the 3rd parameter, |display|.
-  gfx::Point origin = bounds.origin();
   aura::RootWindow* root = window->GetRootWindow();
-  aura::Window::ConvertPointToTarget(window->parent(), root, &origin);
-
-  if (window->type() == aura::client::WINDOW_TYPE_CONTROL) {
-    window->SetBounds(gfx::Rect(origin, bounds.size()));
-    return;
-  }
 
   if (PositionWindowInScreenCoordinates(window)) {
     // The caller expects windows we consider "embedded" to be placed in the
     // screen coordinate system. So we need to offset the root window's
     // position (which is in screen coordinates) from these bounds.
+
+    gfx::Point origin = bounds.origin();
+    aura::Window::ConvertPointToTarget(window->parent(), root, &origin);
+
     gfx::Point host_origin = GetOrigin(root);
     origin.Offset(-host_origin.x(), -host_origin.y());
     window->SetBounds(gfx::Rect(origin, bounds.size()));
diff --git a/ui/views/widget/desktop_aura/desktop_screen_position_client_unittest.cc b/ui/views/widget/desktop_aura/desktop_screen_position_client_unittest.cc
index 196f6e4..bb1cd8b 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_position_client_unittest.cc
+++ b/ui/views/widget/desktop_aura/desktop_screen_position_client_unittest.cc
@@ -34,4 +34,52 @@
   EXPECT_EQ("11,12", dialog->GetWindowBoundsInScreen().origin().ToString());
 }
 
+// Verifies that setting the bounds of a control parented to something other
+// than the root window is positioned correctly.
+TEST_F(DesktopScreenPositionClientTest, PositionControlWithNonRootParent) {
+  Widget widget1;
+  Widget widget2;
+  Widget widget3;
+  gfx::Point origin = gfx::Point(16, 16);
+
+  // Use a custom frame type.  By default we will choose a native frame when
+  // aero glass is enabled, and this complicates the logic surrounding origin
+  // computation, making it difficult to compute the expected origin location.
+  widget1.set_frame_type(Widget::FRAME_TYPE_FORCE_CUSTOM);
+  widget2.set_frame_type(Widget::FRAME_TYPE_FORCE_CUSTOM);
+  widget3.set_frame_type(Widget::FRAME_TYPE_FORCE_CUSTOM);
+
+  // Create 3 windows.  A root window, an arbitrary window parented to the root
+  // but NOT positioned at (0,0) relative to the root, and then a third window
+  // parented to the second, also not positioned at (0,0).
+  Widget::InitParams params1 =
+      CreateParams(Widget::InitParams::TYPE_WINDOW);
+  params1.bounds = gfx::Rect(origin, gfx::Size(700, 600));
+  params1.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  params1.native_widget = new DesktopNativeWidgetAura(&widget1);
+  widget1.Init(params1);
+
+  Widget::InitParams params2 =
+    CreateParams(Widget::InitParams::TYPE_WINDOW);
+  params2.bounds = gfx::Rect(origin, gfx::Size(600, 500));
+  params2.parent = widget1.GetNativeView();
+  params2.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  params2.child = true;
+  widget2.Init(params2);
+
+  Widget::InitParams params3 =
+      CreateParams(Widget::InitParams::TYPE_CONTROL);
+  params3.parent = widget2.GetNativeView();
+  params3.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  params3.child = true;
+  params3.bounds = gfx::Rect(origin, gfx::Size(500, 400));
+  widget3.Init(params3);
+
+  // The origin of the 3rd window should be the sum of all parent origins.
+  gfx::Point expected_origin(origin.x() * 3, origin.y() * 3);
+  gfx::Rect expected_bounds(expected_origin, gfx::Size(500, 400));
+  gfx::Rect actual_bounds(widget3.GetWindowBoundsInScreen());
+  EXPECT_EQ(expected_bounds.ToString(), actual_bounds.ToString());
+}
+
 }  // namespace views
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index f27ad8c..1a62709 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -1030,17 +1030,16 @@
   }
 }
 
-gfx::Insets HWNDMessageHandler::GetClientAreaInsets() const {
-  gfx::Insets insets;
-  if (delegate_->GetClientAreaInsets(&insets))
-    return insets;
-  DCHECK(insets.empty());
+bool HWNDMessageHandler::GetClientAreaInsets(gfx::Insets* insets) const {
+  if (delegate_->GetClientAreaInsets(insets))
+    return true;
+  DCHECK(insets->empty());
 
-  // Returning an empty Insets object causes the default handling in
-  // NativeWidgetWin::OnNCCalcSize() to be invoked.
+  // Returning false causes the default handling in OnNCCalcSize() to
+  // be invoked.
   if (!delegate_->IsWidgetWindow() ||
       (!delegate_->IsUsingCustomFrame() && !remove_standard_frame_)) {
-    return insets;
+    return false;
   }
 
   if (IsMaximized()) {
@@ -1049,8 +1048,9 @@
     int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME);
     if (remove_standard_frame_)
       border_thickness -= 1;
-    return gfx::Insets(border_thickness, border_thickness, border_thickness,
-                       border_thickness);
+    *insets = gfx::Insets(
+        border_thickness, border_thickness, border_thickness, border_thickness);
+    return true;
   }
 
   // Returning empty insets for a window with the standard frame removed seems
@@ -1067,8 +1067,17 @@
   // means that the client area is reported 1px larger than it really is, so
   // user code has to compensate by making its content shorter if it wants
   // everything to appear inside the window.
-  if (remove_standard_frame_)
-    return gfx::Insets(0, 0, IsMaximized() ? 0 : kClientAreaBottomInsetHack, 0);
+  if (remove_standard_frame_) {
+    *insets =
+        gfx::Insets(0, 0, IsMaximized() ? 0 : kClientAreaBottomInsetHack, 0);
+    return true;
+  }
+
+#if defined(USE_AURA)
+  // The -1 hack below breaks rendering in Aura.
+  // See http://crbug.com/172099 http://crbug.com/267131
+  *insets = gfx::Insets();
+#else
   // This is weird, but highly essential. If we don't offset the bottom edge
   // of the client rect, the window client area and window area will match,
   // and when returning to glass rendering mode from non-glass, the client
@@ -1080,7 +1089,9 @@
   // rect when using the opaque frame.
   // Note: this is only required for non-fullscreen windows. Note that
   // fullscreen windows are in restored state, not maximized.
-  return gfx::Insets(0, 0, fullscreen_handler_->fullscreen() ? 0 : 1, 0);
+  *insets = gfx::Insets(0, 0, fullscreen_handler_->fullscreen() ? 0 : 1, 0);
+#endif
+  return true;
 }
 
 void HWNDMessageHandler::ResetWindowRegion(bool force) {
@@ -1643,8 +1654,9 @@
     }
   }
 
-  gfx::Insets insets = GetClientAreaInsets();
-  if (insets.empty() && !fullscreen_handler_->fullscreen() &&
+  gfx::Insets insets;
+  bool got_insets = GetClientAreaInsets(&insets);
+  if (!got_insets && !fullscreen_handler_->fullscreen() &&
       !(mode && remove_standard_frame_)) {
     SetMsgHandled(FALSE);
     return 0;
diff --git a/ui/views/win/hwnd_message_handler.h b/ui/views/win/hwnd_message_handler.h
index d9e20d7..c1c724c 100644
--- a/ui/views/win/hwnd_message_handler.h
+++ b/ui/views/win/hwnd_message_handler.h
@@ -196,7 +196,7 @@
 
   // Returns the insets of the client area relative to the non-client area of
   // the window.
-  gfx::Insets GetClientAreaInsets() const;
+  bool GetClientAreaInsets(gfx::Insets* insets) const;
 
   // Resets the window region for the current widget bounds if necessary.
   // If |force| is true, the window region is reset to NULL even for native
diff --git a/ui/webui/resources/js/cr/ui/context_menu_handler.js b/ui/webui/resources/js/cr/ui/context_menu_handler.js
index 30ab13c..05264d6 100644
--- a/ui/webui/resources/js/cr/ui/context_menu_handler.js
+++ b/ui/webui/resources/js/cr/ui/context_menu_handler.js
@@ -35,8 +35,11 @@
      * @param {!cr.ui.Menu} menu The menu to show.
      */
     showMenu: function(e, menu) {
-      this.menu_ = menu;
       menu.updateCommands(e.currentTarget);
+      if (!menu.hasVisibleItems())
+        return;
+
+      this.menu_ = menu;
       menu.classList.remove('hide-delayed');
       menu.hidden = false;
       menu.contextElement = e.currentTarget;
diff --git a/ui/webui/resources/js/cr/ui/focus_outline_manager.js b/ui/webui/resources/js/cr/ui/focus_outline_manager.js
index e5b2476..fd106c2 100644
--- a/ui/webui/resources/js/cr/ui/focus_outline_manager.js
+++ b/ui/webui/resources/js/cr/ui/focus_outline_manager.js
@@ -32,11 +32,16 @@
     var self = this;
     doc.addEventListener('keydown', function(e) {
       if (e.keyCode == 9)  // Tab
-        self.visible = true;
+        self.focusByKeyboard_ = true;
     }, true);
 
     doc.addEventListener('mousedown', function(e) {
-      self.visible = false;
+      self.focusByKeyboard_ = false;
+    }, true);
+
+    doc.addEventListener('focus', function(event) {
+      // Update visibility only when focus is actually changed.
+      self.visible = self.focusByKeyboard_;
     }, true);
   }
 
@@ -48,6 +53,13 @@
 
   FocusOutlineManager.prototype = {
     /**
+     * Whether focus change is triggered by TAB key.
+     * @type {boolean}
+     * @private
+     */
+    focusByKeyboard_: false,
+
+    /**
      * Whether the focus outline should be visible.
      * @type {boolean}
      */
diff --git a/ui/webui/resources/js/cr/ui/menu.js b/ui/webui/resources/js/cr/ui/menu.js
index 3047123..4956b38 100644
--- a/ui/webui/resources/js/cr/ui/menu.js
+++ b/ui/webui/resources/js/cr/ui/menu.js
@@ -144,8 +144,10 @@
         this.selectedIndex = 0;
       }
 
-      if (this.selectedItem)
+      if (this.selectedItem) {
         this.selectedItem.focus();
+        this.setAttribute('aria-activedescendant', this.selectedItem.id);
+      }
     },
 
     /**
@@ -156,6 +158,19 @@
     },
 
     /**
+     * Returns if the menu has any visible item.
+     * @return {boolean} True if the menu has visible item. Otherwise, false.
+     */
+    hasVisibleItems: function() {
+      var menuItems = this.menuItems;  // Cache.
+      for (var i = 0, menuItem; menuItem = menuItems[i]; i++) {
+        if (!menuItem.hidden)
+          return true;
+      }
+      return false;
+    },
+
+    /**
      * This is the function that handles keyboard navigation. This is usually
      * called by the element responsible for managing the menu.
      * @param {Event} e The keydown event object.
diff --git a/ui/webui/resources/js/cr/ui/menu_item.js b/ui/webui/resources/js/cr/ui/menu_item.js
index d1ab2ea..89054e2 100644
--- a/ui/webui/resources/js/cr/ui/menu_item.js
+++ b/ui/webui/resources/js/cr/ui/menu_item.js
@@ -40,7 +40,10 @@
       // the appearance of this element.
       this.classList.add('custom-appearance');
 
-      this.setAttribute('role', 'menuitem');
+      // Enable Text to Speech on the menu. Additionaly, ID has to be set, since
+      // it is used in element's aria-activedescendant attribute.
+      if (!this.isSeparator())
+        this.setAttribute('role', 'menuitem');
 
       var iconUrl;
       if ((iconUrl = this.getAttribute('icon')))
diff --git a/webkit/browser/dom_storage/OWNERS b/webkit/browser/dom_storage/OWNERS
deleted file mode 100644
index 88ceed4..0000000
--- a/webkit/browser/dom_storage/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-marja@chromium.org
diff --git a/webkit/browser/dom_storage/dom_storage_context.cc b/webkit/browser/dom_storage/dom_storage_context.cc
deleted file mode 100644
index 5d7229d..0000000
--- a/webkit/browser/dom_storage/dom_storage_context.cc
+++ /dev/null
@@ -1,418 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "webkit/browser/dom_storage/dom_storage_context.h"
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/file_util.h"
-#include "base/files/file_enumerator.h"
-#include "base/guid.h"
-#include "base/location.h"
-#include "base/time/time.h"
-#include "webkit/browser/dom_storage/dom_storage_area.h"
-#include "webkit/browser/dom_storage/dom_storage_database.h"
-#include "webkit/browser/dom_storage/dom_storage_namespace.h"
-#include "webkit/browser/dom_storage/dom_storage_task_runner.h"
-#include "webkit/browser/dom_storage/session_storage_database.h"
-#include "webkit/browser/quota/special_storage_policy.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
-
-namespace dom_storage {
-
-static const int kSessionStoraceScavengingSeconds = 60;
-
-DomStorageContext::DomStorageContext(
-    const base::FilePath& localstorage_directory,
-    const base::FilePath& sessionstorage_directory,
-    quota::SpecialStoragePolicy* special_storage_policy,
-    DomStorageTaskRunner* task_runner)
-    : localstorage_directory_(localstorage_directory),
-      sessionstorage_directory_(sessionstorage_directory),
-      task_runner_(task_runner),
-      is_shutdown_(false),
-      force_keep_session_state_(false),
-      special_storage_policy_(special_storage_policy),
-      scavenging_started_(false) {
-  // AtomicSequenceNum starts at 0 but we want to start session
-  // namespace ids at one since zero is reserved for the
-  // kLocalStorageNamespaceId.
-  session_id_sequence_.GetNext();
-}
-
-DomStorageContext::~DomStorageContext() {
-  if (session_storage_database_.get()) {
-    // SessionStorageDatabase shouldn't be deleted right away: deleting it will
-    // potentially involve waiting in leveldb::DBImpl::~DBImpl, and waiting
-    // shouldn't happen on this thread.
-    SessionStorageDatabase* to_release = session_storage_database_.get();
-    to_release->AddRef();
-    session_storage_database_ = NULL;
-    task_runner_->PostShutdownBlockingTask(
-        FROM_HERE,
-        DomStorageTaskRunner::COMMIT_SEQUENCE,
-        base::Bind(&SessionStorageDatabase::Release,
-                   base::Unretained(to_release)));
-  }
-}
-
-DomStorageNamespace* DomStorageContext::GetStorageNamespace(
-    int64 namespace_id) {
-  if (is_shutdown_)
-    return NULL;
-  StorageNamespaceMap::iterator found = namespaces_.find(namespace_id);
-  if (found == namespaces_.end()) {
-    if (namespace_id == kLocalStorageNamespaceId) {
-      if (!localstorage_directory_.empty()) {
-        if (!file_util::CreateDirectory(localstorage_directory_)) {
-          LOG(ERROR) << "Failed to create 'Local Storage' directory,"
-                        " falling back to in-memory only.";
-          localstorage_directory_ = base::FilePath();
-        }
-      }
-      DomStorageNamespace* local =
-          new DomStorageNamespace(localstorage_directory_, task_runner_.get());
-      namespaces_[kLocalStorageNamespaceId] = local;
-      return local;
-    }
-    return NULL;
-  }
-  return found->second.get();
-}
-
-void DomStorageContext::GetLocalStorageUsage(
-    std::vector<LocalStorageUsageInfo>* infos,
-    bool include_file_info) {
-  if (localstorage_directory_.empty())
-    return;
-  base::FileEnumerator enumerator(localstorage_directory_, false,
-                                  base::FileEnumerator::FILES);
-  for (base::FilePath path = enumerator.Next(); !path.empty();
-       path = enumerator.Next()) {
-    if (path.MatchesExtension(DomStorageArea::kDatabaseFileExtension)) {
-      LocalStorageUsageInfo info;
-      info.origin = DomStorageArea::OriginFromDatabaseFileName(path);
-      if (include_file_info) {
-        base::FileEnumerator::FileInfo find_info = enumerator.GetInfo();
-        info.data_size = find_info.GetSize();
-        info.last_modified = find_info.GetLastModifiedTime();
-      }
-      infos->push_back(info);
-    }
-  }
-}
-
-void DomStorageContext::GetSessionStorageUsage(
-    std::vector<SessionStorageUsageInfo>* infos) {
-  if (!session_storage_database_.get())
-    return;
-  std::map<std::string, std::vector<GURL> > namespaces_and_origins;
-  session_storage_database_->ReadNamespacesAndOrigins(
-      &namespaces_and_origins);
-  for (std::map<std::string, std::vector<GURL> >::const_iterator it =
-           namespaces_and_origins.begin();
-       it != namespaces_and_origins.end(); ++it) {
-    for (std::vector<GURL>::const_iterator origin_it = it->second.begin();
-         origin_it != it->second.end(); ++origin_it) {
-      SessionStorageUsageInfo info;
-      info.persistent_namespace_id = it->first;
-      info.origin = *origin_it;
-      infos->push_back(info);
-    }
-  }
-}
-
-void DomStorageContext::DeleteLocalStorage(const GURL& origin) {
-  DCHECK(!is_shutdown_);
-  DomStorageNamespace* local = GetStorageNamespace(kLocalStorageNamespaceId);
-  local->DeleteLocalStorageOrigin(origin);
-  // Synthesize a 'cleared' event if the area is open so CachedAreas in
-  // renderers get emptied out too.
-  DomStorageArea* area = local->GetOpenStorageArea(origin);
-  if (area)
-    NotifyAreaCleared(area, origin);
-}
-
-void DomStorageContext::DeleteSessionStorage(
-    const SessionStorageUsageInfo& usage_info) {
-  DCHECK(!is_shutdown_);
-  DomStorageNamespace* dom_storage_namespace = NULL;
-  std::map<std::string, int64>::const_iterator it =
-      persistent_namespace_id_to_namespace_id_.find(
-          usage_info.persistent_namespace_id);
-  if (it != persistent_namespace_id_to_namespace_id_.end()) {
-    dom_storage_namespace = GetStorageNamespace(it->second);
-  } else {
-    int64 namespace_id = AllocateSessionId();
-    CreateSessionNamespace(namespace_id, usage_info.persistent_namespace_id);
-    dom_storage_namespace = GetStorageNamespace(namespace_id);
-  }
-  dom_storage_namespace->DeleteSessionStorageOrigin(usage_info.origin);
-  // Synthesize a 'cleared' event if the area is open so CachedAreas in
-  // renderers get emptied out too.
-  DomStorageArea* area =
-      dom_storage_namespace->GetOpenStorageArea(usage_info.origin);
-  if (area)
-    NotifyAreaCleared(area, usage_info.origin);
-}
-
-void DomStorageContext::PurgeMemory() {
-  // We can only purge memory from the local storage namespace
-  // which is backed by disk.
-  // TODO(marja): Purge sessionStorage, too. (Requires changes to the FastClear
-  // functionality.)
-  StorageNamespaceMap::iterator found =
-      namespaces_.find(kLocalStorageNamespaceId);
-  if (found != namespaces_.end())
-    found->second->PurgeMemory(DomStorageNamespace::PURGE_AGGRESSIVE);
-}
-
-void DomStorageContext::Shutdown() {
-  is_shutdown_ = true;
-  StorageNamespaceMap::const_iterator it = namespaces_.begin();
-  for (; it != namespaces_.end(); ++it)
-    it->second->Shutdown();
-
-  if (localstorage_directory_.empty() && !session_storage_database_.get())
-    return;
-
-  // Respect the content policy settings about what to
-  // keep and what to discard.
-  if (force_keep_session_state_)
-    return;  // Keep everything.
-
-  bool has_session_only_origins =
-      special_storage_policy_.get() &&
-      special_storage_policy_->HasSessionOnlyOrigins();
-
-  if (has_session_only_origins) {
-    // We may have to delete something. We continue on the
-    // commit sequence after area shutdown tasks have cycled
-    // thru that sequence (and closed their database files).
-    bool success = task_runner_->PostShutdownBlockingTask(
-        FROM_HERE,
-        DomStorageTaskRunner::COMMIT_SEQUENCE,
-        base::Bind(&DomStorageContext::ClearSessionOnlyOrigins, this));
-    DCHECK(success);
-  }
-}
-
-void DomStorageContext::AddEventObserver(EventObserver* observer) {
-  event_observers_.AddObserver(observer);
-}
-
-void DomStorageContext::RemoveEventObserver(EventObserver* observer) {
-  event_observers_.RemoveObserver(observer);
-}
-
-void DomStorageContext::NotifyItemSet(
-    const DomStorageArea* area,
-    const base::string16& key,
-    const base::string16& new_value,
-    const base::NullableString16& old_value,
-    const GURL& page_url) {
-  FOR_EACH_OBSERVER(
-      EventObserver, event_observers_,
-      OnDomStorageItemSet(area, key, new_value, old_value, page_url));
-}
-
-void DomStorageContext::NotifyItemRemoved(
-    const DomStorageArea* area,
-    const base::string16& key,
-    const base::string16& old_value,
-    const GURL& page_url) {
-  FOR_EACH_OBSERVER(
-      EventObserver, event_observers_,
-      OnDomStorageItemRemoved(area, key, old_value, page_url));
-}
-
-void DomStorageContext::NotifyAreaCleared(
-    const DomStorageArea* area,
-    const GURL& page_url) {
-  FOR_EACH_OBSERVER(
-      EventObserver, event_observers_,
-      OnDomStorageAreaCleared(area, page_url));
-}
-
-std::string DomStorageContext::AllocatePersistentSessionId() {
-  std::string guid = base::GenerateGUID();
-  std::replace(guid.begin(), guid.end(), '-', '_');
-  return guid;
-}
-
-void DomStorageContext::CreateSessionNamespace(
-    int64 namespace_id,
-    const std::string& persistent_namespace_id) {
-  if (is_shutdown_)
-    return;
-  DCHECK(namespace_id != kLocalStorageNamespaceId);
-  DCHECK(namespaces_.find(namespace_id) == namespaces_.end());
-  namespaces_[namespace_id] = new DomStorageNamespace(
-      namespace_id, persistent_namespace_id, session_storage_database_.get(),
-      task_runner_.get());
-  persistent_namespace_id_to_namespace_id_[persistent_namespace_id] =
-      namespace_id;
-}
-
-void DomStorageContext::DeleteSessionNamespace(
-    int64 namespace_id, bool should_persist_data) {
-  DCHECK_NE(kLocalStorageNamespaceId, namespace_id);
-  StorageNamespaceMap::const_iterator it = namespaces_.find(namespace_id);
-  if (it == namespaces_.end())
-    return;
-  std::string persistent_namespace_id = it->second->persistent_namespace_id();
-  if (session_storage_database_.get()) {
-    if (!should_persist_data) {
-      task_runner_->PostShutdownBlockingTask(
-          FROM_HERE,
-          DomStorageTaskRunner::COMMIT_SEQUENCE,
-          base::Bind(
-              base::IgnoreResult(&SessionStorageDatabase::DeleteNamespace),
-              session_storage_database_,
-              persistent_namespace_id));
-    } else {
-      // Ensure that the data gets committed before we shut down.
-      it->second->Shutdown();
-      if (!scavenging_started_) {
-        // Protect the persistent namespace ID from scavenging.
-        protected_persistent_session_ids_.insert(persistent_namespace_id);
-      }
-    }
-  }
-  persistent_namespace_id_to_namespace_id_.erase(persistent_namespace_id);
-  namespaces_.erase(namespace_id);
-}
-
-void DomStorageContext::CloneSessionNamespace(
-    int64 existing_id, int64 new_id,
-    const std::string& new_persistent_id) {
-  if (is_shutdown_)
-    return;
-  DCHECK_NE(kLocalStorageNamespaceId, existing_id);
-  DCHECK_NE(kLocalStorageNamespaceId, new_id);
-  StorageNamespaceMap::iterator found = namespaces_.find(existing_id);
-  if (found != namespaces_.end())
-    namespaces_[new_id] = found->second->Clone(new_id, new_persistent_id);
-  else
-    CreateSessionNamespace(new_id, new_persistent_id);
-}
-
-void DomStorageContext::ClearSessionOnlyOrigins() {
-  if (!localstorage_directory_.empty()) {
-    std::vector<LocalStorageUsageInfo> infos;
-    const bool kDontIncludeFileInfo = false;
-    GetLocalStorageUsage(&infos, kDontIncludeFileInfo);
-    for (size_t i = 0; i < infos.size(); ++i) {
-      const GURL& origin = infos[i].origin;
-      if (special_storage_policy_->IsStorageProtected(origin))
-        continue;
-      if (!special_storage_policy_->IsStorageSessionOnly(origin))
-        continue;
-
-      base::FilePath database_file_path = localstorage_directory_.Append(
-          DomStorageArea::DatabaseFileNameFromOrigin(origin));
-      sql::Connection::Delete(database_file_path);
-    }
-  }
-  if (session_storage_database_.get()) {
-    std::vector<SessionStorageUsageInfo> infos;
-    GetSessionStorageUsage(&infos);
-    for (size_t i = 0; i < infos.size(); ++i) {
-      const GURL& origin = infos[i].origin;
-      if (special_storage_policy_->IsStorageProtected(origin))
-        continue;
-      if (!special_storage_policy_->IsStorageSessionOnly(origin))
-        continue;
-      session_storage_database_->DeleteArea(infos[i].persistent_namespace_id,
-                                            origin);
-    }
-  }
-}
-
-void DomStorageContext::SetSaveSessionStorageOnDisk() {
-  DCHECK(namespaces_.empty());
-  if (!sessionstorage_directory_.empty()) {
-    session_storage_database_ = new SessionStorageDatabase(
-        sessionstorage_directory_);
-  }
-}
-
-void DomStorageContext::StartScavengingUnusedSessionStorage() {
-  if (session_storage_database_.get()) {
-    task_runner_->PostDelayedTask(
-        FROM_HERE, base::Bind(&DomStorageContext::FindUnusedNamespaces, this),
-        base::TimeDelta::FromSeconds(kSessionStoraceScavengingSeconds));
-  }
-}
-
-void DomStorageContext::FindUnusedNamespaces() {
-  DCHECK(session_storage_database_.get());
-  if (scavenging_started_)
-    return;
-  scavenging_started_ = true;
-  std::set<std::string> namespace_ids_in_use;
-  for (StorageNamespaceMap::const_iterator it = namespaces_.begin();
-       it != namespaces_.end(); ++it)
-    namespace_ids_in_use.insert(it->second->persistent_namespace_id());
-  std::set<std::string> protected_persistent_session_ids;
-  protected_persistent_session_ids.swap(protected_persistent_session_ids_);
-  task_runner_->PostShutdownBlockingTask(
-      FROM_HERE, DomStorageTaskRunner::COMMIT_SEQUENCE,
-      base::Bind(
-          &DomStorageContext::FindUnusedNamespacesInCommitSequence,
-          this, namespace_ids_in_use, protected_persistent_session_ids));
-}
-
-void DomStorageContext::FindUnusedNamespacesInCommitSequence(
-    const std::set<std::string>& namespace_ids_in_use,
-    const std::set<std::string>& protected_persistent_session_ids) {
-  DCHECK(session_storage_database_.get());
-  // Delete all namespaces which don't have an associated DomStorageNamespace
-  // alive.
-  std::map<std::string, std::vector<GURL> > namespaces_and_origins;
-  session_storage_database_->ReadNamespacesAndOrigins(&namespaces_and_origins);
-  for (std::map<std::string, std::vector<GURL> >::const_iterator it =
-           namespaces_and_origins.begin();
-       it != namespaces_and_origins.end(); ++it) {
-    if (namespace_ids_in_use.find(it->first) == namespace_ids_in_use.end() &&
-        protected_persistent_session_ids.find(it->first) ==
-        protected_persistent_session_ids.end()) {
-      deletable_persistent_namespace_ids_.push_back(it->first);
-    }
-  }
-  if (!deletable_persistent_namespace_ids_.empty()) {
-    task_runner_->PostDelayedTask(
-        FROM_HERE, base::Bind(
-            &DomStorageContext::DeleteNextUnusedNamespace,
-            this),
-        base::TimeDelta::FromSeconds(kSessionStoraceScavengingSeconds));
-  }
-}
-
-void DomStorageContext::DeleteNextUnusedNamespace() {
-  if (is_shutdown_)
-    return;
-  task_runner_->PostShutdownBlockingTask(
-        FROM_HERE, DomStorageTaskRunner::COMMIT_SEQUENCE,
-        base::Bind(
-            &DomStorageContext::DeleteNextUnusedNamespaceInCommitSequence,
-            this));
-}
-
-void DomStorageContext::DeleteNextUnusedNamespaceInCommitSequence() {
-  if (deletable_persistent_namespace_ids_.empty())
-    return;
-  const std::string& persistent_id = deletable_persistent_namespace_ids_.back();
-  session_storage_database_->DeleteNamespace(persistent_id);
-  deletable_persistent_namespace_ids_.pop_back();
-  if (!deletable_persistent_namespace_ids_.empty()) {
-    task_runner_->PostDelayedTask(
-        FROM_HERE, base::Bind(
-            &DomStorageContext::DeleteNextUnusedNamespace,
-            this),
-        base::TimeDelta::FromSeconds(kSessionStoraceScavengingSeconds));
-  }
-}
-
-}  // namespace dom_storage
diff --git a/webkit/browser/dom_storage/dom_storage_context.h b/webkit/browser/dom_storage/dom_storage_context.h
deleted file mode 100644
index 9005d61..0000000
--- a/webkit/browser/dom_storage/dom_storage_context.h
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_CONTEXT_H_
-#define WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_CONTEXT_H_
-
-#include <map>
-#include <set>
-#include <vector>
-
-#include "base/atomic_sequence_num.h"
-#include "base/basictypes.h"
-#include "base/files/file_path.h"
-#include "base/gtest_prod_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/observer_list.h"
-#include "base/time/time.h"
-#include "url/gurl.h"
-#include "webkit/browser/webkit_storage_browser_export.h"
-
-namespace base {
-class FilePath;
-class NullableString16;
-class Time;
-}
-
-namespace quota {
-class SpecialStoragePolicy;
-}
-
-namespace dom_storage {
-
-class DomStorageArea;
-class DomStorageNamespace;
-class DomStorageSession;
-class DomStorageTaskRunner;
-class SessionStorageDatabase;
-struct LocalStorageUsageInfo;
-struct SessionStorageUsageInfo;
-
-// The Context is the root of an object containment hierachy for
-// Namespaces and Areas related to the owning profile.
-// One instance is allocated in the main process for each profile,
-// instance methods should be called serially in the background as
-// determined by the task_runner. Specifcally not on chrome's non-blocking
-// IO thread since these methods can result in blocking file io.
-//
-// In general terms, the DomStorage object relationships are...
-//   Contexts (per-profile) own Namespaces which own Areas which share Maps.
-//   Hosts(per-renderer) refer to Namespaces and Areas open in its renderer.
-//   Sessions (per-tab) cause the creation and deletion of session Namespaces.
-//
-// Session Namespaces are cloned by initially making a shallow copy of
-// all contained Areas, the shallow copies refer to the same refcounted Map,
-// and does a deep copy-on-write if needed.
-//
-// Classes intended to be used by an embedder are DomStorageContext,
-// DomStorageHost, and DomStorageSession. The other classes are for
-// internal consumption.
-class WEBKIT_STORAGE_BROWSER_EXPORT DomStorageContext
-    : public base::RefCountedThreadSafe<DomStorageContext> {
- public:
-  // An interface for observing Local and Session Storage events on the
-  // background thread.
-  class EventObserver {
-   public:
-    virtual void OnDomStorageItemSet(
-        const DomStorageArea* area,
-        const base::string16& key,
-        const base::string16& new_value,
-        const base::NullableString16& old_value,  // may be null on initial insert
-        const GURL& page_url) = 0;
-    virtual void OnDomStorageItemRemoved(
-        const DomStorageArea* area,
-        const base::string16& key,
-        const base::string16& old_value,
-        const GURL& page_url) = 0;
-    virtual void OnDomStorageAreaCleared(
-        const DomStorageArea* area,
-        const GURL& page_url) = 0;
-
-   protected:
-    virtual ~EventObserver() {}
-  };
-
-  DomStorageContext(
-      const base::FilePath& localstorage_directory,  // empty for incognito profiles
-      const base::FilePath& sessionstorage_directory,  // empty for incognito profiles
-      quota::SpecialStoragePolicy* special_storage_policy,
-      DomStorageTaskRunner* task_runner);
-
-  // Returns the directory path for localStorage, or an empty directory, if
-  // there is no backing on disk.
-  const base::FilePath& localstorage_directory() {
-    return localstorage_directory_;
-  }
-
-  // Returns the directory path for sessionStorage, or an empty directory, if
-  // there is no backing on disk.
-  const base::FilePath& sessionstorage_directory() {
-    return sessionstorage_directory_;
-  }
-
-  DomStorageTaskRunner* task_runner() const { return task_runner_.get(); }
-  DomStorageNamespace* GetStorageNamespace(int64 namespace_id);
-
-  void GetLocalStorageUsage(std::vector<LocalStorageUsageInfo>* infos,
-                            bool include_file_info);
-  void GetSessionStorageUsage(std::vector<SessionStorageUsageInfo>* infos);
-  void DeleteLocalStorage(const GURL& origin);
-  void DeleteSessionStorage(const SessionStorageUsageInfo& usage_info);
-  void PurgeMemory();
-
-  // Used by content settings to alter the behavior around
-  // what data to keep and what data to discard at shutdown.
-  // The policy is not so straight forward to describe, see
-  // the implementation for details.
-  void SetForceKeepSessionState() {
-    force_keep_session_state_ = true;
-  }
-
-  // Called when the owning BrowserContext is ending.
-  // Schedules the commit of any unsaved changes and will delete
-  // and keep data on disk per the content settings and special storage
-  // policies. Contained areas and namespaces will stop functioning after
-  // this method has been called.
-  void Shutdown();
-
-  // Methods to add, remove, and notify EventObservers.
-  void AddEventObserver(EventObserver* observer);
-  void RemoveEventObserver(EventObserver* observer);
-  void NotifyItemSet(
-      const DomStorageArea* area,
-      const base::string16& key,
-      const base::string16& new_value,
-      const base::NullableString16& old_value,
-      const GURL& page_url);
-  void NotifyItemRemoved(
-      const DomStorageArea* area,
-      const base::string16& key,
-      const base::string16& old_value,
-      const GURL& page_url);
-  void NotifyAreaCleared(
-      const DomStorageArea* area,
-      const GURL& page_url);
-
-  // May be called on any thread.
-  int64 AllocateSessionId() {
-    return session_id_sequence_.GetNext();
-  }
-
-  std::string AllocatePersistentSessionId();
-
-  // Must be called on the background thread.
-  void CreateSessionNamespace(int64 namespace_id,
-                              const std::string& persistent_namespace_id);
-  void DeleteSessionNamespace(int64 namespace_id, bool should_persist_data);
-  void CloneSessionNamespace(int64 existing_id, int64 new_id,
-                             const std::string& new_persistent_id);
-
-  // Starts backing sessionStorage on disk. This function must be called right
-  // after DomStorageContext is created, before it's used.
-  void SetSaveSessionStorageOnDisk();
-
-  // Deletes all namespaces which don't have an associated DomStorageNamespace
-  // alive. This function is used for deleting possible leftover data after an
-  // unclean exit.
-  void StartScavengingUnusedSessionStorage();
-
- private:
-  friend class DomStorageContextTest;
-  FRIEND_TEST_ALL_PREFIXES(DomStorageContextTest, Basics);
-  friend class base::RefCountedThreadSafe<DomStorageContext>;
-  typedef std::map<int64, scoped_refptr<DomStorageNamespace> >
-      StorageNamespaceMap;
-
-  ~DomStorageContext();
-
-  void ClearSessionOnlyOrigins();
-
-  // For scavenging unused sessionStorages.
-  void FindUnusedNamespaces();
-  void FindUnusedNamespacesInCommitSequence(
-      const std::set<std::string>& namespace_ids_in_use,
-      const std::set<std::string>& protected_persistent_session_ids);
-  void DeleteNextUnusedNamespace();
-  void DeleteNextUnusedNamespaceInCommitSequence();
-
-  // Collection of namespaces keyed by id.
-  StorageNamespaceMap namespaces_;
-
-  // Where localstorage data is stored, maybe empty for the incognito use case.
-  base::FilePath localstorage_directory_;
-
-  // Where sessionstorage data is stored, maybe empty for the incognito use
-  // case. Always empty until the file-backed session storage feature is
-  // implemented.
-  base::FilePath sessionstorage_directory_;
-
-  // Used to schedule sequenced background tasks.
-  scoped_refptr<DomStorageTaskRunner> task_runner_;
-
-  // List of objects observing local storage events.
-  ObserverList<EventObserver> event_observers_;
-
-  // We use a 32 bit identifier for per tab storage sessions.
-  // At a tab per second, this range is large enough for 68 years.
-  base::AtomicSequenceNumber session_id_sequence_;
-
-  bool is_shutdown_;
-  bool force_keep_session_state_;
-  scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy_;
-  scoped_refptr<SessionStorageDatabase> session_storage_database_;
-
-  // For cleaning up unused namespaces gradually.
-  bool scavenging_started_;
-  std::vector<std::string> deletable_persistent_namespace_ids_;
-
-  // Persistent namespace IDs to protect from gradual deletion (they will
-  // be needed for session restore).
-  std::set<std::string> protected_persistent_session_ids_;
-
-  // Mapping between persistent namespace IDs and namespace IDs for
-  // sessionStorage.
-  std::map<std::string, int64> persistent_namespace_id_to_namespace_id_;
-};
-
-}  // namespace dom_storage
-
-#endif  // WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_CONTEXT_H_
diff --git a/webkit/browser/dom_storage/dom_storage_database_adapter.h b/webkit/browser/dom_storage/dom_storage_database_adapter.h
deleted file mode 100644
index 360e6bd..0000000
--- a/webkit/browser/dom_storage/dom_storage_database_adapter.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_ADAPTER_H_
-#define WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_ADAPTER_H_
-
-// Database interface used by DomStorageArea. Abstracts the differences between
-// the per-origin DomStorageDatabases for localStorage and
-// SessionStorageDatabase which stores multiple origins.
-
-#include "webkit/browser/webkit_storage_browser_export.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
-
-namespace dom_storage {
-
-class WEBKIT_STORAGE_BROWSER_EXPORT DomStorageDatabaseAdapter {
- public:
-  virtual ~DomStorageDatabaseAdapter() {}
-  virtual void ReadAllValues(ValuesMap* result) = 0;
-  virtual bool CommitChanges(
-      bool clear_all_first, const ValuesMap& changes) = 0;
-  virtual void DeleteFiles() {}
-  virtual void Reset() {}
-};
-
-}  // namespace dom_storage
-
-#endif  // WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_DATABASE_ADAPTER_H_
diff --git a/webkit/browser/dom_storage/dom_storage_session.h b/webkit/browser/dom_storage/dom_storage_session.h
deleted file mode 100644
index b500859..0000000
--- a/webkit/browser/dom_storage/dom_storage_session.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_SESSION_H_
-#define WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_SESSION_H_
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/memory/ref_counted.h"
-#include "webkit/browser/webkit_storage_browser_export.h"
-
-namespace dom_storage {
-
-class DomStorageContext;
-
-// This refcounted class determines the lifetime of a session
-// storage namespace and provides an interface to Clone() an
-// existing session storage namespace. It may be used on any thread.
-// See class comments for DomStorageContext for a larger overview.
-class WEBKIT_STORAGE_BROWSER_EXPORT DomStorageSession
-    : public base::RefCountedThreadSafe<DomStorageSession> {
- public:
-  // Constructs a |DomStorageSession| and allocates new IDs for it.
-  explicit DomStorageSession(DomStorageContext* context);
-
-  // Constructs a |DomStorageSession| and assigns |persistent_namespace_id|
-  // to it. Allocates a new non-persistent ID.
-  DomStorageSession(DomStorageContext* context,
-                    const std::string& persistent_namespace_id);
-
-  int64 namespace_id() const { return namespace_id_; }
-  const std::string& persistent_namespace_id() const {
-    return persistent_namespace_id_;
-  }
-  void SetShouldPersist(bool should_persist);
-  bool should_persist() const;
-  bool IsFromContext(DomStorageContext* context);
-  DomStorageSession* Clone();
-
-  // Constructs a |DomStorageSession| by cloning
-  // |namespace_id_to_clone|. Allocates new IDs for it.
-  static DomStorageSession* CloneFrom(DomStorageContext* context,
-                                      int64 namepace_id_to_clone);
-
- private:
-  friend class base::RefCountedThreadSafe<DomStorageSession>;
-
-  DomStorageSession(DomStorageContext* context,
-                    int64 namespace_id,
-                    const std::string& persistent_namespace_id);
-  ~DomStorageSession();
-
-  scoped_refptr<DomStorageContext> context_;
-  int64 namespace_id_;
-  std::string persistent_namespace_id_;
-  bool should_persist_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(DomStorageSession);
-};
-
-}  // namespace dom_storage
-
-#endif  // WEBKIT_BROWSER_DOM_STORAGE_DOM_STORAGE_SESSION_H_
diff --git a/webkit/browser/dom_storage/local_storage_database_adapter.cc b/webkit/browser/dom_storage/local_storage_database_adapter.cc
deleted file mode 100644
index 681939e..0000000
--- a/webkit/browser/dom_storage/local_storage_database_adapter.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "webkit/browser/dom_storage/local_storage_database_adapter.h"
-
-#include "base/file_util.h"
-#include "webkit/browser/dom_storage/dom_storage_database.h"
-
-namespace dom_storage {
-
-LocalStorageDatabaseAdapter::LocalStorageDatabaseAdapter(
-    const base::FilePath& path)
-    : db_(new DomStorageDatabase(path)) {
-}
-
-LocalStorageDatabaseAdapter::~LocalStorageDatabaseAdapter() { }
-
-void LocalStorageDatabaseAdapter::ReadAllValues(ValuesMap* result) {
-  db_->ReadAllValues(result);
-}
-
-bool LocalStorageDatabaseAdapter::CommitChanges(
-    bool clear_all_first, const ValuesMap& changes) {
-  return db_->CommitChanges(clear_all_first, changes);
-}
-
-void LocalStorageDatabaseAdapter::DeleteFiles() {
-  sql::Connection::Delete(db_->file_path());
-}
-
-void LocalStorageDatabaseAdapter::Reset() {
-  db_.reset(new DomStorageDatabase(db_->file_path()));
-}
-
-LocalStorageDatabaseAdapter::LocalStorageDatabaseAdapter()
-    : db_(new DomStorageDatabase()) {
-}
-
-}  // namespace dom_storage
diff --git a/webkit/browser/dom_storage/local_storage_database_adapter.h b/webkit/browser/dom_storage/local_storage_database_adapter.h
deleted file mode 100644
index 7cdabf4..0000000
--- a/webkit/browser/dom_storage/local_storage_database_adapter.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef WEBKIT_BROWSER_DOM_STORAGE_LOCAL_STORAGE_DATABASE_ADAPTER_H_
-#define WEBKIT_BROWSER_DOM_STORAGE_LOCAL_STORAGE_DATABASE_ADAPTER_H_
-
-#include "base/gtest_prod_util.h"
-#include "base/memory/scoped_ptr.h"
-#include "webkit/browser/dom_storage/dom_storage_database_adapter.h"
-#include "webkit/browser/webkit_storage_browser_export.h"
-
-namespace base {
-class FilePath;
-}
-
-namespace dom_storage {
-
-class DomStorageDatabase;
-
-class WEBKIT_STORAGE_BROWSER_EXPORT LocalStorageDatabaseAdapter :
-      public DomStorageDatabaseAdapter {
- public:
-  explicit LocalStorageDatabaseAdapter(const base::FilePath& path);
-  virtual ~LocalStorageDatabaseAdapter();
-  virtual void ReadAllValues(ValuesMap* result) OVERRIDE;
-  virtual bool CommitChanges(bool clear_all_first,
-                             const ValuesMap& changes) OVERRIDE;
-  virtual void DeleteFiles() OVERRIDE;
-  virtual void Reset() OVERRIDE;
-
- protected:
-  // Constructor that uses an in-memory sqlite database, for testing.
-  LocalStorageDatabaseAdapter();
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, BackingDatabaseOpened);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, CommitChangesAtShutdown);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, CommitTasks);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, DeleteOrigin);
-  FRIEND_TEST_ALL_PREFIXES(DomStorageAreaTest, PurgeMemory);
-
-  scoped_ptr<DomStorageDatabase> db_;
-
-  DISALLOW_COPY_AND_ASSIGN(LocalStorageDatabaseAdapter);
-};
-
-}  // namespace dom_storage
-
-#endif  // WEBKIT_BROWSER_DOM_STORAGE_LOCAL_STORAGE_DATABASE_ADAPTER_H_
diff --git a/webkit/browser/dom_storage/session_storage_database_adapter.h b/webkit/browser/dom_storage/session_storage_database_adapter.h
deleted file mode 100644
index 96b7b3e..0000000
--- a/webkit/browser/dom_storage/session_storage_database_adapter.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef WEBKIT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_ADAPTER_H_
-#define WEBKIT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_ADAPTER_H_
-
-#include "base/memory/ref_counted.h"
-#include "url/gurl.h"
-#include "webkit/browser/dom_storage/dom_storage_database_adapter.h"
-
-namespace dom_storage {
-
-class SessionStorageDatabase;
-
-class SessionStorageDatabaseAdapter : public DomStorageDatabaseAdapter {
- public:
-  SessionStorageDatabaseAdapter(SessionStorageDatabase* db,
-                                const std::string& permanent_namespace_id,
-                                const GURL& origin);
-  virtual ~SessionStorageDatabaseAdapter();
-  virtual void ReadAllValues(ValuesMap* result) OVERRIDE;
-  virtual bool CommitChanges(bool clear_all_first,
-                             const ValuesMap& changes) OVERRIDE;
- private:
-  scoped_refptr<SessionStorageDatabase> db_;
-  std::string permanent_namespace_id_;
-  GURL origin_;
-
-  DISALLOW_COPY_AND_ASSIGN(SessionStorageDatabaseAdapter);
-};
-
-}  // namespace dom_storage
-
-#endif  // WEBKIT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_ADAPTER_H_
diff --git a/webkit/browser/fileapi/file_system_operation_context.h b/webkit/browser/fileapi/file_system_operation_context.h
index 4fae428..4d17510 100644
--- a/webkit/browser/fileapi/file_system_operation_context.h
+++ b/webkit/browser/fileapi/file_system_operation_context.h
@@ -77,30 +77,7 @@
     root_path_ = root_path;
   }
 
-  // Gets and sets value-type (or not-owned) variable as UserData.
-  // (SetUserValue can be called only on the same thread as this context
-  // is created as well as other setters.)
-  template <typename T> T GetUserValue(const char* key) const {
-    ValueAdapter<T>* v = static_cast<ValueAdapter<T>*>(GetUserData(key));
-    return v ? v->value() : T();
-  }
-  template <typename T> void SetUserValue(const char* key, const T& value) {
-    DCHECK(setter_thread_checker_.CalledOnValidThread());
-    SetUserData(key, new ValueAdapter<T>(value));
-  }
-
  private:
-  // An adapter for setting a value-type (or not owned) data as UserData.
-  template <typename T> class ValueAdapter
-      : public base::SupportsUserData::Data {
-   public:
-    ValueAdapter(const T& value) : value_(value) {}
-    const T& value() const { return value_; }
-   private:
-    T value_;
-    DISALLOW_COPY_AND_ASSIGN(ValueAdapter);
-  };
-
   scoped_refptr<FileSystemContext> file_system_context_;
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
diff --git a/webkit/common/dom_storage/OWNERS b/webkit/common/dom_storage/OWNERS
deleted file mode 100644
index 88ceed4..0000000
--- a/webkit/common/dom_storage/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-marja@chromium.org
diff --git a/webkit/common/dom_storage/dom_storage_map.h b/webkit/common/dom_storage/dom_storage_map.h
deleted file mode 100644
index 69db984..0000000
--- a/webkit/common/dom_storage/dom_storage_map.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef WEBKIT_COMMON_DOM_STORAGE_DOM_STORAGE_MAP_H_
-#define WEBKIT_COMMON_DOM_STORAGE_DOM_STORAGE_MAP_H_
-
-#include <map>
-
-#include "base/memory/ref_counted.h"
-#include "base/strings/nullable_string16.h"
-#include "base/strings/string16.h"
-#include "webkit/common/dom_storage/dom_storage_types.h"
-#include "webkit/common/webkit_storage_common_export.h"
-
-namespace dom_storage {
-
-// A wrapper around a std::map that adds refcounting and
-// tracks the size in bytes of the keys/values, enforcing a quota.
-// See class comments for DomStorageContext for a larger overview.
-class WEBKIT_STORAGE_COMMON_EXPORT DomStorageMap
-    : public base::RefCountedThreadSafe<DomStorageMap> {
- public:
-  explicit DomStorageMap(size_t quota);
-
-  unsigned Length() const;
-  base::NullableString16 Key(unsigned index);
-  base::NullableString16 GetItem(const base::string16& key) const;
-  bool SetItem(const base::string16& key, const base::string16& value,
-               base::NullableString16* old_value);
-  bool RemoveItem(const base::string16& key, base::string16* old_value);
-
-  // Swaps this instances values_ with |map|.
-  // Note: to grandfather in pre-existing files that are overbudget,
-  // this method does not do quota checking.
-  void SwapValues(ValuesMap* map);
-
-  // Writes a copy of the current set of values_ to the |map|.
-  void ExtractValues(ValuesMap* map) const { *map = values_; }
-
-  // Creates a new instance of DomStorageMap containing
-  // a deep copy of values_.
-  DomStorageMap* DeepCopy() const;
-
-  size_t bytes_used() const { return bytes_used_; }
-  size_t quota() const { return quota_; }
-  void set_quota(size_t quota) { quota_ = quota; }
-
- private:
-  friend class base::RefCountedThreadSafe<DomStorageMap>;
-  ~DomStorageMap();
-
-  void ResetKeyIterator();
-
-  ValuesMap values_;
-  ValuesMap::const_iterator key_iterator_;
-  unsigned last_key_index_;
-  size_t bytes_used_;
-  size_t quota_;
-};
-
-}  // namespace dom_storage
-
-#endif  // WEBKIT_COMMON_DOM_STORAGE_DOM_STORAGE_MAP_H_
diff --git a/webkit/common/dom_storage/dom_storage_types.cc b/webkit/common/dom_storage/dom_storage_types.cc
deleted file mode 100644
index 256f32d..0000000
--- a/webkit/common/dom_storage/dom_storage_types.cc
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "webkit/common/dom_storage/dom_storage_types.h"
-
-namespace dom_storage {
-
-LocalStorageUsageInfo::LocalStorageUsageInfo()
-    : data_size(0) {}
-LocalStorageUsageInfo::~LocalStorageUsageInfo() {}
-
-SessionStorageUsageInfo::SessionStorageUsageInfo() {}
-SessionStorageUsageInfo::~SessionStorageUsageInfo() {}
-
-}  // namespace dom_storage
diff --git a/webkit/common/dom_storage/dom_storage_types.h b/webkit/common/dom_storage/dom_storage_types.h
deleted file mode 100644
index 1d1e585..0000000
--- a/webkit/common/dom_storage/dom_storage_types.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef WEBKIT_COMMON_DOM_STORAGE_DOM_STORAGE_TYPES_H_
-#define WEBKIT_COMMON_DOM_STORAGE_DOM_STORAGE_TYPES_H_
-
-#include <map>
-
-#include "base/basictypes.h"
-#include "base/strings/nullable_string16.h"
-#include "base/strings/string16.h"
-#include "base/time/time.h"
-#include "url/gurl.h"
-#include "webkit/common/webkit_storage_common_export.h"
-
-namespace dom_storage {
-
-// The quota for each storage area.
-// This value is enforced in renderer processes and the browser process.
-const size_t kPerAreaQuota = 10 * 1024 * 1024;
-
-// In the browser process we allow some overage to
-// accomodate concurrent writes from different renderers
-// that were allowed because the limit imposed in the renderer
-// wasn't exceeded.
-const size_t kPerAreaOverQuotaAllowance = 100 * 1024;
-
-// Value to indicate the localstorage namespace vs non-zero
-// values for sessionstorage namespaces.
-const int64 kLocalStorageNamespaceId = 0;
-
-const int64 kInvalidSessionStorageNamespaceId = kLocalStorageNamespaceId;
-
-// Start purging memory if the number of in-memory areas exceeds this.
-const int64 kMaxInMemoryAreas = 100;
-
-// Value to indicate an area that not be opened.
-const int kInvalidAreaId = -1;
-
-typedef std::map<base::string16, base::NullableString16> ValuesMap;
-
-struct WEBKIT_STORAGE_COMMON_EXPORT LocalStorageUsageInfo {
-  GURL origin;
-  size_t data_size;
-  base::Time last_modified;
-
-  LocalStorageUsageInfo();
-  ~LocalStorageUsageInfo();
-};
-
-struct WEBKIT_STORAGE_COMMON_EXPORT SessionStorageUsageInfo {
-  GURL origin;
-  std::string persistent_namespace_id;
-
-  SessionStorageUsageInfo();
-  ~SessionStorageUsageInfo();
-};
-
-}  // namespace dom_storage
-
-#endif  // WEBKIT_COMMON_DOM_STORAGE_DOM_STORAGE_TYPES_H_
diff --git a/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc b/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
index 57767ec..886e40f 100644
--- a/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
+++ b/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
@@ -73,7 +73,7 @@
   scoped_ptr<WebKit::WebGraphicsContext3D> context;
   if (gfx::GLSurface::InitializeOneOff()) {
     context.reset(new WebGraphicsContext3DInProcessCommandBufferImpl(
-      attributes, false, window));
+      scoped_ptr< ::gpu::GLInProcessContext>(), attributes, false, window));
   }
   return context.Pass();
 }
@@ -83,12 +83,29 @@
 WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext(
     const WebKit::WebGraphicsContext3D::Attributes& attributes) {
   return make_scoped_ptr(new WebGraphicsContext3DInProcessCommandBufferImpl(
-      attributes, true, gfx::kNullAcceleratedWidget))
+                             scoped_ptr< ::gpu::GLInProcessContext>(),
+                             attributes,
+                             true,
+                             gfx::kNullAcceleratedWidget))
+      .PassAs<WebKit::WebGraphicsContext3D>();
+}
+
+scoped_ptr<WebKit::WebGraphicsContext3D>
+WebGraphicsContext3DInProcessCommandBufferImpl::WrapContext(
+    scoped_ptr< ::gpu::GLInProcessContext> context,
+    const WebKit::WebGraphicsContext3D::Attributes& attributes) {
+  return make_scoped_ptr(
+      new WebGraphicsContext3DInProcessCommandBufferImpl(
+          context.Pass(),
+          attributes,
+          true /* is_offscreen. Not used. */,
+          gfx::kNullAcceleratedWidget /* window. Not used. */))
       .PassAs<WebKit::WebGraphicsContext3D>();
 }
 
 WebGraphicsContext3DInProcessCommandBufferImpl::
     WebGraphicsContext3DInProcessCommandBufferImpl(
+        scoped_ptr< ::gpu::GLInProcessContext> context,
         const WebKit::WebGraphicsContext3D::Attributes& attributes,
         bool is_offscreen,
         gfx::AcceleratedWidget window)
@@ -96,6 +113,7 @@
       window_(window),
       initialized_(false),
       initialize_failed_(false),
+      context_(context.Pass()),
       gl_(NULL),
       context_lost_callback_(NULL),
       context_lost_reason_(GL_NO_ERROR),
@@ -108,6 +126,17 @@
     ~WebGraphicsContext3DInProcessCommandBufferImpl() {
 }
 
+// static
+void WebGraphicsContext3DInProcessCommandBufferImpl::ConvertAttributes(
+    const WebKit::WebGraphicsContext3D::Attributes& attributes,
+    ::gpu::GLInProcessContextAttribs* output_attribs) {
+  output_attribs->alpha_size = attributes.alpha ? 8 : 0;
+  output_attribs->depth_size = attributes.depth ? 24 : 0;
+  output_attribs->stencil_size = attributes.stencil ? 8 : 0;
+  output_attribs->samples = attributes.antialias ? 4 : 0;
+  output_attribs->sample_buffers = attributes.antialias ? 1 : 0;
+}
+
 bool WebGraphicsContext3DInProcessCommandBufferImpl::MaybeInitializeGL() {
   if (initialized_)
     return true;
@@ -118,46 +147,35 @@
   // Ensure the gles2 library is initialized first in a thread safe way.
   g_gles2_initializer.Get();
 
-  // Convert WebGL context creation attributes into GLInProcessContext / EGL
-  // size requests.
-  const int alpha_size = attributes_.alpha ? 8 : 0;
-  const int depth_size = attributes_.depth ? 24 : 0;
-  const int stencil_size = attributes_.stencil ? 8 : 0;
-  const int samples = attributes_.antialias ? 4 : 0;
-  const int sample_buffers = attributes_.antialias ? 1 : 0;
-  const int32 attribs[] = {
-    GLInProcessContext::ALPHA_SIZE, alpha_size,
-    GLInProcessContext::DEPTH_SIZE, depth_size,
-    GLInProcessContext::STENCIL_SIZE, stencil_size,
-    GLInProcessContext::SAMPLES, samples,
-    GLInProcessContext::SAMPLE_BUFFERS, sample_buffers,
-    GLInProcessContext::NONE,
-  };
-
-  const char* preferred_extensions = "*";
-
-  // TODO(kbr): More work will be needed in this implementation to
-  // properly support GPU switching. Like in the out-of-process
-  // command buffer implementation, all previously created contexts
-  // will need to be lost either when the first context requesting the
-  // discrete GPU is created, or the last one is destroyed.
-  gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
-
-  base::Closure context_lost_callback =
-      base::Bind(&WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost,
-                 base::Unretained(this));
-
-  context_.reset(GLInProcessContext::CreateContext(
-      is_offscreen_,
-      window_,
-      gfx::Size(1, 1),
-      attributes_.shareResources,
-      preferred_extensions,
-      attribs,
-      gpu_preference,
-      context_lost_callback));
-
   if (!context_) {
+    const char* preferred_extensions = "*";
+
+    // TODO(kbr): More work will be needed in this implementation to
+    // properly support GPU switching. Like in the out-of-process
+    // command buffer implementation, all previously created contexts
+    // will need to be lost either when the first context requesting the
+    // discrete GPU is created, or the last one is destroyed.
+    gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
+
+    ::gpu::GLInProcessContextAttribs attrib_struct;
+    ConvertAttributes(attributes_, &attrib_struct),
+
+    context_.reset(GLInProcessContext::CreateContext(
+        is_offscreen_,
+        window_,
+        gfx::Size(1, 1),
+        attributes_.shareResources,
+        preferred_extensions,
+        attrib_struct,
+        gpu_preference));
+  }
+
+  if (context_) {
+    base::Closure context_lost_callback = base::Bind(
+        &WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost,
+        base::Unretained(this));
+    context_->SetContextLostCallback(context_lost_callback);
+  } else {
     initialize_failed_ = true;
     return false;
   }
diff --git a/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h b/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h
index 9ef3698..d3620b4 100644
--- a/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h
+++ b/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h
@@ -39,6 +39,7 @@
 
 namespace gpu {
 class GLInProcessContext;
+struct GLInProcessContextAttribs;
 }
 
 namespace webkit {
@@ -54,8 +55,18 @@
   static scoped_ptr<WebKit::WebGraphicsContext3D> CreateOffscreenContext(
       const WebKit::WebGraphicsContext3D::Attributes& attributes);
 
+  static scoped_ptr<WebKit::WebGraphicsContext3D> WrapContext(
+      scoped_ptr< ::gpu::GLInProcessContext> context,
+      const WebKit::WebGraphicsContext3D::Attributes& attributes);
+
   virtual ~WebGraphicsContext3DInProcessCommandBufferImpl();
 
+  // Convert WebGL context creation attributes into GLInProcessContext / EGL
+  // size requests.
+  static void ConvertAttributes(
+      const WebKit::WebGraphicsContext3D::Attributes& attributes,
+      ::gpu::GLInProcessContextAttribs* output_attribs);
+
   //----------------------------------------------------------------------
   // WebGraphicsContext3D methods
   virtual bool makeContextCurrent();
@@ -536,6 +547,7 @@
 
  private:
   WebGraphicsContext3DInProcessCommandBufferImpl(
+      scoped_ptr< ::gpu::GLInProcessContext> context,
       const WebKit::WebGraphicsContext3D::Attributes& attributes,
       bool is_offscreen,
       gfx::AcceleratedWidget window);
diff --git a/webkit/renderer/compositor_bindings/web_layer_impl.cc b/webkit/renderer/compositor_bindings/web_layer_impl.cc
index 4969077..0545b3a 100644
--- a/webkit/renderer/compositor_bindings/web_layer_impl.cc
+++ b/webkit/renderer/compositor_bindings/web_layer_impl.cc
@@ -362,6 +362,10 @@
 
 bool WebLayerImpl::isOrphan() const { return !layer_->layer_tree_host(); }
 
+void WebLayerImpl::setWebLayerClient(WebKit::WebLayerClient* client) {
+  web_layer_client_ = client;
+}
+
 Layer* WebLayerImpl::layer() const { return layer_.get(); }
 
 }  // namespace webkit
diff --git a/webkit/renderer/compositor_bindings/web_layer_impl.h b/webkit/renderer/compositor_bindings/web_layer_impl.h
index b92b0bf..ee5997d 100644
--- a/webkit/renderer/compositor_bindings/web_layer_impl.h
+++ b/webkit/renderer/compositor_bindings/web_layer_impl.h
@@ -27,6 +27,7 @@
 
 namespace WebKit {
 class WebFilterOperations;
+class WebLayerClient;
 struct WebFloatRect;
 }
 
@@ -117,9 +118,11 @@
   virtual WebKit::WebLayerPositionConstraint positionConstraint() const;
   virtual void setScrollClient(WebKit::WebLayerScrollClient* client);
   virtual bool isOrphan() const;
+  virtual void setWebLayerClient(WebKit::WebLayerClient* client);
 
  protected:
   scoped_refptr<cc::Layer> layer_;
+  WebKit::WebLayerClient* web_layer_client_;
 
  private:
   scoped_ptr<WebToCCAnimationDelegateAdapter> animation_delegate_adapter_;
diff --git a/webkit/storage_browser.gyp b/webkit/storage_browser.gyp
index b44d2c5..04e609a 100644
--- a/webkit/storage_browser.gyp
+++ b/webkit/storage_browser.gyp
@@ -90,27 +90,6 @@
         'browser/database/databases_table.h',
         'browser/database/vfs_backend.cc',
         'browser/database/vfs_backend.h',
-        'browser/dom_storage/dom_storage_area.cc',
-        'browser/dom_storage/dom_storage_area.h',
-        'browser/dom_storage/dom_storage_context.cc',
-        'browser/dom_storage/dom_storage_context.h',
-        'browser/dom_storage/dom_storage_database.cc',
-        'browser/dom_storage/dom_storage_database.h',
-        'browser/dom_storage/dom_storage_database_adapter.h',
-        'browser/dom_storage/dom_storage_host.cc',
-        'browser/dom_storage/dom_storage_host.h',
-        'browser/dom_storage/dom_storage_namespace.cc',
-        'browser/dom_storage/dom_storage_namespace.h',
-        'browser/dom_storage/dom_storage_session.cc',
-        'browser/dom_storage/dom_storage_session.h',
-        'browser/dom_storage/dom_storage_task_runner.cc',
-        'browser/dom_storage/dom_storage_task_runner.h',
-        'browser/dom_storage/local_storage_database_adapter.cc',
-        'browser/dom_storage/local_storage_database_adapter.h',
-        'browser/dom_storage/session_storage_database.cc',
-        'browser/dom_storage/session_storage_database.h',
-        'browser/dom_storage/session_storage_database_adapter.cc',
-        'browser/dom_storage/session_storage_database_adapter.h',
         'browser/fileapi/async_file_util.h',
         'browser/fileapi/async_file_util_adapter.cc',
         'browser/fileapi/async_file_util_adapter.h',
diff --git a/webkit/storage_common.gyp b/webkit/storage_common.gyp
index c406b22..01e8f23 100644
--- a/webkit/storage_common.gyp
+++ b/webkit/storage_common.gyp
@@ -30,10 +30,6 @@
         'common/database/database_connections.h',
         'common/database/database_identifier.cc',
         'common/database/database_identifier.cc',
-        'common/dom_storage/dom_storage_map.cc',
-        'common/dom_storage/dom_storage_map.h',
-        'common/dom_storage/dom_storage_types.cc',
-        'common/dom_storage/dom_storage_types.h',
         'common/fileapi/directory_entry.cc',
         'common/fileapi/directory_entry.h',
         'common/fileapi/file_system_types.h',
diff --git a/webkit/webkit_storage_browser.target.darwin-arm.mk b/webkit/webkit_storage_browser.target.darwin-arm.mk
index b1ca9ad..349d8bc 100644
--- a/webkit/webkit_storage_browser.target.darwin-arm.mk
+++ b/webkit/webkit_storage_browser.target.darwin-arm.mk
@@ -57,16 +57,6 @@
 	webkit/browser/database/database_util.cc \
 	webkit/browser/database/databases_table.cc \
 	webkit/browser/database/vfs_backend.cc \
-	webkit/browser/dom_storage/dom_storage_area.cc \
-	webkit/browser/dom_storage/dom_storage_context.cc \
-	webkit/browser/dom_storage/dom_storage_database.cc \
-	webkit/browser/dom_storage/dom_storage_host.cc \
-	webkit/browser/dom_storage/dom_storage_namespace.cc \
-	webkit/browser/dom_storage/dom_storage_session.cc \
-	webkit/browser/dom_storage/dom_storage_task_runner.cc \
-	webkit/browser/dom_storage/local_storage_database_adapter.cc \
-	webkit/browser/dom_storage/session_storage_database.cc \
-	webkit/browser/dom_storage/session_storage_database_adapter.cc \
 	webkit/browser/fileapi/async_file_util_adapter.cc \
 	webkit/browser/fileapi/copy_or_move_operation_delegate.cc \
 	webkit/browser/fileapi/external_mount_points.cc \
diff --git a/webkit/webkit_storage_browser.target.darwin-mips.mk b/webkit/webkit_storage_browser.target.darwin-mips.mk
index d4db6e3..223f22b 100644
--- a/webkit/webkit_storage_browser.target.darwin-mips.mk
+++ b/webkit/webkit_storage_browser.target.darwin-mips.mk
@@ -57,16 +57,6 @@
 	webkit/browser/database/database_util.cc \
 	webkit/browser/database/databases_table.cc \
 	webkit/browser/database/vfs_backend.cc \
-	webkit/browser/dom_storage/dom_storage_area.cc \
-	webkit/browser/dom_storage/dom_storage_context.cc \
-	webkit/browser/dom_storage/dom_storage_database.cc \
-	webkit/browser/dom_storage/dom_storage_host.cc \
-	webkit/browser/dom_storage/dom_storage_namespace.cc \
-	webkit/browser/dom_storage/dom_storage_session.cc \
-	webkit/browser/dom_storage/dom_storage_task_runner.cc \
-	webkit/browser/dom_storage/local_storage_database_adapter.cc \
-	webkit/browser/dom_storage/session_storage_database.cc \
-	webkit/browser/dom_storage/session_storage_database_adapter.cc \
 	webkit/browser/fileapi/async_file_util_adapter.cc \
 	webkit/browser/fileapi/copy_or_move_operation_delegate.cc \
 	webkit/browser/fileapi/external_mount_points.cc \
diff --git a/webkit/webkit_storage_browser.target.darwin-x86.mk b/webkit/webkit_storage_browser.target.darwin-x86.mk
index a381d65..9c2fe20 100644
--- a/webkit/webkit_storage_browser.target.darwin-x86.mk
+++ b/webkit/webkit_storage_browser.target.darwin-x86.mk
@@ -57,16 +57,6 @@
 	webkit/browser/database/database_util.cc \
 	webkit/browser/database/databases_table.cc \
 	webkit/browser/database/vfs_backend.cc \
-	webkit/browser/dom_storage/dom_storage_area.cc \
-	webkit/browser/dom_storage/dom_storage_context.cc \
-	webkit/browser/dom_storage/dom_storage_database.cc \
-	webkit/browser/dom_storage/dom_storage_host.cc \
-	webkit/browser/dom_storage/dom_storage_namespace.cc \
-	webkit/browser/dom_storage/dom_storage_session.cc \
-	webkit/browser/dom_storage/dom_storage_task_runner.cc \
-	webkit/browser/dom_storage/local_storage_database_adapter.cc \
-	webkit/browser/dom_storage/session_storage_database.cc \
-	webkit/browser/dom_storage/session_storage_database_adapter.cc \
 	webkit/browser/fileapi/async_file_util_adapter.cc \
 	webkit/browser/fileapi/copy_or_move_operation_delegate.cc \
 	webkit/browser/fileapi/external_mount_points.cc \
diff --git a/webkit/webkit_storage_browser.target.linux-arm.mk b/webkit/webkit_storage_browser.target.linux-arm.mk
index b1ca9ad..349d8bc 100644
--- a/webkit/webkit_storage_browser.target.linux-arm.mk
+++ b/webkit/webkit_storage_browser.target.linux-arm.mk
@@ -57,16 +57,6 @@
 	webkit/browser/database/database_util.cc \
 	webkit/browser/database/databases_table.cc \
 	webkit/browser/database/vfs_backend.cc \
-	webkit/browser/dom_storage/dom_storage_area.cc \
-	webkit/browser/dom_storage/dom_storage_context.cc \
-	webkit/browser/dom_storage/dom_storage_database.cc \
-	webkit/browser/dom_storage/dom_storage_host.cc \
-	webkit/browser/dom_storage/dom_storage_namespace.cc \
-	webkit/browser/dom_storage/dom_storage_session.cc \
-	webkit/browser/dom_storage/dom_storage_task_runner.cc \
-	webkit/browser/dom_storage/local_storage_database_adapter.cc \
-	webkit/browser/dom_storage/session_storage_database.cc \
-	webkit/browser/dom_storage/session_storage_database_adapter.cc \
 	webkit/browser/fileapi/async_file_util_adapter.cc \
 	webkit/browser/fileapi/copy_or_move_operation_delegate.cc \
 	webkit/browser/fileapi/external_mount_points.cc \
diff --git a/webkit/webkit_storage_browser.target.linux-mips.mk b/webkit/webkit_storage_browser.target.linux-mips.mk
index d4db6e3..223f22b 100644
--- a/webkit/webkit_storage_browser.target.linux-mips.mk
+++ b/webkit/webkit_storage_browser.target.linux-mips.mk
@@ -57,16 +57,6 @@
 	webkit/browser/database/database_util.cc \
 	webkit/browser/database/databases_table.cc \
 	webkit/browser/database/vfs_backend.cc \
-	webkit/browser/dom_storage/dom_storage_area.cc \
-	webkit/browser/dom_storage/dom_storage_context.cc \
-	webkit/browser/dom_storage/dom_storage_database.cc \
-	webkit/browser/dom_storage/dom_storage_host.cc \
-	webkit/browser/dom_storage/dom_storage_namespace.cc \
-	webkit/browser/dom_storage/dom_storage_session.cc \
-	webkit/browser/dom_storage/dom_storage_task_runner.cc \
-	webkit/browser/dom_storage/local_storage_database_adapter.cc \
-	webkit/browser/dom_storage/session_storage_database.cc \
-	webkit/browser/dom_storage/session_storage_database_adapter.cc \
 	webkit/browser/fileapi/async_file_util_adapter.cc \
 	webkit/browser/fileapi/copy_or_move_operation_delegate.cc \
 	webkit/browser/fileapi/external_mount_points.cc \
diff --git a/webkit/webkit_storage_browser.target.linux-x86.mk b/webkit/webkit_storage_browser.target.linux-x86.mk
index a381d65..9c2fe20 100644
--- a/webkit/webkit_storage_browser.target.linux-x86.mk
+++ b/webkit/webkit_storage_browser.target.linux-x86.mk
@@ -57,16 +57,6 @@
 	webkit/browser/database/database_util.cc \
 	webkit/browser/database/databases_table.cc \
 	webkit/browser/database/vfs_backend.cc \
-	webkit/browser/dom_storage/dom_storage_area.cc \
-	webkit/browser/dom_storage/dom_storage_context.cc \
-	webkit/browser/dom_storage/dom_storage_database.cc \
-	webkit/browser/dom_storage/dom_storage_host.cc \
-	webkit/browser/dom_storage/dom_storage_namespace.cc \
-	webkit/browser/dom_storage/dom_storage_session.cc \
-	webkit/browser/dom_storage/dom_storage_task_runner.cc \
-	webkit/browser/dom_storage/local_storage_database_adapter.cc \
-	webkit/browser/dom_storage/session_storage_database.cc \
-	webkit/browser/dom_storage/session_storage_database_adapter.cc \
 	webkit/browser/fileapi/async_file_util_adapter.cc \
 	webkit/browser/fileapi/copy_or_move_operation_delegate.cc \
 	webkit/browser/fileapi/external_mount_points.cc \
diff --git a/webkit/webkit_storage_common.target.darwin-arm.mk b/webkit/webkit_storage_common.target.darwin-arm.mk
index 7316d19..868f85b 100644
--- a/webkit/webkit_storage_common.target.darwin-arm.mk
+++ b/webkit/webkit_storage_common.target.darwin-arm.mk
@@ -29,8 +29,6 @@
 	webkit/common/blob/shareable_file_reference.cc \
 	webkit/common/database/database_connections.cc \
 	webkit/common/database/database_identifier.cc \
-	webkit/common/dom_storage/dom_storage_map.cc \
-	webkit/common/dom_storage/dom_storage_types.cc \
 	webkit/common/fileapi/directory_entry.cc \
 	webkit/common/fileapi/file_system_util.cc \
 	webkit/common/quota/quota_status_code.cc
diff --git a/webkit/webkit_storage_common.target.darwin-mips.mk b/webkit/webkit_storage_common.target.darwin-mips.mk
index b93512f..dc12229 100644
--- a/webkit/webkit_storage_common.target.darwin-mips.mk
+++ b/webkit/webkit_storage_common.target.darwin-mips.mk
@@ -29,8 +29,6 @@
 	webkit/common/blob/shareable_file_reference.cc \
 	webkit/common/database/database_connections.cc \
 	webkit/common/database/database_identifier.cc \
-	webkit/common/dom_storage/dom_storage_map.cc \
-	webkit/common/dom_storage/dom_storage_types.cc \
 	webkit/common/fileapi/directory_entry.cc \
 	webkit/common/fileapi/file_system_util.cc \
 	webkit/common/quota/quota_status_code.cc
diff --git a/webkit/webkit_storage_common.target.darwin-x86.mk b/webkit/webkit_storage_common.target.darwin-x86.mk
index 3c53b09..3f34579 100644
--- a/webkit/webkit_storage_common.target.darwin-x86.mk
+++ b/webkit/webkit_storage_common.target.darwin-x86.mk
@@ -29,8 +29,6 @@
 	webkit/common/blob/shareable_file_reference.cc \
 	webkit/common/database/database_connections.cc \
 	webkit/common/database/database_identifier.cc \
-	webkit/common/dom_storage/dom_storage_map.cc \
-	webkit/common/dom_storage/dom_storage_types.cc \
 	webkit/common/fileapi/directory_entry.cc \
 	webkit/common/fileapi/file_system_util.cc \
 	webkit/common/quota/quota_status_code.cc
diff --git a/webkit/webkit_storage_common.target.linux-arm.mk b/webkit/webkit_storage_common.target.linux-arm.mk
index 7316d19..868f85b 100644
--- a/webkit/webkit_storage_common.target.linux-arm.mk
+++ b/webkit/webkit_storage_common.target.linux-arm.mk
@@ -29,8 +29,6 @@
 	webkit/common/blob/shareable_file_reference.cc \
 	webkit/common/database/database_connections.cc \
 	webkit/common/database/database_identifier.cc \
-	webkit/common/dom_storage/dom_storage_map.cc \
-	webkit/common/dom_storage/dom_storage_types.cc \
 	webkit/common/fileapi/directory_entry.cc \
 	webkit/common/fileapi/file_system_util.cc \
 	webkit/common/quota/quota_status_code.cc
diff --git a/webkit/webkit_storage_common.target.linux-mips.mk b/webkit/webkit_storage_common.target.linux-mips.mk
index b93512f..dc12229 100644
--- a/webkit/webkit_storage_common.target.linux-mips.mk
+++ b/webkit/webkit_storage_common.target.linux-mips.mk
@@ -29,8 +29,6 @@
 	webkit/common/blob/shareable_file_reference.cc \
 	webkit/common/database/database_connections.cc \
 	webkit/common/database/database_identifier.cc \
-	webkit/common/dom_storage/dom_storage_map.cc \
-	webkit/common/dom_storage/dom_storage_types.cc \
 	webkit/common/fileapi/directory_entry.cc \
 	webkit/common/fileapi/file_system_util.cc \
 	webkit/common/quota/quota_status_code.cc
diff --git a/webkit/webkit_storage_common.target.linux-x86.mk b/webkit/webkit_storage_common.target.linux-x86.mk
index 3c53b09..3f34579 100644
--- a/webkit/webkit_storage_common.target.linux-x86.mk
+++ b/webkit/webkit_storage_common.target.linux-x86.mk
@@ -29,8 +29,6 @@
 	webkit/common/blob/shareable_file_reference.cc \
 	webkit/common/database/database_connections.cc \
 	webkit/common/database/database_identifier.cc \
-	webkit/common/dom_storage/dom_storage_map.cc \
-	webkit/common/dom_storage/dom_storage_types.cc \
 	webkit/common/fileapi/directory_entry.cc \
 	webkit/common/fileapi/file_system_util.cc \
 	webkit/common/quota/quota_status_code.cc
